diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 9185d1665..6656a722e 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -100,6 +100,10 @@ import { environment } from 'src/environments/environment'; import { StoreModule } from '@ngrx/store'; import { calendarReducer } from './services/Repositorys/Agenda/agenda-memory-source.service'; + +import {MatMenuModule} from '@angular/material/menu'; +import {MatIconModule} from '@angular/material/icon'; + // import { ServiceWorkerModule } from '@angular/service-worker'; // import { AngularFireModule } from '@angular/fire'; // import { AngularFireMessagingModule } from '@angular/fire/messaging'; @@ -184,7 +188,10 @@ import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ // options DeplomaOptionsPageModule, CreateProcessPageModule, - ImageCropperModule + ImageCropperModule, + + MatMenuModule, + MatIconModule, ], entryComponents: [ DiplomaOptionsPage, diff --git a/src/app/home/home-routing.module.ts b/src/app/home/home-routing.module.ts index 92672a61b..988385635 100644 --- a/src/app/home/home-routing.module.ts +++ b/src/app/home/home-routing.module.ts @@ -362,7 +362,7 @@ const routes: Routes = [ }, ], - canActivate: [AuthGuard] + // canActivate: [AuthGuard] }, { @@ -376,7 +376,7 @@ const routes: Routes = [ }, ], - canActivate: [AuthGuard] + // canActivate: [AuthGuard] }, { path: 'inactivity', @@ -386,7 +386,7 @@ const routes: Routes = [ loadChildren: ()=> import('../pages/inactivity/inactivity.module').then(m => m.InactivityPageModule) }, ], - canActivate: [InactivityGuard] + // canActivate: [InactivityGuard] }, { path: 'login', @@ -396,7 +396,7 @@ const routes: Routes = [ loadChildren: ()=> import('../pages/inactivity/inactivity.module').then(m => m.InactivityPageModule) }, ], - canActivate: [InactivityGuard] + // canActivate: [InactivityGuard] }, { path: 'pin', @@ -406,7 +406,7 @@ const routes: Routes = [ loadChildren: ()=> import('../pages/inactivity/inactivity.module').then(m => m.InactivityPageModule) }, ], - canActivate: [InactivityGuard] + // canActivate: [InactivityGuard] }, diff --git a/src/app/infra/camera/adaptor.ts b/src/app/infra/camera/adaptor.ts new file mode 100644 index 000000000..f5f48b227 --- /dev/null +++ b/src/app/infra/camera/adaptor.ts @@ -0,0 +1,8 @@ +import { CameraSource } from "@capacitor/camera"; + +export interface ITakePictureParams { + width?: number, + height?: number, + quality: number, + source: CameraSource +} diff --git a/src/app/infra/camera/camera.service.ts b/src/app/infra/camera/camera.service.ts new file mode 100644 index 000000000..c73a4e32e --- /dev/null +++ b/src/app/infra/camera/camera.service.ts @@ -0,0 +1,38 @@ +import { Injectable } from '@angular/core'; +import { Camera, CameraResultType, CameraSource } from '@capacitor/camera'; +import { ITakePictureParams } from './adaptor'; +import { err, ok, Result } from 'neverthrow'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { error } from '../../services/Either/index'; + +@Injectable({ + providedIn: 'root' +}) +export class CameraService { + + constructor() { } + + + async takePicture(data: ITakePictureParams, tracing?: TracingType): Promise> { + try { + tracing?.addEvent('take picture') + const capturedImage = await Camera.getPhoto({ + ...data, + // allowEditing: true, + resultType: CameraResultType.Base64, + }); + tracing?.addEvent('end take picture') + tracing.log('image log', { + base64: capturedImage.base64String + }) + return ok(capturedImage.base64String) + } catch(error) { + tracing?.log("camera error", { + error + }) + tracing?.hasError('capture image') + return err(error) + } + + } +} diff --git a/src/app/interceptors/token.interceptors.ts b/src/app/interceptors/token.interceptors.ts index 2d8027338..fa6b6c66e 100644 --- a/src/app/interceptors/token.interceptors.ts +++ b/src/app/interceptors/token.interceptors.ts @@ -114,23 +114,23 @@ export class TokenInterceptor implements HttpInterceptor { }), catchError((error) => { console.log(error) - SessionStore.user.Authorization = SessionStore.user.Authorization; - SessionStore.user.RefreshToken = SessionStore.user.RefreshToken; - SessionStore.setInativity(false) - /* SessionStore.setUrlBeforeInactivity(this.router.url); */ + // SessionStore.user.Authorization = SessionStore.user.Authorization; + // SessionStore.user.RefreshToken = SessionStore.user.RefreshToken; + // SessionStore.setInativity(false) + // /* SessionStore.setUrlBeforeInactivity(this.router.url); */ - if (environment.production) { - window.location.pathname = '/auth' - } else { - const pathBeforeGoOut = window.location.pathname - console.log('Before auth',window.location.pathname) - this.router.navigateByUrl('/auth', { replaceUrl: true }).then(() =>{ - if(pathBeforeGoOut != "/auth") { - this.httpErrorHandle.httpsSucessMessagge('sessonExpired') - } + // if (environment.production) { + // window.location.pathname = '/auth' + // } else { + // const pathBeforeGoOut = window.location.pathname + // console.log('Before auth',window.location.pathname) + // this.router.navigateByUrl('/auth', { replaceUrl: true }).then(() =>{ + // if(pathBeforeGoOut != "/auth") { + // this.httpErrorHandle.httpsSucessMessagge('sessonExpired') + // } - }) - } + // }) + // } return of(false); }) ); diff --git a/src/app/modals/document-set-up-meeting/document-set-up-meeting.page.ts b/src/app/modals/document-set-up-meeting/document-set-up-meeting.page.ts index 5360d1e7b..d6036a2e8 100644 --- a/src/app/modals/document-set-up-meeting/document-set-up-meeting.page.ts +++ b/src/app/modals/document-set-up-meeting/document-set-up-meeting.page.ts @@ -365,7 +365,6 @@ export class DocumentSetUpMeetingPage implements OnInit { if(!isHttpError(value.error)) { this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #1') console.log(value.error) - tracing.bugFlag() } else { this.httpErroHandle.httpStatusHandle(value.error.status) } @@ -379,7 +378,6 @@ export class DocumentSetUpMeetingPage implements OnInit { tracing.setAttribute('outcome', 'failed') tracing.setAttribute('no', 'this.selectedUserCalendar') - tracing.bugFlag() } laoder.remove(); diff --git a/src/app/modals/profile/edit-profile/edit-profile.module.ts b/src/app/modals/profile/edit-profile/edit-profile.module.ts index 622248725..c905afab4 100644 --- a/src/app/modals/profile/edit-profile/edit-profile.module.ts +++ b/src/app/modals/profile/edit-profile/edit-profile.module.ts @@ -8,12 +8,26 @@ import { EditProfilePageRoutingModule } from './edit-profile-routing.module'; import { EditProfilePage } from './edit-profile.page'; + + + +import {MatMenuModule} from '@angular/material/menu'; +import {MatButtonModule} from '@angular/material/button'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; + +import {MatIconModule} from '@angular/material/icon'; + @NgModule({ imports: [ CommonModule, FormsModule, IonicModule, - EditProfilePageRoutingModule + EditProfilePageRoutingModule, + + FontAwesomeModule, + MatMenuModule, + MatButtonModule, + MatIconModule, ], declarations: [EditProfilePage] }) diff --git a/src/app/modals/profile/edit-profile/edit-profile.page.html b/src/app/modals/profile/edit-profile/edit-profile.page.html index 956ad2df7..9808fd404 100644 --- a/src/app/modals/profile/edit-profile/edit-profile.page.html +++ b/src/app/modals/profile/edit-profile/edit-profile.page.html @@ -58,39 +58,46 @@
-
+
+
+
-
- + + class="profile-pic" src="assets/images/theme/gov/icons-profile.svg"> - -
- -
- -
- - - - -
- + +
+ +
+ +
+ + +
+ +
+
+ + + +
+
diff --git a/src/app/modals/profile/edit-profile/edit-profile.page.ts b/src/app/modals/profile/edit-profile/edit-profile.page.ts index a3a46df6a..bc4aeaaf4 100644 --- a/src/app/modals/profile/edit-profile/edit-profile.page.ts +++ b/src/app/modals/profile/edit-profile/edit-profile.page.ts @@ -6,12 +6,16 @@ import { SessionStore } from 'src/app/store/session.service'; import { environment } from 'src/environments/environment'; import { BackgroundService } from 'src/app/services/background.service'; import { ThemeService } from 'src/app/services/theme.service'; -import { Camera, CameraResultType, CameraSource, Photo } from '@capacitor/camera'; -import { Filesystem, Directory } from '@capacitor/filesystem'; -import { File } from '@awesome-cordova-plugins/file/ngx'; +import { CameraSource } from '@capacitor/camera'; import { StorageService } from 'src/app/services/storage.service'; -import { AttachmentsService } from 'src/app/services/attachments.service'; - +import { CameraService } from 'src/app/infra/camera/camera.service'; +import { ToastService } from 'src/app/services/toast.service'; +import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { UserRepositoryService } from 'src/app/module/user/data/user-repository.service'; +import { isHttpError } from 'src/app/services/http.service'; +import { UserProfilePicture } from 'src/app/module/user/data/datasource/user-local-repository.service'; +import { Observable } from 'rxjs'; @Component({ selector: 'app-edit-profile', @@ -27,19 +31,28 @@ export class EditProfilePage implements OnInit { capturedImageTitle = ''; profilePicture = ""; + profilePictureSubject: Observable + camecaIcons = false + constructor(private modalController: ModalController, private animationController: AnimationController, public platform: Platform, private BackgroundService: BackgroundService, public ThemeService: ThemeService, - private file: File, private storageService: StorageService, - private attachmentService: AttachmentsService + private CameraService: CameraService, + private toastService: ToastService, + private httpErrorHandle: HttpErrorHandle, + private UserRepositoryService: UserRepositoryService - ) { } + ) { + this.profilePictureSubject = this.UserRepositoryService.getProfilePictureLive() as any + } ngOnInit() { - + setTimeout(() => { + this.camecaIcons = true + }, 100) this.getProfilpictureFromStorage(); } getProfilpictureFromStorage() { @@ -54,27 +67,7 @@ export class EditProfilePage implements OnInit { this.profilePicture = ""; }) } - /* getProfilpicture(guid) { - console.log('Get picture ', guid.path) - this.attachmentService.getUserProfilePhoto().subscribe(async (picture: any) => { - - console.log('Get picture ', picture) - this.storageService.store(this.SessionStore.user.RoleID.toString() + "guid", guid.path) - this.storageService.store(this.SessionStore.user.RoleID.toString(), picture).then((value) => { - this.profilePicture = picture - this.SessionStore.user.UserPhoto = picture; - - - console.log('picture saved') - }).catch((error) => { - console.log('picture not saved') - }); - - }, ((error) => { - console.log('Error get profile picture: ', error) - })) - - } */ + close() { this.modalController.dismiss(); @@ -171,48 +164,65 @@ export class EditProfilePage implements OnInit { this.BackgroundService.paint(); } + CameraSource = CameraSource + @XTracerAsync({name:'edit-profile/takePicture', bugPrint: true, autoFinish: false}) + async uploadPicture(source: CameraSource, tracing?: TracingType) { - async takePicture() { - const capturedImage = await Camera.getPhoto({ + const capturedImage = await this.CameraService.takePicture({ width: 250, height: 250, quality: 100, - // allowEditing: true, - resultType: CameraResultType.Base64, - source: CameraSource.Camera - }); + source: source + }, tracing) - this.capturedImage = capturedImage.base64String; - var object = JSON.stringify({ - "ImageBase64": this.capturedImage + if(capturedImage.isOk()) { + + this.capturedImage = capturedImage.value; + var object = { + "ImageBase64": this.capturedImage + } + + tracing.addEvent('serialize image') + + const guid = await this.UserRepositoryService.addUserProfilePhoto(object) + + + if(guid.isOk()) { + tracing.addEvent('upload image') + + const base = await this.UserRepositoryService.getUserProfilePhoto(guid.value, tracing) + + if(base.isOk()) { + tracing.addEvent('download image') + this.storageService.store(this.SessionStore.user.RoleID.toString(), 'data:image/jpeg;base64,'+base.value).then((value) => { + tracing.addEvent('store image in') + this.profilePicture = 'data:image/jpeg;base64,' + base.value; + + tracing.setAttribute("picture.save", "true") + tracing.finish() + }).catch((error) => { + tracing.setAttribute("picture.save", "false") + tracing.finish() + }); + } else { + if(!isHttpError(base.error)) { + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.') + } else { + this.httpErrorHandle.httpStatusHandle(base.error) + } + tracing.finish() + } + } else { + + if(!isHttpError(guid.error)) { + this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico.') + } else { + this.httpErrorHandle.httpStatusHandle(guid.error) + } + tracing.finish() + } + } - ) - console.log('ATTACHME ', object) - - this.attachmentService.addUserProfilePhoto(object).subscribe((guid) => { - console.log('GUID ', guid) - console.log(this.SessionStore.user.RoleID.toString()) - - //get user profile picture base64 - this.attachmentService.getUserProfilePhoto(guid).subscribe((base) => { - console.log('before picture saved',base) - this.storageService.store(this.SessionStore.user.RoleID.toString(), 'data:image/jpeg;base64,'+base).then((value) => { - this.profilePicture = 'data:image/jpeg;base64,' + base; - - - console.log('picture saved',value) - }).catch((error) => { - console.log('picture not saved') - }); - - },(error) => { - console.log('profile picture erro: ', error) - }) - - /* this.getProfilpicture(guid); */ - }, ((error) => { - console.log('Erro Upload profile picture ', error) - })) } @@ -268,4 +278,3 @@ export class EditProfilePage implements OnInit { } } - diff --git a/src/app/modals/profile/profile.page.html b/src/app/modals/profile/profile.page.html index a823304b6..71b1cbc25 100644 --- a/src/app/modals/profile/profile.page.html +++ b/src/app/modals/profile/profile.page.html @@ -39,7 +39,7 @@
-
+
@@ -51,9 +51,9 @@ src='assets/images/secretaria_geral.png'> -->
-
+
+ src={{calendarData.base64}}>
diff --git a/src/app/modals/profile/profile.page.ts b/src/app/modals/profile/profile.page.ts index abe076227..40a3a0e5d 100644 --- a/src/app/modals/profile/profile.page.ts +++ b/src/app/modals/profile/profile.page.ts @@ -17,6 +17,9 @@ import { NotificationRepositoryService } from 'src/app/module/notification/data/ import { Observable } from 'rxjs'; import { NotificationTable } from 'src/app/module/notification/data/infra/db/notification.db'; import { isHttpError } from 'src/app/services/http.service'; +import { UserRepositoryService } from 'src/app/module/user/data/user-repository.service'; +import { UserProfilePicture } from 'src/app/module/user/data/datasource/user-local-repository.service'; + @Component({ selector: 'app-profile', templateUrl: './profile.page.html', @@ -50,6 +53,7 @@ export class ProfilePage implements OnInit { notificationList$: Observable objectRead = {} + profilePictureSubject: Observable constructor( private modalController: ModalController, @@ -64,10 +68,11 @@ export class ProfilePage implements OnInit { private authservice: AuthService, private agendaDataRepository: AgendaDataRepositoryService, private toastService: ToastService, - private notificationRepositoryService: NotificationRepositoryService + private notificationRepositoryService: NotificationRepositoryService, + private UserRepositoryService: UserRepositoryService ) { - + this.profilePictureSubject = this.UserRepositoryService.getProfilePictureLive() as any window['e'] = () => { console.log( this.zone.run(() => this.router.navigate(['/home/chat'])) diff --git a/src/app/modals/view-event/view-event.page.ts b/src/app/modals/view-event/view-event.page.ts index 422188bd7..2ed44a338 100644 --- a/src/app/modals/view-event/view-event.page.ts +++ b/src/app/modals/view-event/view-event.page.ts @@ -137,7 +137,6 @@ export class ViewEventPage implements OnInit { } else { tracing.setAttribute('eventId', this.eventId) tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() if(!isHttpError(res.error)) { this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #13') diff --git a/src/app/module/user/data/datasource/user-local-repository.service.ts b/src/app/module/user/data/datasource/user-local-repository.service.ts new file mode 100644 index 000000000..862fe04fe --- /dev/null +++ b/src/app/module/user/data/datasource/user-local-repository.service.ts @@ -0,0 +1,52 @@ +import { Injectable } from '@angular/core'; +import { z } from 'zod'; +import { Dexie, EntityTable, liveQuery } from 'Dexie'; + +const UserProfilePicture = z.object({ + base64: z.string(), + id: z.number().optional(), +}) + +const UserTable = z.object({ + ChunksBase64: z.number(), +}); + +export type UserProfilePicture = z.infer + +// Database declaration (move this to its own module also) +const session = new Dexie('session') as Dexie & { + profilePicture: EntityTable; +}; + +session.version(1).stores({ + profilePicture: '++id, base64' +}); + +@Injectable({ + providedIn: 'root' +}) +export class UserLocalRepositoryService { + + constructor() { } + + + async addProfilePicture(data: UserProfilePicture) { + try { + await session.transaction('rw', session.profilePicture, async () => { + // Clear existing records from myTable + await session.profilePicture.clear(); + await session.profilePicture.add(data); + }); + console.log('Clear and add operations completed within transaction.'); + } catch (error) { + console.error('Error performing transaction:', error, data); + } + } + + + getLiveProfilePicture() { + return liveQuery(() => + session.profilePicture.orderBy('id').reverse().first() + ) + } +} diff --git a/src/app/module/user/data/datasource/user-memory-repository.service.ts b/src/app/module/user/data/datasource/user-memory-repository.service.ts new file mode 100644 index 000000000..ab077e3ab --- /dev/null +++ b/src/app/module/user/data/datasource/user-memory-repository.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class UserMemoryRepositoryService { + + constructor() { } +} diff --git a/src/app/module/user/data/datasource/user-remote-repository.service.ts b/src/app/module/user/data/datasource/user-remote-repository.service.ts new file mode 100644 index 000000000..66ba7f6d9 --- /dev/null +++ b/src/app/module/user/data/datasource/user-remote-repository.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import { HttpService } from 'src/app/services/http.service'; +import { environment } from 'src/environments/environment'; +import { IProfilePictureInputDTO } from '../dto/profilePictureInputDTO'; +import { HttpHeaders } from '@angular/common/http'; + +@Injectable({ + providedIn: 'root' +}) +export class UserRemoteRepositoryService { + + constructor( + private httpService: HttpService + ) { } + + getUserProfilePhoto(guid: string) { + const geturl = environment.apiURL + 'UserAuthentication/GetPhoto'; + + const params = { + UserPhoto: guid + } + + return this.httpService.get(`${geturl}`, params); + } + + addUserProfilePhoto(data: IProfilePictureInputDTO) { + const geturl = environment.apiURL + 'UserAuthentication/AddPhoto'; + + let http = new HttpHeaders(); + + http = http.set('content-type', "application/json"); + http = http.set('accept', "application/json"); + let options = { + headers: http + }; + + return this.httpService.post(`${geturl}`, data, options); + } +} diff --git a/src/app/module/user/data/dto/profilePictureInputDTO.ts b/src/app/module/user/data/dto/profilePictureInputDTO.ts new file mode 100644 index 000000000..4e34d50df --- /dev/null +++ b/src/app/module/user/data/dto/profilePictureInputDTO.ts @@ -0,0 +1,9 @@ +import { z } from "zod"; + +const profilePictureInputDTOSchema = z.object({ + ImageBase64: z.string() +}) + +// const profilePictureInputDTOSchema = z.string() + +export type IProfilePictureInputDTO = z.infer \ No newline at end of file diff --git a/src/app/module/user/data/user-repository.service.ts b/src/app/module/user/data/user-repository.service.ts new file mode 100644 index 000000000..8c46aa7f2 --- /dev/null +++ b/src/app/module/user/data/user-repository.service.ts @@ -0,0 +1,47 @@ +import { Injectable } from '@angular/core'; +import { UserRemoteRepositoryService } from './datasource/user-remote-repository.service'; +import { IProfilePictureInputDTO } from './dto/profilePictureInputDTO'; +import { UserLocalRepositoryService } from './datasource/user-local-repository.service'; +import { TracingType } from 'src/app/services/monitoring/opentelemetry/tracer'; + +@Injectable({ + providedIn: 'root' +}) +export class UserRepositoryService { + + constructor( + private remote: UserRemoteRepositoryService, + private local: UserLocalRepositoryService + ) { } + + async getUserProfilePhoto(guid: string , tracing?: TracingType) { + const result = await this.remote.getUserProfilePhoto(guid) + + if(result.isOk()) { + this.local.addProfilePicture({base64: 'data:image/jpeg;base64,' + result.value}) + } else { + tracing?.setAttribute("picture.upload", "false") + tracing?.hasError("cant upload picture") + } + + return result + } + + async addUserProfilePhoto(data: IProfilePictureInputDTO, tracing?: TracingType) { + const result = await this.remote.addUserProfilePhoto(data) + + + if(result.isOk()) { + this.local.addProfilePicture({base64: 'data:image/jpeg;base64,' + data.ImageBase64}) + } else { + tracing?.setAttribute("picture.upload", "false") + tracing?.hasError("cant upload picture") + } + + return result + } + + getProfilePictureLive() { + return this.local.getLiveProfilePicture() + } +} diff --git a/src/app/pages/agenda/agenda.page.ts b/src/app/pages/agenda/agenda.page.ts index 1dca34e32..726b1b426 100644 --- a/src/app/pages/agenda/agenda.page.ts +++ b/src/app/pages/agenda/agenda.page.ts @@ -782,7 +782,6 @@ export class AgendaPage implements OnInit { } tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() load++ if (load == (selectedCalendarIds).length) { @@ -801,7 +800,6 @@ export class AgendaPage implements OnInit { tracing.setAttribute('outcome', 'failed') tracing.setAttribute('error', 'selectedCalendar.wxUserId') this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #2') - tracing.bugFlag() } tracing.addEvent('load range end') 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 f94007be2..bd2379c78 100644 --- a/src/app/pages/agenda/view-event/view-event.page.ts +++ b/src/app/pages/agenda/view-event/view-event.page.ts @@ -177,7 +177,6 @@ export class ViewEventPage implements OnInit { tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() // this.toastService.badRequest('Este evento já não existe na sua agenda') this.RouteService.goBack(); diff --git a/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts b/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts index 6988ab6ad..aae9dfbc9 100644 --- a/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts +++ b/src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts @@ -125,13 +125,11 @@ export class ApproveEventPage implements OnInit { } tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() this.httpErrorHandle.httpStatusHandle(res.error) } else if(!isHttpError(res.error)) { tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #12') } 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 6b9c71174..76102e0a2 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 @@ -222,7 +222,7 @@ export class EventListPage implements OnInit { } else { tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() + if(!isHttpError(allEvents.error)) { this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #4') } diff --git a/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.ts b/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.ts index c9990affb..cf380f961 100644 --- a/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.ts +++ b/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.ts @@ -395,7 +395,6 @@ export class BookMeetingModalPage implements OnInit { if(!isHttpError(value.error)) { this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #1') console.log(value.error) - tracing.bugFlag() } else { this.httpErroHandle.httpStatusHandle(value.error.status) } @@ -409,7 +408,6 @@ export class BookMeetingModalPage implements OnInit { tracing.setAttribute('outcome', 'failed') tracing.setAttribute('no', 'this.selectedUserCalendar') - tracing.bugFlag() } if (this.task.FsId == '8') { diff --git a/src/app/pages/publications/new-publication/new-publication.page.html b/src/app/pages/publications/new-publication/new-publication.page.html index 0aef3ba75..e7c1b6a17 100644 --- a/src/app/pages/publications/new-publication/new-publication.page.html +++ b/src/app/pages/publications/new-publication/new-publication.page.html @@ -67,7 +67,7 @@

mais {{ PublicationFromMvService.form.Files.length - displayLimit }}

-

{{capturedImageTitle}}

+
diff --git a/src/app/pages/publications/new-publication/new-publication.page.ts b/src/app/pages/publications/new-publication/new-publication.page.ts index 5f276eb87..d261042a7 100644 --- a/src/app/pages/publications/new-publication/new-publication.page.ts +++ b/src/app/pages/publications/new-publication/new-publication.page.ts @@ -222,7 +222,7 @@ export class NewPublicationPage implements OnInit { source: CameraSource.Camera }); this.capturedImage = 'data:image/jpeg;base64,' + capturedImage.base64String; - this.capturedImageTitle = 'foto'; + this.capturedImageTitle = ''; this.showCroppModal(); } diff --git a/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.html b/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.html index 314bd3bd4..89becd74f 100644 --- a/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.html +++ b/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.html @@ -22,9 +22,9 @@
-
+
-
+
diff --git a/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.scss b/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.scss index 0c66aba97..ee2d027cf 100644 --- a/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.scss +++ b/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.scss @@ -52,7 +52,6 @@ ion-toolbar { .div-title { /* padding: 0!important; */ float: left; - margin-top: 100px; } .post-img { @@ -95,4 +94,4 @@ ion-toolbar { .font-14-rem { font-size: rem(14) !important; -} \ No newline at end of file +} diff --git a/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.ts b/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.ts index 05c2cdb45..0c16f7b1b 100644 --- a/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.ts +++ b/src/app/pages/publications/view-publications/publication-detail/publication-detail.page.ts @@ -23,6 +23,8 @@ import { PublicationHolderService } from 'src/app/services/publication/publicati }) export class PublicationDetailPage implements OnInit { @ViewChild('videoPlayer', { static: true }) videoPlayer: ElementRef; + @ViewChild('ScrollContainer', { static: true }) ScrollContainer: ElementRef; + showLoader: boolean; DocumentId: string; folderId: string; @@ -82,8 +84,6 @@ export class PublicationDetailPage implements OnInit { FileExtension: '', }; - - window['publicationEdit'] = () => { if(this.isComponentIsAlive == true) { this.getPublicationDetail() @@ -92,9 +92,10 @@ export class PublicationDetailPage implements OnInit { } - OnDestroy() { + ngOnDestroy() { this.isComponentIsAlive = false } + doRefresh(event) { this.getPublicationDetail(); diff --git a/src/app/pages/publications/view-publications/view-publications.page.html b/src/app/pages/publications/view-publications/view-publications.page.html index 82ac1c277..066a479dd 100644 --- a/src/app/pages/publications/view-publications/view-publications.page.html +++ b/src/app/pages/publications/view-publications/view-publications.page.html @@ -43,7 +43,6 @@ -
(url: string, body: any, tracing?: TracingType): Promise> { + async post(url: string, body: any, options:HTTPOptions ={}, tracing?: TracingType): Promise> { try { - const result = await this.http.post(url, body).toPromise() + const result = await this.http.post(url, body, options).toPromise() return ok (result as T) } catch (e) { return err(e as HttpErrorResponse) @@ -42,11 +48,9 @@ export class HttpService { if(isHttpError(e)) { tracing?.setAttribute('status.code', e.status.toString()) if (e.status == 400) { - tracing?.bugFlag() tracing?.setAttribute('outcome', 'failed') } } else { - tracing?.bugFlag() tracing.setAttribute('outcome', 'failed') tracing?.setAttribute('map.error', 'true') tracing?.setAttribute('map.error.context', JSON.stringify(e)) diff --git a/src/app/services/monitoring/opentelemetry/opentelemetry.ts b/src/app/services/monitoring/opentelemetry/opentelemetry.ts index 99cbbe224..fa1461e83 100644 --- a/src/app/services/monitoring/opentelemetry/opentelemetry.ts +++ b/src/app/services/monitoring/opentelemetry/opentelemetry.ts @@ -84,4 +84,4 @@ function childSpanExample(parentContext) { }, 500); } -parentSpanExample() +// parentSpanExample() diff --git a/src/app/services/monitoring/opentelemetry/tracer.ts b/src/app/services/monitoring/opentelemetry/tracer.ts index b09f863b9..cfc0bfc76 100644 --- a/src/app/services/monitoring/opentelemetry/tracer.ts +++ b/src/app/services/monitoring/opentelemetry/tracer.ts @@ -8,7 +8,9 @@ import { environment } from 'src/environments/environment'; import { UseCaseCounter } from './matrix'; import { openTelemetryLogging } from './logging'; // import { context, propagation } from '@opentelemetry/api'; - +import { + SpanStatus, SpanStatusCode +} from '@opentelemetry/api'; const tracerInstance = OpentelemetryAgendaProvider.getTracer('example-tracer-hole', '111', {}) const tracerNotificationInstance = OpentelemetryNotificationProvider.getTracer('example-tracer-hole', '111', {}) // const logger: ILoggerAdapter = new ColoredLoggerService() @@ -53,15 +55,16 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp const data = { event: {}, - tags: {} + tags: {}, + status: {} as any, } - return { + const returnObject = { span: span as any, tracer: tracerInstance, tracerId: requestId, attributes: SemanticAttributes, - setStatus: (status: any) => { + setStatus: (status: SpanStatus) => { span.setStatus(status); }, addEvent: (context: string, message?: any, obj?: any) => { @@ -79,7 +82,7 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp span.setAttribute(key, value); if(key =='outcome' && value == 'failed') { - span.setAttribute('error', 'true') + returnObject.hasError('error') } }, log(message: string, data: Object) { @@ -110,18 +113,25 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp finish: () => { 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}) + UseCaseCounter.add(1, {user: SessionStore?.user?.FullName, outcome:data.tags['outcome'] || data.status?.code , usecase: name}) } - if(bugPrint && data.tags['outcome'] == 'failed') { + if(bugPrint && (data.tags['outcome'] == 'failed' || data.status?.code == SpanStatusCode.ERROR)) { console.error(name, data) } }, - bugFlag:() => {}, + hasError:(message: string) => { + if(data.status?.code != SpanStatusCode.ERROR) { + data.status = {code: SpanStatusCode.ERROR, message} + span.setStatus({code: SpanStatusCode.ERROR, message}) + span.setAttribute('outcome','failed') + } + }, createSpan: (name, parent?: any) => { return tracerInstance.startSpan(name, { root: false }, parent) as Span; } } + return returnObject } export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, daley =0 }) { @@ -221,7 +231,7 @@ export type TracingType = { getAttribute: (key: string) => string; LocalLogEvent: (name: string, attributesOrStartTime: any, obj?:any) => void; finish: () => void; - bugFlag:() => void; + hasError:(message: string) => void; createSpan:(name, parent?: any) => Span; }; 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 0e0ef3911..21f3b8181 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 @@ -189,7 +189,6 @@ export class EditEventToApprovePage implements OnInit { } else { tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() this.httpErroHalde.httpStatusHandle(res.error) } diff --git a/src/app/shared/agenda/event-list/event-list.page.ts b/src/app/shared/agenda/event-list/event-list.page.ts index 52035beca..ee5f17874 100644 --- a/src/app/shared/agenda/event-list/event-list.page.ts +++ b/src/app/shared/agenda/event-list/event-list.page.ts @@ -160,7 +160,6 @@ export class EventListPage implements OnInit { } else { tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() if(!isHttpError(allEvents.error)) { this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #3') 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 5025a1878..ac200f3db 100644 --- a/src/app/shared/agenda/view-event/view-event.page.ts +++ b/src/app/shared/agenda/view-event/view-event.page.ts @@ -200,7 +200,6 @@ export class ViewEventPage implements OnInit { } tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() this.viewEventDetailDismiss.emit({ type: 'close' 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 64e84a360..40f59645f 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 @@ -191,7 +191,6 @@ export class EditEventToApproveComponent implements OnInit { tracing.setAttribute('outcome', 'success') } else { tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() this.httpErroHalde.httpStatusHandle(res.error) } diff --git a/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts b/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts index 1e372dfdd..832fe9e1f 100644 --- a/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts +++ b/src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts @@ -233,7 +233,6 @@ export class EventsToApprovePage implements OnInit { } else { tracing.setAttribute('outcome', 'failed') - tracing.bugFlag() if(!isHttpError(allEvents.error)) { this.toastService._badRequest('Pedimos desculpa mas não foi possível executar a acção. Por favor, contacte o apoio técnico. #4') diff --git a/src/app/shared/header/header.page.html b/src/app/shared/header/header.page.html index 903326fbf..eeaacfbc0 100644 --- a/src/app/shared/header/header.page.html +++ b/src/app/shared/header/header.page.html @@ -56,7 +56,7 @@ --> -
+
-
+
-
- image +
+ sem image -
diff --git a/src/app/shared/publication/view-publications/publication-detail/publication-detail.page.scss b/src/app/shared/publication/view-publications/publication-detail/publication-detail.page.scss index c8a77e703..5c70eb541 100644 --- a/src/app/shared/publication/view-publications/publication-detail/publication-detail.page.scss +++ b/src/app/shared/publication/view-publications/publication-detail/publication-detail.page.scss @@ -103,13 +103,7 @@ swiper-slide img { display: block; width: 100%; height: 100%; - - max-height: 1000px; - max-width: 868px; - - min-height: 350px; - min-width: 468px; - object-fit: cover; + object-fit: contain; text-align: center; display: flex; justify-content: center; @@ -121,15 +115,18 @@ swiper-slide video { width: 100%; height: 100%; - max-height: 1000px; - max-width: 868px; - - min-height: 350px; - min-width: 468px; - object-fit: cover; + object-fit: contain; text-align: center; display: flex; justify-content: center; align-items: center; } + + +swiper-slide { + margin-bottom: -100%; +} +.swiper-slide-active { + margin-bottom: 0px !important; +} diff --git a/src/app/shared/publication/view-publications/publication-detail/publication-detail.page.ts b/src/app/shared/publication/view-publications/publication-detail/publication-detail.page.ts index 8a058b020..6349a16bb 100644 --- a/src/app/shared/publication/view-publications/publication-detail/publication-detail.page.ts +++ b/src/app/shared/publication/view-publications/publication-detail/publication-detail.page.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import { Component, OnInit, Input, Output, EventEmitter, ViewChild, ElementRef } from '@angular/core'; import { ModalController } from '@ionic/angular'; import { Publication } from 'src/app/models/publication'; import { NewPublicationPage } from 'src/app/shared/publication/new-publication/new-publication.page'; @@ -29,6 +29,9 @@ export class PublicationDetailPage implements OnInit { @Output() goBackToViewPublications = new EventEmitter(); publicationPipe = new PublicationPipe() + containerMaxWidth = 0 + containerMaxHeight = 0 + constructor( private modalController: ModalController, private publications:PublicationsService, @@ -56,6 +59,48 @@ export class PublicationDetailPage implements OnInit { }; } + + @ViewChild('ScrollContainer', { static: true }) ScrollContainer: ElementRef; + private observer: IntersectionObserver; + + ngAfterViewInit() { + // Create a callback function for the IntersectionObserver + const callback = (entries: IntersectionObserverEntry[]) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + this.onElementVisible(); + } + }); + }; + + // Create the IntersectionObserver instance + this.observer = new IntersectionObserver(callback, { + root: null, // Use the viewport as the root + threshold: 0.1 // Trigger the callback when 10% of the element is visible + }); + + // Start observing the target element + this.observer.observe(this.ScrollContainer.nativeElement); + } + + onElementVisible() { + console.log('Element is visible!'); + const e = this.ScrollContainer.nativeElement as HTMLDivElement + + this.containerMaxHeight = e.clientHeight - 100; + this.containerMaxWidth = e.clientWidth - 40 + + window['e'] = e; + } + + ngOnDestroy() { + // Unobserve the element when the component is destroyed + if (this.observer) { + this.observer.unobserve(this.ScrollContainer.nativeElement); + this.observer.disconnect(); + } + } + ngOnInit() { this.getPublicationDetail(); } diff --git a/src/app/shared/publication/view-publications/view-publications.page.html b/src/app/shared/publication/view-publications/view-publications.page.html index 961587800..3abe81ba3 100644 --- a/src/app/shared/publication/view-publications/view-publications.page.html +++ b/src/app/shared/publication/view-publications/view-publications.page.html @@ -42,7 +42,7 @@ -
+
--> - - +
+
- @@ -26,7 +26,7 @@ - +
@@ -38,20 +38,3 @@
- - - \ No newline at end of file diff --git a/src/app/shared/swiper/swiper.page.ts b/src/app/shared/swiper/swiper.page.ts index 2de9ab9bd..bb280d322 100644 --- a/src/app/shared/swiper/swiper.page.ts +++ b/src/app/shared/swiper/swiper.page.ts @@ -1,9 +1,7 @@ -import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core'; +import { Component, ElementRef, Input, OnInit, ViewChild, OnChanges, ViewChildren, QueryList } from '@angular/core'; import { checkFileTypeService } from 'src/app/services/checkFileType.service'; import { StopvideoService } from 'src/app/services/stopvideo.service'; - - - +import { v4 as uuidv4 } from 'uuid' @Component({ selector: 'app-swiper', templateUrl: './swiper.page.html', @@ -11,35 +9,45 @@ import { StopvideoService } from 'src/app/services/stopvideo.service'; }) export class SwiperPage implements OnInit { - @Input() publicationList: any; @Input() navigation: boolean; @Input() pagination: boolean; swiperIndex: number = 0; - @ViewChild('VideoManager') VideoManager; - @ViewChild('videoElement') videoElements: ElementRef | undefined; + @ViewChildren('videoElement') videoElements: QueryList; @ViewChild('swipers') swiperRef: ElementRef | undefined; showControls: boolean = false; previousIndex: number | undefined; - + componentId = uuidv4() constructor( public checkFileType: checkFileTypeService, public stopvideoService: StopvideoService, - ) { - console.log('Income list',this.publicationList) - } + ) {} ngOnInit() { - + + setTimeout(() => { + var videos:NodeListOf = document.querySelectorAll(`#C${this.componentId} video`); + + try { + // Pause each video + videos.forEach(function (video) { + video.load(); + }) + } catch(e) {} + + }, 100) + } + + ngOnChanges() { + this.onSlideChange() } onSlideChange() { - console.log('onchage') if (this.swiperRef) { const swiper = this.swiperRef.nativeElement.swiper; @@ -52,12 +60,13 @@ export class SwiperPage implements OnInit { this.previousIndex = this.swiperIndex; this.loadVideo() + } else { + console.log(this.swiperIndex) } - console.log(this.swiperIndex) + } } - goToSlide(index: number) { this.swiperIndex = this.swiperRef?.nativeElement.swiper.activeIndex; this.swiperRef?.nativeElement.swiper.slideTo(index); @@ -79,35 +88,45 @@ export class SwiperPage implements OnInit { video.pause(); }) - const video: HTMLVideoElement = this.videoElements.nativeElement; - - video.pause() - - /* this.videoElements.forEach(videoElement => { + this.videoElements.forEach(videoElement => { // You can access the native HTML video element using videoElement.nativeElement - + const video: HTMLVideoElement = videoElement.nativeElement; + + video.pause() // Do something with each video element // console.log(video); - }); */ + }); + + } catch (error) { console.log(error) } } + click() { + this.onSlideChange() + } //This method does the refresh of all video(it was implement beacouse of the erro displaing the controls of the video while swipe) //If you can find a better solution, please remove loadVideo() { - var videos = document.querySelectorAll('video'); try { - // Pause each video - videos.forEach(function (video) { - video.load(); - }) - const video: HTMLVideoElement = this.videoElements.nativeElement; + const file = this.publicationList.Files[this.swiperIndex] + if(this.checkFileType.checkFileType(file.FileExtension ) == 'video') { + + const video = document.querySelector(`#C${this.componentId} .swiper-slide-active video`) as HTMLVideoElement + if(video) { + + // video.load(); + video.removeAttribute('controls'); + setTimeout(() => { + video.setAttribute('controls', 'controls'); + }, 10) + } + + } - video.load() } catch (error) { console.log(error) } diff --git a/version/git-version.ts b/version/git-version.ts index d3630d4e5..4d2b82366 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "ef7edb397", - "SHA": "ef7edb39789dc7ede7052a36434d1d0cb7756ba2", + "shortSHA": "717968ac5", + "SHA": "717968ac52ab57751ffe9de2b8f7e8c16a4886aa", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Fri Jul 19 17:50:25 2024 +0100'", - "lastCommitMessage": "fix bug", - "lastCommitNumber": "5876", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is up to date with 'origin/feature/agenda-api-peter'.\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: gabinete-digital-fo.code-workspace\n\tmodified: package-lock.json\n\tmodified: package.json\n\tmodified: src/app/app.module.ts\n\tmodified: src/app/pages/agenda/agenda.page.ts\n\tnew file: src/app/services/monitoring/opentelemetry/logging.ts\n\tmodified: src/app/services/monitoring/opentelemetry/matrix.ts\n\tmodified: src/app/services/monitoring/opentelemetry/opentelemetry.ts\n\tmodified: src/app/services/monitoring/opentelemetry/tracer.ts\n\tnew file: src/app/services/monitoring/socket/socket.ts\n\tmodified: src/app/shared/publication/new-publication/new-publication.page.ts\n\tmodified: version/git-version.ts", + "lastCommitTime": "'Mon Jul 22 11:37:02 2024 +0100'", + "lastCommitMessage": "add logging", + "lastCommitNumber": "5877", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 1 commit.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/app.module.ts\n\tmodified: src/app/home/home-routing.module.ts\n\tnew file: src/app/infra/camera/adaptor.ts\n\tnew file: src/app/infra/camera/camera.service.ts\n\tmodified: src/app/interceptors/token.interceptors.ts\n\tmodified: src/app/modals/document-set-up-meeting/document-set-up-meeting.page.ts\n\tmodified: src/app/modals/profile/edit-profile/edit-profile.module.ts\n\tmodified: src/app/modals/profile/edit-profile/edit-profile.page.html\n\tmodified: src/app/modals/profile/edit-profile/edit-profile.page.ts\n\tmodified: src/app/modals/profile/profile.page.html\n\tmodified: src/app/modals/profile/profile.page.ts\n\tmodified: src/app/modals/view-event/view-event.page.ts\n\tnew file: src/app/module/user/data/datasource/user-local-repository.service.ts\n\tnew file: src/app/module/user/data/datasource/user-memory-repository.service.ts\n\tnew file: src/app/module/user/data/datasource/user-remote-repository.service.ts\n\tnew file: src/app/module/user/data/dto/profilePictureInputDTO.ts\n\tnew file: src/app/module/user/data/user-repository.service.ts\n\tmodified: src/app/pages/agenda/agenda.page.ts\n\tmodified: src/app/pages/agenda/view-event/view-event.page.ts\n\tmodified: src/app/pages/gabinete-digital/event-list/approve-event/approve-event.page.ts\n\tmodified: src/app/pages/gabinete-digital/event-list/event-list.page.ts\n\tmodified: src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.ts\n\tmodified: src/app/pages/publications/new-publication/new-publication.page.html\n\tmodified: src/app/pages/publications/new-publication/new-publication.page.ts\n\tmodified: src/app/pages/publications/view-publications/publication-detail/publication-detail.page.html\n\tmodified: src/app/pages/publications/view-publications/publication-detail/publication-detail.page.scss\n\tmodified: src/app/pages/publications/view-publications/publication-detail/publication-detail.page.ts\n\tmodified: src/app/pages/publications/view-publications/view-publications.page.html\n\tmodified: src/app/services/http.service.ts\n\tmodified: src/app/services/monitoring/opentelemetry/opentelemetry.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/event-list/event-list.page.ts\n\tmodified: src/app/shared/agenda/view-event/view-event.page.ts\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts\n\tmodified: src/app/shared/gabinete-digital/events-to-approve/events-to-approve.page.ts\n\tmodified: src/app/shared/header/header.page.html\n\tmodified: src/app/shared/header/header.page.ts\n\tmodified: src/app/shared/publication/view-publications/publication-detail/publication-detail.page.html\n\tmodified: src/app/shared/publication/view-publications/publication-detail/publication-detail.page.scss\n\tmodified: src/app/shared/publication/view-publications/publication-detail/publication-detail.page.ts\n\tmodified: src/app/shared/publication/view-publications/view-publications.page.html\n\tmodified: src/app/shared/swiper/swiper.page.html\n\tmodified: src/app/shared/swiper/swiper.page.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file