mirror of
https://code.equilibrium.co.ao/ITO/doneit-web.git
synced 2026-04-18 20:47:54 +00:00
edit actions and video stop
This commit is contained in:
@@ -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" />
|
||||||
|
|||||||
Generated
+11
@@ -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",
|
||||||
|
|||||||
@@ -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();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user