From e1914505f2e3ab233df288f980a028ecbcf1e2ed Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Sat, 22 Jun 2024 21:51:40 +0100 Subject: [PATCH 1/8] =?UTF-8?q?ITOTEAM-525=20no=20mobile=20ao=20adicionar?= =?UTF-8?q?=20=20attachments=20aparece=20um=20sem=20t=C3=ADtulo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/interceptors/metter.interceptor.ts | 2 ++ src/app/modals/view-event/view-event.page.ts | 2 +- src/app/pages/agenda/agenda.page.ts | 2 +- .../pages/agenda/edit-event/edit-event.page.ts | 2 +- .../event-list/event-list.page.ts | 2 +- .../Agenda/agenda-data-repository.service.ts | 15 +++++++++++---- .../Agenda/model/addAttachmentDTOInput.ts | 13 +++++++++++++ src/app/services/Repositorys/Agenda/utils.ts | 2 +- src/app/services/task.service.ts | 2 +- .../edit-event-to-approve.page.ts | 2 +- .../shared/agenda/edit-event/edit-event.page.ts | 2 +- .../edit-event-to-approve/edit-event.page.ts | 2 +- version/git-version.ts | 12 ++++++------ 13 files changed, 41 insertions(+), 19 deletions(-) create mode 100644 src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts diff --git a/src/app/interceptors/metter.interceptor.ts b/src/app/interceptors/metter.interceptor.ts index 1796a2eb9..035829253 100644 --- a/src/app/interceptors/metter.interceptor.ts +++ b/src/app/interceptors/metter.interceptor.ts @@ -37,6 +37,8 @@ export class MetricsInterceptor implements HttpInterceptor { if (event instanceof HttpResponse) { // Capture the status code and check protocol if (req.method !== 'GET' && !req.urlWithParams.includes('metrics')) { + + console.log('response', event.body) const path = req.urlWithParams; const url = new URL(path); if (window.location.protocol !== 'https:') { diff --git a/src/app/modals/view-event/view-event.page.ts b/src/app/modals/view-event/view-event.page.ts index 1156f07ff..fbc629df1 100644 --- a/src/app/modals/view-event/view-event.page.ts +++ b/src/app/modals/view-event/view-event.page.ts @@ -123,7 +123,7 @@ export class ViewEventPage implements OnInit { ev.target.complete(); } - @XTracerAsync({name:'ViewEventPage/loadEvent', bugPrint: true}) + @XTracerAsync({name:'mobile/loadEvent', bugPrint: true}) async loadEvent(tracing?: TracingType) { const loader = this.toastService.loading(); diff --git a/src/app/pages/agenda/agenda.page.ts b/src/app/pages/agenda/agenda.page.ts index 6a5235848..79fe7e5aa 100644 --- a/src/app/pages/agenda/agenda.page.ts +++ b/src/app/pages/agenda/agenda.page.ts @@ -678,7 +678,7 @@ export class AgendaPage implements OnInit { }); }; - @XTracerAsync({name:'AgendaPage/loadRangeEventRun', bugPrint: true}) + @XTracerAsync({name:'AgendaPage/loadRange', bugPrint: true}) async loadRangeEventRun(startTime: Date, endTime: Date, tracing?: TracingType) { tracing.addEvent('load range start') diff --git a/src/app/pages/agenda/edit-event/edit-event.page.ts b/src/app/pages/agenda/edit-event/edit-event.page.ts index 0f43b0509..c8c28758a 100644 --- a/src/app/pages/agenda/edit-event/edit-event.page.ts +++ b/src/app/pages/agenda/edit-event/edit-event.page.ts @@ -459,7 +459,7 @@ export class EditEventPage implements OnInit { await this.saveDocument() if (this.addedAttachmentsList.length > 0) { - this.agendaDataRepository.addEventAttachment(this.postEvent.EventId, this.loadedEventAttachments).subscribe((value) => { + this.agendaDataRepository.addEventAttachment(this.postEvent.EventId, this.loadedEventAttachments, tracing).subscribe((value) => { console.log(value) }, ((error) => { console.log('add attachment error: ', error) diff --git a/src/app/pages/gabinete-digital/event-list/event-list.page.ts b/src/app/pages/gabinete-digital/event-list/event-list.page.ts index bcdb5a6c0..6b9c71174 100644 --- a/src/app/pages/gabinete-digital/event-list/event-list.page.ts +++ b/src/app/pages/gabinete-digital/event-list/event-list.page.ts @@ -177,7 +177,7 @@ export class EventListPage implements OnInit { this.LoadToApproveEvents(); } - @XTracerAsync({name:'EventListPage/LoadToApproveEvents', bugPrint: true}) + @XTracerAsync({name:'EventListPage/LoadToApprove', bugPrint: true}) async LoadToApproveEvents(tracing?: TracingType) { console.log('aprove event') this.showLoader = true; diff --git a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts index 34b49f03c..5bb58b266 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts @@ -22,6 +22,7 @@ import { SharedCalendarListDetectChanges } from './async/change/shareCalendarCha import { SharedCalendarListItemOutputDTO } from './model/sharedCalendarOutputDTO'; import { EventInputDTOSchema } from './agendaDataModels'; import { EventUpdateInputDTOSchema } from './model/eventUpdateInputDtO'; +import { AttachInputDTOSchema } from './model/addAttachmentDTOInput'; @Injectable({ providedIn: 'root' @@ -221,16 +222,22 @@ export class AgendaDataRepositoryService { return this.agendaDataService.updateEvent(eventId, eventInput) } - addEventAttendee(id, attendeeData,) { + addEventAttendee(id, attendeeData) { console.log(attendeeData) console.log(this.utils.attendeesEdit(attendeeData)) + + return this.agendaDataService.addEventAttendee(id, { attendees: this.utils.attendeesAdded(attendeeData) }); } - addEventAttachment(id, attachmentData) { + addEventAttachment(id, attachmentData, tracing: TracingType) { console.log(attachmentData) - console.log('post attachment', this.utils.documentAdded(attachmentData)) - return this.agendaDataService.addEventAttachment(id, { attachments: this.utils.documentAdded(attachmentData) }); + + const attachments = { attachments: this.utils.documentAdded(attachmentData) } + console.log('post attachment', attachments) + + APINODReturn(AttachInputDTOSchema, attachments, `POST/${id}/Attendee`, tracing) + return this.agendaDataService.addEventAttachment(id, attachments); } deleteEvent(eventId,deleteAll) { diff --git a/src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts b/src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts new file mode 100644 index 000000000..e7fbe51e6 --- /dev/null +++ b/src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts @@ -0,0 +1,13 @@ +import { z } from 'zod'; + +export const AttachInputDTOSchema = z.object({ + attachments: z.array(z.object({ + docId: z.any(), + sourceName: z.any(), + description: z.any(), + applicationId: z.any(), + })) + +}) + +export type AttachInputDTO = z.infer diff --git a/src/app/services/Repositorys/Agenda/utils.ts b/src/app/services/Repositorys/Agenda/utils.ts index 9e6d3cca3..1e6b6234b 100644 --- a/src/app/services/Repositorys/Agenda/utils.ts +++ b/src/app/services/Repositorys/Agenda/utils.ts @@ -84,7 +84,7 @@ export class Utils { documents.forEach(element => { let object = { docId: element.docId || element.DocId, - sourceName: element.subject || element.sourceNames || element.Description, + sourceName: element.subject || element.sourceNames || element.Description || element.SourceNames, description: "", applicationId: element.applicationId || element.ApplicationId } diff --git a/src/app/services/task.service.ts b/src/app/services/task.service.ts index 92879dd43..6e956f093 100644 --- a/src/app/services/task.service.ts +++ b/src/app/services/task.service.ts @@ -313,7 +313,7 @@ export class TaskService { } - @XTracerAsync({name:'taskService/loadEventosParaAprovacao', bugPrint: true}) + @XTracerAsync({name:'taskService/loadEventParaAprovacao', bugPrint: true}) async loadEventosParaAprovacao(tracing?: TracingType) { this.showLoaderNum++ console.log('PR') diff --git a/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts b/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts index 878d60f41..ec413d206 100644 --- a/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts +++ b/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts @@ -392,7 +392,7 @@ export class EditEventToApprovePage implements OnInit { })); if (this.addedAttachmentsList.length > 0) { - this.agendaDataRepository.addEventAttachment(this.eventProcess.serialNumber, this.loadedAttachments).subscribe((value) => { + this.agendaDataRepository.addEventAttachment(this.eventProcess.serialNumber, this.loadedAttachments, tracing).subscribe((value) => { console.log(value) }, ((error) => { this.showLoader = false diff --git a/src/app/shared/agenda/edit-event/edit-event.page.ts b/src/app/shared/agenda/edit-event/edit-event.page.ts index 537a1042c..7f2981bb8 100644 --- a/src/app/shared/agenda/edit-event/edit-event.page.ts +++ b/src/app/shared/agenda/edit-event/edit-event.page.ts @@ -457,7 +457,7 @@ export class EditEventPage implements OnInit { if (this.addedAttachmentsList.length > 0) { - this.agendaDataRepository.addEventAttachment(this._postEvent.EventId, this.loadedEventAttachments).subscribe((value) => { + this.agendaDataRepository.addEventAttachment(this._postEvent.EventId, this.loadedEventAttachments, tracing).subscribe((value) => { console.log(value) }, ((error) => { this.showLoader = false diff --git a/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts b/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts index 2bb93f34e..698e9fa70 100644 --- a/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts +++ b/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts @@ -334,7 +334,7 @@ export class EditEventToApproveComponent implements OnInit { if (this.addedAttachmentsList.length > 0) { - this.agendaDataRepository.addEventAttachment(this.eventProcess.serialNumber, this.loadedAttachments).subscribe((value) => { + this.agendaDataRepository.addEventAttachment(this.eventProcess.serialNumber, this.loadedAttachments, tracing).subscribe((value) => { console.log(value) }, ((error) => { this.showLoader = false diff --git a/version/git-version.ts b/version/git-version.ts index 539f95154..d785aa86a 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "0c14b9be9", - "SHA": "0c14b9be979f22b13e627b978767be4a173d9768", + "shortSHA": "536548af0", + "SHA": "536548af0c7696fdc7384057cf856163459fe374", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Fri Jun 21 23:33:29 2024 +0100'", - "lastCommitMessage": "fix ownertype and category type", - "lastCommitNumber": "5836", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 7 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: angular.json\n\tmodified: src/app/interceptors/metter.interceptor.ts\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.html\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/pages/agenda/new-event/new-event.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts\n\tmodified: src/app/services/Repositorys/Agenda/model/eventInputDTO.ts\n\tmodified: src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts\n\tmodified: src/app/services/Repositorys/Agenda/model/eventToApproveListOutputDTO.ts\n\tnew file: src/app/services/Repositorys/Agenda/model/eventUpdateInputDtO.ts\n\tmodified: src/app/services/monitoring/opentelemetry/tracer.ts\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/agenda/new-event/new-event.page.ts\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts\n\tmodified: version/git-version.ts", + "lastCommitTime": "'Sat Jun 22 13:28:14 2024 +0100'", + "lastCommitMessage": "ITOTEAM-525 send the rigth category and ownertype", + "lastCommitNumber": "5837", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is up to date with 'origin/feature/agenda-api-peter'.\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/interceptors/metter.interceptor.ts\n\tmodified: src/app/modals/view-event/view-event.page.ts\n\tmodified: src/app/pages/agenda/agenda.page.ts\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/pages/gabinete-digital/event-list/event-list.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts\n\tnew file: src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts\n\tmodified: src/app/services/Repositorys/Agenda/utils.ts\n\tmodified: src/app/services/task.service.ts\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file From ca50ae9dae0ac0d3ed0e5f2a820a780fd6509564 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Sun, 23 Jun 2024 21:47:34 +0100 Subject: [PATCH 2/8] ITOTEAM-525 data validation --- src/app/modals/profile/profile.page.ts | 2 +- src/app/modals/view-event/view-event.page.ts | 2 +- .../agenda/edit-event/edit-event.page.ts | 4 +- .../agenda/view-event/view-event.page.ts | 2 +- .../Agenda/model/addAttachmentDTOInput.ts | 2 +- src/app/services/Repositorys/Agenda/utils.ts | 8 ++- src/app/services/task.service.ts | 2 +- .../edit-event-to-approve.page.ts | 57 ++++++++++++------- .../edit-event.page.html | 1 + .../edit-event-to-approve/edit-event.page.ts | 15 ++++- version/git-version.ts | 12 ++-- 11 files changed, 67 insertions(+), 40 deletions(-) diff --git a/src/app/modals/profile/profile.page.ts b/src/app/modals/profile/profile.page.ts index 1cff7042a..42a51abfc 100644 --- a/src/app/modals/profile/profile.page.ts +++ b/src/app/modals/profile/profile.page.ts @@ -212,7 +212,7 @@ export class ProfilePage implements OnInit { return time; } - @XTracer({name:'profile/notificatinsRoutes', bugPrint: true, module:'notification'}) + @XTracer({name:'profile/notificationClick', bugPrint: true, module:'notification'}) notificatinsRoutes (index, Service, Object, IdObject, FolderId, i, tracing?: TracingType) { console.log(index, i) diff --git a/src/app/modals/view-event/view-event.page.ts b/src/app/modals/view-event/view-event.page.ts index fbc629df1..422188bd7 100644 --- a/src/app/modals/view-event/view-event.page.ts +++ b/src/app/modals/view-event/view-event.page.ts @@ -123,7 +123,7 @@ export class ViewEventPage implements OnInit { ev.target.complete(); } - @XTracerAsync({name:'mobile/loadEvent', bugPrint: true}) + @XTracerAsync({name:'mobile/loadEventDetails', bugPrint: true}) async loadEvent(tracing?: TracingType) { const loader = this.toastService.loading(); diff --git a/src/app/pages/agenda/edit-event/edit-event.page.ts b/src/app/pages/agenda/edit-event/edit-event.page.ts index c8c28758a..28bba7024 100644 --- a/src/app/pages/agenda/edit-event/edit-event.page.ts +++ b/src/app/pages/agenda/edit-event/edit-event.page.ts @@ -425,7 +425,7 @@ export class EditEventPage implements OnInit { } } - @XTracerAsync({name:'desktop/create-event', bugPrint: true, daley: 4000}) + @XTracerAsync({name:'mobile/create-event', bugPrint: true, daley: 4000}) async save_v2(editAllEvent, tracing?: TracingType) { this.injectValidation() this.runValidation() @@ -604,7 +604,7 @@ export class EditEventPage implements OnInit { if (this.postEvent.HasAttachments) { this.attachmentsService.getAttachmentsById(eventId).subscribe(res => { - this.loadedEventAttachments = res; + // this.loadedEventAttachments = res; }, ((erro) => { console.error('editgetAttchament', erro) diff --git a/src/app/pages/agenda/view-event/view-event.page.ts b/src/app/pages/agenda/view-event/view-event.page.ts index 105e65a39..55ed88861 100644 --- a/src/app/pages/agenda/view-event/view-event.page.ts +++ b/src/app/pages/agenda/view-event/view-event.page.ts @@ -193,7 +193,7 @@ export class ViewEventPage implements OnInit { this.TimeZoneString = this.loadedEvent.TimeZone } - @XTracerAsync({name:'ViewEventPage/loadEvent', bugPrint: true}) + @XTracerAsync({name:'mobile/loadEventDetails', bugPrint: true}) async loadEvent(tracing?: TracingType) { const loader = this.toastService.loading(); diff --git a/src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts b/src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts index e7fbe51e6..3e344e7ae 100644 --- a/src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts +++ b/src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts @@ -4,7 +4,7 @@ export const AttachInputDTOSchema = z.object({ attachments: z.array(z.object({ docId: z.any(), sourceName: z.any(), - description: z.any(), + description: z.any().nullable(), applicationId: z.any(), })) diff --git a/src/app/services/Repositorys/Agenda/utils.ts b/src/app/services/Repositorys/Agenda/utils.ts index 1e6b6234b..f466cc149 100644 --- a/src/app/services/Repositorys/Agenda/utils.ts +++ b/src/app/services/Repositorys/Agenda/utils.ts @@ -83,15 +83,17 @@ export class Utils { let listupdate = [] documents.forEach(element => { let object = { - docId: element.docId || element.DocId, - sourceName: element.subject || element.sourceNames || element.Description || element.SourceNames, + docId: element.docId || element.DocId || element.Id, + sourceName: element.subject || element.sourceNames || element.Description || element.SourceName, description: "", applicationId: element.applicationId || element.ApplicationId } listupdate.push(object) }); - return listupdate + + return listupdate.filter( e=> typeof e.docId == 'number') + /* return documents.map((e) => { return { docId: e.docId, diff --git a/src/app/services/task.service.ts b/src/app/services/task.service.ts index 6e956f093..4b017a7f1 100644 --- a/src/app/services/task.service.ts +++ b/src/app/services/task.service.ts @@ -313,7 +313,7 @@ export class TaskService { } - @XTracerAsync({name:'taskService/loadEventParaAprovacao', bugPrint: true}) + @XTracerAsync({name:'taskService/loadEventToAprove', bugPrint: true}) async loadEventosParaAprovacao(tracing?: TracingType) { this.showLoaderNum++ console.log('PR') diff --git a/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts b/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts index ec413d206..49934dfd4 100644 --- a/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts +++ b/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts @@ -136,7 +136,8 @@ export class EditEventToApprovePage implements OnInit { private toastService: ToastService, public ThemeService: ThemeService, public httpErrorHandler: HttpErrorHandle, - private agendaDataRepository: AgendaDataRepositoryService + private agendaDataRepository: AgendaDataRepositoryService, + private httpErroHalde: HttpErrorHandle, ) { this.isEventEdited = false; } @@ -153,28 +154,42 @@ export class EditEventToApprovePage implements OnInit { } - async getTask() { + + async getTask(tracing?: TracingType) { - const res: any = await this.agendaDataRepository.getEventToApproveById(this.serialNumber) - console.log('evento to apro to edit', res.value) - this.eventProcess = res.value; + const res = await this.agendaDataRepository.getEventToApproveById(this.serialNumber) + if(res.isOk()) { + console.log('evento to apro to edit', res.value) + this.eventProcess = res.value as any; + + this.eventProcess.workflowInstanceDataFields.LastOccurrence = new Date(this.eventProcess.workflowInstanceDataFields.LastOccurrence) + + this.restoreDatepickerData() + + // description + + try { + let body: any = this.eventProcess.workflowInstanceDataFields?.Body?.replace(/<[^>]+>/g, '') + this.eventProcess.workflowInstanceDataFields.Body = body + + } catch (error) {} + + this.eventProcess.workflowInstanceDataFields.Category = this.setEventType(this.eventProcess.workflowInstanceDataFields.EventType) + this.InstanceId = this.eventProcess.workflowInstanceDataFields.InstanceId + this.loadedAttachments = res.value.Attachments; + console.log(this.loadedAttachments) + + this.setOtherData() + + this.saveTemporaryData() + tracing.setAttribute('outcome', 'success') - this.eventProcess.workflowInstanceDataFields.LastOccurrence = new Date(this.eventProcess.workflowInstanceDataFields.LastOccurrence) - - this.restoreDatepickerData() - - // description - let body: any = this.eventProcess.workflowInstanceDataFields.Body.replace(/<[^>]+>/g, '') - this.eventProcess.workflowInstanceDataFields.Body = body - this.eventProcess.workflowInstanceDataFields.Category = this.setEventType(this.eventProcess.workflowInstanceDataFields.EventType) - - this.InstanceId = this.eventProcess.workflowInstanceDataFields.InstanceId - this.loadedAttachments = res.value.Attachments; - console.log(this.loadedAttachments) - - this.setOtherData() - - this.saveTemporaryData() + } else { + tracing.setAttribute('outcome', 'failed') + tracing.bugFlag() + this.httpErroHalde.httpStatusHandle(res.error) + } + } getRecurrenceTypes() { diff --git a/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html b/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html index 5f9bda15f..4a974627f 100644 --- a/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html +++ b/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html @@ -285,6 +285,7 @@ +
diff --git a/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts b/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts index 698e9fa70..d2db7400e 100644 --- a/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts +++ b/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts @@ -149,7 +149,8 @@ export class EditEventToApproveComponent implements OnInit { }) }, 1000); - async getTask() { + @XTracerAsync({name:'mobile/loadEventToApproveDetails', bugPrint: true}) + async getTask(tracing?: TracingType) { /* const result = await this.processes.GetTask(this.serialNumber).toPromise(); */ const res = await this.agendaDataRepository.getEventToApproveById(this.serialNumber) @@ -164,8 +165,13 @@ export class EditEventToApproveComponent implements OnInit { this.endDate = new Date(this.eventProcess.workflowInstanceDataFields.EndDate); // description - let body: any = this.eventProcess.workflowInstanceDataFields.Body.replace(/<[^>]+>/g, '') - this.eventProcess.workflowInstanceDataFields.Body = body + try { + + let body: any = this.eventProcess.workflowInstanceDataFields.Body.replace(/<[^>]+>/g, '') + this.eventProcess.workflowInstanceDataFields.Body = body + + } catch (error) {} + this.Location = this.eventProcess.workflowInstanceDataFields.Location this.InstanceId = this.eventProcess.workflowInstanceDataFields.InstanceId @@ -189,7 +195,10 @@ export class EditEventToApproveComponent implements OnInit { } }) + tracing.setAttribute('outcome', 'success') } else { + tracing.setAttribute('outcome', 'failed') + tracing.bugFlag() this.httpErroHalde.httpStatusHandle(res.error) } diff --git a/version/git-version.ts b/version/git-version.ts index d785aa86a..d94c150bd 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "536548af0", - "SHA": "536548af0c7696fdc7384057cf856163459fe374", + "shortSHA": "e1914505f", + "SHA": "e1914505f2e3ab233df288f980a028ecbcf1e2ed", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Sat Jun 22 13:28:14 2024 +0100'", - "lastCommitMessage": "ITOTEAM-525 send the rigth category and ownertype", - "lastCommitNumber": "5837", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is up to date with 'origin/feature/agenda-api-peter'.\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/interceptors/metter.interceptor.ts\n\tmodified: src/app/modals/view-event/view-event.page.ts\n\tmodified: src/app/pages/agenda/agenda.page.ts\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/pages/gabinete-digital/event-list/event-list.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts\n\tnew file: src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts\n\tmodified: src/app/services/Repositorys/Agenda/utils.ts\n\tmodified: src/app/services/task.service.ts\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts", + "lastCommitTime": "'Sat Jun 22 21:51:40 2024 +0100'", + "lastCommitMessage": "ITOTEAM-525 no mobile ao adicionar attachments aparece um sem título", + "lastCommitNumber": "5838", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 1 commit.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/modals/profile/profile.page.ts\n\tmodified: src/app/modals/view-event/view-event.page.ts\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/pages/agenda/view-event/view-event.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts\n\tmodified: src/app/services/Repositorys/Agenda/utils.ts\n\tmodified: src/app/services/task.service.ts\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts\n\tmodified: version/git-version.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file From 93476dc5c494511533d5ae327a3b026399581e9b Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Mon, 24 Jun 2024 15:35:16 +0100 Subject: [PATCH 3/8] ITOTEAM-597 remove atendess from list --- angular.json | 4 +- src/app/interceptors/token.interceptors.ts | 1 - .../agenda/edit-event/edit-event.page.ts | 38 ++++++-- src/app/pages/events/events.page.ts | 48 ++++++---- .../Agenda/agenda-data-repository.service.ts | 10 +- .../Repositorys/Agenda/agenda-data.service.ts | 4 +- .../change/attendeesLIstChangeDetector.ts | 41 ++++++++ .../Agenda/mapper/EventDetailsMapper.ts | 2 +- .../mapper/EventToApproveDetailsMapper.ts | 1 + .../Agenda/model/attendeeRemoveInputDTO.ts | 8 ++ .../notification-holder.service.ts | 38 ++++---- .../edit-event-to-approve.page.html | 6 +- .../edit-event-to-approve.page.ts | 93 ++++++++++++------- .../agenda/edit-event/edit-event.page.ts | 59 +++++++++--- .../edit-event.page.html | 6 +- .../edit-event-to-approve/edit-event.page.ts | 40 +++++--- src/app/store/notification-holder.service.ts | 48 +++++----- version/git-version.ts | 12 +-- 18 files changed, 308 insertions(+), 151 deletions(-) create mode 100644 src/app/services/Repositorys/Agenda/async/change/attendeesLIstChangeDetector.ts create mode 100644 src/app/services/Repositorys/Agenda/model/attendeeRemoveInputDTO.ts diff --git a/angular.json b/angular.json index b01a787d3..cd7b53a72 100644 --- a/angular.json +++ b/angular.json @@ -54,7 +54,7 @@ "vendorChunk": true, "extractLicenses": false, "buildOptimizer": false, - "sourceMap": false, + "sourceMap": true, "optimization": false, "namedChunks": true }, @@ -68,7 +68,7 @@ ], "optimization": true, "outputHashing": "all", - "sourceMap": false, + "sourceMap": true, "namedChunks": false, "aot": true, "extractLicenses": true, diff --git a/src/app/interceptors/token.interceptors.ts b/src/app/interceptors/token.interceptors.ts index 0b43c7ce4..2d8027338 100644 --- a/src/app/interceptors/token.interceptors.ts +++ b/src/app/interceptors/token.interceptors.ts @@ -8,7 +8,6 @@ import { HTTP_INTERCEPTORS, HttpClient, } from "@angular/common/http"; -import { AuthService } from '../services/auth.service'; import { Observable, throwError, BehaviorSubject, of } from "rxjs"; import { catchError, filter, take, switchMap, tap } from "rxjs/operators"; import { SessionStore } from '../store/session.service'; diff --git a/src/app/pages/agenda/edit-event/edit-event.page.ts b/src/app/pages/agenda/edit-event/edit-event.page.ts index 28bba7024..129ea2d33 100644 --- a/src/app/pages/agenda/edit-event/edit-event.page.ts +++ b/src/app/pages/agenda/edit-event/edit-event.page.ts @@ -23,6 +23,7 @@ import { TableSharedCalendar } from 'src/app/services/Repositorys/Agenda/agenda- import { Observable } from 'rxjs'; import { RoleIdService } from 'src/app/services/role-id.service' import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { AttendeesLIstChangeDetector } from 'src/app/services/Repositorys/Agenda/async/change/attendeesLIstChangeDetector'; const CUSTOM_DATE_FORMATS: NgxMatDateFormats = { parse: { @@ -99,7 +100,7 @@ export class EditEventPage implements OnInit { hasChangeCalendar = false selectedUserCalendar:any; SessionStore = SessionStore - + serverCurrentList = [] constructor( private modalController: ModalController, private navParams: NavParams, @@ -119,6 +120,8 @@ export class EditEventPage implements OnInit { this.isEventEdited = false; /* this.postEvent.EventRecurrence = { Type:'-1', LastOccurrence:''}; */ this.postEvent = this.navParams.get('event'); + this.serverCurrentList = this.postEvent.Attendees + console.log('this.postEvent', this.postEvent) this.caller = this.navParams.get('caller'); this.initCalendarName = this.postEvent.CalendarName; @@ -430,6 +433,9 @@ export class EditEventPage implements OnInit { this.injectValidation() this.runValidation() + + + if (this.Form.invalid) { return false } @@ -449,11 +455,31 @@ export class EditEventPage implements OnInit { console.log('edit event error: ', error) })); - this.agendaDataRepository.addEventAttendee(this.postEvent.EventId, this.postEvent.Attendees).subscribe((value) => { - console.log(value) - }, ((error) => { - console.log('add Attendee error: ', error) - })); + console.log({serverCurrentList: this.serverCurrentList, Attendees: this.postEvent.Attendees}) + + const { insert, remove } = AttendeesLIstChangeDetector(this.serverCurrentList as any, this.postEvent.Attendees as any) + + console.log({insert, remove }) + if(insert.length >= 1) { + this.agendaDataRepository.addEventAttendee(this.postEvent.EventId, insert).subscribe((value) => { + console.log(value) + }, ((error) => { + tracing.setAttribute('failed.attendees', 'true') + console.log('add Attendee error: ', error) + })); + + } + + if(remove.length >= 1) { + + this.agendaDataRepository.removeEventAttendee(this.postEvent.EventId, remove).subscribe((value) => { + console.log(value) + }, ((error) => { + tracing.setAttribute('failed.attendees', 'true') + console.log('add Attendee error: ', error) + })); + + } await this.saveDocument() diff --git a/src/app/pages/events/events.page.ts b/src/app/pages/events/events.page.ts index 52d27d211..fb7c1ae6a 100644 --- a/src/app/pages/events/events.page.ts +++ b/src/app/pages/events/events.page.ts @@ -17,6 +17,7 @@ import { SessionStore } from 'src/app/store/session.service'; import { TaskService } from 'src/app/services/task.service'; import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; import { EEventFilterStatus } from 'src/app/services/Repositorys/Agenda/model/enums'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; @Component({ selector: 'app-events', @@ -220,7 +221,8 @@ export class EventsPage implements OnInit { } - async RefreshEvents() { + @XTracerAsync({name:'home/getTask', bugPrint: true}) + async RefreshEvents(tracing?: TracingType) { this.currentEvent = ""; this.showLoader = true; @@ -232,29 +234,37 @@ export class EventsPage implements OnInit { let start = date.getFullYear() + "-" + month + "-" + date.getDate() + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds(); let end = date.getFullYear() + "-" + month + "-" + date.getDate() + " 23:59:59"; - if(SessionStore.user) { + try { + if(SessionStore.user) { - const response = await this.AgendaDataRepositoryService.EventList({ - userId: SessionStore.user.UserId, - calendarOwnerName: SessionStore.user.FullName, - startDate: date.toISOString(), - endDate: new Date(end).toISOString(), - status: EEventFilterStatus.AllToCommunicate - }) + const response = await this.AgendaDataRepositoryService.EventList({ + userId: SessionStore.user.UserId, + calendarOwnerName: SessionStore.user.FullName, + startDate: date.toISOString(), + endDate: new Date(end).toISOString(), + status: EEventFilterStatus.AllToCommunicate + }) - if(response.isOk()) { - this.listToPresent = response.value; - if(response.value?.length) { - this.totalEvent = response.value.length; + if(response.isOk()) { + this.listToPresent = response.value; + if(response.value?.length) { + this.totalEvent = response.value.length; + } + tracing.setAttribute('outcome', 'success') + } else { + tracing.setAttribute('outcome', 'failed') } + + this.showLoader = false; + this.showAgendaLoader = false; + + this.storage.set('events', this.listToPresent) } else { - + tracing.setAttribute('session', 'false') } - - this.showLoader = false; - this.showAgendaLoader = false; - - this.storage.set('events', this.listToPresent) + } catch (error) { + tracing.setAttribute('component.catch', 'true') + tracing.setAttribute('outcome', 'failed') } this.showLoader = false; diff --git a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts index 5bb58b266..a2ed0fe1b 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts @@ -160,7 +160,6 @@ export class AgendaDataRepositoryService { } createEvent(eventData: Event, documents, calendar: TableSharedCalendar, tracing: TracingType) { - console.log('create repository 1',eventData, calendar) let eventInput = { userId: calendar.wxUserId, @@ -182,8 +181,6 @@ export class AgendaDataRepositoryService { isAllDayEvent: eventData.IsAllDayEvent, } - console.log('create repository 2',eventInput) - APINODReturn(EventInputDTOSchema, eventInput, 'post/Events', tracing) return this.agendaDataService.createEvent(eventInput) } @@ -230,12 +227,15 @@ export class AgendaDataRepositoryService { return this.agendaDataService.addEventAttendee(id, { attendees: this.utils.attendeesAdded(attendeeData) }); } + removeEventAttendee(id, attendeeData: {Id : string}[]) { + + return this.agendaDataService.removeEventAttendee(id, { attendees: attendeeData.map(e => e.Id || e['id']) } ); + } + addEventAttachment(id, attachmentData, tracing: TracingType) { console.log(attachmentData) const attachments = { attachments: this.utils.documentAdded(attachmentData) } - console.log('post attachment', attachments) - APINODReturn(AttachInputDTOSchema, attachments, `POST/${id}/Attendee`, tracing) return this.agendaDataService.addEventAttachment(id, attachments); } diff --git a/src/app/services/Repositorys/Agenda/agenda-data.service.ts b/src/app/services/Repositorys/Agenda/agenda-data.service.ts index cfe3674b5..b56cd21db 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data.service.ts @@ -9,6 +9,7 @@ import { APIReturn } from '../../decorator/api-validate-schema.decorator'; import { TracingType } from '../../monitoring/opentelemetry/tracer'; import { EventListOutputDTO, EventListOutputDTOSchema } from './model/eventListDTOOutput'; import { EventOutputDTO } from './model/eventDTOOutput'; +import { AttendeesRemoveInputDTO } from './model/attendeeRemoveInputDTO'; @Injectable({ providedIn: 'root' @@ -98,7 +99,8 @@ export class AgendaDataService { return this.http.post(`${this.baseUrl}/Events/${id}/Attendee`, attendeeData); } - removeEventAttendee(id: string, attendeeData: any): Observable { + + removeEventAttendee(id: string, attendeeData: AttendeesRemoveInputDTO): Observable { return this.http.delete(`${this.baseUrl}/Events/${id}/Attendee`, { body: attendeeData }); } diff --git a/src/app/services/Repositorys/Agenda/async/change/attendeesLIstChangeDetector.ts b/src/app/services/Repositorys/Agenda/async/change/attendeesLIstChangeDetector.ts new file mode 100644 index 000000000..7e3eba5fc --- /dev/null +++ b/src/app/services/Repositorys/Agenda/async/change/attendeesLIstChangeDetector.ts @@ -0,0 +1,41 @@ +interface attendees { + + EmailAddress : string + Name: string + UserType: string + attendeeType: string + wxUserId: string + Id: string +} + +type Changes = { + insert: attendees[]; + remove: attendees[]; +}; + +export function AttendeesLIstChangeDetector( + localList: attendees[], + serverList: attendees[] +): Changes { + const changes: Changes = { insert: [], remove: [] }; + + const localMap = new Map(localList.map(item => [item.wxUserId, item])); + const serverMap = new Map(serverList.map(item => [item.wxUserId, item])); + + // Detect new or updated items + for (const [id, serverItem] of serverMap) { + const localItem = localMap.get(id); + if (!localItem) { + changes.insert.push(serverItem); + } + } + + // Detect deleted items + for (const [id, localItem] of localMap) { + if (!serverMap.has(id)) { + changes.remove.push(localItem); + } + } + + return changes; +} diff --git a/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts index 6d84e4001..5c5e1e317 100644 --- a/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts @@ -71,7 +71,7 @@ export class EventMapper { "EndDate": dto.endDate, "EventType": "Single", "Attendees": dto.attendees.map((e) => ({ - //Id: e.id, + Id: e.id, wxUserId: e.wxUserId, EmailAddress: e.emailAddress, Name: e.name, diff --git a/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts index 80804cd5d..cb58b86d3 100644 --- a/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts @@ -127,6 +127,7 @@ export class EventToApproveDetailsMapper { //"HasAttachments": true, "ParticipantsList": [ ...dto.attendees.map( e => ({ + Id: e.id, Name: e.name, EmailAddress: e.emailAddress, IsRequired: FEAttendeeType(e.attendeeType) == 'Required', diff --git a/src/app/services/Repositorys/Agenda/model/attendeeRemoveInputDTO.ts b/src/app/services/Repositorys/Agenda/model/attendeeRemoveInputDTO.ts new file mode 100644 index 000000000..50243b25d --- /dev/null +++ b/src/app/services/Repositorys/Agenda/model/attendeeRemoveInputDTO.ts @@ -0,0 +1,8 @@ +import { z } from "zod" + +export const AttendeesRemoveInputDTOSchema = z.object({ + attendees: z.array(z.string()), + +}) + +export type AttendeesRemoveInputDTO = z.infer diff --git a/src/app/services/notification/notification-holder.service.ts b/src/app/services/notification/notification-holder.service.ts index 1e950eded..ac76b2c48 100644 --- a/src/app/services/notification/notification-holder.service.ts +++ b/src/app/services/notification/notification-holder.service.ts @@ -36,21 +36,23 @@ export class NotificationHolderService { const element = notification const i = this.notificationList.length + 1 + console.log({notification}) + let notificationObject; if (element.notification) { notificationObject = { index: i, title: element.notification.title, - Service: element.data.Service, - Object: element.data.Object, - IdObject: element.data.IdObject, - FolderId: element.data.FolderId, + Service: element.data.Service || element.data.service, + Object: element.data.Object || element.data.object, + IdObject: element.data.IdObject || element.data.idObject, + FolderId: element.data.FolderId || element.data.folderId, body: element.notification.body, dateInit: this.getFormatedTime(element.data.dateInit), dateEnd: this.getFormatedTime(element.data.dateEnd), - Location: element.data.Location, - TypeAgenda: element.data.TypeAgenda, + Location: element.data.Location || element.data.Location, + TypeAgenda: element.data.TypeAgenda || element.data.typeAgenda, Role: element.data.Role, Status: element.data.Status, read: false, @@ -60,15 +62,15 @@ export class NotificationHolderService { notificationObject = { index: i, title: element.title, - Service: element.data.Service, - Object: element.data.Object, - IdObject: element.data.IdObject, - FolderId: element.data.FolderId, + Service: element.data.Service || element.data.service, + Object: element.data.Object || element.data.object, + IdObject: element.data.IdObject || element.data.idObject, + FolderId: element.data.FolderId || element.data.folderId, body: element.body, dateInit: this.getFormatedTime(element.data.dateInit), dateEnd: this.getFormatedTime(element.data.dateEnd), - Location: element.data.Location, - TypeAgenda: element.data.TypeAgenda, + Location: element.data.Location || element.data.folderId, + TypeAgenda: element.data.TypeAgenda || element.data.folderId, Role: element.data.Role, Status: element.data.Status, read: false, @@ -77,12 +79,12 @@ export class NotificationHolderService { } else { { notificationObject = { - FolderId: element.FolderId, - IdObject: element.IdObject, - Location: element.Location, - Object: element.Object, - Role: element.Role, - Service: element.Service, + FolderId: element.FolderId || element.data.folderId, + IdObject: element.IdObject || element.data.idObject, + Location: element.Location || element.data.location, + Object: element.Object || element.data.object, + Role: element.Role || element.data.role, + Service: element.Service || element.data.service, Status: element.Status, TypeAgenda: element.TypeAgenda, body: element.body, diff --git a/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.html b/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.html index f594c3423..6a48283ef 100644 --- a/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.html +++ b/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.html @@ -353,9 +353,9 @@

{{document.subject || document.Description || document.SourceName || document.sourceName || 'Sem título'}} - Correspondencia - AccoesPresidenciais - ArquivoDespachoElect + Correspondencia + AccoesPresidenciais + ArquivoDespachoElect diff --git a/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts b/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts index 49934dfd4..63cf0681f 100644 --- a/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts +++ b/src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts @@ -17,6 +17,7 @@ import { ThemeService } from 'src/app/services/theme.service' import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { AttendeesLIstChangeDetector } from 'src/app/services/Repositorys/Agenda/async/change/attendeesLIstChangeDetector'; const CUSTOM_DATE_FORMATS: NgxMatDateFormats = { parse: { @@ -154,33 +155,34 @@ export class EditEventToApprovePage implements OnInit { } - + + @XTracerAsync({name:'edit-event-approve/getTask', bugPrint: true}) async getTask(tracing?: TracingType) { const res = await this.agendaDataRepository.getEventToApproveById(this.serialNumber) if(res.isOk()) { console.log('evento to apro to edit', res.value) this.eventProcess = res.value as any; - + this.eventProcess.workflowInstanceDataFields.LastOccurrence = new Date(this.eventProcess.workflowInstanceDataFields.LastOccurrence) - + this.restoreDatepickerData() - + // description - + try { let body: any = this.eventProcess.workflowInstanceDataFields?.Body?.replace(/<[^>]+>/g, '') this.eventProcess.workflowInstanceDataFields.Body = body - + } catch (error) {} - + this.eventProcess.workflowInstanceDataFields.Category = this.setEventType(this.eventProcess.workflowInstanceDataFields.EventType) this.InstanceId = this.eventProcess.workflowInstanceDataFields.InstanceId this.loadedAttachments = res.value.Attachments; console.log(this.loadedAttachments) - + this.setOtherData() - + this.saveTemporaryData() tracing.setAttribute('outcome', 'success') @@ -189,7 +191,7 @@ export class EditEventToApprovePage implements OnInit { tracing.bugFlag() this.httpErroHalde.httpStatusHandle(res.error) } - + } getRecurrenceTypes() { @@ -337,11 +339,10 @@ export class EditEventToApprovePage implements OnInit { if (this.Form.invalid) return false - // set dates to eventProcess object + const serverCurrentList = this.eventProcess.workflowInstanceDataFields.ParticipantsList + this.dateControlStart = new FormControl(moment(new Date(this.eventProcess.workflowInstanceDataFields.StartDate)).add(1, 'hours')); this.dateControlEnd = new FormControl(moment(new Date(this.eventProcess.workflowInstanceDataFields.EndDate)).add(1, 'hours')); - // this.restoreDatepickerData() - // this.getDatepickerData() this.taskParticipantsCc.forEach(e => { e.IsRequired = false @@ -399,12 +400,32 @@ export class EditEventToApprovePage implements OnInit { tracing.setAttribute('outcome', 'failed') })); - this.agendaDataRepository.addEventAttendee(this.eventProcess.serialNumber, this.eventProcess.workflowInstanceDataFields.ParticipantsList).subscribe((value) => { - console.log(value) - }, ((error) => { - console.log('add Attendee error: ', error) - tracing.setAttribute('failed.attendees', 'true') - })); + console.log({serverCurrentList, list: this.eventProcess.workflowInstanceDataFields.ParticipantsList, e: this.eventProcess}) + + const { insert, remove } = AttendeesLIstChangeDetector(serverCurrentList as any, this.eventProcess.workflowInstanceDataFields.ParticipantsList as any) + + console.log({insert, remove}) + + if(insert.length >= 1) { + this.agendaDataRepository.addEventAttendee(this.eventProcess.serialNumber, insert).subscribe((value) => { + console.log(value) + }, ((error) => { + console.log('add Attendee error: ', error) + tracing.setAttribute('failed.attendees', 'true') + })); + } + + + if(remove.length >= 1) { + + this.agendaDataRepository.removeEventAttendee(this.eventProcess.serialNumber, remove).subscribe((value) => { + + }, ((error) => { + console.log('add Attendee error: ', error) + tracing.setAttribute('failed.attendees', 'true') + })); + } + if (this.addedAttachmentsList.length > 0) { this.agendaDataRepository.addEventAttachment(this.eventProcess.serialNumber, this.loadedAttachments, tracing).subscribe((value) => { @@ -435,24 +456,24 @@ export class EditEventToApprovePage implements OnInit { this.toastService._badRequest('Evento não editado'); } - this.loadedAttachments.forEach((document: any) => { - if (document['action'] == 'add') { - delete document.action - this.attachmentsService.setEventAttachmentById(document).subscribe(() => { - window['edit-approve-event-desktop']() - }, error => { - this.toastService.badRequest(); - }); - } else if (document['action'] == 'delete') { - delete document.action - this.attachmentsService.deleteEventAttachmentById(document.Id).subscribe(res => { - window['edit-approve-event-desktop']() - }, error => { - this.toastService.badRequest() - }) - } + // this.loadedAttachments.forEach((document: any) => { + // if (document['action'] == 'add') { + // delete document.action + // this.attachmentsService.setEventAttachmentById(document).subscribe(() => { + // window['edit-approve-event-desktop']() + // }, error => { + // this.toastService.badRequest(); + // }); + // } else if (document['action'] == 'delete') { + // delete document.action + // this.attachmentsService.deleteEventAttachmentById(document.Id).subscribe(res => { + // window['edit-approve-event-desktop']() + // }, error => { + // this.toastService.badRequest() + // }) + // } - }) + // }) } diff --git a/src/app/shared/agenda/edit-event/edit-event.page.ts b/src/app/shared/agenda/edit-event/edit-event.page.ts index 7f2981bb8..b60407245 100644 --- a/src/app/shared/agenda/edit-event/edit-event.page.ts +++ b/src/app/shared/agenda/edit-event/edit-event.page.ts @@ -20,6 +20,7 @@ import { Observable } from 'rxjs'; import { TableSharedCalendar } from 'src/app/services/Repositorys/Agenda/agenda-local-data-source.service'; import { RoleIdService } from 'src/app/services/role-id.service' import { XTracerAsync, TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { AttendeesLIstChangeDetector } from 'src/app/services/Repositorys/Agenda/async/change/attendeesLIstChangeDetector'; @Component({ selector: 'app-edit-event', templateUrl: './edit-event.page.html', @@ -423,6 +424,8 @@ export class EditEventPage implements OnInit { return false } + const serverCurrentList = this._postEvent.Attendees + this._postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc); @@ -448,15 +451,35 @@ export class EditEventPage implements OnInit { tracing.setAttribute('outcome', 'failed') })); - this.agendaDataRepository.addEventAttendee(this._postEvent.EventId, this._postEvent.Attendees).subscribe((value) => { - console.log(value) - }, ((error) => { - tracing.setAttribute('failed.attendees', 'true') - console.log('add Attendee error: ', error) - })); + console.log({serverCurrentList, Attendees: this._postEvent.Attendees}) + + const { insert, remove } = AttendeesLIstChangeDetector(serverCurrentList as any, this._postEvent.Attendees as any) + + console.log({ insert, remove }); + + if(insert.length >= 1) { + this.agendaDataRepository.addEventAttendee(this._postEvent.EventId, insert).subscribe((value) => { + console.log(value) + }, ((error) => { + tracing.setAttribute('failed.attendees', 'true') + console.log('add Attendee error: ', error) + })); + + } + + if(remove.length >= 1) { + + this.agendaDataRepository.removeEventAttendee(this._postEvent.EventId, remove).subscribe((value) => { + console.log(value) + }, ((error) => { + tracing.setAttribute('failed.attendees', 'true') + console.log('add Attendee error: ', error) + })); + + } - if (this.addedAttachmentsList.length > 0) { + if (this.addedAttachmentsList.length >= 1) { this.agendaDataRepository.addEventAttachment(this._postEvent.EventId, this.loadedEventAttachments, tracing).subscribe((value) => { console.log(value) }, ((error) => { @@ -466,7 +489,7 @@ export class EditEventPage implements OnInit { })); } - if (this.deletedAttachmentsList.length > 0) { + if (this.deletedAttachmentsList.length >= 1) { this.agendaDataRepository.removeEventAttachment(this._postEvent.EventId, { attachments: this.deletedAttachmentsList }).subscribe((value) => { console.log(value) }, ((error) => { @@ -518,7 +541,7 @@ export class EditEventPage implements OnInit { postEvent: this._postEvent, eventBody: this.eventBody, segment: this.segment, - loadedEventAttachments: this.loadedEventAttachments + loadedEventAttachments: this.loadedEventAttachments, } } @@ -687,13 +710,19 @@ export class EditEventPage implements OnInit { } setEventType(eventType) { - var selectedEventType = { - 1: 'Meeting', - 2: 'Travel', - 3: 'Conference', - 4: 'Encontro' + + if(typeof eventType == 'number') { + var selectedEventType = { + 1: 'Meeting', + 2: 'Travel', + 3: 'Conference', + 4: 'Encontro' + } + return selectedEventType[eventType]; + } else { + return this._postEvent.Category } - return selectedEventType[eventType]; + } } diff --git a/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html b/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html index 4a974627f..7dc7e8b69 100644 --- a/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html +++ b/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html @@ -292,9 +292,9 @@

{{document.subject || document.Description || 'Sem título'}} - Correspondencia - AccoesPresidenciais - ArquivoDespachoElect + Correspondencia + AccoesPresidenciais + ArquivoDespachoElect diff --git a/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts b/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts index d2db7400e..6dc6eaab2 100644 --- a/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts +++ b/src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts @@ -16,6 +16,7 @@ import { ThemeService } from 'src/app/services/theme.service' import { HttpErrorHandle } from 'src/app/services/http-error-handle.service' import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { AttendeesLIstChangeDetector } from 'src/app/services/Repositorys/Agenda/async/change/attendeesLIstChangeDetector'; const CUSTOM_DATE_FORMATS: NgxMatDateFormats = { parse: { @@ -115,12 +116,8 @@ export class EditEventToApproveComponent implements OnInit { constructor( private modalController: ModalController, private navParams: NavParams, - private eventsService: EventsService, public alertController: AlertController, private attachmentsService: AttachmentsService, - private processes: ProcessesService, - private toastService: ToastService, - private router: Router, public ThemeService: ThemeService, private httpErroHalde: HttpErrorHandle, private agendaDataRepository: AgendaDataRepositoryService @@ -169,9 +166,9 @@ export class EditEventToApproveComponent implements OnInit { let body: any = this.eventProcess.workflowInstanceDataFields.Body.replace(/<[^>]+>/g, '') this.eventProcess.workflowInstanceDataFields.Body = body - + } catch (error) {} - + this.Location = this.eventProcess.workflowInstanceDataFields.Location this.InstanceId = this.eventProcess.workflowInstanceDataFields.InstanceId @@ -280,6 +277,7 @@ export class EditEventToApproveComponent implements OnInit { e.IsRequired = false }) + const serverCurrentList = this.eventProcess.workflowInstanceDataFields.ParticipantsList this.eventProcess.workflowInstanceDataFields.ParticipantsList = this.taskParticipants.concat(this.taskParticipantsCc) this.eventProcess.workflowInstanceDataFields.ParticipantsList.forEach(e => { @@ -334,12 +332,32 @@ export class EditEventToApproveComponent implements OnInit { tracing.setAttribute('outcome', 'failed') })); - this.agendaDataRepository.addEventAttendee(this.eventProcess.serialNumber, this.eventProcess.workflowInstanceDataFields.ParticipantsList).subscribe((value) => { + console.log({serverCurrentList, ParticipantsList:this.eventProcess.workflowInstanceDataFields.ParticipantsList}) + const { insert, remove } = AttendeesLIstChangeDetector(serverCurrentList as any, this.eventProcess.workflowInstanceDataFields.ParticipantsList as any) + + console.log({insert, remove}) + + if(insert.length >= 1) { + + this.agendaDataRepository.addEventAttendee(this.eventProcess.serialNumber, insert).subscribe((value) => { + + }, ((error) => { + console.log('add Attendee error: ', error) + tracing.setAttribute('failed.attendees', 'true') + })); + } + + + if(remove.length >= 1) { + + this.agendaDataRepository.removeEventAttendee(this.eventProcess.serialNumber, remove).subscribe((value) => { + + }, ((error) => { + console.log('add Attendee error: ', error) + tracing.setAttribute('failed.attendees', 'true') + })); + } - }, ((error) => { - console.log('add Attendee error: ', error) - tracing.setAttribute('failed.attendees', 'true') - })); if (this.addedAttachmentsList.length > 0) { diff --git a/src/app/store/notification-holder.service.ts b/src/app/store/notification-holder.service.ts index 686f972f7..e72e7865b 100644 --- a/src/app/store/notification-holder.service.ts +++ b/src/app/store/notification-holder.service.ts @@ -54,10 +54,10 @@ export class NotificationHolderService { id: notification?.id || uuidv4(), index: i, title: element.notification.title, - Service: element.data.Service, - Object: element.data.Object, - IdObject: element.data.IdObject, - FolderId: element.data.FolderId, + Service: element.data.Service || element.data.service, + Object: element.data.Object || element.data.object, + IdObject: element.data.IdObject || element.data.idObject, + FolderId: element.data.FolderId || element.data.folderId, body: element.notification.body, dateInit: this.getFormatedTime(element.data.dateInit), dateEnd: this.getFormatedTime(element.data.dateEnd), @@ -73,10 +73,10 @@ export class NotificationHolderService { id: notification?.id || uuidv4(), index: i, title: element.title, - Service: element.data.Service, - Object: element.data.Object, - IdObject: element.data.IdObject, - FolderId: element.data.FolderId, + Service: element.data.Service || element.data.service, + Object: element.data.Object || element.data.object, + IdObject: element.data.IdObject || element.data.idObject, + FolderId: element.data.FolderId || element.data.folderId, body: element.body, dateInit: this.getFormatedTime(element.data.dateInit), dateEnd: this.getFormatedTime(element.data.dateEnd), @@ -91,12 +91,12 @@ export class NotificationHolderService { { notificationObject = { id: notification?.id || uuidv4(), - FolderId: element.FolderId, - IdObject: element.IdObject, + FolderId: element.FolderId || element.data.folderId, + IdObject: element.IdObject || element.data.idObject, Location: element.Location, - Object: element.Object, + Object: element.Object || element.data.service, Role: element.Role, - Service: element.Service, + Service: element.Service || element.data.service, Status: element.Status, TypeAgenda: element.TypeAgenda, body: element.body, @@ -124,10 +124,10 @@ export class NotificationHolderService { notificationObject = { id: notification?.id || uuidv4(), title: element.notification.title, - Service: element.data.Service, - Object: element.data.Object, - IdObject: element.data.IdObject, - FolderId: element.data.FolderId, + Service: element.data.Service || element.data.service, + Object: element.data.Object || element.data.object, + IdObject: element.data.IdObject || element.data.idObject, + FolderId: element.data.FolderId || element.data.folderId, body: element.notification.body, dateInit: this.getFormatedTime(element.data.dateInit), dateEnd: this.getFormatedTime(element.data.dateEnd), @@ -142,10 +142,10 @@ export class NotificationHolderService { notificationObject = { id: notification?.id || uuidv4(), title: element.title, - Service: element.data.Service, - Object: element.data.Object, - IdObject: element.data.IdObject, - FolderId: element.data.FolderId, + Service: element.data.Service || element.data.service, + Object: element.data.Object || element.data.object, + IdObject: element.data.IdObject || element.data.odObject, + FolderId: element.data.FolderId || element.data.folderId, body: element.body, dateInit: this.getFormatedTime(element.data.dateInit), dateEnd: this.getFormatedTime(element.data.dateEnd), @@ -160,12 +160,12 @@ export class NotificationHolderService { { notificationObject = { id: notification?.id || uuidv4(), - FolderId: element.FolderId, - IdObject: element.IdObject, + FolderId: element.FolderId || element.data.folderId, + IdObject: element.IdObject || element.data.idObject, Location: element.Location, - Object: element.Object, + Object: element.Object || element.data.object, Role: element.Role, - Service: element.Service, + Service: element.Service || element.data.service, Status: element.Status, TypeAgenda: element.TypeAgenda, body: element.body, diff --git a/version/git-version.ts b/version/git-version.ts index d94c150bd..ab6ca2b42 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "e1914505f", - "SHA": "e1914505f2e3ab233df288f980a028ecbcf1e2ed", + "shortSHA": "ca50ae9da", + "SHA": "ca50ae9dae0ac0d3ed0e5f2a820a780fd6509564", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Sat Jun 22 21:51:40 2024 +0100'", - "lastCommitMessage": "ITOTEAM-525 no mobile ao adicionar attachments aparece um sem título", - "lastCommitNumber": "5838", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 1 commit.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/modals/profile/profile.page.ts\n\tmodified: src/app/modals/view-event/view-event.page.ts\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/pages/agenda/view-event/view-event.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts\n\tmodified: src/app/services/Repositorys/Agenda/utils.ts\n\tmodified: src/app/services/task.service.ts\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts\n\tmodified: version/git-version.ts", + "lastCommitTime": "'Sun Jun 23 21:47:34 2024 +0100'", + "lastCommitMessage": "ITOTEAM-525 data validation", + "lastCommitNumber": "5839", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 2 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: angular.json\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/pages/events/events.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data.service.ts\n\tnew file: src/app/services/Repositorys/Agenda/async/change/attendeesLIstChangeDetector.ts\n\tmodified: src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts\n\tmodified: src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts\n\tnew file: src/app/services/Repositorys/Agenda/model/attendeeRemoveInputDTO.ts\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.html\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts\n\nChanges not staged for commit:\n (use \"git add ...\" to update what will be committed)\n (use \"git restore ...\" to discard changes in working directory)\n\tmodified: src/app/interceptors/token.interceptors.ts\n\tmodified: src/app/services/notification/notification-holder.service.ts\n\tmodified: src/app/store/notification-holder.service.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file From 76ff62d4287fd56a7bfe5e837cc0d63d8fe3679d Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Mon, 24 Jun 2024 16:08:20 +0100 Subject: [PATCH 4/8] ITOTEAM-594 Implementar o endpoint de listagem do tipo de agenda --- .../agenda/edit-event/edit-event.page.ts | 21 ++--- .../pages/agenda/new-event/new-event.page.ts | 21 ++--- .../notification-holder.service.ts | 85 +++++++++---------- .../agenda/edit-event/edit-event.page.ts | 22 ++--- .../shared/agenda/new-event/new-event.page.ts | 29 +++---- version/git-version.ts | 12 +-- 6 files changed, 80 insertions(+), 110 deletions(-) diff --git a/src/app/pages/agenda/edit-event/edit-event.page.ts b/src/app/pages/agenda/edit-event/edit-event.page.ts index 129ea2d33..f0ee509d0 100644 --- a/src/app/pages/agenda/edit-event/edit-event.page.ts +++ b/src/app/pages/agenda/edit-event/edit-event.page.ts @@ -698,26 +698,21 @@ export class EditEventPage implements OnInit { } - changeAgenda() { + async changeAgenda() { - setTimeout(() => { + const result = await this.agendaDataRepository.geCalendars() - if (this.eventsService.calendarNamesType[this.CalendarNameOwnerName]?.['Oficial'] && this.eventsService.calendarNamesType[this.CalendarNameOwnerName]?.['Pessoal']) { + const selectedCalendar = result.find(e => e.wxUserId == this.selectedUserCalendar) - this.CalendarNamesOptions = ['Oficial', 'Pessoal'] - - } else if (this.eventsService.calendarNamesType[this.CalendarNameOwnerName]?.['Oficial']) { + if(selectedCalendar) { + if(selectedCalendar.shareType == 1) { this.CalendarNamesOptions = ['Oficial'] - this.postEvent.CalendarName = 'Oficial' - - } else if (this.eventsService.calendarNamesType[this.CalendarNameOwnerName]?.['Pessoal']) { + } else if(selectedCalendar.shareType == 2) { this.CalendarNamesOptions = ['Pessoal'] - this.postEvent.CalendarName = 'Pessoal' - - } else { + } else if (selectedCalendar.shareType == 3) { this.CalendarNamesOptions = ['Oficial', 'Pessoal'] } - }, 50) + } } diff --git a/src/app/pages/agenda/new-event/new-event.page.ts b/src/app/pages/agenda/new-event/new-event.page.ts index 094ddd32c..f024f5b3e 100644 --- a/src/app/pages/agenda/new-event/new-event.page.ts +++ b/src/app/pages/agenda/new-event/new-event.page.ts @@ -537,26 +537,21 @@ export class NewEventPage implements OnInit { } } - changeAgenda() { + async changeAgenda() { - setTimeout(() => { + const result = await this.agendaDataRepository.geCalendars() - if (this.eventService.calendarNamesType[this.CalendarName]?.['Oficial'] && this.eventService.calendarNamesType[this.CalendarName]?.['Pessoal']) { + const selectedCalendar = result.find(e => e.wxUserId == this.selectedUserCalendar) - this.CalendarNamesOptions = ['Oficial', 'Pessoal'] - - } else if (this.eventService.calendarNamesType[this.CalendarName]?.['Oficial']) { + if(selectedCalendar) { + if(selectedCalendar.shareType == 1) { this.CalendarNamesOptions = ['Oficial'] - this.postEvent.CalendarName = 'Oficial' - - } else if (this.eventService.calendarNamesType[this.CalendarName]?.['Pessoal']) { + } else if(selectedCalendar.shareType == 2) { this.CalendarNamesOptions = ['Pessoal'] - this.postEvent.CalendarName = 'Pessoal' - - } else { + } else if (selectedCalendar.shareType == 3) { this.CalendarNamesOptions = ['Oficial', 'Pessoal'] } - }, 50) + } } diff --git a/src/app/services/notification/notification-holder.service.ts b/src/app/services/notification/notification-holder.service.ts index ac76b2c48..409e0eadd 100644 --- a/src/app/services/notification/notification-holder.service.ts +++ b/src/app/services/notification/notification-holder.service.ts @@ -40,62 +40,57 @@ export class NotificationHolderService { let notificationObject; if (element.notification) { - notificationObject = { - index: i, - title: element.notification.title, - Service: element.data.Service || element.data.service, - Object: element.data.Object || element.data.object, - IdObject: element.data.IdObject || element.data.idObject, - FolderId: element.data.FolderId || element.data.folderId, - body: element.notification.body, - dateInit: this.getFormatedTime(element.data.dateInit), - dateEnd: this.getFormatedTime(element.data.dateEnd), - Location: element.data.Location || element.data.Location, - TypeAgenda: element.data.TypeAgenda || element.data.typeAgenda, - Role: element.data.Role, - Status: element.data.Status, - read: false, + index: i, + title: element.notification.title, + Service: element.data.Service || element.data.service , + Object: element.data.Object || element.data.object , + IdObject: element.data.IdObject || element.data.idObject , + FolderId: element.data.FolderId || element.data.folderId , + body: element.notification.body, + dateInit: this.getFormatedTime(element.data.dateInit), + dateEnd: this.getFormatedTime(element.data.dateEnd), + Location: element.data.Location || element.data.location , + TypeAgenda: element.data.TypeAgenda || element.data.typeAgenda , + Role: element.data.Role || element.data.role , + Status: element.data.Status || element.data.status , + read: false, } - - } else if (element.data) { + } else if (element.data) { notificationObject = { - index: i, - title: element.title, - Service: element.data.Service || element.data.service, - Object: element.data.Object || element.data.object, - IdObject: element.data.IdObject || element.data.idObject, - FolderId: element.data.FolderId || element.data.folderId, - body: element.body, - dateInit: this.getFormatedTime(element.data.dateInit), - dateEnd: this.getFormatedTime(element.data.dateEnd), - Location: element.data.Location || element.data.folderId, - TypeAgenda: element.data.TypeAgenda || element.data.folderId, - Role: element.data.Role, - Status: element.data.Status, - read: false, + index: i, + title: element.title, + Service: element.data.Service || element.data.service , + Object: element.data.Object || element.data.object , + IdObject: element.data.IdObject || element.data.idObject , + FolderId: element.data.FolderId || element.data.folderId , + body: element.body, + dateInit: this.getFormatedTime(element.data.dateInit), + dateEnd: this.getFormatedTime(element.data.dateEnd), + Location: element.data.Location || element.data.location , + TypeAgenda: element.data.TypeAgenda || element.data.typeAgenda , + Role: element.data.Role || element.data.role , + Status: element.data.Status || element.data.status , + read: false, } - - } else { - { - notificationObject = { - FolderId: element.FolderId || element.data.folderId, - IdObject: element.IdObject || element.data.idObject, - Location: element.Location || element.data.location, - Object: element.Object || element.data.object, - Role: element.Role || element.data.role, - Service: element.Service || element.data.service, - Status: element.Status, - TypeAgenda: element.TypeAgenda, + } else { + notificationObject = { + FolderId: element.FolderId || element.folderId , + IdObject: element.IdObject || element.idObject , + Location: element.Location || element.location , + Object: element.Object || element.object , + Role: element.Role || element.role , + Service: element.Service || element.service , + Status: element.Status || element.status , + TypeAgenda: element.TypeAgenda || element.typeAgenda , body: element.body, dateEnd: element.dateEnd, dateInit: element.dateInit, index: element.index, title: element.title, read: false, - } } - } + } this.notificationList.push(notificationObject) this.save() diff --git a/src/app/shared/agenda/edit-event/edit-event.page.ts b/src/app/shared/agenda/edit-event/edit-event.page.ts index b60407245..10cb6e355 100644 --- a/src/app/shared/agenda/edit-event/edit-event.page.ts +++ b/src/app/shared/agenda/edit-event/edit-event.page.ts @@ -636,27 +636,21 @@ export class EditEventPage implements OnInit { } - changeAgenda() { + async changeAgenda() { - setTimeout(() => { - console.log('selecione agenda', this.eventsService.calendarNamesType) + const result = await this.agendaDataRepository.geCalendars() - if (this.eventsService.calendarNamesType[this.CalendarNameOwnerName]?.['Oficial'] && this.eventsService.calendarNamesType[this.CalendarNameOwnerName]?.['Pessoal']) { + const selectedCalendar = result.find(e => e.wxUserId == this.selectedUserCalendar) - this.CalendarNamesOptions = ['Oficial', 'Pessoal'] - - } else if (this.eventsService.calendarNamesType[this.CalendarNameOwnerName]?.['Oficial']) { + if(selectedCalendar) { + if(selectedCalendar.shareType == 1) { this.CalendarNamesOptions = ['Oficial'] - this._postEvent.CalendarName = 'Oficial' - - } else if (this.eventsService.calendarNamesType[this.CalendarNameOwnerName]?.['Pessoal']) { + } else if(selectedCalendar.shareType == 2) { this.CalendarNamesOptions = ['Pessoal'] - this._postEvent.CalendarName = 'Pessoal' - - } else { + } else if (selectedCalendar.shareType == 3) { this.CalendarNamesOptions = ['Oficial', 'Pessoal'] } - }, 50) + } } diff --git a/src/app/shared/agenda/new-event/new-event.page.ts b/src/app/shared/agenda/new-event/new-event.page.ts index 067766c2e..bd5883944 100644 --- a/src/app/shared/agenda/new-event/new-event.page.ts +++ b/src/app/shared/agenda/new-event/new-event.page.ts @@ -185,6 +185,8 @@ export class NewEventPage implements OnInit { this.selectedUserCalendar = SessionStore.user.UserId } + this.changeAgenda() + } } @@ -408,34 +410,23 @@ export class NewEventPage implements OnInit { this.hasChangeCalendar = true } - changeAgenda() { + async changeAgenda() { this.CalendarNameShow = false - setTimeout(() => { + const result = await this.agendaDataRepository.geCalendars() - this.CalendarNameShow = true + const selectedCalendar = result.find(e => e.wxUserId == this.selectedUserCalendar) - if (this.eventService.calendarNamesType[this.CalendarName]?.['Oficial'] && this.eventService.calendarNamesType[this.CalendarName]?.['Pessoal']) { - - this.CalendarNamesOptions = ['Oficial', 'Pessoal'] - console.log(this.postEvent.CalendarName) - - } else if (this.eventService.calendarNamesType[this.CalendarName]?.['Oficial']) { + if(selectedCalendar) { + if(selectedCalendar.shareType == 1) { this.CalendarNamesOptions = ['Oficial'] - this.postEvent.CalendarName = 'Oficial' - console.log(this.postEvent.CalendarName) - - } else if (this.eventService.calendarNamesType[this.CalendarName]?.['Pessoal']) { + } else if(selectedCalendar.shareType == 2) { this.CalendarNamesOptions = ['Pessoal'] - this.postEvent.CalendarName = 'Pessoal' - console.log(this.postEvent.CalendarName) - - } else { + } else if (selectedCalendar.shareType == 3) { this.CalendarNamesOptions = ['Oficial', 'Pessoal'] - console.log(this.postEvent.CalendarName) } - }, 50) + } } diff --git a/version/git-version.ts b/version/git-version.ts index ab6ca2b42..fa93694b0 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "ca50ae9da", - "SHA": "ca50ae9dae0ac0d3ed0e5f2a820a780fd6509564", + "shortSHA": "93476dc5c", + "SHA": "93476dc5c494511533d5ae327a3b026399581e9b", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Sun Jun 23 21:47:34 2024 +0100'", - "lastCommitMessage": "ITOTEAM-525 data validation", - "lastCommitNumber": "5839", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 2 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: angular.json\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/pages/events/events.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data.service.ts\n\tnew file: src/app/services/Repositorys/Agenda/async/change/attendeesLIstChangeDetector.ts\n\tmodified: src/app/services/Repositorys/Agenda/mapper/EventDetailsMapper.ts\n\tmodified: src/app/services/Repositorys/Agenda/mapper/EventToApproveDetailsMapper.ts\n\tnew file: src/app/services/Repositorys/Agenda/model/attendeeRemoveInputDTO.ts\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.html\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts\n\nChanges not staged for commit:\n (use \"git add ...\" to update what will be committed)\n (use \"git restore ...\" to discard changes in working directory)\n\tmodified: src/app/interceptors/token.interceptors.ts\n\tmodified: src/app/services/notification/notification-holder.service.ts\n\tmodified: src/app/store/notification-holder.service.ts", + "lastCommitTime": "'Mon Jun 24 15:35:16 2024 +0100'", + "lastCommitMessage": "ITOTEAM-597 remove atendess from list", + "lastCommitNumber": "5840", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 3 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/pages/agenda/new-event/new-event.page.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/agenda/new-event/new-event.page.ts\n\nChanges not staged for commit:\n (use \"git add ...\" to update what will be committed)\n (use \"git restore ...\" to discard changes in working directory)\n\tmodified: src/app/services/notification/notification-holder.service.ts\n\tmodified: version/git-version.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file From fbaf0afcf137adaf815d2013e6c1d6f87561cf95 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Tue, 25 Jun 2024 12:11:44 +0100 Subject: [PATCH 5/8] =?UTF-8?q?ITOTEAM-523=20A=20app=20n=C3=A3o=20redireci?= =?UTF-8?q?ona=20as=20notifica=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/home/home.page.ts | 2 +- src/app/interceptors/metter.interceptor.ts | 32 +----- src/app/modals/profile/profile.page.ts | 82 +++++++++++----- .../view-document/view-document.page.ts | 49 ++++++++++ .../Repositorys/Agenda/agendaDataModels.ts | 4 +- src/app/services/agenda/list-box.service.ts | 98 +++++++++---------- .../monitoring/opentelemetry/matrix.ts | 88 +++++------------ .../monitoring/opentelemetry/tracer.ts | 16 ++- .../notification/notifications.service.ts | 2 +- src/app/services/notifications.service.ts | 2 +- src/app/services/toast.service.ts | 21 +++- .../agenda/view-event/view-event.page.ts | 5 +- src/app/store/notification-holder.service.ts | 4 +- version/git-version.ts | 12 +-- 14 files changed, 231 insertions(+), 186 deletions(-) diff --git a/src/app/home/home.page.ts b/src/app/home/home.page.ts index dd4a86762..441a20b5b 100644 --- a/src/app/home/home.page.ts +++ b/src/app/home/home.page.ts @@ -187,7 +187,7 @@ export class HomePage implements OnInit { if ("serviceWorker" in navigator) { navigator.serviceWorker.onmessage = (event) => { - console.log('Mensagem recebida do Service Worker:', event.data.data); + console.log('Mensagem recebida do Service Worker:', event.data); let object = { notification: event.data } diff --git a/src/app/interceptors/metter.interceptor.ts b/src/app/interceptors/metter.interceptor.ts index 035829253..c5e951afe 100644 --- a/src/app/interceptors/metter.interceptor.ts +++ b/src/app/interceptors/metter.interceptor.ts @@ -2,32 +2,8 @@ import { Injectable } from '@angular/core'; import { HTTP_INTERCEPTORS, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; -import { metrics } from '@opentelemetry/api'; -import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; -import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; +import { meter, RequestCounter } from '../services/monitoring/opentelemetry/matrix'; -// Initialize OpenTelemetry metrics -const meterProvider = new MeterProvider(); -metrics.setGlobalMeterProvider(meterProvider); - -if (window.location.protocol !== 'https:') { - const metricReader = new PeriodicExportingMetricReader({ - exporter: new OTLPMetricExporter({ - url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics', - // headers: { - // 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'), - // } - }), - exportIntervalMillis: 3000, - }); - - meterProvider.addMetricReader(metricReader); -} - -const meter = meterProvider.getMeter('example-exporter-collector'); -const requestCounter = meter.createCounter('post_requests', { - description: 'Example of a Counter', -}); @Injectable() export class MetricsInterceptor implements HttpInterceptor { @@ -37,7 +13,7 @@ export class MetricsInterceptor implements HttpInterceptor { if (event instanceof HttpResponse) { // Capture the status code and check protocol if (req.method !== 'GET' && !req.urlWithParams.includes('metrics')) { - + console.log('response', event.body) const path = req.urlWithParams; const url = new URL(path); @@ -45,7 +21,7 @@ export class MetricsInterceptor implements HttpInterceptor { let attributes = { path: url.pathname, method: req.method }; const statusCode = event.status; const extendedAttributes = { ...attributes, status: statusCode }; - requestCounter.add(1, extendedAttributes); + RequestCounter.add(1, extendedAttributes); } } } @@ -58,4 +34,4 @@ export const metricsInterceptor = { provide: HTTP_INTERCEPTORS, useClass: MetricsInterceptor, multi: true -}; \ No newline at end of file +}; diff --git a/src/app/modals/profile/profile.page.ts b/src/app/modals/profile/profile.page.ts index 42a51abfc..8ed6b8756 100644 --- a/src/app/modals/profile/profile.page.ts +++ b/src/app/modals/profile/profile.page.ts @@ -1,7 +1,6 @@ import { Component, OnInit, NgZone } from '@angular/core'; import { NavigationExtras, Router } from '@angular/router'; import { AnimationController, ModalController, Platform } from '@ionic/angular'; -import { LoginUserRespose } from 'src/app/models/user.model'; import { AuthService } from 'src/app/services/auth.service'; import { EditProfilePage } from './edit-profile/edit-profile.page'; import { StorageService } from '../../services/storage.service'; @@ -13,7 +12,9 @@ import { environment } from 'src/environments/environment'; import { ProcessesService } from 'src/app/services/processes.service'; import { EventsService } from 'src/app/services/events.service'; import { NotificationHolderService } from 'src/app/store/notification-holder.service'; -import { TracingType, XTracer } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; +import { ToastService } from 'src/app/services/toast.service'; @Component({ selector: 'app-profile', @@ -58,7 +59,9 @@ export class ProfilePage implements OnInit { private eventsService: EventsService, private storageService: StorageService, public NotificationHolderService: NotificationHolderService, - private authservice: AuthService + private authservice: AuthService, + private agendaDataRepository: AgendaDataRepositoryService, + private toastService: ToastService, ) { window['e'] = () => { @@ -212,41 +215,68 @@ export class ProfilePage implements OnInit { return time; } - @XTracer({name:'profile/notificationClick', bugPrint: true, module:'notification'}) - notificatinsRoutes (index, Service, Object, IdObject, FolderId, i, tracing?: TracingType) { + @XTracerAsync({name:'profile/notificationClick', bugPrint: true, module:'notification'}) + async notificatinsRoutes (index, Service, Object, IdObject, FolderId, i, tracing?: TracingType) { console.log(index, i) try { if (Service === "agenda") { this.isloading = true - if (Service === "agenda" && IdObject.length > 10) { - this.eventsService.getEvent(IdObject).subscribe((task) => { + if (Service === "agenda") { - this.zone.run(() => this.router.navigate(['/home/agenda', IdObject, 'agenda'])); - this.deleteNotification(index); - this.isloading = false + let res = await this.agendaDataRepository.getEventById(IdObject, tracing) - }, (error) => { - this.NotificationHolderService.notificationList[i].read = true; - this.isloading = false - }) - } + if(IdObject) { - if (Service === "agenda" && Object === "event-list") { + if(res.isOk()) { + + this.zone.run(() => this.router.navigate(['/home/agenda', IdObject, 'agenda'])); + this.deleteNotification(index); + tracing.setAttribute('outcome', 'success') + } else { + tracing.setAttribute('outcome', 'success') + tracing.setAttribute('data.exist', 'false') + this.NotificationHolderService.notificationList[i].read = true; + console.log('error', res.error) + } + } else { + tracing.setAttribute('data.IdObject', 'false') + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #01') + } + + this.isloading = false + + } else if (Service === "agenda" && Object === "event-list") { this.isloading = true - this.processesService.GetTask(IdObject).subscribe((task) => { - console.log('evento exist') - this.zone.run(() => this.router.navigate(['/home/agenda/event-list/approve-event', IdObject, 'agenda'])); - this.deleteNotification(index); - this.isloading = false - }, (error) => { - console.log('evento não existe') - this.NotificationHolderService.notificationList[i].read = true; - this.isloading = false - }) + if(IdObject) { + let res = await this.agendaDataRepository.getEventById(IdObject, tracing) + if(res.isOk()) { + console.log('evento exist') + tracing.setAttribute('outcome', 'success') + this.zone.run(() => this.router.navigate(['/home/agenda/event-list/approve-event', IdObject, 'agenda'])); + this.deleteNotification(index); + this.isloading = false + } else { + tracing.setAttribute('outcome', 'success') + console.log('evento não existe') + tracing.setAttribute('data.exist', 'false') + this.NotificationHolderService.notificationList[i].read = true; + this.isloading = false + } + } else { + tracing.setAttribute('data.IdObject', 'false') + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #01') + } + + this.isloading = false + + } else { + tracing.setAttribute('notification.route', 'false') + tracing.setAttribute('outcome', 'failed') + tracing.setAttribute('parameters', JSON.stringify({Service, Object, IdObject, FolderId})) } } else if (Service === "gabinete-digital") { diff --git a/src/app/modals/view-document/view-document.page.ts b/src/app/modals/view-document/view-document.page.ts index 5f32c03fd..4611b5ade 100644 --- a/src/app/modals/view-document/view-document.page.ts +++ b/src/app/modals/view-document/view-document.page.ts @@ -92,6 +92,55 @@ export class ViewDocumentPage implements OnInit { } + + // @XTracerAsync({name:'view-document/LoadViewer', bugPrint: true, daley: 4000}) + // async LoadViewer(tracing?: TracingType) { + // this.processes.GetViewer(this.docId, this.applicationId).subscribe(async(res)=> { + + // const link: string = res.replace('//pdfjs/web/', '/pdfjs/web/') + // this.trustedUrl = this.sanitazer.bypassSecurityTrustResourceUrl(link); + + // // const iframe = document.getElementById("iframe") + // // const handleLoad = () => { + // // this.loader = false + // // }; + + // // iframe.addEventListener('load', handleLoad, true) + + // if(res == "") { + // const alert = await this.alertController.create({ + // cssClass: 'my-custom-class', + // //header: 'Apagar evento!', + // message: 'Sem imagem', + // buttons: [ + // { + // text: 'Sim', + // handler: () => { + // this.close(); + // } + // } + // ] + // }); + // } + + // tracing.setAttribute('outcome', 'success') + + // }, (error)=>{ + // if(isHttpError(error)) { + // tracing?.setAttribute('status.code', error.status.toString()) + // if (error.status == 400) { + // tracing?.bugFlag() + // tracing?.setAttribute('outcome', 'failed') + // } + // } + // tracing.setAttribute('outcome', 'failed') + // this.close(); + // }); + + // } + + + close() { this.modalController.dismiss(); } diff --git a/src/app/services/Repositorys/Agenda/agendaDataModels.ts b/src/app/services/Repositorys/Agenda/agendaDataModels.ts index b5da75bc8..5e71087e5 100644 --- a/src/app/services/Repositorys/Agenda/agendaDataModels.ts +++ b/src/app/services/Repositorys/Agenda/agendaDataModels.ts @@ -72,8 +72,8 @@ export const EventInputDTOSchema = z.object({ subject: z.string().min(1), body: z.string().min(1), location: z.string().nullable().optional(), - startDate: z.string().datetime(), - endDate: z.string().datetime(), + startDate: z.string(), + endDate: z.string(), type: EEventTypeDTO, category: EEventCategoryDTO, attendees: z.array(AttendeeInputDTOSchema).nullable().optional(), diff --git a/src/app/services/agenda/list-box.service.ts b/src/app/services/agenda/list-box.service.ts index 4d597d822..30ee3cf96 100644 --- a/src/app/services/agenda/list-box.service.ts +++ b/src/app/services/agenda/list-box.service.ts @@ -131,73 +131,69 @@ export class ListBoxService { cloneSelectedDate.setMinutes(0) cloneSelectedDate.setSeconds(0) - if (diffDays <= 150 ) { - if (diffDays >= 1) { + if (diffDays >= 1) { - const StartEvent = this.transForm(event, {startMany: true, endMany: false, middle: false}) + const StartEvent = this.transForm(event, {startMany: true, endMany: false, middle: false}) - if(this.CanPush(event, selectedDate) && (new Date(event.start)).getTime() >= cloneSelectedDate.getTime()) { - days[day].push(StartEvent); this.push(StartEvent, year) + if(this.CanPush(event, selectedDate) && (new Date(event.start)).getTime() >= cloneSelectedDate.getTime()) { + days[day].push(StartEvent); this.push(StartEvent, year) + } + + let i = 1; + + //create event between date + while (startDate.getFullYear() != endDate.getFullYear() || + startDate.getMonth() != endDate.getMonth() || + startDate.getDate() != endDate.getDate()) { + + const newDate = startDate.setDate(startDate.getDate()+ i) + let otherDays = this.dateService.getDay(newDate) + + const cloneEvent = {...event} + cloneEvent['other'] = true + + cloneEvent.start = new Date(startDate) + + if(!days.hasOwnProperty(otherDays)) { + days[otherDays] = [] } - let i = 1; + if (!(startDate.getFullYear() != endDate.getFullYear() || + startDate.getMonth() != endDate.getMonth() || + startDate.getDate() != endDate.getDate())) { + // last push + const EndEvent = this.transForm(cloneEvent, {startMany: false, endMany: true, middle: false}) + if(this.CanPush(cloneEvent, selectedDate) && cloneEvent.start.getTime() >= cloneSelectedDate.getTime()) { + days[otherDays].push(EndEvent) ; this.push(EndEvent, year) + } - //create event between date - while (startDate.getFullYear() != endDate.getFullYear() || - startDate.getMonth() != endDate.getMonth() || - startDate.getDate() != endDate.getDate()) { + } else { - const newDate = startDate.setDate(startDate.getDate()+ i) - let otherDays = this.dateService.getDay(newDate) - - const cloneEvent = {...event} - cloneEvent['other'] = true - - cloneEvent.start = new Date(startDate) - - if(!days.hasOwnProperty(otherDays)) { - days[otherDays] = [] - } - - if (!(startDate.getFullYear() != endDate.getFullYear() || - startDate.getMonth() != endDate.getMonth() || - startDate.getDate() != endDate.getDate())) { - // last push - const EndEvent = this.transForm(cloneEvent, {startMany: false, endMany: true, middle: false}) - if(this.CanPush(cloneEvent, selectedDate) && cloneEvent.start.getTime() >= cloneSelectedDate.getTime()) { - days[otherDays].push(EndEvent) ; this.push(EndEvent, year) - } - - } else { - - const EndEvent = this.transForm(cloneEvent, {startMany: false,endMany: true, middle: true}) - if(this.CanPush(cloneEvent, selectedDate) && cloneEvent.start.getTime() >= cloneSelectedDate.getTime()) { + const EndEvent = this.transForm(cloneEvent, {startMany: false,endMany: true, middle: true}) + if(this.CanPush(cloneEvent, selectedDate) && cloneEvent.start.getTime() >= cloneSelectedDate.getTime()) { + days[otherDays].push(EndEvent) ; this.push(EndEvent, year) + } else { + if( cloneEvent.start.getFullYear() == cloneSelectedDate.getFullYear() && cloneEvent.start.getDate() == cloneSelectedDate.getDate() && cloneEvent.start.getMonth() == cloneSelectedDate.getMonth()) { + // console.log("00_00") days[otherDays].push(EndEvent) ; this.push(EndEvent, year) } else { - if( cloneEvent.start.getFullYear() == cloneSelectedDate.getFullYear() && cloneEvent.start.getDate() == cloneSelectedDate.getDate() && cloneEvent.start.getMonth() == cloneSelectedDate.getMonth()) { - // console.log("00_00") - days[otherDays].push(EndEvent) ; this.push(EndEvent, year) - } else { - // console.log('0000000000000000000000000',cloneEvent.start.getTime(), cloneSelectedDate.getTime()) - // console.log('0000000000000000000000000',cloneEvent.start, cloneSelectedDate) - } + // console.log('0000000000000000000000000',cloneEvent.start.getTime(), cloneSelectedDate.getTime()) + // console.log('0000000000000000000000000',cloneEvent.start, cloneSelectedDate) } + } - } + } - days[otherDays] = days[otherDays].reverse() + days[otherDays] = days[otherDays].reverse() - } + } - } else { + } else { + if(this.CanPush(event, selectedDate)) { days[day].push(event) ; this.push(event, year) } + } - if(this.CanPush(event, selectedDate)) { days[day].push(event) ; this.push(event, year) } - } - } else { - if(this.CanPush(event, selectedDate)) { days[day].push(event) ; this.push(event, year) } - } } else { if(this.CanPush(event, selectedDate) && diffDays != 2) { days[day].push(event) ; this.push(event, year) } } diff --git a/src/app/services/monitoring/opentelemetry/matrix.ts b/src/app/services/monitoring/opentelemetry/matrix.ts index ba9fb58d5..3d1f0964e 100644 --- a/src/app/services/monitoring/opentelemetry/matrix.ts +++ b/src/app/services/monitoring/opentelemetry/matrix.ts @@ -1,67 +1,31 @@ -const { DiagConsoleLogger, DiagLogLevel, diag, metrics } = require('@opentelemetry/api'); -const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-http'); -const { MeterProvider, PeriodicExportingMetricReader } = require('@opentelemetry/sdk-metrics'); +import { metrics } from '@opentelemetry/api'; +import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http'; +import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; +import { environment } from 'src/environments/environment'; -// Optional and only needed to see the internal diagnostic logging (during development) -// diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG); +// Initialize OpenTelemetry metrics +const meterProvider = new MeterProvider(); +metrics.setGlobalMeterProvider(meterProvider); -let interval; -let meter; +if (window.location.protocol !== 'https:' && environment.presidential == false) { + const metricReader = new PeriodicExportingMetricReader({ + exporter: new OTLPMetricExporter({ + url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics', + // headers: { + // 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'), + // } + }), + exportIntervalMillis: 3000, + }); -// function stopMetrics() { -// console.log('STOPPING METRICS'); -// clearInterval(interval); -// metrics.getMeterProvider().shutdown() -// .then(() => metrics.disable()); -// } + meterProvider.addMetricReader(metricReader); +} -// function startMetrics() { -// console.log('STARTING METRICS'); +export const meter = meterProvider.getMeter('example-exporter-collector'); +export const RequestCounter = meter.createCounter('post_requests', { + description: 'Example of a Counter', +}); -// const meterProvider = new MeterProvider(); -// metrics.setGlobalMeterProvider(meterProvider); - -// meterProvider.addMetricReader(new PeriodicExportingMetricReader({ -// exporter: new OTLPMetricExporter({ -// //url: 'http://localhost:8019/collector/v1/metrics', -// // url: 'http://localhost:4318/v1/metrics', -// url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics', // Custom port 85 -// //url: 'https://5-180-182-151.cloud-xip.com:85/collector/v1/metrics', // Custom port 85 -// // headers: { -// // 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'), -// // } -// }), -// exportIntervalMillis: 2000 -// })); - -// meter = meterProvider.getMeter('example-exporter-collector') - -// const requestCounter = meter.createCounter('requests', { -// description: 'Example of a Counter', -// }); - -// const upDownCounter = meter.createUpDownCounter('test_up_down_counter', { -// description: 'Example of a UpDownCounter', -// }); - -// const attributes = { environment: 'staging' }; - -// interval = setInterval(() => { -// requestCounter.add(1, attributes); -// requestCounter.add(1, {environment: 'testing'}); -// requestCounter.add(1, {environment: 'ok'}); -// upDownCounter.add(Math.random() > 0.5 ? 1 : -1, attributes); -// }, 1000); -// } - -// const addClickEvents = () => { -// // const startBtn = document.getElementById('startBtn'); - -// // const stopBtn = document.getElementById('stopBtn'); -// // startBtn.addEventListener('click', startMetrics); -// // stopBtn.addEventListener('click', stopMetrics); - -// // startMetrics() -// }; - -// // addClickEvents(); +export const UseCaseCounter = meter.createCounter('use_case', { + description: 'use case counter', +}); diff --git a/src/app/services/monitoring/opentelemetry/tracer.ts b/src/app/services/monitoring/opentelemetry/tracer.ts index 98c1380e1..ed5dfaa83 100644 --- a/src/app/services/monitoring/opentelemetry/tracer.ts +++ b/src/app/services/monitoring/opentelemetry/tracer.ts @@ -5,6 +5,8 @@ import { OpentelemetryAgendaProvider, OpentelemetryInterceptorProvider, Opentele import { Device, DeviceInfo } from '@capacitor/device'; import { SessionStore } from 'src/app/store/session.service'; import { environment } from 'src/environments/environment'; +import { UseCaseCounter } from './matrix'; +// import { context, propagation } from '@opentelemetry/api'; const tracerInstance = OpentelemetryAgendaProvider.getTracer('example-tracer-hole', '111', {}) const tracerNotificationInstance = OpentelemetryNotificationProvider.getTracer('example-tracer-hole', '111', {}) @@ -58,10 +60,16 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp data.tags[key] = value; span.setAttribute(key, value); }, + getAttribute: (key: string) => { + return data.tags[key] + }, finish: () => { - span.end(); + if(environment.presidential == false) { + span.end(); + UseCaseCounter.add(1, {user: SessionStore?.user?.FullName, outcome:data.tags['outcome'], usecase: name}) + } - if(bugPrint && hasBug) { + if(bugPrint && data.tags['outcome'] == 'failed') { console.error(name, data) } }, @@ -92,12 +100,13 @@ export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, tracing.setAttribute('commit.date', environment.version.lastCommitTime) tracing.setAttribute('commit.branch', environment.version.branch) + args.push(tracing) try { const result = await originalMethod.apply(this, args); - if(autoFinish) { + if(autoFinish ) { setTimeout(tracing.finish , daley) } @@ -167,6 +176,7 @@ export type TracingType = { //logEvent: (name: string, attributesOrStartTime?: AttributeValue | TimeInput) => void; addEvent: (context: string, message?: any, obj?: any) => void; setAttribute: (key: string, value: string) => void; + getAttribute: (key: string) => string; LocalLogEvent: (name: string, attributesOrStartTime: any, obj?:any) => void; finish: () => void; bugFlag:() => void; diff --git a/src/app/services/notification/notifications.service.ts b/src/app/services/notification/notifications.service.ts index b4090923b..cad672b6c 100644 --- a/src/app/services/notification/notifications.service.ts +++ b/src/app/services/notification/notifications.service.ts @@ -143,7 +143,7 @@ export class NotificationsService { ); } else { navigator.serviceWorker.onmessage = (event) => { - console.log('Mensagem recebida do Service Worker:', event.data.data); + console.log('Mensagem recebida do Service Worker:', event.data); let object = { notification: event.data } diff --git a/src/app/services/notifications.service.ts b/src/app/services/notifications.service.ts index c9cab64b8..65e828e8d 100644 --- a/src/app/services/notifications.service.ts +++ b/src/app/services/notifications.service.ts @@ -288,7 +288,7 @@ export class NotificationsService { try { navigator.serviceWorker.onmessage = (event) => { - console.log('Mensagem recebida do Service Worker:', event.data.data); + console.log('Mensagem recebida do Service Worker:', event.data); let object = { notification: event.data } diff --git a/src/app/services/toast.service.ts b/src/app/services/toast.service.ts index 8c5ad408a..aa2906818 100644 --- a/src/app/services/toast.service.ts +++ b/src/app/services/toast.service.ts @@ -57,6 +57,23 @@ export class ToastService { } + removeBeforeHash(text) { + const hashIndex = text.indexOf('#'); + if (hashIndex !== -1) { + return text.substring(hashIndex); + } + return text; + } + + getEverythingBeforeHash(text) { + const hashIndex = text.indexOf('#'); + if (hashIndex !== -1) { + return text.substring(0, hashIndex).trim(); + } + return text; + } + + async _badRequest(message?: string, callback?) { let notification = document.createElement('div') @@ -73,9 +90,9 @@ export class ToastService { ` notification.style.animationName = 'notification-top' - + console.error(this.removeBeforeHash(message)) document.body.append(notification) - notification.querySelector('.text').innerHTML = message || 'Processo não efetuado' + notification.querySelector('.text').innerHTML = this.getEverythingBeforeHash(message) || 'Processo não efetuado' setTimeout(()=>{ if (callback) { callback() diff --git a/src/app/shared/agenda/view-event/view-event.page.ts b/src/app/shared/agenda/view-event/view-event.page.ts index 92b5db25b..5edde04a4 100644 --- a/src/app/shared/agenda/view-event/view-event.page.ts +++ b/src/app/shared/agenda/view-event/view-event.page.ts @@ -78,6 +78,8 @@ export class ViewEventPage implements OnInit { this.loadedEvent = new Event(); this.eventBody = { BodyType : "1", Text : ""}; this.loadedEvent.Body = this.eventBody; + + console.log() } ngOnInit() { @@ -128,7 +130,7 @@ export class ViewEventPage implements OnInit { setTimeZone() { this.TimeZoneString = this.loadedEvent.TimeZone } - @XTracerAsync({name:'ViewEventPage/loadEvent', bugPrint: true}) + @XTracerAsync({name:'desktop/event-details', bugPrint: true}) async loadEvent(tracing?: TracingType) { let res = await this.agendaDataRepository.getEventById(this.eventId, tracing) @@ -139,6 +141,7 @@ export class ViewEventPage implements OnInit { /* let changeDate = this.dateService.fixDate(res.value as any) as any */ this.loadedEvent = res.value as any; + console.log('this.loadedEvent', this.loadedEvent) this.setTimeZone() } else { diff --git a/src/app/store/notification-holder.service.ts b/src/app/store/notification-holder.service.ts index e72e7865b..ca46d96f2 100644 --- a/src/app/store/notification-holder.service.ts +++ b/src/app/store/notification-holder.service.ts @@ -94,7 +94,7 @@ export class NotificationHolderService { FolderId: element.FolderId || element.data.folderId, IdObject: element.IdObject || element.data.idObject, Location: element.Location, - Object: element.Object || element.data.service, + Object: element.Object || element.data.object, Role: element.Role, Service: element.Service || element.data.service, Status: element.Status, @@ -144,7 +144,7 @@ export class NotificationHolderService { title: element.title, Service: element.data.Service || element.data.service, Object: element.data.Object || element.data.object, - IdObject: element.data.IdObject || element.data.odObject, + IdObject: element.data.IdObject || element.data.idObject, FolderId: element.data.FolderId || element.data.folderId, body: element.body, dateInit: this.getFormatedTime(element.data.dateInit), diff --git a/version/git-version.ts b/version/git-version.ts index fa93694b0..d36919c2f 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "93476dc5c", - "SHA": "93476dc5c494511533d5ae327a3b026399581e9b", + "shortSHA": "76ff62d42", + "SHA": "76ff62d4287fd56a7bfe5e837cc0d63d8fe3679d", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Mon Jun 24 15:35:16 2024 +0100'", - "lastCommitMessage": "ITOTEAM-597 remove atendess from list", - "lastCommitNumber": "5840", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 3 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/pages/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/pages/agenda/new-event/new-event.page.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/agenda/new-event/new-event.page.ts\n\nChanges not staged for commit:\n (use \"git add ...\" to update what will be committed)\n (use \"git restore ...\" to discard changes in working directory)\n\tmodified: src/app/services/notification/notification-holder.service.ts\n\tmodified: version/git-version.ts", + "lastCommitTime": "'Mon Jun 24 16:08:20 2024 +0100'", + "lastCommitMessage": "ITOTEAM-594 Implementar o endpoint de listagem do tipo de agenda", + "lastCommitNumber": "5841", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 4 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/home/home.page.ts\n\tmodified: src/app/interceptors/metter.interceptor.ts\n\tmodified: src/app/modals/profile/profile.page.ts\n\tmodified: src/app/modals/view-document/view-document.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agendaDataModels.ts\n\tmodified: src/app/services/agenda/list-box.service.ts\n\tmodified: src/app/services/monitoring/opentelemetry/matrix.ts\n\tmodified: src/app/services/monitoring/opentelemetry/tracer.ts\n\tmodified: src/app/services/notification/notifications.service.ts\n\tmodified: src/app/services/notifications.service.ts\n\tmodified: src/app/services/toast.service.ts\n\tmodified: src/app/shared/agenda/view-event/view-event.page.ts\n\tmodified: src/app/store/notification-holder.service.ts\n\tmodified: version/git-version.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file From 02891dbb9a9d1123f7cd0ca2414fd6014599aec1 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Wed, 26 Jun 2024 10:11:02 +0100 Subject: [PATCH 6/8] ITOTEAM-530 Inform the user how many days are left until the end of the wind for each selected day --- gabinete-digital-fo.code-workspace | 3 + package-lock.json | 152 ++++++++++-------- package.json | 1 + src/app/home/home.page.ts | 4 +- src/app/pages/agenda/agenda.page.html | 10 +- src/app/pages/search/search.page.html | 2 +- src/app/pages/search/search.page.scss | 2 +- src/app/services/agenda/list-box.service.ts | 28 +++- .../services/logger/log4js/logging.service.ts | 46 ++++++ .../capture-log/capture-log.service.ts | 11 +- .../monitoring/capture-log/worker.worker.ts | 32 ++-- .../monitoring/opentelemetry/matrix.ts | 3 +- .../monitoring/opentelemetry/tracer.ts | 2 +- .../agenda/edit-event/edit-event.page.ts | 6 +- .../agenda/view-event/view-event.page.html | 3 + .../agenda/view-event/view-event.page.ts | 41 ++++- src/app/store/calendar.service.ts | 6 +- version/git-version.ts | 12 +- 18 files changed, 246 insertions(+), 118 deletions(-) create mode 100644 src/app/services/logger/log4js/logging.service.ts diff --git a/gabinete-digital-fo.code-workspace b/gabinete-digital-fo.code-workspace index 9ea28d270..ef69354cc 100644 --- a/gabinete-digital-fo.code-workspace +++ b/gabinete-digital-fo.code-workspace @@ -11,6 +11,9 @@ }, { "path": "../../../Downloads/opentelemetry-js-main/opentelemetry-js-main" + }, + { + "path": "../grayLog" } ], "settings": { diff --git a/package-lock.json b/package-lock.json index d30077b9d..4855cc62a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -163,6 +163,7 @@ "ionicons": "^5.5.3", "jest-puppeteer": "^7.0.1", "lite-server": "^2.6.1", + "log4js": "^6.9.1", "minisearch": "^6.0.1", "moment": "^2.29.3", "neverthrow": "^6.1.0", @@ -14522,10 +14523,9 @@ } }, "node_modules/date-format": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.11.tgz", - "integrity": "sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw==", - "dev": true, + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "engines": { "node": ">=4.0" } @@ -17063,10 +17063,9 @@ } }, "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/flatten": { "version": "1.0.3", @@ -26587,16 +26586,15 @@ } }, "node_modules/log4js": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.5.2.tgz", - "integrity": "sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A==", - "dev": true, + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dependencies": { - "date-format": "^4.0.10", + "date-format": "^4.0.14", "debug": "^4.3.4", - "flatted": "^3.2.5", + "flatted": "^3.2.7", "rfdc": "^1.3.0", - "streamroller": "^3.1.1" + "streamroller": "^3.1.5" }, "engines": { "node": ">=8.0" @@ -26606,7 +26604,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -33376,8 +33373,7 @@ "node_modules/rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "node_modules/right-align": { "version": "0.1.3", @@ -35535,24 +35531,22 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/streamroller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.1.tgz", - "integrity": "sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ==", - "dev": true, + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dependencies": { - "date-format": "^4.0.10", + "date-format": "^4.0.14", "debug": "^4.3.4", - "fs-extra": "^10.1.0" + "fs-extra": "^8.1.0" }, "engines": { "node": ">=8.0" } }, "node_modules/streamroller/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -35566,17 +35560,32 @@ } }, "node_modules/streamroller/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" } }, "node_modules/string_decoder": { @@ -55162,10 +55171,9 @@ "integrity": "sha512-6ujwvwgPID6zbI0o7UbURi2vlLDR9uP26+tW6Lg+Ji3w7dd0i3DOcjcClLjLPranT60SSEFBwdSyYwn/ZkPIuw==" }, "date-format": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.11.tgz", - "integrity": "sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw==", - "dev": true + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==" }, "dayjs": { "version": "1.11.8", @@ -57117,10 +57125,9 @@ } }, "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "flatten": { "version": "1.0.3", @@ -64567,23 +64574,21 @@ } }, "log4js": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.5.2.tgz", - "integrity": "sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A==", - "dev": true, + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "requires": { - "date-format": "^4.0.10", + "date-format": "^4.0.14", "debug": "^4.3.4", - "flatted": "^3.2.5", + "flatted": "^3.2.7", "rfdc": "^1.3.0", - "streamroller": "^3.1.1" + "streamroller": "^3.1.5" }, "dependencies": { "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -69731,8 +69736,7 @@ "rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "right-align": { "version": "0.1.3", @@ -71425,35 +71429,45 @@ } }, "streamroller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.1.tgz", - "integrity": "sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ==", - "dev": true, + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "requires": { - "date-format": "^4.0.10", + "date-format": "^4.0.14", "debug": "^4.3.4", - "fs-extra": "^10.1.0" + "fs-extra": "^8.1.0" }, "dependencies": { "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "requires": { "ms": "2.1.2" } }, "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "requires": { "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" } } }, diff --git a/package.json b/package.json index 74a414585..97b4363f7 100644 --- a/package.json +++ b/package.json @@ -179,6 +179,7 @@ "ionicons": "^5.5.3", "jest-puppeteer": "^7.0.1", "lite-server": "^2.6.1", + "log4js": "^6.9.1", "minisearch": "^6.0.1", "moment": "^2.29.3", "neverthrow": "^6.1.0", diff --git a/src/app/home/home.page.ts b/src/app/home/home.page.ts index 441a20b5b..b58972a82 100644 --- a/src/app/home/home.page.ts +++ b/src/app/home/home.page.ts @@ -17,6 +17,7 @@ import { RoleIdService } from 'src/app/services/role-id.service'; import { ActiveTabService } from 'src/app/services/active-tab.service'; import { Device } from '@capacitor/device'; import { RouteService } from 'src/app/services/route.service'; +// import { LoggingService } from 'src/app/services/logger/log4js/logging.service'; import { CaptureLogService } from 'src/app/services/monitoring/capture-log/capture-log.service'; import { NetworkServiceService, ConnectionStatus } from 'src/app/services/network-service.service'; import { UserSession } from '../models/user.model'; @@ -104,7 +105,8 @@ export class HomePage implements OnInit { private RoleIdService: RoleIdService, private zone: NgZone, public alertController: AlertController, - public CaptureLogService: CaptureLogService + public CaptureLogService: CaptureLogService, + // private LoggingService: LoggingService // private ChunkService: ChunkService, // private StreamService: StreamService diff --git a/src/app/pages/agenda/agenda.page.html b/src/app/pages/agenda/agenda.page.html index d1a69212f..2bf4cf8f5 100644 --- a/src/app/pages/agenda/agenda.page.html +++ b/src/app/pages/agenda/agenda.page.html @@ -236,13 +236,10 @@

- -
- {{ day.daysInfo.dayName }}
{{month.monthInfo.monthName}}
@@ -250,7 +247,8 @@
-
+
+
Início
Fim
@@ -261,7 +259,7 @@
o dia
-
+
Todo
o dia
@@ -278,7 +276,7 @@

{{event.event.Subject}}

-
{{event.event.Location}}
+
{{event.event.Location}} {{ event.daysLeft }} 24h
{{SessionStore.user.FullName}}
{{eventService.getCalendarOwnNameByCalendarId(event.event.CalendarId)}}
diff --git a/src/app/pages/search/search.page.html b/src/app/pages/search/search.page.html index d6b4a887b..fa18aa703 100644 --- a/src/app/pages/search/search.page.html +++ b/src/app/pages/search/search.page.html @@ -310,7 +310,7 @@
- + {{ searchDocument.entity }} {{ formateIsoDate(searchDocument.dateEntry || searchDocument.Data) }}
diff --git a/src/app/pages/search/search.page.scss b/src/app/pages/search/search.page.scss index 0925f9efe..f15046abd 100644 --- a/src/app/pages/search/search.page.scss +++ b/src/app/pages/search/search.page.scss @@ -185,7 +185,7 @@ ion-slide { margin-left: 10px; .result-name { margin: 0px; - width: 100%; + // width: 100%; font-family: Roboto; font-size: rem(15); color: var(--title-text-color); diff --git a/src/app/services/agenda/list-box.service.ts b/src/app/services/agenda/list-box.service.ts index 30ee3cf96..16791d8f1 100644 --- a/src/app/services/agenda/list-box.service.ts +++ b/src/app/services/agenda/list-box.service.ts @@ -37,6 +37,7 @@ export class ListBoxService { daysBetween(){ } + list(eventSource: EventListStore[], profile: 'md' | 'pr' | 'all', rangeStartDate, randEndDate, {segment = 'Combinado', selectedDate= null}): Year[] { // // filter range @@ -306,6 +307,9 @@ export class ListBoxService { } transForm(event: CustomCalendarEvent, {startMany, endMany, middle}) { + + let daysLeft = this.daysToEndWithJS(event.start, event.end); + return Object.assign({}, { start: event.start, end: event.end, @@ -318,8 +322,10 @@ export class ListBoxService { Location: event.event.Location, EventId: event.event.EventId, CalendarName: event.event.CalendarName, - CalendarId: event.event.CalendarId + CalendarId: event.event.CalendarId, + daysLeft }, + daysLeft, Subject: event.event.Subject, startMany: startMany, endMany: endMany, @@ -329,6 +335,26 @@ export class ListBoxService { + + 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 + + } + + transformObjectKeyOrder(originalObject, keyOrder) { const transformedObject = {}; diff --git a/src/app/services/logger/log4js/logging.service.ts b/src/app/services/logger/log4js/logging.service.ts new file mode 100644 index 000000000..22a6066cb --- /dev/null +++ b/src/app/services/logger/log4js/logging.service.ts @@ -0,0 +1,46 @@ +// import { Injectable } from '@angular/core'; +// import * as log4js from 'log4js'; + +// @Injectable({ +// providedIn: 'root' +// }) +// export class LoggingService { +// private logger; + +// constructor() { +// log4js.configure({ +// appenders: { +// graylog: { +// type: '@log4js-node/gelf', +// host: 'localhost', // Replace with your Graylog server hostname or IP +// port: 1514, // GELF TCP port configured in Graylog Docker Compose +// hostname: 'angular-app', // Optional: Name of your application or hostname +// facility: 'angular-app', // Optional: Facility for categorizing logs +// customFields: { // Optional: Additional fields you want to include +// app: 'AngularApp', +// env: 'development' +// } +// } +// }, +// categories: { +// default: { appenders: ['graylog'], level: 'debug' } +// } +// }); + +// this.logger = log4js.getLogger(); + +// this.log("teste-123s") +// } + +// log(message: string) { +// this.logger.info(message); +// } + +// error(message: string) { +// this.logger.error(message); +// } + +// debug(message: string) { +// this.logger.debug(message); +// } +// } diff --git a/src/app/services/monitoring/capture-log/capture-log.service.ts b/src/app/services/monitoring/capture-log/capture-log.service.ts index 41360a00f..afd4a1080 100644 --- a/src/app/services/monitoring/capture-log/capture-log.service.ts +++ b/src/app/services/monitoring/capture-log/capture-log.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { Device } from '@capacitor/device'; -import { SocketLog } from './worker.worker'; +// import { SocketLog } from './worker.worker'; import { FCM } from '@capacitor-community/fcm'; import { ActionPerformed, PushNotificationSchema, PushNotifications, Token, } from '@capacitor/push-notifications'; import { AlertController, Platform } from '@ionic/angular'; @@ -14,7 +14,7 @@ export class CaptureLogService { deviceName = '' constructor( - public socket: SocketLog, + // public socket: SocketLog, private platform: Platform, private afMessaging: AngularFireMessaging, ) { @@ -25,6 +25,13 @@ export class CaptureLogService { this.deviceName = e.name }); + // Create a new + const worker = new Worker(new URL('./worker.worker', import.meta.url)); + worker.onmessage = ({ data }) => { + console.log(`page got message: ${data}`); + }; + worker.postMessage('hello'); + } setToken() { diff --git a/src/app/services/monitoring/capture-log/worker.worker.ts b/src/app/services/monitoring/capture-log/worker.worker.ts index c46e88887..f587c10ab 100644 --- a/src/app/services/monitoring/capture-log/worker.worker.ts +++ b/src/app/services/monitoring/capture-log/worker.worker.ts @@ -1,13 +1,4 @@ -// src/app/worker.worker.ts -// addEventListener('message', ({ data }) => { -// const response = `Worker response to ${data}`; -// postMessage(response); -// }); - - - - -import { Injectable } from '@angular/core'; +/// import { Observable, Subject, BehaviorSubject } from 'rxjs'; import { webSocket, WebSocketSubject } from 'rxjs/webSocket'; import { catchError, retryWhen, tap, delay } from 'rxjs/operators'; @@ -17,15 +8,7 @@ interface WebSocketMessage { payload: any; } -interface WebSocketError { - type: string; - error: any; -} - -@Injectable({ - providedIn: 'root' -}) -export class SocketLog { +class SocketLog { private socket$: WebSocketSubject; private messageSubject$: Subject; private connectionStatus$: BehaviorSubject; @@ -36,6 +19,8 @@ export class SocketLog { this.messageSubject$ = new Subject(); this.connectionStatus$ = new BehaviorSubject(false); this.setupVisibilityChangeHandler(); + // this.connect('https://5-180-182-151.cloud-xip.com:85/ws/') + //console.log('connect1') } public connect(url: string) { @@ -61,12 +46,14 @@ export class SocketLog { this.messageSubject$.next(message); this.connectionStatus$.next(true); this.reconnectAttempts = 0; + + // console.log({message}) }, (err) => { - console.error('WebSocket connection error:', err); + // console.error('WebSocket connection error:', err); }, () => { - console.log('WebSocket connection closed'); + // console.log('WebSocket connection closed'); this.connectionStatus$.next(false); } ); @@ -150,3 +137,6 @@ export class SocketLog { ); } } + + +let _ = new SocketLog() diff --git a/src/app/services/monitoring/opentelemetry/matrix.ts b/src/app/services/monitoring/opentelemetry/matrix.ts index 3d1f0964e..ad038fd5f 100644 --- a/src/app/services/monitoring/opentelemetry/matrix.ts +++ b/src/app/services/monitoring/opentelemetry/matrix.ts @@ -7,7 +7,7 @@ import { environment } from 'src/environments/environment'; const meterProvider = new MeterProvider(); metrics.setGlobalMeterProvider(meterProvider); -if (window.location.protocol !== 'https:' && environment.presidential == false) { +if (window.location.protocol !== 'https:' && environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { const metricReader = new PeriodicExportingMetricReader({ exporter: new OTLPMetricExporter({ url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics', @@ -20,7 +20,6 @@ if (window.location.protocol !== 'https:' && environment.presidential == false) meterProvider.addMetricReader(metricReader); } - export const meter = meterProvider.getMeter('example-exporter-collector'); export const RequestCounter = meter.createCounter('post_requests', { description: 'Example of a Counter', diff --git a/src/app/services/monitoring/opentelemetry/tracer.ts b/src/app/services/monitoring/opentelemetry/tracer.ts index ed5dfaa83..bcab1cd38 100644 --- a/src/app/services/monitoring/opentelemetry/tracer.ts +++ b/src/app/services/monitoring/opentelemetry/tracer.ts @@ -64,7 +64,7 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp return data.tags[key] }, finish: () => { - if(environment.presidential == false) { + if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { span.end(); UseCaseCounter.add(1, {user: SessionStore?.user?.FullName, outcome:data.tags['outcome'], usecase: name}) } diff --git a/src/app/shared/agenda/edit-event/edit-event.page.ts b/src/app/shared/agenda/edit-event/edit-event.page.ts index 10cb6e355..353e744c0 100644 --- a/src/app/shared/agenda/edit-event/edit-event.page.ts +++ b/src/app/shared/agenda/edit-event/edit-event.page.ts @@ -97,13 +97,13 @@ export class EditEventPage implements OnInit { SessionStore= SessionStore CalendarNameOwnerName = '' - CalendarNamesOptions = [] allDayCheck: boolean = false; addedAttachmentsList = []; sharedCalendar: Observable hasChangeCalendar = false selectedUserCalendar:any; + CalendarNamesOptions = ['Oficial', 'Pessoal'] constructor( private modalController: ModalController, @@ -133,10 +133,10 @@ export class EditEventPage implements OnInit { } ngOnInit() { - console.log('this.postEvent', this.postEvent) + this.selectedUserCalendar = this.postEvent.owner.wxUserId this.loadedEventAttachments = this.postEvent.Attachments - console.log(this.postEvent.Category) + this._postEvent = this.postEvent this._postEvent.Category = this.setEventType(this._postEvent.Category) if (!this._postEvent.IsRecurring) { diff --git a/src/app/shared/agenda/view-event/view-event.page.html b/src/app/shared/agenda/view-event/view-event.page.html index e33a38df1..4d3b66a41 100644 --- a/src/app/shared/agenda/view-event/view-event.page.html +++ b/src/app/shared/agenda/view-event/view-event.page.html @@ -90,6 +90,9 @@ (Não se repete)

+
diff --git a/src/app/shared/agenda/view-event/view-event.page.ts b/src/app/shared/agenda/view-event/view-event.page.ts index 5edde04a4..4def1737e 100644 --- a/src/app/shared/agenda/view-event/view-event.page.ts +++ b/src/app/shared/agenda/view-event/view-event.page.ts @@ -57,6 +57,7 @@ export class ViewEventPage implements OnInit { sesseionStora = SessionStore TimeZoneString = '' + daysToEnd = 0 constructor( public eventsService: EventsService, @@ -79,9 +80,35 @@ export class ViewEventPage implements OnInit { this.eventBody = { BodyType : "1", Text : ""}; this.loadedEvent.Body = this.eventBody; - console.log() } + + 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(); @@ -137,11 +164,23 @@ export class ViewEventPage implements OnInit { 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 { diff --git a/src/app/store/calendar.service.ts b/src/app/store/calendar.service.ts index 5689921ad..a66a144db 100644 --- a/src/app/store/calendar.service.ts +++ b/src/app/store/calendar.service.ts @@ -53,9 +53,9 @@ export class CalendarService { removeRangeForCalendar(rangeStartDate, rangeEndDate, profile, calendarId) { - this._eventSource = this._eventSource.filter((e)=> { - if(new Date(rangeStartDate).getTime() <= new Date(e.startTime).getTime() && - new Date(rangeEndDate).getTime() >= new Date(e.endTime).getTime() && e.CalendarId == calendarId) { + this._eventSource = this._eventSource.filter((e) => { + if( new Date(e.endTime).getTime() >= new Date(rangeStartDate).getTime() && + new Date(rangeEndDate).getTime() >= new Date(e.startTime).getTime() && e.CalendarId == calendarId) { return false } return true diff --git a/version/git-version.ts b/version/git-version.ts index d36919c2f..a3d18be96 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "76ff62d42", - "SHA": "76ff62d4287fd56a7bfe5e837cc0d63d8fe3679d", + "shortSHA": "fbaf0afcf", + "SHA": "fbaf0afcf137adaf815d2013e6c1d6f87561cf95", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Mon Jun 24 16:08:20 2024 +0100'", - "lastCommitMessage": "ITOTEAM-594 Implementar o endpoint de listagem do tipo de agenda", - "lastCommitNumber": "5841", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 4 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/home/home.page.ts\n\tmodified: src/app/interceptors/metter.interceptor.ts\n\tmodified: src/app/modals/profile/profile.page.ts\n\tmodified: src/app/modals/view-document/view-document.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agendaDataModels.ts\n\tmodified: src/app/services/agenda/list-box.service.ts\n\tmodified: src/app/services/monitoring/opentelemetry/matrix.ts\n\tmodified: src/app/services/monitoring/opentelemetry/tracer.ts\n\tmodified: src/app/services/notification/notifications.service.ts\n\tmodified: src/app/services/notifications.service.ts\n\tmodified: src/app/services/toast.service.ts\n\tmodified: src/app/shared/agenda/view-event/view-event.page.ts\n\tmodified: src/app/store/notification-holder.service.ts\n\tmodified: version/git-version.ts", + "lastCommitTime": "'Tue Jun 25 12:11:44 2024 +0100'", + "lastCommitMessage": "ITOTEAM-523 A app não redireciona as notificações", + "lastCommitNumber": "5842", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 5 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: gabinete-digital-fo.code-workspace\n\tmodified: package-lock.json\n\tmodified: package.json\n\tmodified: src/app/home/home.page.ts\n\tmodified: src/app/pages/agenda/agenda.page.html\n\tmodified: src/app/pages/search/search.page.html\n\tmodified: src/app/pages/search/search.page.scss\n\tmodified: src/app/services/agenda/list-box.service.ts\n\tnew file: src/app/services/logger/log4js/logging.service.ts\n\tmodified: src/app/services/monitoring/capture-log/capture-log.service.ts\n\tmodified: src/app/services/monitoring/capture-log/worker.worker.ts\n\tmodified: src/app/services/monitoring/opentelemetry/matrix.ts\n\tmodified: src/app/services/monitoring/opentelemetry/tracer.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/agenda/view-event/view-event.page.html\n\tmodified: src/app/shared/agenda/view-event/view-event.page.ts\n\tmodified: src/app/store/calendar.service.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file From 78c13d1bfb0b5e24a79a101990ba73e50e831107 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Wed, 26 Jun 2024 13:45:25 +0100 Subject: [PATCH 7/8] ITOTEAM-609 search event> --- src/app/models/entiry/agenda/eventList.ts | 5 +- src/app/models/search-document.ts | 4 +- src/app/pages/search/search.page.html | 16 ++- src/app/pages/search/search.page.ts | 115 ++++++++++-------- .../Agenda/agenda-data-repository.service.ts | 11 +- .../Repositorys/Agenda/agenda-data.service.ts | 6 +- .../Agenda/mapper/EventListMapper.ts | 9 +- .../Agenda/mapper/EventSearchMapper.ts | 37 ++++++ .../Agenda/mapper/eventToApproveListMapper.ts | 2 - .../Agenda/model/eventListDTOOutput.ts | 3 +- .../Agenda/model/eventSearchOutputDTO.ts | 12 ++ src/app/services/http.service.ts | 20 ++- version/git-version.ts | 12 +- 13 files changed, 174 insertions(+), 78 deletions(-) create mode 100644 src/app/services/Repositorys/Agenda/mapper/EventSearchMapper.ts create mode 100644 src/app/services/Repositorys/Agenda/model/eventSearchOutputDTO.ts diff --git a/src/app/models/entiry/agenda/eventList.ts b/src/app/models/entiry/agenda/eventList.ts index 3d51afd89..50e72c6d6 100644 --- a/src/app/models/entiry/agenda/eventList.ts +++ b/src/app/models/entiry/agenda/eventList.ts @@ -4,7 +4,7 @@ import { z } from 'zod'; const eventListSchema = z.array(z.object({ HasAttachments: z.boolean(), IsAllDayEvent: z.boolean(), - EventId: z.string(), + EventId: z.any(), Subject: z.string(), Location: z.string().nullable(), CalendarId: z.string(), @@ -16,7 +16,8 @@ const eventListSchema = z.array(z.object({ OptionalAttendees: z.string().nullable(), HumanDate: z.string(), TimeZone: z.string(), - IsPrivate: z.boolean() + IsPrivate: z.boolean(), + createdAt: z.string() })); export type EventList = z.infer diff --git a/src/app/models/search-document.ts b/src/app/models/search-document.ts index 9efbc437d..0d7c4e76a 100644 --- a/src/app/models/search-document.ts +++ b/src/app/models/search-document.ts @@ -2,9 +2,7 @@ export class SearchList { ApplicationType: number | string; Assunto: string; Data: string; - DocTypeDesc: string; - EntidadeOrganicaId: number; - EntidadeOrganicaNome: string; + DocTypeDesc?: 'Acções' | 'Publicações'; Id: string; appName?: string; ApplicationName: string; diff --git a/src/app/pages/search/search.page.html b/src/app/pages/search/search.page.html index fa18aa703..3d477eceb 100644 --- a/src/app/pages/search/search.page.html +++ b/src/app/pages/search/search.page.html @@ -303,18 +303,22 @@ - Correspondencia - AccoesPresidenciais - ArquivoDespachoElect + Correspondencia + AccoesPresidenciais + ArquivoDespachoElect
- {{ searchDocument.entity }} + {{ searchDocument.entity || searchDocument.EntidadeOrganicaNome }} {{ formateIsoDate(searchDocument.dateEntry || searchDocument.Data) }}
-
Ver
+
+ +
@@ -323,7 +327,7 @@ -
+
{{pageNumber + "/" + totalPage}}
diff --git a/src/app/pages/search/search.page.ts b/src/app/pages/search/search.page.ts index fa2cf30b5..505ea4a0f 100644 --- a/src/app/pages/search/search.page.ts +++ b/src/app/pages/search/search.page.ts @@ -20,6 +20,9 @@ import { momentG } from 'src/plugin/momentG'; import { Cy } from 'cypress/enum' import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; import { SessionStore } from 'src/app/store/session.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { isHttpError } from 'src/app/services/http.service'; +import { ToastService } from 'src/app/services/toast.service'; const CUSTOM_DATE_FORMATS: NgxMatDateFormats = { parse: { @@ -114,7 +117,9 @@ export class SearchPage implements OnInit { public ThemeService: ThemeService, private router: Router, private httpErrorhandle: HttpErrorHandle, - private agendaDataRepository: AgendaDataRepositoryService) { + private agendaDataRepository: AgendaDataRepositoryService, + private toastService: ToastService, + ) { this.ordinance = "recent"; this.currentPath = window.location.pathname; @@ -168,7 +173,7 @@ export class SearchPage implements OnInit { console.log('doc item',item) const ApplicationType = item.applicationId.toString() - const Id = item.docId + const Id = item.docId if (ApplicationType == '8') { @@ -363,7 +368,8 @@ export class SearchPage implements OnInit { /** * @description Basic search */ - basicSearch() { + @XTracerAsync({name:'search/basicSearch', bugPrint: true}) + async basicSearch(tracing?: TracingType) { let searchDocumentDate let searchDocumentDateEnd; @@ -386,70 +392,81 @@ export class SearchPage implements OnInit { if (this.searchSubject.trim() == "" && searchDocumentDate == null && searchDocumentDateEnd == null && this.searchSenderId == null && this.searchOrganicEntiryCode == null && this.searchDocTypeId == null) { - this.searchResult = "Campo de pesquisa esta vazio, entre com assunto que deseja pesquisa"; + this.searchResult = "Campo de pesquisa está vazio, entre com assunto que deseja pesquisa"; console.log('enter text'); } else { - /* this.showLoader = true; - this.agendaDataRepository.getDocumentAttachments(361, SessionStore.user.UserId, this.searchSubject, this.pageNumber, this.pageSize).subscribe((values) => { - this.totalPage = values.data.total / this.pageSize; - this.totalPage = Math.round(this.totalPage) - console.log(values.data.result) - this.searchDocuments = this.sortArrayISODate(values.data.result); + + const searchEvents = await this.agendaDataRepository.searchEvent({value: this.searchSubject.trim() }, tracing) + if(searchEvents.isOk()) { + + this.showDocuments = true; + this.searchDocuments = searchEvents.value + + this.searchDocuments = this.sortArrayISODate(this.searchDocuments); this.reorderList(this.ordinance); - // hide show document if (this.searchDocuments.length >= 1) { this.showDocuments = true; } else { + this.searchResult = "Registo não encontrado" this.showDocuments = false } - this.showLoader = false; this.loadWordCloud(); - }, error => { - this.showLoader = false; - // this.searchResult = "Registo não encontrado" - this.httpErrorhandle.httpStatusHandle(error) - // console.log(error) - }) - return */ - this.showLoader = true; - this.search.basicSearch(this.searchSubject, searchDocumentDate, searchDocumentDateEnd, this.searchSenderId - , this.searchOrganicEntiryCode, this.searchDocTypeId, '0').subscribe(res => { - console.log(res) + tracing.setAttribute('outcome', 'success'); + } else { - if (!res.Categories.length) { - this.searchResult = "Não encontramos o que procura"; - } + this.loadWordCloud(); + this.showDocuments = true; - res.Categories.forEach(e => { - e['Active'] = false; - }); + if(!isHttpError(searchEvents.error)) { + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.') - // bind respose - this.searchCategories = res.Categories; + } else if (isHttpError(searchEvents.error)) { + this.httpErrorhandle.httpStatusHandle(searchEvents.error) + } - this.searchDocuments = this.sortArrayISODate(res.Documents); + tracing.setAttribute('outcome', 'failed'); + console.log('create event error: ', searchEvents.error) + } - this.reorderList(this.ordinance); + // this.showLoader = true; + // this.search.basicSearch(this.searchSubject, searchDocumentDate, searchDocumentDateEnd, this.searchSenderId + // , this.searchOrganicEntiryCode, this.searchDocTypeId, '0').subscribe(res => { + // console.log(res) - // hide show document - if (this.searchDocuments.length >= 1) { - this.showDocuments = true; - } else { - this.showDocuments = false - } + // if (!res.Categories.length) { + // this.searchResult = "Não encontramos o que procura"; + // } - this.showLoader = false; - this.loadWordCloud(); + // res.Categories.forEach(e => { + // e['Active'] = false; + // }); - }, error => { - this.showLoader = false; - // this.searchResult = "Registo não encontrado" - this.httpErrorhandle.httpStatusHandle(error) - // console.log(error) - }); + // // bind respose + // this.searchCategories = res.Categories; + + // this.searchDocuments = this.sortArrayISODate(res.Documents); + + // this.reorderList(this.ordinance); + + // // hide show document + // if (this.searchDocuments.length >= 1) { + // this.showDocuments = true; + // } else { + // this.showDocuments = false + // } + + // this.showLoader = false; + // this.loadWordCloud(); + + // }, error => { + // this.showLoader = false; + // // this.searchResult = "Registo não encontrado" + // this.httpErrorhandle.httpStatusHandle(error) + // // console.log(error) + // }); } } else if (this.type == "AccoesPresidenciais & ArquivoDespachoElect" && this.eventAgenda == true) { @@ -1073,9 +1090,9 @@ export class SearchPage implements OnInit { async viewDetail(searchDocument: SearchList) { - const ApplicationType = searchDocument.ApplicationType.toString() + const ApplicationType = searchDocument?.ApplicationType?.toString() const Id = searchDocument.Id - const CalendarId = searchDocument.ApplicationName.split(':')[1] + const CalendarId = searchDocument?.ApplicationName?.split(':')[1] const DocTypeDesc = searchDocument.DocTypeDesc if (this.select == false) { diff --git a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts index a2ed0fe1b..8475a61e8 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts @@ -15,7 +15,6 @@ import { EEventFilterStatus } from './model/enums'; import { isHttpError } from '../../http.service'; import { TracingType } from '../../monitoring/opentelemetry/tracer'; import { APINODReturn } from '../../decorator/api-validate-schema.decorator'; -import { EventListDataOutputDTOSchema } from './model/eventListDTOOutput'; import { EventToApproveDataOutputDTOSchema } from './model/eventToApproveListOutputDTO'; import { EventOutputDTOSchema } from './model/eventDTOOutput'; import { SharedCalendarListDetectChanges } from './async/change/shareCalendarChangeDetector'; @@ -23,6 +22,8 @@ import { SharedCalendarListItemOutputDTO } from './model/sharedCalendarOutputDTO import { EventInputDTOSchema } from './agendaDataModels'; import { EventUpdateInputDTOSchema } from './model/eventUpdateInputDtO'; import { AttachInputDTOSchema } from './model/addAttachmentDTOInput'; +import { EventListDataOutputDTOSchema } from './model/eventListDTOOutput'; +import { EventSearchMapper } from './mapper/EventSearchMapper'; @Injectable({ providedIn: 'root' @@ -107,6 +108,14 @@ export class AgendaDataRepositoryService { } + async searchEvent(queryParameters: {value}, tracing?: TracingType) { + const result = await this.agendaDataService.searchEvent(queryParameters) + return result.map( response => { + APINODReturn(EventListDataOutputDTOSchema, response, 'get/Events', tracing) + return EventSearchMapper.toDomain(response, "calendarOwnerName", "userId") + }) + } + async EventList({ userId, startDate, endDate, status = EEventFilterStatus.Approved, category = null, type = null, calendarOwnerName = '' }, tracing?: TracingType) { try { diff --git a/src/app/services/Repositorys/Agenda/agenda-data.service.ts b/src/app/services/Repositorys/Agenda/agenda-data.service.ts index b56cd21db..ccc444f9c 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data.service.ts @@ -7,9 +7,9 @@ import { SharedCalendarListOutputDTO, SharedCalendarListOutputDTOSchema } from ' import { HttpService } from '../../http.service'; import { APIReturn } from '../../decorator/api-validate-schema.decorator'; import { TracingType } from '../../monitoring/opentelemetry/tracer'; -import { EventListOutputDTO, EventListOutputDTOSchema } from './model/eventListDTOOutput'; import { EventOutputDTO } from './model/eventDTOOutput'; import { AttendeesRemoveInputDTO } from './model/attendeeRemoveInputDTO'; +import { EventListOutputDTO } from './model/eventListDTOOutput'; @Injectable({ providedIn: 'root' @@ -74,6 +74,10 @@ export class AgendaDataService { return this.http.get(`${this.baseUrl}/Events`, { params }); } + searchEvent(queryParameter: {value}) { + return this.httpService.get(`${this.baseUrl}/Events`, queryParameter); + } + getEvent(id: string): Observable { return this.http.get(`${this.baseUrl}/Events/${id}`); } diff --git a/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts index f20c9411a..f067261e3 100644 --- a/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts @@ -1,7 +1,7 @@ import { EventList } from "src/app/models/entiry/agenda/eventList" -import { EventListOutputDTO } from "../model/eventListDTOOutput" import { EEventCategory, EEventOwnerType, EEventStatus, EEventType } from "../model/enums"; import { XTracer } from "src/app/services/monitoring/opentelemetry/tracer"; +import { EventListOutputDTO } from "../model/eventListDTOOutput"; function getTextInsideParentheses(inputString): string { var startIndex = inputString.indexOf('('); @@ -60,16 +60,17 @@ export class ListEventMapper { "EventId": e.id, "Subject": e.subject, "Location": e.location, - "CalendarId": userId, + "CalendarId": (e.owner.wxUserId) as any, "CalendarName": category, "StartDate": new Date(e.startDate) + '', "EndDate": new Date(e.endDate)+ '', - "Schedule": calendarOwnerName, + "Schedule": (e.owner.wxFullName) as any, "RequiredAttendees": null as any, "OptionalAttendees": null as any, "HumanDate": "2 semanas atrás" as any, "TimeZone": getTextInsideParentheses(new Date(e.startDate)+ ''), - "IsPrivate": false as any + "IsPrivate": false as any, + "createdAt": e.createdAt } }) } diff --git a/src/app/services/Repositorys/Agenda/mapper/EventSearchMapper.ts b/src/app/services/Repositorys/Agenda/mapper/EventSearchMapper.ts new file mode 100644 index 000000000..0727df4a8 --- /dev/null +++ b/src/app/services/Repositorys/Agenda/mapper/EventSearchMapper.ts @@ -0,0 +1,37 @@ +import { SearchList } from "src/app/models/search-document"; +import { EventListOutputDTO } from "../model/eventListDTOOutput"; + +function getTextInsideParentheses(inputString): string { + var startIndex = inputString.indexOf('('); + var endIndex = inputString.indexOf(')'); + if (startIndex !== -1 && endIndex !== -1) { + return inputString.substring(startIndex + 1, endIndex); + } else { + return null; + } +} + +export class EventSearchMapper { + // @XTracer({name:'ListEventMapper/toDomain', log: false, bugPrint: false}) + static toDomain(dto: EventListOutputDTO, calendarOwnerName: string, userId: string): SearchList[] { + + return dto.data.map((e) => { + + return { + Id: e.id as any, + subject: e.subject, + dateEntry: e.createdAt as any, + Data: e.createdAt as any, + entity: (e.owner.wxFullName), + ApplicationType: 0 as any, + Assunto: e.subject, + appName: "string", + ApplicationName: "", + docId: e.id as any, + applicationId: 0 as any + } + }) + } + + static toDTO() {} +} diff --git a/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts b/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts index 78516aeec..221d08473 100644 --- a/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts +++ b/src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts @@ -1,5 +1,3 @@ -import { EventList } from "src/app/models/entiry/agenda/eventList" -import { EventListOutputDTO } from "../model/eventListDTOOutput" import { EventToApproveListOutputDTO } from "../model/eventToApproveListOutputDTO"; import { EventToApproveList } from "src/app/models/entiry/agenda/eventToApproveList"; import { EEventCategory, EEventOwnerType, EEventStatus } from "../model/enums"; diff --git a/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts b/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts index 5a425ba23..db6ebce66 100644 --- a/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts +++ b/src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { EEventCategory, EEventOwnerType, EEventStatus, EEventType } from './enums'; +import { EEventCategory, EEventOwnerType, EEventStatus, EEventType } from '../model/enums'; const OwnerSchema = z.object({ @@ -29,6 +29,7 @@ export const EventListOutputDTOSchema = z.object({ isAllDayEvent: z.boolean(), // status: z.enum(['Approved']), // Assuming "Approved" is the only valid option based on provided data status: z.nativeEnum(EEventStatus), // Assuming "Approved" is the only valid option based on provided data + createdAt: z.string().datetime({ offset: true }), }) export const EventListDataOutputDTOSchema = z.object({ diff --git a/src/app/services/Repositorys/Agenda/model/eventSearchOutputDTO.ts b/src/app/services/Repositorys/Agenda/model/eventSearchOutputDTO.ts new file mode 100644 index 000000000..d7ebe9184 --- /dev/null +++ b/src/app/services/Repositorys/Agenda/model/eventSearchOutputDTO.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; +import { EEventOwnerType } from './enums'; + +export const EventSearchOutputDTOSchema = z.object({ + Id: z.string(), + subject: z.string(), + dateEntry: z.string(), + Data: z.string(), + entity: z.string().optional() +}).nullable(); + +export type EventSearchOutput = z.infer; diff --git a/src/app/services/http.service.ts b/src/app/services/http.service.ts index d97cb3a1f..0ae0b7175 100644 --- a/src/app/services/http.service.ts +++ b/src/app/services/http.service.ts @@ -1,7 +1,7 @@ import { HttpClient, HttpErrorResponse, HttpResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { ok, err, Result } from 'neverthrow'; - +import { HttpParams } from '@angular/common/http'; @Injectable({ providedIn: 'root' }) @@ -19,9 +19,23 @@ export class HttpService { } } - async get(url: string): Promise> { + async get(url: string, httpParamsObj = {} ): Promise> { try { - const result = await this.http.get(url).toPromise() + + let httpParams = new HttpParams(); + + // Convert params object to HttpParams + if (httpParamsObj) { + Object.keys(httpParamsObj).forEach(key => { + httpParams = httpParams.set(key, httpParamsObj[key]); + }) + } + + let opts = { + params : httpParams + } + const result = await this.http.get(url, opts).toPromise() + return ok (result as T) } catch (e) { return err(e as HttpErrorResponse) diff --git a/version/git-version.ts b/version/git-version.ts index a3d18be96..651741ac3 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "fbaf0afcf", - "SHA": "fbaf0afcf137adaf815d2013e6c1d6f87561cf95", + "shortSHA": "02891dbb9", + "SHA": "02891dbb9a9d1123f7cd0ca2414fd6014599aec1", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Tue Jun 25 12:11:44 2024 +0100'", - "lastCommitMessage": "ITOTEAM-523 A app não redireciona as notificações", - "lastCommitNumber": "5842", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 5 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: gabinete-digital-fo.code-workspace\n\tmodified: package-lock.json\n\tmodified: package.json\n\tmodified: src/app/home/home.page.ts\n\tmodified: src/app/pages/agenda/agenda.page.html\n\tmodified: src/app/pages/search/search.page.html\n\tmodified: src/app/pages/search/search.page.scss\n\tmodified: src/app/services/agenda/list-box.service.ts\n\tnew file: src/app/services/logger/log4js/logging.service.ts\n\tmodified: src/app/services/monitoring/capture-log/capture-log.service.ts\n\tmodified: src/app/services/monitoring/capture-log/worker.worker.ts\n\tmodified: src/app/services/monitoring/opentelemetry/matrix.ts\n\tmodified: src/app/services/monitoring/opentelemetry/tracer.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/agenda/view-event/view-event.page.html\n\tmodified: src/app/shared/agenda/view-event/view-event.page.ts\n\tmodified: src/app/store/calendar.service.ts", + "lastCommitTime": "'Wed Jun 26 10:11:02 2024 +0100'", + "lastCommitMessage": "ITOTEAM-530 Inform the user how many days are left until the end of the wind for each selected day", + "lastCommitNumber": "5843", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 6 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/models/entiry/agenda/eventList.ts\n\tmodified: src/app/models/search-document.ts\n\tmodified: src/app/pages/search/search.page.html\n\tmodified: src/app/pages/search/search.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data.service.ts\n\tmodified: src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts\n\tnew file: src/app/services/Repositorys/Agenda/mapper/EventSearchMapper.ts\n\tmodified: src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts\n\tmodified: src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts\n\tnew file: src/app/services/Repositorys/Agenda/model/eventSearchOutputDTO.ts\n\tmodified: src/app/services/http.service.ts\n\tmodified: version/git-version.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file From 11587cc944ab205b6f03aa1e1af4d43fcd92c509 Mon Sep 17 00:00:00 2001 From: Peter Maquiran Date: Thu, 27 Jun 2024 16:53:45 +0100 Subject: [PATCH 8/8] ITOTEAM-523 notification status --- src/app/modals/profile/profile.page.html | 39 +++-- src/app/modals/profile/profile.page.scss | 21 +-- src/app/modals/profile/profile.page.ts | 141 ++++++++++-------- .../async/changes/notificationListChange.ts | 37 +++++ ...firebase-push-notification.service.spec.ts | 16 ++ .../firebase-push-notification.service.ts | 80 ++++++++++ .../local-notification.service.spec.ts | 16 ++ .../datasource/local-notification.service.ts | 86 +++++++++++ .../remote-notification.service.spec.ts | 16 ++ .../datasource/remote-notification.service.ts | 29 ++++ .../data/dto/NotificationInputDTO.ts | 9 ++ .../data/dto/NotificationOutputDTO.ts | 31 ++++ .../data/infra/db/notification.db.ts | 25 ++++ .../notification-repository.service.spec.ts | 16 ++ .../data/notification-repository.service.ts | 83 +++++++++++ .../domain/mapper/notificationListMapper.ts | 21 +++ src/app/pages/agenda/agenda.page.html | 43 ++++-- src/app/pages/agenda/agenda.page.ts | 18 +++ src/app/services/agenda/list-box.service.ts | 36 ++++- src/app/services/http.service.ts | 10 ++ .../notification/notifications.service.ts | 3 + src/app/services/notifications.service.ts | 9 +- version/git-version.ts | 12 +- 23 files changed, 686 insertions(+), 111 deletions(-) create mode 100644 src/app/module/notification/data/async/changes/notificationListChange.ts create mode 100644 src/app/module/notification/data/datasource/firebase-push-notification.service.spec.ts create mode 100644 src/app/module/notification/data/datasource/firebase-push-notification.service.ts create mode 100644 src/app/module/notification/data/datasource/local-notification.service.spec.ts create mode 100644 src/app/module/notification/data/datasource/local-notification.service.ts create mode 100644 src/app/module/notification/data/datasource/remote-notification.service.spec.ts create mode 100644 src/app/module/notification/data/datasource/remote-notification.service.ts create mode 100644 src/app/module/notification/data/dto/NotificationInputDTO.ts create mode 100644 src/app/module/notification/data/dto/NotificationOutputDTO.ts create mode 100644 src/app/module/notification/data/infra/db/notification.db.ts create mode 100644 src/app/module/notification/data/notification-repository.service.spec.ts create mode 100644 src/app/module/notification/data/notification-repository.service.ts create mode 100644 src/app/module/notification/domain/mapper/notificationListMapper.ts diff --git a/src/app/modals/profile/profile.page.html b/src/app/modals/profile/profile.page.html index ea9778bcf..81b0206d2 100644 --- a/src/app/modals/profile/profile.page.html +++ b/src/app/modals/profile/profile.page.html @@ -40,7 +40,7 @@
- +
{{SessionStore.user.FullName}}
{{eventService.getCalendarOwnNameByCalendarId(event.event.CalendarId)}}
diff --git a/src/app/pages/agenda/agenda.page.ts b/src/app/pages/agenda/agenda.page.ts index 79fe7e5aa..aa870b0ec 100644 --- a/src/app/pages/agenda/agenda.page.ts +++ b/src/app/pages/agenda/agenda.page.ts @@ -1254,6 +1254,24 @@ export class AgendaPage implements OnInit { } + + diffHours(date1Str: string, date2Str: string) { + + // Convert string dates to Date objects + const date1: any = new Date(date1Str); + const date2: any = new Date(date2Str); + + date1.setHours(0, 0, 0, 0); // Set hours, minutes, seconds, and milliseconds to 0 + + // Calculate the difference in milliseconds + const timeDifferenceMs = date2 - date1; + + // Convert difference to hours + const hoursDifference = timeDifferenceMs / (1000 * 60 * 60); + + return hoursDifference + } + shoeEventDay(events: any[]) { if (this.segment == 'Combinado') { diff --git a/src/app/services/agenda/list-box.service.ts b/src/app/services/agenda/list-box.service.ts index 16791d8f1..d88e1f0f1 100644 --- a/src/app/services/agenda/list-box.service.ts +++ b/src/app/services/agenda/list-box.service.ts @@ -135,7 +135,7 @@ export class ListBoxService { if (diffDays >= 1) { - const StartEvent = this.transForm(event, {startMany: true, endMany: false, middle: false}) + const StartEvent = this.transForm(event, {startMany: true, endMany: false, middle: false, hasMany: true}) if(this.CanPush(event, selectedDate) && (new Date(event.start)).getTime() >= cloneSelectedDate.getTime()) { days[day].push(StartEvent); this.push(StartEvent, year) @@ -164,14 +164,14 @@ export class ListBoxService { startDate.getMonth() != endDate.getMonth() || startDate.getDate() != endDate.getDate())) { // last push - const EndEvent = this.transForm(cloneEvent, {startMany: false, endMany: true, middle: false}) + const EndEvent = this.transForm(cloneEvent, {startMany: false, endMany: true, middle: false, hasMany: true}) if(this.CanPush(cloneEvent, selectedDate) && cloneEvent.start.getTime() >= cloneSelectedDate.getTime()) { days[otherDays].push(EndEvent) ; this.push(EndEvent, year) } } else { - const EndEvent = this.transForm(cloneEvent, {startMany: false,endMany: true, middle: true}) + const EndEvent = this.transForm(cloneEvent, {startMany: false,endMany: false, middle: true, hasMany: true}) if(this.CanPush(cloneEvent, selectedDate) && cloneEvent.start.getTime() >= cloneSelectedDate.getTime()) { days[otherDays].push(EndEvent) ; this.push(EndEvent, year) } else { @@ -191,11 +191,11 @@ export class ListBoxService { } } else { - if(this.CanPush(event, selectedDate)) { days[day].push(event) ; this.push(event, year) } } } else { + event['sameDay'] = true if(this.CanPush(event, selectedDate) && diffDays != 2) { days[day].push(event) ; this.push(event, year) } } @@ -306,9 +306,10 @@ export class ListBoxService { return events; } - transForm(event: CustomCalendarEvent, {startMany, endMany, middle}) { + transForm(event: CustomCalendarEvent, {startMany, endMany, middle, hasMany = false}) { let daysLeft = this.daysToEndWithJS(event.start, event.end); + let eventTotalDuration = this.daysToEndWithJS(event.event.StartDate, event.event.EndDate); return Object.assign({}, { start: event.start, @@ -325,6 +326,9 @@ export class ListBoxService { CalendarId: event.event.CalendarId, daysLeft }, + eventTotalDuration, + hasMany, + duration: this.duration(event.start, event.event.EndDate), daysLeft, Subject: event.event.Subject, startMany: startMany, @@ -341,6 +345,8 @@ export class ListBoxService { const startDate: any = new Date(startDateStr); const endDate: any = new Date(endDateStr); + startDate.setHours(0, 0, 0, 0); // Set hours, minutes, seconds, and milliseconds to 0 + endDate.setHours(0, 0, 0, 0); // Set hours, minutes, seconds, and milliseconds to 0 // Calculate the difference in milliseconds between the two dates const differenceMs = Math.abs(endDate - startDate); @@ -355,6 +361,26 @@ export class ListBoxService { } + + duration(date1Str, date2Str) { + + // Convert string dates to Date objects + const date1: any = new Date(date1Str); + const date2: any = new Date(date2Str); + + // Calculate the difference in milliseconds + const timeDifferenceMs = date2 - date1; + + // Convert difference to days, hours, and minutes + const totalMinutes = Math.floor(timeDifferenceMs / (1000 * 60)); + const days = Math.floor(totalMinutes / (60 * 24)); + const hours = Math.floor((totalMinutes % (60 * 24)) / 60); + const minutes = totalMinutes % 60; + + return `${days}d` + } + + transformObjectKeyOrder(originalObject, keyOrder) { const transformedObject = {}; diff --git a/src/app/services/http.service.ts b/src/app/services/http.service.ts index 0ae0b7175..50634d4fb 100644 --- a/src/app/services/http.service.ts +++ b/src/app/services/http.service.ts @@ -62,6 +62,16 @@ export class HttpService { return err(e as HttpErrorResponse) } } + + + async patch(url: string, body ={}): Promise> { + try { + const result = await this.http.patch(url, body).toPromise(); + return ok(result as T); + } catch (e) { + return err(e as HttpErrorResponse); + } + } } diff --git a/src/app/services/notification/notifications.service.ts b/src/app/services/notification/notifications.service.ts index cad672b6c..97e86d1fe 100644 --- a/src/app/services/notification/notifications.service.ts +++ b/src/app/services/notification/notifications.service.ts @@ -6,6 +6,8 @@ import { environment } from 'src/environments/environment'; import { NotificationsEndsPointsService } from './notifications-ends-points.service' import { AngularFireMessaging } from '@angular/fire/messaging'; import { NavigationExtras, Router } from '@angular/router'; +import { NotificationRepositoryService } from 'src/app/module/notification/data/notification-repository.service' + @Injectable({ providedIn: 'root' }) @@ -20,6 +22,7 @@ export class NotificationsService { private afMessaging: AngularFireMessaging, private router: Router, private zone: NgZone, + private NotificationRepositoryService: NotificationRepositoryService ) { } diff --git a/src/app/services/notifications.service.ts b/src/app/services/notifications.service.ts index 65e828e8d..2d93f52b1 100644 --- a/src/app/services/notifications.service.ts +++ b/src/app/services/notifications.service.ts @@ -20,7 +20,7 @@ import { ChatSystemService } from './chat/chat-system.service'; import {ChatController} from 'src/app/controller/chat' import { TracingType, XTracer, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; import { z } from 'zod'; - +import { NotificationRepositoryService } from 'src/app/module/notification/data/notification-repository.service' const notificationDataSchema = z.object({ Service: z.string(), IdObject: z.string().optional(), @@ -69,10 +69,11 @@ export class NotificationsService { private zone: NgZone, private eventtrigger: EventTrigger, private afMessaging: AngularFireMessaging, - public NotificationHolderService: NotificationHolderService) { + public NotificationHolderService: NotificationHolderService, + private NotificationRepositoryService: NotificationRepositoryService) { - this.onReciveForeground(); - this.onReciveBackground(); + // this.onReciveForeground(); + // this.onReciveBackground(); } diff --git a/version/git-version.ts b/version/git-version.ts index 651741ac3..ad37c544b 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "02891dbb9", - "SHA": "02891dbb9a9d1123f7cd0ca2414fd6014599aec1", + "shortSHA": "78c13d1bf", + "SHA": "78c13d1bfb0b5e24a79a101990ba73e50e831107", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Wed Jun 26 10:11:02 2024 +0100'", - "lastCommitMessage": "ITOTEAM-530 Inform the user how many days are left until the end of the wind for each selected day", - "lastCommitNumber": "5843", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 6 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/models/entiry/agenda/eventList.ts\n\tmodified: src/app/models/search-document.ts\n\tmodified: src/app/pages/search/search.page.html\n\tmodified: src/app/pages/search/search.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data.service.ts\n\tmodified: src/app/services/Repositorys/Agenda/mapper/EventListMapper.ts\n\tnew file: src/app/services/Repositorys/Agenda/mapper/EventSearchMapper.ts\n\tmodified: src/app/services/Repositorys/Agenda/mapper/eventToApproveListMapper.ts\n\tmodified: src/app/services/Repositorys/Agenda/model/eventListDTOOutput.ts\n\tnew file: src/app/services/Repositorys/Agenda/model/eventSearchOutputDTO.ts\n\tmodified: src/app/services/http.service.ts\n\tmodified: version/git-version.ts", + "lastCommitTime": "'Wed Jun 26 13:45:25 2024 +0100'", + "lastCommitMessage": "ITOTEAM-609 search event>", + "lastCommitNumber": "5844", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 7 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/modals/profile/profile.page.html\n\tmodified: src/app/modals/profile/profile.page.scss\n\tmodified: src/app/modals/profile/profile.page.ts\n\tnew file: src/app/module/notification/data/async/changes/notificationListChange.ts\n\tnew file: src/app/module/notification/data/datasource/firebase-push-notification.service.spec.ts\n\tnew file: src/app/module/notification/data/datasource/firebase-push-notification.service.ts\n\tnew file: src/app/module/notification/data/datasource/local-notification.service.spec.ts\n\tnew file: src/app/module/notification/data/datasource/local-notification.service.ts\n\tnew file: src/app/module/notification/data/datasource/remote-notification.service.spec.ts\n\tnew file: src/app/module/notification/data/datasource/remote-notification.service.ts\n\tnew file: src/app/module/notification/data/dto/NotificationInputDTO.ts\n\tnew file: src/app/module/notification/data/dto/NotificationOutputDTO.ts\n\tnew file: src/app/module/notification/data/infra/db/notification.db.ts\n\tnew file: src/app/module/notification/data/notification-repository.service.spec.ts\n\tnew file: src/app/module/notification/data/notification-repository.service.ts\n\tnew file: src/app/module/notification/domain/mapper/notificationListMapper.ts\n\tmodified: src/app/pages/agenda/agenda.page.html\n\tmodified: src/app/pages/agenda/agenda.page.ts\n\tmodified: src/app/services/agenda/list-box.service.ts\n\tmodified: src/app/services/http.service.ts\n\tmodified: src/app/services/notification/notifications.service.ts\n\tmodified: src/app/services/notifications.service.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file