@open-rlb/ng-app 3.1.85 → 3.1.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,32 +1,30 @@
1
1
  import * as i1$2 from '@angular/common/http';
2
2
  import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, Injectable, Inject, Optional, inject, EventEmitter, importProvidersFrom, makeStateKey, makeEnvironmentProviders, Pipe, Input, Component, input, output, viewChild, TemplateRef, ViewContainerRef, effect, Directive, PLATFORM_ID, NgModule, model, isDevMode, provideAppInitializer } from '@angular/core';
5
- import * as i2 from '@angular/router';
6
- import { NavigationEnd, Router, RoutesRecognized, RouterModule, provideRouter } from '@angular/router';
7
- import * as i1$4 from '@angular/service-worker';
8
- import { provideServiceWorker } from '@angular/service-worker';
4
+ import { InjectionToken, Injectable, Inject, Optional, inject, Injector, computed, signal, importProvidersFrom, makeStateKey, makeEnvironmentProviders, input, model, ChangeDetectionStrategy, Component, Pipe, output, viewChild, TemplateRef, ViewContainerRef, effect, Directive, PLATFORM_ID, NgModule, isDevMode, provideAppInitializer } from '@angular/core';
5
+ import * as i5 from '@angular/router';
6
+ import { ActivatedRoute, Router, NavigationEnd, RouterModule, RoutesRecognized, provideRouter } from '@angular/router';
7
+ import { SwUpdate, provideServiceWorker } from '@angular/service-worker';
9
8
  import * as i1$8 from '@ngrx/effects';
10
9
  import { createEffect, ofType, provideEffects } from '@ngrx/effects';
11
10
  import * as i1$1 from '@ngrx/store';
12
11
  import { createActionGroup, props, emptyProps, Store, createFeature, createReducer, on, provideStore, provideState } from '@ngrx/store';
13
- import * as i2$1 from '@open-rlb/ng-bootstrap';
14
- import { RLB_TRANSLATION_SERVICE, ToastService, RlbBootstrapModule, ModalDirective, ToastDirective, ModalRegistryOptions, ToastRegistryOptions, provideRlbBootstrap } from '@open-rlb/ng-bootstrap';
12
+ import * as i1$3 from '@open-rlb/ng-bootstrap';
13
+ import { UniqueIdService, RLB_TRANSLATION_SERVICE, ModalService, ModalDirective, TooltipDirective, BreadcrumbComponent, TabsComponent, TabComponent, TabContentComponent, TabPaneComponent, AccordionComponent, AccordionHeaderComponent, AccordionBodyComponent, AccordionItemComponent, ListComponent, ListItemComponent, InputComponent, SwitchComponent, ToastService, NavbarDropdownItemComponent, DropdownContainerComponent, CarouselComponent, CarouselSlideComponent, SelectComponent, OptionComponent, ButtonComponent, NavbarComponent, NavbarBrandDirective, NavbarFormComponent, NavbarItemsComponent, NavbarItemComponent, NavbarSeparatorComponent, SidebarComponent, SidebarItemComponent, OffcanvasComponent, OffcanvasHeaderComponent, OffcanvasBodyComponent, RlbFabComponent, InputGroupComponent, ToggleDirective, ModalContainerComponent, ToastContainerComponent, RlbBootstrapModule, ToastDirective, ModalRegistryOptions, ToastRegistryOptions, provideRlbBootstrap } from '@open-rlb/ng-bootstrap';
15
14
  import * as i1$5 from 'angular-auth-oidc-client';
16
15
  import { AbstractLoggerService, AuthModule, provideAuth, AuthInterceptor, AbstractSecurityStorage } from 'angular-auth-oidc-client';
17
16
  import * as i1 from 'ngx-cookie-service-ssr';
18
- import { of, from, map, catchError, tap, switchMap, filter, BehaviorSubject, share, lastValueFrom, zip, EMPTY, Observable, shareReplay, distinctUntilChanged, take } from 'rxjs';
17
+ import { of, from, map, catchError, tap, switchMap, filter, take, share, lastValueFrom, zip, EMPTY, Observable, combineLatest, startWith, BehaviorSubject, distinctUntilChanged } from 'rxjs';
19
18
  import { signalStore, withState, withMethods, patchState } from '@ngrx/signals';
20
- import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
21
- import * as i1$3 from '@ngx-translate/core';
22
- import { TranslateModule } from '@ngx-translate/core';
19
+ import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
20
+ import * as i1$4 from '@ngx-translate/core';
21
+ import { TranslateService, TranslateModule } from '@ngx-translate/core';
23
22
  import { provideTranslateHttpLoader } from '@ngx-translate/http-loader';
24
23
  import * as i1$6 from '@angular/common';
25
- import { isPlatformServer, CommonModule } from '@angular/common';
26
- import * as i3 from '@angular/forms';
27
- import { FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
28
- import * as i1$7 from '@angular/cdk/layout';
29
- import { Breakpoints } from '@angular/cdk/layout';
24
+ import { CommonModule, Location, NgClass, NgTemplateOutlet, NgComponentOutlet, isPlatformServer } from '@angular/common';
25
+ import * as i1$7 from '@angular/forms';
26
+ import { FormGroup, FormControl, Validators, ReactiveFormsModule, FormsModule } from '@angular/forms';
27
+ import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
30
28
  import { tap as tap$1, map as map$1, switchMap as switchMap$1 } from 'rxjs/operators';
31
29
 
32
30
  // export const RLB_CFG = 'rlb.options';
@@ -55,10 +53,10 @@ class TokenCookiesService {
55
53
  }
56
54
  clear() {
57
55
  }
58
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenCookiesService, deps: [{ token: i1.SsrCookieService }], target: i0.ɵɵFactoryTarget.Injectable }); }
59
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenCookiesService, providedIn: 'root' }); }
56
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenCookiesService, deps: [{ token: i1.SsrCookieService }], target: i0.ɵɵFactoryTarget.Injectable }); }
57
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenCookiesService, providedIn: 'root' }); }
60
58
  }
61
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenCookiesService, decorators: [{
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenCookiesService, decorators: [{
62
60
  type: Injectable,
63
61
  args: [{
64
62
  providedIn: 'root'
@@ -90,10 +88,10 @@ class AppStorageService {
90
88
  clearSession() {
91
89
  sessionStorage.clear();
92
90
  }
93
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
94
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppStorageService, providedIn: 'root' }); }
91
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
92
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppStorageService, providedIn: 'root' }); }
95
93
  }
96
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppStorageService, decorators: [{
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppStorageService, decorators: [{
97
95
  type: Injectable,
98
96
  args: [{
99
97
  providedIn: 'root'
@@ -116,10 +114,10 @@ class TokenSessionService {
116
114
  clear() {
117
115
  this.store.clearSession();
118
116
  }
119
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenSessionService, deps: [{ token: AppStorageService }], target: i0.ɵɵFactoryTarget.Injectable }); }
120
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenSessionService, providedIn: 'root' }); }
117
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenSessionService, deps: [{ token: AppStorageService }], target: i0.ɵɵFactoryTarget.Injectable }); }
118
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenSessionService, providedIn: 'root' }); }
121
119
  }
122
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenSessionService, decorators: [{
120
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenSessionService, decorators: [{
123
121
  type: Injectable,
124
122
  args: [{
125
123
  providedIn: 'root'
@@ -142,10 +140,10 @@ class TokenStoreService {
142
140
  clear() {
143
141
  this.store.clearLocal();
144
142
  }
145
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenStoreService, deps: [{ token: AppStorageService }], target: i0.ɵɵFactoryTarget.Injectable }); }
146
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenStoreService, providedIn: 'root' }); }
143
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenStoreService, deps: [{ token: AppStorageService }], target: i0.ɵɵFactoryTarget.Injectable }); }
144
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenStoreService, providedIn: 'root' }); }
147
145
  }
148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenStoreService, decorators: [{
146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenStoreService, decorators: [{
149
147
  type: Injectable,
150
148
  args: [{
151
149
  providedIn: 'root'
@@ -245,10 +243,10 @@ class AppLoggerService {
245
243
  console.log(`%c${prefix}`, colors.log, ...messageArgs);
246
244
  }
247
245
  }
248
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppLoggerService, deps: [{ token: RLB_CFG_ENV }], target: i0.ɵɵFactoryTarget.Injectable }); }
249
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppLoggerService, providedIn: 'root' }); }
246
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppLoggerService, deps: [{ token: RLB_CFG_ENV }], target: i0.ɵɵFactoryTarget.Injectable }); }
247
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppLoggerService, providedIn: 'root' }); }
250
248
  }
251
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppLoggerService, decorators: [{
249
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppLoggerService, decorators: [{
252
250
  type: Injectable,
253
251
  args: [{ providedIn: 'root' }]
254
252
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -316,10 +314,10 @@ class AuthFeatureService {
316
314
  logout() {
317
315
  this.store.dispatch(AuthActions.logout());
318
316
  }
319
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AuthFeatureService, deps: [{ token: i1$1.Store }], target: i0.ɵɵFactoryTarget.Injectable }); }
320
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AuthFeatureService, providedIn: 'root' }); }
317
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthFeatureService, deps: [{ token: i1$1.Store }], target: i0.ɵɵFactoryTarget.Injectable }); }
318
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthFeatureService, providedIn: 'root' }); }
321
319
  }
322
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AuthFeatureService, decorators: [{
320
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthFeatureService, decorators: [{
323
321
  type: Injectable,
324
322
  args: [{
325
323
  providedIn: 'root'
@@ -365,7 +363,7 @@ const initialNavbarState = {
365
363
  settingsVisible: false,
366
364
  appsVisible: false,
367
365
  separatorVisible: true,
368
- actionsLayout: 'default',
366
+ actionsLayout: 'dropdown',
369
367
  };
370
368
 
371
369
  const SidebarActionsInternal = createActionGroup({
@@ -425,10 +423,10 @@ class AdminApiService {
425
423
  const url = `${endpoint.baseUrl}/${path}`;
426
424
  return this.httpClient.get(url).pipe();
427
425
  }
428
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AdminApiService, deps: [{ token: i1$2.HttpClient }, { token: RLB_CFG, optional: true }, { token: RLB_CFG_ACL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
429
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AdminApiService, providedIn: 'root' }); }
426
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AdminApiService, deps: [{ token: i1$2.HttpClient }, { token: RLB_CFG, optional: true }, { token: RLB_CFG_ACL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
427
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AdminApiService, providedIn: 'root' }); }
430
428
  }
431
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AdminApiService, decorators: [{
429
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AdminApiService, decorators: [{
432
430
  type: Injectable,
433
431
  args: [{ providedIn: 'root' }]
434
432
  }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: undefined, decorators: [{
@@ -487,10 +485,10 @@ const AclStore = signalStore({ providedIn: 'root' }, withState(initialAclState),
487
485
  })));
488
486
 
489
487
  class AbstractSupportService {
490
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AbstractSupportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
491
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AbstractSupportService }); }
488
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AbstractSupportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
489
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AbstractSupportService }); }
492
490
  }
493
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AbstractSupportService, decorators: [{
491
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AbstractSupportService, decorators: [{
494
492
  type: Injectable
495
493
  }] });
496
494
 
@@ -509,81 +507,72 @@ const DEFAULT_ROUTES_CONFIG = [
509
507
  ];
510
508
 
511
509
  class AppsService {
512
- constructor(store, activatedRoute, router, loggerService, confAuth, confAcl) {
513
- this.store = store;
514
- this.activatedRoute = activatedRoute;
515
- this.router = router;
516
- this.loggerService = loggerService;
517
- this.confAuth = confAuth;
518
- this.confAcl = confAcl;
519
- this.aclStore = inject(AclStore); // Inject SignalStore here
520
- this.logger = this.loggerService.for(this.constructor.name);
521
- this.logger.log('AppsService initialized');
522
- this.initAuthProviders(store, confAuth);
523
- this.initRouterListener();
524
- }
525
- get currentDomain() {
526
- return window.location.hostname;
527
- }
528
- get apps() {
529
- const apps = this.store.selectSignal(state => state[appContextFeatureKey].apps)();
530
- const resources = this.aclStore.resources();
531
- const confAcl = this.confAcl;
532
- return apps.filter(app => {
533
- // Basic domain check
534
- const isDomainAllowed = !app.domains || app.domains.includes(this.currentDomain);
535
- if (!isDomainAllowed)
536
- return false;
537
- // If acl config doesnt exist return apps filtered by domain
538
- if (!confAcl)
539
- return true;
540
- if (!resources && app.actions?.length)
541
- return false; // If app has actions defined, but no resources in store, we assume it's ACL protected and not allowed
542
- if (resources && !app.actions?.length)
543
- return true; // If app has no actions defined, we assume it's not ACL protected and allow it
544
- return resources?.some(userResource => {
545
- // Matching by Business ID
546
- // IMPORTANT: app.data must have key, name of this key is in confAcl
547
- const appBusId = app.data?.[confAcl.businessIdKey];
548
- const matchBusId = userResource.resourceBusinessId === appBusId;
549
- if (!matchBusId)
510
+ constructor() {
511
+ this.store = inject((Store));
512
+ this.activatedRoute = inject(ActivatedRoute);
513
+ this.router = inject(Router);
514
+ this.loggerService = inject(AppLoggerService);
515
+ this.confAuth = inject(RLB_CFG_AUTH, { optional: true });
516
+ this.confAcl = inject(RLB_CFG_ACL, { optional: true });
517
+ this.aclStore = inject(AclStore);
518
+ this.injector = inject(Injector);
519
+ this.currentDomain = window.location.hostname;
520
+ this.apps = computed(() => {
521
+ const apps = this.store.selectSignal(state => state[appContextFeatureKey].apps)();
522
+ const resources = this.aclStore.resources();
523
+ const confAcl = this.confAcl;
524
+ return apps.filter((app) => {
525
+ const isDomainAllowed = !app.domains || app.domains.includes(this.currentDomain);
526
+ if (!isDomainAllowed)
550
527
  return false;
551
- // Matching by Resource ID
552
- return userResource.resources.some(res => {
553
- const appResId = app.data?.[confAcl.resourceIdKey];
554
- const matchResId = res.resourceId === appResId;
555
- if (!matchResId)
528
+ if (!confAcl)
529
+ return true;
530
+ if (!resources && app.actions?.length)
531
+ return false;
532
+ if (resources && !app.actions?.length)
533
+ return true;
534
+ return resources?.some(userResource => {
535
+ const appBusId = app.data?.[confAcl.businessIdKey];
536
+ const matchBusId = userResource.resourceBusinessId === appBusId;
537
+ if (!matchBusId)
556
538
  return false;
557
- return res.actions.some(action => app.actions?.includes(action));
539
+ return userResource.resources.some(res => {
540
+ const appResId = app.data?.[confAcl.resourceIdKey];
541
+ const matchResId = res.resourceId === appResId;
542
+ if (!matchResId)
543
+ return false;
544
+ return res.actions.some(action => app.actions?.includes(action));
545
+ });
558
546
  });
559
547
  });
560
- });
561
- }
562
- get currentAppAclInfo() {
563
- const app = this.currentApp;
564
- if (!app || !app.data || !this.confAcl)
565
- return null;
566
- return {
567
- busId: app.data[this.confAcl.businessIdKey],
568
- resId: app.data[this.confAcl.resourceIdKey],
569
- };
570
- }
571
- get currentApp() {
572
- const app = this.store.selectSignal(state => state[appContextFeatureKey].currentApp)();
573
- this.logger.log('Current app from store:', app);
574
- return app;
548
+ }, ...(ngDevMode ? [{ debugName: "apps" }] : /* istanbul ignore next */ []));
549
+ this.currentApp = this.store.selectSignal((state) => state[appContextFeatureKey].currentApp);
550
+ this.currentAppId = computed(() => this.currentApp()?.id, ...(ngDevMode ? [{ debugName: "currentAppId" }] : /* istanbul ignore next */ []));
551
+ this.currentAppAclInfo = computed(() => {
552
+ const app = this.currentApp();
553
+ if (!app || !app.data || !this.confAcl)
554
+ return null;
555
+ return {
556
+ busId: app.data[this.confAcl.businessIdKey],
557
+ resId: app.data[this.confAcl.resourceIdKey],
558
+ };
559
+ }, ...(ngDevMode ? [{ debugName: "currentAppAclInfo" }] : /* istanbul ignore next */ []));
560
+ this.logger = this.loggerService.for(this.constructor.name);
561
+ this.logger.log('AppsService initialized');
562
+ this.initAuthProviders();
563
+ this.initRouterListener();
575
564
  }
576
565
  isAppSelected(appId) {
577
566
  return this.getStoredAppId() === appId;
578
567
  }
579
568
  checkPermissionInCurrentApp(action) {
580
- const info = this.currentAppAclInfo;
569
+ const info = this.currentAppAclInfo();
581
570
  if (!info)
582
571
  return false;
583
572
  return this.aclStore.hasPermission(info.busId, info.resId, action);
584
573
  }
585
574
  selectApp(app, viewMode, url) {
586
- const currentApp = this.currentApp;
575
+ const currentApp = this.currentApp();
587
576
  if (!app) {
588
577
  this.logger.warn('Deselecting app (null).');
589
578
  this.store.dispatch(AppContextActions.setCurrentApp({ app: null }));
@@ -596,7 +585,8 @@ class AppsService {
596
585
  this.logger.warn('Dispatching setCurrentApp with:', { app, mode: viewMode, url });
597
586
  this.store.dispatch(AppContextActions.setCurrentApp({ app, mode: viewMode, url }));
598
587
  }
599
- initAuthProviders(store, confAuth) {
588
+ initAuthProviders() {
589
+ const confAuth = this.confAuth;
600
590
  const currentProviderInStore = this.store.selectSignal(state => state[authsFeatureKey].currentProvider)();
601
591
  if (currentProviderInStore) {
602
592
  this.logger.info(`Auth provider already set to '${currentProviderInStore}' by Initializer. AppsService initAuthProviders skipping init.`);
@@ -608,14 +598,14 @@ class AppsService {
608
598
  }
609
599
  if (confAuth?.providers && confAuth.providers.length === 1) {
610
600
  this.logger.info('Single auth provider detected:', confAuth.providers[0]);
611
- store.dispatch(AuthActions.setCurrentProvider({ currentProvider: confAuth.providers[0].configId }));
601
+ this.store.dispatch(AuthActions.setCurrentProvider({ currentProvider: confAuth.providers[0].configId }));
612
602
  return;
613
603
  }
614
604
  this.logger.info('Multiple auth providers detected, checking by domain:', this.currentDomain);
615
605
  const authProvidersMatched = confAuth.providers.filter(provider => provider.domains?.includes(this.currentDomain));
616
606
  if (authProvidersMatched && authProvidersMatched.length === 1) {
617
607
  this.logger.info('Auth provider matched by domain:', authProvidersMatched[0]);
618
- store.dispatch(AuthActions.setCurrentProvider({ currentProvider: authProvidersMatched[0].configId }));
608
+ this.store.dispatch(AuthActions.setCurrentProvider({ currentProvider: authProvidersMatched[0].configId }));
619
609
  }
620
610
  else if (authProvidersMatched && authProvidersMatched.length > 1) {
621
611
  this.logger.warn(`Multiple auth providers found for the current domain: ${this.currentDomain}. Please specify a single provider in the configuration.`);
@@ -632,37 +622,32 @@ class AppsService {
632
622
  // Core logic
633
623
  resolveRouteAndApps() {
634
624
  const route = this.findDeepestChild(this.activatedRoute);
635
- // 1. Get abstract route template (LIKE ".../:id")
636
625
  const configPath = this.getConfigPath(route);
637
- // 2. Get REAL url path (LIKE ".../abc-123")
638
626
  const actualPath = this.getActualPath(route);
639
627
  this.logger.info(`Resolving. ConfigPath: '${configPath}', ActualPath: '${actualPath}'`);
640
- const appRoutes = this.apps?.map(app => ({
628
+ const appRoutes = this.apps()?.map((app) => ({
641
629
  type: app.type,
642
630
  routes: app.routes || [],
643
631
  viewMode: app.viewMode,
644
632
  enabled: app.enabled,
645
633
  core: app.core,
646
- }));
634
+ })) || [];
647
635
  let appRoutesMatched = [];
648
636
  if (configPath && !this.isDefaultRoute(configPath)) {
649
- appRoutesMatched =
650
- appRoutes?.filter(app => app.routes?.some(r => r.includes(configPath))) ?? [];
637
+ appRoutesMatched = appRoutes.filter((app) => app.routes?.some(r => r.includes(configPath)));
651
638
  }
652
639
  this.logger.info('Matched appRoute:', appRoutesMatched);
653
- return this.store
654
- .select(state => state[appContextFeatureKey].apps)
655
- .pipe(
656
- // waiting for all "finalizeApp" dispatches
657
- filter(apps => {
640
+ return toObservable(this.store.selectSignal(state => state[appContextFeatureKey].apps),
641
+ // fix init load error
642
+ { injector: this.injector }).pipe(filter((apps) => {
658
643
  if (!apps || apps.length === 0)
659
644
  return true;
660
- const allFinalized = !apps.some(app => !app.id);
645
+ const allFinalized = !apps.some((app) => !app.id);
661
646
  if (!allFinalized) {
662
647
  this.logger.info('Waiting for apps initialization (finalizeApp)...');
663
648
  }
664
649
  return allFinalized;
665
- }), map(apps => {
650
+ }), take(1), map(apps => {
666
651
  if (appRoutesMatched.length > 0 || actualPath === '') {
667
652
  return {
668
653
  route,
@@ -735,7 +720,7 @@ class AppsService {
735
720
  // CASE 3: Standard logic to get app (Deep linking) ---
736
721
  // Here we go only if route not empty !="" and not root !="/"
737
722
  const configPath = this.getConfigPath(route);
738
- const matchedApps = domainApps.filter(app => {
723
+ const matchedApps = domainApps.filter((app) => {
739
724
  if (!configPath || configPath === '') {
740
725
  return false;
741
726
  }
@@ -811,56 +796,51 @@ class AppsService {
811
796
  }
812
797
  return segments.join('/');
813
798
  }
814
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppsService, deps: [{ token: i1$1.Store }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: AppLoggerService }, { token: RLB_CFG_AUTH, optional: true }, { token: RLB_CFG_ACL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
815
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppsService, providedIn: 'root' }); }
799
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
800
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppsService, providedIn: 'root' }); }
816
801
  }
817
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppsService, decorators: [{
802
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppsService, decorators: [{
818
803
  type: Injectable,
819
804
  args: [{
820
805
  providedIn: 'root',
821
806
  }]
822
- }], ctorParameters: () => [{ type: i1$1.Store }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: AppLoggerService }, { type: undefined, decorators: [{
823
- type: Inject,
824
- args: [RLB_CFG_AUTH]
825
- }, {
826
- type: Optional
827
- }] }, { type: undefined, decorators: [{
828
- type: Inject,
829
- args: [RLB_CFG_ACL]
830
- }, {
831
- type: Optional
832
- }] }] });
807
+ }], ctorParameters: () => [] });
833
808
 
834
809
  class LanguageService {
835
- constructor(translateService, cookiesService, i18nOptions) {
836
- this.translateService = translateService;
837
- this.cookiesService = cookiesService;
838
- this.i18nOptions = i18nOptions;
839
- this.contentLanguageChanged$ = new EventEmitter();
810
+ constructor() {
811
+ this.translateService = inject(TranslateService);
812
+ this.cookiesService = inject(CookiesService);
813
+ this.i18nOptions = inject(RLB_CFG_I18N, { optional: true });
814
+ this._language = signal(this.translateService.currentLang || this.i18nOptions?.defaultLanguage || 'en', ...(ngDevMode ? [{ debugName: "_language" }] : /* istanbul ignore next */ []));
815
+ this._contentLanguage = signal(undefined, ...(ngDevMode ? [{ debugName: "_contentLanguage" }] : /* istanbul ignore next */ []));
816
+ this.language = this._language.asReadonly();
817
+ this.contentLanguage = this._contentLanguage.asReadonly();
818
+ this.languageChanged$ = this.translateService.onLangChange;
819
+ this.contentLanguageChanged = this._contentLanguage.asReadonly();
820
+ // Sync private signal with translate service changes
821
+ this.translateService.onLangChange
822
+ .pipe(takeUntilDestroyed())
823
+ .subscribe(e => this._language.set(e.lang));
840
824
  if (this.i18nOptions) {
841
- translateService.addLangs(this.i18nOptions.availableLangs);
825
+ this.translateService.addLangs(this.i18nOptions.availableLangs);
842
826
  const languageUI = this.cookiesService.getCookie('ui-locale') || this.defaultLanguage || this.browserLanguage;
843
827
  const languageContent = this.cookiesService.getCookie('content-locale') || this.defaultLanguage;
844
- translateService.use(languageUI);
845
- this.contentLanguage = languageContent;
828
+ this.translateService.use(languageUI);
829
+ this.setContentLanguage(languageContent);
846
830
  }
847
831
  }
848
- get language() {
849
- return this.translateService.getCurrentLang() || this.i18nOptions.defaultLanguage;
832
+ get currentLanguage() {
833
+ return this.language();
850
834
  }
851
- set language(value) {
835
+ setLanguage(value) {
852
836
  if (!value)
853
837
  return;
854
838
  this.cookiesService.setCookie('ui-locale', value);
855
839
  this.translateService.use(value);
856
840
  }
857
- get contentLanguage() {
858
- return this._contentLanguage;
859
- }
860
- set contentLanguage(value) {
841
+ setContentLanguage(value) {
861
842
  this.cookiesService.setCookie('content-locale', value || this.defaultLanguage);
862
- this._contentLanguage = value;
863
- this.contentLanguageChanged$.emit(value);
843
+ this._contentLanguage.set(value);
864
844
  }
865
845
  get languages() {
866
846
  return this.translateService.getLangs();
@@ -880,55 +860,52 @@ class LanguageService {
880
860
  translateAsync(key, interpolateParams) {
881
861
  return this.translateService.get(key, interpolateParams);
882
862
  }
883
- get languageChanged$() {
884
- return this.translateService.onLangChange;
885
- }
886
863
  getLanguageName(l) {
887
- switch (l) {
888
- case 'it': return 'Italiano';
889
- case 'en': return 'English';
890
- case 'es': return 'Español';
891
- case 'fr': return 'Francés';
892
- case 'ja': return '日本語';
893
- case 'de': return 'Deutsch';
894
- default: return '';
895
- }
864
+ const names = {
865
+ it: 'Italiano',
866
+ en: 'English',
867
+ es: 'Español',
868
+ fr: 'Francés',
869
+ ja: '日本語',
870
+ de: 'Deutsch',
871
+ };
872
+ return names[l] || '';
896
873
  }
897
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: LanguageService, deps: [{ token: i1$3.TranslateService }, { token: CookiesService }, { token: RLB_CFG_I18N, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
898
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: LanguageService, providedIn: 'root' }); }
874
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LanguageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
875
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LanguageService, providedIn: 'root' }); }
899
876
  }
900
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: LanguageService, decorators: [{
877
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LanguageService, decorators: [{
901
878
  type: Injectable,
902
879
  args: [{ providedIn: 'root' }]
903
- }], ctorParameters: () => [{ type: i1$3.TranslateService }, { type: CookiesService }, { type: undefined, decorators: [{
904
- type: Inject,
905
- args: [RLB_CFG_I18N]
906
- }, {
907
- type: Optional
908
- }] }] });
880
+ }], ctorParameters: () => [] });
909
881
 
910
882
  class AppBreadcrumbService {
911
- constructor(router, route, loggerService, languageService, idService) {
912
- this.router = router;
913
- this.route = route;
914
- this.loggerService = loggerService;
915
- this.languageService = languageService;
916
- this.idService = idService;
917
- this._breadcrumbs$ = new BehaviorSubject([]);
918
- this.breadcrumbs$ = this._breadcrumbs$.asObservable();
883
+ constructor() {
884
+ this.router = inject(Router);
885
+ this.route = inject(ActivatedRoute);
886
+ this.loggerService = inject(AppLoggerService);
887
+ this.languageService = inject(LanguageService);
888
+ this.idService = inject(UniqueIdService);
889
+ this._breadcrumbs = signal([], ...(ngDevMode ? [{ debugName: "_breadcrumbs" }] : /* istanbul ignore next */ []));
890
+ this.breadcrumbs = this._breadcrumbs.asReadonly();
891
+ /**
892
+ * @deprecated Use `breadcrumbs` (signal-based) instead.
893
+ */
894
+ this.breadcrumbs$ = toObservable(this._breadcrumbs);
919
895
  this.logger = this.loggerService.for(this.constructor.name);
920
896
  this.logger.info('Service initialized');
921
897
  this.router.events
922
- .pipe(filter((event) => event instanceof NavigationEnd))
898
+ .pipe(filter((event) => event instanceof NavigationEnd), takeUntilDestroyed())
923
899
  .subscribe(() => this.updateBreadcrumbs());
924
900
  this.languageService.languageChanged$
901
+ .pipe(takeUntilDestroyed())
925
902
  .subscribe(() => this.updateBreadcrumbs());
926
903
  // init construct
927
904
  this.updateBreadcrumbs();
928
905
  }
929
906
  updateBreadcrumbs() {
930
907
  const crumbs = this.buildBreadcrumbFromRoot(this.route);
931
- this._breadcrumbs$.next(crumbs);
908
+ this._breadcrumbs.set(crumbs);
932
909
  this.logger.info('Breadcrumbs updated', crumbs);
933
910
  }
934
911
  buildBreadcrumbFromRoot(route) {
@@ -944,7 +921,7 @@ class AppBreadcrumbService {
944
921
  breadcrumbs.push({
945
922
  label: this.languageService.translate(label),
946
923
  link: accumulatedLink || '/',
947
- id: `breadcrumb${this.idService.id}`
924
+ id: `breadcrumb${this.idService.id}`,
948
925
  });
949
926
  this.logger.debug('Pushed breadcrumb', { label, link: accumulatedLink });
950
927
  }
@@ -954,13 +931,13 @@ class AppBreadcrumbService {
954
931
  }
955
932
  return breadcrumbs;
956
933
  }
957
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppBreadcrumbService, deps: [{ token: i2.Router }, { token: i2.ActivatedRoute }, { token: AppLoggerService }, { token: LanguageService }, { token: i2$1.UniqueIdService }], target: i0.ɵɵFactoryTarget.Injectable }); }
958
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppBreadcrumbService, providedIn: 'root' }); }
934
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppBreadcrumbService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
935
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppBreadcrumbService, providedIn: 'root' }); }
959
936
  }
960
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppBreadcrumbService, decorators: [{
937
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppBreadcrumbService, decorators: [{
961
938
  type: Injectable,
962
939
  args: [{ providedIn: 'root' }]
963
- }], ctorParameters: () => [{ type: i2.Router }, { type: i2.ActivatedRoute }, { type: AppLoggerService }, { type: LanguageService }, { type: i2$1.UniqueIdService }] });
940
+ }], ctorParameters: () => [] });
964
941
 
965
942
  class LocalCacheService {
966
943
  constructor(options) {
@@ -1021,10 +998,10 @@ class LocalCacheService {
1021
998
  }
1022
999
  }), share());
1023
1000
  }
1024
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: LocalCacheService, deps: [{ token: RLB_CFG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1025
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: LocalCacheService, providedIn: 'root' }); }
1001
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LocalCacheService, deps: [{ token: RLB_CFG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1002
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LocalCacheService, providedIn: 'root' }); }
1026
1003
  }
1027
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: LocalCacheService, decorators: [{
1004
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LocalCacheService, decorators: [{
1028
1005
  type: Injectable,
1029
1006
  args: [{
1030
1007
  providedIn: 'root'
@@ -1038,10 +1015,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
1038
1015
 
1039
1016
  class AbstractMdService {
1040
1017
  constructor() { }
1041
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AbstractMdService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1042
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AbstractMdService, providedIn: 'root' }); }
1018
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AbstractMdService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1019
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AbstractMdService, providedIn: 'root' }); }
1043
1020
  }
1044
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AbstractMdService, decorators: [{
1021
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AbstractMdService, decorators: [{
1045
1022
  type: Injectable,
1046
1023
  args: [{
1047
1024
  providedIn: 'root'
@@ -1106,10 +1083,10 @@ class StrapiService {
1106
1083
  }));
1107
1084
  return this.cache.getData(__r, `strapiPage/${lang}/${cid}`, this.cmsOptions.chacheDuration || 3600);
1108
1085
  }
1109
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: StrapiService, deps: [{ token: i1$2.HttpClient }, { token: LocalCacheService }, { token: RLB_CFG_CMS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1110
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: StrapiService, providedIn: 'root' }); }
1086
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: StrapiService, deps: [{ token: i1$2.HttpClient }, { token: LocalCacheService }, { token: RLB_CFG_CMS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1087
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: StrapiService, providedIn: 'root' }); }
1111
1088
  }
1112
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: StrapiService, decorators: [{
1089
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: StrapiService, decorators: [{
1113
1090
  type: Injectable,
1114
1091
  args: [{
1115
1092
  providedIn: 'root'
@@ -1189,15 +1166,15 @@ class ErrorManagementService {
1189
1166
  }));
1190
1167
  };
1191
1168
  }
1192
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ErrorManagementService, deps: [{ token: i2$1.ModalService }, { token: i2$1.ToastService }, { token: LanguageService }, { token: RLB_CFG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1193
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ErrorManagementService, providedIn: 'root' }); }
1169
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ErrorManagementService, deps: [{ token: i1$3.ModalService }, { token: i1$3.ToastService }, { token: LanguageService }, { token: RLB_CFG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1170
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ErrorManagementService, providedIn: 'root' }); }
1194
1171
  }
1195
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ErrorManagementService, decorators: [{
1172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ErrorManagementService, decorators: [{
1196
1173
  type: Injectable,
1197
1174
  args: [{
1198
1175
  providedIn: 'root'
1199
1176
  }]
1200
- }], ctorParameters: () => [{ type: i2$1.ModalService }, { type: i2$1.ToastService }, { type: LanguageService }, { type: undefined, decorators: [{
1177
+ }], ctorParameters: () => [{ type: i1$3.ModalService }, { type: i1$3.ToastService }, { type: LanguageService }, { type: undefined, decorators: [{
1201
1178
  type: Inject,
1202
1179
  args: [RLB_CFG]
1203
1180
  }, {
@@ -1212,13 +1189,13 @@ class RlbTranslateAdapterService {
1212
1189
  instant(key, params) {
1213
1190
  return this.translateService.instant(key, params);
1214
1191
  }
1215
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbTranslateAdapterService, deps: [{ token: i1$3.TranslateService }, { token: i2$1.UniqueIdService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1216
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbTranslateAdapterService, providedIn: 'root' }); }
1192
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbTranslateAdapterService, deps: [{ token: i1$4.TranslateService }, { token: i1$3.UniqueIdService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1193
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbTranslateAdapterService, providedIn: 'root' }); }
1217
1194
  }
1218
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbTranslateAdapterService, decorators: [{
1195
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbTranslateAdapterService, decorators: [{
1219
1196
  type: Injectable,
1220
1197
  args: [{ providedIn: 'root' }]
1221
- }], ctorParameters: () => [{ type: i1$3.TranslateService }, { type: i2$1.UniqueIdService }] });
1198
+ }], ctorParameters: () => [{ type: i1$4.TranslateService }, { type: i1$3.UniqueIdService }] });
1222
1199
 
1223
1200
  function provideRlbI18n(i18n) {
1224
1201
  if (!i18n)
@@ -1302,10 +1279,10 @@ class CookiesService {
1302
1279
  }
1303
1280
  document.cookie = cookie;
1304
1281
  }
1305
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookiesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1306
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookiesService, providedIn: 'root' }); }
1282
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CookiesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1283
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CookiesService, providedIn: 'root' }); }
1307
1284
  }
1308
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookiesService, decorators: [{
1285
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CookiesService, decorators: [{
1309
1286
  type: Injectable,
1310
1287
  args: [{
1311
1288
  providedIn: 'root'
@@ -1314,15 +1291,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
1314
1291
 
1315
1292
  class PwaUpdaterService {
1316
1293
  get newVersionAvailable$() {
1317
- return this._newVersionAvailable$.asObservable();
1294
+ return toObservable(this._newVersionAvailable);
1318
1295
  }
1319
- constructor(updates, modalService, languageService) {
1320
- this.updates = updates;
1321
- this.modalService = modalService;
1322
- this.languageService = languageService;
1323
- this._newVersionAvailable$ = new EventEmitter();
1296
+ constructor() {
1297
+ this.updates = inject(SwUpdate);
1298
+ this.modalService = inject(ModalService);
1299
+ this.languageService = inject(LanguageService);
1300
+ this._newVersionAvailable = signal(false, ...(ngDevMode ? [{ debugName: "_newVersionAvailable" }] : /* istanbul ignore next */ []));
1301
+ this.newVersionAvailable = this._newVersionAvailable.asReadonly();
1324
1302
  this.updates.versionUpdates
1325
- .pipe(filter((evt) => (evt.type === 'VERSION_READY'))).subscribe(() => this._newVersionAvailable$.emit());
1303
+ .pipe(filter((evt) => (evt.type === 'VERSION_READY')), takeUntilDestroyed()).subscribe(() => this._newVersionAvailable.set(true));
1326
1304
  }
1327
1305
  update() {
1328
1306
  this.updates.activateUpdate()
@@ -1336,18 +1314,17 @@ class PwaUpdaterService {
1336
1314
  .pipe(filter((evt) => {
1337
1315
  const result = evt.type === 'VERSION_READY';
1338
1316
  return result;
1339
- }), switchMap(() => this.modalService.openSimpleModal(this.languageService.translate('core.pwa.newVersionAvailable'), this.languageService.translate('core.pwa.updateMessage'), this.languageService.translate('core.pwa.updateNow'), this.languageService.translate('core.pwa.update'), this.languageService.translate('core.pwa.later'))), filter((res) => res?.reason === 'ok'), //si ferma se l'evento non è una action
1340
- map(() => this.updates.activateUpdate().then(() => location.reload())));
1317
+ }), switchMap(() => this.modalService.openSimpleModal(this.languageService.translate('core.pwa.newVersionAvailable'), this.languageService.translate('core.pwa.updateMessage'), this.languageService.translate('core.pwa.updateNow'), this.languageService.translate('core.pwa.update'), this.languageService.translate('core.pwa.later'))), filter((res) => res?.reason === 'ok'), map(() => this.updates.activateUpdate().then(() => location.reload())));
1341
1318
  }
1342
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: PwaUpdaterService, deps: [{ token: i1$4.SwUpdate }, { token: i2$1.ModalService }, { token: LanguageService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1343
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: PwaUpdaterService, providedIn: 'root' }); }
1319
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PwaUpdaterService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1320
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PwaUpdaterService, providedIn: 'root' }); }
1344
1321
  }
1345
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: PwaUpdaterService, decorators: [{
1322
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PwaUpdaterService, decorators: [{
1346
1323
  type: Injectable,
1347
1324
  args: [{
1348
1325
  providedIn: 'root'
1349
1326
  }]
1350
- }], ctorParameters: () => [{ type: i1$4.SwUpdate }, { type: i2$1.ModalService }, { type: LanguageService }] });
1327
+ }], ctorParameters: () => [] });
1351
1328
 
1352
1329
  class UtilsService {
1353
1330
  isNumber(evt) {
@@ -1488,10 +1465,10 @@ class UtilsService {
1488
1465
  }
1489
1466
  return '0.00';
1490
1467
  }
1491
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: UtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1492
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: UtilsService, providedIn: 'root' }); }
1468
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UtilsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1469
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UtilsService, providedIn: 'root' }); }
1493
1470
  }
1494
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: UtilsService, decorators: [{
1471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UtilsService, decorators: [{
1495
1472
  type: Injectable,
1496
1473
  args: [{
1497
1474
  providedIn: 'root'
@@ -1517,10 +1494,10 @@ class ParseJwtService {
1517
1494
  }
1518
1495
  }
1519
1496
  ;
1520
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ParseJwtService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1521
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ParseJwtService, providedIn: 'root' }); }
1497
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ParseJwtService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1498
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ParseJwtService, providedIn: 'root' }); }
1522
1499
  }
1523
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ParseJwtService, decorators: [{
1500
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ParseJwtService, decorators: [{
1524
1501
  type: Injectable,
1525
1502
  args: [{
1526
1503
  providedIn: 'root'
@@ -1630,15 +1607,15 @@ class AuthenticationService {
1630
1607
  }, 0);
1631
1608
  }
1632
1609
  }
1633
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AuthenticationService, deps: [{ token: i1$5.OidcSecurityService }, { token: CookiesService }, { token: i2.Router }, { token: ParseJwtService }, { token: i1$1.Store }, { token: AppLoggerService }, { token: AppStorageService }, { token: AdminApiService }, { token: RLB_CFG_ENV, optional: true }, { token: RLB_CFG_AUTH, optional: true }, { token: RLB_CFG, optional: true }, { token: RLB_AUTH_URL_HANDLER, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1634
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AuthenticationService, providedIn: 'root' }); }
1610
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthenticationService, deps: [{ token: i1$5.OidcSecurityService }, { token: CookiesService }, { token: i5.Router }, { token: ParseJwtService }, { token: i1$1.Store }, { token: AppLoggerService }, { token: AppStorageService }, { token: AdminApiService }, { token: RLB_CFG_ENV, optional: true }, { token: RLB_CFG_AUTH, optional: true }, { token: RLB_CFG, optional: true }, { token: RLB_AUTH_URL_HANDLER, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1611
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthenticationService, providedIn: 'root' }); }
1635
1612
  }
1636
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AuthenticationService, decorators: [{
1613
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthenticationService, decorators: [{
1637
1614
  type: Injectable,
1638
1615
  args: [{
1639
1616
  providedIn: 'root',
1640
1617
  }]
1641
- }], ctorParameters: () => [{ type: i1$5.OidcSecurityService }, { type: CookiesService }, { type: i2.Router }, { type: ParseJwtService }, { type: i1$1.Store }, { type: AppLoggerService }, { type: AppStorageService }, { type: AdminApiService }, { type: undefined, decorators: [{
1618
+ }], ctorParameters: () => [{ type: i1$5.OidcSecurityService }, { type: CookiesService }, { type: i5.Router }, { type: ParseJwtService }, { type: i1$1.Store }, { type: AppLoggerService }, { type: AppStorageService }, { type: AdminApiService }, { type: undefined, decorators: [{
1642
1619
  type: Optional
1643
1620
  }, {
1644
1621
  type: Inject,
@@ -1680,10 +1657,10 @@ class TokenOauthInterceptor {
1680
1657
  return next.handle(request);
1681
1658
  }));
1682
1659
  }
1683
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenOauthInterceptor, deps: [{ token: AuthenticationService }, { token: RLB_CFG }], target: i0.ɵɵFactoryTarget.Injectable }); }
1684
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenOauthInterceptor }); }
1660
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenOauthInterceptor, deps: [{ token: AuthenticationService }, { token: RLB_CFG }], target: i0.ɵɵFactoryTarget.Injectable }); }
1661
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenOauthInterceptor }); }
1685
1662
  }
1686
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TokenOauthInterceptor, decorators: [{
1663
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TokenOauthInterceptor, decorators: [{
1687
1664
  type: Injectable
1688
1665
  }], ctorParameters: () => [{ type: AuthenticationService }, { type: undefined, decorators: [{
1689
1666
  type: Inject,
@@ -1716,10 +1693,10 @@ class CompanyInterceptor {
1716
1693
  const clonedReq = req.clone({ params });
1717
1694
  return next.handle(clonedReq);
1718
1695
  }
1719
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CompanyInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1720
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CompanyInterceptor }); }
1696
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CompanyInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1697
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CompanyInterceptor }); }
1721
1698
  }
1722
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CompanyInterceptor, decorators: [{
1699
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CompanyInterceptor, decorators: [{
1723
1700
  type: Injectable
1724
1701
  }] });
1725
1702
 
@@ -1765,143 +1742,297 @@ function provideRlbCodeBrowserOAuth(auth) {
1765
1742
  return makeEnvironmentProviders(providers);
1766
1743
  }
1767
1744
 
1745
+ class ErrorModalComponent {
1746
+ constructor() {
1747
+ this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
1748
+ this.valid = model(true, ...(ngDevMode ? [{ debugName: "valid" }] : /* istanbul ignore next */ []));
1749
+ }
1750
+ onEnter() { }
1751
+ ngOnInit() {
1752
+ console.log(this.data());
1753
+ }
1754
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1755
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: ErrorModalComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, valid: { classPropertyName: "valid", publicName: "valid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valid: "validChange" }, hostDirectives: [{ directive: i1$3.ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
1756
+ <div class="modal-header">
1757
+ <h5 class="modal-title">{{ data().title }}</h5>
1758
+ <button
1759
+ type="button"
1760
+ class="btn-close"
1761
+ aria-label="Close"
1762
+ data-modal-reason="close"
1763
+ ></button>
1764
+ </div>
1765
+ <div class="modal-body">
1766
+ <span>{{ data().content }}</span>
1767
+ </div>
1768
+ <div class="modal-footer">
1769
+ <button
1770
+ type="button"
1771
+ class="btn btn-primary"
1772
+ data-modal-reason="close"
1773
+ >
1774
+ {{ data().ok }}
1775
+ </button>
1776
+ </div>
1777
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1778
+ }
1779
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ErrorModalComponent, decorators: [{
1780
+ type: Component,
1781
+ args: [{
1782
+ imports: [],
1783
+ changeDetection: ChangeDetectionStrategy.OnPush,
1784
+ template: `
1785
+ <div class="modal-header">
1786
+ <h5 class="modal-title">{{ data().title }}</h5>
1787
+ <button
1788
+ type="button"
1789
+ class="btn-close"
1790
+ aria-label="Close"
1791
+ data-modal-reason="close"
1792
+ ></button>
1793
+ </div>
1794
+ <div class="modal-body">
1795
+ <span>{{ data().content }}</span>
1796
+ </div>
1797
+ <div class="modal-footer">
1798
+ <button
1799
+ type="button"
1800
+ class="btn btn-primary"
1801
+ data-modal-reason="close"
1802
+ >
1803
+ {{ data().ok }}
1804
+ </button>
1805
+ </div>
1806
+ `,
1807
+ hostDirectives: [
1808
+ {
1809
+ directive: ModalDirective,
1810
+ inputs: ['id', 'data-instance', 'data-options'],
1811
+ },
1812
+ ],
1813
+ }]
1814
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], valid: [{ type: i0.Input, args: [{ isSignal: true, alias: "valid", required: false }] }, { type: i0.Output, args: ["validChange"] }] } });
1815
+
1816
+ class ModalAppsComponent {
1817
+ constructor() {
1818
+ this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
1819
+ this.valid = model(true, ...(ngDevMode ? [{ debugName: "valid" }] : /* istanbul ignore next */ []));
1820
+ this.apps = [];
1821
+ }
1822
+ appSelected(app) {
1823
+ this.result = app;
1824
+ }
1825
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ModalAppsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1826
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ModalAppsComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, valid: { classPropertyName: "valid", publicName: "valid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valid: "validChange" }, hostDirectives: [{ directive: i1$3.ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
1827
+ <div class="modal-header">
1828
+ <h5 class="modal-title">{{ data().title }}</h5>
1829
+ <button
1830
+ type="button"
1831
+ class="btn-close"
1832
+ aria-label="Close"
1833
+ data-modal-reason="close"
1834
+ ></button>
1835
+ </div>
1836
+ <div class="modal-body">
1837
+ <ul class="row row-cols-4 list-unstyled list">
1838
+ @for (app of data().content; track app) {
1839
+ <li
1840
+ class="col my-2"
1841
+ [tooltip]="app.description | translate"
1842
+ >
1843
+ <a
1844
+ class="d-block text-body-emphasis text-decoration-none"
1845
+ (click)="appSelected(app)"
1846
+ [class.disabled]="!app.enabled"
1847
+ data-modal-reason="ok"
1848
+ >
1849
+ <div class="px-3 py-4 mb-2 bg-body-secondary text-center rounded">
1850
+ <i [ngClass]="app.icon"></i>
1851
+ </div>
1852
+ <div class="name text-muted text-decoration-none text-center pt-1">
1853
+ {{ app.name | translate }}
1854
+ </div>
1855
+ </a>
1856
+ </li>
1857
+ }
1858
+ </ul>
1859
+ </div>
1860
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1861
+ }
1862
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ModalAppsComponent, decorators: [{
1863
+ type: Component,
1864
+ args: [{
1865
+ imports: [TranslateModule, CommonModule, TooltipDirective],
1866
+ changeDetection: ChangeDetectionStrategy.OnPush,
1867
+ template: `
1868
+ <div class="modal-header">
1869
+ <h5 class="modal-title">{{ data().title }}</h5>
1870
+ <button
1871
+ type="button"
1872
+ class="btn-close"
1873
+ aria-label="Close"
1874
+ data-modal-reason="close"
1875
+ ></button>
1876
+ </div>
1877
+ <div class="modal-body">
1878
+ <ul class="row row-cols-4 list-unstyled list">
1879
+ @for (app of data().content; track app) {
1880
+ <li
1881
+ class="col my-2"
1882
+ [tooltip]="app.description | translate"
1883
+ >
1884
+ <a
1885
+ class="d-block text-body-emphasis text-decoration-none"
1886
+ (click)="appSelected(app)"
1887
+ [class.disabled]="!app.enabled"
1888
+ data-modal-reason="ok"
1889
+ >
1890
+ <div class="px-3 py-4 mb-2 bg-body-secondary text-center rounded">
1891
+ <i [ngClass]="app.icon"></i>
1892
+ </div>
1893
+ <div class="name text-muted text-decoration-none text-center pt-1">
1894
+ {{ app.name | translate }}
1895
+ </div>
1896
+ </a>
1897
+ </li>
1898
+ }
1899
+ </ul>
1900
+ </div>
1901
+ `,
1902
+ hostDirectives: [{ directive: ModalDirective, inputs: ['id', 'data-instance', 'data-options'] }],
1903
+ }]
1904
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], valid: [{ type: i0.Input, args: [{ isSignal: true, alias: "valid", required: false }] }, { type: i0.Output, args: ["validChange"] }] } });
1905
+
1768
1906
  class CmsPipe {
1769
- constructor(cmsOptions) {
1770
- this.cmsOptions = cmsOptions;
1907
+ constructor() {
1908
+ this.cmsOptions = inject(RLB_CFG_CMS, { optional: true });
1771
1909
  }
1772
1910
  transform(value, ...args) {
1773
- let cms = this.cmsOptions.endpoint;
1911
+ let cms = this.cmsOptions?.endpoint;
1774
1912
  if (!cms) {
1775
1913
  return value;
1776
1914
  }
1777
- if (cms.endsWith("/")) {
1915
+ if (cms.endsWith('/')) {
1778
1916
  cms = cms.substring(0, cms.length - 1);
1779
1917
  }
1780
- if (value.startsWith("/")) {
1918
+ if (value.startsWith('/')) {
1781
1919
  value = value.substring(1);
1782
1920
  }
1783
1921
  return `${cms}/${value}`;
1784
1922
  }
1785
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CmsPipe, deps: [{ token: RLB_CFG_CMS, optional: true }], target: i0.ɵɵFactoryTarget.Pipe }); }
1786
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.7", ngImport: i0, type: CmsPipe, isStandalone: false, name: "cms" }); }
1923
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmsPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
1924
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: CmsPipe, isStandalone: true, name: "cms" }); }
1787
1925
  }
1788
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CmsPipe, decorators: [{
1926
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmsPipe, decorators: [{
1789
1927
  type: Pipe,
1790
1928
  args: [{
1791
1929
  name: 'cms',
1792
- standalone: false
1793
1930
  }]
1794
- }], ctorParameters: () => [{ type: undefined, decorators: [{
1795
- type: Inject,
1796
- args: [RLB_CFG_CMS]
1797
- }, {
1798
- type: Optional
1799
- }] }] });
1931
+ }] });
1800
1932
 
1801
1933
  class CmsComponent {
1802
- constructor(strapiService, languageService, cmsOptions, mdService) {
1803
- this.strapiService = strapiService;
1804
- this.languageService = languageService;
1805
- this.cmsOptions = cmsOptions;
1806
- this.mdService = mdService;
1807
- }
1808
- ngOnDestroy() {
1809
- this.subscriptionLang?.unsubscribe();
1810
- this.subscriptionPage?.unsubscribe();
1811
- }
1812
- ngOnInit() {
1813
- const lang = this.cmsOptions.useAppLanguage ? this.languageService.language : this.languageService.contentLanguage;
1814
- const page$ = this.strapiService.fetchPage(lang || this.languageService.defaultLanguage, this.contentId || '');
1815
- this.subscriptionLang = this.languageService.languageChanged$.pipe(switchMap(langEvent => {
1816
- if (langEvent.lang) {
1817
- return page$;
1818
- }
1819
- return EMPTY;
1820
- })).subscribe(p => this.page = p);
1821
- this.subscriptionPage = page$.subscribe(p => this.page = p);
1934
+ constructor() {
1935
+ this.strapiService = inject(StrapiService);
1936
+ this.languageService = inject(LanguageService);
1937
+ this.cmsOptions = inject(RLB_CFG_CMS, { optional: true });
1938
+ this.mdService = inject(AbstractMdService, { optional: true });
1939
+ this.contentId = input(...(ngDevMode ? [undefined, { debugName: "contentId" }] : /* istanbul ignore next */ []));
1940
+ this.breadcrumbInput = input(undefined, { ...(ngDevMode ? { debugName: "breadcrumbInput" } : /* istanbul ignore next */ {}), alias: 'breadcrumb' });
1941
+ this.breadcrumb = computed(() => this.breadcrumbInput() ?? [], ...(ngDevMode ? [{ debugName: "breadcrumb" }] : /* istanbul ignore next */ []));
1942
+ this.page = toSignal(combineLatest([
1943
+ this.languageService.languageChanged$.pipe(startWith({ lang: this.languageService.language() })),
1944
+ toObservable(this.contentId),
1945
+ ]).pipe(switchMap(([_, id]) => {
1946
+ const lang = this.cmsOptions?.useAppLanguage
1947
+ ? this.languageService.language()
1948
+ : this.languageService.contentLanguage();
1949
+ if (id === undefined)
1950
+ return EMPTY;
1951
+ return this.strapiService.fetchPage(lang || this.languageService.defaultLanguage, id);
1952
+ })));
1822
1953
  }
1823
1954
  md(md) {
1824
- if (this.cmsOptions.markdown === 'ignore') {
1955
+ if (this.cmsOptions?.markdown === 'ignore') {
1825
1956
  return md;
1826
1957
  }
1827
1958
  else {
1828
1959
  if (!this.mdService) {
1829
1960
  throw new Error('No MdService provided');
1830
1961
  }
1831
- else if (this.cmsOptions.markdown === 'text') {
1962
+ else if (this.cmsOptions?.markdown === 'text') {
1832
1963
  return this.mdService.md2text(md);
1833
1964
  }
1834
- else if (this.cmsOptions.markdown === 'html') {
1965
+ else if (this.cmsOptions?.markdown === 'html') {
1835
1966
  return this.mdService.md2html(md);
1836
1967
  }
1837
1968
  }
1838
1969
  return md;
1839
1970
  }
1840
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CmsComponent, deps: [{ token: StrapiService }, { token: LanguageService }, { token: RLB_CFG_CMS, optional: true }, { token: AbstractMdService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
1841
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: CmsComponent, isStandalone: false, selector: "rlb-cms-template", inputs: { contentId: "contentId", breadcrumb: "breadcrumb" }, ngImport: i0, template: "<div>\n @if (page) {\n <div class=\"container\">\n @if (breadcrumb) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-breadcrumb [items]=\"breadcrumb\"></rlb-breadcrumb>\n </div>\n </div>\n }\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <h1 class=\"text-center\">{{page.Title}}</h1>\n </div>\n </div>\n @if (page.Content) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"page.Content \"></div>\n </div>\n </div>\n }\n @if (page.page_tabs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-tabs>\n @for (tab of page.page_tabs; track tab.id; let i = $index) {\n <rlb-tab [target]=\"'cms-tab-'+i\">\n {{tab.Title}}\n </rlb-tab>\n }\n </rlb-tabs>\n <rlb-tab-content>\n @for (tab of page.page_tabs; track tab.id; let i = $index) {\n <rlb-tab-pane [id]=\"'cms-tab-'+i\">\n <div class=\"container-fluid\">\n @if (tab.Content) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"tab.Content \"></div>\n </div>\n </div>\n }\n @for (step of tab.steps; track step.ContentId; let i = $index) {\n <div class=\"row my-4 mx-auto card-steps\"\n style=\"max-width: 350px; border-bottom: 1px solid rgb(192, 198, 204);\">\n <div class=\"col-8\">\n <div class=\"pb-2\">\n <div style=\"height: 54px; min-width: 54px; width: 54px; border: 5px solid rgb(192, 198, 204);\"\n class=\"round-counter\">\n <span class=\"red\">{{i+1}}</span>\n </div>\n </div>\n <div>\n <div [innerHTML]=\"step.Content \"></div>\n </div>\n </div>\n <div class=\"col-4 pb-2\">\n <img [src]=\"step.Picture.url|cms\">\n </div>\n </div>\n }\n @if (tab.faqs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <h2 class=\"py-3\">{{tab.FaqTitle}}</h2>\n </div>\n </div>\n }\n @if (tab.faqs.length>0 && tab.FaqContent) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"tab.FaqContent \"></div>\n </div>\n </div>\n }\n @if (tab.faqs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-accordion>\n @for (faq of tab.faqs; track faq) {\n <div rlb-accordion-item [expanded]=\"true\">\n <rlb-accordion-header>\n {{faq.Title}}\n </rlb-accordion-header>\n <div rlb-accordion-body>\n <div [innerHTML]=\"faq.Content\"> </div>\n </div>\n </div>\n }\n </rlb-accordion>\n </div>\n </div>\n }\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <span>\n <a routerLink=\"/support\">\n <i class=\"bi bi-info-circle-fill\" style=\"margin-bottom: -6px;margin-right: 6px;\"></i>\n <span>{{'pages.support.infoPage' | translate}}</span>\n </a>\n </span>\n </div>\n </div>\n @if (page.topics.length>0) {\n <div class=\"row my-4\" style=\"padding: 4px\">\n @for (topic of page.topics; track topic.ContentId) {\n <div class=\"col-lg-6 col-md-12 col-sm-12 col-xs-12\">\n <a [routerLink]=\"'/informations/'+topic.page.ContentId\" style=\"color: inherit;text-decoration: none;\">\n <div class=\"card mb-4\" style=\"min-height: 230px;\">\n <img [src]=\"topic.Picture.url | cms\" class=\"card-img-top\"\n style=\"height: 91px; margin: 16px -16px;\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{topic.Title}}</h5>\n <div class=\"card-text\" [innerHTML]=\"topic.Content \"></div>\n </div>\n </div>\n </a>\n </div>\n }\n </div>\n }\n </div>\n </rlb-tab-pane>\n }\n </rlb-tab-content>\n </div>\n </div>\n }\n </div>\n }\n </div>\n", styles: [""], dependencies: [{ kind: "component", type: i2$1.BreadcrumbComponent, selector: "rlb-breadcrumb", inputs: ["divider", "items", "cssClasses"] }, { kind: "component", type: i2$1.AccordionComponent, selector: "rlb-accordion", inputs: ["flush", "always-open", "id", "card-style"] }, { kind: "component", type: i2$1.AccordionItemComponent, selector: "div[rlb-accordion-item]", inputs: ["name", "expanded", "class", "style"], outputs: ["statusChange"] }, { kind: "component", type: i2$1.AccordionHeaderComponent, selector: "rlb-accordion-header" }, { kind: "component", type: i2$1.AccordionBodyComponent, selector: "div[rlb-accordion-body]" }, { kind: "component", type: i2$1.TabsComponent, selector: "rlb-tabs", inputs: ["horizontal-alignment", "view", "vertical", "fill", "id", "class"] }, { kind: "component", type: i2$1.TabComponent, selector: "rlb-tab", inputs: ["active", "disabled", "target", "class"] }, { kind: "component", type: i2$1.TabContentComponent, selector: "rlb-tab-content" }, { kind: "component", type: i2$1.TabPaneComponent, selector: "rlb-tab-pane", inputs: ["id", "active", "fade"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }, { kind: "pipe", type: CmsPipe, name: "cms" }] }); }
1971
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1972
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CmsComponent, isStandalone: true, selector: "rlb-cms-template", inputs: { contentId: { classPropertyName: "contentId", publicName: "contentId", isSignal: true, isRequired: false, transformFunction: null }, breadcrumbInput: { classPropertyName: "breadcrumbInput", publicName: "breadcrumb", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div>\n @if (page(); as p) {\n <div class=\"container\">\n @if (breadcrumb()) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-breadcrumb [items]=\"breadcrumb()\"></rlb-breadcrumb>\n </div>\n </div>\n }\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <h1 class=\"text-center\">{{p.Title}}</h1>\n </div>\n </div>\n @if (p.Content) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"p.Content \"></div>\n </div>\n </div>\n }\n @if (p.page_tabs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-tabs>\n @for (tab of p.page_tabs; track tab.id; let i = $index) {\n <rlb-tab [target]=\"'cms-tab-'+i\">\n {{tab.Title}}\n </rlb-tab>\n }\n </rlb-tabs>\n <rlb-tab-content>\n @for (tab of p.page_tabs; track tab.id; let i = $index) {\n <rlb-tab-pane [id]=\"'cms-tab-'+i\">\n <div class=\"container-fluid\">\n @if (tab.Content) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"tab.Content \"></div>\n </div>\n </div>\n }\n @for (step of tab.steps; track step.ContentId; let i = $index) {\n <div class=\"row my-4 mx-auto card-steps\"\n style=\"max-width: 350px; border-bottom: 1px solid rgb(192, 198, 204);\">\n <div class=\"col-8\">\n <div class=\"pb-2\">\n <div style=\"height: 54px; min-width: 54px; width: 54px; border: 5px solid rgb(192, 198, 204);\"\n class=\"round-counter\">\n <span class=\"red\">{{i+1}}</span>\n </div>\n </div>\n <div>\n <div [innerHTML]=\"step.Content \"></div>\n </div>\n </div>\n <div class=\"col-4 pb-2\">\n <img [src]=\"step.Picture.url|cms\">\n </div>\n </div>\n }\n @if (tab.faqs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <h2 class=\"py-3\">{{tab.FaqTitle}}</h2>\n </div>\n </div>\n }\n @if (tab.faqs.length>0 && tab.FaqContent) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"tab.FaqContent \"></div>\n </div>\n </div>\n }\n @if (tab.faqs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-accordion>\n @for (faq of tab.faqs; track faq) {\n <div rlb-accordion-item [expanded]=\"true\">\n <rlb-accordion-header>\n {{faq.Title}}\n </rlb-accordion-header>\n <div rlb-accordion-body>\n <div [innerHTML]=\"faq.Content\"> </div>\n </div>\n </div>\n }\n </rlb-accordion>\n </div>\n </div>\n }\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <span>\n <a routerLink=\"/support\">\n <i class=\"bi bi-info-circle-fill\" style=\"margin-bottom: -6px;margin-right: 6px;\"></i>\n <span>{{'pages.support.infoPage' | translate}}</span>\n </a>\n </span>\n </div>\n </div>\n @if (p.topics.length>0) {\n <div class=\"row my-4\" style=\"padding: 4px\">\n @for (topic of p.topics; track topic.ContentId) {\n <div class=\"col-lg-6 col-md-12 col-sm-12 col-xs-12\">\n <a [routerLink]=\"'/informations/'+topic.page.ContentId\" style=\"color: inherit;text-decoration: none;\">\n <div class=\"card mb-4\" style=\"min-height: 230px;\">\n <img [src]=\"topic.Picture.url | cms\" class=\"card-img-top\"\n style=\"height: 91px; margin: 16px -16px;\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{topic.Title}}</h5>\n <div class=\"card-text\" [innerHTML]=\"topic.Content \"></div>\n </div>\n </div>\n </a>\n </div>\n }\n </div>\n }\n </div>\n </rlb-tab-pane>\n }\n </rlb-tab-content>\n </div>\n </div>\n }\n </div>\n }\n</div>\n\n", styles: [""], dependencies: [{ kind: "component", type: BreadcrumbComponent, selector: "rlb-breadcrumb", inputs: ["divider", "items", "cssClasses"] }, { kind: "component", type: TabsComponent, selector: "rlb-tabs", inputs: ["horizontal-alignment", "view", "vertical", "fill", "id", "class"] }, { kind: "component", type: TabComponent, selector: "rlb-tab", inputs: ["active", "disabled", "target", "class"] }, { kind: "component", type: TabContentComponent, selector: "rlb-tab-content" }, { kind: "component", type: TabPaneComponent, selector: "rlb-tab-pane", inputs: ["id", "active", "fade"] }, { kind: "component", type: AccordionComponent, selector: "rlb-accordion", inputs: ["flush", "always-open", "id", "card-style"] }, { kind: "component", type: AccordionHeaderComponent, selector: "rlb-accordion-header" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: AccordionBodyComponent, selector: "div[rlb-accordion-body]" }, { kind: "component", type: AccordionItemComponent, selector: "div[rlb-accordion-item]", inputs: ["name", "expanded", "class", "style"], outputs: ["statusChange"] }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }, { kind: "pipe", type: CmsPipe, name: "cms" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1842
1973
  }
1843
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CmsComponent, decorators: [{
1974
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmsComponent, decorators: [{
1844
1975
  type: Component,
1845
- args: [{ selector: 'rlb-cms-template', standalone: false, template: "<div>\n @if (page) {\n <div class=\"container\">\n @if (breadcrumb) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-breadcrumb [items]=\"breadcrumb\"></rlb-breadcrumb>\n </div>\n </div>\n }\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <h1 class=\"text-center\">{{page.Title}}</h1>\n </div>\n </div>\n @if (page.Content) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"page.Content \"></div>\n </div>\n </div>\n }\n @if (page.page_tabs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-tabs>\n @for (tab of page.page_tabs; track tab.id; let i = $index) {\n <rlb-tab [target]=\"'cms-tab-'+i\">\n {{tab.Title}}\n </rlb-tab>\n }\n </rlb-tabs>\n <rlb-tab-content>\n @for (tab of page.page_tabs; track tab.id; let i = $index) {\n <rlb-tab-pane [id]=\"'cms-tab-'+i\">\n <div class=\"container-fluid\">\n @if (tab.Content) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"tab.Content \"></div>\n </div>\n </div>\n }\n @for (step of tab.steps; track step.ContentId; let i = $index) {\n <div class=\"row my-4 mx-auto card-steps\"\n style=\"max-width: 350px; border-bottom: 1px solid rgb(192, 198, 204);\">\n <div class=\"col-8\">\n <div class=\"pb-2\">\n <div style=\"height: 54px; min-width: 54px; width: 54px; border: 5px solid rgb(192, 198, 204);\"\n class=\"round-counter\">\n <span class=\"red\">{{i+1}}</span>\n </div>\n </div>\n <div>\n <div [innerHTML]=\"step.Content \"></div>\n </div>\n </div>\n <div class=\"col-4 pb-2\">\n <img [src]=\"step.Picture.url|cms\">\n </div>\n </div>\n }\n @if (tab.faqs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <h2 class=\"py-3\">{{tab.FaqTitle}}</h2>\n </div>\n </div>\n }\n @if (tab.faqs.length>0 && tab.FaqContent) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"tab.FaqContent \"></div>\n </div>\n </div>\n }\n @if (tab.faqs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-accordion>\n @for (faq of tab.faqs; track faq) {\n <div rlb-accordion-item [expanded]=\"true\">\n <rlb-accordion-header>\n {{faq.Title}}\n </rlb-accordion-header>\n <div rlb-accordion-body>\n <div [innerHTML]=\"faq.Content\"> </div>\n </div>\n </div>\n }\n </rlb-accordion>\n </div>\n </div>\n }\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <span>\n <a routerLink=\"/support\">\n <i class=\"bi bi-info-circle-fill\" style=\"margin-bottom: -6px;margin-right: 6px;\"></i>\n <span>{{'pages.support.infoPage' | translate}}</span>\n </a>\n </span>\n </div>\n </div>\n @if (page.topics.length>0) {\n <div class=\"row my-4\" style=\"padding: 4px\">\n @for (topic of page.topics; track topic.ContentId) {\n <div class=\"col-lg-6 col-md-12 col-sm-12 col-xs-12\">\n <a [routerLink]=\"'/informations/'+topic.page.ContentId\" style=\"color: inherit;text-decoration: none;\">\n <div class=\"card mb-4\" style=\"min-height: 230px;\">\n <img [src]=\"topic.Picture.url | cms\" class=\"card-img-top\"\n style=\"height: 91px; margin: 16px -16px;\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{topic.Title}}</h5>\n <div class=\"card-text\" [innerHTML]=\"topic.Content \"></div>\n </div>\n </div>\n </a>\n </div>\n }\n </div>\n }\n </div>\n </rlb-tab-pane>\n }\n </rlb-tab-content>\n </div>\n </div>\n }\n </div>\n }\n </div>\n" }]
1846
- }], ctorParameters: () => [{ type: StrapiService }, { type: LanguageService }, { type: undefined, decorators: [{
1847
- type: Inject,
1848
- args: [RLB_CFG_CMS]
1849
- }, {
1850
- type: Optional
1851
- }] }, { type: AbstractMdService, decorators: [{
1852
- type: Optional
1853
- }] }], propDecorators: { contentId: [{
1854
- type: Input
1855
- }], breadcrumb: [{
1856
- type: Input
1857
- }] } });
1976
+ args: [{ selector: 'rlb-cms-template', imports: [
1977
+ BreadcrumbComponent,
1978
+ TabsComponent,
1979
+ TabComponent,
1980
+ TabContentComponent,
1981
+ TabPaneComponent,
1982
+ AccordionComponent,
1983
+ AccordionHeaderComponent,
1984
+ RouterModule,
1985
+ TranslateModule,
1986
+ CmsPipe,
1987
+ AccordionBodyComponent,
1988
+ AccordionItemComponent,
1989
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\n @if (page(); as p) {\n <div class=\"container\">\n @if (breadcrumb()) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-breadcrumb [items]=\"breadcrumb()\"></rlb-breadcrumb>\n </div>\n </div>\n }\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <h1 class=\"text-center\">{{p.Title}}</h1>\n </div>\n </div>\n @if (p.Content) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"p.Content \"></div>\n </div>\n </div>\n }\n @if (p.page_tabs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-tabs>\n @for (tab of p.page_tabs; track tab.id; let i = $index) {\n <rlb-tab [target]=\"'cms-tab-'+i\">\n {{tab.Title}}\n </rlb-tab>\n }\n </rlb-tabs>\n <rlb-tab-content>\n @for (tab of p.page_tabs; track tab.id; let i = $index) {\n <rlb-tab-pane [id]=\"'cms-tab-'+i\">\n <div class=\"container-fluid\">\n @if (tab.Content) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"tab.Content \"></div>\n </div>\n </div>\n }\n @for (step of tab.steps; track step.ContentId; let i = $index) {\n <div class=\"row my-4 mx-auto card-steps\"\n style=\"max-width: 350px; border-bottom: 1px solid rgb(192, 198, 204);\">\n <div class=\"col-8\">\n <div class=\"pb-2\">\n <div style=\"height: 54px; min-width: 54px; width: 54px; border: 5px solid rgb(192, 198, 204);\"\n class=\"round-counter\">\n <span class=\"red\">{{i+1}}</span>\n </div>\n </div>\n <div>\n <div [innerHTML]=\"step.Content \"></div>\n </div>\n </div>\n <div class=\"col-4 pb-2\">\n <img [src]=\"step.Picture.url|cms\">\n </div>\n </div>\n }\n @if (tab.faqs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <h2 class=\"py-3\">{{tab.FaqTitle}}</h2>\n </div>\n </div>\n }\n @if (tab.faqs.length>0 && tab.FaqContent) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <div [innerHTML]=\"tab.FaqContent \"></div>\n </div>\n </div>\n }\n @if (tab.faqs.length>0) {\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <rlb-accordion>\n @for (faq of tab.faqs; track faq) {\n <div rlb-accordion-item [expanded]=\"true\">\n <rlb-accordion-header>\n {{faq.Title}}\n </rlb-accordion-header>\n <div rlb-accordion-body>\n <div [innerHTML]=\"faq.Content\"> </div>\n </div>\n </div>\n }\n </rlb-accordion>\n </div>\n </div>\n }\n <div class=\"row my-4\">\n <div class=\"col-12\">\n <span>\n <a routerLink=\"/support\">\n <i class=\"bi bi-info-circle-fill\" style=\"margin-bottom: -6px;margin-right: 6px;\"></i>\n <span>{{'pages.support.infoPage' | translate}}</span>\n </a>\n </span>\n </div>\n </div>\n @if (p.topics.length>0) {\n <div class=\"row my-4\" style=\"padding: 4px\">\n @for (topic of p.topics; track topic.ContentId) {\n <div class=\"col-lg-6 col-md-12 col-sm-12 col-xs-12\">\n <a [routerLink]=\"'/informations/'+topic.page.ContentId\" style=\"color: inherit;text-decoration: none;\">\n <div class=\"card mb-4\" style=\"min-height: 230px;\">\n <img [src]=\"topic.Picture.url | cms\" class=\"card-img-top\"\n style=\"height: 91px; margin: 16px -16px;\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{topic.Title}}</h5>\n <div class=\"card-text\" [innerHTML]=\"topic.Content \"></div>\n </div>\n </div>\n </a>\n </div>\n }\n </div>\n }\n </div>\n </rlb-tab-pane>\n }\n </rlb-tab-content>\n </div>\n </div>\n }\n </div>\n }\n</div>\n\n" }]
1990
+ }], propDecorators: { contentId: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentId", required: false }] }], breadcrumbInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "breadcrumb", required: false }] }] } });
1858
1991
 
1859
1992
  class CmsContentComponent {
1860
- constructor(route) {
1861
- this.route = route;
1862
- }
1863
- get contentId() {
1864
- return this.route.snapshot.params['id'];
1993
+ constructor() {
1994
+ this.route = inject(ActivatedRoute);
1995
+ this.contentId = toSignal(this.route.params.pipe(map(params => params['id'])), { initialValue: this.route.snapshot.params['id'] });
1865
1996
  }
1866
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CmsContentComponent, deps: [{ token: i2.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
1867
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: CmsContentComponent, isStandalone: false, selector: "rlb-cms-content", ngImport: i0, template: "<rlb-cms-template [contentId]=\"contentId\"></rlb-cms-template>", styles: [""], dependencies: [{ kind: "component", type: CmsComponent, selector: "rlb-cms-template", inputs: ["contentId", "breadcrumb"] }] }); }
1997
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmsContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1998
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: CmsContentComponent, isStandalone: true, selector: "rlb-cms-content", ngImport: i0, template: "<rlb-cms-template [contentId]=\"contentId()\"></rlb-cms-template>", styles: [""], dependencies: [{ kind: "component", type: CmsComponent, selector: "rlb-cms-template", inputs: ["contentId", "breadcrumb"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1868
1999
  }
1869
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CmsContentComponent, decorators: [{
2000
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmsContentComponent, decorators: [{
1870
2001
  type: Component,
1871
- args: [{ selector: 'rlb-cms-content', standalone: false, template: "<rlb-cms-template [contentId]=\"contentId\"></rlb-cms-template>" }]
1872
- }], ctorParameters: () => [{ type: i2.ActivatedRoute }] });
2002
+ args: [{ selector: 'rlb-cms-content', imports: [CmsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<rlb-cms-template [contentId]=\"contentId()\"></rlb-cms-template>" }]
2003
+ }] });
1873
2004
 
1874
2005
  class CookiesComponent {
1875
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookiesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1876
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: CookiesComponent, isStandalone: false, selector: "rlb-cookies", ngImport: i0, template: "<rlb-cms-template contentId=\"adb_cookies\"></rlb-cms-template>", styles: [""], dependencies: [{ kind: "component", type: CmsComponent, selector: "rlb-cms-template", inputs: ["contentId", "breadcrumb"] }] }); }
2006
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CookiesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2007
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: CookiesComponent, isStandalone: true, selector: "rlb-cookies", ngImport: i0, template: "<rlb-cms-template contentId=\"adb_cookies\"></rlb-cms-template>", styles: [""], dependencies: [{ kind: "component", type: CmsComponent, selector: "rlb-cms-template", inputs: ["contentId", "breadcrumb"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1877
2008
  }
1878
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: CookiesComponent, decorators: [{
2009
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CookiesComponent, decorators: [{
1879
2010
  type: Component,
1880
- args: [{ selector: 'rlb-cookies', standalone: false, template: "<rlb-cms-template contentId=\"adb_cookies\"></rlb-cms-template>" }]
2011
+ args: [{ selector: 'rlb-cookies', imports: [CmsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<rlb-cms-template contentId=\"adb_cookies\"></rlb-cms-template>" }]
1881
2012
  }] });
1882
2013
 
1883
2014
  class NotFoundComponent {
1884
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: NotFoundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1885
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: NotFoundComponent, isStandalone: false, selector: "rlb-not-found", ngImport: i0, template: "<div class=\"container\" style=\"height:calc(100vh - 58px);\">\n <div class=\"align-center\">\n <div class=\"text-center\">\n <h1 class=\"text-primary\">\n {{ 'pages.notFound.title' | translate }}\n </h1>\n <p>{{ 'pages.notFound.content' | translate }}</p><a href=\"/\" class=\"btn btn-outline-primary\">\n <span>\n {{ 'pages.notFound.button' | translate }}\n </span></a>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }] }); }
2015
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NotFoundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2016
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: NotFoundComponent, isStandalone: true, selector: "rlb-not-found", ngImport: i0, template: "<div class=\"container\" style=\"height:calc(100vh - 58px);\">\n <div class=\"align-center\">\n <div class=\"text-center\">\n <h1 class=\"text-primary\">\n {{ 'pages.notFound.title' | translate }}\n </h1>\n <p>{{ 'pages.notFound.content' | translate }}</p><a href=\"/\" class=\"btn btn-outline-primary\">\n <span>\n {{ 'pages.notFound.button' | translate }}\n </span></a>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1886
2017
  }
1887
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: NotFoundComponent, decorators: [{
2018
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NotFoundComponent, decorators: [{
1888
2019
  type: Component,
1889
- args: [{ selector: 'rlb-not-found', standalone: false, template: "<div class=\"container\" style=\"height:calc(100vh - 58px);\">\n <div class=\"align-center\">\n <div class=\"text-center\">\n <h1 class=\"text-primary\">\n {{ 'pages.notFound.title' | translate }}\n </h1>\n <p>{{ 'pages.notFound.content' | translate }}</p><a href=\"/\" class=\"btn btn-outline-primary\">\n <span>\n {{ 'pages.notFound.button' | translate }}\n </span></a>\n </div>\n </div>\n</div>\n" }]
2020
+ args: [{ selector: 'rlb-not-found', imports: [TranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container\" style=\"height:calc(100vh - 58px);\">\n <div class=\"align-center\">\n <div class=\"text-center\">\n <h1 class=\"text-primary\">\n {{ 'pages.notFound.title' | translate }}\n </h1>\n <p>{{ 'pages.notFound.content' | translate }}</p><a href=\"/\" class=\"btn btn-outline-primary\">\n <span>\n {{ 'pages.notFound.button' | translate }}\n </span></a>\n </div>\n </div>\n</div>\n" }]
1890
2021
  }] });
1891
2022
 
1892
2023
  class PrivacyComponent {
1893
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: PrivacyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1894
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: PrivacyComponent, isStandalone: false, selector: "rlb-privacy", ngImport: i0, template: "<rlb-cms-template contentId=\"adb_privacy\"></rlb-cms-template>", styles: [""], dependencies: [{ kind: "component", type: CmsComponent, selector: "rlb-cms-template", inputs: ["contentId", "breadcrumb"] }] }); }
2024
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PrivacyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2025
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: PrivacyComponent, isStandalone: true, selector: "rlb-privacy", ngImport: i0, template: "<rlb-cms-template contentId=\"adb_privacy\"></rlb-cms-template>", styles: [""], dependencies: [{ kind: "component", type: CmsComponent, selector: "rlb-cms-template", inputs: ["contentId", "breadcrumb"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1895
2026
  }
1896
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: PrivacyComponent, decorators: [{
2027
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PrivacyComponent, decorators: [{
1897
2028
  type: Component,
1898
- args: [{ selector: 'rlb-privacy', standalone: false, template: "<rlb-cms-template contentId=\"adb_privacy\"></rlb-cms-template>" }]
2029
+ args: [{ selector: 'rlb-privacy', imports: [CmsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<rlb-cms-template contentId=\"adb_privacy\"></rlb-cms-template>" }]
1899
2030
  }] });
1900
2031
 
1901
2032
  class SupportComponent {
1902
- constructor(supportService, _location) {
1903
- this.supportService = supportService;
1904
- this._location = _location;
2033
+ constructor() {
2034
+ this.supportService = inject(AbstractSupportService);
2035
+ this._location = inject(Location);
1905
2036
  this.supportForm = new FormGroup({
1906
2037
  name: new FormControl('', [Validators.required]),
1907
2038
  email: new FormControl('', [Validators.required, Validators.email]),
@@ -1911,11 +2042,10 @@ class SupportComponent {
1911
2042
  });
1912
2043
  }
1913
2044
  hasError(form, controlName, errorName) {
1914
- switch (form) {
1915
- case 'supportForm':
1916
- return this.supportForm.controls[controlName].hasError(errorName);
1917
- default: return false;
2045
+ if (form === 'supportForm') {
2046
+ return this.supportForm.get(controlName)?.hasError(errorName);
1918
2047
  }
2048
+ return false;
1919
2049
  }
1920
2050
  sendSupport(data) {
1921
2051
  if (this.supportForm.valid) {
@@ -1926,21 +2056,21 @@ class SupportComponent {
1926
2056
  this._location.back();
1927
2057
  }
1928
2058
  ngOnInit() { }
1929
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SupportComponent, deps: [{ token: AbstractSupportService }, { token: i1$6.Location }], target: i0.ɵɵFactoryTarget.Component }); }
1930
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: SupportComponent, isStandalone: false, selector: "rlb-support", ngImport: i0, template: "<div class=\"container mt-2 mb-5\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'pages.support.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <form [formGroup]=\"supportForm\" class=\"needs-validation\" (ngSubmit)=\"sendSupport(supportForm.value)\">\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.name' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"name\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.email' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"email\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.subject' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"subject\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.message' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"message\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.legal' | translate}}</h6>\n <span>{{ 'pages.support.infoPage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" formControlName=\"legal\" />\n </div>\n </div>\n </rlb-list-item>\n </rlb-list>\n </form>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2$1.InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "inputId", "extValidation", "enable-validation"] }, { kind: "component", type: i2$1.SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "component", type: i2$1.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i2$1.ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }] }); }
2059
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SupportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2060
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: SupportComponent, isStandalone: true, selector: "rlb-support", ngImport: i0, template: "<div class=\"container mt-2 mb-5\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'pages.support.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <form [formGroup]=\"supportForm\" class=\"needs-validation\" (ngSubmit)=\"sendSupport(supportForm.value)\">\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.name' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"name\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.email' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"email\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.subject' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"subject\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.message' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"message\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.legal' | translate}}</h6>\n <span>{{ 'pages.support.infoPage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" formControlName=\"legal\" />\n </div>\n </div>\n </rlb-list-item>\n </rlb-list>\n </form>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "component", type: InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "inputId", "extValidation", "enable-validation"] }, { kind: "component", type: SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1931
2061
  }
1932
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SupportComponent, decorators: [{
2062
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SupportComponent, decorators: [{
1933
2063
  type: Component,
1934
- args: [{ selector: 'rlb-support', standalone: false, template: "<div class=\"container mt-2 mb-5\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'pages.support.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <form [formGroup]=\"supportForm\" class=\"needs-validation\" (ngSubmit)=\"sendSupport(supportForm.value)\">\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.name' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"name\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.email' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"email\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.subject' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"subject\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.message' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"message\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.legal' | translate}}</h6>\n <span>{{ 'pages.support.infoPage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" formControlName=\"legal\" />\n </div>\n </div>\n </rlb-list-item>\n </rlb-list>\n </form>\n</div>\n" }]
1935
- }], ctorParameters: () => [{ type: AbstractSupportService }, { type: i1$6.Location }] });
2064
+ args: [{ selector: 'rlb-support', imports: [ReactiveFormsModule, TranslateModule, ListComponent, ListItemComponent, InputComponent, SwitchComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container mt-2 mb-5\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'pages.support.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <form [formGroup]=\"supportForm\" class=\"needs-validation\" (ngSubmit)=\"sendSupport(supportForm.value)\">\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.name' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"name\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.email' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"email\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.subject' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"subject\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.message' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-input type=\"text\" size=\"small\" formControlName=\"message\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'pages.support.legal' | translate}}</h6>\n <span>{{ 'pages.support.infoPage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" formControlName=\"legal\" />\n </div>\n </div>\n </rlb-list-item>\n </rlb-list>\n </form>\n</div>\n" }]
2065
+ }] });
1936
2066
 
1937
2067
  class TermsAndConditionsComponent {
1938
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TermsAndConditionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1939
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: TermsAndConditionsComponent, isStandalone: false, selector: "rlb-terms-and-conditions", ngImport: i0, template: "<rlb-cms-template contentId=\"adb_terms\"></rlb-cms-template>", styles: [""], dependencies: [{ kind: "component", type: CmsComponent, selector: "rlb-cms-template", inputs: ["contentId", "breadcrumb"] }] }); }
2068
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TermsAndConditionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2069
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: TermsAndConditionsComponent, isStandalone: true, selector: "rlb-terms-and-conditions", ngImport: i0, template: "<rlb-cms-template contentId=\"adb_terms\"></rlb-cms-template>", styles: [""], dependencies: [{ kind: "component", type: CmsComponent, selector: "rlb-cms-template", inputs: ["contentId", "breadcrumb"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1940
2070
  }
1941
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TermsAndConditionsComponent, decorators: [{
2071
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TermsAndConditionsComponent, decorators: [{
1942
2072
  type: Component,
1943
- args: [{ selector: 'rlb-terms-and-conditions', standalone: false, template: "<rlb-cms-template contentId=\"adb_terms\"></rlb-cms-template>" }]
2073
+ args: [{ selector: 'rlb-terms-and-conditions', imports: [CmsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<rlb-cms-template contentId=\"adb_terms\"></rlb-cms-template>" }]
1944
2074
  }] });
1945
2075
 
1946
2076
  class AsMultiPipe {
@@ -1950,14 +2080,13 @@ class AsMultiPipe {
1950
2080
  }
1951
2081
  return value;
1952
2082
  }
1953
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AsMultiPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
1954
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.7", ngImport: i0, type: AsMultiPipe, isStandalone: false, name: "asMulti" }); }
2083
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AsMultiPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2084
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AsMultiPipe, isStandalone: true, name: "asMulti" }); }
1955
2085
  }
1956
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AsMultiPipe, decorators: [{
2086
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AsMultiPipe, decorators: [{
1957
2087
  type: Pipe,
1958
2088
  args: [{
1959
- name: 'asMulti',
1960
- standalone: false
2089
+ name: 'asMulti'
1961
2090
  }]
1962
2091
  }] });
1963
2092
  class AsSinglePipe {
@@ -1967,14 +2096,13 @@ class AsSinglePipe {
1967
2096
  }
1968
2097
  return value;
1969
2098
  }
1970
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AsSinglePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
1971
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.7", ngImport: i0, type: AsSinglePipe, isStandalone: false, name: "asSingle" }); }
2099
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AsSinglePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2100
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AsSinglePipe, isStandalone: true, name: "asSingle" }); }
1972
2101
  }
1973
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AsSinglePipe, decorators: [{
2102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AsSinglePipe, decorators: [{
1974
2103
  type: Pipe,
1975
2104
  args: [{
1976
- name: 'asSingle',
1977
- standalone: false
2105
+ name: 'asSingle'
1978
2106
  }]
1979
2107
  }] });
1980
2108
 
@@ -1995,12 +2123,39 @@ class SettingsDropdownSelectorComponent {
1995
2123
  this.router = inject(Router);
1996
2124
  this.menu = viewChild('menu', ...(ngDevMode ? [{ debugName: "menu" }] : /* istanbul ignore next */ []));
1997
2125
  this.appsService = inject(AppsService);
1998
- this.router.events.subscribe(() => this.close());
2126
+ this.pages = computed(() => this.pageOptions, ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
2127
+ this.languages = computed(() => {
2128
+ return this.store.selectSignal(o => o[appContextFeatureKey].supportedLanguages)().map((lang) => {
2129
+ return {
2130
+ value: lang,
2131
+ label: this.languageService.getLanguageName(lang),
2132
+ };
2133
+ });
2134
+ }, ...(ngDevMode ? [{ debugName: "languages" }] : /* istanbul ignore next */ []));
2135
+ this.currentLanguage = toSignal(this.store.select(o => o[appContextFeatureKey].language), { initialValue: 'en' });
2136
+ this.darkMode = computed(() => this.store.selectSignal(o => o[appContextFeatureKey].theme)() === 'dark', ...(ngDevMode ? [{ debugName: "darkMode" }] : /* istanbul ignore next */ []));
2137
+ this.currentAppId = computed(() => this.appsService.currentApp()?.id, ...(ngDevMode ? [{ debugName: "currentAppId" }] : /* istanbul ignore next */ []));
2138
+ this.router.events.pipe(takeUntilDestroyed()).subscribe(() => this.close());
1999
2139
  }
2000
- get pages() {
2001
- return this.pageOptions;
2140
+ setCurrentLanguage(value) {
2141
+ this.store.dispatch(AppContextActions.setLanguage({ language: value }));
2142
+ this.toastService.openToast('toast-c-1', 'toast-component', {
2143
+ title: this.languageService.translate('common.saved'),
2144
+ content: this.languageService.translate('common.savedSuccessfully'),
2145
+ type: 'success',
2146
+ ok: this.languageService.translate('ok'),
2147
+ });
2002
2148
  }
2003
- selectApp(app) {
2149
+ setDarkMode(value) {
2150
+ this.store.dispatch(AppContextActions.setTheme({ theme: value ? 'dark' : 'light' }));
2151
+ this.toastService.openToast('toast-c-1', 'toast-component', {
2152
+ title: this.languageService.translate('common.saved'),
2153
+ content: this.languageService.translate('common.savedSuccessfully'),
2154
+ type: 'success',
2155
+ ok: this.languageService.translate('ok'),
2156
+ });
2157
+ }
2158
+ selectApp(app) {
2004
2159
  this.appSelected.emit(app);
2005
2160
  }
2006
2161
  goToFirstSlide() {
@@ -2019,86 +2174,77 @@ class SettingsDropdownSelectorComponent {
2019
2174
  }
2020
2175
  }
2021
2176
  isAppSelected(appId) {
2022
- if (appId) {
2023
- return this.appsService.isAppSelected(appId);
2024
- }
2025
- else {
2026
- console.error('AppId is not defined');
2027
- return false;
2028
- }
2029
- }
2030
- get languages() {
2031
- return this.store
2032
- .selectSignal(o => o[appContextFeatureKey].supportedLanguages)()
2033
- .map((lang) => {
2034
- return {
2035
- value: lang,
2036
- label: this.languageService.getLanguageName(lang),
2037
- };
2038
- });
2039
- }
2040
- get currentLanguage() {
2041
- return this.store.selectSignal(o => o[appContextFeatureKey].language)();
2042
- }
2043
- set currentLanguage(value) {
2044
- this.store.dispatch(AppContextActions.setLanguage({ language: value }));
2045
- this.toastService.openToast('toast-c-1', 'toast-component', {
2046
- title: this.languageService.translate('common.saved'),
2047
- content: this.languageService.translate('common.savedSuccessfully'),
2048
- type: 'success',
2049
- ok: this.languageService.translate('ok'),
2050
- });
2051
- }
2052
- get darkMode() {
2053
- return this.store.selectSignal(o => o[appContextFeatureKey].theme)() === 'dark';
2054
- }
2055
- set darkMode(value) {
2056
- this.store.dispatch(AppContextActions.setTheme({ theme: value ? 'dark' : 'light' }));
2057
- this.toastService.openToast('toast-c-1', 'toast-component', {
2058
- title: this.languageService.translate('common.saved'),
2059
- content: this.languageService.translate('common.savedSuccessfully'),
2060
- type: 'success',
2061
- ok: this.languageService.translate('ok'),
2062
- });
2177
+ return this.currentAppId() === appId;
2063
2178
  }
2064
2179
  close() {
2065
2180
  this.menu()?.close();
2066
2181
  }
2067
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SettingsDropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2068
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: SettingsDropdownSelectorComponent, isStandalone: false, selector: "rlb-settings-dropdown-selector", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, apps: { classPropertyName: "apps", publicName: "apps", isSignal: true, isRequired: true, transformFunction: null }, isAuthenticated: { classPropertyName: "isAuthenticated", publicName: "isAuthenticated", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { appSelected: "appSelected" }, viewQueries: [{ propertyName: "menu", first: true, predicate: ["menu"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item #menu dropdown auto-close=\"outside\" (status-changed)=\"change($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') | translate\">\n <i class=\"bi bi-gear fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n </div>\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <!-- Inline mode for Offcanvas -->\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n}\n\n<ng-template #settingsCarousel>\n <rlb-carousel [hide-indicators]=\"true\" [hide-controls]=\"true\" autoplay=\"none\"[no-touch]=\"true\" [(current-slide)]=\"activeSlide\" class=\"w-100 d-block\">\n <rlb-carousel-slide [active]=\"true\">\n <div class=\"p-3\">\n <h6 class=\"dropdown-header px-0 text-center mb-2 fw-bold text-dark\">\n {{ 'core.settings.title' | translate }}\n </h6>\n\n <div class=\"row row-cols-3 g-2\">\n\n @if (isAuthenticated()) {\n <!-- General Settings -->\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n (click)=\"goToInlineSettings()\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-person fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.account.settings.title' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Dynamic App Settings -->\n @for (app of apps(); track app.id) {\n @if (app.settings && app.enabled && (app.settings.auth && (isAuthenticated()))) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n [class.active]=\"isAppSelected(app.id)\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i [ngClass]=\"['bi', 'fs-4', 'mb-1', app.settings.icon || 'bi-gear']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\">\n {{ app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n\n <!-- System / Status -->\n @if (pages?.['status']?.path) {\n <div class=\"col\">\n <button rlb-button outline color=\"primary\" routerLink=\"/status\" routerLinkActive=\"active\" class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-check2-circle fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.settings.status' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Logger -->\n @if (pages?.['logger']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/logger\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-file-text fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.logger' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Privacy -->\n @if (pages?.['privacy']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/privacy\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-shield-check fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.privacy' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Cookies -->\n @if (pages?.['cookies']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/cookies\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-cookie fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.cookies' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Terms -->\n @if (pages?.['terms']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/terms\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-vector-pen fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.legal' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Support -->\n @if (pages?.['support']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/support\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-chat-quote fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.support' | translate }}\n </span>\n </button>\n </div>\n }\n\n </div>\n </div>\n </rlb-carousel-slide>\n\n <rlb-carousel-slide>\n <div class=\"p-3\">\n\n <!-- Header -->\n <div class=\"d-flex align-items-center mb-3\">\n <button class=\"btn btn-sm btn-link text-reset p-0 me-2 border-0 text-decoration-none\" (click)=\"goToFirstSlide()\">\n <i class=\"bi bi-arrow-left fs-5\"></i>\n </button>\n <h6 class=\"mb-0 fw-bold\">{{ 'core.account.settings.title' | translate }}</h6>\n </div>\n\n <rlb-list class=\"settings\">\n\n <!-- Theme Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalTheme' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [(ngModel)]=\"darkMode\" />\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Language Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalLanguage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [(ngModel)]=\"currentLanguage\">\n @for (l of languages; track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Show More -->\n <rlb-list-item action class=\"settings-item\" routerLink=\"/profile\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.settings.showMore' | translate }}</span>\n </div>\n <div class=\"settings-control text-primary\">\n <i class=\"bi bi-arrow-up-right-square fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Logout -->\n <rlb-list-item action (click)=\"logout()\" class=\"settings-item\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center text-danger\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.logout' | translate }}</span>\n </div>\n <div class=\"settings-control\">\n <i class=\"bi bi-box-arrow-left fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n </rlb-list>\n </div>\n </rlb-carousel-slide>\n </rlb-carousel>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2$1.SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "component", type: i2$1.SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "inputId", "enable-validation"] }, { kind: "component", type: i2$1.OptionComponent, selector: "rlb-option", inputs: ["value", "disabled"] }, { kind: "component", type: i2$1.ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "directive", type: i2$1.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "component", type: i2$1.DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "component", type: i2$1.NavbarDropdownItemComponent, selector: "rlb-navbar-dropdown-item", inputs: ["disabled", "dropdown", "href", "class", "toggle", "auto-close"], outputs: ["click", "status-changed"] }, { kind: "component", type: i2$1.CarouselComponent, selector: "rlb-carousel", inputs: ["id", "hide-indicators", "hide-controls", "cross-fade", "autoplay", "interval", "pause", "wrap", "no-touch", "keyboard", "current-slide"], outputs: ["slid", "slide", "current-slideChange", "slide-count"] }, { kind: "component", type: i2$1.CarouselSlideComponent, selector: "rlb-carousel-slide", inputs: ["active", "id"] }, { kind: "component", type: i2$1.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i2$1.ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }] }); }
2182
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsDropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2183
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SettingsDropdownSelectorComponent, isStandalone: true, selector: "rlb-settings-dropdown-selector", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, apps: { classPropertyName: "apps", publicName: "apps", isSignal: true, isRequired: true, transformFunction: null }, isAuthenticated: { classPropertyName: "isAuthenticated", publicName: "isAuthenticated", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { appSelected: "appSelected" }, viewQueries: [{ propertyName: "menu", first: true, predicate: ["menu"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item #menu dropdown auto-close=\"outside\" (status-changed)=\"change($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') | translate\">\n <i class=\"bi bi-gear fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n </div>\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <!-- Inline mode for Offcanvas -->\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n}\n\n<ng-template #settingsCarousel>\n <rlb-carousel [hide-indicators]=\"true\" [hide-controls]=\"true\" autoplay=\"none\" [no-touch]=\"true\" [(current-slide)]=\"activeSlide\" class=\"w-100 d-block\">\n <rlb-carousel-slide [active]=\"true\">\n <div class=\"p-3\">\n <h6 class=\"dropdown-header px-0 text-center mb-2 fw-bold text-dark\">\n {{ 'core.settings.title' | translate }}\n </h6>\n\n <div class=\"row row-cols-3 g-2\">\n\n @if (isAuthenticated()) {\n <!-- General Settings -->\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n (click)=\"goToInlineSettings()\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-person fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.account.settings.title' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Dynamic App Settings -->\n @for (app of apps(); track app.id) {\n @if (app.settings && app.enabled && (app.settings.auth && (isAuthenticated()))) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n [class.active]=\"isAppSelected(app.id)\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i [ngClass]=\"['bi', 'fs-4', 'mb-1', app.settings.icon || 'bi-gear']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\">\n {{ app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n\n <!-- System / Status -->\n @if (pages()?.['status']?.path) {\n <div class=\"col\">\n <button rlb-button outline color=\"primary\" routerLink=\"/status\" routerLinkActive=\"active\" class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-check2-circle fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.settings.status' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Logger -->\n @if (pages()?.['logger']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/logger\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-file-text fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.logger' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Privacy -->\n @if (pages()?.['privacy']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/privacy\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-shield-check fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.privacy' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Cookies -->\n @if (pages()?.['cookies']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/cookies\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-cookie fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.cookies' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Terms -->\n @if (pages()?.['terms']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/terms\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-vector-pen fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.legal' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Support -->\n @if (pages()?.['support']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/support\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-chat-quote fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.support' | translate }}\n </span>\n </button>\n </div>\n }\n\n </div>\n </div>\n </rlb-carousel-slide>\n\n <rlb-carousel-slide>\n <div class=\"p-3\">\n\n <!-- Header -->\n <div class=\"d-flex align-items-center mb-3\">\n <button class=\"btn btn-sm btn-link text-reset p-0 me-2 border-0 text-decoration-none\" (click)=\"goToFirstSlide()\">\n <i class=\"bi bi-arrow-left fs-5\"></i>\n </button>\n <h6 class=\"mb-0 fw-bold\">{{ 'core.account.settings.title' | translate }}</h6>\n </div>\n\n <rlb-list class=\"settings\">\n\n <!-- Theme Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalTheme' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [ngModel]=\"darkMode()\" (ngModelChange)=\"setDarkMode($event)\" />\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Language Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalLanguage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [ngModel]=\"currentLanguage()\" (ngModelChange)=\"setCurrentLanguage($event)\">\n @for (l of languages(); track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Show More -->\n <rlb-list-item action class=\"settings-item\" routerLink=\"/profile\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.settings.showMore' | translate }}</span>\n </div>\n <div class=\"settings-control text-primary\">\n <i class=\"bi bi-arrow-up-right-square fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Logout -->\n <rlb-list-item action (click)=\"logout()\" class=\"settings-item\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center text-danger\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.logout' | translate }}</span>\n </div>\n <div class=\"settings-control\">\n <i class=\"bi bi-box-arrow-left fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n </rlb-list>\n </div>\n </rlb-carousel-slide>\n </rlb-carousel>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "component", type: NavbarDropdownItemComponent, selector: "rlb-navbar-dropdown-item", inputs: ["disabled", "dropdown", "href", "class", "toggle", "auto-close"], outputs: ["click", "status-changed"] }, { kind: "component", type: DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "component", type: CarouselComponent, selector: "rlb-carousel", inputs: ["id", "hide-indicators", "hide-controls", "cross-fade", "autoplay", "interval", "pause", "wrap", "no-touch", "keyboard", "current-slide"], outputs: ["slid", "slide", "current-slideChange", "slide-count"] }, { kind: "component", type: CarouselSlideComponent, selector: "rlb-carousel-slide", inputs: ["active", "id"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "component", type: ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "component", type: SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "component", type: SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "inputId", "enable-validation"] }, { kind: "component", type: OptionComponent, selector: "rlb-option", inputs: ["value", "disabled"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2069
2184
  }
2070
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SettingsDropdownSelectorComponent, decorators: [{
2185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsDropdownSelectorComponent, decorators: [{
2071
2186
  type: Component,
2072
- args: [{ selector: 'rlb-settings-dropdown-selector', standalone: false, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item #menu dropdown auto-close=\"outside\" (status-changed)=\"change($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') | translate\">\n <i class=\"bi bi-gear fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n </div>\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <!-- Inline mode for Offcanvas -->\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n}\n\n<ng-template #settingsCarousel>\n <rlb-carousel [hide-indicators]=\"true\" [hide-controls]=\"true\" autoplay=\"none\"[no-touch]=\"true\" [(current-slide)]=\"activeSlide\" class=\"w-100 d-block\">\n <rlb-carousel-slide [active]=\"true\">\n <div class=\"p-3\">\n <h6 class=\"dropdown-header px-0 text-center mb-2 fw-bold text-dark\">\n {{ 'core.settings.title' | translate }}\n </h6>\n\n <div class=\"row row-cols-3 g-2\">\n\n @if (isAuthenticated()) {\n <!-- General Settings -->\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n (click)=\"goToInlineSettings()\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-person fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.account.settings.title' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Dynamic App Settings -->\n @for (app of apps(); track app.id) {\n @if (app.settings && app.enabled && (app.settings.auth && (isAuthenticated()))) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n [class.active]=\"isAppSelected(app.id)\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i [ngClass]=\"['bi', 'fs-4', 'mb-1', app.settings.icon || 'bi-gear']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\">\n {{ app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n\n <!-- System / Status -->\n @if (pages?.['status']?.path) {\n <div class=\"col\">\n <button rlb-button outline color=\"primary\" routerLink=\"/status\" routerLinkActive=\"active\" class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-check2-circle fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.settings.status' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Logger -->\n @if (pages?.['logger']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/logger\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-file-text fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.logger' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Privacy -->\n @if (pages?.['privacy']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/privacy\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-shield-check fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.privacy' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Cookies -->\n @if (pages?.['cookies']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/cookies\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-cookie fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.cookies' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Terms -->\n @if (pages?.['terms']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/terms\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-vector-pen fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.legal' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Support -->\n @if (pages?.['support']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/support\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-chat-quote fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.support' | translate }}\n </span>\n </button>\n </div>\n }\n\n </div>\n </div>\n </rlb-carousel-slide>\n\n <rlb-carousel-slide>\n <div class=\"p-3\">\n\n <!-- Header -->\n <div class=\"d-flex align-items-center mb-3\">\n <button class=\"btn btn-sm btn-link text-reset p-0 me-2 border-0 text-decoration-none\" (click)=\"goToFirstSlide()\">\n <i class=\"bi bi-arrow-left fs-5\"></i>\n </button>\n <h6 class=\"mb-0 fw-bold\">{{ 'core.account.settings.title' | translate }}</h6>\n </div>\n\n <rlb-list class=\"settings\">\n\n <!-- Theme Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalTheme' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [(ngModel)]=\"darkMode\" />\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Language Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalLanguage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [(ngModel)]=\"currentLanguage\">\n @for (l of languages; track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Show More -->\n <rlb-list-item action class=\"settings-item\" routerLink=\"/profile\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.settings.showMore' | translate }}</span>\n </div>\n <div class=\"settings-control text-primary\">\n <i class=\"bi bi-arrow-up-right-square fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Logout -->\n <rlb-list-item action (click)=\"logout()\" class=\"settings-item\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center text-danger\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.logout' | translate }}</span>\n </div>\n <div class=\"settings-control\">\n <i class=\"bi bi-box-arrow-left fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n </rlb-list>\n </div>\n </rlb-carousel-slide>\n </rlb-carousel>\n</ng-template>\n" }]
2187
+ args: [{ selector: 'rlb-settings-dropdown-selector', imports: [
2188
+ NavbarDropdownItemComponent,
2189
+ DropdownContainerComponent,
2190
+ CarouselComponent,
2191
+ CarouselSlideComponent,
2192
+ TooltipDirective,
2193
+ ListComponent,
2194
+ ListItemComponent,
2195
+ SwitchComponent,
2196
+ SelectComponent,
2197
+ OptionComponent,
2198
+ NgClass,
2199
+ NgTemplateOutlet,
2200
+ TranslateModule,
2201
+ FormsModule,
2202
+ RouterModule,
2203
+ ButtonComponent,
2204
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item #menu dropdown auto-close=\"outside\" (status-changed)=\"change($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') | translate\">\n <i class=\"bi bi-gear fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n </div>\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <!-- Inline mode for Offcanvas -->\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n}\n\n<ng-template #settingsCarousel>\n <rlb-carousel [hide-indicators]=\"true\" [hide-controls]=\"true\" autoplay=\"none\" [no-touch]=\"true\" [(current-slide)]=\"activeSlide\" class=\"w-100 d-block\">\n <rlb-carousel-slide [active]=\"true\">\n <div class=\"p-3\">\n <h6 class=\"dropdown-header px-0 text-center mb-2 fw-bold text-dark\">\n {{ 'core.settings.title' | translate }}\n </h6>\n\n <div class=\"row row-cols-3 g-2\">\n\n @if (isAuthenticated()) {\n <!-- General Settings -->\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n (click)=\"goToInlineSettings()\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-person fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.account.settings.title' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Dynamic App Settings -->\n @for (app of apps(); track app.id) {\n @if (app.settings && app.enabled && (app.settings.auth && (isAuthenticated()))) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n [class.active]=\"isAppSelected(app.id)\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i [ngClass]=\"['bi', 'fs-4', 'mb-1', app.settings.icon || 'bi-gear']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\">\n {{ app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n\n <!-- System / Status -->\n @if (pages()?.['status']?.path) {\n <div class=\"col\">\n <button rlb-button outline color=\"primary\" routerLink=\"/status\" routerLinkActive=\"active\" class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-check2-circle fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.settings.status' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Logger -->\n @if (pages()?.['logger']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/logger\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-file-text fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.logger' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Privacy -->\n @if (pages()?.['privacy']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/privacy\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-shield-check fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.privacy' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Cookies -->\n @if (pages()?.['cookies']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/cookies\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-cookie fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.cookies' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Terms -->\n @if (pages()?.['terms']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/terms\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-vector-pen fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.legal' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Support -->\n @if (pages()?.['support']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/support\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-chat-quote fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.support' | translate }}\n </span>\n </button>\n </div>\n }\n\n </div>\n </div>\n </rlb-carousel-slide>\n\n <rlb-carousel-slide>\n <div class=\"p-3\">\n\n <!-- Header -->\n <div class=\"d-flex align-items-center mb-3\">\n <button class=\"btn btn-sm btn-link text-reset p-0 me-2 border-0 text-decoration-none\" (click)=\"goToFirstSlide()\">\n <i class=\"bi bi-arrow-left fs-5\"></i>\n </button>\n <h6 class=\"mb-0 fw-bold\">{{ 'core.account.settings.title' | translate }}</h6>\n </div>\n\n <rlb-list class=\"settings\">\n\n <!-- Theme Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalTheme' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [ngModel]=\"darkMode()\" (ngModelChange)=\"setDarkMode($event)\" />\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Language Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalLanguage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [ngModel]=\"currentLanguage()\" (ngModelChange)=\"setCurrentLanguage($event)\">\n @for (l of languages(); track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Show More -->\n <rlb-list-item action class=\"settings-item\" routerLink=\"/profile\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.settings.showMore' | translate }}</span>\n </div>\n <div class=\"settings-control text-primary\">\n <i class=\"bi bi-arrow-up-right-square fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Logout -->\n <rlb-list-item action (click)=\"logout()\" class=\"settings-item\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center text-danger\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.logout' | translate }}</span>\n </div>\n <div class=\"settings-control\">\n <i class=\"bi bi-box-arrow-left fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n </rlb-list>\n </div>\n </rlb-carousel-slide>\n </rlb-carousel>\n</ng-template>\n" }]
2073
2205
  }], ctorParameters: () => [], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], apps: [{ type: i0.Input, args: [{ isSignal: true, alias: "apps", required: true }] }], isAuthenticated: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAuthenticated", required: true }] }], appSelected: [{ type: i0.Output, args: ["appSelected"] }], menu: [{ type: i0.ViewChild, args: ['menu', { isSignal: true }] }] } });
2074
2206
 
2075
- class AppDropdownSelectorComponent {
2207
+ class LeftComponentPipe {
2076
2208
  constructor() {
2077
- this.mode = input('desktop', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
2078
- this.apps = input.required(...(ngDevMode ? [{ debugName: "apps" }] : /* istanbul ignore next */ []));
2079
- this.isAuthenticated = input.required(...(ngDevMode ? [{ debugName: "isAuthenticated" }] : /* istanbul ignore next */ []));
2080
- this.appSelected = output();
2081
- this.appsService = inject(AppsService);
2082
- }
2083
- selectApp(app) {
2084
- this.appSelected.emit(app);
2209
+ this.config = inject(RLB_APP_NAVCOMP);
2085
2210
  }
2086
- isAppSelected(appId) {
2087
- if (appId) {
2088
- return this.appsService.isAppSelected(appId);
2211
+ transform(value) {
2212
+ const t = this.config.left.find(c => c.name === value)?.component;
2213
+ if (!t) {
2214
+ throw new Error(`No component found for name ${value}`);
2089
2215
  }
2090
- else {
2091
- console.error('AppId is not defined');
2092
- return false;
2216
+ return t;
2217
+ }
2218
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LeftComponentPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2219
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: LeftComponentPipe, isStandalone: true, name: "leftComponent" }); }
2220
+ }
2221
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LeftComponentPipe, decorators: [{
2222
+ type: Pipe,
2223
+ args: [{
2224
+ name: 'leftComponent'
2225
+ }]
2226
+ }] });
2227
+
2228
+ class RightComponentPipe {
2229
+ constructor() {
2230
+ this.config = inject(RLB_APP_NAVCOMP);
2231
+ }
2232
+ transform(value) {
2233
+ const t = this.config.right.find(c => c.name === value)?.component;
2234
+ if (!t) {
2235
+ throw new Error(`No component found for name ${value}`);
2093
2236
  }
2237
+ return t;
2094
2238
  }
2095
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppDropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2096
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: AppDropdownSelectorComponent, isStandalone: false, selector: "rlb-app-dropdown-selector", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, apps: { classPropertyName: "apps", publicName: "apps", isSignal: true, isRequired: true, transformFunction: null }, isAuthenticated: { classPropertyName: "isAuthenticated", publicName: "isAuthenticated", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { appSelected: "appSelected" }, ngImport: i0, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item dropdown>\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') | translate\">\n <i class=\"bi bi-grid-3x3-gap-fill fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n </div>\n\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n}\n\n<ng-template #appGrid>\n <div class=\"row row-cols-3 g-2 p-3\">\n @for (app of apps(); track app.id) {\n @if (app.core) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-center\"\n [class.active]=\"isAppSelected(app.id)\"\n [disabled]=\"!app.enabled && (app.core.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n >\n <i [ngClass]=\"['fs-3', 'mb-1', app.core.icon || 'bi bi-app']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate\">\n {{ app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2$1.ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "directive", type: i2$1.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "component", type: i2$1.DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "component", type: i2$1.NavbarDropdownItemComponent, selector: "rlb-navbar-dropdown-item", inputs: ["disabled", "dropdown", "href", "class", "toggle", "auto-close"], outputs: ["click", "status-changed"] }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }] }); }
2239
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RightComponentPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2240
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: RightComponentPipe, isStandalone: true, name: "rightComponent" }); }
2097
2241
  }
2098
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppDropdownSelectorComponent, decorators: [{
2099
- type: Component,
2100
- args: [{ selector: 'rlb-app-dropdown-selector', standalone: false, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item dropdown>\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') | translate\">\n <i class=\"bi bi-grid-3x3-gap-fill fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n </div>\n\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n}\n\n<ng-template #appGrid>\n <div class=\"row row-cols-3 g-2 p-3\">\n @for (app of apps(); track app.id) {\n @if (app.core) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-center\"\n [class.active]=\"isAppSelected(app.id)\"\n [disabled]=\"!app.enabled && (app.core.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n >\n <i [ngClass]=\"['fs-3', 'mb-1', app.core.icon || 'bi bi-app']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate\">\n {{ app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n </div>\n</ng-template>\n" }]
2101
- }], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], apps: [{ type: i0.Input, args: [{ isSignal: true, alias: "apps", required: true }] }], isAuthenticated: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAuthenticated", required: true }] }], appSelected: [{ type: i0.Output, args: ["appSelected"] }] } });
2242
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RightComponentPipe, decorators: [{
2243
+ type: Pipe,
2244
+ args: [{
2245
+ name: 'rightComponent'
2246
+ }]
2247
+ }] });
2102
2248
 
2103
2249
  class RlbRole {
2104
2250
  constructor() {
@@ -2117,155 +2263,88 @@ class RlbRole {
2117
2263
  }
2118
2264
  });
2119
2265
  }
2120
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbRole, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2121
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.7", type: RlbRole, isStandalone: false, selector: "[roles]", inputs: { action: { classPropertyName: "action", publicName: "roles", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
2266
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbRole, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2267
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RlbRole, isStandalone: true, selector: "[roles]", inputs: { action: { classPropertyName: "action", publicName: "roles", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
2122
2268
  }
2123
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbRole, decorators: [{
2269
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbRole, decorators: [{
2124
2270
  type: Directive,
2125
2271
  args: [{
2126
- selector: '[roles]',
2127
- standalone: false,
2272
+ selector: '[roles]'
2128
2273
  }]
2129
2274
  }], ctorParameters: () => [], propDecorators: { action: [{ type: i0.Input, args: [{ isSignal: true, alias: "roles", required: false }] }] } });
2130
2275
 
2131
- class LeftComponentPipe {
2132
- constructor(config) {
2133
- this.config = config;
2134
- }
2135
- transform(value) {
2136
- const t = this.config.left.find(c => c.name === value)?.component;
2137
- if (!t) {
2138
- throw new Error(`No component found for name ${value}`);
2139
- }
2140
- return t;
2276
+ class AppDropdownSelectorComponent {
2277
+ constructor() {
2278
+ this.mode = input('desktop', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
2279
+ this.apps = input.required(...(ngDevMode ? [{ debugName: "apps" }] : /* istanbul ignore next */ []));
2280
+ this.isAuthenticated = input.required(...(ngDevMode ? [{ debugName: "isAuthenticated" }] : /* istanbul ignore next */ []));
2281
+ this.appSelected = output();
2282
+ this.appsService = inject(AppsService);
2283
+ this.currentAppId = computed(() => this.appsService.currentApp()?.id, ...(ngDevMode ? [{ debugName: "currentAppId" }] : /* istanbul ignore next */ []));
2141
2284
  }
2142
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: LeftComponentPipe, deps: [{ token: RLB_APP_NAVCOMP }], target: i0.ɵɵFactoryTarget.Pipe }); }
2143
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.7", ngImport: i0, type: LeftComponentPipe, isStandalone: false, name: "leftComponent" }); }
2144
- }
2145
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: LeftComponentPipe, decorators: [{
2146
- type: Pipe,
2147
- args: [{
2148
- name: 'leftComponent',
2149
- standalone: false
2150
- }]
2151
- }], ctorParameters: () => [{ type: undefined, decorators: [{
2152
- type: Inject,
2153
- args: [RLB_APP_NAVCOMP]
2154
- }] }] });
2155
-
2156
- class RightComponentPipe {
2157
- constructor(config) {
2158
- this.config = config;
2285
+ selectApp(app) {
2286
+ this.appSelected.emit(app);
2159
2287
  }
2160
- transform(value) {
2161
- const t = this.config.right.find(c => c.name === value)?.component;
2162
- if (!t) {
2163
- throw new Error(`No component found for name ${value}`);
2164
- }
2165
- return t;
2288
+ isAppSelected(appId) {
2289
+ return this.currentAppId() === appId;
2166
2290
  }
2167
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RightComponentPipe, deps: [{ token: RLB_APP_NAVCOMP }], target: i0.ɵɵFactoryTarget.Pipe }); }
2168
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.7", ngImport: i0, type: RightComponentPipe, isStandalone: false, name: "rightComponent" }); }
2291
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppDropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2292
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AppDropdownSelectorComponent, isStandalone: true, selector: "rlb-app-dropdown-selector", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, apps: { classPropertyName: "apps", publicName: "apps", isSignal: true, isRequired: true, transformFunction: null }, isAuthenticated: { classPropertyName: "isAuthenticated", publicName: "isAuthenticated", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { appSelected: "appSelected" }, ngImport: i0, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item dropdown>\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') | translate\">\n <i class=\"bi bi-grid-3x3-gap-fill fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n </div>\n\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n}\n\n<ng-template #appGrid>\n <div class=\"row row-cols-3 g-2 p-3\">\n @for (app of apps(); track app.id) {\n @if (app.core) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-center\"\n [class.active]=\"isAppSelected(app.id)\"\n [disabled]=\"!app.enabled && (app.core.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n >\n <i [ngClass]=\"['fs-3', 'mb-1', app.core.icon || 'bi bi-app']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate\">\n {{ app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "component", type: NavbarDropdownItemComponent, selector: "rlb-navbar-dropdown-item", inputs: ["disabled", "dropdown", "href", "class", "toggle", "auto-close"], outputs: ["click", "status-changed"] }, { kind: "component", type: DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2169
2293
  }
2170
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RightComponentPipe, decorators: [{
2171
- type: Pipe,
2172
- args: [{
2173
- name: 'rightComponent',
2174
- standalone: false
2175
- }]
2176
- }], ctorParameters: () => [{ type: undefined, decorators: [{
2177
- type: Inject,
2178
- args: [RLB_APP_NAVCOMP]
2179
- }] }] });
2294
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppDropdownSelectorComponent, decorators: [{
2295
+ type: Component,
2296
+ args: [{ selector: 'rlb-app-dropdown-selector', imports: [
2297
+ NavbarDropdownItemComponent,
2298
+ DropdownContainerComponent,
2299
+ ButtonComponent,
2300
+ TooltipDirective,
2301
+ NgClass,
2302
+ NgTemplateOutlet,
2303
+ TranslateModule,
2304
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item dropdown>\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') | translate\">\n <i class=\"bi bi-grid-3x3-gap-fill fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n </div>\n\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n}\n\n<ng-template #appGrid>\n <div class=\"row row-cols-3 g-2 p-3\">\n @for (app of apps(); track app.id) {\n @if (app.core) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-center\"\n [class.active]=\"isAppSelected(app.id)\"\n [disabled]=\"!app.enabled && (app.core.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n >\n <i [ngClass]=\"['fs-3', 'mb-1', app.core.icon || 'bi bi-app']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate\">\n {{ app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n </div>\n</ng-template>\n" }]
2305
+ }], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], apps: [{ type: i0.Input, args: [{ isSignal: true, alias: "apps", required: true }] }], isAuthenticated: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAuthenticated", required: true }] }], appSelected: [{ type: i0.Output, args: ["appSelected"] }] } });
2180
2306
 
2181
2307
  class AppTemplateComponent {
2182
- constructor(env, store, appsService, authService, router) {
2183
- this.env = env;
2184
- this.store = store;
2185
- this.appsService = appsService;
2186
- this.authService = authService;
2187
- this.router = router;
2308
+ constructor() {
2309
+ this.Array = Array;
2188
2310
  this.navSearchText = null;
2189
- this.navbarItems = [];
2190
- this.sidebarItems = [];
2191
- this.sidebarFooterItems = [];
2311
+ this.modalContainerId = input.required({ ...(ngDevMode ? { debugName: "modalContainerId" } : /* istanbul ignore next */ {}), alias: 'modal-container-id' });
2312
+ this.breadcrumbInput = input(undefined, { ...(ngDevMode ? { debugName: "breadcrumbInput" } : /* istanbul ignore next */ {}), alias: 'breadcrumb' });
2313
+ this.breadcrumb = computed(() => this.breadcrumbInput() ?? [], ...(ngDevMode ? [{ debugName: "breadcrumb" }] : /* istanbul ignore next */ []));
2314
+ this.toastContainerIds = input.required({ ...(ngDevMode ? { debugName: "toastContainerIds" } : /* istanbul ignore next */ {}), alias: 'toast-container-ids' });
2192
2315
  this.mobileOffcanvas = viewChild('mobileOffcanvas', ...(ngDevMode ? [{ debugName: "mobileOffcanvas" }] : /* istanbul ignore next */ []));
2193
2316
  this.mobileSettingsMenu = viewChild('mobileSettingsMenu', ...(ngDevMode ? [{ debugName: "mobileSettingsMenu" }] : /* istanbul ignore next */ []));
2194
- this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => {
2317
+ this.env = inject(RLB_CFG_ENV);
2318
+ this.store = inject((Store));
2319
+ this.appsService = inject(AppsService);
2320
+ this.authService = inject(AuthenticationService);
2321
+ this.router = inject(Router);
2322
+ this.sidebarVisible = this.store.selectSignal((state) => state[sidebarsFeatureKey].visible);
2323
+ this.sidearHasLogin = this.store.selectSignal((state) => state[sidebarsFeatureKey].loginVisible);
2324
+ this.sidearHasSearch = this.store.selectSignal((state) => state[sidebarsFeatureKey].searchVisible);
2325
+ this.sidebarItems = this.store.selectSignal((state) => state[sidebarsFeatureKey].items);
2326
+ this.sidearHasSettings = this.store.selectSignal((state) => state[sidebarsFeatureKey].settingsVisible);
2327
+ this.sidearAppsVisible = this.store.selectSignal((state) => state[sidebarsFeatureKey].appsVisible);
2328
+ this.navVisible = this.store.selectSignal((state) => state[navbarsFeatureKey].visible);
2329
+ this.navSearchVisible = this.store.selectSignal((state) => state[navbarsFeatureKey].searchVisible);
2330
+ this.navHeader = this.store.selectSignal((state) => state[navbarsFeatureKey].header);
2331
+ this.navLeftItems = this.store.selectSignal((state) => state[navbarsFeatureKey].leftItems);
2332
+ this.navRightItems = this.store.selectSignal((state) => state[navbarsFeatureKey].rightItems);
2333
+ this.navbarHasLogin = this.store.selectSignal((state) => state[navbarsFeatureKey].loginVisible);
2334
+ this.navbarHasSettings = this.store.selectSignal((state) => state[navbarsFeatureKey].settingsVisible);
2335
+ this.navbarHasApps = this.store.selectSignal(state => state[navbarsFeatureKey].appsVisible);
2336
+ this.navbarLayout = this.store.selectSignal(state => state[navbarsFeatureKey].actionsLayout);
2337
+ this.separatorVisible = this.store.selectSignal(state => state[navbarsFeatureKey].separatorVisible);
2338
+ this.isAuthenticated = toSignal(this.authService.isAuthenticated$, { initialValue: false });
2339
+ this.userInfo = toSignal(this.authService.userInfo$, { initialValue: null });
2340
+ this.theme = this.store.selectSignal(state => state[appContextFeatureKey].theme);
2341
+ this.apps = computed(() => this.appsService.apps().filter((app) => app.enabled && app.id), ...(ngDevMode ? [{ debugName: "apps" }] : /* istanbul ignore next */ []));
2342
+ this.router.events
2343
+ .pipe(filter((event) => event instanceof NavigationEnd), takeUntilDestroyed())
2344
+ .subscribe(() => {
2195
2345
  this.closeMobileMenu();
2196
2346
  });
2197
2347
  }
2198
- ngOnDestroy() {
2199
- this.navbarItemsSubscription?.unsubscribe();
2200
- this.sidebarItemsSubscription?.unsubscribe();
2201
- this.sidebarFooterItemsSubscription?.unsubscribe();
2202
- }
2203
- get sidebarVisible$() {
2204
- return this.store.select(state => state[sidebarsFeatureKey].visible);
2205
- }
2206
- get sidearHasLogin$() {
2207
- return this.store.select(state => state[sidebarsFeatureKey].loginVisible);
2208
- }
2209
- get sidearHasSearch$() {
2210
- return this.store.select(state => state[sidebarsFeatureKey].searchVisible);
2211
- }
2212
- get sidebarItems$() {
2213
- return this.store.select(state => state[sidebarsFeatureKey].items);
2214
- }
2215
- setSidearSearchText(text) {
2216
- this.store.dispatch(SidebarActions.setSearchText({ text }));
2217
- }
2218
- setNavbarSearchText(text) {
2219
- this.store.dispatch(NavbarActions.setSearchText({ text }));
2220
- }
2221
- get sidearHasSettings$() {
2222
- return this.store.select(state => state[sidebarsFeatureKey].settingsVisible);
2223
- }
2224
- get sidearAppsVisible$() {
2225
- return this.store.select(state => state[sidebarsFeatureKey].appsVisible);
2226
- }
2227
- get navVisible$() {
2228
- return this.store.select(state => state[navbarsFeatureKey].visible);
2229
- }
2230
- get navSearchVisible$() {
2231
- return this.store.select(state => state[navbarsFeatureKey].searchVisible);
2232
- }
2233
- get navHeader$() {
2234
- return this.store.select(state => state[navbarsFeatureKey].header);
2235
- }
2236
- get isAuthenticated$() {
2237
- return this.authService.isAuthenticated$;
2238
- }
2239
- get user$() {
2240
- return this.authService.userInfo$;
2241
- }
2242
- get navLeftItems$() {
2243
- return this.store.select(state => state[navbarsFeatureKey].leftItems);
2244
- }
2245
- get navRightItems$() {
2246
- return this.store.select(state => state[navbarsFeatureKey].rightItems);
2247
- }
2248
- get theme() {
2249
- return this.store.selectSignal(state => state[appContextFeatureKey].theme)();
2250
- }
2251
- get navbarHasLogin$() {
2252
- return this.store.select(state => state[navbarsFeatureKey].loginVisible);
2253
- }
2254
- get navbarHasSettings$() {
2255
- return this.store.select(state => state[navbarsFeatureKey].settingsVisible);
2256
- }
2257
- get navbarHasApps$() {
2258
- return this.store.select(state => state[navbarsFeatureKey].appsVisible);
2259
- }
2260
- get navbarLayout$() {
2261
- return this.store.select(state => state[navbarsFeatureKey].actionsLayout);
2262
- }
2263
- get apps() {
2264
- return this.appsService.apps.filter(app => app.enabled && app.id); // Only enabled and initialized apps (with id).
2265
- }
2266
- get separatorVisible$() {
2267
- return this.store.select(state => state[navbarsFeatureKey].separatorVisible);
2268
- }
2269
2348
  loginNav(event) {
2270
2349
  event?.preventDefault();
2271
2350
  event?.stopPropagation();
@@ -2285,83 +2364,86 @@ class AppTemplateComponent {
2285
2364
  this.mobileSettingsMenu()?.goToFirstSlide();
2286
2365
  }
2287
2366
  }
2367
+ setSidearSearchText(text) {
2368
+ this.store.dispatch(SidebarActions.setSearchText({ text }));
2369
+ }
2370
+ setNavbarSearchText(text) {
2371
+ this.store.dispatch(NavbarActions.setSearchText({ text }));
2372
+ }
2288
2373
  closeMobileMenu() {
2289
2374
  this.mobileOffcanvas()?.close();
2290
2375
  }
2291
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppTemplateComponent, deps: [{ token: RLB_CFG_ENV }, { token: i1$1.Store }, { token: AppsService }, { token: AuthenticationService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component }); }
2292
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: AppTemplateComponent, isStandalone: false, selector: "rlb-app-template", inputs: { modalContainerId: ["modal-container-id", "modalContainerId"], toastContainerIds: ["toast-container-ids", "toastContainerIds"] }, viewQueries: [{ propertyName: "mobileOffcanvas", first: true, predicate: ["mobileOffcanvas"], descendants: true, isSignal: true }, { propertyName: "mobileSettingsMenu", first: true, predicate: ["mobileSettingsMenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"rlb-app\">\n @if (navVisible$ | async) {\n <rlb-navbar [dark]=\"theme === 'dark'\" [showSideBarToggler]=\"(sidebarVisible$ | async)\" expand=\"lg\" class=\"border-bottom py-1 rlb-navbar\">\n @if (navHeader$ | async; as header) {\n <a rlb-navbar-brand href=\"#\">\n\n @if (header.type === 'text') {\n {{ header.text }}\n }\n\n @if (header.type === 'image') {\n <img\n [src]=\"header.src\"\n [alt]=\"header.alt ?? 'Brand'\"\n [height]=\"header.height ?? 40\"\n />\n }\n </a>\n }\n @if (navSearchVisible$ | async) {\n <rlb-navbar-form>\n <rlb-input-group class=\"my-1 mx-3\" validate>\n <rlb-input type=\"search\" class=\"search-input\" placeholder=\"Search\" [(ngModel)]=\"navSearchText\"\n (keyup.enter)=\"setNavbarSearchText(navSearchText)\" name=\"search\" size=\"small\">\n <button after rlb-button outline type=\"submit\" (click)=\"setNavbarSearchText(navSearchText)\" size=\"sm\">\n <i class=\"bi bi-search\"></i>\n </button>\n </rlb-input>\n </rlb-input-group>\n </rlb-navbar-form>\n }\n\n <!-- MOBILE VIEWS -->\n <div rlb-custom-navbar-items class=\"d-flex d-lg-none\">\n @if (isAuthenticated$ | async) {\n <rlb-fab size=\"sm\" outline toggle=\"offcanvas\" toggle-target=\"mobileMenuOffcanvas\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </rlb-fab>\n\n <rlb-offcanvas\n #mobileOffcanvas\n id=\"mobileMenuOffcanvas\"\n [placement]=\"'end'\"\n (statusChange)=\"onMobileMenuStatusChange($event)\"\n >\n <rlb-offcanvas-header class=\"border-bottom\">\n <h5 rlb-offcanvas-title class=\"fw-bold mb-0\">Menu</h5>\n </rlb-offcanvas-header>\n\n <rlb-offcanvas-body class=\"p-0 overflow-x-hidden\">\n\n <!-- Mobile Apps Grid -->\n @if ((navbarHasApps$ | async) && apps.length > 1) {\n <div class=\"border-bottom pb-2\">\n <rlb-app-dropdown-selector\n mode=\"mobile\"\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n </div>\n }\n\n <!-- Mobile Settings Carousel -->\n @if (((isAuthenticated$ | async)) || (navbarHasSettings$ | async)) {\n <div class=\"pt-2\">\n <rlb-settings-dropdown-selector\n mode=\"mobile\"\n #mobileSettingsMenu\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n </div>\n }\n\n </rlb-offcanvas-body>\n </rlb-offcanvas>\n } @else {\n <rlb-fab size=\"sm\" (click)=\"loginNav($event)\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </rlb-fab>\n }\n\n </div>\n\n <rlb-navbar-items>\n @for (navComponent of navLeftItems$ | async; track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | leftComponent\"></ng-container>\n </ng-container>\n }\n </rlb-navbar-items>\n\n <rlb-navbar-items class=\"ms-auto align-items-center\">\n @for (navComponent of navRightItems$ | async; track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | rightComponent\"></ng-container>\n </ng-container>\n }\n @if ((separatorVisible$ | async) && (isAuthenticated$ | async)) {\n <rlb-navbar-separator />\n }\n\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n @if ((navbarLayout$ | async) == 'default') {\n @if ((navbarHasLogin$ | async) && !(isAuthenticated$ | async)) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.login' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if ((navbarHasLogin$ | async) && (isAuthenticated$ | async)) {\n <rlb-navbar-item [router-link]=\"'/profile'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.title') |translate\">\n <i class=\"bi bi-person\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasSettings$ | async) {\n <rlb-navbar-item [router-link]=\"'/settings'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') |translate\">\n <i class=\"bi bi-gear\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.settings.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if ((navbarHasApps$ | async) && apps.length > 1) {\n <rlb-navbar-item [router-link]=\"'/apps'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') |translate\">\n <i class=\"bi bi-grid-3x3-gap-fill\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.apps.button' | translate}}</span>\n </rlb-navbar-item>\n }\n\n } @else if ((navbarLayout$ | async) == 'dropdown') {\n <!-- MODERN DROPDOWN MODE -->\n\n <!--Unauthenticated Login -->\n @if ((navbarHasLogin$ | async) && !(isAuthenticated$ | async)) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') | translate\">\n <i class=\"bi bi-box-arrow-in-left fs-5\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{ 'core.account.login' | translate }}</span>\n </rlb-navbar-item>\n }\n\n <!-- Profile & Settings Account Card -->\n @if (((navbarHasSettings$ | async) && (isAuthenticated$ | async))) {\n <rlb-settings-dropdown-selector\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n }\n\n <!-- Apps Launcher -->\n @if ((navbarHasApps$ | async) && (isAuthenticated$ | async) && apps.length > 1) {\n <rlb-app-dropdown-selector\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n }\n }\n </ng-container>\n </rlb-navbar-items>\n </rlb-navbar>\n }\n <div class=\"rlb-main-wrapper\">\n @if ((sidebarVisible$ | async)) {\n <rlb-sidebar [dark]=\"theme === 'dark'\" id=\"sidebar\" class=\"rlb-sidebar\">\n @for (item of (sidebarItems$ | async); track $index) {\n <rlb-sidebar-item\n *roles=\"item.action\"\n [icon]=\"item.icon\" [link]=\"item.url\"\n [title]=\"item.title\" [label]=\"item.label\"\n [badgeCounter]=\"item.badgeCounter\"\n (click)=\"onSideBarItemClick(item)\"\n >\n {{item.label}}\n @for (subitem of item.items || []; track $index) {\n <rlb-sidebar-item\n *roles=\"subitem.action\"\n [icon]=\"subitem.icon\"\n [link]=\"subitem.url\"\n [title]=\"subitem.title\"\n [label]=\"subitem.label\"\n [badgeCounter]=\"subitem.badgeCounter\"\n (click)=\"onSideBarItemClick(subitem)\"\n >\n {{subitem.label}}\n </rlb-sidebar-item>\n }\n </rlb-sidebar-item>\n }\n </rlb-sidebar>\n }\n <div class=\"rlb-content\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n@if (modalContainerId) {\n <rlb-modal-container [id]=\"modalContainerId\" />\n}\n\n@if (toastContainerIds) {\n @if (toastContainerIds.constructor.name === 'Array') {\n @for (toastContainerId of toastContainerIds | asMulti; track toastContainerId) {\n <rlb-toast-container [id]=\"toastContainerId\" />\n }\n } @else {\n <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds | asSingle\" />\n }\n}\n", styles: [".separator{border-left:1px solid;padding:0 2px}\n"], dependencies: [{ kind: "directive", type: i1$6.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2$1.InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "inputId", "extValidation", "enable-validation"] }, { kind: "component", type: i2$1.InputGroupComponent, selector: "rlb-input-group", inputs: ["text", "validate", "size"] }, { kind: "component", type: i2$1.ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: i2$1.RlbFabComponent, selector: "rlb-fab", inputs: ["color", "size", "disabled", "outline", "position"] }, { kind: "directive", type: i2$1.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "directive", type: i2$1.NavbarBrandDirective, selector: "[rlb-navbar-brand]" }, { kind: "directive", type: i2$1.NavbarCustomItemsDirective, selector: "[rlb-custom-navbar-items]" }, { kind: "component", type: i2$1.NavbarComponent, selector: "rlb-navbar", inputs: ["dark", "showSideBarToggler", "color", "placement", "expand", "class", "enable-dropdown-toggler"] }, { kind: "component", type: i2$1.NavbarFormComponent, selector: "rlb-navbar-form", inputs: ["role", "class"] }, { kind: "component", type: i2$1.NavbarItemsComponent, selector: "rlb-navbar-items", inputs: ["scroll", "class"], outputs: ["click"] }, { kind: "component", type: i2$1.NavbarItemComponent, selector: "rlb-navbar-item", inputs: ["disabled", "router-link", "class"], outputs: ["click"] }, { kind: "component", type: i2$1.NavbarSeparatorComponent, selector: "rlb-navbar-separator", inputs: ["class"] }, { kind: "component", type: i2$1.OffcanvasComponent, selector: "rlb-offcanvas", inputs: ["id", "body-scroll", "scroll-backup", "close-manual", "placement", "responsive"], outputs: ["statusChange"] }, { kind: "component", type: i2$1.OffcanvasHeaderComponent, selector: "rlb-offcanvas-header", inputs: ["offcanvasId"] }, { kind: "component", type: i2$1.OffcanvasBodyComponent, selector: "rlb-offcanvas-body" }, { kind: "directive", type: i2$1.ToggleDirective, selector: " button[toggle], a[toggle], rlb-navbar-item[toggle], rlb-button-toolbar[toggle], rlb-fab[toggle],", inputs: ["toggle", "toggle-target", "collapsed", "auto-close"] }, { kind: "component", type: i2$1.SidebarComponent, selector: "rlb-sidebar", inputs: ["dark", "rounded"] }, { kind: "component", type: i2$1.SidebarItemComponent, selector: "rlb-sidebar-item", inputs: ["title", "icon", "label", "link", "badgeCounter"], outputs: ["click"] }, { kind: "component", type: i2$1.ModalContainerComponent, selector: "rlb-modal-container", inputs: ["id"] }, { kind: "component", type: i2$1.ToastContainerComponent, selector: "rlb-toast-container", inputs: ["id"] }, { kind: "component", type: SettingsDropdownSelectorComponent, selector: "rlb-settings-dropdown-selector", inputs: ["mode", "apps", "isAuthenticated"], outputs: ["appSelected"] }, { kind: "component", type: AppDropdownSelectorComponent, selector: "rlb-app-dropdown-selector", inputs: ["mode", "apps", "isAuthenticated"], outputs: ["appSelected"] }, { kind: "directive", type: RlbRole, selector: "[roles]", inputs: ["roles"] }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsMultiPipe, name: "asMulti" }, { kind: "pipe", type: AsSinglePipe, name: "asSingle" }, { kind: "pipe", type: LeftComponentPipe, name: "leftComponent" }, { kind: "pipe", type: RightComponentPipe, name: "rightComponent" }] }); }
2376
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2377
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AppTemplateComponent, isStandalone: true, selector: "rlb-app-template", inputs: { modalContainerId: { classPropertyName: "modalContainerId", publicName: "modal-container-id", isSignal: true, isRequired: true, transformFunction: null }, breadcrumbInput: { classPropertyName: "breadcrumbInput", publicName: "breadcrumb", isSignal: true, isRequired: false, transformFunction: null }, toastContainerIds: { classPropertyName: "toastContainerIds", publicName: "toast-container-ids", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "mobileOffcanvas", first: true, predicate: ["mobileOffcanvas"], descendants: true, isSignal: true }, { propertyName: "mobileSettingsMenu", first: true, predicate: ["mobileSettingsMenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"rlb-app\">\n @if (navVisible()) {\n <rlb-navbar [dark]=\"theme() === 'dark'\" [showSideBarToggler]=\"sidebarVisible()\" expand=\"lg\" class=\"border-bottom py-1 rlb-navbar\">\n @if (navHeader(); as header) {\n <a rlb-navbar-brand href=\"#\">\n\n @if (header.type === 'text') {\n {{ header.text }}\n }\n\n @if (header.type === 'image') {\n <img\n [src]=\"header.src\"\n [alt]=\"header.alt ?? 'Brand'\"\n [height]=\"header.height ?? 40\"\n />\n }\n </a>\n }\n @if (navSearchVisible()) {\n <rlb-navbar-form>\n <rlb-input-group class=\"my-1 mx-3\" validate>\n <rlb-input type=\"search\" class=\"search-input\" placeholder=\"Search\" [(ngModel)]=\"navSearchText\"\n (keyup.enter)=\"setNavbarSearchText(navSearchText)\" name=\"search\" size=\"small\">\n <button after rlb-button outline type=\"submit\" (click)=\"setNavbarSearchText(navSearchText)\" size=\"sm\">\n <i class=\"bi bi-search\"></i>\n </button>\n </rlb-input>\n </rlb-input-group>\n </rlb-navbar-form>\n }\n\n <!-- MOBILE VIEWS -->\n <div rlb-custom-navbar-items class=\"d-flex d-lg-none\">\n @if (isAuthenticated()) {\n <rlb-fab size=\"sm\" outline toggle=\"offcanvas\" toggle-target=\"mobileMenuOffcanvas\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </rlb-fab>\n\n <rlb-offcanvas\n #mobileOffcanvas\n id=\"mobileMenuOffcanvas\"\n [placement]=\"'end'\"\n (statusChange)=\"onMobileMenuStatusChange($event)\"\n >\n <rlb-offcanvas-header class=\"border-bottom\">\n <h5 rlb-offcanvas-title class=\"fw-bold mb-0\">Menu</h5>\n </rlb-offcanvas-header>\n\n <rlb-offcanvas-body class=\"p-0 overflow-x-hidden\">\n\n <!-- Mobile Apps Grid -->\n @if (navbarHasApps() && apps().length > 1) {\n <div class=\"border-bottom pb-2\">\n <rlb-app-dropdown-selector\n mode=\"mobile\"\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n </div>\n }\n\n <!-- Mobile Settings Carousel -->\n @if (isAuthenticated() || navbarHasSettings()) {\n <div class=\"pt-2\">\n <rlb-settings-dropdown-selector\n mode=\"mobile\"\n #mobileSettingsMenu\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n </div>\n }\n\n </rlb-offcanvas-body>\n </rlb-offcanvas>\n } @else {\n <rlb-fab size=\"sm\" (click)=\"loginNav($event)\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </rlb-fab>\n }\n\n </div>\n\n <rlb-navbar-items>\n @for (navComponent of navLeftItems(); track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | leftComponent\"></ng-container>\n </ng-container>\n }\n </rlb-navbar-items>\n\n <rlb-navbar-items class=\"ms-auto align-items-center\">\n @for (navComponent of navRightItems(); track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | rightComponent\"></ng-container>\n </ng-container>\n }\n @if (separatorVisible() && isAuthenticated()) {\n <rlb-navbar-separator />\n }\n\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n @if (navbarLayout() == 'default') {\n @if (navbarHasLogin() && !isAuthenticated()) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.login' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasLogin() && isAuthenticated()) {\n <rlb-navbar-item [router-link]=\"'/profile'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.title') |translate\">\n <i class=\"bi bi-person\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasSettings()) {\n <rlb-navbar-item [router-link]=\"'/settings'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') |translate\">\n <i class=\"bi bi-gear\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.settings.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasApps() && apps().length > 1) {\n <rlb-navbar-item [router-link]=\"'/apps'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') |translate\">\n <i class=\"bi bi-grid-3x3-gap-fill\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.apps.button' | translate}}</span>\n </rlb-navbar-item>\n }\n\n } @else if (navbarLayout() == 'dropdown') {\n <!-- MODERN DROPDOWN MODE -->\n\n <!--Unauthenticated Login -->\n @if (navbarHasLogin() && !isAuthenticated()) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') | translate\">\n <i class=\"bi bi-box-arrow-in-left fs-5\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{ 'core.account.login' | translate }}</span>\n </rlb-navbar-item>\n }\n\n <!-- Profile & Settings Account Card -->\n @if (navbarHasSettings() && isAuthenticated()) {\n <rlb-settings-dropdown-selector\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n }\n\n <!-- Apps Launcher -->\n @if (navbarHasApps() && isAuthenticated() && apps().length > 1) {\n <rlb-app-dropdown-selector\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n }\n }\n </ng-container>\n </rlb-navbar-items>\n </rlb-navbar>\n }\n <div class=\"rlb-main-wrapper\">\n @if (sidebarVisible()) {\n <rlb-sidebar [dark]=\"theme() === 'dark'\" id=\"sidebar\" class=\"rlb-sidebar\">\n @for (item of sidebarItems(); track $index) {\n <rlb-sidebar-item\n *roles=\"item.action\"\n [icon]=\"item.icon\" [link]=\"item.url\"\n [title]=\"item.title\" [label]=\"item.label\"\n [badgeCounter]=\"item.badgeCounter\"\n (click)=\"onSideBarItemClick(item)\"\n >\n {{item.label}}\n @for (subitem of item.items || []; track $index) {\n <rlb-sidebar-item\n *roles=\"subitem.action\"\n [icon]=\"subitem.icon\"\n [link]=\"subitem.url\"\n [title]=\"subitem.title\"\n [label]=\"subitem.label\"\n [badgeCounter]=\"subitem.badgeCounter\"\n (click)=\"onSideBarItemClick(subitem)\"\n >\n {{subitem.label}}\n </rlb-sidebar-item>\n }\n </rlb-sidebar-item>\n }\n </rlb-sidebar>\n }\n <div class=\"rlb-content\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n<!--@if (modalContainerId()) {-->\n<!-- <rlb-modal-container [id]=\"modalContainerId()\" />-->\n<!--}-->\n\n<!--@if (toastContainerIds()) {-->\n<!-- @if (Array.isArray(toastContainerIds())) {-->\n<!-- @for (toastContainerId of toastContainerIds() | asMulti; track toastContainerId) {-->\n<!-- <rlb-toast-container [id]=\"toastContainerId\" />-->\n<!-- }-->\n<!-- } @else {-->\n<!-- <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds() | asSingle\" />-->\n<!-- }-->\n<!--}-->\n", styles: [".separator{border-left:1px solid;padding:0 2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$6.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: NavbarComponent, selector: "rlb-navbar", inputs: ["dark", "showSideBarToggler", "color", "placement", "expand", "class", "enable-dropdown-toggler"] }, { kind: "directive", type: NavbarBrandDirective, selector: "[rlb-navbar-brand]" }, { kind: "component", type: NavbarFormComponent, selector: "rlb-navbar-form", inputs: ["role", "class"] }, { kind: "component", type: NavbarItemsComponent, selector: "rlb-navbar-items", inputs: ["scroll", "class"], outputs: ["click"] }, { kind: "component", type: NavbarItemComponent, selector: "rlb-navbar-item", inputs: ["disabled", "router-link", "class"], outputs: ["click"] }, { kind: "component", type: NavbarSeparatorComponent, selector: "rlb-navbar-separator", inputs: ["class"] }, { kind: "component", type: SidebarComponent, selector: "rlb-sidebar", inputs: ["dark", "rounded"] }, { kind: "component", type: SidebarItemComponent, selector: "rlb-sidebar-item", inputs: ["title", "icon", "label", "link", "badgeCounter"], outputs: ["click"] }, { kind: "component", type: OffcanvasComponent, selector: "rlb-offcanvas", inputs: ["id", "body-scroll", "scroll-backup", "close-manual", "placement", "responsive"], outputs: ["statusChange"] }, { kind: "component", type: OffcanvasHeaderComponent, selector: "rlb-offcanvas-header", inputs: ["offcanvasId"] }, { kind: "component", type: OffcanvasBodyComponent, selector: "rlb-offcanvas-body" }, { kind: "component", type: RlbFabComponent, selector: "rlb-fab", inputs: ["color", "size", "disabled", "outline", "position"] }, { kind: "component", type: InputGroupComponent, selector: "rlb-input-group", inputs: ["text", "validate", "size"] }, { kind: "component", type: InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "inputId", "extValidation", "enable-validation"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "directive", type: RlbRole, selector: "[roles]", inputs: ["roles"] }, { kind: "component", type: AppDropdownSelectorComponent, selector: "rlb-app-dropdown-selector", inputs: ["mode", "apps", "isAuthenticated"], outputs: ["appSelected"] }, { kind: "component", type: SettingsDropdownSelectorComponent, selector: "rlb-settings-dropdown-selector", inputs: ["mode", "apps", "isAuthenticated"], outputs: ["appSelected"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "directive", type: ToggleDirective, selector: " button[toggle], a[toggle], rlb-navbar-item[toggle], rlb-button-toolbar[toggle], rlb-fab[toggle],", inputs: ["toggle", "toggle-target", "collapsed", "auto-close"] }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }, { kind: "pipe", type: LeftComponentPipe, name: "leftComponent" }, { kind: "pipe", type: RightComponentPipe, name: "rightComponent" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2293
2378
  }
2294
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppTemplateComponent, decorators: [{
2379
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppTemplateComponent, decorators: [{
2295
2380
  type: Component,
2296
- args: [{ selector: 'rlb-app-template', standalone: false, template: "<div class=\"rlb-app\">\n @if (navVisible$ | async) {\n <rlb-navbar [dark]=\"theme === 'dark'\" [showSideBarToggler]=\"(sidebarVisible$ | async)\" expand=\"lg\" class=\"border-bottom py-1 rlb-navbar\">\n @if (navHeader$ | async; as header) {\n <a rlb-navbar-brand href=\"#\">\n\n @if (header.type === 'text') {\n {{ header.text }}\n }\n\n @if (header.type === 'image') {\n <img\n [src]=\"header.src\"\n [alt]=\"header.alt ?? 'Brand'\"\n [height]=\"header.height ?? 40\"\n />\n }\n </a>\n }\n @if (navSearchVisible$ | async) {\n <rlb-navbar-form>\n <rlb-input-group class=\"my-1 mx-3\" validate>\n <rlb-input type=\"search\" class=\"search-input\" placeholder=\"Search\" [(ngModel)]=\"navSearchText\"\n (keyup.enter)=\"setNavbarSearchText(navSearchText)\" name=\"search\" size=\"small\">\n <button after rlb-button outline type=\"submit\" (click)=\"setNavbarSearchText(navSearchText)\" size=\"sm\">\n <i class=\"bi bi-search\"></i>\n </button>\n </rlb-input>\n </rlb-input-group>\n </rlb-navbar-form>\n }\n\n <!-- MOBILE VIEWS -->\n <div rlb-custom-navbar-items class=\"d-flex d-lg-none\">\n @if (isAuthenticated$ | async) {\n <rlb-fab size=\"sm\" outline toggle=\"offcanvas\" toggle-target=\"mobileMenuOffcanvas\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </rlb-fab>\n\n <rlb-offcanvas\n #mobileOffcanvas\n id=\"mobileMenuOffcanvas\"\n [placement]=\"'end'\"\n (statusChange)=\"onMobileMenuStatusChange($event)\"\n >\n <rlb-offcanvas-header class=\"border-bottom\">\n <h5 rlb-offcanvas-title class=\"fw-bold mb-0\">Menu</h5>\n </rlb-offcanvas-header>\n\n <rlb-offcanvas-body class=\"p-0 overflow-x-hidden\">\n\n <!-- Mobile Apps Grid -->\n @if ((navbarHasApps$ | async) && apps.length > 1) {\n <div class=\"border-bottom pb-2\">\n <rlb-app-dropdown-selector\n mode=\"mobile\"\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n </div>\n }\n\n <!-- Mobile Settings Carousel -->\n @if (((isAuthenticated$ | async)) || (navbarHasSettings$ | async)) {\n <div class=\"pt-2\">\n <rlb-settings-dropdown-selector\n mode=\"mobile\"\n #mobileSettingsMenu\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n </div>\n }\n\n </rlb-offcanvas-body>\n </rlb-offcanvas>\n } @else {\n <rlb-fab size=\"sm\" (click)=\"loginNav($event)\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </rlb-fab>\n }\n\n </div>\n\n <rlb-navbar-items>\n @for (navComponent of navLeftItems$ | async; track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | leftComponent\"></ng-container>\n </ng-container>\n }\n </rlb-navbar-items>\n\n <rlb-navbar-items class=\"ms-auto align-items-center\">\n @for (navComponent of navRightItems$ | async; track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | rightComponent\"></ng-container>\n </ng-container>\n }\n @if ((separatorVisible$ | async) && (isAuthenticated$ | async)) {\n <rlb-navbar-separator />\n }\n\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n @if ((navbarLayout$ | async) == 'default') {\n @if ((navbarHasLogin$ | async) && !(isAuthenticated$ | async)) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.login' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if ((navbarHasLogin$ | async) && (isAuthenticated$ | async)) {\n <rlb-navbar-item [router-link]=\"'/profile'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.title') |translate\">\n <i class=\"bi bi-person\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasSettings$ | async) {\n <rlb-navbar-item [router-link]=\"'/settings'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') |translate\">\n <i class=\"bi bi-gear\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.settings.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if ((navbarHasApps$ | async) && apps.length > 1) {\n <rlb-navbar-item [router-link]=\"'/apps'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') |translate\">\n <i class=\"bi bi-grid-3x3-gap-fill\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.apps.button' | translate}}</span>\n </rlb-navbar-item>\n }\n\n } @else if ((navbarLayout$ | async) == 'dropdown') {\n <!-- MODERN DROPDOWN MODE -->\n\n <!--Unauthenticated Login -->\n @if ((navbarHasLogin$ | async) && !(isAuthenticated$ | async)) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') | translate\">\n <i class=\"bi bi-box-arrow-in-left fs-5\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{ 'core.account.login' | translate }}</span>\n </rlb-navbar-item>\n }\n\n <!-- Profile & Settings Account Card -->\n @if (((navbarHasSettings$ | async) && (isAuthenticated$ | async))) {\n <rlb-settings-dropdown-selector\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n }\n\n <!-- Apps Launcher -->\n @if ((navbarHasApps$ | async) && (isAuthenticated$ | async) && apps.length > 1) {\n <rlb-app-dropdown-selector\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n }\n }\n </ng-container>\n </rlb-navbar-items>\n </rlb-navbar>\n }\n <div class=\"rlb-main-wrapper\">\n @if ((sidebarVisible$ | async)) {\n <rlb-sidebar [dark]=\"theme === 'dark'\" id=\"sidebar\" class=\"rlb-sidebar\">\n @for (item of (sidebarItems$ | async); track $index) {\n <rlb-sidebar-item\n *roles=\"item.action\"\n [icon]=\"item.icon\" [link]=\"item.url\"\n [title]=\"item.title\" [label]=\"item.label\"\n [badgeCounter]=\"item.badgeCounter\"\n (click)=\"onSideBarItemClick(item)\"\n >\n {{item.label}}\n @for (subitem of item.items || []; track $index) {\n <rlb-sidebar-item\n *roles=\"subitem.action\"\n [icon]=\"subitem.icon\"\n [link]=\"subitem.url\"\n [title]=\"subitem.title\"\n [label]=\"subitem.label\"\n [badgeCounter]=\"subitem.badgeCounter\"\n (click)=\"onSideBarItemClick(subitem)\"\n >\n {{subitem.label}}\n </rlb-sidebar-item>\n }\n </rlb-sidebar-item>\n }\n </rlb-sidebar>\n }\n <div class=\"rlb-content\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n@if (modalContainerId) {\n <rlb-modal-container [id]=\"modalContainerId\" />\n}\n\n@if (toastContainerIds) {\n @if (toastContainerIds.constructor.name === 'Array') {\n @for (toastContainerId of toastContainerIds | asMulti; track toastContainerId) {\n <rlb-toast-container [id]=\"toastContainerId\" />\n }\n } @else {\n <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds | asSingle\" />\n }\n}\n", styles: [".separator{border-left:1px solid;padding:0 2px}\n"] }]
2297
- }], ctorParameters: () => [{ type: undefined, decorators: [{
2298
- type: Inject,
2299
- args: [RLB_CFG_ENV]
2300
- }] }, { type: i1$1.Store }, { type: AppsService }, { type: AuthenticationService }, { type: i2.Router }], propDecorators: { modalContainerId: [{
2301
- type: Input,
2302
- args: ['modal-container-id']
2303
- }], toastContainerIds: [{
2304
- type: Input,
2305
- args: ['toast-container-ids']
2306
- }], mobileOffcanvas: [{ type: i0.ViewChild, args: ['mobileOffcanvas', { isSignal: true }] }], mobileSettingsMenu: [{ type: i0.ViewChild, args: ['mobileSettingsMenu', { isSignal: true }] }] } });
2381
+ args: [{ selector: 'rlb-app-template', imports: [
2382
+ CommonModule,
2383
+ FormsModule,
2384
+ RouterModule,
2385
+ TranslateModule,
2386
+ NgComponentOutlet,
2387
+ NavbarComponent,
2388
+ NavbarBrandDirective,
2389
+ NavbarFormComponent,
2390
+ NavbarItemsComponent,
2391
+ NavbarItemComponent,
2392
+ NavbarSeparatorComponent,
2393
+ SidebarComponent,
2394
+ SidebarItemComponent,
2395
+ OffcanvasComponent,
2396
+ OffcanvasHeaderComponent,
2397
+ OffcanvasBodyComponent,
2398
+ RlbFabComponent,
2399
+ InputGroupComponent,
2400
+ InputComponent,
2401
+ TooltipDirective,
2402
+ LeftComponentPipe,
2403
+ RightComponentPipe,
2404
+ RlbRole,
2405
+ AppDropdownSelectorComponent,
2406
+ SettingsDropdownSelectorComponent,
2407
+ ButtonComponent,
2408
+ ToggleDirective,
2409
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"rlb-app\">\n @if (navVisible()) {\n <rlb-navbar [dark]=\"theme() === 'dark'\" [showSideBarToggler]=\"sidebarVisible()\" expand=\"lg\" class=\"border-bottom py-1 rlb-navbar\">\n @if (navHeader(); as header) {\n <a rlb-navbar-brand href=\"#\">\n\n @if (header.type === 'text') {\n {{ header.text }}\n }\n\n @if (header.type === 'image') {\n <img\n [src]=\"header.src\"\n [alt]=\"header.alt ?? 'Brand'\"\n [height]=\"header.height ?? 40\"\n />\n }\n </a>\n }\n @if (navSearchVisible()) {\n <rlb-navbar-form>\n <rlb-input-group class=\"my-1 mx-3\" validate>\n <rlb-input type=\"search\" class=\"search-input\" placeholder=\"Search\" [(ngModel)]=\"navSearchText\"\n (keyup.enter)=\"setNavbarSearchText(navSearchText)\" name=\"search\" size=\"small\">\n <button after rlb-button outline type=\"submit\" (click)=\"setNavbarSearchText(navSearchText)\" size=\"sm\">\n <i class=\"bi bi-search\"></i>\n </button>\n </rlb-input>\n </rlb-input-group>\n </rlb-navbar-form>\n }\n\n <!-- MOBILE VIEWS -->\n <div rlb-custom-navbar-items class=\"d-flex d-lg-none\">\n @if (isAuthenticated()) {\n <rlb-fab size=\"sm\" outline toggle=\"offcanvas\" toggle-target=\"mobileMenuOffcanvas\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </rlb-fab>\n\n <rlb-offcanvas\n #mobileOffcanvas\n id=\"mobileMenuOffcanvas\"\n [placement]=\"'end'\"\n (statusChange)=\"onMobileMenuStatusChange($event)\"\n >\n <rlb-offcanvas-header class=\"border-bottom\">\n <h5 rlb-offcanvas-title class=\"fw-bold mb-0\">Menu</h5>\n </rlb-offcanvas-header>\n\n <rlb-offcanvas-body class=\"p-0 overflow-x-hidden\">\n\n <!-- Mobile Apps Grid -->\n @if (navbarHasApps() && apps().length > 1) {\n <div class=\"border-bottom pb-2\">\n <rlb-app-dropdown-selector\n mode=\"mobile\"\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n </div>\n }\n\n <!-- Mobile Settings Carousel -->\n @if (isAuthenticated() || navbarHasSettings()) {\n <div class=\"pt-2\">\n <rlb-settings-dropdown-selector\n mode=\"mobile\"\n #mobileSettingsMenu\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n </div>\n }\n\n </rlb-offcanvas-body>\n </rlb-offcanvas>\n } @else {\n <rlb-fab size=\"sm\" (click)=\"loginNav($event)\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </rlb-fab>\n }\n\n </div>\n\n <rlb-navbar-items>\n @for (navComponent of navLeftItems(); track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | leftComponent\"></ng-container>\n </ng-container>\n }\n </rlb-navbar-items>\n\n <rlb-navbar-items class=\"ms-auto align-items-center\">\n @for (navComponent of navRightItems(); track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | rightComponent\"></ng-container>\n </ng-container>\n }\n @if (separatorVisible() && isAuthenticated()) {\n <rlb-navbar-separator />\n }\n\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n @if (navbarLayout() == 'default') {\n @if (navbarHasLogin() && !isAuthenticated()) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.login' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasLogin() && isAuthenticated()) {\n <rlb-navbar-item [router-link]=\"'/profile'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.title') |translate\">\n <i class=\"bi bi-person\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasSettings()) {\n <rlb-navbar-item [router-link]=\"'/settings'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') |translate\">\n <i class=\"bi bi-gear\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.settings.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasApps() && apps().length > 1) {\n <rlb-navbar-item [router-link]=\"'/apps'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') |translate\">\n <i class=\"bi bi-grid-3x3-gap-fill\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.apps.button' | translate}}</span>\n </rlb-navbar-item>\n }\n\n } @else if (navbarLayout() == 'dropdown') {\n <!-- MODERN DROPDOWN MODE -->\n\n <!--Unauthenticated Login -->\n @if (navbarHasLogin() && !isAuthenticated()) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') | translate\">\n <i class=\"bi bi-box-arrow-in-left fs-5\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{ 'core.account.login' | translate }}</span>\n </rlb-navbar-item>\n }\n\n <!-- Profile & Settings Account Card -->\n @if (navbarHasSettings() && isAuthenticated()) {\n <rlb-settings-dropdown-selector\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n }\n\n <!-- Apps Launcher -->\n @if (navbarHasApps() && isAuthenticated() && apps().length > 1) {\n <rlb-app-dropdown-selector\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n }\n }\n </ng-container>\n </rlb-navbar-items>\n </rlb-navbar>\n }\n <div class=\"rlb-main-wrapper\">\n @if (sidebarVisible()) {\n <rlb-sidebar [dark]=\"theme() === 'dark'\" id=\"sidebar\" class=\"rlb-sidebar\">\n @for (item of sidebarItems(); track $index) {\n <rlb-sidebar-item\n *roles=\"item.action\"\n [icon]=\"item.icon\" [link]=\"item.url\"\n [title]=\"item.title\" [label]=\"item.label\"\n [badgeCounter]=\"item.badgeCounter\"\n (click)=\"onSideBarItemClick(item)\"\n >\n {{item.label}}\n @for (subitem of item.items || []; track $index) {\n <rlb-sidebar-item\n *roles=\"subitem.action\"\n [icon]=\"subitem.icon\"\n [link]=\"subitem.url\"\n [title]=\"subitem.title\"\n [label]=\"subitem.label\"\n [badgeCounter]=\"subitem.badgeCounter\"\n (click)=\"onSideBarItemClick(subitem)\"\n >\n {{subitem.label}}\n </rlb-sidebar-item>\n }\n </rlb-sidebar-item>\n }\n </rlb-sidebar>\n }\n <div class=\"rlb-content\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n<!--@if (modalContainerId()) {-->\n<!-- <rlb-modal-container [id]=\"modalContainerId()\" />-->\n<!--}-->\n\n<!--@if (toastContainerIds()) {-->\n<!-- @if (Array.isArray(toastContainerIds())) {-->\n<!-- @for (toastContainerId of toastContainerIds() | asMulti; track toastContainerId) {-->\n<!-- <rlb-toast-container [id]=\"toastContainerId\" />-->\n<!-- }-->\n<!-- } @else {-->\n<!-- <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds() | asSingle\" />-->\n<!-- }-->\n<!--}-->\n", styles: [".separator{border-left:1px solid;padding:0 2px}\n"] }]
2410
+ }], ctorParameters: () => [], propDecorators: { modalContainerId: [{ type: i0.Input, args: [{ isSignal: true, alias: "modal-container-id", required: true }] }], breadcrumbInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "breadcrumb", required: false }] }], toastContainerIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "toast-container-ids", required: true }] }], mobileOffcanvas: [{ type: i0.ViewChild, args: ['mobileOffcanvas', { isSignal: true }] }], mobileSettingsMenu: [{ type: i0.ViewChild, args: ['mobileSettingsMenu', { isSignal: true }] }] } });
2307
2411
 
2308
2412
  class BaseComponent {
2309
- constructor(breakpointObserver, platformId) {
2310
- this.breakpointObserver = breakpointObserver;
2311
- this.platformId = platformId;
2312
- }
2313
- get isHandset$() {
2314
- if (isPlatformServer(this.platformId)) {
2315
- return of(true);
2316
- }
2317
- else {
2318
- return this.breakpointObserver.observe(Breakpoints.Handset)
2319
- .pipe(map(result => result.matches), shareReplay());
2320
- }
2321
- }
2322
- ngOnInit() { }
2323
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: BaseComponent, deps: [{ token: i1$7.BreakpointObserver }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
2324
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: BaseComponent, isStandalone: false, selector: "rlb-base-template", inputs: { breadcrumb: "breadcrumb", title: "title", subtitle: "subtitle" }, ngImport: i0, template: "<div class=\" mb-3\">\n @if (!(isHandset$ | async)) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"col-xl-8 col-lg-10 col-md-12 col-sm-12 col-xs-12 mx-auto\">\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n @if (breadcrumb) {\n <rlb-breadcrumb [items]=\"breadcrumb\"></rlb-breadcrumb>\n }\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title}}\n </h1>\n </div>\n </div>\n @if (subtitle) {\n <div class=\"row\">\n <div class=\"col-12 pb-12\">\n <span class=\"d-block text-h6 text-center\">\n {{subtitle}}\n </span>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <!--old ng-template #mobileMode-->\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title}}\n </h1>\n </div>\n </div>\n @if (subtitle) {\n <div class=\"row\">\n <div class=\"col-12 pb-7\">\n <div class=\"d-block text-h6 text-center\">\n {{subtitle}}\n </div>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2$1.BreadcrumbComponent, selector: "rlb-breadcrumb", inputs: ["divider", "items", "cssClasses"] }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }] }); }
2325
- }
2326
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: BaseComponent, decorators: [{
2413
+ constructor() {
2414
+ this.breakpointObserver = inject(BreakpointObserver);
2415
+ this.platformId = inject(PLATFORM_ID);
2416
+ this.breadcrumbInput = input(undefined, { ...(ngDevMode ? { debugName: "breadcrumbInput" } : /* istanbul ignore next */ {}), alias: 'breadcrumb' });
2417
+ this.breadcrumb = computed(() => this.breadcrumbInput() ?? [], ...(ngDevMode ? [{ debugName: "breadcrumb" }] : /* istanbul ignore next */ []));
2418
+ this.title = input.required(...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
2419
+ this.subtitle = input(...(ngDevMode ? [undefined, { debugName: "subtitle" }] : /* istanbul ignore next */ []));
2420
+ this.isHandset = toSignal(isPlatformServer(this.platformId)
2421
+ ? of(true)
2422
+ : this.breakpointObserver.observe(Breakpoints.Handset).pipe(map(result => result.matches)), { initialValue: true });
2423
+ }
2424
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2425
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: BaseComponent, isStandalone: true, selector: "rlb-base-template", inputs: { breadcrumbInput: { classPropertyName: "breadcrumbInput", publicName: "breadcrumb", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\" mb-3\">\n @if (!isHandset()) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"col-xl-8 col-lg-10 col-md-12 col-sm-12 col-xs-12 mx-auto\">\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n @if (breadcrumb()) {\n <rlb-breadcrumb [items]=\"breadcrumb()\"></rlb-breadcrumb>\n }\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title()}}\n </h1>\n </div>\n </div>\n @if (subtitle()) {\n <div class=\"row\">\n <div class=\"col-12 pb-12\">\n <span class=\"d-block text-h6 text-center\">\n {{subtitle()}}\n </span>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <!--old ng-template #mobileMode-->\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title()}}\n </h1>\n </div>\n </div>\n @if (subtitle()) {\n <div class=\"row\">\n <div class=\"col-12 pb-7\">\n <div class=\"d-block text-h6 text-center\">\n {{subtitle()}}\n </div>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BreadcrumbComponent, selector: "rlb-breadcrumb", inputs: ["divider", "items", "cssClasses"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2426
+ }
2427
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BaseComponent, decorators: [{
2327
2428
  type: Component,
2328
- args: [{ selector: 'rlb-base-template', standalone: false, template: "<div class=\" mb-3\">\n @if (!(isHandset$ | async)) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"col-xl-8 col-lg-10 col-md-12 col-sm-12 col-xs-12 mx-auto\">\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n @if (breadcrumb) {\n <rlb-breadcrumb [items]=\"breadcrumb\"></rlb-breadcrumb>\n }\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title}}\n </h1>\n </div>\n </div>\n @if (subtitle) {\n <div class=\"row\">\n <div class=\"col-12 pb-12\">\n <span class=\"d-block text-h6 text-center\">\n {{subtitle}}\n </span>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <!--old ng-template #mobileMode-->\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title}}\n </h1>\n </div>\n </div>\n @if (subtitle) {\n <div class=\"row\">\n <div class=\"col-12 pb-7\">\n <div class=\"d-block text-h6 text-center\">\n {{subtitle}}\n </div>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>\n" }]
2329
- }], ctorParameters: () => [{ type: i1$7.BreakpointObserver }, { type: Object, decorators: [{
2330
- type: Inject,
2331
- args: [PLATFORM_ID]
2332
- }] }], propDecorators: { breadcrumb: [{
2333
- type: Input
2334
- }], title: [{
2335
- type: Input
2336
- }], subtitle: [{
2337
- type: Input
2338
- }] } });
2429
+ args: [{ selector: 'rlb-base-template', imports: [NgTemplateOutlet, BreadcrumbComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\" mb-3\">\n @if (!isHandset()) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"col-xl-8 col-lg-10 col-md-12 col-sm-12 col-xs-12 mx-auto\">\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n @if (breadcrumb()) {\n <rlb-breadcrumb [items]=\"breadcrumb()\"></rlb-breadcrumb>\n }\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title()}}\n </h1>\n </div>\n </div>\n @if (subtitle()) {\n <div class=\"row\">\n <div class=\"col-12 pb-12\">\n <span class=\"d-block text-h6 text-center\">\n {{subtitle()}}\n </span>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <!--old ng-template #mobileMode-->\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title()}}\n </h1>\n </div>\n </div>\n @if (subtitle()) {\n <div class=\"row\">\n <div class=\"col-12 pb-7\">\n <div class=\"d-block text-h6 text-center\">\n {{subtitle()}}\n </div>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>\n" }]
2430
+ }], propDecorators: { breadcrumbInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "breadcrumb", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }] } });
2339
2431
 
2340
2432
  class ContentComponent {
2341
- constructor(breakpointObserver, platformId) {
2342
- this.breakpointObserver = breakpointObserver;
2343
- this.platformId = platformId;
2344
- }
2345
- get isHandset$() {
2346
- if (isPlatformServer(this.platformId)) {
2347
- return of(true);
2348
- }
2349
- else {
2350
- return this.breakpointObserver.observe(Breakpoints.Handset)
2351
- .pipe(map(result => result.matches), shareReplay());
2352
- }
2433
+ constructor() {
2434
+ this.breakpointObserver = inject(BreakpointObserver);
2435
+ this.platformId = inject(PLATFORM_ID);
2436
+ this.isHandset = toSignal(isPlatformServer(this.platformId)
2437
+ ? of(true)
2438
+ : this.breakpointObserver.observe(Breakpoints.Handset).pipe(map(result => result.matches)), { initialValue: true });
2353
2439
  }
2354
- ngOnInit() { }
2355
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ContentComponent, deps: [{ token: i1$7.BreakpointObserver }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component }); }
2356
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: ContentComponent, isStandalone: false, selector: "rlb-content-template", ngImport: i0, template: "<div class=\" mb-3\">\n @if (!(isHandset$ | async)) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"mx-auto col-sm-12 col-md-8 col-lg-9 col-xl-8\">\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>", styles: [""], dependencies: [{ kind: "directive", type: i1$6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }] }); }
2440
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2441
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ContentComponent, isStandalone: true, selector: "rlb-content-template", ngImport: i0, template: "<div class=\" mb-3\">\n @if (!isHandset()) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"mx-auto col-sm-12 col-md-8 col-lg-9 col-xl-8\">\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2357
2442
  }
2358
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ContentComponent, decorators: [{
2443
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContentComponent, decorators: [{
2359
2444
  type: Component,
2360
- args: [{ selector: 'rlb-content-template', standalone: false, template: "<div class=\" mb-3\">\n @if (!(isHandset$ | async)) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"mx-auto col-sm-12 col-md-8 col-lg-9 col-xl-8\">\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>" }]
2361
- }], ctorParameters: () => [{ type: i1$7.BreakpointObserver }, { type: Object, decorators: [{
2362
- type: Inject,
2363
- args: [PLATFORM_ID]
2364
- }] }] });
2445
+ args: [{ selector: 'rlb-content-template', imports: [NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\" mb-3\">\n @if (!isHandset()) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"mx-auto col-sm-12 col-md-8 col-lg-9 col-xl-8\">\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>" }]
2446
+ }] });
2365
2447
 
2366
2448
  class TruncatePipe {
2367
2449
  transform(value, limit = 25, completeWords = false, ellipsis = '...') {
@@ -2372,14 +2454,13 @@ class TruncatePipe {
2372
2454
  }
2373
2455
  return value.length > limit ? value.slice(0, limit) + ellipsis : value;
2374
2456
  }
2375
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TruncatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2376
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.7", ngImport: i0, type: TruncatePipe, isStandalone: false, name: "truncate" }); }
2457
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TruncatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2458
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: TruncatePipe, isStandalone: true, name: "truncate" }); }
2377
2459
  }
2378
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TruncatePipe, decorators: [{
2460
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TruncatePipe, decorators: [{
2379
2461
  type: Pipe,
2380
2462
  args: [{
2381
- name: 'truncate',
2382
- standalone: false
2463
+ name: 'truncate'
2383
2464
  }]
2384
2465
  }] });
2385
2466
 
@@ -2404,34 +2485,36 @@ class AutolinkPipe {
2404
2485
  return '' + space + link;
2405
2486
  });
2406
2487
  }
2407
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AutolinkPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2408
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.7", ngImport: i0, type: AutolinkPipe, isStandalone: false, name: "autolink" }); }
2488
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AutolinkPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2489
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AutolinkPipe, isStandalone: true, name: "autolink" }); }
2409
2490
  }
2410
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AutolinkPipe, decorators: [{
2491
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AutolinkPipe, decorators: [{
2411
2492
  type: Pipe,
2412
2493
  args: [{
2413
- name: 'autolink',
2414
- standalone: false
2494
+ name: 'autolink'
2415
2495
  }]
2416
2496
  }] });
2417
2497
 
2418
2498
  class AppContainerComponent {
2419
- constructor(env, store, router, storage, pwaUpdaterService, appsService, loggerService) {
2420
- this.env = env;
2421
- this.store = store;
2422
- this.router = router;
2423
- this.storage = storage;
2424
- this.pwaUpdaterService = pwaUpdaterService;
2425
- this.appsService = appsService;
2426
- this.loggerService = loggerService;
2499
+ constructor() {
2500
+ this.Array = Array;
2427
2501
  this.templateSubject = new BehaviorSubject('app');
2502
+ this.modalContainerId = input.required({ ...(ngDevMode ? { debugName: "modalContainerId" } : /* istanbul ignore next */ {}), alias: 'modal-container-id' });
2503
+ this.toastContainerIds = input.required({ ...(ngDevMode ? { debugName: "toastContainerIds" } : /* istanbul ignore next */ {}), alias: 'toast-container-ids' });
2504
+ this.env = inject(RLB_CFG_ENV);
2505
+ this.store = inject((Store));
2506
+ this.router = inject(Router);
2507
+ this.storage = inject(AppStorageService);
2508
+ this.pwaUpdaterService = inject(PwaUpdaterService);
2509
+ this.appsService = inject(AppsService);
2510
+ this.loggerService = inject(AppLoggerService);
2428
2511
  this.logger = this.loggerService.for(this.constructor.name);
2429
2512
  const theme = (this.storage.readLocal('theme') || 'dark');
2430
2513
  this.store.dispatch(AppContextActions.setTheme({ theme }));
2431
2514
  this.store.dispatch(AppContextActions.setLanguage({ language: this.storage.readLocal('locale') || 'en' }));
2432
2515
  this.store
2433
2516
  .select((state) => state[appContextFeatureKey].currentApp)
2434
- .pipe(distinctUntilChanged())
2517
+ .pipe(distinctUntilChanged(), takeUntilDestroyed())
2435
2518
  .subscribe(async (currentApp) => {
2436
2519
  this.logger.info('currentApp:', currentApp);
2437
2520
  if (!currentApp)
@@ -2457,39 +2540,25 @@ class AppContainerComponent {
2457
2540
  }
2458
2541
  });
2459
2542
  this.router.events
2460
- .pipe(filter(event => event instanceof RoutesRecognized), map((event) => event?.state?.root?.firstChild?.data?.['template'] || 'app'), map(o => o), tap((template) => this.templateSubject.next(template))).subscribe();
2543
+ .pipe(filter(event => event instanceof RoutesRecognized), map((event) => event?.state?.root?.firstChild?.data?.['template'] || 'app'), map(o => o), tap((template) => this.templateSubject.next(template)), takeUntilDestroyed()).subscribe();
2544
+ if (this.env.pwaUpdateEnabled) {
2545
+ this.pwaUpdaterService.checkWithDialog().pipe(takeUntilDestroyed()).subscribe();
2546
+ }
2461
2547
  }
2462
2548
  get template$() {
2463
2549
  return this.templateSubject.asObservable();
2464
2550
  }
2465
- ngOnDestroy() {
2466
- this.swUpdateSubscription?.unsubscribe();
2467
- }
2468
- ngOnInit() {
2469
- if (this.env.pwaUpdateEnabled) {
2470
- this.swUpdateSubscription = this.pwaUpdaterService.checkWithDialog().subscribe();
2471
- }
2472
- }
2473
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppContainerComponent, deps: [{ token: RLB_CFG_ENV }, { token: i1$1.Store }, { token: i2.Router }, { token: AppStorageService }, { token: PwaUpdaterService }, { token: AppsService }, { token: AppLoggerService }], target: i0.ɵɵFactoryTarget.Component }); }
2474
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: AppContainerComponent, isStandalone: false, selector: "rlb-app-container", inputs: { modalContainerId: ["modal-container-id", "modalContainerId"], toastContainerIds: ["toast-container-ids", "toastContainerIds"] }, ngImport: i0, template: "@if ((template$ | async) === 'app') {\n <rlb-app-template>\n <router-outlet />\n </rlb-app-template>\n}\n@if ((template$ | async) === 'basic') {\n <router-outlet />\n}\n\n\n@if (modalContainerId) {\n <rlb-modal-container [id]=\"modalContainerId\" />\n}\n\n@if (toastContainerIds) {\n @if (toastContainerIds.constructor.name === 'Array') {\n @for (toastContainerId of toastContainerIds | asMulti; track toastContainerId) {\n <rlb-toast-container [id]=\"toastContainerId\" />\n }\n } @else {\n <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds | asSingle\" />\n }\n}", dependencies: [{ kind: "component", type: i2$1.ModalContainerComponent, selector: "rlb-modal-container", inputs: ["id"] }, { kind: "component", type: i2$1.ToastContainerComponent, selector: "rlb-toast-container", inputs: ["id"] }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AppTemplateComponent, selector: "rlb-app-template", inputs: ["modal-container-id", "toast-container-ids"] }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }, { kind: "pipe", type: AsMultiPipe, name: "asMulti" }, { kind: "pipe", type: AsSinglePipe, name: "asSingle" }] }); }
2551
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2552
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AppContainerComponent, isStandalone: true, selector: "rlb-app-container", inputs: { modalContainerId: { classPropertyName: "modalContainerId", publicName: "modal-container-id", isSignal: true, isRequired: true, transformFunction: null }, toastContainerIds: { classPropertyName: "toastContainerIds", publicName: "toast-container-ids", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if ((template$ | async) === 'app') {\n <rlb-app-template [modal-container-id]=\"modalContainerId()\" [toast-container-ids]=\"toastContainerIds()\">\n <router-outlet />\n </rlb-app-template>\n}\n@if ((template$ | async) === 'basic') {\n <router-outlet />\n}\n\n\n@if (modalContainerId()) {\n <rlb-modal-container [id]=\"modalContainerId()\" />\n}\n\n@if (toastContainerIds()) {\n @if (Array.isArray(toastContainerIds())) {\n @for (toastContainerId of toastContainerIds() | asMulti; track toastContainerId) {\n <rlb-toast-container [id]=\"toastContainerId\" />\n }\n } @else {\n <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds() | asSingle\" />\n }\n}", dependencies: [{ kind: "component", type: AppTemplateComponent, selector: "rlb-app-template", inputs: ["modal-container-id", "breadcrumb", "toast-container-ids"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i5.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: ModalContainerComponent, selector: "rlb-modal-container", inputs: ["id"] }, { kind: "component", type: ToastContainerComponent, selector: "rlb-toast-container", inputs: ["id"] }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }, { kind: "pipe", type: AsMultiPipe, name: "asMulti" }, { kind: "pipe", type: AsSinglePipe, name: "asSingle" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2475
2553
  }
2476
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppContainerComponent, decorators: [{
2554
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContainerComponent, decorators: [{
2477
2555
  type: Component,
2478
- args: [{ selector: 'rlb-app-container', standalone: false, template: "@if ((template$ | async) === 'app') {\n <rlb-app-template>\n <router-outlet />\n </rlb-app-template>\n}\n@if ((template$ | async) === 'basic') {\n <router-outlet />\n}\n\n\n@if (modalContainerId) {\n <rlb-modal-container [id]=\"modalContainerId\" />\n}\n\n@if (toastContainerIds) {\n @if (toastContainerIds.constructor.name === 'Array') {\n @for (toastContainerId of toastContainerIds | asMulti; track toastContainerId) {\n <rlb-toast-container [id]=\"toastContainerId\" />\n }\n } @else {\n <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds | asSingle\" />\n }\n}" }]
2479
- }], ctorParameters: () => [{ type: undefined, decorators: [{
2480
- type: Inject,
2481
- args: [RLB_CFG_ENV]
2482
- }] }, { type: i1$1.Store }, { type: i2.Router }, { type: AppStorageService }, { type: PwaUpdaterService }, { type: AppsService }, { type: AppLoggerService }], propDecorators: { modalContainerId: [{
2483
- type: Input,
2484
- args: ['modal-container-id']
2485
- }], toastContainerIds: [{
2486
- type: Input,
2487
- args: ['toast-container-ids']
2488
- }] } });
2556
+ args: [{ selector: 'rlb-app-container', imports: [AppTemplateComponent, CommonModule, RouterModule, ModalContainerComponent, ToastContainerComponent, AsMultiPipe, AsSinglePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if ((template$ | async) === 'app') {\n <rlb-app-template [modal-container-id]=\"modalContainerId()\" [toast-container-ids]=\"toastContainerIds()\">\n <router-outlet />\n </rlb-app-template>\n}\n@if ((template$ | async) === 'basic') {\n <router-outlet />\n}\n\n\n@if (modalContainerId()) {\n <rlb-modal-container [id]=\"modalContainerId()\" />\n}\n\n@if (toastContainerIds()) {\n @if (Array.isArray(toastContainerIds())) {\n @for (toastContainerId of toastContainerIds() | asMulti; track toastContainerId) {\n <rlb-toast-container [id]=\"toastContainerId\" />\n }\n } @else {\n <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds() | asSingle\" />\n }\n}" }]
2557
+ }], ctorParameters: () => [], propDecorators: { modalContainerId: [{ type: i0.Input, args: [{ isSignal: true, alias: "modal-container-id", required: true }] }], toastContainerIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "toast-container-ids", required: true }] }] } });
2489
2558
 
2490
2559
  class ForbiddenComponent {
2491
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ForbiddenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2492
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.7", type: ForbiddenComponent, isStandalone: false, selector: "rlb-forbidden", ngImport: i0, template: `<div class="container" style="height:calc(100vh - 58px);">
2560
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ForbiddenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2561
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: ForbiddenComponent, isStandalone: true, selector: "rlb-forbidden", ngImport: i0, template: `<div class="container" style="height:calc(100vh - 58px);">
2493
2562
  <div class="align-center">
2494
2563
  <div class="text-center">
2495
2564
  <h1 class="text-primary">
@@ -2502,13 +2571,13 @@ class ForbiddenComponent {
2502
2571
  </div>
2503
2572
  </div>
2504
2573
  </div>
2505
- `, isInline: true, dependencies: [{ kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }] }); }
2574
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2506
2575
  }
2507
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ForbiddenComponent, decorators: [{
2576
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ForbiddenComponent, decorators: [{
2508
2577
  type: Component,
2509
2578
  args: [{
2510
2579
  selector: 'rlb-forbidden',
2511
- standalone: false,
2580
+ imports: [TranslateModule],
2512
2581
  template: `<div class="container" style="height:calc(100vh - 58px);">
2513
2582
  <div class="align-center">
2514
2583
  <div class="text-center">
@@ -2522,14 +2591,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
2522
2591
  </div>
2523
2592
  </div>
2524
2593
  </div>
2525
- `
2594
+ `,
2595
+ changeDetection: ChangeDetectionStrategy.OnPush,
2526
2596
  }]
2527
2597
  }] });
2528
2598
 
2529
2599
  class RlbAppModule {
2530
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbAppModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2531
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.7", ngImport: i0, type: RlbAppModule, declarations: [
2532
- // pages
2600
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2601
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, imports: [CommonModule,
2602
+ FormsModule,
2603
+ ReactiveFormsModule,
2604
+ TranslateModule,
2605
+ RlbBootstrapModule,
2606
+ RouterModule,
2607
+ // standalone
2533
2608
  CmsContentComponent,
2534
2609
  CookiesComponent,
2535
2610
  NotFoundComponent,
@@ -2537,7 +2612,6 @@ class RlbAppModule {
2537
2612
  SupportComponent,
2538
2613
  TermsAndConditionsComponent,
2539
2614
  ForbiddenComponent,
2540
- // pipes
2541
2615
  CmsPipe,
2542
2616
  AsMultiPipe,
2543
2617
  AsSinglePipe,
@@ -2545,7 +2619,6 @@ class RlbAppModule {
2545
2619
  RightComponentPipe,
2546
2620
  TruncatePipe,
2547
2621
  AutolinkPipe,
2548
- // templates
2549
2622
  BaseComponent,
2550
2623
  CmsComponent,
2551
2624
  ContentComponent,
@@ -2553,13 +2626,7 @@ class RlbAppModule {
2553
2626
  AppContainerComponent,
2554
2627
  SettingsDropdownSelectorComponent,
2555
2628
  AppDropdownSelectorComponent,
2556
- // directives
2557
- RlbRole], imports: [CommonModule,
2558
- FormsModule,
2559
- ReactiveFormsModule,
2560
- TranslateModule,
2561
- RlbBootstrapModule,
2562
- RouterModule], exports: [
2629
+ RlbRole], exports: [
2563
2630
  // pipes
2564
2631
  CmsPipe,
2565
2632
  AsMultiPipe,
@@ -2581,49 +2648,36 @@ class RlbAppModule {
2581
2648
  FormsModule,
2582
2649
  // directives
2583
2650
  RlbRole] }); }
2584
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbAppModule, imports: [CommonModule,
2651
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, imports: [CommonModule,
2585
2652
  FormsModule,
2586
2653
  ReactiveFormsModule,
2587
2654
  TranslateModule,
2588
2655
  RlbBootstrapModule,
2589
- RouterModule,
2656
+ RouterModule,
2657
+ // standalone
2658
+ CmsContentComponent,
2659
+ CookiesComponent,
2660
+ NotFoundComponent,
2661
+ PrivacyComponent,
2662
+ SupportComponent,
2663
+ TermsAndConditionsComponent,
2664
+ ForbiddenComponent,
2665
+ BaseComponent,
2666
+ CmsComponent,
2667
+ AppTemplateComponent,
2668
+ AppContainerComponent,
2669
+ SettingsDropdownSelectorComponent,
2670
+ AppDropdownSelectorComponent,
2590
2671
  // modules
2591
2672
  TranslateModule,
2592
2673
  RlbBootstrapModule,
2593
2674
  RouterModule,
2594
2675
  FormsModule] }); }
2595
2676
  }
2596
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbAppModule, decorators: [{
2677
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, decorators: [{
2597
2678
  type: NgModule,
2598
2679
  args: [{
2599
- declarations: [
2600
- // pages
2601
- CmsContentComponent,
2602
- CookiesComponent,
2603
- NotFoundComponent,
2604
- PrivacyComponent,
2605
- SupportComponent,
2606
- TermsAndConditionsComponent,
2607
- ForbiddenComponent,
2608
- // pipes
2609
- CmsPipe,
2610
- AsMultiPipe,
2611
- AsSinglePipe,
2612
- LeftComponentPipe,
2613
- RightComponentPipe,
2614
- TruncatePipe,
2615
- AutolinkPipe,
2616
- // templates
2617
- BaseComponent,
2618
- CmsComponent,
2619
- ContentComponent,
2620
- AppTemplateComponent,
2621
- AppContainerComponent,
2622
- SettingsDropdownSelectorComponent,
2623
- AppDropdownSelectorComponent,
2624
- // directives
2625
- RlbRole,
2626
- ],
2680
+ declarations: [],
2627
2681
  exports: [
2628
2682
  // pipes
2629
2683
  CmsPipe,
@@ -2654,177 +2708,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
2654
2708
  TranslateModule,
2655
2709
  RlbBootstrapModule,
2656
2710
  RouterModule,
2711
+ // standalone
2712
+ CmsContentComponent,
2713
+ CookiesComponent,
2714
+ NotFoundComponent,
2715
+ PrivacyComponent,
2716
+ SupportComponent,
2717
+ TermsAndConditionsComponent,
2718
+ ForbiddenComponent,
2719
+ CmsPipe,
2720
+ AsMultiPipe,
2721
+ AsSinglePipe,
2722
+ LeftComponentPipe,
2723
+ RightComponentPipe,
2724
+ TruncatePipe,
2725
+ AutolinkPipe,
2726
+ BaseComponent,
2727
+ CmsComponent,
2728
+ ContentComponent,
2729
+ AppTemplateComponent,
2730
+ AppContainerComponent,
2731
+ SettingsDropdownSelectorComponent,
2732
+ AppDropdownSelectorComponent,
2733
+ RlbRole,
2657
2734
  ],
2658
2735
  }]
2659
2736
  }] });
2660
2737
 
2661
- class ErrorModalComponent {
2662
- constructor() {
2663
- this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
2664
- this.valid = model(true, ...(ngDevMode ? [{ debugName: "valid" }] : /* istanbul ignore next */ []));
2665
- }
2666
- onEnter() { }
2667
- ngOnInit() {
2668
- console.log(this.data());
2669
- }
2670
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2671
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.7", type: ErrorModalComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, valid: { classPropertyName: "valid", publicName: "valid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valid: "validChange" }, hostDirectives: [{ directive: i2$1.ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
2672
- <div class="modal-header">
2673
- <h5 class="modal-title">{{ data().title }}</h5>
2674
- <button
2675
- type="button"
2676
- class="btn-close"
2677
- aria-label="Close"
2678
- data-modal-reason="close"
2679
- ></button>
2680
- </div>
2681
- <div class="modal-body">
2682
- <span>{{ data().content }}</span>
2683
- </div>
2684
- <div class="modal-footer">
2685
- <button
2686
- type="button"
2687
- class="btn btn-primary"
2688
- data-modal-reason="close"
2689
- >
2690
- {{ data().ok }}
2691
- </button>
2692
- </div>
2693
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbAppModule }] }); }
2694
- }
2695
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ErrorModalComponent, decorators: [{
2696
- type: Component,
2697
- args: [{
2698
- imports: [RlbAppModule],
2699
- template: `
2700
- <div class="modal-header">
2701
- <h5 class="modal-title">{{ data().title }}</h5>
2702
- <button
2703
- type="button"
2704
- class="btn-close"
2705
- aria-label="Close"
2706
- data-modal-reason="close"
2707
- ></button>
2708
- </div>
2709
- <div class="modal-body">
2710
- <span>{{ data().content }}</span>
2711
- </div>
2712
- <div class="modal-footer">
2713
- <button
2714
- type="button"
2715
- class="btn btn-primary"
2716
- data-modal-reason="close"
2717
- >
2718
- {{ data().ok }}
2719
- </button>
2720
- </div>
2721
- `,
2722
- hostDirectives: [
2723
- {
2724
- directive: ModalDirective,
2725
- inputs: ['id', 'data-instance', 'data-options'],
2726
- },
2727
- ],
2728
- }]
2729
- }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], valid: [{ type: i0.Input, args: [{ isSignal: true, alias: "valid", required: false }] }, { type: i0.Output, args: ["validChange"] }] } });
2730
-
2731
- class ModalAppsComponent {
2732
- constructor() {
2733
- this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
2734
- this.valid = model(true, ...(ngDevMode ? [{ debugName: "valid" }] : /* istanbul ignore next */ []));
2735
- this.apps = [];
2736
- }
2737
- appSelected(app) {
2738
- this.result = app;
2739
- }
2740
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ModalAppsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2741
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: ModalAppsComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, valid: { classPropertyName: "valid", publicName: "valid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valid: "validChange" }, hostDirectives: [{ directive: i2$1.ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
2742
- <div class="modal-header">
2743
- <h5 class="modal-title">{{ data().title }}</h5>
2744
- <button
2745
- type="button"
2746
- class="btn-close"
2747
- aria-label="Close"
2748
- data-modal-reason="close"
2749
- ></button>
2750
- </div>
2751
- <div class="modal-body">
2752
- <ul class="row row-cols-4 list-unstyled list">
2753
- @for (app of data().content; track app) {
2754
- <li
2755
- class="col my-2"
2756
- [tooltip]="app.description | translate"
2757
- >
2758
- <a
2759
- class="d-block text-body-emphasis text-decoration-none"
2760
- (click)="appSelected(app)"
2761
- [class.disabled]="!app.enabled"
2762
- data-modal-reason="ok"
2763
- >
2764
- <div class="px-3 py-4 mb-2 bg-body-secondary text-center rounded">
2765
- <i [ngClass]="app.icon"></i>
2766
- </div>
2767
- <div class="name text-muted text-decoration-none text-center pt-1">
2768
- {{ app.name | translate }}
2769
- </div>
2770
- </a>
2771
- </li>
2772
- }
2773
- </ul>
2774
- </div>
2775
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "directive", type: i2$1.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }] }); }
2776
- }
2777
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ModalAppsComponent, decorators: [{
2778
- type: Component,
2779
- args: [{
2780
- imports: [RlbAppModule, CommonModule],
2781
- template: `
2782
- <div class="modal-header">
2783
- <h5 class="modal-title">{{ data().title }}</h5>
2784
- <button
2785
- type="button"
2786
- class="btn-close"
2787
- aria-label="Close"
2788
- data-modal-reason="close"
2789
- ></button>
2790
- </div>
2791
- <div class="modal-body">
2792
- <ul class="row row-cols-4 list-unstyled list">
2793
- @for (app of data().content; track app) {
2794
- <li
2795
- class="col my-2"
2796
- [tooltip]="app.description | translate"
2797
- >
2798
- <a
2799
- class="d-block text-body-emphasis text-decoration-none"
2800
- (click)="appSelected(app)"
2801
- [class.disabled]="!app.enabled"
2802
- data-modal-reason="ok"
2803
- >
2804
- <div class="px-3 py-4 mb-2 bg-body-secondary text-center rounded">
2805
- <i [ngClass]="app.icon"></i>
2806
- </div>
2807
- <div class="name text-muted text-decoration-none text-center pt-1">
2808
- {{ app.name | translate }}
2809
- </div>
2810
- </a>
2811
- </li>
2812
- }
2813
- </ul>
2814
- </div>
2815
- `,
2816
- hostDirectives: [{ directive: ModalDirective, inputs: ['id', 'data-instance', 'data-options'] }],
2817
- }]
2818
- }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], valid: [{ type: i0.Input, args: [{ isSignal: true, alias: "valid", required: false }] }, { type: i0.Output, args: ["validChange"] }] } });
2819
-
2820
2738
  class AppSelectorComponent {
2821
- constructor(_location, appsService, authService) {
2822
- this._location = _location;
2823
- this.appsService = appsService;
2824
- this.authService = authService;
2825
- }
2826
- get apps() {
2827
- return this.appsService.apps;
2739
+ constructor() {
2740
+ this._location = inject(Location);
2741
+ this.appsService = inject(AppsService);
2742
+ this.authService = inject(AuthenticationService);
2743
+ this.apps = this.appsService.apps;
2744
+ this.auth$ = this.authService.isAuthenticated$;
2828
2745
  }
2829
2746
  backClicked() {
2830
2747
  this._location.back();
@@ -2832,16 +2749,13 @@ class AppSelectorComponent {
2832
2749
  selectApp(app) {
2833
2750
  this.appsService.selectApp(app, 'app');
2834
2751
  }
2835
- get auth$() {
2836
- return this.authService.isAuthenticated$;
2837
- }
2838
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppSelectorComponent, deps: [{ token: i1$6.Location }, { token: AppsService }, { token: AuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
2839
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: AppSelectorComponent, isStandalone: true, selector: "rlb-app-selector", ngImport: i0, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.apps.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y cur\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <rlb-list>\n @for (app of apps; track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.core) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.core.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.core.title | translate\"\n [disabled]=\"!app.enabled && (app.core.auth && !(auth$ | async))\" [line-2]=\"app.core.description | translate\"\n (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i2$1.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i2$1.ListItemImageComponent, selector: "rlb-list-item-image", inputs: ["active", "disabled", "counter-empty", "counter-pill", "counter-border", "avatar-size", "username", "line-1", "line-2", "avatar", "counter", "counter-color", "icon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }] }); }
2752
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2753
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AppSelectorComponent, isStandalone: true, selector: "rlb-app-selector", ngImport: i0, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.apps.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y cur\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <rlb-list>\n @for (app of apps(); track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.core) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.core.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.core.title | translate\"\n [disabled]=\"!app.enabled && (app.core.auth && !(auth$ | async))\" [line-2]=\"app.core.description | translate\"\n (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n</div>\n\n", styles: [""], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i1$3.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i1$3.ListItemImageComponent, selector: "rlb-list-item-image", inputs: ["active", "disabled", "counter-empty", "counter-pill", "counter-border", "avatar-size", "username", "line-1", "line-2", "avatar", "counter", "counter-color", "icon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2840
2754
  }
2841
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppSelectorComponent, decorators: [{
2755
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppSelectorComponent, decorators: [{
2842
2756
  type: Component,
2843
- args: [{ selector: 'rlb-app-selector', imports: [RlbAppModule, CommonModule], template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.apps.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y cur\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <rlb-list>\n @for (app of apps; track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.core) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.core.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.core.title | translate\"\n [disabled]=\"!app.enabled && (app.core.auth && !(auth$ | async))\" [line-2]=\"app.core.description | translate\"\n (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n</div>\n" }]
2844
- }], ctorParameters: () => [{ type: i1$6.Location }, { type: AppsService }, { type: AuthenticationService }] });
2757
+ args: [{ selector: 'rlb-app-selector', imports: [RlbAppModule, CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.apps.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y cur\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <rlb-list>\n @for (app of apps(); track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.core) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.core.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.core.title | translate\"\n [disabled]=\"!app.enabled && (app.core.auth && !(auth$ | async))\" [line-2]=\"app.core.description | translate\"\n (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n</div>\n\n" }]
2758
+ }] });
2845
2759
 
2846
2760
  const oauthGuard = (route, state) => {
2847
2761
  const authService = inject(AuthenticationService);
@@ -3021,10 +2935,10 @@ class OauthPasswordService {
3021
2935
  }, r.expires_in * 1000 - 60000);
3022
2936
  }
3023
2937
  }
3024
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: OauthPasswordService, deps: [{ token: i1$2.HttpClient }, { token: AuthenticationService }, { token: AppLoggerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
3025
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: OauthPasswordService, providedIn: 'root' }); }
2938
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OauthPasswordService, deps: [{ token: i1$2.HttpClient }, { token: AuthenticationService }, { token: AppLoggerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
2939
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OauthPasswordService, providedIn: 'root' }); }
3026
2940
  }
3027
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: OauthPasswordService, decorators: [{
2941
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OauthPasswordService, decorators: [{
3028
2942
  type: Injectable,
3029
2943
  args: [{
3030
2944
  providedIn: 'root'
@@ -3111,10 +3025,10 @@ class KeycloakProfileService {
3111
3025
  }
3112
3026
  });
3113
3027
  }
3114
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: KeycloakProfileService, deps: [{ token: i1$2.HttpClient }, { token: AuthenticationService }, { token: ErrorManagementService }, { token: i1$5.OidcSecurityService }], target: i0.ɵɵFactoryTarget.Injectable }); }
3115
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: KeycloakProfileService, providedIn: 'root' }); }
3028
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: KeycloakProfileService, deps: [{ token: i1$2.HttpClient }, { token: AuthenticationService }, { token: ErrorManagementService }, { token: i1$5.OidcSecurityService }], target: i0.ɵɵFactoryTarget.Injectable }); }
3029
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: KeycloakProfileService, providedIn: 'root' }); }
3116
3030
  }
3117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: KeycloakProfileService, decorators: [{
3031
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: KeycloakProfileService, decorators: [{
3118
3032
  type: Injectable,
3119
3033
  args: [{
3120
3034
  providedIn: 'root',
@@ -3122,35 +3036,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
3122
3036
  }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: AuthenticationService }, { type: ErrorManagementService }, { type: i1$5.OidcSecurityService }] });
3123
3037
 
3124
3038
  class UserAccountComponent {
3125
- constructor(_location, store, keycloakProfileService, modalService, languageService, authService, router) {
3126
- this._location = _location;
3127
- this.store = store;
3128
- this.keycloakProfileService = keycloakProfileService;
3129
- this.modalService = modalService;
3130
- this.languageService = languageService;
3131
- this.authService = authService;
3132
- this.router = router;
3133
- this.subs = [];
3134
- this.authService.isAuthenticated$.pipe(filter(isAuth => !isAuth), switchMap(() => this.router.navigate(['/']))).subscribe();
3039
+ constructor() {
3040
+ this._location = inject(Location);
3041
+ this.store = inject((Store));
3042
+ this.keycloakProfileService = inject(KeycloakProfileService);
3043
+ this.modalService = inject(ModalService);
3044
+ this.languageService = inject(LanguageService);
3045
+ this.authService = inject(AuthenticationService);
3046
+ this.router = inject(Router);
3047
+ this.keyCloakUser = signal(undefined, ...(ngDevMode ? [{ debugName: "keyCloakUser" }] : /* istanbul ignore next */ []));
3048
+ this.keyCloakDevices = toSignal(this.keycloakProfileService.getDevices());
3049
+ this.keycloakCredentials = signal([], ...(ngDevMode ? [{ debugName: "keycloakCredentials" }] : /* istanbul ignore next */ []));
3050
+ this.authService.isAuthenticated$.pipe(takeUntilDestroyed(), filter(isAuth => !isAuth), switchMap(() => this.router.navigate(['/']))).subscribe();
3135
3051
  }
3136
3052
  backClicked() {
3137
3053
  this._location.back();
3138
3054
  }
3139
3055
  ngOnInit() {
3140
- this.subs.push(this.keycloakProfileService.getUserProfile().subscribe((user) => {
3141
- this.keyCloakUser = user;
3142
- }));
3143
- this.subs.push(this.keycloakProfileService.getDevices().subscribe((devices) => {
3144
- this.keyCloakDevices = devices;
3145
- }));
3146
- this.subs.push(this.keycloakProfileService.getCredentials().subscribe((credentials) => {
3147
- this.keycloakCredentials = credentials;
3148
- }));
3149
- }
3150
- ngOnDestroy() {
3151
- while (this.subs.length) {
3152
- this.subs.pop()?.unsubscribe();
3153
- }
3056
+ this.keycloakProfileService.getUserProfile()
3057
+ .pipe(takeUntilDestroyed())
3058
+ .subscribe((user) => this.keyCloakUser.set(user));
3059
+ this.keycloakProfileService.getCredentials()
3060
+ .pipe(takeUntilDestroyed())
3061
+ .subscribe((credentials) => this.keycloakCredentials.set(credentials));
3154
3062
  }
3155
3063
  logout() {
3156
3064
  this.store.dispatch(AuthActions.logout());
@@ -3159,18 +3067,25 @@ class UserAccountComponent {
3159
3067
  return await lastValueFrom(this.modalService.openConfirmModal(this.languageService.translate("core.account.credentials.deleteTitle"), this.languageService.translate("core.account.credentials.deleteMessage"), this.languageService.translate("core.account.credentials.deleteHeader"), this.languageService.translate("common.yes"), this.languageService.translate("common.cancel")).pipe(switchMap((result) => {
3160
3068
  if (result) {
3161
3069
  return this.keycloakProfileService.removeCredential(id).pipe(tap(() => {
3162
- const meta = this.keycloakCredentials.find((c) => c.type === type)?.userCredentialMetadatas;
3163
- const idx = meta?.findIndex((m) => m.credential.id === id);
3164
- if (meta && idx !== undefined && idx !== -1) {
3165
- meta.splice(idx, 1);
3166
- }
3070
+ this.keycloakCredentials.update(credentials => {
3071
+ const newCredentials = [...credentials];
3072
+ const credType = newCredentials.find(c => c.type === type);
3073
+ if (credType?.userCredentialMetadatas) {
3074
+ credType.userCredentialMetadatas = credType.userCredentialMetadatas.filter(m => m.credential.id !== id);
3075
+ }
3076
+ return newCredentials;
3077
+ });
3167
3078
  }));
3168
3079
  }
3169
3080
  return EMPTY;
3170
3081
  })));
3171
3082
  }
3172
3083
  async updateProfile() {
3173
- return await lastValueFrom(this.keycloakProfileService.updateUserProfile(this.keyCloakUser));
3084
+ const user = this.keyCloakUser();
3085
+ if (user) {
3086
+ return await lastValueFrom(this.keycloakProfileService.updateUserProfile(user));
3087
+ }
3088
+ return;
3174
3089
  }
3175
3090
  updatePassword() {
3176
3091
  this.keycloakProfileService.updatePassword();
@@ -3178,36 +3093,36 @@ class UserAccountComponent {
3178
3093
  configureOTP() {
3179
3094
  this.keycloakProfileService.configureOTP();
3180
3095
  }
3181
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: UserAccountComponent, deps: [{ token: i1$6.Location }, { token: i1$1.Store }, { token: KeycloakProfileService }, { token: i2$1.ModalService }, { token: LanguageService }, { token: AuthenticationService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component }); }
3182
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: UserAccountComponent, isStandalone: true, selector: "rlb-user-account", ngImport: i0, template: "<div class=\"container mt-4 mb-5\">\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <h3 class=\"m-0\">{{\"Account settings\"|translate|uppercase}}</h3>\n <rlb-breadcrumb [cssClasses]=\"'p-0 px-md-1 py-md-2 m-0'\" [items]=\"[{ label: 'Home', link: '/', id: '1' },{ label: 'Account settings', id: '2' }]\" class=\"d-block\"></rlb-breadcrumb>\n </div>\n\n <!-- ACCOUNT DETAILS CARD -->\n <rlb-card class=\"mt-3\">\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h5 class=\"m-0\">{{\"Account\" | translate}}</h5>\n </rlb-card-header>\n\n <rlb-card-body class=\"px-4 py-4\">\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.username' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.username\" disabled />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.email' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.email\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.firstName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.firstName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.lastName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.lastName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n </rlb-card-body>\n\n <rlb-card-footer>\n <div class=\"d-flex align-items-center justify-content-end gap-2\">\n <button rlb-button outline (click)=\"updateProfile()\">\n <i class=\"bi bi-floppy\"></i>\n {{'common.save' | translate}}\n </button>\n <button rlb-button outline color=\"danger\" (click)=\"logout()\">\n <i class=\"bi bi-box-arrow-right\"></i>\n {{'core.account.logout' | translate}}\n </button>\n </div>\n </rlb-card-footer>\n </rlb-card>\n\n <!-- CREDENTIALS SECTION -->\n @if (keyCloakUser) {\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.credentials.title' | translate}}</h3>\n\n @for (type of keycloakCredentials; track type) {\n <rlb-card class=\"mb-4\">\n\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h6 class=\"mb-0 fw-bold\">{{ ('core.account.credentials.'+type?.type) | translate }}</h6>\n @if (type.type === 'otp') {\n <rlb-fab (click)=\"configureOTP()\" size=\"sm\" [tooltip]=\"'core.account.credentials.addOTP' | translate\">\n <i class=\"bi bi-plus-circle\"></i>\n </rlb-fab>\n }\n </rlb-card-header>\n\n <rlb-card-body>\n <rlb-list class=\"settings m-0\">\n @for (cred of type.userCredentialMetadatas; track cred.credential.id) {\n <rlb-list-item class=\"px-4 py-3\">\n <div class=\"row align-items-center w-100\">\n <div class=\"col-md-1 text-center mb-2 mb-md-0\">\n <i class=\"bi bi-key text-secondary\" style=\"font-size: 2rem;\"></i>\n </div>\n <div class=\"col-md-5 mb-2 mb-md-0\">\n <span class=\"text-muted small d-block\">{{ 'core.account.credentials.name' | translate }}</span>\n <span class=\"fw-semibold\">{{cred.credential.userLabel || cred.credential.type}}</span>\n </div>\n <div class=\"col-md-4 mb-3 mb-md-0\">\n <span class=\"text-muted small d-block\">{{'core.account.credentials.created' | translate}}</span>\n <span>{{cred.credential.createdDate | date:'dd:MM:yyyy HH:mm' }}</span>\n </div>\n <div class=\"col-md-2 text-md-end\">\n @if (type.removeable) {\n <button rlb-button class=\"w-100\" color=\"danger\" (click)=\"removeCredential(type.type, cred.credential.id)\">\n <i class=\"bi bi-trash\"></i> {{ 'core.account.credentials.delete' | translate}}\n </button>\n } @else {\n <button rlb-button class=\"w-100\" outline (click)=\"updatePassword()\">\n <i class=\"bi bi-pencil-square\"></i> {{ 'core.account.credentials.update' | translate}}\n </button>\n }\n </div>\n </div>\n </rlb-list-item>\n }\n\n @if (type.userCredentialMetadatas.length === 0) {\n <rlb-list-item>\n <div class=\"py-4 text-center text-muted\">\n {{ 'core.account.credentials.noCredentials' | translate}}\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n\n <!-- SESSION SECTION -->\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.session.title' | translate}}</h3>\n\n <rlb-card border=\"secondary\" class=\"mb-5\">\n <rlb-card-body class=\"p-0\">\n <rlb-list class=\"settings m-0\">\n @for (d of keyCloakDevices; track d.id) {\n <rlb-list-item class=\"settings-item px-4 py-4\">\n\n <!-- Session Top Row (Device Info) -->\n <div class=\"d-flex align-items-center pb-3 mb-3\">\n <i class=\"bi bi-laptop text-secondary me-3\" style=\"font-size: 2rem;\"></i>\n <h6 class=\"mb-0 fw-bold\">{{d.os}} {{d.osVersion}} - {{d.browser}}</h6>\n @if (d.current) {\n <span class=\"badge bg-success ms-3 rounded-pill px-3 py-2\">\n {{ 'core.account.session.current' | translate}}\n </span>\n }\n </div>\n\n <div class=\"row text-center text-md-start gy-3\">\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{ 'core.account.session.ip' | translate }}</span>\n <span class=\"fw-medium\">{{d.ipAddress}}</span>\n </div>\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{'core.account.session.lastAccess' | translate}}</span>\n <span>{{d.lastAccess*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.applications' | translate}}</span>\n <span>{{d.clientslist }} </span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.started' | translate}}</span>\n <span>{{d.started*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.expires' | translate}}</span>\n <span>{{d.expires*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n</div>\n", styles: [".settings .settings-item .settings-control{width:40%}\n"], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i2$1.InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "inputId", "extValidation", "enable-validation"] }, { kind: "component", type: i2$1.BreadcrumbComponent, selector: "rlb-breadcrumb", inputs: ["divider", "items", "cssClasses"] }, { kind: "component", type: i2$1.ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: i2$1.RlbFabComponent, selector: "rlb-fab", inputs: ["color", "size", "disabled", "outline", "position"] }, { kind: "component", type: i2$1.CardBodyComponent, selector: "rlb-card-body" }, { kind: "component", type: i2$1.CardFooterComponent, selector: "rlb-card-footer" }, { kind: "component", type: i2$1.CardHeaderComponent, selector: "rlb-card-header" }, { kind: "component", type: i2$1.CardComponent, selector: "rlb-card", inputs: ["align", "overlay", "background", "border"] }, { kind: "directive", type: i2$1.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "component", type: i2$1.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i2$1.ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1$6.DatePipe, name: "date" }] }); }
3096
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UserAccountComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3097
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: UserAccountComponent, isStandalone: true, selector: "rlb-user-account", ngImport: i0, template: "<div class=\"container mt-4 mb-5\">\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <h3 class=\"m-0\">{{\"Account settings\"|translate|uppercase}}</h3>\n <rlb-breadcrumb [cssClasses]=\"'p-0 px-md-1 py-md-2 m-0'\" [items]=\"[{ label: 'Home', link: '/', id: '1' },{ label: 'Account settings', id: '2' }]\" class=\"d-block\"></rlb-breadcrumb>\n </div>\n\n <!-- ACCOUNT DETAILS CARD -->\n <rlb-card class=\"mt-3\">\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h5 class=\"m-0\">{{\"Account\" | translate}}</h5>\n </rlb-card-header>\n\n <rlb-card-body class=\"px-4 py-4\">\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.username' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [ngModel]=\"keyCloakUser()?.username\" disabled />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.email' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.email\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.firstName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.firstName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.lastName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.lastName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n </rlb-card-body>\n\n <rlb-card-footer>\n <div class=\"d-flex align-items-center justify-content-end gap-2\">\n <button rlb-button outline (click)=\"updateProfile()\">\n <i class=\"bi bi-floppy\"></i>\n {{'common.save' | translate}}\n </button>\n <button rlb-button outline color=\"danger\" (click)=\"logout()\">\n <i class=\"bi bi-box-arrow-right\"></i>\n {{'core.account.logout' | translate}}\n </button>\n </div>\n </rlb-card-footer>\n </rlb-card>\n\n <!-- CREDENTIALS SECTION -->\n @if (keyCloakUser()) {\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.credentials.title' | translate}}</h3>\n\n @for (type of keycloakCredentials(); track type) {\n <rlb-card class=\"mb-4\">\n\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h6 class=\"mb-0 fw-bold\">{{ ('core.account.credentials.'+type?.type) | translate }}</h6>\n @if (type.type === 'otp') {\n <rlb-fab (click)=\"configureOTP()\" size=\"sm\" [tooltip]=\"'core.account.credentials.addOTP' | translate\">\n <i class=\"bi bi-plus-circle\"></i>\n </rlb-fab>\n }\n </rlb-card-header>\n\n <rlb-card-body>\n <rlb-list class=\"settings m-0\">\n @for (cred of type.userCredentialMetadatas; track cred.credential.id) {\n <rlb-list-item class=\"px-4 py-3\">\n <div class=\"row align-items-center w-100\">\n <div class=\"col-md-1 text-center mb-2 mb-md-0\">\n <i class=\"bi bi-key text-secondary\" style=\"font-size: 2rem;\"></i>\n </div>\n <div class=\"col-md-5 mb-2 mb-md-0\">\n <span class=\"text-muted small d-block\">{{ 'core.account.credentials.name' | translate }}</span>\n <span class=\"fw-semibold\">{{cred.credential.userLabel || cred.credential.type}}</span>\n </div>\n <div class=\"col-md-4 mb-3 mb-md-0\">\n <span class=\"text-muted small d-block\">{{'core.account.credentials.created' | translate}}</span>\n <span>{{cred.credential.createdDate | date:'dd:MM:yyyy HH:mm' }}</span>\n </div>\n <div class=\"col-md-2 text-md-end\">\n @if (type.removeable) {\n <button rlb-button class=\"w-100\" color=\"danger\" (click)=\"removeCredential(type.type, cred.credential.id)\">\n <i class=\"bi bi-trash\"></i> {{ 'core.account.credentials.delete' | translate}}\n </button>\n } @else {\n <button rlb-button class=\"w-100\" outline (click)=\"updatePassword()\">\n <i class=\"bi bi-pencil-square\"></i> {{ 'core.account.credentials.update' | translate}}\n </button>\n }\n </div>\n </div>\n </rlb-list-item>\n }\n\n @if (type.userCredentialMetadatas.length === 0) {\n <rlb-list-item>\n <div class=\"py-4 text-center text-muted\">\n {{ 'core.account.credentials.noCredentials' | translate}}\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n\n <!-- SESSION SECTION -->\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.session.title' | translate}}</h3>\n\n <rlb-card border=\"secondary\" class=\"mb-5\">\n <rlb-card-body class=\"p-0\">\n <rlb-list class=\"settings m-0\">\n @for (d of keyCloakDevices(); track d.id) {\n <rlb-list-item class=\"settings-item px-4 py-4\">\n\n <!-- Session Top Row (Device Info) -->\n <div class=\"d-flex align-items-center pb-3 mb-3\">\n <i class=\"bi bi-laptop text-secondary me-3\" style=\"font-size: 2rem;\"></i>\n <h6 class=\"mb-0 fw-bold\">{{d.os}} {{d.osVersion}} - {{d.browser}}</h6>\n @if (d.current) {\n <span class=\"badge bg-success ms-3 rounded-pill px-3 py-2\">\n {{ 'core.account.session.current' | translate}}\n </span>\n }\n </div>\n\n <div class=\"row text-center text-md-start gy-3\">\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{ 'core.account.session.ip' | translate }}</span>\n <span class=\"fw-medium\">{{d.ipAddress}}</span>\n </div>\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{'core.account.session.lastAccess' | translate}}</span>\n <span>{{d.lastAccess*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.applications' | translate}}</span>\n <span>{{d.clientslist }} </span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.started' | translate}}</span>\n <span>{{d.started*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.expires' | translate}}</span>\n <span>{{d.expires*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}\n"], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i1$3.InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "inputId", "extValidation", "enable-validation"] }, { kind: "component", type: i1$3.BreadcrumbComponent, selector: "rlb-breadcrumb", inputs: ["divider", "items", "cssClasses"] }, { kind: "component", type: i1$3.ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: i1$3.RlbFabComponent, selector: "rlb-fab", inputs: ["color", "size", "disabled", "outline", "position"] }, { kind: "component", type: i1$3.CardBodyComponent, selector: "rlb-card-body" }, { kind: "component", type: i1$3.CardFooterComponent, selector: "rlb-card-footer" }, { kind: "component", type: i1$3.CardHeaderComponent, selector: "rlb-card-header" }, { kind: "component", type: i1$3.CardComponent, selector: "rlb-card", inputs: ["align", "overlay", "background", "border"] }, { kind: "directive", type: i1$3.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "component", type: i1$3.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i1$3.ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1$6.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3183
3098
  }
3184
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: UserAccountComponent, decorators: [{
3099
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UserAccountComponent, decorators: [{
3185
3100
  type: Component,
3186
- args: [{ selector: 'rlb-user-account', imports: [RlbAppModule, CommonModule], template: "<div class=\"container mt-4 mb-5\">\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <h3 class=\"m-0\">{{\"Account settings\"|translate|uppercase}}</h3>\n <rlb-breadcrumb [cssClasses]=\"'p-0 px-md-1 py-md-2 m-0'\" [items]=\"[{ label: 'Home', link: '/', id: '1' },{ label: 'Account settings', id: '2' }]\" class=\"d-block\"></rlb-breadcrumb>\n </div>\n\n <!-- ACCOUNT DETAILS CARD -->\n <rlb-card class=\"mt-3\">\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h5 class=\"m-0\">{{\"Account\" | translate}}</h5>\n </rlb-card-header>\n\n <rlb-card-body class=\"px-4 py-4\">\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.username' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.username\" disabled />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.email' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.email\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.firstName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.firstName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.lastName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.lastName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n </rlb-card-body>\n\n <rlb-card-footer>\n <div class=\"d-flex align-items-center justify-content-end gap-2\">\n <button rlb-button outline (click)=\"updateProfile()\">\n <i class=\"bi bi-floppy\"></i>\n {{'common.save' | translate}}\n </button>\n <button rlb-button outline color=\"danger\" (click)=\"logout()\">\n <i class=\"bi bi-box-arrow-right\"></i>\n {{'core.account.logout' | translate}}\n </button>\n </div>\n </rlb-card-footer>\n </rlb-card>\n\n <!-- CREDENTIALS SECTION -->\n @if (keyCloakUser) {\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.credentials.title' | translate}}</h3>\n\n @for (type of keycloakCredentials; track type) {\n <rlb-card class=\"mb-4\">\n\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h6 class=\"mb-0 fw-bold\">{{ ('core.account.credentials.'+type?.type) | translate }}</h6>\n @if (type.type === 'otp') {\n <rlb-fab (click)=\"configureOTP()\" size=\"sm\" [tooltip]=\"'core.account.credentials.addOTP' | translate\">\n <i class=\"bi bi-plus-circle\"></i>\n </rlb-fab>\n }\n </rlb-card-header>\n\n <rlb-card-body>\n <rlb-list class=\"settings m-0\">\n @for (cred of type.userCredentialMetadatas; track cred.credential.id) {\n <rlb-list-item class=\"px-4 py-3\">\n <div class=\"row align-items-center w-100\">\n <div class=\"col-md-1 text-center mb-2 mb-md-0\">\n <i class=\"bi bi-key text-secondary\" style=\"font-size: 2rem;\"></i>\n </div>\n <div class=\"col-md-5 mb-2 mb-md-0\">\n <span class=\"text-muted small d-block\">{{ 'core.account.credentials.name' | translate }}</span>\n <span class=\"fw-semibold\">{{cred.credential.userLabel || cred.credential.type}}</span>\n </div>\n <div class=\"col-md-4 mb-3 mb-md-0\">\n <span class=\"text-muted small d-block\">{{'core.account.credentials.created' | translate}}</span>\n <span>{{cred.credential.createdDate | date:'dd:MM:yyyy HH:mm' }}</span>\n </div>\n <div class=\"col-md-2 text-md-end\">\n @if (type.removeable) {\n <button rlb-button class=\"w-100\" color=\"danger\" (click)=\"removeCredential(type.type, cred.credential.id)\">\n <i class=\"bi bi-trash\"></i> {{ 'core.account.credentials.delete' | translate}}\n </button>\n } @else {\n <button rlb-button class=\"w-100\" outline (click)=\"updatePassword()\">\n <i class=\"bi bi-pencil-square\"></i> {{ 'core.account.credentials.update' | translate}}\n </button>\n }\n </div>\n </div>\n </rlb-list-item>\n }\n\n @if (type.userCredentialMetadatas.length === 0) {\n <rlb-list-item>\n <div class=\"py-4 text-center text-muted\">\n {{ 'core.account.credentials.noCredentials' | translate}}\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n\n <!-- SESSION SECTION -->\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.session.title' | translate}}</h3>\n\n <rlb-card border=\"secondary\" class=\"mb-5\">\n <rlb-card-body class=\"p-0\">\n <rlb-list class=\"settings m-0\">\n @for (d of keyCloakDevices; track d.id) {\n <rlb-list-item class=\"settings-item px-4 py-4\">\n\n <!-- Session Top Row (Device Info) -->\n <div class=\"d-flex align-items-center pb-3 mb-3\">\n <i class=\"bi bi-laptop text-secondary me-3\" style=\"font-size: 2rem;\"></i>\n <h6 class=\"mb-0 fw-bold\">{{d.os}} {{d.osVersion}} - {{d.browser}}</h6>\n @if (d.current) {\n <span class=\"badge bg-success ms-3 rounded-pill px-3 py-2\">\n {{ 'core.account.session.current' | translate}}\n </span>\n }\n </div>\n\n <div class=\"row text-center text-md-start gy-3\">\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{ 'core.account.session.ip' | translate }}</span>\n <span class=\"fw-medium\">{{d.ipAddress}}</span>\n </div>\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{'core.account.session.lastAccess' | translate}}</span>\n <span>{{d.lastAccess*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.applications' | translate}}</span>\n <span>{{d.clientslist }} </span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.started' | translate}}</span>\n <span>{{d.started*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.expires' | translate}}</span>\n <span>{{d.expires*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n</div>\n", styles: [".settings .settings-item .settings-control{width:40%}\n"] }]
3187
- }], ctorParameters: () => [{ type: i1$6.Location }, { type: i1$1.Store }, { type: KeycloakProfileService }, { type: i2$1.ModalService }, { type: LanguageService }, { type: AuthenticationService }, { type: i2.Router }] });
3101
+ args: [{ selector: 'rlb-user-account', imports: [RlbAppModule, CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container mt-4 mb-5\">\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <h3 class=\"m-0\">{{\"Account settings\"|translate|uppercase}}</h3>\n <rlb-breadcrumb [cssClasses]=\"'p-0 px-md-1 py-md-2 m-0'\" [items]=\"[{ label: 'Home', link: '/', id: '1' },{ label: 'Account settings', id: '2' }]\" class=\"d-block\"></rlb-breadcrumb>\n </div>\n\n <!-- ACCOUNT DETAILS CARD -->\n <rlb-card class=\"mt-3\">\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h5 class=\"m-0\">{{\"Account\" | translate}}</h5>\n </rlb-card-header>\n\n <rlb-card-body class=\"px-4 py-4\">\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.username' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [ngModel]=\"keyCloakUser()?.username\" disabled />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.email' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.email\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.firstName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.firstName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.lastName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.lastName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n </rlb-card-body>\n\n <rlb-card-footer>\n <div class=\"d-flex align-items-center justify-content-end gap-2\">\n <button rlb-button outline (click)=\"updateProfile()\">\n <i class=\"bi bi-floppy\"></i>\n {{'common.save' | translate}}\n </button>\n <button rlb-button outline color=\"danger\" (click)=\"logout()\">\n <i class=\"bi bi-box-arrow-right\"></i>\n {{'core.account.logout' | translate}}\n </button>\n </div>\n </rlb-card-footer>\n </rlb-card>\n\n <!-- CREDENTIALS SECTION -->\n @if (keyCloakUser()) {\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.credentials.title' | translate}}</h3>\n\n @for (type of keycloakCredentials(); track type) {\n <rlb-card class=\"mb-4\">\n\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h6 class=\"mb-0 fw-bold\">{{ ('core.account.credentials.'+type?.type) | translate }}</h6>\n @if (type.type === 'otp') {\n <rlb-fab (click)=\"configureOTP()\" size=\"sm\" [tooltip]=\"'core.account.credentials.addOTP' | translate\">\n <i class=\"bi bi-plus-circle\"></i>\n </rlb-fab>\n }\n </rlb-card-header>\n\n <rlb-card-body>\n <rlb-list class=\"settings m-0\">\n @for (cred of type.userCredentialMetadatas; track cred.credential.id) {\n <rlb-list-item class=\"px-4 py-3\">\n <div class=\"row align-items-center w-100\">\n <div class=\"col-md-1 text-center mb-2 mb-md-0\">\n <i class=\"bi bi-key text-secondary\" style=\"font-size: 2rem;\"></i>\n </div>\n <div class=\"col-md-5 mb-2 mb-md-0\">\n <span class=\"text-muted small d-block\">{{ 'core.account.credentials.name' | translate }}</span>\n <span class=\"fw-semibold\">{{cred.credential.userLabel || cred.credential.type}}</span>\n </div>\n <div class=\"col-md-4 mb-3 mb-md-0\">\n <span class=\"text-muted small d-block\">{{'core.account.credentials.created' | translate}}</span>\n <span>{{cred.credential.createdDate | date:'dd:MM:yyyy HH:mm' }}</span>\n </div>\n <div class=\"col-md-2 text-md-end\">\n @if (type.removeable) {\n <button rlb-button class=\"w-100\" color=\"danger\" (click)=\"removeCredential(type.type, cred.credential.id)\">\n <i class=\"bi bi-trash\"></i> {{ 'core.account.credentials.delete' | translate}}\n </button>\n } @else {\n <button rlb-button class=\"w-100\" outline (click)=\"updatePassword()\">\n <i class=\"bi bi-pencil-square\"></i> {{ 'core.account.credentials.update' | translate}}\n </button>\n }\n </div>\n </div>\n </rlb-list-item>\n }\n\n @if (type.userCredentialMetadatas.length === 0) {\n <rlb-list-item>\n <div class=\"py-4 text-center text-muted\">\n {{ 'core.account.credentials.noCredentials' | translate}}\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n\n <!-- SESSION SECTION -->\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.session.title' | translate}}</h3>\n\n <rlb-card border=\"secondary\" class=\"mb-5\">\n <rlb-card-body class=\"p-0\">\n <rlb-list class=\"settings m-0\">\n @for (d of keyCloakDevices(); track d.id) {\n <rlb-list-item class=\"settings-item px-4 py-4\">\n\n <!-- Session Top Row (Device Info) -->\n <div class=\"d-flex align-items-center pb-3 mb-3\">\n <i class=\"bi bi-laptop text-secondary me-3\" style=\"font-size: 2rem;\"></i>\n <h6 class=\"mb-0 fw-bold\">{{d.os}} {{d.osVersion}} - {{d.browser}}</h6>\n @if (d.current) {\n <span class=\"badge bg-success ms-3 rounded-pill px-3 py-2\">\n {{ 'core.account.session.current' | translate}}\n </span>\n }\n </div>\n\n <div class=\"row text-center text-md-start gy-3\">\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{ 'core.account.session.ip' | translate }}</span>\n <span class=\"fw-medium\">{{d.ipAddress}}</span>\n </div>\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{'core.account.session.lastAccess' | translate}}</span>\n <span>{{d.lastAccess*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.applications' | translate}}</span>\n <span>{{d.clientslist }} </span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.started' | translate}}</span>\n <span>{{d.started*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.expires' | translate}}</span>\n <span>{{d.expires*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}\n"] }]
3102
+ }], ctorParameters: () => [] });
3188
3103
 
3189
3104
  class SettingsCoreComponent {
3190
- constructor(_location, toastService, languageService, store) {
3191
- this._location = _location;
3192
- this.toastService = toastService;
3193
- this.languageService = languageService;
3194
- this.store = store;
3105
+ constructor() {
3106
+ this._location = inject(Location);
3107
+ this.toastService = inject(ToastService);
3108
+ this.languageService = inject(LanguageService);
3109
+ this.store = inject(Store);
3110
+ this.languages = computed(() => {
3111
+ return this.store.selectSignal(o => o[appContextFeatureKey].supportedLanguages)()
3112
+ .map((lang) => {
3113
+ return {
3114
+ value: lang,
3115
+ label: this.languageService.getLanguageName(lang),
3116
+ };
3117
+ });
3118
+ }, ...(ngDevMode ? [{ debugName: "languages" }] : /* istanbul ignore next */ []));
3119
+ this.currentLanguage = toSignal(this.store.select(o => o[appContextFeatureKey].language), { initialValue: 'en' });
3120
+ this.darkMode = computed(() => this.store.selectSignal(o => o[appContextFeatureKey].theme)() === 'dark', ...(ngDevMode ? [{ debugName: "darkMode" }] : /* istanbul ignore next */ []));
3195
3121
  }
3196
3122
  backClicked() {
3197
3123
  this._location.back();
3198
3124
  }
3199
- get languages() {
3200
- return this.store.selectSignal(o => o[appContextFeatureKey].supportedLanguages)().map((lang) => {
3201
- return {
3202
- value: lang,
3203
- label: this.languageService.getLanguageName(lang)
3204
- };
3205
- });
3206
- }
3207
- get currentLanguage() {
3208
- return this.store.selectSignal(o => o[appContextFeatureKey].language)();
3209
- }
3210
- set currentLanguage(value) {
3125
+ setCurrentLanguage(value) {
3211
3126
  this.store.dispatch(AppContextActions.setLanguage({ language: value }));
3212
3127
  this.toastService.openToast('toast-c-1', 'toast-component', {
3213
3128
  title: this.languageService.translate('common.saved'),
@@ -3216,10 +3131,7 @@ class SettingsCoreComponent {
3216
3131
  ok: this.languageService.translate('ok'),
3217
3132
  });
3218
3133
  }
3219
- get darkMode() {
3220
- return this.store.selectSignal(o => o[appContextFeatureKey].theme)() === 'dark';
3221
- }
3222
- set darkMode(value) {
3134
+ setDarkMode(value) {
3223
3135
  this.store.dispatch(AppContextActions.setTheme({ theme: value ? 'dark' : 'light' }));
3224
3136
  this.toastService.openToast('toast-c-1', 'toast-component', {
3225
3137
  title: this.languageService.translate('common.saved'),
@@ -3228,13 +3140,13 @@ class SettingsCoreComponent {
3228
3140
  ok: this.languageService.translate('ok'),
3229
3141
  });
3230
3142
  }
3231
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SettingsCoreComponent, deps: [{ token: i1$6.Location }, { token: i2$1.ToastService }, { token: LanguageService }, { token: i1$1.Store }], target: i0.ɵɵFactoryTarget.Component }); }
3232
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: SettingsCoreComponent, isStandalone: true, selector: "rlb-settings-core", ngImport: i0, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.generalTitle' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalTheme' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [(ngModel)]=\"darkMode\" class=\"mt-2\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalLanguage' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [(ngModel)]=\"currentLanguage\">\n @for (l of languages; track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n </rlb-list>\n</div>\n", styles: [".settings .settings-item .settings-control{width:40%}.settings .settings-item .settings-control ::ng-deep rlb-switch .form-check{display:block;margin-left:auto}\n"], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i2$1.SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "component", type: i2$1.SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "inputId", "enable-validation"] }, { kind: "component", type: i2$1.OptionComponent, selector: "rlb-option", inputs: ["value", "disabled"] }, { kind: "component", type: i2$1.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i2$1.ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }] }); }
3143
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsCoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3144
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SettingsCoreComponent, isStandalone: true, selector: "rlb-settings-core", ngImport: i0, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.generalTitle' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalTheme' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [ngModel]=\"darkMode()\" (ngModelChange)=\"setDarkMode($event)\" class=\"mt-2\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalLanguage' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [ngModel]=\"currentLanguage()\" (ngModelChange)=\"setCurrentLanguage($event)\">\n @for (l of languages(); track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n </rlb-list>\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}.settings .settings-item .settings-control ::ng-deep rlb-switch .form-check{display:block;margin-left:auto}\n"], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i1$3.SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "component", type: i1$3.SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "inputId", "enable-validation"] }, { kind: "component", type: i1$3.OptionComponent, selector: "rlb-option", inputs: ["value", "disabled"] }, { kind: "component", type: i1$3.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i1$3.ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3233
3145
  }
3234
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SettingsCoreComponent, decorators: [{
3146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsCoreComponent, decorators: [{
3235
3147
  type: Component,
3236
- args: [{ selector: 'rlb-settings-core', imports: [RlbAppModule], template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.generalTitle' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalTheme' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [(ngModel)]=\"darkMode\" class=\"mt-2\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalLanguage' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [(ngModel)]=\"currentLanguage\">\n @for (l of languages; track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n </rlb-list>\n</div>\n", styles: [".settings .settings-item .settings-control{width:40%}.settings .settings-item .settings-control ::ng-deep rlb-switch .form-check{display:block;margin-left:auto}\n"] }]
3237
- }], ctorParameters: () => [{ type: i1$6.Location }, { type: i2$1.ToastService }, { type: LanguageService }, { type: i1$1.Store }] });
3148
+ args: [{ selector: 'rlb-settings-core', imports: [RlbAppModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.generalTitle' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalTheme' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [ngModel]=\"darkMode()\" (ngModelChange)=\"setDarkMode($event)\" class=\"mt-2\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalLanguage' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [ngModel]=\"currentLanguage()\" (ngModelChange)=\"setCurrentLanguage($event)\">\n @for (l of languages(); track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n </rlb-list>\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}.settings .settings-item .settings-control ::ng-deep rlb-switch .form-check{display:block;margin-left:auto}\n"] }]
3149
+ }] });
3238
3150
 
3239
3151
  class SettingsListComponent {
3240
3152
  constructor(_location, appsService, authService, pageOptions) {
@@ -3242,9 +3154,8 @@ class SettingsListComponent {
3242
3154
  this.appsService = appsService;
3243
3155
  this.authService = authService;
3244
3156
  this.pageOptions = pageOptions;
3245
- }
3246
- get apps() {
3247
- return this.appsService.apps;
3157
+ this.apps = this.appsService.apps;
3158
+ this.pages = computed(() => this.pageOptions, ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
3248
3159
  }
3249
3160
  backClicked() {
3250
3161
  this._location.back();
@@ -3252,18 +3163,15 @@ class SettingsListComponent {
3252
3163
  selectApp(app) {
3253
3164
  this.appsService.selectApp(app, 'settings');
3254
3165
  }
3255
- get pages() {
3256
- return this.pageOptions;
3257
- }
3258
3166
  get auth$() {
3259
3167
  return this.authService.isAuthenticated$;
3260
3168
  }
3261
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SettingsListComponent, deps: [{ token: i1$6.Location }, { token: AppsService }, { token: AuthenticationService }, { token: RLB_CFG_PAGES, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
3262
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: SettingsListComponent, isStandalone: true, selector: "rlb-settings-list", ngImport: i0, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list>\n <rlb-list-item-image icon=\"bi bi-gear\" [avatar-size]=\"35\" [line-1]=\" 'core.settings.generalTitle' | translate\"\n [routerLink]=\"'/settings/general'\" [line-2]=\" 'core.settings.generalDescription' | translate\">\n </rlb-list-item-image>\n @for (app of apps; track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.settings) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.settings.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(auth$ | async))\"\n [line-2]=\"app.settings.description | translate\" (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n\n @if (pages?.['status']?.path || pages?.['logger']?.path) {\n <rlb-list class=\"mt-5\">\n @if (pages?.['status']?.path) {\n <rlb-list-item-image icon=\"bi bi-check2-circle\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.status' | translate\" [routerLink]=\"'/status'\">\n </rlb-list-item-image>\n }\n @if (pages?.['logger']?.path) {\n <rlb-list-item-image icon=\"bi bi-file-text\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.logger' | translate\" [routerLink]=\"'/logger'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n\n @if (pages?.['privacy']?.path || pages?.['cookies']?.path || pages?.['terms']?.path || pages?.['support']?.path) {\n <rlb-list class=\"mt-4\"\n >\n @if (pages?.['privacy']?.path) {\n <rlb-list-item-image icon=\"bi bi-shield-check\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.privacy' | translate\" [routerLink]=\"'/privacy'\">\n </rlb-list-item-image>\n }\n @if (pages?.['cookies']?.path) {\n <rlb-list-item-image icon=\"bi bi bi-cookie\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.cookies' | translate\" [routerLink]=\"'/cookies'\">\n </rlb-list-item-image>\n }\n @if (pages?.['terms']?.path) {\n <rlb-list-item-image icon=\"bi bi-vector-pen\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.legal' | translate\" [routerLink]=\"'/terms'\">\n </rlb-list-item-image>\n }\n @if (pages?.['support']?.path) {\n <rlb-list-item-image icon=\"bi bi-chat-quote\" [avatar-size]=\"18\"\n [line-1]=\" 'core.settings.support' | translate\" [routerLink]=\"'/support'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n</div>\n", styles: [".settings .settings-item .settings-control{width:40%}\n"], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i2$1.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i2$1.ListItemImageComponent, selector: "rlb-list-item-image", inputs: ["active", "disabled", "counter-empty", "counter-pill", "counter-border", "avatar-size", "username", "line-1", "line-2", "avatar", "counter", "counter-color", "icon"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }] }); }
3169
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsListComponent, deps: [{ token: i1$6.Location }, { token: AppsService }, { token: AuthenticationService }, { token: RLB_CFG_PAGES, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
3170
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SettingsListComponent, isStandalone: true, selector: "rlb-settings-list", ngImport: i0, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list>\n <rlb-list-item-image icon=\"bi bi-gear\" [avatar-size]=\"35\" [line-1]=\" 'core.settings.generalTitle' | translate\"\n [routerLink]=\"'/settings/general'\" [line-2]=\" 'core.settings.generalDescription' | translate\">\n </rlb-list-item-image>\n @for (app of apps(); track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.settings) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.settings.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(auth$ | async))\"\n [line-2]=\"app.settings.description | translate\" (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n\n @if (pages()?.['status']?.path || pages()?.['logger']?.path) {\n <rlb-list class=\"mt-5\">\n @if (pages()?.['status']?.path) {\n <rlb-list-item-image icon=\"bi bi-check2-circle\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.status' | translate\" [routerLink]=\"'/status'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['logger']?.path) {\n <rlb-list-item-image icon=\"bi bi-file-text\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.logger' | translate\" [routerLink]=\"'/logger'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n\n @if (pages()?.['privacy']?.path || pages()?.['cookies']?.path || pages()?.['terms']?.path || pages()?.['support']?.path) {\n <rlb-list class=\"mt-4\"\n >\n @if (pages()?.['privacy']?.path) {\n <rlb-list-item-image icon=\"bi bi-shield-check\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.privacy' | translate\" [routerLink]=\"'/privacy'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['cookies']?.path) {\n <rlb-list-item-image icon=\"bi bi bi-cookie\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.cookies' | translate\" [routerLink]=\"'/cookies'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['terms']?.path) {\n <rlb-list-item-image icon=\"bi bi-vector-pen\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.legal' | translate\" [routerLink]=\"'/terms'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['support']?.path) {\n <rlb-list-item-image icon=\"bi bi-chat-quote\" [avatar-size]=\"18\"\n [line-1]=\" 'core.settings.support' | translate\" [routerLink]=\"'/support'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}\n"], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i1$3.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i1$3.ListItemImageComponent, selector: "rlb-list-item-image", inputs: ["active", "disabled", "counter-empty", "counter-pill", "counter-border", "avatar-size", "username", "line-1", "line-2", "avatar", "counter", "counter-color", "icon"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3263
3171
  }
3264
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SettingsListComponent, decorators: [{
3172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsListComponent, decorators: [{
3265
3173
  type: Component,
3266
- args: [{ selector: 'rlb-settings-list', imports: [RlbAppModule, CommonModule], template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list>\n <rlb-list-item-image icon=\"bi bi-gear\" [avatar-size]=\"35\" [line-1]=\" 'core.settings.generalTitle' | translate\"\n [routerLink]=\"'/settings/general'\" [line-2]=\" 'core.settings.generalDescription' | translate\">\n </rlb-list-item-image>\n @for (app of apps; track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.settings) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.settings.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(auth$ | async))\"\n [line-2]=\"app.settings.description | translate\" (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n\n @if (pages?.['status']?.path || pages?.['logger']?.path) {\n <rlb-list class=\"mt-5\">\n @if (pages?.['status']?.path) {\n <rlb-list-item-image icon=\"bi bi-check2-circle\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.status' | translate\" [routerLink]=\"'/status'\">\n </rlb-list-item-image>\n }\n @if (pages?.['logger']?.path) {\n <rlb-list-item-image icon=\"bi bi-file-text\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.logger' | translate\" [routerLink]=\"'/logger'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n\n @if (pages?.['privacy']?.path || pages?.['cookies']?.path || pages?.['terms']?.path || pages?.['support']?.path) {\n <rlb-list class=\"mt-4\"\n >\n @if (pages?.['privacy']?.path) {\n <rlb-list-item-image icon=\"bi bi-shield-check\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.privacy' | translate\" [routerLink]=\"'/privacy'\">\n </rlb-list-item-image>\n }\n @if (pages?.['cookies']?.path) {\n <rlb-list-item-image icon=\"bi bi bi-cookie\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.cookies' | translate\" [routerLink]=\"'/cookies'\">\n </rlb-list-item-image>\n }\n @if (pages?.['terms']?.path) {\n <rlb-list-item-image icon=\"bi bi-vector-pen\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.legal' | translate\" [routerLink]=\"'/terms'\">\n </rlb-list-item-image>\n }\n @if (pages?.['support']?.path) {\n <rlb-list-item-image icon=\"bi bi-chat-quote\" [avatar-size]=\"18\"\n [line-1]=\" 'core.settings.support' | translate\" [routerLink]=\"'/support'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n</div>\n", styles: [".settings .settings-item .settings-control{width:40%}\n"] }]
3174
+ args: [{ selector: 'rlb-settings-list', imports: [RlbAppModule, CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list>\n <rlb-list-item-image icon=\"bi bi-gear\" [avatar-size]=\"35\" [line-1]=\" 'core.settings.generalTitle' | translate\"\n [routerLink]=\"'/settings/general'\" [line-2]=\" 'core.settings.generalDescription' | translate\">\n </rlb-list-item-image>\n @for (app of apps(); track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.settings) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.settings.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(auth$ | async))\"\n [line-2]=\"app.settings.description | translate\" (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n\n @if (pages()?.['status']?.path || pages()?.['logger']?.path) {\n <rlb-list class=\"mt-5\">\n @if (pages()?.['status']?.path) {\n <rlb-list-item-image icon=\"bi bi-check2-circle\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.status' | translate\" [routerLink]=\"'/status'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['logger']?.path) {\n <rlb-list-item-image icon=\"bi bi-file-text\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.logger' | translate\" [routerLink]=\"'/logger'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n\n @if (pages()?.['privacy']?.path || pages()?.['cookies']?.path || pages()?.['terms']?.path || pages()?.['support']?.path) {\n <rlb-list class=\"mt-4\"\n >\n @if (pages()?.['privacy']?.path) {\n <rlb-list-item-image icon=\"bi bi-shield-check\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.privacy' | translate\" [routerLink]=\"'/privacy'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['cookies']?.path) {\n <rlb-list-item-image icon=\"bi bi bi-cookie\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.cookies' | translate\" [routerLink]=\"'/cookies'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['terms']?.path) {\n <rlb-list-item-image icon=\"bi bi-vector-pen\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.legal' | translate\" [routerLink]=\"'/terms'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['support']?.path) {\n <rlb-list-item-image icon=\"bi bi-chat-quote\" [avatar-size]=\"18\"\n [line-1]=\" 'core.settings.support' | translate\" [routerLink]=\"'/support'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}\n"] }]
3267
3175
  }], ctorParameters: () => [{ type: i1$6.Location }, { type: AppsService }, { type: AuthenticationService }, { type: undefined, decorators: [{
3268
3176
  type: Inject,
3269
3177
  args: [RLB_CFG_PAGES]
@@ -3318,7 +3226,7 @@ class AppContextEffects {
3318
3226
  this.loggerService = loggerService;
3319
3227
  this.apps = apps;
3320
3228
  this.setLanguage$ = createEffect(() => {
3321
- return this.actions$.pipe(ofType(AppContextActions.setLanguage), tap$1(({ language }) => this.languageService.language = language), tap$1(({ language }) => {
3229
+ return this.actions$.pipe(ofType(AppContextActions.setLanguage), tap$1(({ language }) => this.languageService.setLanguage(language)), tap$1(({ language }) => {
3322
3230
  this.renderer.setAttribute(document.documentElement, 'lang', language);
3323
3231
  }), tap$1(({ language }) => { this.storage.writeLocal('locale', language); }), map$1(({ language }) => AppContextActionsInternal.setLanguage({ language })));
3324
3232
  });
@@ -3352,12 +3260,12 @@ class AppContextEffects {
3352
3260
  }
3353
3261
  }
3354
3262
  }
3355
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppContextEffects, deps: [{ token: i1$8.Actions }, { token: LanguageService }, { token: i0.RendererFactory2 }, { token: AppStorageService }, { token: i1$1.Store }, { token: i2.Router }, { token: AppLoggerService }, { token: RLB_APPS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
3356
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppContextEffects }); }
3263
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContextEffects, deps: [{ token: i1$8.Actions }, { token: LanguageService }, { token: i0.RendererFactory2 }, { token: AppStorageService }, { token: i1$1.Store }, { token: i5.Router }, { token: AppLoggerService }, { token: RLB_APPS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
3264
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContextEffects }); }
3357
3265
  }
3358
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppContextEffects, decorators: [{
3266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContextEffects, decorators: [{
3359
3267
  type: Injectable
3360
- }], ctorParameters: () => [{ type: i1$8.Actions }, { type: LanguageService }, { type: i0.RendererFactory2 }, { type: AppStorageService }, { type: i1$1.Store }, { type: i2.Router }, { type: AppLoggerService }, { type: undefined, decorators: [{
3268
+ }], ctorParameters: () => [{ type: i1$8.Actions }, { type: LanguageService }, { type: i0.RendererFactory2 }, { type: AppStorageService }, { type: i1$1.Store }, { type: i5.Router }, { type: AppLoggerService }, { type: undefined, decorators: [{
3361
3269
  type: Inject,
3362
3270
  args: [RLB_APPS]
3363
3271
  }, {
@@ -3407,10 +3315,10 @@ class AuthEffects {
3407
3315
  this.logger = this.loggerService.for(this.constructor.name);
3408
3316
  this.logger.log(`Initialized AuthEffects}`);
3409
3317
  }
3410
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AuthEffects, deps: [{ token: i1$8.Actions }, { token: AuthenticationService }, { token: AppLoggerService }, { token: RLB_CFG_AUTH, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
3411
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AuthEffects }); }
3318
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthEffects, deps: [{ token: i1$8.Actions }, { token: AuthenticationService }, { token: AppLoggerService }, { token: RLB_CFG_AUTH, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
3319
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthEffects }); }
3412
3320
  }
3413
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AuthEffects, decorators: [{
3321
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthEffects, decorators: [{
3414
3322
  type: Injectable
3415
3323
  }], ctorParameters: () => [{ type: i1$8.Actions }, { type: AuthenticationService }, { type: AppLoggerService }, { type: undefined, decorators: [{
3416
3324
  type: Inject,
@@ -3465,8 +3373,8 @@ class ToastComponent {
3465
3373
  this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
3466
3374
  this.valid = true;
3467
3375
  }
3468
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3469
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: ToastComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, hostDirectives: [{ directive: i2$1.ToastDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
3376
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3377
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ToastComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, hostDirectives: [{ directive: i1$3.ToastDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
3470
3378
  <div class="toast-header">
3471
3379
  <strong class="me-auto">
3472
3380
  <svg
@@ -3497,12 +3405,13 @@ class ToastComponent {
3497
3405
  ></button>
3498
3406
  </div>
3499
3407
  <div class="toast-body">{{ data().content }}</div>
3500
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbAppModule }] }); }
3408
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbAppModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3501
3409
  }
3502
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ToastComponent, decorators: [{
3410
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToastComponent, decorators: [{
3503
3411
  type: Component,
3504
3412
  args: [{
3505
3413
  imports: [RlbAppModule],
3414
+ changeDetection: ChangeDetectionStrategy.OnPush,
3506
3415
  template: `
3507
3416
  <div class="toast-header">
3508
3417
  <strong class="me-auto">