Merge branch 'feature/shared-content' of https://bitbucket.org/equilibriumito/gabinete-digital-fo into feature/shared-content

This commit is contained in:
Eudes Inácio
2023-12-13 17:09:08 +01:00
13 changed files with 251 additions and 19 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.gpr.gabinetedigital">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
+11
View File
@@ -151,6 +151,7 @@
"lite-server": "^2.6.1", "lite-server": "^2.6.1",
"minisearch": "^6.0.1", "minisearch": "^6.0.1",
"moment": "^2.29.3", "moment": "^2.29.3",
"neverthrow": "^6.1.0",
"ng-lazyload-image": "^9.1.2", "ng-lazyload-image": "^9.1.2",
"ng2-pdf-viewer": "^3.0.8", "ng2-pdf-viewer": "^3.0.8",
"ngx-cookie-service": "^12.0.3", "ngx-cookie-service": "^12.0.3",
@@ -26954,6 +26955,11 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
}, },
"node_modules/neverthrow": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/neverthrow/-/neverthrow-6.1.0.tgz",
"integrity": "sha512-xNbNjp/6M5vUV+mststgneJN9eJeJCDSYSBTaf3vxgvcKooP+8L0ATFpM8DGfmH7UWKJeoa24Qi33tBP9Ya3zA=="
},
"node_modules/next-tick": { "node_modules/next-tick": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
@@ -64285,6 +64291,11 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
}, },
"neverthrow": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/neverthrow/-/neverthrow-6.1.0.tgz",
"integrity": "sha512-xNbNjp/6M5vUV+mststgneJN9eJeJCDSYSBTaf3vxgvcKooP+8L0ATFpM8DGfmH7UWKJeoa24Qi33tBP9Ya3zA=="
},
"next-tick": { "next-tick": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+1
View File
@@ -165,6 +165,7 @@
"lite-server": "^2.6.1", "lite-server": "^2.6.1",
"minisearch": "^6.0.1", "minisearch": "^6.0.1",
"moment": "^2.29.3", "moment": "^2.29.3",
"neverthrow": "^6.1.0",
"ng-lazyload-image": "^9.1.2", "ng-lazyload-image": "^9.1.2",
"ng2-pdf-viewer": "^3.0.8", "ng2-pdf-viewer": "^3.0.8",
"ngx-cookie-service": "^12.0.3", "ngx-cookie-service": "^12.0.3",
@@ -1,5 +1,5 @@
import { Directive, ElementRef, Input } from '@angular/core'; import { Directive, ElementRef, Input } from '@angular/core';
import { StopvideoService } from "src/app/services/stopvideo.service";
@Directive({ @Directive({
selector: '[appVisibility]' selector: '[appVisibility]'
}) })
@@ -8,7 +8,10 @@ export class VisibilityDirective {
intersectionObserver: IntersectionObserver; intersectionObserver: IntersectionObserver;
@Input() appVisibility: (arg: any) => void; @Input() appVisibility: (arg: any) => void;
constructor(private elementRef: ElementRef) { constructor(
private elementRef: ElementRef,
private stopvideoService: StopvideoService
) {
const options = { const options = {
root: null, root: null,
rootMargin: '0px', rootMargin: '0px',
@@ -16,12 +19,13 @@ export class VisibilityDirective {
}; };
console.log(this.elementRef.nativeElement.parentElement, "=1=") // this.stopvideoService.registerVideo()
this.intersectionObserver = new IntersectionObserver(entries => { this.intersectionObserver = new IntersectionObserver(entries => {
entries.forEach(entry => { entries.forEach(entry => {
if (entry.isIntersecting) { if (entry.isIntersecting) {
this.appVisibility(true); this.appVisibility(true);
this.stopvideoService.registerVideo(this.elementRef.nativeElement);
} else { } else {
this.elementRef.nativeElement.pause() this.elementRef.nativeElement.pause()
// Pause video when not visible // Pause video when not visible
@@ -1,4 +1,5 @@
import { Directive, ElementRef, Input } from '@angular/core'; import { Directive, ElementRef, Input } from '@angular/core';
import { StopvideoService } from '../stopvideo.service';
@Directive({ @Directive({
selector: '[appVisibility]' selector: '[appVisibility]'
@@ -8,7 +9,10 @@ export class VisibilityDirective {
intersectionObserver: IntersectionObserver; intersectionObserver: IntersectionObserver;
@Input() appVisibility: (arg: any) => void; @Input() appVisibility: (arg: any) => void;
constructor(private elementRef: ElementRef) { constructor(
private elementRef: ElementRef,
private stopvideoService: StopvideoService
) {
const options = { const options = {
root: null, root: null,
rootMargin: '0px', rootMargin: '0px',
@@ -16,12 +20,11 @@ export class VisibilityDirective {
}; };
console.log(this.elementRef.nativeElement.parentElement, "=1=")
this.intersectionObserver = new IntersectionObserver(entries => { this.intersectionObserver = new IntersectionObserver(entries => {
entries.forEach(entry => { entries.forEach(entry => {
if (entry.isIntersecting) { if (entry.isIntersecting) {
this.appVisibility(true); this.appVisibility(true);
this.stopvideoService.registerVideo(this.elementRef.nativeElement)
} else { } else {
this.elementRef.nativeElement.pause() this.elementRef.nativeElement.pause()
// Pause video when not visible // Pause video when not visible
@@ -1,6 +1,6 @@
import { HttpClient, HttpContext, HttpHeaders, HttpParams } from '@angular/common/http'; import { HttpContext, HttpHeaders, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
// import { Result, err, ok } from 'neverthrow' import { HttpClient, HttpResponse, HttpErrorResponse } from '@angular/common/http';
import { tap, shareReplay, catchError } from "rxjs/operators"; import { tap, shareReplay, catchError } from "rxjs/operators";
import { Observable, of } from "rxjs"; import { Observable, of } from "rxjs";
@@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { StopvideoService } from './stopvideo.service';
describe('StopvideoService', () => {
let service: StopvideoService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(StopvideoService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});
+45
View File
@@ -0,0 +1,45 @@
import { Injectable } from '@angular/core';
import { NavigationEnd, Router } from '@angular/router';
@Injectable({
providedIn: 'root'
})
export class StopvideoService {
video: HTMLVideoElement[] = []
constructor(
private router: Router
) {
this.router.events.forEach((event) => {
if (event instanceof NavigationEnd && !event.url.includes('/home/publications')) {
this.stopAndRemoveAllVideos();
}
});
}
registerVideo(tagVideo: HTMLVideoElement) {
this.video.push(tagVideo);
}
stopAndRemoveAllVideos() {
for (let i = 0; i < this.video.length; i++) {
const video = this.video[i];
// Pause the video
video.pause();
// Optionally, you can also reset the current time to start from the beginning
video.currentTime = 0;
// Remove the video from the array
this.video.splice(i, 1);
// Decrement the index to properly continue the loop
i--;
}
}
}
+99 -1
View File
@@ -1,5 +1,103 @@
export interface refreshToken { export interface refreshTokenDTO {
Authorization: string, Authorization: string,
refreshToken: null refreshToken: null
} }
export interface EventsDTO {
HasAttachments: boolean
IsAllDayEvent: boolean
EventId: string
Subject: string
Location: string
CalendarId: string
CalendarName: string
StartDate: string
EndDate: string
Schedule: string
RequiredAttendees: any
OptionalAttendees: any
HumanDate: string
TimeZone: string
IsPrivate: boolean
}
export interface EventDetailsDTO {
HasAttachments: boolean
EventComunicationId: number
EventId: string
Subject: string
Body: EventDetailsBody
Location: string
CalendarId: string
CalendarName: string
StartDate: string
EndDate: string
EventType: string
Attendees: EventDetailsAttendee[]
IsMeeting: boolean
IsRecurring: boolean
IsAllDayEvent: boolean
AppointmentState: number
TimeZone: string
Organizer: EventDetailsOrganizer
InstanceId: any
Category: string
EventRecurrence: EventDetailsEventRecurrence
Attachments: EventDetailsAttachment[]
IsPrivate: boolean
}
interface EventDetailsBodyDTO {
BodyType: number
Text: string
}
interface EventDetailsAttendee {
Id: number
EmailAddress: string
Name: string
IsRequired: boolean
UserType: string
IsPR: boolean
Entity: any
Acknowledgment: boolean
RoleDescription: any
}
interface EventDetailsOrganizer {
Id: number
EmailAddress: string
Name: string
IsRequired: boolean
UserType: any
IsPR: boolean
Entity: any
Acknowledgment: boolean
RoleDescription: any
}
interface EventDetailsEventRecurrence {
Type: number
Day: any
DayOfWeek: any
Month: any
LastOccurrence: any
}
interface EventDetailsAttachment {
Id: number
ParentId: string
Source: number
SourceId: string
Description: string
SourceName: string
CreateDate: string
Stakeholders: string
Link: string
Data: any
ApplicationId: number
FileSize: number
}
@@ -1,8 +1,16 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { environment } from 'src/environments/environment'; import { environment } from 'src/environments/environment';
import { HttpServiceService } from 'src/app/services/http/http-service.service'; import { HttpServiceService } from 'src/app/services/http/http-service.service';
import { Observable } from "rxjs"; import { Observable} from 'rxjs';
import { refreshToken } from "./interface" import { EventsDTO, refreshTokenDTO } from "./interface";
import { HttpParams } from '@angular/common/http';
import { DetectCalendars, makeHeaderForCalendar } from '../../utils/utils';
import { z } from "zod";
import { ok, err } from 'neverthrow';
// let a = z
// let b = ok
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
@@ -12,12 +20,42 @@ export class MiddlewareServiceService {
private HttpServiceService: HttpServiceService, private HttpServiceService: HttpServiceService,
) {} ) {}
refreshToken(refreshToken: string): Observable<refreshTokenDTO> {
refreshToken(refreshToken: string): Observable<refreshToken> {
const data = { const data = {
refreshToken: refreshToken refreshToken: refreshToken
} }
return this.HttpServiceService.put(environment.apiURL + "UserAuthentication/RefreshToken", data, {}) return this.HttpServiceService.put(environment.apiURL + "UserAuthentication/RefreshToken", data, {})
// .pipe(
// map((response: HttpResponse<refreshToken>) => {
// return response.body
// })
// );
} }
// ================================ Calendar =================================================
GetEvents(startDate: string, endDate: string, calendarId): Observable<EventsDTO[]> {
let geturl = environment.apiURL + 'calendar/GetEvents';
geturl = geturl.replace('/V4/', '/V5/')
let params = new HttpParams();
params = params.set("StartDate", startDate);
params = params.set("EndDate", endDate);
const calendar = DetectCalendars(calendarId)
const header = makeHeaderForCalendar(calendar)
let options = {
headers: header,
params: params
};
// return this.HttpServiceService.get<Event[]>(`${geturl}`, options);
return {} as any
}
} }
@@ -68,7 +68,7 @@
displayFormat="D MMM YYYY H:mm" displayFormat="D MMM YYYY H:mm"
minuteValues="0,5,10,15,20,25,30,35,40,45,50,55" minuteValues="0,5,10,15,20,25,30,35,40,45,50,55"
monthShortNames="Jan, Fev, Mar, Abr, Mai, Jun, Jul, Aug, Sep, Out, Nov, Dez" monthShortNames="Jan, Fev, Mar, Abr, Mai, Jun, Jul, Aug, Sep, Out, Nov, Dez"
min="{{endMinDate}}" min="{{minDate}}"
max="2025"> max="2025">
</ion-datetime> </ion-datetime>
@@ -104,10 +104,9 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</ion-content> </ion-content>
<ion-footer class="ion-no-border"> <ion-footer class="ion-no-border">
@@ -41,7 +41,7 @@ export class EditActionPage implements OnInit {
public touchUi = false; public touchUi = false;
public enableMeridian = false; public enableMeridian = false;
public minDate = new Date().toISOString().slice(0,10) public minDate = new Date().toISOString().slice(0,10)
public endMinDate = new Date(new Date().getTime() + 15 * 60000); public endMinDate = new Date(new Date().getTime() + 15 * 60000).toISOString().slice(0,10)
public maxDate: any; public maxDate: any;
public stepHour = 1; public stepHour = 1;
public stepMinute = 15; public stepMinute = 15;
+17
View File
@@ -0,0 +1,17 @@
import { HttpHeaders } from "@angular/common/http";
import { calendarInterface } from "src/app/models/user.model";
import { SessionStore } from "src/app/store/session.service";
export function DetectCalendars(CalendarId) {
const calendars = SessionStore.user.OwnerCalendars.concat(SessionStore.user.SharedCalendars)
return calendars.find((e) => e.CalendarId == CalendarId)
}
export function makeHeaderForCalendar(calendar: calendarInterface) {
let header = new HttpHeaders();;
header = header.set('Authorization', 'Bearer ' + SessionStore.user.Authorization);
header = header.set('CalendarId', calendar.CalendarId);
header = header.set('CalendarRoleId', calendar.CalendarRoleId);
header = header.set('CalendarName', calendar.CalendarName);
return header
}