import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; import { AlertController, ModalController, PopoverController } from '@ionic/angular'; import { Attachment } from 'src/app/models/attachment.model'; import { EventBody } from 'src/app/models/eventbody.model'; import { Event } from 'src/app/models/event.model'; import { InAppBrowser } from '@ionic-native/in-app-browser/ngx'; import { ProcessesService } from 'src/app/services/processes.service'; import { ToastService } from 'src/app/services/toast.service'; import { EliminateEventPage } from 'src/app/modals/eliminate-event/eliminate-event.page'; import { ExpedientTaskModalPageNavParamsTask } from 'src/app/models/ExpedientTaskModalPage'; import { DocumentSetUpMeetingPage } from 'src/app/modals/document-set-up-meeting/document-set-up-meeting.page'; import { ExpedientTaskModalPage } from 'src/app/pages/gabinete-digital/expediente/expedient-task-modal/expedient-task-modal.page'; import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page'; import { ThemeService } from 'src/app/services/theme.service'; import { SessionStore } from 'src/app/store/session.service'; import { HttpErrorHandle } from 'src/app/services/http-error-handle.service' import { NavigationExtras, Router } from '@angular/router'; import { DateService } from 'src/app/services/date.service'; import { AgendaDataRepositoryService } from 'src/app/module/agenda/data/repository/agenda-data-repository.service'; import { SearchList_v2 } from 'src/app/models/search-document'; import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; import { isHttpError } from 'src/app/services/http.service'; import { PermissionService } from 'src/app/services/permission.service'; import { DeleteEventRecurrencePage, EventDeleteRecurrenceComponentReturn } from 'src/app/modals/delete-event-recurrence/delete-event-recurrence.page'; @Component({ selector: 'app-view-event', templateUrl: './view-event.page.html', styleUrls: ['./view-event.page.scss'], }) export class ViewEventPage implements OnInit { loadedEvent: Event; isEventEdited: boolean; eventBody: EventBody; loadedAttachments:any; pageId: string; showLoader: boolean; task: ExpedientTaskModalPageNavParamsTask; minDate: Date; LoadedDocument:any = null; customDate:any; today:any; months = ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"]; days = ["Domingo", "Segunda-feira", "Terça-feira", "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sábado"]; documents: Attachment[] = []; dicIndex = 0; @Input() profile:string; @Input() eventId: string; @Input() CalendarId: string; @Output() viewEventDetailDismiss = new EventEmitter(); sesseionStora = SessionStore TimeZoneString = '' daysToEnd = 0 constructor( public alertController: AlertController, private iab: InAppBrowser, private processes: ProcessesService, private modalController: ModalController, public popoverController: PopoverController, private toastService: ToastService, public ThemeService: ThemeService, private httpErrorHandle: HttpErrorHandle, private router: Router, private dateService: DateService, private agendaDataRepository: AgendaDataRepositoryService, public p: PermissionService, ) { this.isEventEdited = false; this.loadedEvent = new Event(); this.eventBody = { BodyType : "1", Text : ""}; this.loadedEvent.Body = this.eventBody; } daysToEndWithJS(startDateStr: any, endDateStr: any) { // Define the start and end dates const startDate: any = new Date(startDateStr); const endDate: any = new Date(endDateStr); // Calculate the difference in milliseconds between the two dates const differenceMs = Math.abs(endDate - startDate); // Convert milliseconds to days const millisecondsPerDay = 1000 * 60 * 60 * 24; const differenceDays = Math.ceil(differenceMs / millisecondsPerDay); console.log(`Number of days between the dates: ${differenceDays}`); return differenceDays } deferenceBetweenDays(start: any, end: any) { start.setHours(0, 0, 0, 0); end.setHours(0, 0, 0, 0); const diffTime = Math.abs(end - start); return Math.ceil(diffTime / (1000 * 60 * 60 * 24)); } ngOnInit() { this.loadEvent(); } doRefresh(ev) { this.loadEvent(); ev.target.complete(); } ngOnChanges(changes: any): void { this.loadedEvent.Attachments = null; this.loadEvent(); } toDateString(e) { return new Date(e).toString() } openOptions() { } docIndex(index: number) { this.dicIndex = index; } close() { this.viewEventDetailDismiss.emit({ type: 'close' }) } setTimeZone() { this.TimeZoneString = this.loadedEvent.TimeZone } @XTracerAsync({name:'desktop/event-details', bugPrint: true}) async loadEvent(tracing?: TracingType) { let res = await this.agendaDataRepository.getEventById(this.eventId, tracing) if(res.isOk()) { tracing.setAttribute('outcome', 'success') /* let changeDate = this.dateService.fixDate(res.value as any) as any */ this.loadedEvent = res.value as any; console.log('this.loadedEvent', this.loadedEvent) if(new Date().getTime() <= new Date(this.loadedEvent.EndDate).getTime()) { if(this.deferenceBetweenDays(new Date(), new Date(this.loadedEvent.EndDate))) { this.daysToEnd = this.daysToEndWithJS(new Date(this.loadedEvent.StartDate), new Date(this.loadedEvent.EndDate)) } else { this.daysToEnd = 0 } } else { this.daysToEnd = 0 } this.setTimeZone() } else { tracing.setAttribute('eventId', this.eventId) if(!isHttpError(res.error)) { this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #133') console.log(res.error) } else if (isHttpError(res.error)) { if(res.error.status == 404) { this.toastService._badRequest('Este evento já não existe') } else { this.httpErrorHandle.httpStatusHandle(res.error) } } tracing.setAttribute('outcome', 'failed') this.viewEventDetailDismiss.emit({ type: 'close' }) } } async deleteYesOrNo() { if (this.loadedEvent.IsRecurring) { const modal = await this.modalController.create({ component: DeleteEventRecurrencePage, componentProps: {}, cssClass: 'event-recurrence-modal', }); modal.onDidDismiss().then((res) => { const data: EventDeleteRecurrenceComponentReturn = res.data if(data =='DeleteAll') { this.deleteEvent_v2(true); } else if (data == 'DeleteOne') { this.deleteEvent_v2(false); } else if(data == 'Cancel') { this.close() } else { this.close() } }); await modal.present(); } else { this.alertController.create({ header: 'Eliminar evento?', message: '', buttons: [ { text: 'Sim', handler: () => { this.deleteEvent_v2(false); } }, { text: 'Não', handler: () => { } } ] }).then(res => { res.present(); }) } } async deleteEvent_v2(deleteAll) { console.log(this.loadedEvent.EventId) const loader = this.toastService.loading() const value = await this.agendaDataRepository.deleteEvent(this.loadedEvent.EventId,deleteAll)//.subscribe(() => { if(value.isOk()) { console.log(value.value) this.httpErrorHandle.httpsSucessMessagge('delete event') this.close(); } else { console.log('delete event error: ', value.error) this.httpErrorHandle.httpStatusHandle(value.error) } loader.remove(); } async deleteRecurringEvent() { const modal = await this.modalController.create({ component: EliminateEventPage, componentProps: {}, cssClass: 'discart-expedient-modal', }); modal.onDidDismiss().then((res) => { }); await modal.present(); } async editEvent() { this.viewEventDetailDismiss.emit({ type: 'edit', event: this.loadedEvent }) } viewDocument(sourceId) { this.processes.GetDocumentUrl(sourceId, '8').subscribe(res=>{ const url: string = res.replace("webTRIX.Viewer","webTRIX.Viewer.Branch1"); const browser = this.iab.create(url,"_blank"); browser.show(); }); } async LoadDocumentDetails() { const docId = this.loadedEvent.Attachments[ this.dicIndex].SourceId const applicationId: any = this.loadedEvent.Attachments[ this.dicIndex].ApplicationId const selectedDoc = this.loadedEvent.Attachments[ this.dicIndex] this.task = { serialNumber: '', taskStartDate: '', isEvent: true, workflowInstanceDataFields: { FolderID: '', Subject: selectedDoc.SourceName, SourceSecFsID: selectedDoc.ApplicationId || selectedDoc['ApplicationID'], SourceType: 'DOC', SourceID: selectedDoc.SourceId, DispatchNumber: '' } } const modal = await this.modalController.create({ component: ViewDocumentPage, componentProps: { trustedUrl: '', file: { title: this.task.workflowInstanceDataFields.Subject, url: '', title_link: '', }, Document: this.loadedEvent.Attachments[ this.dicIndex], applicationId: this.task.workflowInstanceDataFields.SourceSecFsID, docId: selectedDoc.SourceId, folderId: '', task: this.task }, cssClass: 'modal modal-desktop' }); await modal.present(); } async openBookMeetingModal() { let classs; if( window.innerWidth < 701) { classs = 'book-meeting-modal modal modal-desktop' } else { classs = 'modal modal-desktop showAsideOptions' } const modal = await this.modalController.create({ component: DocumentSetUpMeetingPage, componentProps: { subject: this.task.workflowInstanceDataFields.Subject, document: this.loadedEvent.Attachments[ this.dicIndex], }, cssClass: classs, backdropDismiss: false }); modal.onDidDismiss().then(res=>{ //this.RouteService.goBack(); }); await modal.present(); } // efetuar despacho async openExpedientActionsModal( taskAction: any) { let classs; if( window.innerWidth < 701) { classs = 'modal modal-desktop' } else { classs = 'modal modal-desktop showAsideOptions' } const modal = await this.modalController.create({ component: ExpedientTaskModalPage, componentProps: { taskAction: taskAction, task: this.task, seachDocuments: this.loadedEvent.Attachments[ this.dicIndex], aplicationId: this.loadedEvent.Attachments[ this.dicIndex].ApplicationId || this.loadedEvent.Attachments[ this.dicIndex]['ApplicationID'] }, cssClass: classs, }); modal.onDidDismiss().then( async(res)=>{}); await modal.present(); } stringToNumber(number: string) { return parseInt(number) } }