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/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 dd4a86762..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 @@ -187,7 +189,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 1796a2eb9..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,13 +13,15 @@ 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:') { 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); } } } @@ -56,4 +34,4 @@ export const metricsInterceptor = { provide: HTTP_INTERCEPTORS, useClass: MetricsInterceptor, multi: true -}; \ No newline at end of file +}; 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/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 @@
-
- -
- {{ day.daysInfo.dayName }}
{{month.monthInfo.monthName}}
@@ -250,27 +247,45 @@
-
-
Início
-
Fim
+
-
{{event.event.StartDate | date: 'HH:mm'}}
-
{{event.event.EndDate | date: 'HH:mm'}}
+
Início
+
Fim
+ +
{{event.event.StartDate | date: 'HH:mm'}}
+
{{ event.duration }}
+ +
+ + + {{event.event.EndDate | date: 'HH:mm'}} + + + {{event.event.EndDate | date: 'HH:mm'}} + +
+
{{ event.duration }}
Todo
o dia
+
+ + {{ event.duration }} + +
+
-
+
Todo
o dia
-
Todo
-
o dia
+
Todo
+
o dia
-
{{event.event.StartDate | date: 'HH:mm'}}
-
{{event.event.EndDate | date: 'HH:mm'}}
+
{{event.event.StartDate | date: 'HH:mm'}}
+
{{event.event.EndDate | date: 'HH:mm'}}
@@ -278,7 +293,15 @@

{{event.event.Subject}}

-
{{event.event.Location}}
+
+ {{event.event.Location}} + +
{{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 6a5235848..aa870b0ec 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') @@ -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/pages/agenda/edit-event/edit-event.page.ts b/src/app/pages/agenda/edit-event/edit-event.page.ts index 0f43b0509..f0ee509d0 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; @@ -425,11 +428,14 @@ 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() + + + if (this.Form.invalid) { return false } @@ -449,17 +455,37 @@ 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() 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) @@ -604,7 +630,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) @@ -672,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/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/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/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/pages/search/search.page.html b/src/app/pages/search/search.page.html index d6b4a887b..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.EntidadeOrganicaNome }} {{ formateIsoDate(searchDocument.dateEntry || searchDocument.Data) }}
-
Ver
+
+ +
@@ -323,7 +327,7 @@ -
+
{{pageNumber + "/" + totalPage}}
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/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 34b49f03c..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,13 +15,15 @@ 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'; 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' @@ -106,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 { @@ -159,7 +169,6 @@ export class AgendaDataRepositoryService { } createEvent(eventData: Event, documents, calendar: TableSharedCalendar, tracing: TracingType) { - console.log('create repository 1',eventData, calendar) let eventInput = { userId: calendar.wxUserId, @@ -181,8 +190,6 @@ export class AgendaDataRepositoryService { isAllDayEvent: eventData.IsAllDayEvent, } - console.log('create repository 2',eventInput) - APINODReturn(EventInputDTOSchema, eventInput, 'post/Events', tracing) return this.agendaDataService.createEvent(eventInput) } @@ -221,16 +228,25 @@ 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) { + 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) - 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) } + APINODReturn(AttachInputDTOSchema, attachments, `POST/${id}/Attendee`, tracing) + return this.agendaDataService.addEventAttachment(id, attachments); } deleteEvent(eventId,deleteAll) { diff --git a/src/app/services/Repositorys/Agenda/agenda-data.service.ts b/src/app/services/Repositorys/Agenda/agenda-data.service.ts index cfe3674b5..ccc444f9c 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data.service.ts @@ -7,8 +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' @@ -73,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}`); } @@ -98,7 +103,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/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/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/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/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/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/addAttachmentDTOInput.ts b/src/app/services/Repositorys/Agenda/model/addAttachmentDTOInput.ts new file mode 100644 index 000000000..3e344e7ae --- /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().nullable(), + applicationId: z.any(), + })) + +}) + +export type AttachInputDTO = z.infer 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/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/Repositorys/Agenda/utils.ts b/src/app/services/Repositorys/Agenda/utils.ts index 9e6d3cca3..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, + 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/agenda/list-box.service.ts b/src/app/services/agenda/list-box.service.ts index 4d597d822..d88e1f0f1 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 @@ -131,74 +132,70 @@ 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, hasMany: true}) - 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, hasMany: true}) + 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: false, middle: true, hasMany: 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 { + event['sameDay'] = true if(this.CanPush(event, selectedDate) && diffDays != 2) { days[day].push(event) ; this.push(event, year) } } @@ -309,7 +306,11 @@ 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, end: event.end, @@ -322,8 +323,13 @@ export class ListBoxService { Location: event.event.Location, EventId: event.event.EventId, CalendarName: event.event.CalendarName, - CalendarId: event.event.CalendarId + CalendarId: event.event.CalendarId, + daysLeft }, + eventTotalDuration, + hasMany, + duration: this.duration(event.start, event.event.EndDate), + daysLeft, Subject: event.event.Subject, startMany: startMany, endMany: endMany, @@ -333,6 +339,48 @@ 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); + + 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); + + // 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 + + } + + + + 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 d97cb3a1f..50634d4fb 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) @@ -48,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/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 ba9fb58d5..ad038fd5f 100644 --- a/src/app/services/monitoring/opentelemetry/matrix.ts +++ b/src/app/services/monitoring/opentelemetry/matrix.ts @@ -1,67 +1,30 @@ -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.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', + // 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); +} +export const meter = meterProvider.getMeter('example-exporter-collector'); +export const RequestCounter = meter.createCounter('post_requests', { + description: 'Example of a Counter', +}); -// function startMetrics() { -// console.log('STARTING METRICS'); - -// 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..bcab1cd38 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.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') { + 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/notification-holder.service.ts b/src/app/services/notification/notification-holder.service.ts index 1e950eded..409e0eadd 100644 --- a/src/app/services/notification/notification-holder.service.ts +++ b/src/app/services/notification/notification-holder.service.ts @@ -36,64 +36,61 @@ 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, - body: element.notification.body, - dateInit: this.getFormatedTime(element.data.dateInit), - dateEnd: this.getFormatedTime(element.data.dateEnd), - Location: element.data.Location, - 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, - Object: element.data.Object, - IdObject: element.data.IdObject, - 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, - 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, - IdObject: element.IdObject, - Location: element.Location, - Object: element.Object, - Role: element.Role, - Service: element.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/services/notification/notifications.service.ts b/src/app/services/notification/notifications.service.ts index b4090923b..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 ) { } @@ -143,7 +146,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..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(); } @@ -288,7 +289,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/task.service.ts b/src/app/services/task.service.ts index 92879dd43..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/loadEventosParaAprovacao', bugPrint: true}) + @XTracerAsync({name:'taskService/loadEventToAprove', bugPrint: true}) async loadEventosParaAprovacao(tracing?: TracingType) { this.showLoaderNum++ console.log('PR') 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/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 878d60f41..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: { @@ -136,7 +137,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 +155,43 @@ export class EditEventToApprovePage implements OnInit { } - async getTask() { - const res: any = await this.agendaDataRepository.getEventToApproveById(this.serialNumber) - console.log('evento to apro to edit', res.value) - this.eventProcess = res.value; + @XTracerAsync({name:'edit-event-approve/getTask', bugPrint: true}) + async getTask(tracing?: TracingType) { - this.eventProcess.workflowInstanceDataFields.LastOccurrence = new Date(this.eventProcess.workflowInstanceDataFields.LastOccurrence) + 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.restoreDatepickerData() + this.eventProcess.workflowInstanceDataFields.LastOccurrence = new Date(this.eventProcess.workflowInstanceDataFields.LastOccurrence) - // 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.restoreDatepickerData() - this.InstanceId = this.eventProcess.workflowInstanceDataFields.InstanceId - this.loadedAttachments = res.value.Attachments; - console.log(this.loadedAttachments) + // description - this.setOtherData() + 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') + + } else { + tracing.setAttribute('outcome', 'failed') + tracing.bugFlag() + this.httpErroHalde.httpStatusHandle(res.error) + } - this.saveTemporaryData() } getRecurrenceTypes() { @@ -322,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 @@ -384,15 +400,35 @@ 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).subscribe((value) => { + this.agendaDataRepository.addEventAttachment(this.eventProcess.serialNumber, this.loadedAttachments, tracing).subscribe((value) => { console.log(value) }, ((error) => { this.showLoader = false @@ -420,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 537a1042c..353e744c0 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', @@ -96,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, @@ -132,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) { @@ -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,16 +451,36 @@ 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) { - this.agendaDataRepository.addEventAttachment(this._postEvent.EventId, this.loadedEventAttachments).subscribe((value) => { + if (this.addedAttachmentsList.length >= 1) { + this.agendaDataRepository.addEventAttachment(this._postEvent.EventId, this.loadedEventAttachments, tracing).subscribe((value) => { console.log(value) }, ((error) => { this.showLoader = false @@ -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, } } @@ -613,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) + } } @@ -687,13 +704,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/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/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 92b5db25b..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, @@ -78,8 +79,36 @@ export class ViewEventPage implements OnInit { this.loadedEvent = new Event(); this.eventBody = { BodyType : "1", Text : ""}; this.loadedEvent.Body = this.eventBody; + } + + daysToEndWithJS(startDateStr: any, endDateStr: any) { + // Define the start and end dates + const startDate: any = new Date(startDateStr); + const endDate: any = new Date(endDateStr); + + // Calculate the difference in milliseconds between the two dates + const differenceMs = Math.abs(endDate - startDate); + + // Convert milliseconds to days + const millisecondsPerDay = 1000 * 60 * 60 * 24; + const differenceDays = Math.ceil(differenceMs / millisecondsPerDay); + + console.log(`Number of days between the dates: ${differenceDays}`); + + return differenceDays + + } + + deferenceBetweenDays(start: any, end: any) { + start.setHours(0, 0, 0, 0); + end.setHours(0, 0, 0, 0); + const diffTime = Math.abs(end - start); + return Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + } + + ngOnInit() { this.loadEvent(); @@ -128,17 +157,30 @@ 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) 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/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..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 @@ -285,15 +285,16 @@
+

{{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 2bb93f34e..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 @@ -149,7 +146,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 +162,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 +192,10 @@ export class EditEventToApproveComponent implements OnInit { } }) + tracing.setAttribute('outcome', 'success') } else { + tracing.setAttribute('outcome', 'failed') + tracing.bugFlag() this.httpErroHalde.httpStatusHandle(res.error) } @@ -271,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 => { @@ -325,16 +332,36 @@ 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) { - 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/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/src/app/store/notification-holder.service.ts b/src/app/store/notification-holder.service.ts index 686f972f7..ca46d96f2 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.object, 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.idObject, + 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 539f95154..ad37c544b 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "0c14b9be9", - "SHA": "0c14b9be979f22b13e627b978767be4a173d9768", + "shortSHA": "78c13d1bf", + "SHA": "78c13d1bfb0b5e24a79a101990ba73e50e831107", "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": "'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