diff --git a/client/app/admin/events/events/events.component.html b/client/app/admin/events/events/events.component.html index 38a4955a..7b54951b 100644 --- a/client/app/admin/events/events/events.component.html +++ b/client/app/admin/events/events/events.component.html @@ -76,6 +76,6 @@ } -@if (permissionsService.crud?.event.create) { +@if ((permissionsService.crud | async)?.event.create) { } diff --git a/client/app/admin/facilitator-documents/facilitator-documents/facilitator-documents.component.html b/client/app/admin/facilitator-documents/facilitator-documents/facilitator-documents.component.html index c72f4592..385ca440 100644 --- a/client/app/admin/facilitator-documents/facilitator-documents/facilitator-documents.component.html +++ b/client/app/admin/facilitator-documents/facilitator-documents/facilitator-documents.component.html @@ -73,6 +73,6 @@ } -@if (permissionsService.crud?.facilitatorDocument.create) { +@if ((permissionsService.crud | async)?.facilitatorDocument.create) { } diff --git a/client/app/admin/facilitator-documents/facilitator-documents/facilitator-documents.component.ts b/client/app/admin/facilitator-documents/facilitator-documents/facilitator-documents.component.ts index d6a9e4a8..d7cc9a17 100644 --- a/client/app/admin/facilitator-documents/facilitator-documents/facilitator-documents.component.ts +++ b/client/app/admin/facilitator-documents/facilitator-documents/facilitator-documents.component.ts @@ -16,6 +16,7 @@ import {MatIconModule} from '@angular/material/icon'; import {MatTooltipModule} from '@angular/material/tooltip'; import {MatSortModule} from '@angular/material/sort'; import {MatTableModule} from '@angular/material/table'; +import {AsyncPipe} from '@angular/common'; @Component({ selector: 'app-facilitator-documents', @@ -34,6 +35,7 @@ import {MatTableModule} from '@angular/material/table'; MatPaginatorModule, NaturalFixedButtonComponent, RouterLink, + AsyncPipe, ], }) export class FacilitatorDocumentsComponent extends NaturalAbstractList implements OnInit { diff --git a/client/app/admin/newses/newses/newses.component.html b/client/app/admin/newses/newses/newses.component.html index cd46cad4..e24bd940 100644 --- a/client/app/admin/newses/newses/newses.component.html +++ b/client/app/admin/newses/newses/newses.component.html @@ -77,6 +77,6 @@ } -@if (permissionsService.crud?.news.create) { +@if ((permissionsService.crud | async)?.news.create) { } diff --git a/client/app/admin/products/products/products.component.html b/client/app/admin/products/products/products.component.html index 317a7900..9723f153 100644 --- a/client/app/admin/products/products/products.component.html +++ b/client/app/admin/products/products/products.component.html @@ -113,6 +113,6 @@ } -@if (permissionsService.crud?.product.create) { +@if ((permissionsService.crud | async)?.product.create) { } diff --git a/client/app/admin/sessions/sessions/sessions.component.html b/client/app/admin/sessions/sessions/sessions.component.html index e0919a37..23e1747e 100644 --- a/client/app/admin/sessions/sessions/sessions.component.html +++ b/client/app/admin/sessions/sessions/sessions.component.html @@ -96,6 +96,6 @@ } -@if (permissionsService.crud?.session.create) { +@if ((permissionsService.crud | async)?.session.create) { } diff --git a/client/app/admin/users/import/import.component.html b/client/app/admin/users/import/import.component.html index 7e7fecc3..314319e8 100644 --- a/client/app/admin/users/import/import.component.html +++ b/client/app/admin/users/import/import.component.html @@ -9,7 +9,7 @@ {{ routeData.seo.title }} naturalFileDrop accept=".csv" [selectable]="true" - [disabled]="!permissionsService.crud?.organization.create || importing" + [disabled]="!(permissionsService.crud | async)?.organization.create || importing" (filesChange)="uploadFile($event)" > diff --git a/client/app/admin/users/import/import.component.ts b/client/app/admin/users/import/import.component.ts index b9626c58..a6e161a8 100644 --- a/client/app/admin/users/import/import.component.ts +++ b/client/app/admin/users/import/import.component.ts @@ -16,6 +16,7 @@ import {UserService} from '../services/user.service'; import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; import {MatIconModule} from '@angular/material/icon'; import {MatButtonModule} from '@angular/material/button'; +import {AsyncPipe} from '@angular/common'; @Component({ selector: 'app-import', @@ -28,6 +29,7 @@ import {MatButtonModule} from '@angular/material/button'; NaturalIconDirective, MatProgressSpinnerModule, RouterLink, + AsyncPipe, ], }) export class ImportComponent implements OnInit { diff --git a/client/app/admin/users/users/users.component.html b/client/app/admin/users/users/users.component.html index c33983fd..21547619 100644 --- a/client/app/admin/users/users/users.component.html +++ b/client/app/admin/users/users/users.component.html @@ -104,6 +104,6 @@ } -@if (routeData?.isAdmin && permissionsService.crud?.user.create) { +@if (routeData?.isAdmin && (permissionsService.crud | async)?.user.create) { } diff --git a/client/app/front-office/components/comment-list/comment-list.component.html b/client/app/front-office/components/comment-list/comment-list.component.html index b405375e..fed508cf 100644 --- a/client/app/front-office/components/comment-list/comment-list.component.html +++ b/client/app/front-office/components/comment-list/comment-list.component.html @@ -1,5 +1,5 @@ - @if (permissionsService.crud?.comment?.create) { + @if ((permissionsService.crud | async)?.comment?.create) { Rédiger un commentaire diff --git a/client/app/front-office/components/home-block/home-block.component.html b/client/app/front-office/components/home-block/home-block.component.html index 568bced1..3fd10d86 100644 --- a/client/app/front-office/components/home-block/home-block.component.html +++ b/client/app/front-office/components/home-block/home-block.component.html @@ -5,7 +5,7 @@ {{ form.get('buttonLabel')?.value }} - @if (permissionService.crud?.configuration.create) { + @if ((permissionsService.crud | async)?.configuration.create) { ACTUALITÉS - @if (permissionService.crud?.news.create) { + @if ((permissionsService.crud | async)?.news.create) { AGENDA - @if (permissionService.crud?.event.create) { + @if ((permissionsService.crud | async)?.event.create) { ; /** - * Observable of changed permissions. Here we use a ReplaySubject so that new subscriber will get - * the most recent available permissions (useful in route guard) + * Observable of changed permissions */ - public changes = new ReplaySubject(1); + public readonly changes: Observable; private readonly currentContexts = new BehaviorSubject({ user: null, }); public constructor(apollo: Apollo) { - // Query the API when our variables changed - this.currentContexts.pipe(distinctUntilChanged(isEqual), debounceTime(5)).subscribe(() => { - // Fetch global permissions - apollo - .query({ - query: permissionsQuery, - }) - .pipe(filter(result => !result.loading)) - .subscribe(result => { - this.crud = result.data.permissions.crud; - this.changes.next(result.data.permissions); - }); - }); - } - - public setUser(user: Literal | null): Observable { - const newContexts = { - user: user ? user.id : null, - }; + // Query the API whenever our variables change + const fetch = this.currentContexts.pipe( + distinctUntilChanged(isEqual), + debounceTime(5), + concatMap(() => + apollo.query({query: permissionsQuery}).pipe(filter(result => !result.loading)), + ), + shareReplay(), // new subscriber will get the most recent available permissions + ); - return this.setNewContexts(newContexts); + this.crud = fetch.pipe(map(result => result.data.permissions.crud)); + this.changes = fetch.pipe(map(result => result.data.permissions)); } /** * Return an observable that will complete as soon as the next permissions are available */ - private setNewContexts(newContexts: Contexts): Observable { - if (isEqual(this.currentContexts.value, newContexts) && this.crud) { - return of({ - __typename: 'AllPermissions', - crud: this.crud, - }); - } else { - this.currentContexts.next(newContexts); + private setNewContexts(newContexts: Contexts): void { + this.currentContexts.next(newContexts); + } + + public setUser(user: Literal | null): void { + const newContexts = { + user: user ? user.id : null, + }; - return this.changes.pipe(skip(1), take(1)); - } + this.setNewContexts(newContexts); } }