Redo guards
This commit is contained in:
parent
e016345e31
commit
638695d0d4
@ -7,6 +7,7 @@ import { RouteReuseStrategy, RouterModule, Routes } from '@angular/router';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { DownloadsListScreenComponent } from '@components/downloads-list-screen/downloads-list-screen.component';
|
||||
import { AppStateGuard } from '@state/app-state.guard';
|
||||
import { DossiersGuard } from '@guards/dossiers.guard';
|
||||
|
||||
const routes: Routes = [
|
||||
{
|
||||
@ -35,7 +36,7 @@ const routes: Routes = [
|
||||
loadChildren: () => import('./modules/dossier/dossiers.module').then(m => m.DossiersModule),
|
||||
canActivate: [CompositeRouteGuard],
|
||||
data: {
|
||||
routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard],
|
||||
routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard, DossiersGuard],
|
||||
requiredRoles: ['RED_USER', 'RED_MANAGER'],
|
||||
},
|
||||
},
|
||||
|
||||
@ -1,36 +1,32 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ActivatedRouteSnapshot, CanActivate, CanDeactivate, Router, RouterStateSnapshot } from '@angular/router';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { BreadcrumbsService } from '@services/breadcrumbs.service';
|
||||
import { DossiersService } from '../services/entity-services/dossiers.service';
|
||||
import { BreadcrumbsService } from '../services/breadcrumbs.service';
|
||||
import { pluck } from 'rxjs/operators';
|
||||
import { LoadingService } from '@iqser/common-ui';
|
||||
import { AppStateService } from '../state/app-state.service';
|
||||
import { FilesMapService } from '../services/entity-services/files-map.service';
|
||||
|
||||
@Injectable()
|
||||
export class DossiersGuard implements CanActivate, CanDeactivate<unknown> {
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class DossierFilesGuard implements CanActivate, CanDeactivate<unknown> {
|
||||
constructor(
|
||||
private readonly _dossiersService: DossiersService,
|
||||
private readonly _loadingService: LoadingService,
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _breadcrumbsService: BreadcrumbsService,
|
||||
private readonly _filesMapService: FilesMapService,
|
||||
private readonly _router: Router,
|
||||
) {}
|
||||
|
||||
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
|
||||
if (state.url === '/main/dossiers') {
|
||||
this._breadcrumbsService.hideGoBack();
|
||||
return true;
|
||||
async canActivate(route: ActivatedRouteSnapshot): Promise<boolean> {
|
||||
const dossierId = route.paramMap.get('dossierId');
|
||||
const dossier = this._dossiersService.find(dossierId);
|
||||
|
||||
if (!dossier) {
|
||||
await this._router.navigate(['/main', 'dossiers']);
|
||||
return false;
|
||||
}
|
||||
|
||||
const dossierId = route.paramMap.get('dossierId');
|
||||
|
||||
if (!this._dossiersService.find(dossierId)) {
|
||||
this._loadingService.start();
|
||||
await this._dossiersService.loadAll().toPromise();
|
||||
this._loadingService.stop();
|
||||
|
||||
if (!this._dossiersService.find(dossierId)) {
|
||||
await this._router.navigate(['/main', 'dossiers']);
|
||||
return false;
|
||||
}
|
||||
if (!this._filesMapService.has(dossierId)) {
|
||||
await this._appStateService.getFiles(dossier);
|
||||
}
|
||||
|
||||
this._breadcrumbsService.append({
|
||||
33
apps/red-ui/src/app/guards/dossiers.guard.ts
Normal file
33
apps/red-ui/src/app/guards/dossiers.guard.ts
Normal file
@ -0,0 +1,33 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ActivatedRouteSnapshot, CanActivate, CanDeactivate, Router, RouterStateSnapshot } from '@angular/router';
|
||||
import { DossiersService } from '../services/entity-services/dossiers.service';
|
||||
import { BreadcrumbsService } from '../services/breadcrumbs.service';
|
||||
import { AppStateService } from '../state/app-state.service';
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class DossiersGuard implements CanActivate, CanDeactivate<unknown> {
|
||||
constructor(
|
||||
private readonly _dossiersService: DossiersService,
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _breadcrumbsService: BreadcrumbsService,
|
||||
private readonly _router: Router,
|
||||
) {}
|
||||
|
||||
async canActivate(): Promise<boolean> {
|
||||
await this._dossiersService.loadAll().toPromise();
|
||||
this._breadcrumbsService.hideGoBack();
|
||||
return true;
|
||||
}
|
||||
|
||||
canDeactivate(
|
||||
component: unknown,
|
||||
currentRoute: ActivatedRouteSnapshot,
|
||||
currentState: RouterStateSnapshot,
|
||||
nextState?: RouterStateSnapshot,
|
||||
) {
|
||||
if (!nextState.url.startsWith('/main/dossiers')) {
|
||||
this._breadcrumbsService.showGoBack();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -1,20 +1,18 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ActivatedRouteSnapshot, CanActivate, CanDeactivate, Router, RouterStateSnapshot } from '@angular/router';
|
||||
import { FilesMapService } from '@services/entity-services/files-map.service';
|
||||
import { AppStateService } from '@state/app-state.service';
|
||||
import { DossiersService } from '@services/entity-services/dossiers.service';
|
||||
import { BreadcrumbsService } from '@services/breadcrumbs.service';
|
||||
import { FilesMapService } from '../services/entity-services/files-map.service';
|
||||
import { AppStateService } from '../state/app-state.service';
|
||||
import { DossiersService } from '../services/entity-services/dossiers.service';
|
||||
import { BreadcrumbsService } from '../services/breadcrumbs.service';
|
||||
import { pluck } from 'rxjs/operators';
|
||||
import { LoadingService } from '@iqser/common-ui';
|
||||
|
||||
@Injectable()
|
||||
export class FilesGuard implements CanActivate, CanDeactivate<unknown> {
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class FilePreviewGuard implements CanActivate, CanDeactivate<unknown> {
|
||||
constructor(
|
||||
private readonly _filesMapService: FilesMapService,
|
||||
private readonly _dossiersService: DossiersService,
|
||||
private readonly _appStateService: AppStateService,
|
||||
private readonly _breadcrumbsService: BreadcrumbsService,
|
||||
private readonly _loadingService: LoadingService,
|
||||
private readonly _router: Router,
|
||||
) {}
|
||||
|
||||
@ -22,16 +20,11 @@ export class FilesGuard implements CanActivate, CanDeactivate<unknown> {
|
||||
const dossierId = route.paramMap.get('dossierId');
|
||||
const fileId = route.paramMap.get('fileId');
|
||||
|
||||
if (!this._filesMapService.get(dossierId, fileId)) {
|
||||
this._loadingService.start();
|
||||
const dossier = this._dossiersService.find(dossierId);
|
||||
await this._appStateService.getFiles(dossier);
|
||||
this._loadingService.stop();
|
||||
const dossier = this._dossiersService.find(dossierId);
|
||||
|
||||
if (!this._filesMapService.get(dossierId, fileId)) {
|
||||
await this._router.navigate([dossier.routerLink]);
|
||||
return false;
|
||||
}
|
||||
if (!this._filesMapService.get(dossierId, fileId)) {
|
||||
await this._router.navigate([dossier.routerLink]);
|
||||
return false;
|
||||
}
|
||||
|
||||
this._breadcrumbsService.append({
|
||||
@ -52,10 +45,6 @@ export class FilesGuard implements CanActivate, CanDeactivate<unknown> {
|
||||
const fileId = currentRoute.paramMap.get('fileId');
|
||||
this._breadcrumbsService.remove(['/main', 'dossiers', dossierId, 'file', fileId]);
|
||||
|
||||
if (!nextState.root.paramMap.get('dossierId')) {
|
||||
this._breadcrumbsService.remove(['/main', 'dossiers', dossierId]);
|
||||
}
|
||||
|
||||
if (!nextState.url.startsWith('/main/dossiers')) {
|
||||
this._breadcrumbsService.showGoBack();
|
||||
}
|
||||
@ -2,9 +2,10 @@ import { NgModule } from '@angular/core';
|
||||
import { RouterModule, Routes } from '@angular/router';
|
||||
import { SearchScreenComponent } from './screens/search-screen/search-screen.component';
|
||||
import { FilePreviewScreenComponent } from './screens/file-preview-screen/file-preview-screen.component';
|
||||
import { FilesGuard } from './guards/file.guard';
|
||||
import { DossiersGuard } from './guards/dossiers.guard';
|
||||
import { FilePreviewGuard } from '../../guards/file-preview.guard';
|
||||
import { DossierFilesGuard } from '../../guards/dossier-files-guard';
|
||||
import { GoBackGuard } from '@guards/go-back-guard.service';
|
||||
import { CompositeRouteGuard } from '@iqser/common-ui';
|
||||
|
||||
const routes: Routes = [
|
||||
{
|
||||
@ -15,25 +16,27 @@ const routes: Routes = [
|
||||
},
|
||||
{
|
||||
path: ':dossierId',
|
||||
canActivate: [DossiersGuard],
|
||||
canDeactivate: [DossiersGuard],
|
||||
canActivate: [CompositeRouteGuard],
|
||||
canDeactivate: [DossierFilesGuard],
|
||||
data: {
|
||||
routeGuards: [DossierFilesGuard],
|
||||
},
|
||||
loadChildren: () => import('./screens/dossier-overview/dossier-overview.module').then(m => m.DossierOverviewModule),
|
||||
},
|
||||
{
|
||||
path: ':dossierId/file/:fileId',
|
||||
component: FilePreviewScreenComponent,
|
||||
canActivate: [DossiersGuard, FilesGuard],
|
||||
canDeactivate: [FilesGuard],
|
||||
canActivate: [CompositeRouteGuard],
|
||||
data: {
|
||||
routeGuards: [DossierFilesGuard, FilePreviewGuard],
|
||||
reuse: true,
|
||||
},
|
||||
canDeactivate: [FilePreviewGuard],
|
||||
},
|
||||
{
|
||||
path: '',
|
||||
pathMatch: 'full',
|
||||
loadChildren: () => import('./screens/dossiers-listing/dossiers-listing.module').then(m => m.DossiersListingModule),
|
||||
canActivate: [DossiersGuard],
|
||||
canDeactivate: [DossiersGuard],
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
@ -42,8 +42,6 @@ import { PlatformSearchService } from './shared/services/platform-search.service
|
||||
import { ResizeAnnotationDialogComponent } from './dialogs/resize-annotation-dialog/resize-annotation-dialog.component';
|
||||
import { BreadcrumbsService } from '@services/breadcrumbs.service';
|
||||
import { of } from 'rxjs';
|
||||
import { FilesGuard } from './guards/file.guard';
|
||||
import { DossiersGuard } from './guards/dossiers.guard';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
const screens = [FilePreviewScreenComponent, SearchScreenComponent];
|
||||
@ -95,7 +93,7 @@ const services = [
|
||||
|
||||
@NgModule({
|
||||
declarations: [...components],
|
||||
providers: [...services, FilesGuard, DossiersGuard],
|
||||
providers: [...services],
|
||||
imports: [CommonModule, SharedModule, SharedDossiersModule, FileUploadDownloadModule, DossiersRoutingModule, OverlayModule],
|
||||
})
|
||||
export class DossiersModule {
|
||||
|
||||
@ -135,7 +135,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
|
||||
return this._fileInput.nativeElement.click();
|
||||
}
|
||||
|
||||
await this.calculateData();
|
||||
this._loadEntitiesFromState();
|
||||
|
||||
if (action === 'navigate') {
|
||||
await this._router.navigate([file.routerLink]);
|
||||
@ -147,7 +147,7 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
|
||||
lastOpenedFn = (file: File) => this._userPreferenceService.getLastOpenedFileForDossier(file.dossierId) === file.id;
|
||||
|
||||
async ngOnInit(): Promise<void> {
|
||||
await this._loadEntitiesFromState();
|
||||
this._loadEntitiesFromState();
|
||||
|
||||
this.addSubscription = this._fileMapService
|
||||
.get$(this.dossierId)
|
||||
@ -159,8 +159,6 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
|
||||
|
||||
this._fileDropOverlayService.initFileDropHandling(this.dossierId);
|
||||
|
||||
await this.calculateData();
|
||||
|
||||
this.addSubscription = timer(CHANGED_CHECK_INTERVAL, CHANGED_CHECK_INTERVAL)
|
||||
.pipe(
|
||||
switchMap(() => this._filesService.hasChanges$(this.dossierId)),
|
||||
@ -212,11 +210,6 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
|
||||
this._computeAllFilters();
|
||||
}
|
||||
|
||||
async calculateData(): Promise<void> {
|
||||
await this._loadEntitiesFromState();
|
||||
this._computeAllFilters();
|
||||
}
|
||||
|
||||
@HostListener('drop', ['$event'])
|
||||
onDrop(event: DragEvent): void {
|
||||
const currentDossier = this._dossiersService.find(this.dossierId);
|
||||
@ -237,12 +230,9 @@ export class DossierOverviewScreenComponent extends ListingComponent<File> imple
|
||||
recentlyModifiedChecker = (file: File) =>
|
||||
moment(file.lastUpdated).add(this._appConfigService.values.RECENT_PERIOD_IN_HOURS, 'hours').isAfter(moment());
|
||||
|
||||
private async _loadEntitiesFromState() {
|
||||
private _loadEntitiesFromState() {
|
||||
this.currentDossier = this._dossiersService.find(this.dossierId);
|
||||
if (!this._fileMapService.has(this.dossierId)) {
|
||||
this._loadingService.start();
|
||||
await this._appStateService.getFiles(this.currentDossier);
|
||||
}
|
||||
this._computeAllFilters();
|
||||
}
|
||||
|
||||
private async _uploadFiles(files: FileUploadModel[]) {
|
||||
|
||||
@ -125,7 +125,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
|
||||
private readonly _userPreferenceService: UserPreferenceService,
|
||||
) {
|
||||
super();
|
||||
_loadingService.start();
|
||||
this.dossierId = _activatedRoute.snapshot.paramMap.get('dossierId');
|
||||
this.dossier$ = _dossiersService.getEntityChanged$(this.dossierId);
|
||||
this.fileId = _activatedRoute.snapshot.paramMap.get('fileId');
|
||||
@ -275,7 +274,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
|
||||
this.fileActions.reanalyseFile();
|
||||
}
|
||||
|
||||
this._loadingService.stop();
|
||||
this.displayPDFViewer = true;
|
||||
}
|
||||
|
||||
|
||||
@ -30,26 +30,7 @@ export class AppStateGuard implements CanActivate {
|
||||
await this._appStateService.loadDictionaryDataIfNecessary();
|
||||
}
|
||||
|
||||
if (this._userService.currentUser.isUser) {
|
||||
await this._dossiersService.loadAll().toPromise();
|
||||
}
|
||||
|
||||
const { dossierId, fileId, dossierTemplateId, type } = route.params;
|
||||
|
||||
const dossier = this._dossiersService.find(dossierId);
|
||||
if (dossierId && !dossier) {
|
||||
await this._router.navigate(['main', 'dossiers']);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (fileId && this._filesMapService.get(dossierId).length === 0) {
|
||||
await this._appStateService.getFiles(dossier);
|
||||
}
|
||||
|
||||
if (fileId && !this._filesMapService.get(dossierId, fileId)) {
|
||||
await this._router.navigate([dossier.routerLink]);
|
||||
return false;
|
||||
}
|
||||
const { dossierTemplateId, type } = route.params;
|
||||
|
||||
if (dossierTemplateId && !this._dossierTemplatesService.find(dossierTemplateId)) {
|
||||
await this._router.navigate(['main', 'admin', 'dossier-templates']);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user