diff --git a/package-lock.json b/package-lock.json index 3e58d8db9..73188a5bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,7 @@ "@capacitor/haptics": "^4.1.0", "@capacitor/ios": "^5.4.2", "@capacitor/keyboard": "^4.1.0", + "@capacitor/local-notifications": "^6.0.0", "@capacitor/network": "^4.1.0", "@capacitor/push-notifications": "^5.1.0", "@capacitor/share": "^4.1.0", @@ -94,6 +95,7 @@ "@logisticinfotech/ionic4-datepicker": "^1.4.4", "@microsoft/signalr": "^8.0.0", "@ng-bootstrap/ng-bootstrap": "^9.1.2", + "@ngrx/store": "^10.1.2", "@ngx-translate/core": "^13.0.0", "@ngxs/store": "^3.8.2", "@opentelemetry/exporter-metrics-otlp-http": "^0.52.1", @@ -4076,6 +4078,14 @@ "@capacitor/core": "^4.0.0" } }, + "node_modules/@capacitor/local-notifications": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@capacitor/local-notifications/-/local-notifications-6.0.0.tgz", + "integrity": "sha512-a/g/ZlPgaBXue374oNzGvvNZWNpnclfcLzfE/P/PjhHxdHsM7J3OK0IfmjrEsRiON4AEIga+dkHi5yBjNAHCFw==", + "peerDependencies": { + "@capacitor/core": "^6.0.0" + } + }, "node_modules/@capacitor/network": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@capacitor/network/-/network-4.1.0.tgz", @@ -7577,6 +7587,18 @@ "rxjs": "^6.5.5" } }, + "node_modules/@ngrx/store": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-10.1.2.tgz", + "integrity": "sha512-FUjN786ch4Qt9WgJ78ef7Yquq3mPCekgcWgZrs4ycZw1f+KdfTHLTk1bGDtO8A8CzOya5yTT7KhxbdVjbOS5ng==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": "^10.0.0", + "rxjs": "^6.5.3" + } + }, "node_modules/@ngtools/webpack": { "version": "12.2.18", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.18.tgz", @@ -47077,6 +47099,12 @@ "integrity": "sha512-5fanmJLdkXLEaro0oezkmpC15tBGlsLW4cp1jQTMPwyX6NLlPUFHdWUhMERzxL2QXHmHvtoFMJ4m15Eymgefuw==", "requires": {} }, + "@capacitor/local-notifications": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@capacitor/local-notifications/-/local-notifications-6.0.0.tgz", + "integrity": "sha512-a/g/ZlPgaBXue374oNzGvvNZWNpnclfcLzfE/P/PjhHxdHsM7J3OK0IfmjrEsRiON4AEIga+dkHi5yBjNAHCFw==", + "requires": {} + }, "@capacitor/network": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@capacitor/network/-/network-4.1.0.tgz", @@ -49827,6 +49855,14 @@ "tslib": "^2.0.0" } }, + "@ngrx/store": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-10.1.2.tgz", + "integrity": "sha512-FUjN786ch4Qt9WgJ78ef7Yquq3mPCekgcWgZrs4ycZw1f+KdfTHLTk1bGDtO8A8CzOya5yTT7KhxbdVjbOS5ng==", + "requires": { + "tslib": "^2.0.0" + } + }, "@ngtools/webpack": { "version": "12.2.18", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.18.tgz", diff --git a/package.json b/package.json index 61c21e17b..448ff5938 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "@capacitor/haptics": "^4.1.0", "@capacitor/ios": "^5.4.2", "@capacitor/keyboard": "^4.1.0", + "@capacitor/local-notifications": "^6.0.0", "@capacitor/network": "^4.1.0", "@capacitor/push-notifications": "^5.1.0", "@capacitor/share": "^4.1.0", @@ -110,6 +111,7 @@ "@logisticinfotech/ionic4-datepicker": "^1.4.4", "@microsoft/signalr": "^8.0.0", "@ng-bootstrap/ng-bootstrap": "^9.1.2", + "@ngrx/store": "^10.1.2", "@ngx-translate/core": "^13.0.0", "@ngxs/store": "^3.8.2", "@opentelemetry/exporter-metrics-otlp-http": "^0.52.1", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index d69ae0ea4..e6af06072 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -97,6 +97,8 @@ import { DiplomaOptionsPage } from './shared/popover/deploma-options/deploma-opt import { ImageCropperModule } from 'ngx-image-cropper'; import { metricsInterceptor, MetricsInterceptor } from './interceptors/metter.interceptor'; import { environment } from 'src/environments/environment'; +import { StoreModule } from '@ngrx/store'; +import { calendarReducer } from './services/Repositorys/Agenda/agenda-memory-source.service'; // import { ServiceWorkerModule } from '@angular/service-worker'; // import { AngularFireModule } from '@angular/fire'; @@ -128,6 +130,7 @@ import { FirebaseX } from '@ionic-native/firebase-x/ngx'; */ @NgModule({ declarations: [AppComponent, PopupQuestionPipe, InputFilterDirective], imports: [BrowserModule, + StoreModule.forRoot({ calendar: calendarReducer }), CommonModule, FormsModule, CalendarModule.forRoot({ diff --git a/src/app/home/home.page.ts b/src/app/home/home.page.ts index b58972a82..9c8dbbb53 100644 --- a/src/app/home/home.page.ts +++ b/src/app/home/home.page.ts @@ -1,7 +1,6 @@ import { Component, NgZone, OnInit } from '@angular/core'; import { Event } from '../models/event.model'; -import { NotificationsService } from '../services/notifications.service'; -import { AlertController, ModalController, Platform } from '@ionic/angular'; +import { AlertController, Platform } from '@ionic/angular'; import { Router } from '@angular/router'; import { ToDayEventStorage } from '../store/to-day-event-storage.service'; import { TotalDocumentStore } from '../store/total-document.service'; @@ -17,21 +16,15 @@ 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'; import { PermissionList } from '../models/permission/permissionList'; import { SendIntent } from "send-intent"; - -// import { ChunkService } from "src/app/services/stream/chunk.service" -// import { StreamService } from "src/app/services/stream/stream.service" import { Plugins } from '@capacitor/core'; -import { NewActionPage } from '../pages/publications/new-action/new-action.page'; -import { PublicationsPage } from '../pages/publications/publications.page'; -// import { fetchData } from 'plugins/Echo'; import { Encoding, Filesystem, FilesystemDirectory } from '@capacitor/filesystem'; import { sendIntent } from 'src/app/services/shareIntent' +import { NativeNotificationService } from 'src/app/services/native-notification.service' const { App } = Plugins; @@ -106,10 +99,7 @@ export class HomePage implements OnInit { private zone: NgZone, public alertController: AlertController, public CaptureLogService: CaptureLogService, - // private LoggingService: LoggingService - - // private ChunkService: ChunkService, - // private StreamService: StreamService + private NativeNotificationService: NativeNotificationService ) { if (SessionStore.exist) { this.user = SessionStore.user; diff --git a/src/app/models/entiry/agenda/eventList.ts b/src/app/models/entiry/agenda/eventList.ts index 50e72c6d6..2351cc990 100644 --- a/src/app/models/entiry/agenda/eventList.ts +++ b/src/app/models/entiry/agenda/eventList.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; // Define the schema for a single event -const eventListSchema = z.array(z.object({ +const eventListItemSchema = z.object({ HasAttachments: z.boolean(), IsAllDayEvent: z.boolean(), EventId: z.any(), @@ -18,6 +18,11 @@ const eventListSchema = z.array(z.object({ TimeZone: z.string(), IsPrivate: z.boolean(), createdAt: z.string() -})); +}); +// Define the schema for a single event +const eventListSchema = z.array(eventListItemSchema); + + +export type EventListItem = z.infer export type EventList = z.infer diff --git a/src/app/pages/agenda/agenda.page.html b/src/app/pages/agenda/agenda.page.html index 6ec467332..4e28bca31 100644 --- a/src/app/pages/agenda/agenda.page.html +++ b/src/app/pages/agenda/agenda.page.html @@ -192,6 +192,7 @@
+
diff --git a/src/app/pages/agenda/agenda.page.ts b/src/app/pages/agenda/agenda.page.ts index aa870b0ec..588b30ec3 100644 --- a/src/app/pages/agenda/agenda.page.ts +++ b/src/app/pages/agenda/agenda.page.ts @@ -42,6 +42,8 @@ import { EEventFilterStatus } from 'src/app/services/Repositorys/Agenda/model/en 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'; +import { CalendarState, selectEventSource } from 'src/app/services/Repositorys/Agenda/agenda-memory-source.service'; +import { Store } from '@ngrx/store'; @Component({ selector: 'app-agenda', templateUrl: './agenda.page.html', @@ -185,6 +187,8 @@ export class AgendaPage implements OnInit { showCalendarField = false hasChangeCalendar = false + eventSource$ = this.store.select(selectEventSource); + constructor( @Inject(LOCALE_ID) private locale: string, private modalCtrl: ModalController, @@ -199,6 +203,7 @@ export class AgendaPage implements OnInit { public RoleIdService: RoleIdService, public AgendaDataRepositoryService: AgendaDataRepositoryService, private toastService: ToastService, + private store: Store ) { this.selectedUserCalendar = SessionStore.user.UserId diff --git a/src/app/pages/agenda/new-event/new-event.page.html b/src/app/pages/agenda/new-event/new-event.page.html index 8e3bb3b21..ed6d185a3 100644 --- a/src/app/pages/agenda/new-event/new-event.page.html +++ b/src/app/pages/agenda/new-event/new-event.page.html @@ -410,7 +410,11 @@

{{document.subject}} - {{document.appName}} + + Correspondência + Acções Presidenciais + Arquivo Despacho Electrónico + diff --git a/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.html b/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.html index 8b7889fab..53b3bd4cc 100644 --- a/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.html +++ b/src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.html @@ -25,7 +25,7 @@

-
+
@@ -33,19 +33,22 @@
- +
PR
+
+ Minha agenda +
- - -
{{ environment.agendaPR}}
-
{{ environment.agendaVP}}
-
Agenda do {{calendars.Fullname}}
-
Minha agenda
@@ -72,7 +75,6 @@
- @@ -81,13 +83,10 @@ -
- -
@@ -95,7 +94,6 @@
- @@ -114,10 +112,84 @@ -
+
+ + + + +
+
+ + Todo dia + + +
+
+ +
+
+
+
+
+ + + + + + Nunca + + + Diário + + + Semanalmente + + + Mensal + + + Anual + + + + +
+
+
+ +
+ +
+
+ +
+ +
+ + + + + + + + +
+
+
@@ -129,7 +201,7 @@ @@ -156,9 +228,8 @@
- -
-
-
- -
-
- - - - - - - - -
-
-
-
@@ -318,4 +358,3 @@
- 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 fd4ebbb4e..591c9b0ab 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 @@ -9,7 +9,6 @@ import { AttachmentsService } from 'src/app/services/attachments.service'; import { SearchPage } from 'src/app/pages/search/search.page'; import { SearchList } from 'src/app/models/search-document'; import { LoginUserRespose } from 'src/app/models/user.model'; -import { AuthService } from 'src/app/services/auth.service'; import { AttendeesPageModal } from 'src/app/pages/events/attendees/attendees.page'; import { ToastService } from 'src/app/services/toast.service'; import { FormControl, FormGroup, Validators } from '@angular/forms'; @@ -24,6 +23,12 @@ import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'; import { environment } from 'src/environments/environment'; import { TaskService } from 'src/app/services/task.service' import { ContactsService } from 'src/app/services/contacts.service'; +import { Utils } from 'src/app/services/Repositorys/Agenda/utils'; +import { Observable } from 'rxjs'; +import { TableSharedCalendar } from 'src/app/services/Repositorys/Agenda/agenda-local-data-source.service'; +import { AgendaDataRepositoryService } from 'src/app/services/Repositorys/Agenda/agenda-data-repository.service'; +import { TracingType, XTracerAsync } from 'src/app/services/monitoring/opentelemetry/tracer'; +import { isHttpError } from 'src/app/services/http.service'; const moment = _rollupMoment || _moment; @@ -66,8 +71,6 @@ export class BookMeetingModalPage implements OnInit { public stepMinute = 15; public stepSecond = 5; - public dateControlStart = new FormControl(moment("DD MM YYYY hh")); - public dateControlEnd = new FormControl(moment("DD MM YYYY hh")); CalendarNamesOptions = ['Oficial', 'Pessoal'] Form: FormGroup; @@ -78,13 +81,6 @@ export class BookMeetingModalPage implements OnInit { showLoader = false - get dateStart() { - return this.dateControlStart.value; - } - - get dateEnd() { - return this.dateControlEnd.value; - } @ViewChild('picker') picker: any; @ViewChild('fim') fim: any; @@ -94,7 +90,7 @@ export class BookMeetingModalPage implements OnInit { task: any; fulltask: any; - taskParticipants: EventPerson[]; + taskParticipants: EventPerson[] = []; taskParticipantsCc: EventPerson[] = []; taskDocId: string; @@ -111,14 +107,18 @@ export class BookMeetingModalPage implements OnInit { showAttendees = false; emptyTextDescription = "Selecionar intervenientes"; - CalendarName - sessionStore = SessionStore; environment = environment loggeduser: LoginUserRespose; eventPersons: EventPerson[]; contacts: EventPerson[]; + hasChangeCalendar = false + selectedUserCalendar:any; + sharedCalendar: Observable + allDayCheck: boolean = false; + CalendarNameShow = true + constructor( private modalController: ModalController, private navParams: NavParams, @@ -131,8 +131,8 @@ export class BookMeetingModalPage implements OnInit { private httpErroHandle: HttpErrorHandle, public TaskService: TaskService, private contactsService: ContactsService, - - + public utils: Utils, + private agendaDataRepository: AgendaDataRepositoryService, ) { this.taskParticipants = []; @@ -153,19 +153,11 @@ export class BookMeetingModalPage implements OnInit { this.postData.CalendarName = "Oficial"; let startDate = this.roundTimeQuarterHour() - this.dateControlStart = new FormControl(moment(startDate)); - this.dateControlEnd = new FormControl(moment(this.roundTimeQuarterHourPlus15(startDate))); + this.postData.StartDate = startDate; + this.postData.EndDate = this.roundTimeQuarterHourPlus15(startDate); this.postData.Category = 'Reunião' - - if (!this.CalendarName) { - if (this.eventService.calendarNamesAry.includes('Meu calendario')) { - this.CalendarName = 'Meu calendario'; - // console.log(this.eventService.calendarNamesAry) - } else { - this.CalendarName = this.eventService.calendarNamesAry[0] - } - } + this.postData.IsAllDayEvent = false if (this.taskParticipants.length == 0) { this.taskParticipants = [ @@ -180,11 +172,19 @@ export class BookMeetingModalPage implements OnInit { this.changeAgenda(); this.loggeduser = SessionStore.user; + this.sharedCalendar = this.agendaDataRepository.getShareCalendarItemsLiveWithOrder() + + this.postData.EventRecurrence = { + frequency: 'never', + until: "", + Type: '' + } } ngOnInit() { // console.log('TEsTEROLE',this.eventService.calendarNamesAry) this.adding = "intervenient"; + this.setCalendarByDefault(true) this.getAttachments(); this.setDefaultTime() this.getRecurrenceTypes(); @@ -193,6 +193,24 @@ export class BookMeetingModalPage implements OnInit { } + + async setCalendarByDefault(force) { + if (!this.selectedUserCalendar || force) { + + const data = await this.agendaDataRepository.geCalendars() + + const prObject = data.find(e => e?.roleId == 100000014) + if(prObject) { + this.selectedUserCalendar = prObject.wxUserId + } else { + this.selectedUserCalendar = SessionStore.user.UserId + } + + this.changeAgenda() + + } + } + ngOnDestroy() { clearInterval(this.myInterval) } @@ -205,33 +223,34 @@ export class BookMeetingModalPage implements OnInit { }) }, 1000); + getRecurrenceTypes() { this.calendarService.getRecurrenceTypes().subscribe(res => { this.recurringTypes = res; }); } + changeSegmentCalendar() { + this.hasChangeCalendar = true + } - changeAgenda() { + async changeAgenda() { - setTimeout(() => { + this.CalendarNameShow = false - if (this.calendarService.calendarNamesType[this.CalendarName]?.['Oficial'] && this.calendarService.calendarNamesType[this.CalendarName]?.['Pessoal']) { + const result = await this.agendaDataRepository.geCalendars() - this.CalendarNamesOptions = ['Oficial', 'Pessoal'] - } else if (this.calendarService.calendarNamesType[this.CalendarName]?.['Oficial']) { + const selectedCalendar = result.find(e => e.wxUserId == this.selectedUserCalendar) + if(selectedCalendar) { + if(selectedCalendar.shareType == 1) { this.CalendarNamesOptions = ['Oficial'] - this.postData.CalendarName = 'Oficial' - } else if (this.calendarService.calendarNamesType[this.CalendarName]?.['Pessoal']) { - + } else if(selectedCalendar.shareType == 2) { this.CalendarNamesOptions = ['Pessoal'] - this.postData.CalendarName = 'Pessoal' - } else { - + } else if (selectedCalendar.shareType == 3) { this.CalendarNamesOptions = ['Oficial', 'Pessoal'] } - }, 50) + } } @@ -258,13 +277,13 @@ export class BookMeetingModalPage implements OnInit { runValidation() { this.validateFrom = true - if (new Date(this.dateStart).getTime() > new Date(this.dateEnd).getTime()) { + if (new Date(this.postData.StartDate).getTime() > new Date(this.postData.EndDate).getTime()) { this.toastService._badRequest("A data de fim não pode ser inferior a data de início do evento") } } get dateValid() { - return new Date(this.dateControlStart.value).getTime() < new Date(this.dateControlEnd.value).getTime() ? 'ok' : null + return new Date(this.postData.StartDate).getTime() < new Date(this.postData.EndDate).getTime() ? 'ok' : null } injectValidation() { @@ -293,7 +312,8 @@ export class BookMeetingModalPage implements OnInit { }) } - async saveTask() { + @XTracerAsync({name:'convocar-reunia', bugPrint: true}) + async saveTask(tracing?: TracingType) { if (SessionStore.user.Profile != 'PR') { this.injectValidation() @@ -303,6 +323,8 @@ export class BookMeetingModalPage implements OnInit { let Attendees = this.taskParticipants.concat(this.taskParticipantsCc); + console.log({Attendees}) + this.eventBody = { BodyType: '1', Text: this.postData.Body.Text, @@ -314,26 +336,23 @@ export class BookMeetingModalPage implements OnInit { Location: this.postData.Location, CalendarId: '', CalendarName: this.postData.CalendarName, - StartDate: this.dateStart, - EndDate: this.dateEnd, - EventType: 'Reunião', + StartDate: this.postData.StartDate, + EndDate: this.postData.EndDate, + EventType: 'Meeting', Attendees: Attendees, IsMeeting: false, IsRecurring: false, AppointmentState: 0, TimeZone: 'UTC', Organizer: null, - Category: 'Reunião', + Category: 'Meeting', HasAttachments: true, - EventRecurrence: { - Type: this.EventRecurrenceType, - LastOccurrence: this.Occurrence - }, + IsAllDayEvent: this.postData.IsAllDayEvent, + EventRecurrence: this.postData.EventRecurrence, Attachments: [] } const DocumentToSave = this.documents.map((e: any) => { - console.log('ASSUNTO', e.Assunto) return { ApplicationId: e.ApplicationType || e.ApplicationId, Source: 1, @@ -345,69 +364,105 @@ export class BookMeetingModalPage implements OnInit { }); postData.Attachments = DocumentToSave; + let loader = this.toastService.loading(); - - - if (this.task.FsId == '8') { - const loader = this.toastService.loading() + const calendar = await this.agendaDataRepository.getCalendarByUserId(this.selectedUserCalendar) + if(calendar.isOk()) { try { - const CalendarId = this.selectedCalendarId() - await this.calendarService.genericPostExpedientEvent(this.task.DocId, postData, "", this.task.SerialNumber, this.task.FsId, CalendarId).toPromise(); - - this.modalController.dismiss(); - this.httpErroHandle.httpsSucessMessagge('Marcar Reunião') + const value = await this.agendaDataRepository.createEvent(postData, this.documents, calendar.value, tracing).toPromise() + console.log(value) + this.httpErroHandle.httpsSucessMessagge('new event') + loader.remove(); + tracing.setAttribute('outcome', 'success') + this.close(); } catch (error) { - this.httpErroHandle.httpStatusHandle(error) - } - finally { - loader.remove() + + if(!isHttpError(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(error) + tracing.bugFlag() + } else { + this.httpErroHandle.httpStatusHandle(error.status) + } + console.log('create event error: ', error) + tracing.setAttribute('outcome', 'failed') } + } else { + + + tracing.setAttribute('outcome', 'failed') + tracing.setAttribute('no', 'this.selectedUserCalendar') + tracing.bugFlag() + } + + if (this.task.FsId == '8') { + // const calendar = await this.agendaDataRepository.getCalendarByUserId(this.selectedUserCalendar) + // if(calendar.isOk()) { + + // try { + // const value = await this.agendaDataRepository.createEvent(this.postData, this.documents, calendar.value, tracing).toPromise() + // console.log(value) + // this.httpErroHandle.httpsSucessMessagge('new event') + // loader.remove(); + // tracing.setAttribute('outcome', 'success') + // } catch (error) { + // console.log('create event error: ', error) + // tracing.setAttribute('outcome', 'failed') + + // this.httpErroHandle.httpStatusHandle(error.status) + // } + + // } else { + + // } } else if (this.task.FsId == '361') { - console.log('361') - const loader = this.toastService.loading() - try { + // console.log('361') + // const loader = this.toastService.loading() + // try { - const CalendarId = this.selectedCalendarId() - console.log({ CalendarId }) - await this.calendarService.genericCreateTaskEvent(this.task.FolderID | this.task.FolderId, postData, "", this.task.SerialNumber, this.task.FsId, CalendarId).toPromise(); + // const CalendarId = this.selectedCalendarId() + // console.log({ CalendarId }) + // await this.calendarService.genericCreateTaskEvent(this.task.FolderID | this.task.FolderId, postData, "", this.task.SerialNumber, this.task.FsId, CalendarId).toPromise(); - this.close(); - this.httpErroHandle.httpsSucessMessagge('Marcar Reunião') + // this.close(); + // this.httpErroHandle.httpsSucessMessagge('Marcar Reunião') - } catch (error) { - this.httpErroHandle.httpStatusHandle(error) - } finally { - loader.remove() - } + // } catch (error) { + // this.httpErroHandle.httpStatusHandle(error) + // } finally { + // loader.remove() + // } } else { this.toastService._successMessage('Não é possível marcar a reunião de momento'); } + + loader.remove(); } + onCheckboxChange(event: any) { + if (this.allDayCheck) { + this.postData.IsAllDayEvent = this.allDayCheck; + this.postData.StartDate = this.setAlldayTime(this.postData.StartDate) + this.postData.EndDate = this.setAlldayTimeEndDate(this.postData.EndDate) - - selectedCalendarId() { - - if (this.calendarService.calendarNamesType[this.CalendarName]?.['Oficial'] && this.postData.CalendarName == 'Oficial') { - return this.calendarService.calendarNamesType[this.CalendarName]['OficialId'] - - } else if (this.calendarService.calendarNamesType[this.CalendarName]?.['Pessoal'] && this.postData.CalendarName == 'Pessoal') { - - return this.calendarService.calendarNamesType[this.CalendarName]['PessoalId'] - + console.log('Recurso ativado!!'); } else { - return '11:11' + this.postData.IsAllDayEvent = this.allDayCheck; + this.postData.EndDate = this.setAlldayTimeEndDateNotAlday(this.postData.EndDate) + console.log('Recurso desativado'); + } } + async addParticipants() { this.adding = "intervenient"; @@ -626,4 +681,37 @@ export class BookMeetingModalPage implements OnInit { } } + + setAlldayTime(timeToReturn) { + let date: any = new Date(timeToReturn) || new Date(); + let newdate = new Date(); + date.setHours(0) + date.setMinutes(0) + date.setSeconds(0); + + + return date + } + + setAlldayTimeEndDate(timeToReturn) { + let date: any = new Date(timeToReturn) || new Date(); + let newdate = new Date(); + date.setHours(23) + date.setMinutes(59) + date.setSeconds(0); + + + return date + } + + setAlldayTimeEndDateNotAlday(timeToReturn) { + let date: any = new Date(timeToReturn) || new Date(); + let newdate = new Date(); + date.setHours(23) + date.setMinutes(0) + date.setSeconds(0); + + + return date + } } 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 304bd9d59..3240b97eb 100644 --- a/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts +++ b/src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts @@ -24,7 +24,11 @@ import { EventUpdateInputDTOSchema } from './model/eventUpdateInputDtO'; import { AttachInputDTOSchema } from './model/addAttachmentDTOInput'; import { EventListDataOutputDTOSchema } from './model/eventListDTOOutput'; import { EventSearchMapper } from './mapper/EventSearchMapper'; - +import { select, Store } from '@ngrx/store'; +import { CalendarState, pushEvent, removeRangeForCalendar, selectEventsInRange } from './agenda-memory-source.service'; +import { NativeNotificationService } from 'src/app/services/native-notification.service'; +import { ListBoxService } from 'src/app/services/agenda/list-box.service'; +import { EventListStore } from 'src/app/models/agenda/AgendaEventList'; @Injectable({ providedIn: 'root' }) @@ -33,7 +37,11 @@ export class AgendaDataRepositoryService { constructor( private agendaDataService: AgendaDataService, private utils: Utils, - private agendaLocalDataSourceService: AgendaLocalDataSourceService + private agendaLocalDataSourceService: AgendaLocalDataSourceService, + private memoryStore: Store, + private NativeNotificationService: NativeNotificationService, + public listBoxService: ListBoxService, + ) { } createOwnCalendar(): SharedCalendarListItemOutputDTO { @@ -122,7 +130,47 @@ export class AgendaDataRepositoryService { const result = await this.agendaDataService.getEvents(userId, startDate, endDate, status, category, type).pipe( map((response) => { APINODReturn(EventListDataOutputDTOSchema, response, 'get/Events', tracing) - return ListEventMapper.toDomain(response, calendarOwnerName, userId) + + + let profile; + + if (SessionStore.user.Profile == 'PR') { + profile = "pr" + } else if (userId == SessionStore.user.UserId as any) { + profile = 'md' + } else { + profile = "pr" + } + const listToPresent = ListEventMapper.toDomain(response, calendarOwnerName, userId) + + const map : EventListStore[] = listToPresent.map( element => { + return { + startTime: new Date(element.StartDate), + endTime: new Date(element.EndDate), + allDay: false, + event: element, + calendarName: element.CalendarName, + profile: profile, + id: element.EventId, + CalendarId: userId + } + }) as any + + + const year = this.listBoxService.list(map, 'md', startDate, endDate, { selectedDate: new Date() }) + const events = this.utils.getAllEvents(year) + this.NativeNotificationService.scheduleNotifications(events) + + this.memoryStore.pipe( + select(selectEventsInRange(startDate, endDate, userId)) + ).subscribe((localList)=> { + // console.log({localList}) + }); + + // this.memoryStore.dispatch(removeRangeForCalendar({ startDate, endDate, userId })); + // this.memoryStore.dispatch(pushEvent({ eventsList:eventsList as any, userId, profile })); + + return listToPresent } )).toPromise() return ok(result) @@ -170,6 +218,8 @@ export class AgendaDataRepositoryService { createEvent(eventData: Event, documents, calendar: TableSharedCalendar, tracing: TracingType) { + console.log('eventData', eventData); + let eventInput = { userId: calendar.wxUserId, ownerType: this.utils.selectedCalendarOwner(calendar.role), diff --git a/src/app/services/Repositorys/Agenda/agenda-memory-source.service.ts b/src/app/services/Repositorys/Agenda/agenda-memory-source.service.ts new file mode 100644 index 000000000..082b0c165 --- /dev/null +++ b/src/app/services/Repositorys/Agenda/agenda-memory-source.service.ts @@ -0,0 +1,110 @@ +// calendar.actions.ts +import { createAction, props } from '@ngrx/store'; +import { createReducer, on } from '@ngrx/store'; +import { EventList, EventListStore } from 'src/app/models/agenda/AgendaEventList'; +import { createFeatureSelector, createSelector } from '@ngrx/store'; + +export const loadEvents = createAction('[Calendar] Load Events'); +export const loadEventsSuccess = createAction( + '[Calendar] Load Events Success', + props<{ events: EventListStore[] }>() +); + +export const resetList = createAction( + '[Calendar] Reset List', + props<{ eventSource: EventListStore[] }>() +); + +export const pushEvent = createAction( + '[Calendar] Push Event', + props<{ eventsList: EventList[], profile: 'pr' | 'md', userId: string }>() +); + +export const removeRangeForCalendar = createAction( + '[Calendar] Remove Range For Calendar', + props<{ startDate: Date, endDate: Date, userId: string }>() +); + +export const getRangeForCalendar = createAction( + '[Calendar] Remove Range For Calendar', + props<{ startDate: Date, endDate: Date, userId: string }>() +); + + +export const deleteAllEvents = createAction('[Calendar] Delete All Events'); + + + +// ========================================================================= + + +export interface CalendarState { + eventSource: EventListStore[]; +} + +export const initialState: CalendarState = { + eventSource: [] +}; + +export const calendarReducer = createReducer( + initialState, + on(loadEventsSuccess, (state, { events }) => ({ + ...state, + eventSource: events + })), + on(resetList, (state, { eventSource }) => ({ + ...state, + eventSource + })), + on(pushEvent, (state, { eventsList, profile, userId }) => { + let news = eventsList.map(element => ({ + startTime: new Date(element.StartDate), + endTime: new Date(element.EndDate), + allDay: false, + event: element, + calendarName: element.CalendarName, + profile: profile, + id: element.EventId, + CalendarId: userId + })); + + let instance = state.eventSource.concat(news as any); + const ids = instance.map(o => o.id); + const filtered = instance.filter(({ id }, index) => !ids.includes(id, index + 1)); + + return { + ...state, + eventSource: filtered + }; + }), + on(removeRangeForCalendar, (state, { startDate, endDate, userId }) => ({ + ...state, + eventSource: state.eventSource.filter(e => + !(new Date(e.endTime).getTime() >= new Date(startDate).getTime() && + new Date(endDate).getTime() >= new Date(e.startTime).getTime() && e.CalendarId == userId) + ) + })), + on(deleteAllEvents, state => ({ + ...state, + eventSource: [] + })) +); + +// ========================================================================= +export const selectCalendarState = createFeatureSelector('calendar'); + +export const selectEventSource = createSelector( + selectCalendarState, + (state: CalendarState) => state.eventSource +); + + +// Create selector to get range of events +export const selectEventsInRange = (startDate: Date, endDate: Date, userId: string) => createSelector( + selectEventSource, + (events) => events.filter(event => + new Date(event.startTime).getTime() >= new Date(startDate).getTime() && + new Date(event.endTime).getTime() <= new Date(endDate).getTime() && + event.CalendarId === userId + ) +); diff --git a/src/app/services/Repositorys/Agenda/utils.ts b/src/app/services/Repositorys/Agenda/utils.ts index f466cc149..3095fb87f 100644 --- a/src/app/services/Repositorys/Agenda/utils.ts +++ b/src/app/services/Repositorys/Agenda/utils.ts @@ -1,14 +1,15 @@ import { Injectable } from '@angular/core'; import { AgendaDataService } from './agenda-data.service'; import { EventsService } from '../../events.service'; - +import { RoleIdService } from 'src/app/services/role-id.service' +import { TableSharedCalendar } from './agenda-local-data-source.service'; @Injectable({ providedIn: 'root' }) export class Utils { constructor( - private agendaDataService: AgendaDataService, public eventService: EventsService, + public RoleIdService: RoleIdService, ) { } @@ -84,7 +85,7 @@ export class Utils { documents.forEach(element => { let object = { docId: element.docId || element.DocId || element.Id, - sourceName: element.subject || element.sourceNames || element.Description || element.SourceName, + sourceName: element.subject || element.sourceNames || element.Description || element.SourceName || element.Assunto, description: "", applicationId: element.applicationId || element.ApplicationId } @@ -93,7 +94,7 @@ export class Utils { }); return listupdate.filter( e=> typeof e.docId == 'number') - + /* return documents.map((e) => { return { docId: e.docId, @@ -201,4 +202,57 @@ export class Utils { diff + pad(Math.floor(Math.abs(tzOffset) / 60)) + ':' + pad(Math.abs(tzOffset) % 60); } + + + + didEventHappenToday(eventTime) { + const eventDate = new Date(eventTime); + const today = new Date(); + return eventDate.toDateString() === today.toDateString(); + } + + + 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 ${hours}h ${minutes}m`.replace('0d', '') + } + + getAllEvents(years: any[]): Event[] { + const events: Event[] = []; + + years.forEach(year => { + year.months.forEach(month => { + month.days.forEach(day => { + events.push(...day.events); + }); + }); + }); + + return events; + } + + + + hasPrCalendar(data: TableSharedCalendar[]) { + for(const e of data) { + if(e.roleId == this.RoleIdService.PRES) { + return true + } + } + + return false + } } diff --git a/src/app/services/agenda/list-box.service.ts b/src/app/services/agenda/list-box.service.ts index be5c58f63..bd5165fc4 100644 --- a/src/app/services/agenda/list-box.service.ts +++ b/src/app/services/agenda/list-box.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { CustomCalendarEvent, EventListStore } from 'src/app/models/agenda/AgendaEventList'; import { DateService } from '../date.service'; import { momentG } from 'src/plugin/momentG'; +import { NativeNotificationService } from 'src/app/services/native-notification.service'; @Injectable({ providedIn: 'root' @@ -12,7 +13,7 @@ export class ListBoxService { constructor( - private dateService: DateService + private dateService: DateService, ){} @@ -78,7 +79,8 @@ export class ListBoxService { // console.log('newStracture', newStracture) - return this.display(newStracture, selectedDate).year + const data = this.display(newStracture, selectedDate) + return data.year // const daysStringNum = Object.keys(daysObject) diff --git a/src/app/services/chat/chat-system.service.ts b/src/app/services/chat/chat-system.service.ts index 594c5e7c4..c9ce841d2 100644 --- a/src/app/services/chat/chat-system.service.ts +++ b/src/app/services/chat/chat-system.service.ts @@ -60,7 +60,6 @@ export class ChatSystemService { private sortService: SortService, private ChatService: ChatService, private NfService: NfService, - private changeProfileService: ChangeProfileService, private chatService: ChatService, private ChatMethodsService: ChatMethodsService, private AESEncrypt: AESEncrypt, diff --git a/src/app/services/events.service.ts b/src/app/services/events.service.ts index f54fea5f7..6f5842518 100644 --- a/src/app/services/events.service.ts +++ b/src/app/services/events.service.ts @@ -1,17 +1,14 @@ import { Injectable } from '@angular/core'; -import { Event, EventToApproveEdit, } from '../models/event.model'; +import { Event } from '../models/event.model'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import { Observable, from } from 'rxjs'; +import { Observable } from 'rxjs'; import { environment } from 'src/environments/environment'; import { AuthService } from '../services/auth.service'; -import { EventList } from '../models/agenda/AgendaEventList'; import { ChangeProfileService } from './change-profile.service'; import { OfflineManagerService } from 'src/app/services/offline-manager.service'; -import { catchError } from "rxjs/operators"; import { SessionStore } from '../store/session.service'; import { calendarInterface } from '../models/user.model'; import { Subscribe } from './subcribe'; -import { EventOutputDTO } from './Repositorys/Agenda/model/eventDTOOutput'; @Injectable({ @@ -1368,7 +1365,18 @@ export class EventsService { params = params.set("notifyUsers", true) const calendar = this.DetectCalendars(CalendarId) - const header = this.makeHeader(calendar) + let header; + console.log('calendar') + + try { + + header = this.makeHeader(calendar) + + + } catch (error) {} + + + console.log('header') options = { headers: header, diff --git a/src/app/services/native-notification.service.ts b/src/app/services/native-notification.service.ts index 6a2c447a0..b9128cef8 100644 --- a/src/app/services/native-notification.service.ts +++ b/src/app/services/native-notification.service.ts @@ -1,36 +1,28 @@ import { Injectable } from '@angular/core'; import { Platform } from '@ionic/angular'; -import { CapacitorConfig } from '@capacitor/cli'; -/* import { LocalNotifications, LocalNotificationSchema } from '@capacitor/local-notifications'; */ - +import { LocalNotifications } from '@capacitor/local-notifications'; +import { v4 as uuidv4 } from 'uuid' @Injectable({ providedIn: 'root' }) export class NativeNotificationService { - constructor(private platform: Platform,) { + private scheduledEventIds: number[] = []; + + constructor( + private platform: Platform,) { this.askForPermission() - } - askForPermission() { - - /* LocalNotifications.requestPermissions() - - LocalNotifications.checkPermissions().then((data)=>{ - // - }).catch((data)=>{ - // - }) */ + window['send'] = () => { + this.eventNotification({eventId:uuidv4()}) + } } - foregroundNotification() { + askForPermission() {} - /* LocalNotifications.addListener('localNotificationReceived', (notification) => { - - }) */ - } + foregroundNotification() {} backgroundNotification() { /* LocalNotifications.addListener('localNotificationActionPerformed', (action) => { @@ -53,6 +45,142 @@ export class NativeNotificationService { } + uuidTo32BitInt(uuid) { + // Remove hyphens and convert to a 16-byte hex string + const hex = uuid.replace(/-/g, ''); + + // Get the least significant 8 bytes (16 hex characters) + const leastSignificantBytes = hex.slice(-16); + + // Convert to a 64-bit integer + const bigInt = BigInt('0x' + leastSignificantBytes); + + // Convert to a 32-bit integer and ensure it fits within the int32 range + const int32 = Number(bigInt % BigInt(2 ** 32)); + + // Adjust to fit within the signed 32-bit range + return int32 >= 2 ** 31 ? int32 - 2 ** 32 : int32; + } + + async cancelNotification(eventId: number) { + await LocalNotifications.cancel({ notifications: [{ id: eventId }] }); + console.log(`Notification with event ID ${eventId} canceled.`); + } + + didEventHappenToday(eventTime) { + const eventDate = new Date(eventTime); + const today = new Date(); + return eventDate.toDateString() === today.toDateString(); + } + + + async cancelAllNotification() { + try { + await LocalNotifications.cancel({ + notifications: [] + }); + console.log('All notifications cancelled'); + } catch (error) { + console.error('Error cancelling notifications:', error); + } + } + + async scheduleNotifications(events: any) { + const notifications = []; + + + console.log({events}); + + events = events + .filter(e => new Date().getTime() <= new Date(e.start).getTime()) + .filter(e => this.didEventHappenToday(e.start)) + + console.log('notify', events) + + + await this.cancelAllNotification(); + + for (const event of events) { + + const eventTime = new Date(event.start).getTime(); + const now = new Date().getTime(); + + // Schedule notifications for 1 hour before and 15 minutes before the event + const oneHourBefore = eventTime - 60 * 60 * 1000; + const fifteenMinutesBefore = eventTime - 15 * 60 * 1000; + + const timeDifference = eventTime - now; + const oneHour = 60 * 60 * 1000; // 1 hour in milliseconds + const fifteenMinutes = 15 * 60 * 1000; // 15 minutes in milliseconds + + console.log('notification to notify object', event) + // if (timeDifference <= fifteenMinutes) { + + // console.log({notification: event, e: '15 minutes'}) + // notifications.push({ + // title: 'Event Reminder', + // body: `Reminder: ${event.Subject} starts in ${this.duration(event.start, new Date())} minutes.£`, + // id: this.uuidTo32BitInt(event.event.id) + // }); + // } else if (timeDifference <= oneHour) { + + // console.log({notification: event, e: '1 hour.'}) + // notifications.push({ + // title: 'Event Reminder', + // body: `Reminder: ${event.Subject} starts in ${this.duration(event.start, new Date())} hour.£`, + // id: this.uuidTo32BitInt(event.id) + // }); + // } else { + // console.log("Event is more than 1 hour away.") + + + if (timeDifference >= fifteenMinutes) { + notifications.push({ + title: 'Event Reminder', + body: `Reminder: ${event.event.Subject} 15 minutes`, + id: this.uuidTo32BitInt(event.id)+1, + schedule: { at: new Date(fifteenMinutesBefore) }, + }); + console.log('15m', new Date(fifteenMinutesBefore)) + + } + + if (timeDifference >= oneHour) { + notifications.push({ + title: 'Event Reminder', + body: `Reminder: ${event.event.Subject} 1 hour`, + id: this.uuidTo32BitInt(event.id)+2, + schedule: { at: new Date(oneHourBefore) }, + }); + console.log('1h', new Date(oneHourBefore)) + } + + // } + + } + + await LocalNotifications.schedule({ notifications }); + } + + async eventNotification({eventId}) { + await LocalNotifications.schedule({ + notifications: [ + { + title: 'Test Notification 6', + body: 'This is a test notification. 6', + id: this.uuidTo32BitInt(eventId), // Unique ID for the notification + schedule: { at: new Date(Date.now() + 1000 * 10) }, // Schedule to show in 5 seconds + sound: null, + attachments: null, + actionTypeId: '', + extra: null, + }, + ], + }); + + console.log('send notificatino') + } + isDesktop() { if (this.platform.is('desktop') || this.platform.is('mobileweb')) { return true @@ -62,4 +190,21 @@ export class NativeNotificationService { } } + 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 ${hours}h ${minutes}m`.replace('0d', '') + } } diff --git a/src/app/shared/agenda/new-event/new-event.page.html b/src/app/shared/agenda/new-event/new-event.page.html index 404663a65..cd3a8c527 100644 --- a/src/app/shared/agenda/new-event/new-event.page.html +++ b/src/app/shared/agenda/new-event/new-event.page.html @@ -211,6 +211,7 @@ placeholder="Data Inicio*" [(ngModel)]="postEvent.StartDate" [disabled]="disabled" + (ngModelChange)="onDateChange($event)" >

{{document.subject}} - {{ TaskService.attachmentAppName(document)}} - {{document.appName}} + Correspondência + Acções Presidenciais + Arquivo Despacho Electrónico 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 bd5883944..9e2a67162 100644 --- a/src/app/shared/agenda/new-event/new-event.page.ts +++ b/src/app/shared/agenda/new-event/new-event.page.ts @@ -746,5 +746,16 @@ export class NewEventPage implements OnInit { return date } + onDateChange(e) { + + const cloneDateStartDate = new Date(this.postEvent.StartDate); + const cloneDateEndDate = new Date(this.postEvent.EndDate); + + if(cloneDateStartDate.getTime() >= cloneDateEndDate.getTime()) { + cloneDateStartDate.setHours(cloneDateStartDate.getHours() + 1); + this.postEvent.EndDate = cloneDateStartDate + } + + } } diff --git a/version/event-da-semana.html b/version/event-da-semana.html index 1b052171a..6b90eb4da 100644 --- a/version/event-da-semana.html +++ b/version/event-da-semana.html @@ -7,9 +7,10 @@ font-family: arial; } - body { + .body { background-color: #f5f7fb; padding: 35px; + margin: 0px; } @@ -46,13 +47,13 @@ margin: auto 0px; margin: 0px auto; } - main { + .main { background-color: white !important; width: 680px; margin: 0px auto; box-shadow: 0px 0px 100px #e8e8e8; } - footer { + .footer { width: 680px; margin: 0px auto; } @@ -63,6 +64,9 @@ } .m-auto { margin: 0px auto; } + .d-block { display: block; } + .d-flex { display: flex;} + .px-40 { padding: 0px 40px; } .pb-40 { padding-bottom: 40px; } .pa-40 { padding: 40px; } @@ -79,69 +83,73 @@ .text-gray { color: rgb(169, 169, 169); } .link-color { color:rgb(0, 0, 255); } + +

+
-
- -
- Logo -

República De Angola

-

Gabinete do Presidente da República

-

Convite para reunião

-
- -
-
-

Agenda da semana

- - - - - - - - - - - - - - - - - - - - - - - - - -
- Localiizasção - - Data - - Assunto -
Palácio Presidencial de15 de Julho de 2024 19:00Luanda
Palácio Presidencial de15 de Julho de 2024 19:00Luanda
Palácio Presidencial de15 de Julho de 2024 19:00Luanda
-
- - -
-
-
-

Importante

- Caso tenha recebido esta mensagem por engano, por favor informe por o e-mail: - notificacoes@oapr.gov.ao +
+ Logo +

República De Angola

+

Gabinete do Presidente da República

+

Convite para reunião

+ +
+
+

Agenda da semana

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ Localiizasção + + Data + + Assunto +
Palácio Presidencial de15 de Julho de 2024 19:00Luanda
Palácio Presidencial de15 de Julho de 2024 19:00Luanda
Palácio Presidencial de15 de Julho de 2024 19:00Luanda
+
+ + +
+
+
+

Importante

+ Caso tenha recebido esta mensagem por engano, por favor informe por o e-mail: + notificacoes@oapr.gov.ao +
+
+ +
+ +
-
-
-

   Gabinete Digital - Uma iniciativa do Presidente da República

-
diff --git a/version/evento-revisao.html b/version/evento-revisao.html index c14797080..e7f558418 100644 --- a/version/evento-revisao.html +++ b/version/evento-revisao.html @@ -10,6 +10,7 @@ body { background-color: #f5f7fb; padding: 35px; + margin: 0px; } @@ -65,6 +66,7 @@ .m-auto { margin: 0px auto; } .d-block { display: block; } + .d-flex { display: flex;} .px-40 { padding: 0px 40px; } .pb-40 { padding-bottom: 40px; } @@ -74,75 +76,80 @@ .f-22 { font-size: 22px; } .f-13 { font-size: 13px;} + .f-weight-600 { font-weight: 600; } .ma-15 { margin: 15px; } .text-center { text-align:center } .width-100 { width: 100%; } .text-gray { color: rgb(169, 169, 169); } .link-color { color:rgb(0, 0, 255); } + + +
+
-
- -
- Logo -

República De Angola

-

Gabinete do Presidente da República

-

Convite para reunião

-
- -
-
-
-

Tipo de evento

- Event Type +
+ Logo +

República De Angola

+

Gabinete do Presidente da República

+

Convite para reunião

-
-

Data/Hora

- 15 de Julho de 2024 19:00 +
+
+
+

Tipo de evento

+ Event Type +
+ +
+

Data/Hora

+ 15 de Julho de 2024 19:00 +
+ +
+

Location

+ Luanda +
+ +
+

Participantes

+ Kelson Guilherme +
+ +
+

Assunto

+ Teste +
-
-

Location

- Luanda +
+ +
+
+

Mensagem

+ Teste +
+
+
+ +
+
+

Importante

+ Caso tenha recebido esta mensagem por engano, por favor informe por o e-mail: + notificacoes@oapr.gov.ao +
-
-

Participantes

- Kelson Guilherme -
+
+
+

        Gabinete Digital - Uma iniciativa do Presidente da República

+
-
-

Assunto

- Teste -
-
- -
- -
-
-

Mensagem

- Teste -
-
-
- -
-
-

Importante

- Caso tenha recebido esta mensagem por engano, por favor informe por o e-mail: - notificacoes@oapr.gov.ao -
-
- - -
-

   Gabinete Digital - Uma iniciativa do Presidente da República

-
+
diff --git a/version/git-version.ts b/version/git-version.ts index 2ec4878ed..2d8a35201 100644 --- a/version/git-version.ts +++ b/version/git-version.ts @@ -1,11 +1,11 @@ export let versionData = { - "shortSHA": "6d3887076", - "SHA": "6d3887076102243aa85ee1ff6abb0b00b6bf2771", + "shortSHA": "0e12b5de5", + "SHA": "0e12b5de5e32ff09a2fa53b7f69a9bff30e20d57", "branch": "feature/agenda-api-peter", "lastCommitAuthor": "'Peter Maquiran'", - "lastCommitTime": "'Tue Jul 2 14:16:36 2024 +0100'", - "lastCommitMessage": "git chage", - "lastCommitNumber": "5857", - "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 4 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: src/app/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.html\n\tmodified: src/app/pages/agenda/new-event/new-event.page.ts\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.html\n\tmodified: src/app/shared/agenda/edit-event-to-approve/edit-event-to-approve.page.ts\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.html\n\tmodified: src/app/shared/agenda/edit-event/edit-event.page.ts\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.html\n\tmodified: src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page.ts\n\tmodified: version/Pedido_de_evento 1.html\n\tmodified: version/event-da-semana.html\n\tmodified: version/evento-revisao.html", + "lastCommitTime": "'Wed Jul 3 10:15:53 2024 +0100'", + "lastCommitMessage": "add margin", + "lastCommitNumber": "5858", + "changeStatus": "On branch feature/agenda-api-peter\nYour branch is ahead of 'origin/feature/agenda-api-peter' by 5 commits.\n (use \"git push\" to publish your local commits)\n\nChanges to be committed:\n (use \"git restore --staged ...\" to unstage)\n\tmodified: package-lock.json\n\tmodified: package.json\n\tmodified: src/app/app.module.ts\n\tmodified: src/app/home/home.page.ts\n\tmodified: src/app/models/entiry/agenda/eventList.ts\n\tmodified: src/app/pages/agenda/agenda.page.html\n\tmodified: src/app/pages/agenda/agenda.page.ts\n\tmodified: src/app/pages/agenda/new-event/new-event.page.html\n\tmodified: src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.html\n\tmodified: src/app/pages/gabinete-digital/expediente/book-meeting-modal/book-meeting-modal.page.ts\n\tmodified: src/app/services/Repositorys/Agenda/agenda-data-repository.service.ts\n\tnew file: src/app/services/Repositorys/Agenda/agenda-memory-source.service.ts\n\tmodified: src/app/services/Repositorys/Agenda/utils.ts\n\tmodified: src/app/services/agenda/list-box.service.ts\n\tmodified: src/app/services/chat/chat-system.service.ts\n\tmodified: src/app/services/events.service.ts\n\tmodified: src/app/services/native-notification.service.ts\n\tmodified: src/app/shared/agenda/new-event/new-event.page.html\n\tmodified: src/app/shared/agenda/new-event/new-event.page.ts\n\tmodified: version/event-da-semana.html\n\tmodified: version/evento-revisao.html\n\tmodified: version/git-version.ts", "changeAuthor": "peter.maquiran" } \ No newline at end of file