@open-rlb/ng-app 3.1.85 → 3.1.86

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,76 @@ 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: "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
+ ], 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
2204
  }], 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
2205
 
2075
- class AppDropdownSelectorComponent {
2206
+ class LeftComponentPipe {
2076
2207
  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);
2208
+ this.config = inject(RLB_APP_NAVCOMP);
2085
2209
  }
2086
- isAppSelected(appId) {
2087
- if (appId) {
2088
- return this.appsService.isAppSelected(appId);
2210
+ transform(value) {
2211
+ const t = this.config.left.find(c => c.name === value)?.component;
2212
+ if (!t) {
2213
+ throw new Error(`No component found for name ${value}`);
2089
2214
  }
2090
- else {
2091
- console.error('AppId is not defined');
2092
- return false;
2215
+ return t;
2216
+ }
2217
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LeftComponentPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2218
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: LeftComponentPipe, isStandalone: true, name: "leftComponent" }); }
2219
+ }
2220
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LeftComponentPipe, decorators: [{
2221
+ type: Pipe,
2222
+ args: [{
2223
+ name: 'leftComponent'
2224
+ }]
2225
+ }] });
2226
+
2227
+ class RightComponentPipe {
2228
+ constructor() {
2229
+ this.config = inject(RLB_APP_NAVCOMP);
2230
+ }
2231
+ transform(value) {
2232
+ const t = this.config.right.find(c => c.name === value)?.component;
2233
+ if (!t) {
2234
+ throw new Error(`No component found for name ${value}`);
2093
2235
  }
2236
+ return t;
2094
2237
  }
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" }] }); }
2238
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RightComponentPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2239
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: RightComponentPipe, isStandalone: true, name: "rightComponent" }); }
2097
2240
  }
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"] }] } });
2241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RightComponentPipe, decorators: [{
2242
+ type: Pipe,
2243
+ args: [{
2244
+ name: 'rightComponent'
2245
+ }]
2246
+ }] });
2102
2247
 
2103
2248
  class RlbRole {
2104
2249
  constructor() {
@@ -2117,155 +2262,88 @@ class RlbRole {
2117
2262
  }
2118
2263
  });
2119
2264
  }
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 }); }
2265
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbRole, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2266
+ 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
2267
  }
2123
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbRole, decorators: [{
2268
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbRole, decorators: [{
2124
2269
  type: Directive,
2125
2270
  args: [{
2126
- selector: '[roles]',
2127
- standalone: false,
2271
+ selector: '[roles]'
2128
2272
  }]
2129
2273
  }], ctorParameters: () => [], propDecorators: { action: [{ type: i0.Input, args: [{ isSignal: true, alias: "roles", required: false }] }] } });
2130
2274
 
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;
2275
+ class AppDropdownSelectorComponent {
2276
+ constructor() {
2277
+ this.mode = input('desktop', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
2278
+ this.apps = input.required(...(ngDevMode ? [{ debugName: "apps" }] : /* istanbul ignore next */ []));
2279
+ this.isAuthenticated = input.required(...(ngDevMode ? [{ debugName: "isAuthenticated" }] : /* istanbul ignore next */ []));
2280
+ this.appSelected = output();
2281
+ this.appsService = inject(AppsService);
2282
+ this.currentAppId = computed(() => this.appsService.currentApp()?.id, ...(ngDevMode ? [{ debugName: "currentAppId" }] : /* istanbul ignore next */ []));
2141
2283
  }
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;
2284
+ selectApp(app) {
2285
+ this.appSelected.emit(app);
2159
2286
  }
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;
2287
+ isAppSelected(appId) {
2288
+ return this.currentAppId() === appId;
2166
2289
  }
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" }); }
2290
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppDropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2291
+ 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
2292
  }
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
- }] }] });
2293
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppDropdownSelectorComponent, decorators: [{
2294
+ type: Component,
2295
+ args: [{ selector: 'rlb-app-dropdown-selector', imports: [
2296
+ NavbarDropdownItemComponent,
2297
+ DropdownContainerComponent,
2298
+ ButtonComponent,
2299
+ TooltipDirective,
2300
+ NgClass,
2301
+ NgTemplateOutlet,
2302
+ TranslateModule,
2303
+ ], 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" }]
2304
+ }], 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
2305
 
2181
2306
  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;
2307
+ constructor() {
2308
+ this.Array = Array;
2188
2309
  this.navSearchText = null;
2189
- this.navbarItems = [];
2190
- this.sidebarItems = [];
2191
- this.sidebarFooterItems = [];
2310
+ this.modalContainerId = input.required({ ...(ngDevMode ? { debugName: "modalContainerId" } : /* istanbul ignore next */ {}), alias: 'modal-container-id' });
2311
+ this.breadcrumbInput = input(undefined, { ...(ngDevMode ? { debugName: "breadcrumbInput" } : /* istanbul ignore next */ {}), alias: 'breadcrumb' });
2312
+ this.breadcrumb = computed(() => this.breadcrumbInput() ?? [], ...(ngDevMode ? [{ debugName: "breadcrumb" }] : /* istanbul ignore next */ []));
2313
+ this.toastContainerIds = input.required({ ...(ngDevMode ? { debugName: "toastContainerIds" } : /* istanbul ignore next */ {}), alias: 'toast-container-ids' });
2192
2314
  this.mobileOffcanvas = viewChild('mobileOffcanvas', ...(ngDevMode ? [{ debugName: "mobileOffcanvas" }] : /* istanbul ignore next */ []));
2193
2315
  this.mobileSettingsMenu = viewChild('mobileSettingsMenu', ...(ngDevMode ? [{ debugName: "mobileSettingsMenu" }] : /* istanbul ignore next */ []));
2194
- this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => {
2316
+ this.env = inject(RLB_CFG_ENV);
2317
+ this.store = inject((Store));
2318
+ this.appsService = inject(AppsService);
2319
+ this.authService = inject(AuthenticationService);
2320
+ this.router = inject(Router);
2321
+ this.sidebarVisible = this.store.selectSignal((state) => state[sidebarsFeatureKey].visible);
2322
+ this.sidearHasLogin = this.store.selectSignal((state) => state[sidebarsFeatureKey].loginVisible);
2323
+ this.sidearHasSearch = this.store.selectSignal((state) => state[sidebarsFeatureKey].searchVisible);
2324
+ this.sidebarItems = this.store.selectSignal((state) => state[sidebarsFeatureKey].items);
2325
+ this.sidearHasSettings = this.store.selectSignal((state) => state[sidebarsFeatureKey].settingsVisible);
2326
+ this.sidearAppsVisible = this.store.selectSignal((state) => state[sidebarsFeatureKey].appsVisible);
2327
+ this.navVisible = this.store.selectSignal((state) => state[navbarsFeatureKey].visible);
2328
+ this.navSearchVisible = this.store.selectSignal((state) => state[navbarsFeatureKey].searchVisible);
2329
+ this.navHeader = this.store.selectSignal((state) => state[navbarsFeatureKey].header);
2330
+ this.navLeftItems = this.store.selectSignal((state) => state[navbarsFeatureKey].leftItems);
2331
+ this.navRightItems = this.store.selectSignal((state) => state[navbarsFeatureKey].rightItems);
2332
+ this.navbarHasLogin = this.store.selectSignal((state) => state[navbarsFeatureKey].loginVisible);
2333
+ this.navbarHasSettings = this.store.selectSignal((state) => state[navbarsFeatureKey].settingsVisible);
2334
+ this.navbarHasApps = this.store.selectSignal(state => state[navbarsFeatureKey].appsVisible);
2335
+ this.navbarLayout = this.store.selectSignal(state => state[navbarsFeatureKey].actionsLayout);
2336
+ this.separatorVisible = this.store.selectSignal(state => state[navbarsFeatureKey].separatorVisible);
2337
+ this.isAuthenticated = toSignal(this.authService.isAuthenticated$, { initialValue: false });
2338
+ this.userInfo = toSignal(this.authService.userInfo$, { initialValue: null });
2339
+ this.theme = this.store.selectSignal(state => state[appContextFeatureKey].theme);
2340
+ this.apps = computed(() => this.appsService.apps().filter((app) => app.enabled && app.id), ...(ngDevMode ? [{ debugName: "apps" }] : /* istanbul ignore next */ []));
2341
+ this.router.events
2342
+ .pipe(filter((event) => event instanceof NavigationEnd), takeUntilDestroyed())
2343
+ .subscribe(() => {
2195
2344
  this.closeMobileMenu();
2196
2345
  });
2197
2346
  }
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
2347
  loginNav(event) {
2270
2348
  event?.preventDefault();
2271
2349
  event?.stopPropagation();
@@ -2285,83 +2363,86 @@ class AppTemplateComponent {
2285
2363
  this.mobileSettingsMenu()?.goToFirstSlide();
2286
2364
  }
2287
2365
  }
2366
+ setSidearSearchText(text) {
2367
+ this.store.dispatch(SidebarActions.setSearchText({ text }));
2368
+ }
2369
+ setNavbarSearchText(text) {
2370
+ this.store.dispatch(NavbarActions.setSearchText({ text }));
2371
+ }
2288
2372
  closeMobileMenu() {
2289
2373
  this.mobileOffcanvas()?.close();
2290
2374
  }
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" }] }); }
2375
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2376
+ 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
2377
  }
2294
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppTemplateComponent, decorators: [{
2378
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppTemplateComponent, decorators: [{
2295
2379
  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 }] }] } });
2380
+ args: [{ selector: 'rlb-app-template', imports: [
2381
+ CommonModule,
2382
+ FormsModule,
2383
+ RouterModule,
2384
+ TranslateModule,
2385
+ NgComponentOutlet,
2386
+ NavbarComponent,
2387
+ NavbarBrandDirective,
2388
+ NavbarFormComponent,
2389
+ NavbarItemsComponent,
2390
+ NavbarItemComponent,
2391
+ NavbarSeparatorComponent,
2392
+ SidebarComponent,
2393
+ SidebarItemComponent,
2394
+ OffcanvasComponent,
2395
+ OffcanvasHeaderComponent,
2396
+ OffcanvasBodyComponent,
2397
+ RlbFabComponent,
2398
+ InputGroupComponent,
2399
+ InputComponent,
2400
+ TooltipDirective,
2401
+ LeftComponentPipe,
2402
+ RightComponentPipe,
2403
+ RlbRole,
2404
+ AppDropdownSelectorComponent,
2405
+ SettingsDropdownSelectorComponent,
2406
+ ButtonComponent,
2407
+ ToggleDirective,
2408
+ ], 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"] }]
2409
+ }], 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
2410
 
2308
2411
  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: [{
2412
+ constructor() {
2413
+ this.breakpointObserver = inject(BreakpointObserver);
2414
+ this.platformId = inject(PLATFORM_ID);
2415
+ this.breadcrumbInput = input(undefined, { ...(ngDevMode ? { debugName: "breadcrumbInput" } : /* istanbul ignore next */ {}), alias: 'breadcrumb' });
2416
+ this.breadcrumb = computed(() => this.breadcrumbInput() ?? [], ...(ngDevMode ? [{ debugName: "breadcrumb" }] : /* istanbul ignore next */ []));
2417
+ this.title = input.required(...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
2418
+ this.subtitle = input(...(ngDevMode ? [undefined, { debugName: "subtitle" }] : /* istanbul ignore next */ []));
2419
+ this.isHandset = toSignal(isPlatformServer(this.platformId)
2420
+ ? of(true)
2421
+ : this.breakpointObserver.observe(Breakpoints.Handset).pipe(map(result => result.matches)), { initialValue: true });
2422
+ }
2423
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2424
+ 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 }); }
2425
+ }
2426
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BaseComponent, decorators: [{
2327
2427
  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
- }] } });
2428
+ 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" }]
2429
+ }], 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
2430
 
2340
2431
  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
- }
2432
+ constructor() {
2433
+ this.breakpointObserver = inject(BreakpointObserver);
2434
+ this.platformId = inject(PLATFORM_ID);
2435
+ this.isHandset = toSignal(isPlatformServer(this.platformId)
2436
+ ? of(true)
2437
+ : this.breakpointObserver.observe(Breakpoints.Handset).pipe(map(result => result.matches)), { initialValue: true });
2353
2438
  }
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" }] }); }
2439
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2440
+ 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
2441
  }
2358
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ContentComponent, decorators: [{
2442
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContentComponent, decorators: [{
2359
2443
  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
- }] }] });
2444
+ 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>" }]
2445
+ }] });
2365
2446
 
2366
2447
  class TruncatePipe {
2367
2448
  transform(value, limit = 25, completeWords = false, ellipsis = '...') {
@@ -2372,14 +2453,13 @@ class TruncatePipe {
2372
2453
  }
2373
2454
  return value.length > limit ? value.slice(0, limit) + ellipsis : value;
2374
2455
  }
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" }); }
2456
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TruncatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2457
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: TruncatePipe, isStandalone: true, name: "truncate" }); }
2377
2458
  }
2378
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: TruncatePipe, decorators: [{
2459
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TruncatePipe, decorators: [{
2379
2460
  type: Pipe,
2380
2461
  args: [{
2381
- name: 'truncate',
2382
- standalone: false
2462
+ name: 'truncate'
2383
2463
  }]
2384
2464
  }] });
2385
2465
 
@@ -2404,34 +2484,36 @@ class AutolinkPipe {
2404
2484
  return '' + space + link;
2405
2485
  });
2406
2486
  }
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" }); }
2487
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AutolinkPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
2488
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AutolinkPipe, isStandalone: true, name: "autolink" }); }
2409
2489
  }
2410
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AutolinkPipe, decorators: [{
2490
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AutolinkPipe, decorators: [{
2411
2491
  type: Pipe,
2412
2492
  args: [{
2413
- name: 'autolink',
2414
- standalone: false
2493
+ name: 'autolink'
2415
2494
  }]
2416
2495
  }] });
2417
2496
 
2418
2497
  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;
2498
+ constructor() {
2499
+ this.Array = Array;
2427
2500
  this.templateSubject = new BehaviorSubject('app');
2501
+ this.modalContainerId = input.required({ ...(ngDevMode ? { debugName: "modalContainerId" } : /* istanbul ignore next */ {}), alias: 'modal-container-id' });
2502
+ this.toastContainerIds = input.required({ ...(ngDevMode ? { debugName: "toastContainerIds" } : /* istanbul ignore next */ {}), alias: 'toast-container-ids' });
2503
+ this.env = inject(RLB_CFG_ENV);
2504
+ this.store = inject((Store));
2505
+ this.router = inject(Router);
2506
+ this.storage = inject(AppStorageService);
2507
+ this.pwaUpdaterService = inject(PwaUpdaterService);
2508
+ this.appsService = inject(AppsService);
2509
+ this.loggerService = inject(AppLoggerService);
2428
2510
  this.logger = this.loggerService.for(this.constructor.name);
2429
2511
  const theme = (this.storage.readLocal('theme') || 'dark');
2430
2512
  this.store.dispatch(AppContextActions.setTheme({ theme }));
2431
2513
  this.store.dispatch(AppContextActions.setLanguage({ language: this.storage.readLocal('locale') || 'en' }));
2432
2514
  this.store
2433
2515
  .select((state) => state[appContextFeatureKey].currentApp)
2434
- .pipe(distinctUntilChanged())
2516
+ .pipe(distinctUntilChanged(), takeUntilDestroyed())
2435
2517
  .subscribe(async (currentApp) => {
2436
2518
  this.logger.info('currentApp:', currentApp);
2437
2519
  if (!currentApp)
@@ -2457,39 +2539,25 @@ class AppContainerComponent {
2457
2539
  }
2458
2540
  });
2459
2541
  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();
2542
+ .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();
2543
+ if (this.env.pwaUpdateEnabled) {
2544
+ this.pwaUpdaterService.checkWithDialog().pipe(takeUntilDestroyed()).subscribe();
2545
+ }
2461
2546
  }
2462
2547
  get template$() {
2463
2548
  return this.templateSubject.asObservable();
2464
2549
  }
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" }] }); }
2550
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2551
+ 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
2552
  }
2476
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppContainerComponent, decorators: [{
2553
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContainerComponent, decorators: [{
2477
2554
  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
- }] } });
2555
+ 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}" }]
2556
+ }], 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
2557
 
2490
2558
  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);">
2559
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ForbiddenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2560
+ 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
2561
  <div class="align-center">
2494
2562
  <div class="text-center">
2495
2563
  <h1 class="text-primary">
@@ -2502,13 +2570,13 @@ class ForbiddenComponent {
2502
2570
  </div>
2503
2571
  </div>
2504
2572
  </div>
2505
- `, isInline: true, dependencies: [{ kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }] }); }
2573
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2506
2574
  }
2507
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ForbiddenComponent, decorators: [{
2575
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ForbiddenComponent, decorators: [{
2508
2576
  type: Component,
2509
2577
  args: [{
2510
2578
  selector: 'rlb-forbidden',
2511
- standalone: false,
2579
+ imports: [TranslateModule],
2512
2580
  template: `<div class="container" style="height:calc(100vh - 58px);">
2513
2581
  <div class="align-center">
2514
2582
  <div class="text-center">
@@ -2522,14 +2590,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
2522
2590
  </div>
2523
2591
  </div>
2524
2592
  </div>
2525
- `
2593
+ `,
2594
+ changeDetection: ChangeDetectionStrategy.OnPush,
2526
2595
  }]
2527
2596
  }] });
2528
2597
 
2529
2598
  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
2599
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2600
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, imports: [CommonModule,
2601
+ FormsModule,
2602
+ ReactiveFormsModule,
2603
+ TranslateModule,
2604
+ RlbBootstrapModule,
2605
+ RouterModule,
2606
+ // standalone
2533
2607
  CmsContentComponent,
2534
2608
  CookiesComponent,
2535
2609
  NotFoundComponent,
@@ -2537,7 +2611,6 @@ class RlbAppModule {
2537
2611
  SupportComponent,
2538
2612
  TermsAndConditionsComponent,
2539
2613
  ForbiddenComponent,
2540
- // pipes
2541
2614
  CmsPipe,
2542
2615
  AsMultiPipe,
2543
2616
  AsSinglePipe,
@@ -2545,7 +2618,6 @@ class RlbAppModule {
2545
2618
  RightComponentPipe,
2546
2619
  TruncatePipe,
2547
2620
  AutolinkPipe,
2548
- // templates
2549
2621
  BaseComponent,
2550
2622
  CmsComponent,
2551
2623
  ContentComponent,
@@ -2553,13 +2625,7 @@ class RlbAppModule {
2553
2625
  AppContainerComponent,
2554
2626
  SettingsDropdownSelectorComponent,
2555
2627
  AppDropdownSelectorComponent,
2556
- // directives
2557
- RlbRole], imports: [CommonModule,
2558
- FormsModule,
2559
- ReactiveFormsModule,
2560
- TranslateModule,
2561
- RlbBootstrapModule,
2562
- RouterModule], exports: [
2628
+ RlbRole], exports: [
2563
2629
  // pipes
2564
2630
  CmsPipe,
2565
2631
  AsMultiPipe,
@@ -2581,49 +2647,36 @@ class RlbAppModule {
2581
2647
  FormsModule,
2582
2648
  // directives
2583
2649
  RlbRole] }); }
2584
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbAppModule, imports: [CommonModule,
2650
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, imports: [CommonModule,
2585
2651
  FormsModule,
2586
2652
  ReactiveFormsModule,
2587
2653
  TranslateModule,
2588
2654
  RlbBootstrapModule,
2589
- RouterModule,
2655
+ RouterModule,
2656
+ // standalone
2657
+ CmsContentComponent,
2658
+ CookiesComponent,
2659
+ NotFoundComponent,
2660
+ PrivacyComponent,
2661
+ SupportComponent,
2662
+ TermsAndConditionsComponent,
2663
+ ForbiddenComponent,
2664
+ BaseComponent,
2665
+ CmsComponent,
2666
+ AppTemplateComponent,
2667
+ AppContainerComponent,
2668
+ SettingsDropdownSelectorComponent,
2669
+ AppDropdownSelectorComponent,
2590
2670
  // modules
2591
2671
  TranslateModule,
2592
2672
  RlbBootstrapModule,
2593
2673
  RouterModule,
2594
2674
  FormsModule] }); }
2595
2675
  }
2596
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: RlbAppModule, decorators: [{
2676
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, decorators: [{
2597
2677
  type: NgModule,
2598
2678
  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
- ],
2679
+ declarations: [],
2627
2680
  exports: [
2628
2681
  // pipes
2629
2682
  CmsPipe,
@@ -2654,177 +2707,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
2654
2707
  TranslateModule,
2655
2708
  RlbBootstrapModule,
2656
2709
  RouterModule,
2710
+ // standalone
2711
+ CmsContentComponent,
2712
+ CookiesComponent,
2713
+ NotFoundComponent,
2714
+ PrivacyComponent,
2715
+ SupportComponent,
2716
+ TermsAndConditionsComponent,
2717
+ ForbiddenComponent,
2718
+ CmsPipe,
2719
+ AsMultiPipe,
2720
+ AsSinglePipe,
2721
+ LeftComponentPipe,
2722
+ RightComponentPipe,
2723
+ TruncatePipe,
2724
+ AutolinkPipe,
2725
+ BaseComponent,
2726
+ CmsComponent,
2727
+ ContentComponent,
2728
+ AppTemplateComponent,
2729
+ AppContainerComponent,
2730
+ SettingsDropdownSelectorComponent,
2731
+ AppDropdownSelectorComponent,
2732
+ RlbRole,
2657
2733
  ],
2658
2734
  }]
2659
2735
  }] });
2660
2736
 
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
2737
  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;
2738
+ constructor() {
2739
+ this._location = inject(Location);
2740
+ this.appsService = inject(AppsService);
2741
+ this.authService = inject(AuthenticationService);
2742
+ this.apps = this.appsService.apps;
2743
+ this.auth$ = this.authService.isAuthenticated$;
2828
2744
  }
2829
2745
  backClicked() {
2830
2746
  this._location.back();
@@ -2832,16 +2748,13 @@ class AppSelectorComponent {
2832
2748
  selectApp(app) {
2833
2749
  this.appsService.selectApp(app, 'app');
2834
2750
  }
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" }] }); }
2751
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2752
+ 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
2753
  }
2841
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppSelectorComponent, decorators: [{
2754
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppSelectorComponent, decorators: [{
2842
2755
  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 }] });
2756
+ 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" }]
2757
+ }] });
2845
2758
 
2846
2759
  const oauthGuard = (route, state) => {
2847
2760
  const authService = inject(AuthenticationService);
@@ -3021,10 +2934,10 @@ class OauthPasswordService {
3021
2934
  }, r.expires_in * 1000 - 60000);
3022
2935
  }
3023
2936
  }
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' }); }
2937
+ 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 }); }
2938
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OauthPasswordService, providedIn: 'root' }); }
3026
2939
  }
3027
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: OauthPasswordService, decorators: [{
2940
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OauthPasswordService, decorators: [{
3028
2941
  type: Injectable,
3029
2942
  args: [{
3030
2943
  providedIn: 'root'
@@ -3111,10 +3024,10 @@ class KeycloakProfileService {
3111
3024
  }
3112
3025
  });
3113
3026
  }
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' }); }
3027
+ 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 }); }
3028
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: KeycloakProfileService, providedIn: 'root' }); }
3116
3029
  }
3117
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: KeycloakProfileService, decorators: [{
3030
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: KeycloakProfileService, decorators: [{
3118
3031
  type: Injectable,
3119
3032
  args: [{
3120
3033
  providedIn: 'root',
@@ -3122,35 +3035,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
3122
3035
  }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: AuthenticationService }, { type: ErrorManagementService }, { type: i1$5.OidcSecurityService }] });
3123
3036
 
3124
3037
  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();
3038
+ constructor() {
3039
+ this._location = inject(Location);
3040
+ this.store = inject((Store));
3041
+ this.keycloakProfileService = inject(KeycloakProfileService);
3042
+ this.modalService = inject(ModalService);
3043
+ this.languageService = inject(LanguageService);
3044
+ this.authService = inject(AuthenticationService);
3045
+ this.router = inject(Router);
3046
+ this.keyCloakUser = signal(undefined, ...(ngDevMode ? [{ debugName: "keyCloakUser" }] : /* istanbul ignore next */ []));
3047
+ this.keyCloakDevices = toSignal(this.keycloakProfileService.getDevices());
3048
+ this.keycloakCredentials = signal([], ...(ngDevMode ? [{ debugName: "keycloakCredentials" }] : /* istanbul ignore next */ []));
3049
+ this.authService.isAuthenticated$.pipe(takeUntilDestroyed(), filter(isAuth => !isAuth), switchMap(() => this.router.navigate(['/']))).subscribe();
3135
3050
  }
3136
3051
  backClicked() {
3137
3052
  this._location.back();
3138
3053
  }
3139
3054
  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
- }
3055
+ this.keycloakProfileService.getUserProfile()
3056
+ .pipe(takeUntilDestroyed())
3057
+ .subscribe((user) => this.keyCloakUser.set(user));
3058
+ this.keycloakProfileService.getCredentials()
3059
+ .pipe(takeUntilDestroyed())
3060
+ .subscribe((credentials) => this.keycloakCredentials.set(credentials));
3154
3061
  }
3155
3062
  logout() {
3156
3063
  this.store.dispatch(AuthActions.logout());
@@ -3159,18 +3066,25 @@ class UserAccountComponent {
3159
3066
  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
3067
  if (result) {
3161
3068
  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
- }
3069
+ this.keycloakCredentials.update(credentials => {
3070
+ const newCredentials = [...credentials];
3071
+ const credType = newCredentials.find(c => c.type === type);
3072
+ if (credType?.userCredentialMetadatas) {
3073
+ credType.userCredentialMetadatas = credType.userCredentialMetadatas.filter(m => m.credential.id !== id);
3074
+ }
3075
+ return newCredentials;
3076
+ });
3167
3077
  }));
3168
3078
  }
3169
3079
  return EMPTY;
3170
3080
  })));
3171
3081
  }
3172
3082
  async updateProfile() {
3173
- return await lastValueFrom(this.keycloakProfileService.updateUserProfile(this.keyCloakUser));
3083
+ const user = this.keyCloakUser();
3084
+ if (user) {
3085
+ return await lastValueFrom(this.keycloakProfileService.updateUserProfile(user));
3086
+ }
3087
+ return;
3174
3088
  }
3175
3089
  updatePassword() {
3176
3090
  this.keycloakProfileService.updatePassword();
@@ -3178,36 +3092,36 @@ class UserAccountComponent {
3178
3092
  configureOTP() {
3179
3093
  this.keycloakProfileService.configureOTP();
3180
3094
  }
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" }] }); }
3095
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UserAccountComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3096
+ 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
3097
  }
3184
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: UserAccountComponent, decorators: [{
3098
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UserAccountComponent, decorators: [{
3185
3099
  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 }] });
3100
+ 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"] }]
3101
+ }], ctorParameters: () => [] });
3188
3102
 
3189
3103
  class SettingsCoreComponent {
3190
- constructor(_location, toastService, languageService, store) {
3191
- this._location = _location;
3192
- this.toastService = toastService;
3193
- this.languageService = languageService;
3194
- this.store = store;
3104
+ constructor() {
3105
+ this._location = inject(Location);
3106
+ this.toastService = inject(ToastService);
3107
+ this.languageService = inject(LanguageService);
3108
+ this.store = inject(Store);
3109
+ this.languages = computed(() => {
3110
+ return this.store.selectSignal(o => o[appContextFeatureKey].supportedLanguages)()
3111
+ .map((lang) => {
3112
+ return {
3113
+ value: lang,
3114
+ label: this.languageService.getLanguageName(lang),
3115
+ };
3116
+ });
3117
+ }, ...(ngDevMode ? [{ debugName: "languages" }] : /* istanbul ignore next */ []));
3118
+ this.currentLanguage = toSignal(this.store.select(o => o[appContextFeatureKey].language), { initialValue: 'en' });
3119
+ this.darkMode = computed(() => this.store.selectSignal(o => o[appContextFeatureKey].theme)() === 'dark', ...(ngDevMode ? [{ debugName: "darkMode" }] : /* istanbul ignore next */ []));
3195
3120
  }
3196
3121
  backClicked() {
3197
3122
  this._location.back();
3198
3123
  }
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) {
3124
+ setCurrentLanguage(value) {
3211
3125
  this.store.dispatch(AppContextActions.setLanguage({ language: value }));
3212
3126
  this.toastService.openToast('toast-c-1', 'toast-component', {
3213
3127
  title: this.languageService.translate('common.saved'),
@@ -3216,10 +3130,7 @@ class SettingsCoreComponent {
3216
3130
  ok: this.languageService.translate('ok'),
3217
3131
  });
3218
3132
  }
3219
- get darkMode() {
3220
- return this.store.selectSignal(o => o[appContextFeatureKey].theme)() === 'dark';
3221
- }
3222
- set darkMode(value) {
3133
+ setDarkMode(value) {
3223
3134
  this.store.dispatch(AppContextActions.setTheme({ theme: value ? 'dark' : 'light' }));
3224
3135
  this.toastService.openToast('toast-c-1', 'toast-component', {
3225
3136
  title: this.languageService.translate('common.saved'),
@@ -3228,13 +3139,13 @@ class SettingsCoreComponent {
3228
3139
  ok: this.languageService.translate('ok'),
3229
3140
  });
3230
3141
  }
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" }] }); }
3142
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsCoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3143
+ 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
3144
  }
3234
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SettingsCoreComponent, decorators: [{
3145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsCoreComponent, decorators: [{
3235
3146
  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 }] });
3147
+ 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"] }]
3148
+ }] });
3238
3149
 
3239
3150
  class SettingsListComponent {
3240
3151
  constructor(_location, appsService, authService, pageOptions) {
@@ -3242,9 +3153,8 @@ class SettingsListComponent {
3242
3153
  this.appsService = appsService;
3243
3154
  this.authService = authService;
3244
3155
  this.pageOptions = pageOptions;
3245
- }
3246
- get apps() {
3247
- return this.appsService.apps;
3156
+ this.apps = this.appsService.apps;
3157
+ this.pages = computed(() => this.pageOptions, ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
3248
3158
  }
3249
3159
  backClicked() {
3250
3160
  this._location.back();
@@ -3252,18 +3162,15 @@ class SettingsListComponent {
3252
3162
  selectApp(app) {
3253
3163
  this.appsService.selectApp(app, 'settings');
3254
3164
  }
3255
- get pages() {
3256
- return this.pageOptions;
3257
- }
3258
3165
  get auth$() {
3259
3166
  return this.authService.isAuthenticated$;
3260
3167
  }
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" }] }); }
3168
+ 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 }); }
3169
+ 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
3170
  }
3264
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: SettingsListComponent, decorators: [{
3171
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsListComponent, decorators: [{
3265
3172
  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"] }]
3173
+ 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
3174
  }], ctorParameters: () => [{ type: i1$6.Location }, { type: AppsService }, { type: AuthenticationService }, { type: undefined, decorators: [{
3268
3175
  type: Inject,
3269
3176
  args: [RLB_CFG_PAGES]
@@ -3318,7 +3225,7 @@ class AppContextEffects {
3318
3225
  this.loggerService = loggerService;
3319
3226
  this.apps = apps;
3320
3227
  this.setLanguage$ = createEffect(() => {
3321
- return this.actions$.pipe(ofType(AppContextActions.setLanguage), tap$1(({ language }) => this.languageService.language = language), tap$1(({ language }) => {
3228
+ return this.actions$.pipe(ofType(AppContextActions.setLanguage), tap$1(({ language }) => this.languageService.setLanguage(language)), tap$1(({ language }) => {
3322
3229
  this.renderer.setAttribute(document.documentElement, 'lang', language);
3323
3230
  }), tap$1(({ language }) => { this.storage.writeLocal('locale', language); }), map$1(({ language }) => AppContextActionsInternal.setLanguage({ language })));
3324
3231
  });
@@ -3352,12 +3259,12 @@ class AppContextEffects {
3352
3259
  }
3353
3260
  }
3354
3261
  }
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 }); }
3262
+ 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 }); }
3263
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContextEffects }); }
3357
3264
  }
3358
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppContextEffects, decorators: [{
3265
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContextEffects, decorators: [{
3359
3266
  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: [{
3267
+ }], 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
3268
  type: Inject,
3362
3269
  args: [RLB_APPS]
3363
3270
  }, {
@@ -3407,10 +3314,10 @@ class AuthEffects {
3407
3314
  this.logger = this.loggerService.for(this.constructor.name);
3408
3315
  this.logger.log(`Initialized AuthEffects}`);
3409
3316
  }
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 }); }
3317
+ 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 }); }
3318
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthEffects }); }
3412
3319
  }
3413
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AuthEffects, decorators: [{
3320
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthEffects, decorators: [{
3414
3321
  type: Injectable
3415
3322
  }], ctorParameters: () => [{ type: i1$8.Actions }, { type: AuthenticationService }, { type: AppLoggerService }, { type: undefined, decorators: [{
3416
3323
  type: Inject,
@@ -3465,8 +3372,8 @@ class ToastComponent {
3465
3372
  this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
3466
3373
  this.valid = true;
3467
3374
  }
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: `
3375
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3376
+ 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
3377
  <div class="toast-header">
3471
3378
  <strong class="me-auto">
3472
3379
  <svg
@@ -3497,12 +3404,13 @@ class ToastComponent {
3497
3404
  ></button>
3498
3405
  </div>
3499
3406
  <div class="toast-body">{{ data().content }}</div>
3500
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbAppModule }] }); }
3407
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbAppModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3501
3408
  }
3502
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ToastComponent, decorators: [{
3409
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToastComponent, decorators: [{
3503
3410
  type: Component,
3504
3411
  args: [{
3505
3412
  imports: [RlbAppModule],
3413
+ changeDetection: ChangeDetectionStrategy.OnPush,
3506
3414
  template: `
3507
3415
  <div class="toast-header">
3508
3416
  <strong class="me-auto">