diff --git a/apps/red-ui/src/app/app-routing.module.ts b/apps/red-ui/src/app/app-routing.module.ts
index 5eb70338e..ccf478b4b 100644
--- a/apps/red-ui/src/app/app-routing.module.ts
+++ b/apps/red-ui/src/app/app-routing.module.ts
@@ -1,22 +1,12 @@
import { AuthErrorComponent } from '@components/auth-error/auth-error.component';
-import {
- CompositeRouteGuard,
- CustomRouteReuseStrategy,
- DEFAULT_REDIRECT_KEY,
- ifLoggedIn,
- ifNotLoggedIn,
- IqserAuthGuard,
- IqserPermissionsGuard,
- IqserRoutes,
- TenantSelectComponent,
-} from '@iqser/common-ui';
+import { CompositeRouteGuard, DEFAULT_REDIRECT_KEY, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui';
import { RedRoleGuard } from '@users/red-role.guard';
import { BaseScreenComponent } from '@components/base-screen/base-screen.component';
import { RouteReuseStrategy, RouterModule } from '@angular/router';
import { NgModule } from '@angular/core';
import { DownloadsListScreenComponent } from '@components/downloads-list-screen/downloads-list-screen.component';
-import { DossiersGuard } from '@guards/dossiers.guard';
-import { ACTIVE_DOSSIERS_SERVICE, ARCHIVED_DOSSIERS_SERVICE } from './tokens';
+import { loadActiveDossiersGuard, loadAllDossiersGuard, loadArchivedDossiersGuard } from '@guards/dossiers.guard';
+import { ACTIVE_DOSSIERS_SERVICE } from './tokens';
import { FeaturesGuard } from '@guards/features-guard.service';
import { DossierTemplatesGuard } from '@guards/dossier-templates.guard';
import { templateExistsWhenEnteringDossierList } from '@guards/dossier-template-exists.guard';
@@ -24,17 +14,20 @@ import { DashboardGuard } from '@guards/dashboard-guard.service';
import { TrashGuard } from '@guards/trash.guard';
import { ARCHIVE_ROUTE, BreadcrumbTypes, DOSSIER_ID, DOSSIER_TEMPLATE_ID, DOSSIERS_ARCHIVE, DOSSIERS_ROUTE, FILE_ID } from '@red/domain';
import { DossierFilesGuard } from '@guards/dossier-files-guard';
-import { WebViewerLoadedGuard } from './modules/pdf-viewer/services/webviewer-loaded.guard';
+import { webViewerLoadedGuard } from './modules/pdf-viewer/services/webviewer-loaded.guard';
import { Roles } from '@users/roles';
import { mainResolver } from '@utils/main.resolver';
+import { hasAnyRoleGuard, IqserAuthGuard } from '@iqser/common-ui/lib/users';
+import { CustomRouteReuseStrategy } from '@iqser/common-ui/lib/utils';
+import { ifLoggedIn } from '@guards/if-logged-in.guard';
+import { ifNotLoggedIn } from '@guards/if-not-logged-in.guard';
+import { TenantSelectComponent } from '@iqser/common-ui/lib/tenants';
const dossierTemplateIdRoutes: IqserRoutes = [
{
path: `${DOSSIERS_ROUTE}`,
- canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
+ canActivate: [loadActiveDossiersGuard(), IqserPermissionsGuard],
data: {
- routeGuards: [DossiersGuard],
- dossiersService: ACTIVE_DOSSIERS_SERVICE,
permissions: {
allow: [Roles.files.readStatus],
redirectTo: '/auth-error',
@@ -58,9 +51,9 @@ const dossierTemplateIdRoutes: IqserRoutes = [
},
{
path: `:${DOSSIER_ID}/file/:${FILE_ID}`,
- canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
+ canActivate: [CompositeRouteGuard, IqserPermissionsGuard, webViewerLoadedGuard()],
data: {
- routeGuards: [DossierFilesGuard, WebViewerLoadedGuard],
+ routeGuards: [DossierFilesGuard],
breadcrumbs: [BreadcrumbTypes.dossierTemplate, BreadcrumbTypes.dossier, BreadcrumbTypes.file],
dossiersService: ACTIVE_DOSSIERS_SERVICE,
permissions: {
@@ -83,10 +76,9 @@ const dossierTemplateIdRoutes: IqserRoutes = [
{
path: `${ARCHIVE_ROUTE}`,
loadChildren: () => import('./modules/archive/archive.module').then(m => m.ArchiveModule),
- canActivate: [CompositeRouteGuard, WebViewerLoadedGuard],
+ canActivate: [CompositeRouteGuard, webViewerLoadedGuard(), loadArchivedDossiersGuard()],
data: {
- routeGuards: [FeaturesGuard, DossiersGuard],
- dossiersService: ARCHIVED_DOSSIERS_SERVICE,
+ routeGuards: [FeaturesGuard],
features: [DOSSIERS_ARCHIVE],
},
},
@@ -155,9 +147,9 @@ const mainRoutes: IqserRoutes = [
{
path: 'search',
loadChildren: () => import('./modules/search/search.module').then(m => m.SearchModule),
- canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
+ canActivate: [CompositeRouteGuard, IqserPermissionsGuard, loadAllDossiersGuard()],
data: {
- routeGuards: [IqserAuthGuard, RedRoleGuard, DossiersGuard],
+ routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [Roles.search],
redirectTo: '/auth-error',
@@ -167,10 +159,9 @@ const mainRoutes: IqserRoutes = [
{
path: 'trash',
loadChildren: () => import('./modules/trash/trash.module').then(m => m.TrashModule),
- canActivate: [CompositeRouteGuard, IqserPermissionsGuard],
+ canActivate: [CompositeRouteGuard, IqserPermissionsGuard, loadActiveDossiersGuard()],
data: {
- routeGuards: [IqserAuthGuard, RedRoleGuard, DossiersGuard, TrashGuard],
- dossiersService: ACTIVE_DOSSIERS_SERVICE,
+ routeGuards: [IqserAuthGuard, RedRoleGuard, TrashGuard],
permissions: {
allow: [Roles.dossiers.read, Roles.files.readStatus],
redirectTo: '/auth-error',
@@ -182,7 +173,7 @@ const mainRoutes: IqserRoutes = [
children: dossierTemplateIdRoutes,
canActivate: [CompositeRouteGuard, IqserPermissionsGuard, templateExistsWhenEnteringDossierList()],
data: {
- routeGuards: [IqserAuthGuard, RedRoleGuard, DossierTemplatesGuard, DashboardGuard],
+ routeGuards: [IqserAuthGuard, RedRoleGuard],
permissions: {
allow: [
Roles.any,
@@ -210,7 +201,7 @@ const routes: IqserRoutes = [
{
path: '',
pathMatch: 'full',
- canActivate: [ifNotLoggedIn],
+ canActivate: [ifNotLoggedIn()],
component: TenantSelectComponent,
},
{
@@ -220,7 +211,7 @@ const routes: IqserRoutes = [
},
{
path: ':tenant/main',
- canActivate: [ifLoggedIn],
+ canActivate: [ifLoggedIn()],
component: BaseScreenComponent,
resolve: {
whateverThisMainRouteNeeds: mainResolver,
@@ -230,7 +221,7 @@ const routes: IqserRoutes = [
{
path: ':tenant/auth-error',
component: AuthErrorComponent,
- canActivate: [IqserAuthGuard],
+ canActivate: [hasAnyRoleGuard()],
},
{
path: '**',
diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts
index e4d0d0f72..944d621cd 100644
--- a/apps/red-ui/src/app/app.module.ts
+++ b/apps/red-ui/src/app/app.module.ts
@@ -9,7 +9,6 @@ import {
CachingModule,
ChevronButtonComponent,
CircleButtonComponent,
- CommonUiModule,
EmptyStateComponent,
HelpModeKey,
HiddenActionDirective,
@@ -21,18 +20,12 @@ import {
IqserListingModule,
IqserLoadingModule,
IqserTranslateModule,
- IqserUsersModule,
LanguageService,
- LogoComponent,
MAX_RETRIES_ON_SERVER_ERROR,
RoundCheckboxComponent,
SERVER_ERROR_SKIP_PATHS,
ServerErrorInterceptor,
- SkeletonComponent,
StopPropagationDirective,
- TenantPipe,
- TenantsModule,
- ToastComponent,
} from '@iqser/common-ui';
import { ToastrModule } from 'ngx-toastr';
import { ServiceWorkerModule } from '@angular/service-worker';
@@ -71,6 +64,10 @@ import { SkeletonStatsComponent } from '@components/skeleton/skeleton-stats/skel
import { UserMenuComponent } from '@components/user-menu/user-menu.component';
import { TenantsMenuComponent } from '@components/tenants-menu/tenants-menu.component';
import { MatDividerModule } from '@angular/material/divider';
+import { IqserUsersModule } from '@iqser/common-ui/lib/users';
+import { CommonUiModule } from '@iqser/common-ui/lib/common-ui.module';
+import { LogoComponent, SkeletonComponent, ToastComponent } from '@iqser/common-ui/lib/shared';
+import { TenantPipe, TenantsModule } from '@iqser/common-ui/lib/tenants';
export const appModuleFactory = (config: AppConfig) => {
@NgModule({
@@ -144,10 +141,10 @@ export const appModuleFactory = (config: AppConfig) => {
enabled: true,
},
FILE: {
- enabled: false,
+ enabled: true,
},
CHANGES: {
- enabled: false,
+ enabled: true,
},
STATS: {
enabled: false,
diff --git a/apps/red-ui/src/app/components/base-screen/base-screen.component.ts b/apps/red-ui/src/app/components/base-screen/base-screen.component.ts
index 3961f1bb6..f37002b13 100644
--- a/apps/red-ui/src/app/components/base-screen/base-screen.component.ts
+++ b/apps/red-ui/src/app/components/base-screen/base-screen.component.ts
@@ -6,15 +6,17 @@ import { Title } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core';
import { SpotlightSearchAction } from '@components/spotlight-search/spotlight-search-action';
import { filter, map, startWith } from 'rxjs/operators';
-import { IqserPermissionsService, List, shareDistinctLast, TenantsService } from '@iqser/common-ui';
+import { IqserPermissionsService } from '@iqser/common-ui';
import { BreadcrumbsService } from '@services/breadcrumbs.service';
import { FeaturesService } from '@services/features.service';
import { ARCHIVE_ROUTE, DOSSIERS_ARCHIVE, DOSSIERS_ROUTE } from '@red/domain';
import { Roles } from '@users/roles';
import { REDDocumentViewer } from '../../modules/pdf-viewer/services/document-viewer.service';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
+import { List, shareDistinctLast } from '@iqser/common-ui/lib/utils';
+import { TenantsService } from '@iqser/common-ui/lib/tenants';
-const isNavigationStart = event => event instanceof NavigationStart;
+const isNavigationStart = (event: unknown): event is NavigationStart => event instanceof NavigationStart;
const isSearchScreen: (url: string) => boolean = url => url.includes('/search');
@Component({
@@ -22,6 +24,12 @@ const isSearchScreen: (url: string) => boolean = url => url.includes('/search');
styleUrls: ['./base-screen.component.scss'],
})
export class BaseScreenComponent {
+ readonly #navigationStart$ = this._router.events.pipe(
+ filter(isNavigationStart),
+ map(event => event.url),
+ startWith(this._router.url),
+ shareDistinctLast(),
+ );
readonly roles = Roles;
readonly documentViewer = inject(REDDocumentViewer);
readonly currentUser = this.userService.currentUser;
@@ -44,12 +52,6 @@ export class BaseScreenComponent {
action: (query): void => this.#search(query, []),
},
];
- readonly #navigationStart$ = this._router.events.pipe(
- filter(isNavigationStart),
- map((event: NavigationStart) => event.url),
- startWith(this._router.url),
- shareDistinctLast(),
- );
readonly isSearchScreen$ = this.#navigationStart$.pipe(map(isSearchScreen));
constructor(
diff --git a/apps/red-ui/src/app/components/notifications/notifications.component.html b/apps/red-ui/src/app/components/notifications/notifications.component.html
index 8b65174a4..5f2b7e66b 100644
--- a/apps/red-ui/src/app/components/notifications/notifications.component.html
+++ b/apps/red-ui/src/app/components/notifications/notifications.component.html
@@ -1,8 +1,8 @@