@open-rlb/ng-app 3.1.85 → 3.1.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/open-rlb-ng-app.mjs +865 -956
- package/fesm2022/open-rlb-ng-app.mjs.map +1 -1
- package/package.json +1 -1
- package/types/open-rlb-ng-app.d.ts +240 -244
|
@@ -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,
|
|
5
|
-
import * as
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
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
|
|
14
|
-
import { RLB_TRANSLATION_SERVICE, ToastService,
|
|
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,
|
|
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$
|
|
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 {
|
|
26
|
-
import * as
|
|
27
|
-
import { FormGroup, FormControl, Validators,
|
|
28
|
-
import
|
|
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.
|
|
59
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
94
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
120
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
146
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
249
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
320
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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: '
|
|
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.
|
|
429
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
491
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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(
|
|
513
|
-
this.store =
|
|
514
|
-
this.activatedRoute =
|
|
515
|
-
this.router =
|
|
516
|
-
this.loggerService =
|
|
517
|
-
this.confAuth =
|
|
518
|
-
this.confAcl =
|
|
519
|
-
this.aclStore = inject(AclStore);
|
|
520
|
-
this.
|
|
521
|
-
this.
|
|
522
|
-
this.
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
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
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
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
|
|
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
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
this.logger.log('
|
|
574
|
-
|
|
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(
|
|
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
|
-
|
|
655
|
-
|
|
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.
|
|
815
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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: () => [
|
|
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(
|
|
836
|
-
this.translateService =
|
|
837
|
-
this.cookiesService =
|
|
838
|
-
this.i18nOptions =
|
|
839
|
-
this.
|
|
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.
|
|
828
|
+
this.translateService.use(languageUI);
|
|
829
|
+
this.setContentLanguage(languageContent);
|
|
846
830
|
}
|
|
847
831
|
}
|
|
848
|
-
get
|
|
849
|
-
return this.
|
|
832
|
+
get currentLanguage() {
|
|
833
|
+
return this.language();
|
|
850
834
|
}
|
|
851
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
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.
|
|
898
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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: () => [
|
|
904
|
-
type: Inject,
|
|
905
|
-
args: [RLB_CFG_I18N]
|
|
906
|
-
}, {
|
|
907
|
-
type: Optional
|
|
908
|
-
}] }] });
|
|
880
|
+
}], ctorParameters: () => [] });
|
|
909
881
|
|
|
910
882
|
class AppBreadcrumbService {
|
|
911
|
-
constructor(
|
|
912
|
-
this.router =
|
|
913
|
-
this.route =
|
|
914
|
-
this.loggerService =
|
|
915
|
-
this.languageService =
|
|
916
|
-
this.idService =
|
|
917
|
-
this._breadcrumbs
|
|
918
|
-
this.breadcrumbs
|
|
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
|
|
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.
|
|
958
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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: () => [
|
|
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.
|
|
1025
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
1042
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
1110
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
1193
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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:
|
|
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.
|
|
1216
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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$
|
|
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.
|
|
1306
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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
|
|
1294
|
+
return toObservable(this._newVersionAvailable);
|
|
1318
1295
|
}
|
|
1319
|
-
constructor(
|
|
1320
|
-
this.updates =
|
|
1321
|
-
this.modalService =
|
|
1322
|
-
this.languageService =
|
|
1323
|
-
this._newVersionAvailable
|
|
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
|
|
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'),
|
|
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.
|
|
1343
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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: () => [
|
|
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.
|
|
1492
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
1521
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
1634
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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:
|
|
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.
|
|
1684
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
1720
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
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.
|
|
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(
|
|
1770
|
-
this.cmsOptions =
|
|
1907
|
+
constructor() {
|
|
1908
|
+
this.cmsOptions = inject(RLB_CFG_CMS, { optional: true });
|
|
1771
1909
|
}
|
|
1772
1910
|
transform(value, ...args) {
|
|
1773
|
-
let cms = this.cmsOptions
|
|
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.
|
|
1786
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.
|
|
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.
|
|
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
|
-
}]
|
|
1795
|
-
type: Inject,
|
|
1796
|
-
args: [RLB_CFG_CMS]
|
|
1797
|
-
}, {
|
|
1798
|
-
type: Optional
|
|
1799
|
-
}] }] });
|
|
1931
|
+
}] });
|
|
1800
1932
|
|
|
1801
1933
|
class CmsComponent {
|
|
1802
|
-
constructor(
|
|
1803
|
-
this.strapiService =
|
|
1804
|
-
this.languageService =
|
|
1805
|
-
this.cmsOptions =
|
|
1806
|
-
this.mdService =
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
this.
|
|
1810
|
-
this.
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
return
|
|
1820
|
-
}))
|
|
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
|
|
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
|
|
1962
|
+
else if (this.cmsOptions?.markdown === 'text') {
|
|
1832
1963
|
return this.mdService.md2text(md);
|
|
1833
1964
|
}
|
|
1834
|
-
else if (this.cmsOptions
|
|
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.
|
|
1841
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
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.
|
|
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',
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
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(
|
|
1861
|
-
this.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.
|
|
1867
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.
|
|
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.
|
|
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',
|
|
1872
|
-
}]
|
|
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.
|
|
1876
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.
|
|
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.
|
|
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',
|
|
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.
|
|
1885
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.
|
|
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.
|
|
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',
|
|
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.
|
|
1894
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.
|
|
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.
|
|
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',
|
|
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(
|
|
1903
|
-
this.supportService =
|
|
1904
|
-
this._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
|
-
|
|
1915
|
-
|
|
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.
|
|
1930
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.
|
|
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.
|
|
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',
|
|
1935
|
-
}]
|
|
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.
|
|
1939
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.
|
|
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.
|
|
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',
|
|
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.
|
|
1954
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
1971
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
2001
|
-
|
|
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
|
-
|
|
2149
|
+
setDarkMode(value) {
|
|
2150
|
+
this.store.dispatch(AppContextActions.setTheme({ theme: value ? 'dark' : 'light' }));
|
|
2151
|
+
this.toastService.openToast('toast-c-1', 'toast-component', {
|
|
2152
|
+
title: this.languageService.translate('common.saved'),
|
|
2153
|
+
content: this.languageService.translate('common.savedSuccessfully'),
|
|
2154
|
+
type: 'success',
|
|
2155
|
+
ok: this.languageService.translate('ok'),
|
|
2156
|
+
});
|
|
2157
|
+
}
|
|
2158
|
+
selectApp(app) {
|
|
2004
2159
|
this.appSelected.emit(app);
|
|
2005
2160
|
}
|
|
2006
2161
|
goToFirstSlide() {
|
|
@@ -2019,86 +2174,77 @@ class SettingsDropdownSelectorComponent {
|
|
|
2019
2174
|
}
|
|
2020
2175
|
}
|
|
2021
2176
|
isAppSelected(appId) {
|
|
2022
|
-
|
|
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.
|
|
2068
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: SettingsDropdownSelectorComponent, isStandalone: false, selector: "rlb-settings-dropdown-selector", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, apps: { classPropertyName: "apps", publicName: "apps", isSignal: true, isRequired: true, transformFunction: null }, isAuthenticated: { classPropertyName: "isAuthenticated", publicName: "isAuthenticated", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { appSelected: "appSelected" }, viewQueries: [{ propertyName: "menu", first: true, predicate: ["menu"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item #menu dropdown auto-close=\"outside\" (status-changed)=\"change($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') | translate\">\n <i class=\"bi bi-gear fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n </div>\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <!-- Inline mode for Offcanvas -->\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n}\n\n<ng-template #settingsCarousel>\n <rlb-carousel [hide-indicators]=\"true\" [hide-controls]=\"true\" autoplay=\"none\"[no-touch]=\"true\" [(current-slide)]=\"activeSlide\" class=\"w-100 d-block\">\n <rlb-carousel-slide [active]=\"true\">\n <div class=\"p-3\">\n <h6 class=\"dropdown-header px-0 text-center mb-2 fw-bold text-dark\">\n {{ 'core.settings.title' | translate }}\n </h6>\n\n <div class=\"row row-cols-3 g-2\">\n\n @if (isAuthenticated()) {\n <!-- General Settings -->\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n (click)=\"goToInlineSettings()\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-person fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.account.settings.title' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Dynamic App Settings -->\n @for (app of apps(); track app.id) {\n @if (app.settings && app.enabled && (app.settings.auth && (isAuthenticated()))) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n [class.active]=\"isAppSelected(app.id)\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i [ngClass]=\"['bi', 'fs-4', 'mb-1', app.settings.icon || 'bi-gear']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\">\n {{ app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n\n <!-- System / Status -->\n @if (pages?.['status']?.path) {\n <div class=\"col\">\n <button rlb-button outline color=\"primary\" routerLink=\"/status\" routerLinkActive=\"active\" class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-check2-circle fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.settings.status' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Logger -->\n @if (pages?.['logger']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/logger\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-file-text fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.logger' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Privacy -->\n @if (pages?.['privacy']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/privacy\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-shield-check fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.privacy' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Cookies -->\n @if (pages?.['cookies']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/cookies\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-cookie fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.cookies' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Terms -->\n @if (pages?.['terms']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/terms\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-vector-pen fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.legal' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Support -->\n @if (pages?.['support']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/support\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-chat-quote fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.support' | translate }}\n </span>\n </button>\n </div>\n }\n\n </div>\n </div>\n </rlb-carousel-slide>\n\n <rlb-carousel-slide>\n <div class=\"p-3\">\n\n <!-- Header -->\n <div class=\"d-flex align-items-center mb-3\">\n <button class=\"btn btn-sm btn-link text-reset p-0 me-2 border-0 text-decoration-none\" (click)=\"goToFirstSlide()\">\n <i class=\"bi bi-arrow-left fs-5\"></i>\n </button>\n <h6 class=\"mb-0 fw-bold\">{{ 'core.account.settings.title' | translate }}</h6>\n </div>\n\n <rlb-list class=\"settings\">\n\n <!-- Theme Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalTheme' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [(ngModel)]=\"darkMode\" />\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Language Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalLanguage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [(ngModel)]=\"currentLanguage\">\n @for (l of languages; track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Show More -->\n <rlb-list-item action class=\"settings-item\" routerLink=\"/profile\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.settings.showMore' | translate }}</span>\n </div>\n <div class=\"settings-control text-primary\">\n <i class=\"bi bi-arrow-up-right-square fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Logout -->\n <rlb-list-item action (click)=\"logout()\" class=\"settings-item\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center text-danger\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.logout' | translate }}</span>\n </div>\n <div class=\"settings-control\">\n <i class=\"bi bi-box-arrow-left fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n </rlb-list>\n </div>\n </rlb-carousel-slide>\n </rlb-carousel>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2$1.SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "component", type: i2$1.SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "inputId", "enable-validation"] }, { kind: "component", type: i2$1.OptionComponent, selector: "rlb-option", inputs: ["value", "disabled"] }, { kind: "component", type: i2$1.ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "directive", type: i2$1.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "component", type: i2$1.DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "component", type: i2$1.NavbarDropdownItemComponent, selector: "rlb-navbar-dropdown-item", inputs: ["disabled", "dropdown", "href", "class", "toggle", "auto-close"], outputs: ["click", "status-changed"] }, { kind: "component", type: i2$1.CarouselComponent, selector: "rlb-carousel", inputs: ["id", "hide-indicators", "hide-controls", "cross-fade", "autoplay", "interval", "pause", "wrap", "no-touch", "keyboard", "current-slide"], outputs: ["slid", "slide", "current-slideChange", "slide-count"] }, { kind: "component", type: i2$1.CarouselSlideComponent, selector: "rlb-carousel-slide", inputs: ["active", "id"] }, { kind: "component", type: i2$1.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i2$1.ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }] }); }
|
|
2182
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsDropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2183
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SettingsDropdownSelectorComponent, isStandalone: true, selector: "rlb-settings-dropdown-selector", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, apps: { classPropertyName: "apps", publicName: "apps", isSignal: true, isRequired: true, transformFunction: null }, isAuthenticated: { classPropertyName: "isAuthenticated", publicName: "isAuthenticated", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { appSelected: "appSelected" }, viewQueries: [{ propertyName: "menu", first: true, predicate: ["menu"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item #menu dropdown auto-close=\"outside\" (status-changed)=\"change($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') | translate\">\n <i class=\"bi bi-gear fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n </div>\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <!-- Inline mode for Offcanvas -->\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n}\n\n<ng-template #settingsCarousel>\n <rlb-carousel [hide-indicators]=\"true\" [hide-controls]=\"true\" autoplay=\"none\" [no-touch]=\"true\" [(current-slide)]=\"activeSlide\" class=\"w-100 d-block\">\n <rlb-carousel-slide [active]=\"true\">\n <div class=\"p-3\">\n <h6 class=\"dropdown-header px-0 text-center mb-2 fw-bold text-dark\">\n {{ 'core.settings.title' | translate }}\n </h6>\n\n <div class=\"row row-cols-3 g-2\">\n\n @if (isAuthenticated()) {\n <!-- General Settings -->\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n (click)=\"goToInlineSettings()\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-person fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.account.settings.title' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Dynamic App Settings -->\n @for (app of apps(); track app.id) {\n @if (app.settings && app.enabled && (app.settings.auth && (isAuthenticated()))) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n [class.active]=\"isAppSelected(app.id)\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i [ngClass]=\"['bi', 'fs-4', 'mb-1', app.settings.icon || 'bi-gear']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\">\n {{ app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n\n <!-- System / Status -->\n @if (pages()?.['status']?.path) {\n <div class=\"col\">\n <button rlb-button outline color=\"primary\" routerLink=\"/status\" routerLinkActive=\"active\" class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-check2-circle fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.settings.status' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Logger -->\n @if (pages()?.['logger']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/logger\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-file-text fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.logger' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Privacy -->\n @if (pages()?.['privacy']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/privacy\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-shield-check fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.privacy' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Cookies -->\n @if (pages()?.['cookies']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/cookies\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-cookie fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.cookies' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Terms -->\n @if (pages()?.['terms']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/terms\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-vector-pen fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.legal' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Support -->\n @if (pages()?.['support']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/support\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-chat-quote fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.support' | translate }}\n </span>\n </button>\n </div>\n }\n\n </div>\n </div>\n </rlb-carousel-slide>\n\n <rlb-carousel-slide>\n <div class=\"p-3\">\n\n <!-- Header -->\n <div class=\"d-flex align-items-center mb-3\">\n <button class=\"btn btn-sm btn-link text-reset p-0 me-2 border-0 text-decoration-none\" (click)=\"goToFirstSlide()\">\n <i class=\"bi bi-arrow-left fs-5\"></i>\n </button>\n <h6 class=\"mb-0 fw-bold\">{{ 'core.account.settings.title' | translate }}</h6>\n </div>\n\n <rlb-list class=\"settings\">\n\n <!-- Theme Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalTheme' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [ngModel]=\"darkMode()\" (ngModelChange)=\"setDarkMode($event)\" />\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Language Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalLanguage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [ngModel]=\"currentLanguage()\" (ngModelChange)=\"setCurrentLanguage($event)\">\n @for (l of languages(); track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Show More -->\n <rlb-list-item action class=\"settings-item\" routerLink=\"/profile\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.settings.showMore' | translate }}</span>\n </div>\n <div class=\"settings-control text-primary\">\n <i class=\"bi bi-arrow-up-right-square fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Logout -->\n <rlb-list-item action (click)=\"logout()\" class=\"settings-item\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center text-danger\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.logout' | translate }}</span>\n </div>\n <div class=\"settings-control\">\n <i class=\"bi bi-box-arrow-left fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n </rlb-list>\n </div>\n </rlb-carousel-slide>\n </rlb-carousel>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "component", type: NavbarDropdownItemComponent, selector: "rlb-navbar-dropdown-item", inputs: ["disabled", "dropdown", "href", "class", "toggle", "auto-close"], outputs: ["click", "status-changed"] }, { kind: "component", type: DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "component", type: CarouselComponent, selector: "rlb-carousel", inputs: ["id", "hide-indicators", "hide-controls", "cross-fade", "autoplay", "interval", "pause", "wrap", "no-touch", "keyboard", "current-slide"], outputs: ["slid", "slide", "current-slideChange", "slide-count"] }, { kind: "component", type: CarouselSlideComponent, selector: "rlb-carousel-slide", inputs: ["active", "id"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "component", type: ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "component", type: SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "component", type: SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "inputId", "enable-validation"] }, { kind: "component", type: OptionComponent, selector: "rlb-option", inputs: ["value", "disabled"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i5.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2069
2184
|
}
|
|
2070
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2185
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsDropdownSelectorComponent, decorators: [{
|
|
2071
2186
|
type: Component,
|
|
2072
|
-
args: [{ selector: 'rlb-settings-dropdown-selector', standalone: false, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item #menu dropdown auto-close=\"outside\" (status-changed)=\"change($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') | translate\">\n <i class=\"bi bi-gear fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n </div>\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <!-- Inline mode for Offcanvas -->\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n}\n\n<ng-template #settingsCarousel>\n <rlb-carousel [hide-indicators]=\"true\" [hide-controls]=\"true\" autoplay=\"none\"[no-touch]=\"true\" [(current-slide)]=\"activeSlide\" class=\"w-100 d-block\">\n <rlb-carousel-slide [active]=\"true\">\n <div class=\"p-3\">\n <h6 class=\"dropdown-header px-0 text-center mb-2 fw-bold text-dark\">\n {{ 'core.settings.title' | translate }}\n </h6>\n\n <div class=\"row row-cols-3 g-2\">\n\n @if (isAuthenticated()) {\n <!-- General Settings -->\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n (click)=\"goToInlineSettings()\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-person fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.account.settings.title' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Dynamic App Settings -->\n @for (app of apps(); track app.id) {\n @if (app.settings && app.enabled && (app.settings.auth && (isAuthenticated()))) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n [class.active]=\"isAppSelected(app.id)\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i [ngClass]=\"['bi', 'fs-4', 'mb-1', app.settings.icon || 'bi-gear']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\">\n {{ app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n\n <!-- System / Status -->\n @if (pages?.['status']?.path) {\n <div class=\"col\">\n <button rlb-button outline color=\"primary\" routerLink=\"/status\" routerLinkActive=\"active\" class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-check2-circle fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.settings.status' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Logger -->\n @if (pages?.['logger']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/logger\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-file-text fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.logger' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Privacy -->\n @if (pages?.['privacy']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/privacy\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-shield-check fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.privacy' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Cookies -->\n @if (pages?.['cookies']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/cookies\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-cookie fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.cookies' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Terms -->\n @if (pages?.['terms']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/terms\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-vector-pen fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.legal' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Support -->\n @if (pages?.['support']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/support\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-chat-quote fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.support' | translate }}\n </span>\n </button>\n </div>\n }\n\n </div>\n </div>\n </rlb-carousel-slide>\n\n <rlb-carousel-slide>\n <div class=\"p-3\">\n\n <!-- Header -->\n <div class=\"d-flex align-items-center mb-3\">\n <button class=\"btn btn-sm btn-link text-reset p-0 me-2 border-0 text-decoration-none\" (click)=\"goToFirstSlide()\">\n <i class=\"bi bi-arrow-left fs-5\"></i>\n </button>\n <h6 class=\"mb-0 fw-bold\">{{ 'core.account.settings.title' | translate }}</h6>\n </div>\n\n <rlb-list class=\"settings\">\n\n <!-- Theme Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalTheme' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [(ngModel)]=\"darkMode\" />\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Language Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalLanguage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [(ngModel)]=\"currentLanguage\">\n @for (l of languages; track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Show More -->\n <rlb-list-item action class=\"settings-item\" routerLink=\"/profile\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.settings.showMore' | translate }}</span>\n </div>\n <div class=\"settings-control text-primary\">\n <i class=\"bi bi-arrow-up-right-square fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Logout -->\n <rlb-list-item action (click)=\"logout()\" class=\"settings-item\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center text-danger\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.logout' | translate }}</span>\n </div>\n <div class=\"settings-control\">\n <i class=\"bi bi-box-arrow-left fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n </rlb-list>\n </div>\n </rlb-carousel-slide>\n </rlb-carousel>\n</ng-template>\n" }]
|
|
2187
|
+
args: [{ selector: 'rlb-settings-dropdown-selector', imports: [
|
|
2188
|
+
NavbarDropdownItemComponent,
|
|
2189
|
+
DropdownContainerComponent,
|
|
2190
|
+
CarouselComponent,
|
|
2191
|
+
CarouselSlideComponent,
|
|
2192
|
+
TooltipDirective,
|
|
2193
|
+
ListComponent,
|
|
2194
|
+
ListItemComponent,
|
|
2195
|
+
SwitchComponent,
|
|
2196
|
+
SelectComponent,
|
|
2197
|
+
OptionComponent,
|
|
2198
|
+
NgClass,
|
|
2199
|
+
NgTemplateOutlet,
|
|
2200
|
+
TranslateModule,
|
|
2201
|
+
FormsModule,
|
|
2202
|
+
RouterModule,
|
|
2203
|
+
ButtonComponent,
|
|
2204
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item #menu dropdown auto-close=\"outside\" (status-changed)=\"change($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') | translate\">\n <i class=\"bi bi-gear fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n </div>\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <!-- Inline mode for Offcanvas -->\n <ng-container *ngTemplateOutlet=\"settingsCarousel\"></ng-container>\n}\n\n<ng-template #settingsCarousel>\n <rlb-carousel [hide-indicators]=\"true\" [hide-controls]=\"true\" autoplay=\"none\" [no-touch]=\"true\" [(current-slide)]=\"activeSlide\" class=\"w-100 d-block\">\n <rlb-carousel-slide [active]=\"true\">\n <div class=\"p-3\">\n <h6 class=\"dropdown-header px-0 text-center mb-2 fw-bold text-dark\">\n {{ 'core.settings.title' | translate }}\n </h6>\n\n <div class=\"row row-cols-3 g-2\">\n\n @if (isAuthenticated()) {\n <!-- General Settings -->\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n (click)=\"goToInlineSettings()\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-person fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.account.settings.title' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Dynamic App Settings -->\n @for (app of apps(); track app.id) {\n @if (app.settings && app.enabled && (app.settings.auth && (isAuthenticated()))) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n [class.active]=\"isAppSelected(app.id)\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i [ngClass]=\"['bi', 'fs-4', 'mb-1', app.settings.icon || 'bi-gear']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\">\n {{ app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n\n <!-- System / Status -->\n @if (pages()?.['status']?.path) {\n <div class=\"col\">\n <button rlb-button outline color=\"primary\" routerLink=\"/status\" routerLinkActive=\"active\" class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-check2-circle fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">{{ 'core.settings.status' | translate }}</span>\n </button>\n </div>\n }\n\n <!-- Logger -->\n @if (pages()?.['logger']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/logger\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-file-text fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.logger' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Privacy -->\n @if (pages()?.['privacy']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/privacy\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-shield-check fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.privacy' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Cookies -->\n @if (pages()?.['cookies']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/cookies\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-cookie fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.cookies' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Terms -->\n @if (pages()?.['terms']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/terms\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-vector-pen fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.legal' | translate }}\n </span>\n </button>\n </div>\n }\n\n <!-- Support -->\n @if (pages()?.['support']?.path) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n color=\"primary\"\n routerLink=\"/support\"\n routerLinkActive=\"active\"\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-decoration-none\">\n <i class=\"bi bi-chat-quote fs-4 mb-1\"></i>\n <span class=\"small text-truncate w-100\">\n {{ 'core.settings.support' | translate }}\n </span>\n </button>\n </div>\n }\n\n </div>\n </div>\n </rlb-carousel-slide>\n\n <rlb-carousel-slide>\n <div class=\"p-3\">\n\n <!-- Header -->\n <div class=\"d-flex align-items-center mb-3\">\n <button class=\"btn btn-sm btn-link text-reset p-0 me-2 border-0 text-decoration-none\" (click)=\"goToFirstSlide()\">\n <i class=\"bi bi-arrow-left fs-5\"></i>\n </button>\n <h6 class=\"mb-0 fw-bold\">{{ 'core.account.settings.title' | translate }}</h6>\n </div>\n\n <rlb-list class=\"settings\">\n\n <!-- Theme Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalTheme' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [ngModel]=\"darkMode()\" (ngModelChange)=\"setDarkMode($event)\" />\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Language Settings -->\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.settings.generalLanguage' | translate}}</span>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [ngModel]=\"currentLanguage()\" (ngModelChange)=\"setCurrentLanguage($event)\">\n @for (l of languages(); track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Show More -->\n <rlb-list-item action class=\"settings-item\" routerLink=\"/profile\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.settings.showMore' | translate }}</span>\n </div>\n <div class=\"settings-control text-primary\">\n <i class=\"bi bi-arrow-up-right-square fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n <!-- Logout -->\n <rlb-list-item action (click)=\"logout()\" class=\"settings-item\" style=\"cursor: pointer;\">\n <div class=\"d-flex justify-content-between align-items-center text-danger\">\n <div class=\"settings-text\">\n <span class=\"fw-semibold\">{{ 'core.account.logout' | translate }}</span>\n </div>\n <div class=\"settings-control\">\n <i class=\"bi bi-box-arrow-left fs-5\"></i>\n </div>\n </div>\n </rlb-list-item>\n\n </rlb-list>\n </div>\n </rlb-carousel-slide>\n </rlb-carousel>\n</ng-template>\n" }]
|
|
2073
2205
|
}], ctorParameters: () => [], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], apps: [{ type: i0.Input, args: [{ isSignal: true, alias: "apps", required: true }] }], isAuthenticated: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAuthenticated", required: true }] }], appSelected: [{ type: i0.Output, args: ["appSelected"] }], menu: [{ type: i0.ViewChild, args: ['menu', { isSignal: true }] }] } });
|
|
2074
2206
|
|
|
2075
|
-
class
|
|
2207
|
+
class LeftComponentPipe {
|
|
2076
2208
|
constructor() {
|
|
2077
|
-
this.
|
|
2078
|
-
this.apps = input.required(...(ngDevMode ? [{ debugName: "apps" }] : /* istanbul ignore next */ []));
|
|
2079
|
-
this.isAuthenticated = input.required(...(ngDevMode ? [{ debugName: "isAuthenticated" }] : /* istanbul ignore next */ []));
|
|
2080
|
-
this.appSelected = output();
|
|
2081
|
-
this.appsService = inject(AppsService);
|
|
2082
|
-
}
|
|
2083
|
-
selectApp(app) {
|
|
2084
|
-
this.appSelected.emit(app);
|
|
2209
|
+
this.config = inject(RLB_APP_NAVCOMP);
|
|
2085
2210
|
}
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2211
|
+
transform(value) {
|
|
2212
|
+
const t = this.config.left.find(c => c.name === value)?.component;
|
|
2213
|
+
if (!t) {
|
|
2214
|
+
throw new Error(`No component found for name ${value}`);
|
|
2089
2215
|
}
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2216
|
+
return t;
|
|
2217
|
+
}
|
|
2218
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LeftComponentPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
2219
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: LeftComponentPipe, isStandalone: true, name: "leftComponent" }); }
|
|
2220
|
+
}
|
|
2221
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: LeftComponentPipe, decorators: [{
|
|
2222
|
+
type: Pipe,
|
|
2223
|
+
args: [{
|
|
2224
|
+
name: 'leftComponent'
|
|
2225
|
+
}]
|
|
2226
|
+
}] });
|
|
2227
|
+
|
|
2228
|
+
class RightComponentPipe {
|
|
2229
|
+
constructor() {
|
|
2230
|
+
this.config = inject(RLB_APP_NAVCOMP);
|
|
2231
|
+
}
|
|
2232
|
+
transform(value) {
|
|
2233
|
+
const t = this.config.right.find(c => c.name === value)?.component;
|
|
2234
|
+
if (!t) {
|
|
2235
|
+
throw new Error(`No component found for name ${value}`);
|
|
2093
2236
|
}
|
|
2237
|
+
return t;
|
|
2094
2238
|
}
|
|
2095
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2096
|
-
static { this.ɵ
|
|
2239
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RightComponentPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
2240
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: RightComponentPipe, isStandalone: true, name: "rightComponent" }); }
|
|
2097
2241
|
}
|
|
2098
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2099
|
-
type:
|
|
2100
|
-
args: [{
|
|
2101
|
-
|
|
2242
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RightComponentPipe, decorators: [{
|
|
2243
|
+
type: Pipe,
|
|
2244
|
+
args: [{
|
|
2245
|
+
name: 'rightComponent'
|
|
2246
|
+
}]
|
|
2247
|
+
}] });
|
|
2102
2248
|
|
|
2103
2249
|
class RlbRole {
|
|
2104
2250
|
constructor() {
|
|
@@ -2117,155 +2263,88 @@ class RlbRole {
|
|
|
2117
2263
|
}
|
|
2118
2264
|
});
|
|
2119
2265
|
}
|
|
2120
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2121
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
2266
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbRole, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
2267
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RlbRole, isStandalone: true, selector: "[roles]", inputs: { action: { classPropertyName: "action", publicName: "roles", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
2122
2268
|
}
|
|
2123
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2269
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbRole, decorators: [{
|
|
2124
2270
|
type: Directive,
|
|
2125
2271
|
args: [{
|
|
2126
|
-
selector: '[roles]'
|
|
2127
|
-
standalone: false,
|
|
2272
|
+
selector: '[roles]'
|
|
2128
2273
|
}]
|
|
2129
2274
|
}], ctorParameters: () => [], propDecorators: { action: [{ type: i0.Input, args: [{ isSignal: true, alias: "roles", required: false }] }] } });
|
|
2130
2275
|
|
|
2131
|
-
class
|
|
2132
|
-
constructor(
|
|
2133
|
-
this.
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
}
|
|
2140
|
-
return t;
|
|
2276
|
+
class AppDropdownSelectorComponent {
|
|
2277
|
+
constructor() {
|
|
2278
|
+
this.mode = input('desktop', ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
|
|
2279
|
+
this.apps = input.required(...(ngDevMode ? [{ debugName: "apps" }] : /* istanbul ignore next */ []));
|
|
2280
|
+
this.isAuthenticated = input.required(...(ngDevMode ? [{ debugName: "isAuthenticated" }] : /* istanbul ignore next */ []));
|
|
2281
|
+
this.appSelected = output();
|
|
2282
|
+
this.appsService = inject(AppsService);
|
|
2283
|
+
this.currentAppId = computed(() => this.appsService.currentApp()?.id, ...(ngDevMode ? [{ debugName: "currentAppId" }] : /* istanbul ignore next */ []));
|
|
2141
2284
|
}
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
}
|
|
2145
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: LeftComponentPipe, decorators: [{
|
|
2146
|
-
type: Pipe,
|
|
2147
|
-
args: [{
|
|
2148
|
-
name: 'leftComponent',
|
|
2149
|
-
standalone: false
|
|
2150
|
-
}]
|
|
2151
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
2152
|
-
type: Inject,
|
|
2153
|
-
args: [RLB_APP_NAVCOMP]
|
|
2154
|
-
}] }] });
|
|
2155
|
-
|
|
2156
|
-
class RightComponentPipe {
|
|
2157
|
-
constructor(config) {
|
|
2158
|
-
this.config = config;
|
|
2285
|
+
selectApp(app) {
|
|
2286
|
+
this.appSelected.emit(app);
|
|
2159
2287
|
}
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
if (!t) {
|
|
2163
|
-
throw new Error(`No component found for name ${value}`);
|
|
2164
|
-
}
|
|
2165
|
-
return t;
|
|
2288
|
+
isAppSelected(appId) {
|
|
2289
|
+
return this.currentAppId() === appId;
|
|
2166
2290
|
}
|
|
2167
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2168
|
-
static { this.ɵ
|
|
2291
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppDropdownSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2292
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AppDropdownSelectorComponent, isStandalone: true, selector: "rlb-app-dropdown-selector", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, apps: { classPropertyName: "apps", publicName: "apps", isSignal: true, isRequired: true, transformFunction: null }, isAuthenticated: { classPropertyName: "isAuthenticated", publicName: "isAuthenticated", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { appSelected: "appSelected" }, ngImport: i0, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item dropdown>\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') | translate\">\n <i class=\"bi bi-grid-3x3-gap-fill fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n </div>\n\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n}\n\n<ng-template #appGrid>\n <div class=\"row row-cols-3 g-2 p-3\">\n @for (app of apps(); track app.id) {\n @if (app.core) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-center\"\n [class.active]=\"isAppSelected(app.id)\"\n [disabled]=\"!app.enabled && (app.core.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n >\n <i [ngClass]=\"['fs-3', 'mb-1', app.core.icon || 'bi bi-app']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate\">\n {{ app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "component", type: NavbarDropdownItemComponent, selector: "rlb-navbar-dropdown-item", inputs: ["disabled", "dropdown", "href", "class", "toggle", "auto-close"], outputs: ["click", "status-changed"] }, { kind: "component", type: DropdownContainerComponent, selector: "ul[rlb-dropdown-menu], rlb-dropdown-container", inputs: ["placement", "placement-sm", "placement-md", "placement-lg", "placement-xl", "placement-xxl"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2169
2293
|
}
|
|
2170
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2171
|
-
type:
|
|
2172
|
-
args: [{
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
|
|
2177
|
-
|
|
2178
|
-
|
|
2179
|
-
|
|
2294
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppDropdownSelectorComponent, decorators: [{
|
|
2295
|
+
type: Component,
|
|
2296
|
+
args: [{ selector: 'rlb-app-dropdown-selector', imports: [
|
|
2297
|
+
NavbarDropdownItemComponent,
|
|
2298
|
+
DropdownContainerComponent,
|
|
2299
|
+
ButtonComponent,
|
|
2300
|
+
TooltipDirective,
|
|
2301
|
+
NgClass,
|
|
2302
|
+
NgTemplateOutlet,
|
|
2303
|
+
TranslateModule,
|
|
2304
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (mode() === 'desktop') {\n <rlb-navbar-dropdown-item dropdown>\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') | translate\">\n <i class=\"bi bi-grid-3x3-gap-fill fs-5\"></i>\n </span>\n <rlb-dropdown-container placement=\"right\">\n\n <div style=\"width: 320px;\">\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n </div>\n\n </rlb-dropdown-container>\n </rlb-navbar-dropdown-item>\n} @else {\n <ng-container *ngTemplateOutlet=\"appGrid\"></ng-container>\n}\n\n<ng-template #appGrid>\n <div class=\"row row-cols-3 g-2 p-3\">\n @for (app of apps(); track app.id) {\n @if (app.core) {\n <div class=\"col\">\n <button\n rlb-button\n outline\n class=\"w-100 h-100 d-flex flex-column align-items-center justify-content-center p-2 text-center\"\n [class.active]=\"isAppSelected(app.id)\"\n [disabled]=\"!app.enabled && (app.core.auth && !(isAuthenticated()))\"\n (click)=\"selectApp(app)\"\n >\n <i [ngClass]=\"['fs-3', 'mb-1', app.core.icon || 'bi bi-app']\"></i>\n <span class=\"small text-truncate w-100\" [title]=\"app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate\">\n {{ app?.data?.friendlyName ? app.data.friendlyName : app.core.title | translate }}\n </span>\n </button>\n </div>\n }\n }\n </div>\n</ng-template>\n" }]
|
|
2305
|
+
}], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], apps: [{ type: i0.Input, args: [{ isSignal: true, alias: "apps", required: true }] }], isAuthenticated: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAuthenticated", required: true }] }], appSelected: [{ type: i0.Output, args: ["appSelected"] }] } });
|
|
2180
2306
|
|
|
2181
2307
|
class AppTemplateComponent {
|
|
2182
|
-
constructor(
|
|
2183
|
-
this.
|
|
2184
|
-
this.store = store;
|
|
2185
|
-
this.appsService = appsService;
|
|
2186
|
-
this.authService = authService;
|
|
2187
|
-
this.router = router;
|
|
2308
|
+
constructor() {
|
|
2309
|
+
this.Array = Array;
|
|
2188
2310
|
this.navSearchText = null;
|
|
2189
|
-
this.
|
|
2190
|
-
this.
|
|
2191
|
-
this.
|
|
2311
|
+
this.modalContainerId = input.required({ ...(ngDevMode ? { debugName: "modalContainerId" } : /* istanbul ignore next */ {}), alias: 'modal-container-id' });
|
|
2312
|
+
this.breadcrumbInput = input(undefined, { ...(ngDevMode ? { debugName: "breadcrumbInput" } : /* istanbul ignore next */ {}), alias: 'breadcrumb' });
|
|
2313
|
+
this.breadcrumb = computed(() => this.breadcrumbInput() ?? [], ...(ngDevMode ? [{ debugName: "breadcrumb" }] : /* istanbul ignore next */ []));
|
|
2314
|
+
this.toastContainerIds = input.required({ ...(ngDevMode ? { debugName: "toastContainerIds" } : /* istanbul ignore next */ {}), alias: 'toast-container-ids' });
|
|
2192
2315
|
this.mobileOffcanvas = viewChild('mobileOffcanvas', ...(ngDevMode ? [{ debugName: "mobileOffcanvas" }] : /* istanbul ignore next */ []));
|
|
2193
2316
|
this.mobileSettingsMenu = viewChild('mobileSettingsMenu', ...(ngDevMode ? [{ debugName: "mobileSettingsMenu" }] : /* istanbul ignore next */ []));
|
|
2194
|
-
this.
|
|
2317
|
+
this.env = inject(RLB_CFG_ENV);
|
|
2318
|
+
this.store = inject((Store));
|
|
2319
|
+
this.appsService = inject(AppsService);
|
|
2320
|
+
this.authService = inject(AuthenticationService);
|
|
2321
|
+
this.router = inject(Router);
|
|
2322
|
+
this.sidebarVisible = this.store.selectSignal((state) => state[sidebarsFeatureKey].visible);
|
|
2323
|
+
this.sidearHasLogin = this.store.selectSignal((state) => state[sidebarsFeatureKey].loginVisible);
|
|
2324
|
+
this.sidearHasSearch = this.store.selectSignal((state) => state[sidebarsFeatureKey].searchVisible);
|
|
2325
|
+
this.sidebarItems = this.store.selectSignal((state) => state[sidebarsFeatureKey].items);
|
|
2326
|
+
this.sidearHasSettings = this.store.selectSignal((state) => state[sidebarsFeatureKey].settingsVisible);
|
|
2327
|
+
this.sidearAppsVisible = this.store.selectSignal((state) => state[sidebarsFeatureKey].appsVisible);
|
|
2328
|
+
this.navVisible = this.store.selectSignal((state) => state[navbarsFeatureKey].visible);
|
|
2329
|
+
this.navSearchVisible = this.store.selectSignal((state) => state[navbarsFeatureKey].searchVisible);
|
|
2330
|
+
this.navHeader = this.store.selectSignal((state) => state[navbarsFeatureKey].header);
|
|
2331
|
+
this.navLeftItems = this.store.selectSignal((state) => state[navbarsFeatureKey].leftItems);
|
|
2332
|
+
this.navRightItems = this.store.selectSignal((state) => state[navbarsFeatureKey].rightItems);
|
|
2333
|
+
this.navbarHasLogin = this.store.selectSignal((state) => state[navbarsFeatureKey].loginVisible);
|
|
2334
|
+
this.navbarHasSettings = this.store.selectSignal((state) => state[navbarsFeatureKey].settingsVisible);
|
|
2335
|
+
this.navbarHasApps = this.store.selectSignal(state => state[navbarsFeatureKey].appsVisible);
|
|
2336
|
+
this.navbarLayout = this.store.selectSignal(state => state[navbarsFeatureKey].actionsLayout);
|
|
2337
|
+
this.separatorVisible = this.store.selectSignal(state => state[navbarsFeatureKey].separatorVisible);
|
|
2338
|
+
this.isAuthenticated = toSignal(this.authService.isAuthenticated$, { initialValue: false });
|
|
2339
|
+
this.userInfo = toSignal(this.authService.userInfo$, { initialValue: null });
|
|
2340
|
+
this.theme = this.store.selectSignal(state => state[appContextFeatureKey].theme);
|
|
2341
|
+
this.apps = computed(() => this.appsService.apps().filter((app) => app.enabled && app.id), ...(ngDevMode ? [{ debugName: "apps" }] : /* istanbul ignore next */ []));
|
|
2342
|
+
this.router.events
|
|
2343
|
+
.pipe(filter((event) => event instanceof NavigationEnd), takeUntilDestroyed())
|
|
2344
|
+
.subscribe(() => {
|
|
2195
2345
|
this.closeMobileMenu();
|
|
2196
2346
|
});
|
|
2197
2347
|
}
|
|
2198
|
-
ngOnDestroy() {
|
|
2199
|
-
this.navbarItemsSubscription?.unsubscribe();
|
|
2200
|
-
this.sidebarItemsSubscription?.unsubscribe();
|
|
2201
|
-
this.sidebarFooterItemsSubscription?.unsubscribe();
|
|
2202
|
-
}
|
|
2203
|
-
get sidebarVisible$() {
|
|
2204
|
-
return this.store.select(state => state[sidebarsFeatureKey].visible);
|
|
2205
|
-
}
|
|
2206
|
-
get sidearHasLogin$() {
|
|
2207
|
-
return this.store.select(state => state[sidebarsFeatureKey].loginVisible);
|
|
2208
|
-
}
|
|
2209
|
-
get sidearHasSearch$() {
|
|
2210
|
-
return this.store.select(state => state[sidebarsFeatureKey].searchVisible);
|
|
2211
|
-
}
|
|
2212
|
-
get sidebarItems$() {
|
|
2213
|
-
return this.store.select(state => state[sidebarsFeatureKey].items);
|
|
2214
|
-
}
|
|
2215
|
-
setSidearSearchText(text) {
|
|
2216
|
-
this.store.dispatch(SidebarActions.setSearchText({ text }));
|
|
2217
|
-
}
|
|
2218
|
-
setNavbarSearchText(text) {
|
|
2219
|
-
this.store.dispatch(NavbarActions.setSearchText({ text }));
|
|
2220
|
-
}
|
|
2221
|
-
get sidearHasSettings$() {
|
|
2222
|
-
return this.store.select(state => state[sidebarsFeatureKey].settingsVisible);
|
|
2223
|
-
}
|
|
2224
|
-
get sidearAppsVisible$() {
|
|
2225
|
-
return this.store.select(state => state[sidebarsFeatureKey].appsVisible);
|
|
2226
|
-
}
|
|
2227
|
-
get navVisible$() {
|
|
2228
|
-
return this.store.select(state => state[navbarsFeatureKey].visible);
|
|
2229
|
-
}
|
|
2230
|
-
get navSearchVisible$() {
|
|
2231
|
-
return this.store.select(state => state[navbarsFeatureKey].searchVisible);
|
|
2232
|
-
}
|
|
2233
|
-
get navHeader$() {
|
|
2234
|
-
return this.store.select(state => state[navbarsFeatureKey].header);
|
|
2235
|
-
}
|
|
2236
|
-
get isAuthenticated$() {
|
|
2237
|
-
return this.authService.isAuthenticated$;
|
|
2238
|
-
}
|
|
2239
|
-
get user$() {
|
|
2240
|
-
return this.authService.userInfo$;
|
|
2241
|
-
}
|
|
2242
|
-
get navLeftItems$() {
|
|
2243
|
-
return this.store.select(state => state[navbarsFeatureKey].leftItems);
|
|
2244
|
-
}
|
|
2245
|
-
get navRightItems$() {
|
|
2246
|
-
return this.store.select(state => state[navbarsFeatureKey].rightItems);
|
|
2247
|
-
}
|
|
2248
|
-
get theme() {
|
|
2249
|
-
return this.store.selectSignal(state => state[appContextFeatureKey].theme)();
|
|
2250
|
-
}
|
|
2251
|
-
get navbarHasLogin$() {
|
|
2252
|
-
return this.store.select(state => state[navbarsFeatureKey].loginVisible);
|
|
2253
|
-
}
|
|
2254
|
-
get navbarHasSettings$() {
|
|
2255
|
-
return this.store.select(state => state[navbarsFeatureKey].settingsVisible);
|
|
2256
|
-
}
|
|
2257
|
-
get navbarHasApps$() {
|
|
2258
|
-
return this.store.select(state => state[navbarsFeatureKey].appsVisible);
|
|
2259
|
-
}
|
|
2260
|
-
get navbarLayout$() {
|
|
2261
|
-
return this.store.select(state => state[navbarsFeatureKey].actionsLayout);
|
|
2262
|
-
}
|
|
2263
|
-
get apps() {
|
|
2264
|
-
return this.appsService.apps.filter(app => app.enabled && app.id); // Only enabled and initialized apps (with id).
|
|
2265
|
-
}
|
|
2266
|
-
get separatorVisible$() {
|
|
2267
|
-
return this.store.select(state => state[navbarsFeatureKey].separatorVisible);
|
|
2268
|
-
}
|
|
2269
2348
|
loginNav(event) {
|
|
2270
2349
|
event?.preventDefault();
|
|
2271
2350
|
event?.stopPropagation();
|
|
@@ -2285,83 +2364,86 @@ class AppTemplateComponent {
|
|
|
2285
2364
|
this.mobileSettingsMenu()?.goToFirstSlide();
|
|
2286
2365
|
}
|
|
2287
2366
|
}
|
|
2367
|
+
setSidearSearchText(text) {
|
|
2368
|
+
this.store.dispatch(SidebarActions.setSearchText({ text }));
|
|
2369
|
+
}
|
|
2370
|
+
setNavbarSearchText(text) {
|
|
2371
|
+
this.store.dispatch(NavbarActions.setSearchText({ text }));
|
|
2372
|
+
}
|
|
2288
2373
|
closeMobileMenu() {
|
|
2289
2374
|
this.mobileOffcanvas()?.close();
|
|
2290
2375
|
}
|
|
2291
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2292
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: AppTemplateComponent, isStandalone: false, selector: "rlb-app-template", inputs: { modalContainerId: ["modal-container-id", "modalContainerId"], toastContainerIds: ["toast-container-ids", "toastContainerIds"] }, viewQueries: [{ propertyName: "mobileOffcanvas", first: true, predicate: ["mobileOffcanvas"], descendants: true, isSignal: true }, { propertyName: "mobileSettingsMenu", first: true, predicate: ["mobileSettingsMenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"rlb-app\">\n @if (navVisible$ | async) {\n <rlb-navbar [dark]=\"theme === 'dark'\" [showSideBarToggler]=\"(sidebarVisible$ | async)\" expand=\"lg\" class=\"border-bottom py-1 rlb-navbar\">\n @if (navHeader$ | async; as header) {\n <a rlb-navbar-brand href=\"#\">\n\n @if (header.type === 'text') {\n {{ header.text }}\n }\n\n @if (header.type === 'image') {\n <img\n [src]=\"header.src\"\n [alt]=\"header.alt ?? 'Brand'\"\n [height]=\"header.height ?? 40\"\n />\n }\n </a>\n }\n @if (navSearchVisible$ | async) {\n <rlb-navbar-form>\n <rlb-input-group class=\"my-1 mx-3\" validate>\n <rlb-input type=\"search\" class=\"search-input\" placeholder=\"Search\" [(ngModel)]=\"navSearchText\"\n (keyup.enter)=\"setNavbarSearchText(navSearchText)\" name=\"search\" size=\"small\">\n <button after rlb-button outline type=\"submit\" (click)=\"setNavbarSearchText(navSearchText)\" size=\"sm\">\n <i class=\"bi bi-search\"></i>\n </button>\n </rlb-input>\n </rlb-input-group>\n </rlb-navbar-form>\n }\n\n <!-- MOBILE VIEWS -->\n <div rlb-custom-navbar-items class=\"d-flex d-lg-none\">\n @if (isAuthenticated$ | async) {\n <rlb-fab size=\"sm\" outline toggle=\"offcanvas\" toggle-target=\"mobileMenuOffcanvas\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </rlb-fab>\n\n <rlb-offcanvas\n #mobileOffcanvas\n id=\"mobileMenuOffcanvas\"\n [placement]=\"'end'\"\n (statusChange)=\"onMobileMenuStatusChange($event)\"\n >\n <rlb-offcanvas-header class=\"border-bottom\">\n <h5 rlb-offcanvas-title class=\"fw-bold mb-0\">Menu</h5>\n </rlb-offcanvas-header>\n\n <rlb-offcanvas-body class=\"p-0 overflow-x-hidden\">\n\n <!-- Mobile Apps Grid -->\n @if ((navbarHasApps$ | async) && apps.length > 1) {\n <div class=\"border-bottom pb-2\">\n <rlb-app-dropdown-selector\n mode=\"mobile\"\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n </div>\n }\n\n <!-- Mobile Settings Carousel -->\n @if (((isAuthenticated$ | async)) || (navbarHasSettings$ | async)) {\n <div class=\"pt-2\">\n <rlb-settings-dropdown-selector\n mode=\"mobile\"\n #mobileSettingsMenu\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n </div>\n }\n\n </rlb-offcanvas-body>\n </rlb-offcanvas>\n } @else {\n <rlb-fab size=\"sm\" (click)=\"loginNav($event)\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </rlb-fab>\n }\n\n </div>\n\n <rlb-navbar-items>\n @for (navComponent of navLeftItems$ | async; track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | leftComponent\"></ng-container>\n </ng-container>\n }\n </rlb-navbar-items>\n\n <rlb-navbar-items class=\"ms-auto align-items-center\">\n @for (navComponent of navRightItems$ | async; track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | rightComponent\"></ng-container>\n </ng-container>\n }\n @if ((separatorVisible$ | async) && (isAuthenticated$ | async)) {\n <rlb-navbar-separator />\n }\n\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n @if ((navbarLayout$ | async) == 'default') {\n @if ((navbarHasLogin$ | async) && !(isAuthenticated$ | async)) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.login' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if ((navbarHasLogin$ | async) && (isAuthenticated$ | async)) {\n <rlb-navbar-item [router-link]=\"'/profile'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.title') |translate\">\n <i class=\"bi bi-person\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasSettings$ | async) {\n <rlb-navbar-item [router-link]=\"'/settings'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') |translate\">\n <i class=\"bi bi-gear\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.settings.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if ((navbarHasApps$ | async) && apps.length > 1) {\n <rlb-navbar-item [router-link]=\"'/apps'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') |translate\">\n <i class=\"bi bi-grid-3x3-gap-fill\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.apps.button' | translate}}</span>\n </rlb-navbar-item>\n }\n\n } @else if ((navbarLayout$ | async) == 'dropdown') {\n <!-- MODERN DROPDOWN MODE -->\n\n <!--Unauthenticated Login -->\n @if ((navbarHasLogin$ | async) && !(isAuthenticated$ | async)) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') | translate\">\n <i class=\"bi bi-box-arrow-in-left fs-5\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{ 'core.account.login' | translate }}</span>\n </rlb-navbar-item>\n }\n\n <!-- Profile & Settings Account Card -->\n @if (((navbarHasSettings$ | async) && (isAuthenticated$ | async))) {\n <rlb-settings-dropdown-selector\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n }\n\n <!-- Apps Launcher -->\n @if ((navbarHasApps$ | async) && (isAuthenticated$ | async) && apps.length > 1) {\n <rlb-app-dropdown-selector\n [apps]=\"apps\"\n [isAuthenticated]=\"isAuthenticated$ | async\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n }\n }\n </ng-container>\n </rlb-navbar-items>\n </rlb-navbar>\n }\n <div class=\"rlb-main-wrapper\">\n @if ((sidebarVisible$ | async)) {\n <rlb-sidebar [dark]=\"theme === 'dark'\" id=\"sidebar\" class=\"rlb-sidebar\">\n @for (item of (sidebarItems$ | async); track $index) {\n <rlb-sidebar-item\n *roles=\"item.action\"\n [icon]=\"item.icon\" [link]=\"item.url\"\n [title]=\"item.title\" [label]=\"item.label\"\n [badgeCounter]=\"item.badgeCounter\"\n (click)=\"onSideBarItemClick(item)\"\n >\n {{item.label}}\n @for (subitem of item.items || []; track $index) {\n <rlb-sidebar-item\n *roles=\"subitem.action\"\n [icon]=\"subitem.icon\"\n [link]=\"subitem.url\"\n [title]=\"subitem.title\"\n [label]=\"subitem.label\"\n [badgeCounter]=\"subitem.badgeCounter\"\n (click)=\"onSideBarItemClick(subitem)\"\n >\n {{subitem.label}}\n </rlb-sidebar-item>\n }\n </rlb-sidebar-item>\n }\n </rlb-sidebar>\n }\n <div class=\"rlb-content\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n@if (modalContainerId) {\n <rlb-modal-container [id]=\"modalContainerId\" />\n}\n\n@if (toastContainerIds) {\n @if (toastContainerIds.constructor.name === 'Array') {\n @for (toastContainerId of toastContainerIds | asMulti; track toastContainerId) {\n <rlb-toast-container [id]=\"toastContainerId\" />\n }\n } @else {\n <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds | asSingle\" />\n }\n}\n", styles: [".separator{border-left:1px solid;padding:0 2px}\n"], dependencies: [{ kind: "directive", type: i1$6.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2$1.InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "inputId", "extValidation", "enable-validation"] }, { kind: "component", type: i2$1.InputGroupComponent, selector: "rlb-input-group", inputs: ["text", "validate", "size"] }, { kind: "component", type: i2$1.ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: i2$1.RlbFabComponent, selector: "rlb-fab", inputs: ["color", "size", "disabled", "outline", "position"] }, { kind: "directive", type: i2$1.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "directive", type: i2$1.NavbarBrandDirective, selector: "[rlb-navbar-brand]" }, { kind: "directive", type: i2$1.NavbarCustomItemsDirective, selector: "[rlb-custom-navbar-items]" }, { kind: "component", type: i2$1.NavbarComponent, selector: "rlb-navbar", inputs: ["dark", "showSideBarToggler", "color", "placement", "expand", "class", "enable-dropdown-toggler"] }, { kind: "component", type: i2$1.NavbarFormComponent, selector: "rlb-navbar-form", inputs: ["role", "class"] }, { kind: "component", type: i2$1.NavbarItemsComponent, selector: "rlb-navbar-items", inputs: ["scroll", "class"], outputs: ["click"] }, { kind: "component", type: i2$1.NavbarItemComponent, selector: "rlb-navbar-item", inputs: ["disabled", "router-link", "class"], outputs: ["click"] }, { kind: "component", type: i2$1.NavbarSeparatorComponent, selector: "rlb-navbar-separator", inputs: ["class"] }, { kind: "component", type: i2$1.OffcanvasComponent, selector: "rlb-offcanvas", inputs: ["id", "body-scroll", "scroll-backup", "close-manual", "placement", "responsive"], outputs: ["statusChange"] }, { kind: "component", type: i2$1.OffcanvasHeaderComponent, selector: "rlb-offcanvas-header", inputs: ["offcanvasId"] }, { kind: "component", type: i2$1.OffcanvasBodyComponent, selector: "rlb-offcanvas-body" }, { kind: "directive", type: i2$1.ToggleDirective, selector: " button[toggle], a[toggle], rlb-navbar-item[toggle], rlb-button-toolbar[toggle], rlb-fab[toggle],", inputs: ["toggle", "toggle-target", "collapsed", "auto-close"] }, { kind: "component", type: i2$1.SidebarComponent, selector: "rlb-sidebar", inputs: ["dark", "rounded"] }, { kind: "component", type: i2$1.SidebarItemComponent, selector: "rlb-sidebar-item", inputs: ["title", "icon", "label", "link", "badgeCounter"], outputs: ["click"] }, { kind: "component", type: i2$1.ModalContainerComponent, selector: "rlb-modal-container", inputs: ["id"] }, { kind: "component", type: i2$1.ToastContainerComponent, selector: "rlb-toast-container", inputs: ["id"] }, { kind: "component", type: SettingsDropdownSelectorComponent, selector: "rlb-settings-dropdown-selector", inputs: ["mode", "apps", "isAuthenticated"], outputs: ["appSelected"] }, { kind: "component", type: AppDropdownSelectorComponent, selector: "rlb-app-dropdown-selector", inputs: ["mode", "apps", "isAuthenticated"], outputs: ["appSelected"] }, { kind: "directive", type: RlbRole, selector: "[roles]", inputs: ["roles"] }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsMultiPipe, name: "asMulti" }, { kind: "pipe", type: AsSinglePipe, name: "asSingle" }, { kind: "pipe", type: LeftComponentPipe, name: "leftComponent" }, { kind: "pipe", type: RightComponentPipe, name: "rightComponent" }] }); }
|
|
2376
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2377
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AppTemplateComponent, isStandalone: true, selector: "rlb-app-template", inputs: { modalContainerId: { classPropertyName: "modalContainerId", publicName: "modal-container-id", isSignal: true, isRequired: true, transformFunction: null }, breadcrumbInput: { classPropertyName: "breadcrumbInput", publicName: "breadcrumb", isSignal: true, isRequired: false, transformFunction: null }, toastContainerIds: { classPropertyName: "toastContainerIds", publicName: "toast-container-ids", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "mobileOffcanvas", first: true, predicate: ["mobileOffcanvas"], descendants: true, isSignal: true }, { propertyName: "mobileSettingsMenu", first: true, predicate: ["mobileSettingsMenu"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"rlb-app\">\n @if (navVisible()) {\n <rlb-navbar [dark]=\"theme() === 'dark'\" [showSideBarToggler]=\"sidebarVisible()\" expand=\"lg\" class=\"border-bottom py-1 rlb-navbar\">\n @if (navHeader(); as header) {\n <a rlb-navbar-brand href=\"#\">\n\n @if (header.type === 'text') {\n {{ header.text }}\n }\n\n @if (header.type === 'image') {\n <img\n [src]=\"header.src\"\n [alt]=\"header.alt ?? 'Brand'\"\n [height]=\"header.height ?? 40\"\n />\n }\n </a>\n }\n @if (navSearchVisible()) {\n <rlb-navbar-form>\n <rlb-input-group class=\"my-1 mx-3\" validate>\n <rlb-input type=\"search\" class=\"search-input\" placeholder=\"Search\" [(ngModel)]=\"navSearchText\"\n (keyup.enter)=\"setNavbarSearchText(navSearchText)\" name=\"search\" size=\"small\">\n <button after rlb-button outline type=\"submit\" (click)=\"setNavbarSearchText(navSearchText)\" size=\"sm\">\n <i class=\"bi bi-search\"></i>\n </button>\n </rlb-input>\n </rlb-input-group>\n </rlb-navbar-form>\n }\n\n <!-- MOBILE VIEWS -->\n <div rlb-custom-navbar-items class=\"d-flex d-lg-none\">\n @if (isAuthenticated()) {\n <rlb-fab size=\"sm\" outline toggle=\"offcanvas\" toggle-target=\"mobileMenuOffcanvas\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </rlb-fab>\n\n <rlb-offcanvas\n #mobileOffcanvas\n id=\"mobileMenuOffcanvas\"\n [placement]=\"'end'\"\n (statusChange)=\"onMobileMenuStatusChange($event)\"\n >\n <rlb-offcanvas-header class=\"border-bottom\">\n <h5 rlb-offcanvas-title class=\"fw-bold mb-0\">Menu</h5>\n </rlb-offcanvas-header>\n\n <rlb-offcanvas-body class=\"p-0 overflow-x-hidden\">\n\n <!-- Mobile Apps Grid -->\n @if (navbarHasApps() && apps().length > 1) {\n <div class=\"border-bottom pb-2\">\n <rlb-app-dropdown-selector\n mode=\"mobile\"\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n </div>\n }\n\n <!-- Mobile Settings Carousel -->\n @if (isAuthenticated() || navbarHasSettings()) {\n <div class=\"pt-2\">\n <rlb-settings-dropdown-selector\n mode=\"mobile\"\n #mobileSettingsMenu\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n </div>\n }\n\n </rlb-offcanvas-body>\n </rlb-offcanvas>\n } @else {\n <rlb-fab size=\"sm\" (click)=\"loginNav($event)\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </rlb-fab>\n }\n\n </div>\n\n <rlb-navbar-items>\n @for (navComponent of navLeftItems(); track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | leftComponent\"></ng-container>\n </ng-container>\n }\n </rlb-navbar-items>\n\n <rlb-navbar-items class=\"ms-auto align-items-center\">\n @for (navComponent of navRightItems(); track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | rightComponent\"></ng-container>\n </ng-container>\n }\n @if (separatorVisible() && isAuthenticated()) {\n <rlb-navbar-separator />\n }\n\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n @if (navbarLayout() == 'default') {\n @if (navbarHasLogin() && !isAuthenticated()) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.login' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasLogin() && isAuthenticated()) {\n <rlb-navbar-item [router-link]=\"'/profile'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.title') |translate\">\n <i class=\"bi bi-person\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasSettings()) {\n <rlb-navbar-item [router-link]=\"'/settings'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') |translate\">\n <i class=\"bi bi-gear\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.settings.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasApps() && apps().length > 1) {\n <rlb-navbar-item [router-link]=\"'/apps'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') |translate\">\n <i class=\"bi bi-grid-3x3-gap-fill\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.apps.button' | translate}}</span>\n </rlb-navbar-item>\n }\n\n } @else if (navbarLayout() == 'dropdown') {\n <!-- MODERN DROPDOWN MODE -->\n\n <!--Unauthenticated Login -->\n @if (navbarHasLogin() && !isAuthenticated()) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') | translate\">\n <i class=\"bi bi-box-arrow-in-left fs-5\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{ 'core.account.login' | translate }}</span>\n </rlb-navbar-item>\n }\n\n <!-- Profile & Settings Account Card -->\n @if (navbarHasSettings() && isAuthenticated()) {\n <rlb-settings-dropdown-selector\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n }\n\n <!-- Apps Launcher -->\n @if (navbarHasApps() && isAuthenticated() && apps().length > 1) {\n <rlb-app-dropdown-selector\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n }\n }\n </ng-container>\n </rlb-navbar-items>\n </rlb-navbar>\n }\n <div class=\"rlb-main-wrapper\">\n @if (sidebarVisible()) {\n <rlb-sidebar [dark]=\"theme() === 'dark'\" id=\"sidebar\" class=\"rlb-sidebar\">\n @for (item of sidebarItems(); track $index) {\n <rlb-sidebar-item\n *roles=\"item.action\"\n [icon]=\"item.icon\" [link]=\"item.url\"\n [title]=\"item.title\" [label]=\"item.label\"\n [badgeCounter]=\"item.badgeCounter\"\n (click)=\"onSideBarItemClick(item)\"\n >\n {{item.label}}\n @for (subitem of item.items || []; track $index) {\n <rlb-sidebar-item\n *roles=\"subitem.action\"\n [icon]=\"subitem.icon\"\n [link]=\"subitem.url\"\n [title]=\"subitem.title\"\n [label]=\"subitem.label\"\n [badgeCounter]=\"subitem.badgeCounter\"\n (click)=\"onSideBarItemClick(subitem)\"\n >\n {{subitem.label}}\n </rlb-sidebar-item>\n }\n </rlb-sidebar-item>\n }\n </rlb-sidebar>\n }\n <div class=\"rlb-content\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n<!--@if (modalContainerId()) {-->\n<!-- <rlb-modal-container [id]=\"modalContainerId()\" />-->\n<!--}-->\n\n<!--@if (toastContainerIds()) {-->\n<!-- @if (Array.isArray(toastContainerIds())) {-->\n<!-- @for (toastContainerId of toastContainerIds() | asMulti; track toastContainerId) {-->\n<!-- <rlb-toast-container [id]=\"toastContainerId\" />-->\n<!-- }-->\n<!-- } @else {-->\n<!-- <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds() | asSingle\" />-->\n<!-- }-->\n<!--}-->\n", styles: [".separator{border-left:1px solid;padding:0 2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$6.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: NavbarComponent, selector: "rlb-navbar", inputs: ["dark", "showSideBarToggler", "color", "placement", "expand", "class", "enable-dropdown-toggler"] }, { kind: "directive", type: NavbarBrandDirective, selector: "[rlb-navbar-brand]" }, { kind: "component", type: NavbarFormComponent, selector: "rlb-navbar-form", inputs: ["role", "class"] }, { kind: "component", type: NavbarItemsComponent, selector: "rlb-navbar-items", inputs: ["scroll", "class"], outputs: ["click"] }, { kind: "component", type: NavbarItemComponent, selector: "rlb-navbar-item", inputs: ["disabled", "router-link", "class"], outputs: ["click"] }, { kind: "component", type: NavbarSeparatorComponent, selector: "rlb-navbar-separator", inputs: ["class"] }, { kind: "component", type: SidebarComponent, selector: "rlb-sidebar", inputs: ["dark", "rounded"] }, { kind: "component", type: SidebarItemComponent, selector: "rlb-sidebar-item", inputs: ["title", "icon", "label", "link", "badgeCounter"], outputs: ["click"] }, { kind: "component", type: OffcanvasComponent, selector: "rlb-offcanvas", inputs: ["id", "body-scroll", "scroll-backup", "close-manual", "placement", "responsive"], outputs: ["statusChange"] }, { kind: "component", type: OffcanvasHeaderComponent, selector: "rlb-offcanvas-header", inputs: ["offcanvasId"] }, { kind: "component", type: OffcanvasBodyComponent, selector: "rlb-offcanvas-body" }, { kind: "component", type: RlbFabComponent, selector: "rlb-fab", inputs: ["color", "size", "disabled", "outline", "position"] }, { kind: "component", type: InputGroupComponent, selector: "rlb-input-group", inputs: ["text", "validate", "size"] }, { kind: "component", type: InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "inputId", "extValidation", "enable-validation"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "directive", type: RlbRole, selector: "[roles]", inputs: ["roles"] }, { kind: "component", type: AppDropdownSelectorComponent, selector: "rlb-app-dropdown-selector", inputs: ["mode", "apps", "isAuthenticated"], outputs: ["appSelected"] }, { kind: "component", type: SettingsDropdownSelectorComponent, selector: "rlb-settings-dropdown-selector", inputs: ["mode", "apps", "isAuthenticated"], outputs: ["appSelected"] }, { kind: "component", type: ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "directive", type: ToggleDirective, selector: " button[toggle], a[toggle], rlb-navbar-item[toggle], rlb-button-toolbar[toggle], rlb-fab[toggle],", inputs: ["toggle", "toggle-target", "collapsed", "auto-close"] }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }, { kind: "pipe", type: LeftComponentPipe, name: "leftComponent" }, { kind: "pipe", type: RightComponentPipe, name: "rightComponent" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2293
2378
|
}
|
|
2294
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2379
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppTemplateComponent, decorators: [{
|
|
2295
2380
|
type: Component,
|
|
2296
|
-
args: [{ selector: 'rlb-app-template',
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2381
|
+
args: [{ selector: 'rlb-app-template', imports: [
|
|
2382
|
+
CommonModule,
|
|
2383
|
+
FormsModule,
|
|
2384
|
+
RouterModule,
|
|
2385
|
+
TranslateModule,
|
|
2386
|
+
NgComponentOutlet,
|
|
2387
|
+
NavbarComponent,
|
|
2388
|
+
NavbarBrandDirective,
|
|
2389
|
+
NavbarFormComponent,
|
|
2390
|
+
NavbarItemsComponent,
|
|
2391
|
+
NavbarItemComponent,
|
|
2392
|
+
NavbarSeparatorComponent,
|
|
2393
|
+
SidebarComponent,
|
|
2394
|
+
SidebarItemComponent,
|
|
2395
|
+
OffcanvasComponent,
|
|
2396
|
+
OffcanvasHeaderComponent,
|
|
2397
|
+
OffcanvasBodyComponent,
|
|
2398
|
+
RlbFabComponent,
|
|
2399
|
+
InputGroupComponent,
|
|
2400
|
+
InputComponent,
|
|
2401
|
+
TooltipDirective,
|
|
2402
|
+
LeftComponentPipe,
|
|
2403
|
+
RightComponentPipe,
|
|
2404
|
+
RlbRole,
|
|
2405
|
+
AppDropdownSelectorComponent,
|
|
2406
|
+
SettingsDropdownSelectorComponent,
|
|
2407
|
+
ButtonComponent,
|
|
2408
|
+
ToggleDirective,
|
|
2409
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"rlb-app\">\n @if (navVisible()) {\n <rlb-navbar [dark]=\"theme() === 'dark'\" [showSideBarToggler]=\"sidebarVisible()\" expand=\"lg\" class=\"border-bottom py-1 rlb-navbar\">\n @if (navHeader(); as header) {\n <a rlb-navbar-brand href=\"#\">\n\n @if (header.type === 'text') {\n {{ header.text }}\n }\n\n @if (header.type === 'image') {\n <img\n [src]=\"header.src\"\n [alt]=\"header.alt ?? 'Brand'\"\n [height]=\"header.height ?? 40\"\n />\n }\n </a>\n }\n @if (navSearchVisible()) {\n <rlb-navbar-form>\n <rlb-input-group class=\"my-1 mx-3\" validate>\n <rlb-input type=\"search\" class=\"search-input\" placeholder=\"Search\" [(ngModel)]=\"navSearchText\"\n (keyup.enter)=\"setNavbarSearchText(navSearchText)\" name=\"search\" size=\"small\">\n <button after rlb-button outline type=\"submit\" (click)=\"setNavbarSearchText(navSearchText)\" size=\"sm\">\n <i class=\"bi bi-search\"></i>\n </button>\n </rlb-input>\n </rlb-input-group>\n </rlb-navbar-form>\n }\n\n <!-- MOBILE VIEWS -->\n <div rlb-custom-navbar-items class=\"d-flex d-lg-none\">\n @if (isAuthenticated()) {\n <rlb-fab size=\"sm\" outline toggle=\"offcanvas\" toggle-target=\"mobileMenuOffcanvas\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </rlb-fab>\n\n <rlb-offcanvas\n #mobileOffcanvas\n id=\"mobileMenuOffcanvas\"\n [placement]=\"'end'\"\n (statusChange)=\"onMobileMenuStatusChange($event)\"\n >\n <rlb-offcanvas-header class=\"border-bottom\">\n <h5 rlb-offcanvas-title class=\"fw-bold mb-0\">Menu</h5>\n </rlb-offcanvas-header>\n\n <rlb-offcanvas-body class=\"p-0 overflow-x-hidden\">\n\n <!-- Mobile Apps Grid -->\n @if (navbarHasApps() && apps().length > 1) {\n <div class=\"border-bottom pb-2\">\n <rlb-app-dropdown-selector\n mode=\"mobile\"\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n </div>\n }\n\n <!-- Mobile Settings Carousel -->\n @if (isAuthenticated() || navbarHasSettings()) {\n <div class=\"pt-2\">\n <rlb-settings-dropdown-selector\n mode=\"mobile\"\n #mobileSettingsMenu\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n </div>\n }\n\n </rlb-offcanvas-body>\n </rlb-offcanvas>\n } @else {\n <rlb-fab size=\"sm\" (click)=\"loginNav($event)\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </rlb-fab>\n }\n\n </div>\n\n <rlb-navbar-items>\n @for (navComponent of navLeftItems(); track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | leftComponent\"></ng-container>\n </ng-container>\n }\n </rlb-navbar-items>\n\n <rlb-navbar-items class=\"ms-auto align-items-center\">\n @for (navComponent of navRightItems(); track navComponent) {\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n <ng-container *ngComponentOutlet=\"navComponent | rightComponent\"></ng-container>\n </ng-container>\n }\n @if (separatorVisible() && isAuthenticated()) {\n <rlb-navbar-separator />\n }\n\n <ng-container ngProjectAs=\"rlb-navbar-item\">\n @if (navbarLayout() == 'default') {\n @if (navbarHasLogin() && !isAuthenticated()) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') |translate\">\n <i class=\" bi bi-box-arrow-in-left\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.login' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasLogin() && isAuthenticated()) {\n <rlb-navbar-item [router-link]=\"'/profile'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.title') |translate\">\n <i class=\"bi bi-person\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.account.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasSettings()) {\n <rlb-navbar-item [router-link]=\"'/settings'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.settings.title') |translate\">\n <i class=\"bi bi-gear\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.settings.title' | translate}}</span>\n </rlb-navbar-item>\n }\n\n @if (navbarHasApps() && apps().length > 1) {\n <rlb-navbar-item [router-link]=\"'/apps'\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.apps.button') |translate\">\n <i class=\"bi bi-grid-3x3-gap-fill\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{'core.apps.button' | translate}}</span>\n </rlb-navbar-item>\n }\n\n } @else if (navbarLayout() == 'dropdown') {\n <!-- MODERN DROPDOWN MODE -->\n\n <!--Unauthenticated Login -->\n @if (navbarHasLogin() && !isAuthenticated()) {\n <rlb-navbar-item (click)=\"loginNav($event)\">\n <span tooltip-placement=\"bottom\" [tooltip]=\"('core.account.login') | translate\">\n <i class=\"bi bi-box-arrow-in-left fs-5\"></i>\n </span>\n <span class=\"ms-1 d-lg-none\">{{ 'core.account.login' | translate }}</span>\n </rlb-navbar-item>\n }\n\n <!-- Profile & Settings Account Card -->\n @if (navbarHasSettings() && isAuthenticated()) {\n <rlb-settings-dropdown-selector\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'settings')\"\n />\n }\n\n <!-- Apps Launcher -->\n @if (navbarHasApps() && isAuthenticated() && apps().length > 1) {\n <rlb-app-dropdown-selector\n [apps]=\"apps()\"\n [isAuthenticated]=\"isAuthenticated()\"\n (appSelected)=\"selectApp($event, 'app')\"\n />\n }\n }\n </ng-container>\n </rlb-navbar-items>\n </rlb-navbar>\n }\n <div class=\"rlb-main-wrapper\">\n @if (sidebarVisible()) {\n <rlb-sidebar [dark]=\"theme() === 'dark'\" id=\"sidebar\" class=\"rlb-sidebar\">\n @for (item of sidebarItems(); track $index) {\n <rlb-sidebar-item\n *roles=\"item.action\"\n [icon]=\"item.icon\" [link]=\"item.url\"\n [title]=\"item.title\" [label]=\"item.label\"\n [badgeCounter]=\"item.badgeCounter\"\n (click)=\"onSideBarItemClick(item)\"\n >\n {{item.label}}\n @for (subitem of item.items || []; track $index) {\n <rlb-sidebar-item\n *roles=\"subitem.action\"\n [icon]=\"subitem.icon\"\n [link]=\"subitem.url\"\n [title]=\"subitem.title\"\n [label]=\"subitem.label\"\n [badgeCounter]=\"subitem.badgeCounter\"\n (click)=\"onSideBarItemClick(subitem)\"\n >\n {{subitem.label}}\n </rlb-sidebar-item>\n }\n </rlb-sidebar-item>\n }\n </rlb-sidebar>\n }\n <div class=\"rlb-content\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n<!--@if (modalContainerId()) {-->\n<!-- <rlb-modal-container [id]=\"modalContainerId()\" />-->\n<!--}-->\n\n<!--@if (toastContainerIds()) {-->\n<!-- @if (Array.isArray(toastContainerIds())) {-->\n<!-- @for (toastContainerId of toastContainerIds() | asMulti; track toastContainerId) {-->\n<!-- <rlb-toast-container [id]=\"toastContainerId\" />-->\n<!-- }-->\n<!-- } @else {-->\n<!-- <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds() | asSingle\" />-->\n<!-- }-->\n<!--}-->\n", styles: [".separator{border-left:1px solid;padding:0 2px}\n"] }]
|
|
2410
|
+
}], ctorParameters: () => [], propDecorators: { modalContainerId: [{ type: i0.Input, args: [{ isSignal: true, alias: "modal-container-id", required: true }] }], breadcrumbInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "breadcrumb", required: false }] }], toastContainerIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "toast-container-ids", required: true }] }], mobileOffcanvas: [{ type: i0.ViewChild, args: ['mobileOffcanvas', { isSignal: true }] }], mobileSettingsMenu: [{ type: i0.ViewChild, args: ['mobileSettingsMenu', { isSignal: true }] }] } });
|
|
2307
2411
|
|
|
2308
2412
|
class BaseComponent {
|
|
2309
|
-
constructor(
|
|
2310
|
-
this.breakpointObserver =
|
|
2311
|
-
this.platformId =
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
}
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: BaseComponent, isStandalone: false, selector: "rlb-base-template", inputs: { breadcrumb: "breadcrumb", title: "title", subtitle: "subtitle" }, ngImport: i0, template: "<div class=\" mb-3\">\n @if (!(isHandset$ | async)) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"col-xl-8 col-lg-10 col-md-12 col-sm-12 col-xs-12 mx-auto\">\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n @if (breadcrumb) {\n <rlb-breadcrumb [items]=\"breadcrumb\"></rlb-breadcrumb>\n }\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title}}\n </h1>\n </div>\n </div>\n @if (subtitle) {\n <div class=\"row\">\n <div class=\"col-12 pb-12\">\n <span class=\"d-block text-h6 text-center\">\n {{subtitle}}\n </span>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <!--old ng-template #mobileMode-->\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title}}\n </h1>\n </div>\n </div>\n @if (subtitle) {\n <div class=\"row\">\n <div class=\"col-12 pb-7\">\n <div class=\"d-block text-h6 text-center\">\n {{subtitle}}\n </div>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2$1.BreadcrumbComponent, selector: "rlb-breadcrumb", inputs: ["divider", "items", "cssClasses"] }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }] }); }
|
|
2325
|
-
}
|
|
2326
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: BaseComponent, decorators: [{
|
|
2413
|
+
constructor() {
|
|
2414
|
+
this.breakpointObserver = inject(BreakpointObserver);
|
|
2415
|
+
this.platformId = inject(PLATFORM_ID);
|
|
2416
|
+
this.breadcrumbInput = input(undefined, { ...(ngDevMode ? { debugName: "breadcrumbInput" } : /* istanbul ignore next */ {}), alias: 'breadcrumb' });
|
|
2417
|
+
this.breadcrumb = computed(() => this.breadcrumbInput() ?? [], ...(ngDevMode ? [{ debugName: "breadcrumb" }] : /* istanbul ignore next */ []));
|
|
2418
|
+
this.title = input.required(...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
|
|
2419
|
+
this.subtitle = input(...(ngDevMode ? [undefined, { debugName: "subtitle" }] : /* istanbul ignore next */ []));
|
|
2420
|
+
this.isHandset = toSignal(isPlatformServer(this.platformId)
|
|
2421
|
+
? of(true)
|
|
2422
|
+
: this.breakpointObserver.observe(Breakpoints.Handset).pipe(map(result => result.matches)), { initialValue: true });
|
|
2423
|
+
}
|
|
2424
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2425
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: BaseComponent, isStandalone: true, selector: "rlb-base-template", inputs: { breadcrumbInput: { classPropertyName: "breadcrumbInput", publicName: "breadcrumb", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\" mb-3\">\n @if (!isHandset()) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"col-xl-8 col-lg-10 col-md-12 col-sm-12 col-xs-12 mx-auto\">\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n @if (breadcrumb()) {\n <rlb-breadcrumb [items]=\"breadcrumb()\"></rlb-breadcrumb>\n }\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title()}}\n </h1>\n </div>\n </div>\n @if (subtitle()) {\n <div class=\"row\">\n <div class=\"col-12 pb-12\">\n <span class=\"d-block text-h6 text-center\">\n {{subtitle()}}\n </span>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <!--old ng-template #mobileMode-->\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title()}}\n </h1>\n </div>\n </div>\n @if (subtitle()) {\n <div class=\"row\">\n <div class=\"col-12 pb-7\">\n <div class=\"d-block text-h6 text-center\">\n {{subtitle()}}\n </div>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BreadcrumbComponent, selector: "rlb-breadcrumb", inputs: ["divider", "items", "cssClasses"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2426
|
+
}
|
|
2427
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: BaseComponent, decorators: [{
|
|
2327
2428
|
type: Component,
|
|
2328
|
-
args: [{ selector: 'rlb-base-template',
|
|
2329
|
-
}],
|
|
2330
|
-
type: Inject,
|
|
2331
|
-
args: [PLATFORM_ID]
|
|
2332
|
-
}] }], propDecorators: { breadcrumb: [{
|
|
2333
|
-
type: Input
|
|
2334
|
-
}], title: [{
|
|
2335
|
-
type: Input
|
|
2336
|
-
}], subtitle: [{
|
|
2337
|
-
type: Input
|
|
2338
|
-
}] } });
|
|
2429
|
+
args: [{ selector: 'rlb-base-template', imports: [NgTemplateOutlet, BreadcrumbComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\" mb-3\">\n @if (!isHandset()) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"col-xl-8 col-lg-10 col-md-12 col-sm-12 col-xs-12 mx-auto\">\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n @if (breadcrumb()) {\n <rlb-breadcrumb [items]=\"breadcrumb()\"></rlb-breadcrumb>\n }\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title()}}\n </h1>\n </div>\n </div>\n @if (subtitle()) {\n <div class=\"row\">\n <div class=\"col-12 pb-12\">\n <span class=\"d-block text-h6 text-center\">\n {{subtitle()}}\n </span>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <!--old ng-template #mobileMode-->\n <div class=\"row\">\n <div class=\"col-12 pb-0\">\n <h1 class=\"pt-5 pb-0 text-center\">\n {{title()}}\n </h1>\n </div>\n </div>\n @if (subtitle()) {\n <div class=\"row\">\n <div class=\"col-12 pb-7\">\n <div class=\"d-block text-h6 text-center\">\n {{subtitle()}}\n </div>\n </div>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>\n" }]
|
|
2430
|
+
}], propDecorators: { breadcrumbInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "breadcrumb", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }] } });
|
|
2339
2431
|
|
|
2340
2432
|
class ContentComponent {
|
|
2341
|
-
constructor(
|
|
2342
|
-
this.breakpointObserver =
|
|
2343
|
-
this.platformId =
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
return of(true);
|
|
2348
|
-
}
|
|
2349
|
-
else {
|
|
2350
|
-
return this.breakpointObserver.observe(Breakpoints.Handset)
|
|
2351
|
-
.pipe(map(result => result.matches), shareReplay());
|
|
2352
|
-
}
|
|
2433
|
+
constructor() {
|
|
2434
|
+
this.breakpointObserver = inject(BreakpointObserver);
|
|
2435
|
+
this.platformId = inject(PLATFORM_ID);
|
|
2436
|
+
this.isHandset = toSignal(isPlatformServer(this.platformId)
|
|
2437
|
+
? of(true)
|
|
2438
|
+
: this.breakpointObserver.observe(Breakpoints.Handset).pipe(map(result => result.matches)), { initialValue: true });
|
|
2353
2439
|
}
|
|
2354
|
-
|
|
2355
|
-
static { this.ɵ
|
|
2356
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: ContentComponent, isStandalone: false, selector: "rlb-content-template", ngImport: i0, template: "<div class=\" mb-3\">\n @if (!(isHandset$ | async)) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"mx-auto col-sm-12 col-md-8 col-lg-9 col-xl-8\">\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>", styles: [""], dependencies: [{ kind: "directive", type: i1$6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }] }); }
|
|
2440
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2441
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ContentComponent, isStandalone: true, selector: "rlb-content-template", ngImport: i0, template: "<div class=\" mb-3\">\n @if (!isHandset()) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"mx-auto col-sm-12 col-md-8 col-lg-9 col-xl-8\">\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2357
2442
|
}
|
|
2358
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2443
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ContentComponent, decorators: [{
|
|
2359
2444
|
type: Component,
|
|
2360
|
-
args: [{ selector: 'rlb-content-template',
|
|
2361
|
-
}]
|
|
2362
|
-
type: Inject,
|
|
2363
|
-
args: [PLATFORM_ID]
|
|
2364
|
-
}] }] });
|
|
2445
|
+
args: [{ selector: 'rlb-content-template', imports: [NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\" mb-3\">\n @if (!isHandset()) {\n <div class=\"container-fluid\">\n <div class=\"row mt-1\">\n <div class=\"mx-auto col-sm-12 col-md-8 col-lg-9 col-xl-8\">\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"default\"></ng-container>\n </div>\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"all\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"mobile\"></ng-container>\n }\n</div>\n\n\n<ng-template #all>\n <ng-content select=\"[all]\"></ng-content>\n</ng-template>\n\n<ng-template #default>\n <ng-content select=\"[default]\"></ng-content>\n</ng-template>\n\n<ng-template #mobile>\n <ng-content select=\"[mobile]\"></ng-content>\n</ng-template>" }]
|
|
2446
|
+
}] });
|
|
2365
2447
|
|
|
2366
2448
|
class TruncatePipe {
|
|
2367
2449
|
transform(value, limit = 25, completeWords = false, ellipsis = '...') {
|
|
@@ -2372,14 +2454,13 @@ class TruncatePipe {
|
|
|
2372
2454
|
}
|
|
2373
2455
|
return value.length > limit ? value.slice(0, limit) + ellipsis : value;
|
|
2374
2456
|
}
|
|
2375
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2376
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.
|
|
2457
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TruncatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
2458
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: TruncatePipe, isStandalone: true, name: "truncate" }); }
|
|
2377
2459
|
}
|
|
2378
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2460
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TruncatePipe, decorators: [{
|
|
2379
2461
|
type: Pipe,
|
|
2380
2462
|
args: [{
|
|
2381
|
-
name: 'truncate'
|
|
2382
|
-
standalone: false
|
|
2463
|
+
name: 'truncate'
|
|
2383
2464
|
}]
|
|
2384
2465
|
}] });
|
|
2385
2466
|
|
|
@@ -2404,34 +2485,36 @@ class AutolinkPipe {
|
|
|
2404
2485
|
return '' + space + link;
|
|
2405
2486
|
});
|
|
2406
2487
|
}
|
|
2407
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2408
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.
|
|
2488
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AutolinkPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
2489
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AutolinkPipe, isStandalone: true, name: "autolink" }); }
|
|
2409
2490
|
}
|
|
2410
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2491
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AutolinkPipe, decorators: [{
|
|
2411
2492
|
type: Pipe,
|
|
2412
2493
|
args: [{
|
|
2413
|
-
name: 'autolink'
|
|
2414
|
-
standalone: false
|
|
2494
|
+
name: 'autolink'
|
|
2415
2495
|
}]
|
|
2416
2496
|
}] });
|
|
2417
2497
|
|
|
2418
2498
|
class AppContainerComponent {
|
|
2419
|
-
constructor(
|
|
2420
|
-
this.
|
|
2421
|
-
this.store = store;
|
|
2422
|
-
this.router = router;
|
|
2423
|
-
this.storage = storage;
|
|
2424
|
-
this.pwaUpdaterService = pwaUpdaterService;
|
|
2425
|
-
this.appsService = appsService;
|
|
2426
|
-
this.loggerService = loggerService;
|
|
2499
|
+
constructor() {
|
|
2500
|
+
this.Array = Array;
|
|
2427
2501
|
this.templateSubject = new BehaviorSubject('app');
|
|
2502
|
+
this.modalContainerId = input.required({ ...(ngDevMode ? { debugName: "modalContainerId" } : /* istanbul ignore next */ {}), alias: 'modal-container-id' });
|
|
2503
|
+
this.toastContainerIds = input.required({ ...(ngDevMode ? { debugName: "toastContainerIds" } : /* istanbul ignore next */ {}), alias: 'toast-container-ids' });
|
|
2504
|
+
this.env = inject(RLB_CFG_ENV);
|
|
2505
|
+
this.store = inject((Store));
|
|
2506
|
+
this.router = inject(Router);
|
|
2507
|
+
this.storage = inject(AppStorageService);
|
|
2508
|
+
this.pwaUpdaterService = inject(PwaUpdaterService);
|
|
2509
|
+
this.appsService = inject(AppsService);
|
|
2510
|
+
this.loggerService = inject(AppLoggerService);
|
|
2428
2511
|
this.logger = this.loggerService.for(this.constructor.name);
|
|
2429
2512
|
const theme = (this.storage.readLocal('theme') || 'dark');
|
|
2430
2513
|
this.store.dispatch(AppContextActions.setTheme({ theme }));
|
|
2431
2514
|
this.store.dispatch(AppContextActions.setLanguage({ language: this.storage.readLocal('locale') || 'en' }));
|
|
2432
2515
|
this.store
|
|
2433
2516
|
.select((state) => state[appContextFeatureKey].currentApp)
|
|
2434
|
-
.pipe(distinctUntilChanged())
|
|
2517
|
+
.pipe(distinctUntilChanged(), takeUntilDestroyed())
|
|
2435
2518
|
.subscribe(async (currentApp) => {
|
|
2436
2519
|
this.logger.info('currentApp:', currentApp);
|
|
2437
2520
|
if (!currentApp)
|
|
@@ -2457,39 +2540,25 @@ class AppContainerComponent {
|
|
|
2457
2540
|
}
|
|
2458
2541
|
});
|
|
2459
2542
|
this.router.events
|
|
2460
|
-
.pipe(filter(event => event instanceof RoutesRecognized), map((event) => event?.state?.root?.firstChild?.data?.['template'] || 'app'), map(o => o), tap((template) => this.templateSubject.next(template))).subscribe();
|
|
2543
|
+
.pipe(filter(event => event instanceof RoutesRecognized), map((event) => event?.state?.root?.firstChild?.data?.['template'] || 'app'), map(o => o), tap((template) => this.templateSubject.next(template)), takeUntilDestroyed()).subscribe();
|
|
2544
|
+
if (this.env.pwaUpdateEnabled) {
|
|
2545
|
+
this.pwaUpdaterService.checkWithDialog().pipe(takeUntilDestroyed()).subscribe();
|
|
2546
|
+
}
|
|
2461
2547
|
}
|
|
2462
2548
|
get template$() {
|
|
2463
2549
|
return this.templateSubject.asObservable();
|
|
2464
2550
|
}
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
}
|
|
2468
|
-
ngOnInit() {
|
|
2469
|
-
if (this.env.pwaUpdateEnabled) {
|
|
2470
|
-
this.swUpdateSubscription = this.pwaUpdaterService.checkWithDialog().subscribe();
|
|
2471
|
-
}
|
|
2472
|
-
}
|
|
2473
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppContainerComponent, deps: [{ token: RLB_CFG_ENV }, { token: i1$1.Store }, { token: i2.Router }, { token: AppStorageService }, { token: PwaUpdaterService }, { token: AppsService }, { token: AppLoggerService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2474
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: AppContainerComponent, isStandalone: false, selector: "rlb-app-container", inputs: { modalContainerId: ["modal-container-id", "modalContainerId"], toastContainerIds: ["toast-container-ids", "toastContainerIds"] }, ngImport: i0, template: "@if ((template$ | async) === 'app') {\n <rlb-app-template>\n <router-outlet />\n </rlb-app-template>\n}\n@if ((template$ | async) === 'basic') {\n <router-outlet />\n}\n\n\n@if (modalContainerId) {\n <rlb-modal-container [id]=\"modalContainerId\" />\n}\n\n@if (toastContainerIds) {\n @if (toastContainerIds.constructor.name === 'Array') {\n @for (toastContainerId of toastContainerIds | asMulti; track toastContainerId) {\n <rlb-toast-container [id]=\"toastContainerId\" />\n }\n } @else {\n <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds | asSingle\" />\n }\n}", dependencies: [{ kind: "component", type: i2$1.ModalContainerComponent, selector: "rlb-modal-container", inputs: ["id"] }, { kind: "component", type: i2$1.ToastContainerComponent, selector: "rlb-toast-container", inputs: ["id"] }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AppTemplateComponent, selector: "rlb-app-template", inputs: ["modal-container-id", "toast-container-ids"] }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }, { kind: "pipe", type: AsMultiPipe, name: "asMulti" }, { kind: "pipe", type: AsSinglePipe, name: "asSingle" }] }); }
|
|
2551
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2552
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AppContainerComponent, isStandalone: true, selector: "rlb-app-container", inputs: { modalContainerId: { classPropertyName: "modalContainerId", publicName: "modal-container-id", isSignal: true, isRequired: true, transformFunction: null }, toastContainerIds: { classPropertyName: "toastContainerIds", publicName: "toast-container-ids", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if ((template$ | async) === 'app') {\n <rlb-app-template [modal-container-id]=\"modalContainerId()\" [toast-container-ids]=\"toastContainerIds()\">\n <router-outlet />\n </rlb-app-template>\n}\n@if ((template$ | async) === 'basic') {\n <router-outlet />\n}\n\n\n@if (modalContainerId()) {\n <rlb-modal-container [id]=\"modalContainerId()\" />\n}\n\n@if (toastContainerIds()) {\n @if (Array.isArray(toastContainerIds())) {\n @for (toastContainerId of toastContainerIds() | asMulti; track toastContainerId) {\n <rlb-toast-container [id]=\"toastContainerId\" />\n }\n } @else {\n <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds() | asSingle\" />\n }\n}", dependencies: [{ kind: "component", type: AppTemplateComponent, selector: "rlb-app-template", inputs: ["modal-container-id", "breadcrumb", "toast-container-ids"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i5.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: ModalContainerComponent, selector: "rlb-modal-container", inputs: ["id"] }, { kind: "component", type: ToastContainerComponent, selector: "rlb-toast-container", inputs: ["id"] }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }, { kind: "pipe", type: AsMultiPipe, name: "asMulti" }, { kind: "pipe", type: AsSinglePipe, name: "asSingle" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2475
2553
|
}
|
|
2476
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2554
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContainerComponent, decorators: [{
|
|
2477
2555
|
type: Component,
|
|
2478
|
-
args: [{ selector: 'rlb-app-container',
|
|
2479
|
-
}], ctorParameters: () => [{ type:
|
|
2480
|
-
type: Inject,
|
|
2481
|
-
args: [RLB_CFG_ENV]
|
|
2482
|
-
}] }, { type: i1$1.Store }, { type: i2.Router }, { type: AppStorageService }, { type: PwaUpdaterService }, { type: AppsService }, { type: AppLoggerService }], propDecorators: { modalContainerId: [{
|
|
2483
|
-
type: Input,
|
|
2484
|
-
args: ['modal-container-id']
|
|
2485
|
-
}], toastContainerIds: [{
|
|
2486
|
-
type: Input,
|
|
2487
|
-
args: ['toast-container-ids']
|
|
2488
|
-
}] } });
|
|
2556
|
+
args: [{ selector: 'rlb-app-container', imports: [AppTemplateComponent, CommonModule, RouterModule, ModalContainerComponent, ToastContainerComponent, AsMultiPipe, AsSinglePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if ((template$ | async) === 'app') {\n <rlb-app-template [modal-container-id]=\"modalContainerId()\" [toast-container-ids]=\"toastContainerIds()\">\n <router-outlet />\n </rlb-app-template>\n}\n@if ((template$ | async) === 'basic') {\n <router-outlet />\n}\n\n\n@if (modalContainerId()) {\n <rlb-modal-container [id]=\"modalContainerId()\" />\n}\n\n@if (toastContainerIds()) {\n @if (Array.isArray(toastContainerIds())) {\n @for (toastContainerId of toastContainerIds() | asMulti; track toastContainerId) {\n <rlb-toast-container [id]=\"toastContainerId\" />\n }\n } @else {\n <rlb-toast-container class=\"position-fixed bottom-0 end-0 p-3\" [id]=\"toastContainerIds() | asSingle\" />\n }\n}" }]
|
|
2557
|
+
}], ctorParameters: () => [], propDecorators: { modalContainerId: [{ type: i0.Input, args: [{ isSignal: true, alias: "modal-container-id", required: true }] }], toastContainerIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "toast-container-ids", required: true }] }] } });
|
|
2489
2558
|
|
|
2490
2559
|
class ForbiddenComponent {
|
|
2491
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2492
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.
|
|
2560
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ForbiddenComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2561
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: ForbiddenComponent, isStandalone: true, selector: "rlb-forbidden", ngImport: i0, template: `<div class="container" style="height:calc(100vh - 58px);">
|
|
2493
2562
|
<div class="align-center">
|
|
2494
2563
|
<div class="text-center">
|
|
2495
2564
|
<h1 class="text-primary">
|
|
@@ -2502,13 +2571,13 @@ class ForbiddenComponent {
|
|
|
2502
2571
|
</div>
|
|
2503
2572
|
</div>
|
|
2504
2573
|
</div>
|
|
2505
|
-
`, isInline: true, dependencies: [{ kind: "pipe", type: i1$
|
|
2574
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2506
2575
|
}
|
|
2507
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2576
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ForbiddenComponent, decorators: [{
|
|
2508
2577
|
type: Component,
|
|
2509
2578
|
args: [{
|
|
2510
2579
|
selector: 'rlb-forbidden',
|
|
2511
|
-
|
|
2580
|
+
imports: [TranslateModule],
|
|
2512
2581
|
template: `<div class="container" style="height:calc(100vh - 58px);">
|
|
2513
2582
|
<div class="align-center">
|
|
2514
2583
|
<div class="text-center">
|
|
@@ -2522,14 +2591,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
2522
2591
|
</div>
|
|
2523
2592
|
</div>
|
|
2524
2593
|
</div>
|
|
2525
|
-
|
|
2594
|
+
`,
|
|
2595
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
2526
2596
|
}]
|
|
2527
2597
|
}] });
|
|
2528
2598
|
|
|
2529
2599
|
class RlbAppModule {
|
|
2530
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2531
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.
|
|
2532
|
-
|
|
2600
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
2601
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, imports: [CommonModule,
|
|
2602
|
+
FormsModule,
|
|
2603
|
+
ReactiveFormsModule,
|
|
2604
|
+
TranslateModule,
|
|
2605
|
+
RlbBootstrapModule,
|
|
2606
|
+
RouterModule,
|
|
2607
|
+
// standalone
|
|
2533
2608
|
CmsContentComponent,
|
|
2534
2609
|
CookiesComponent,
|
|
2535
2610
|
NotFoundComponent,
|
|
@@ -2537,7 +2612,6 @@ class RlbAppModule {
|
|
|
2537
2612
|
SupportComponent,
|
|
2538
2613
|
TermsAndConditionsComponent,
|
|
2539
2614
|
ForbiddenComponent,
|
|
2540
|
-
// pipes
|
|
2541
2615
|
CmsPipe,
|
|
2542
2616
|
AsMultiPipe,
|
|
2543
2617
|
AsSinglePipe,
|
|
@@ -2545,7 +2619,6 @@ class RlbAppModule {
|
|
|
2545
2619
|
RightComponentPipe,
|
|
2546
2620
|
TruncatePipe,
|
|
2547
2621
|
AutolinkPipe,
|
|
2548
|
-
// templates
|
|
2549
2622
|
BaseComponent,
|
|
2550
2623
|
CmsComponent,
|
|
2551
2624
|
ContentComponent,
|
|
@@ -2553,13 +2626,7 @@ class RlbAppModule {
|
|
|
2553
2626
|
AppContainerComponent,
|
|
2554
2627
|
SettingsDropdownSelectorComponent,
|
|
2555
2628
|
AppDropdownSelectorComponent,
|
|
2556
|
-
|
|
2557
|
-
RlbRole], imports: [CommonModule,
|
|
2558
|
-
FormsModule,
|
|
2559
|
-
ReactiveFormsModule,
|
|
2560
|
-
TranslateModule,
|
|
2561
|
-
RlbBootstrapModule,
|
|
2562
|
-
RouterModule], exports: [
|
|
2629
|
+
RlbRole], exports: [
|
|
2563
2630
|
// pipes
|
|
2564
2631
|
CmsPipe,
|
|
2565
2632
|
AsMultiPipe,
|
|
@@ -2581,49 +2648,36 @@ class RlbAppModule {
|
|
|
2581
2648
|
FormsModule,
|
|
2582
2649
|
// directives
|
|
2583
2650
|
RlbRole] }); }
|
|
2584
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.
|
|
2651
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, imports: [CommonModule,
|
|
2585
2652
|
FormsModule,
|
|
2586
2653
|
ReactiveFormsModule,
|
|
2587
2654
|
TranslateModule,
|
|
2588
2655
|
RlbBootstrapModule,
|
|
2589
|
-
RouterModule,
|
|
2656
|
+
RouterModule,
|
|
2657
|
+
// standalone
|
|
2658
|
+
CmsContentComponent,
|
|
2659
|
+
CookiesComponent,
|
|
2660
|
+
NotFoundComponent,
|
|
2661
|
+
PrivacyComponent,
|
|
2662
|
+
SupportComponent,
|
|
2663
|
+
TermsAndConditionsComponent,
|
|
2664
|
+
ForbiddenComponent,
|
|
2665
|
+
BaseComponent,
|
|
2666
|
+
CmsComponent,
|
|
2667
|
+
AppTemplateComponent,
|
|
2668
|
+
AppContainerComponent,
|
|
2669
|
+
SettingsDropdownSelectorComponent,
|
|
2670
|
+
AppDropdownSelectorComponent,
|
|
2590
2671
|
// modules
|
|
2591
2672
|
TranslateModule,
|
|
2592
2673
|
RlbBootstrapModule,
|
|
2593
2674
|
RouterModule,
|
|
2594
2675
|
FormsModule] }); }
|
|
2595
2676
|
}
|
|
2596
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2677
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RlbAppModule, decorators: [{
|
|
2597
2678
|
type: NgModule,
|
|
2598
2679
|
args: [{
|
|
2599
|
-
declarations: [
|
|
2600
|
-
// pages
|
|
2601
|
-
CmsContentComponent,
|
|
2602
|
-
CookiesComponent,
|
|
2603
|
-
NotFoundComponent,
|
|
2604
|
-
PrivacyComponent,
|
|
2605
|
-
SupportComponent,
|
|
2606
|
-
TermsAndConditionsComponent,
|
|
2607
|
-
ForbiddenComponent,
|
|
2608
|
-
// pipes
|
|
2609
|
-
CmsPipe,
|
|
2610
|
-
AsMultiPipe,
|
|
2611
|
-
AsSinglePipe,
|
|
2612
|
-
LeftComponentPipe,
|
|
2613
|
-
RightComponentPipe,
|
|
2614
|
-
TruncatePipe,
|
|
2615
|
-
AutolinkPipe,
|
|
2616
|
-
// templates
|
|
2617
|
-
BaseComponent,
|
|
2618
|
-
CmsComponent,
|
|
2619
|
-
ContentComponent,
|
|
2620
|
-
AppTemplateComponent,
|
|
2621
|
-
AppContainerComponent,
|
|
2622
|
-
SettingsDropdownSelectorComponent,
|
|
2623
|
-
AppDropdownSelectorComponent,
|
|
2624
|
-
// directives
|
|
2625
|
-
RlbRole,
|
|
2626
|
-
],
|
|
2680
|
+
declarations: [],
|
|
2627
2681
|
exports: [
|
|
2628
2682
|
// pipes
|
|
2629
2683
|
CmsPipe,
|
|
@@ -2654,177 +2708,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
2654
2708
|
TranslateModule,
|
|
2655
2709
|
RlbBootstrapModule,
|
|
2656
2710
|
RouterModule,
|
|
2711
|
+
// standalone
|
|
2712
|
+
CmsContentComponent,
|
|
2713
|
+
CookiesComponent,
|
|
2714
|
+
NotFoundComponent,
|
|
2715
|
+
PrivacyComponent,
|
|
2716
|
+
SupportComponent,
|
|
2717
|
+
TermsAndConditionsComponent,
|
|
2718
|
+
ForbiddenComponent,
|
|
2719
|
+
CmsPipe,
|
|
2720
|
+
AsMultiPipe,
|
|
2721
|
+
AsSinglePipe,
|
|
2722
|
+
LeftComponentPipe,
|
|
2723
|
+
RightComponentPipe,
|
|
2724
|
+
TruncatePipe,
|
|
2725
|
+
AutolinkPipe,
|
|
2726
|
+
BaseComponent,
|
|
2727
|
+
CmsComponent,
|
|
2728
|
+
ContentComponent,
|
|
2729
|
+
AppTemplateComponent,
|
|
2730
|
+
AppContainerComponent,
|
|
2731
|
+
SettingsDropdownSelectorComponent,
|
|
2732
|
+
AppDropdownSelectorComponent,
|
|
2733
|
+
RlbRole,
|
|
2657
2734
|
],
|
|
2658
2735
|
}]
|
|
2659
2736
|
}] });
|
|
2660
2737
|
|
|
2661
|
-
class ErrorModalComponent {
|
|
2662
|
-
constructor() {
|
|
2663
|
-
this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
|
|
2664
|
-
this.valid = model(true, ...(ngDevMode ? [{ debugName: "valid" }] : /* istanbul ignore next */ []));
|
|
2665
|
-
}
|
|
2666
|
-
onEnter() { }
|
|
2667
|
-
ngOnInit() {
|
|
2668
|
-
console.log(this.data());
|
|
2669
|
-
}
|
|
2670
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2671
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.7", type: ErrorModalComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, valid: { classPropertyName: "valid", publicName: "valid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valid: "validChange" }, hostDirectives: [{ directive: i2$1.ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
|
|
2672
|
-
<div class="modal-header">
|
|
2673
|
-
<h5 class="modal-title">{{ data().title }}</h5>
|
|
2674
|
-
<button
|
|
2675
|
-
type="button"
|
|
2676
|
-
class="btn-close"
|
|
2677
|
-
aria-label="Close"
|
|
2678
|
-
data-modal-reason="close"
|
|
2679
|
-
></button>
|
|
2680
|
-
</div>
|
|
2681
|
-
<div class="modal-body">
|
|
2682
|
-
<span>{{ data().content }}</span>
|
|
2683
|
-
</div>
|
|
2684
|
-
<div class="modal-footer">
|
|
2685
|
-
<button
|
|
2686
|
-
type="button"
|
|
2687
|
-
class="btn btn-primary"
|
|
2688
|
-
data-modal-reason="close"
|
|
2689
|
-
>
|
|
2690
|
-
{{ data().ok }}
|
|
2691
|
-
</button>
|
|
2692
|
-
</div>
|
|
2693
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbAppModule }] }); }
|
|
2694
|
-
}
|
|
2695
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ErrorModalComponent, decorators: [{
|
|
2696
|
-
type: Component,
|
|
2697
|
-
args: [{
|
|
2698
|
-
imports: [RlbAppModule],
|
|
2699
|
-
template: `
|
|
2700
|
-
<div class="modal-header">
|
|
2701
|
-
<h5 class="modal-title">{{ data().title }}</h5>
|
|
2702
|
-
<button
|
|
2703
|
-
type="button"
|
|
2704
|
-
class="btn-close"
|
|
2705
|
-
aria-label="Close"
|
|
2706
|
-
data-modal-reason="close"
|
|
2707
|
-
></button>
|
|
2708
|
-
</div>
|
|
2709
|
-
<div class="modal-body">
|
|
2710
|
-
<span>{{ data().content }}</span>
|
|
2711
|
-
</div>
|
|
2712
|
-
<div class="modal-footer">
|
|
2713
|
-
<button
|
|
2714
|
-
type="button"
|
|
2715
|
-
class="btn btn-primary"
|
|
2716
|
-
data-modal-reason="close"
|
|
2717
|
-
>
|
|
2718
|
-
{{ data().ok }}
|
|
2719
|
-
</button>
|
|
2720
|
-
</div>
|
|
2721
|
-
`,
|
|
2722
|
-
hostDirectives: [
|
|
2723
|
-
{
|
|
2724
|
-
directive: ModalDirective,
|
|
2725
|
-
inputs: ['id', 'data-instance', 'data-options'],
|
|
2726
|
-
},
|
|
2727
|
-
],
|
|
2728
|
-
}]
|
|
2729
|
-
}], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], valid: [{ type: i0.Input, args: [{ isSignal: true, alias: "valid", required: false }] }, { type: i0.Output, args: ["validChange"] }] } });
|
|
2730
|
-
|
|
2731
|
-
class ModalAppsComponent {
|
|
2732
|
-
constructor() {
|
|
2733
|
-
this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
|
|
2734
|
-
this.valid = model(true, ...(ngDevMode ? [{ debugName: "valid" }] : /* istanbul ignore next */ []));
|
|
2735
|
-
this.apps = [];
|
|
2736
|
-
}
|
|
2737
|
-
appSelected(app) {
|
|
2738
|
-
this.result = app;
|
|
2739
|
-
}
|
|
2740
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ModalAppsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2741
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: ModalAppsComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, valid: { classPropertyName: "valid", publicName: "valid", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valid: "validChange" }, hostDirectives: [{ directive: i2$1.ModalDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
|
|
2742
|
-
<div class="modal-header">
|
|
2743
|
-
<h5 class="modal-title">{{ data().title }}</h5>
|
|
2744
|
-
<button
|
|
2745
|
-
type="button"
|
|
2746
|
-
class="btn-close"
|
|
2747
|
-
aria-label="Close"
|
|
2748
|
-
data-modal-reason="close"
|
|
2749
|
-
></button>
|
|
2750
|
-
</div>
|
|
2751
|
-
<div class="modal-body">
|
|
2752
|
-
<ul class="row row-cols-4 list-unstyled list">
|
|
2753
|
-
@for (app of data().content; track app) {
|
|
2754
|
-
<li
|
|
2755
|
-
class="col my-2"
|
|
2756
|
-
[tooltip]="app.description | translate"
|
|
2757
|
-
>
|
|
2758
|
-
<a
|
|
2759
|
-
class="d-block text-body-emphasis text-decoration-none"
|
|
2760
|
-
(click)="appSelected(app)"
|
|
2761
|
-
[class.disabled]="!app.enabled"
|
|
2762
|
-
data-modal-reason="ok"
|
|
2763
|
-
>
|
|
2764
|
-
<div class="px-3 py-4 mb-2 bg-body-secondary text-center rounded">
|
|
2765
|
-
<i [ngClass]="app.icon"></i>
|
|
2766
|
-
</div>
|
|
2767
|
-
<div class="name text-muted text-decoration-none text-center pt-1">
|
|
2768
|
-
{{ app.name | translate }}
|
|
2769
|
-
</div>
|
|
2770
|
-
</a>
|
|
2771
|
-
</li>
|
|
2772
|
-
}
|
|
2773
|
-
</ul>
|
|
2774
|
-
</div>
|
|
2775
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "directive", type: i2$1.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }] }); }
|
|
2776
|
-
}
|
|
2777
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: ModalAppsComponent, decorators: [{
|
|
2778
|
-
type: Component,
|
|
2779
|
-
args: [{
|
|
2780
|
-
imports: [RlbAppModule, CommonModule],
|
|
2781
|
-
template: `
|
|
2782
|
-
<div class="modal-header">
|
|
2783
|
-
<h5 class="modal-title">{{ data().title }}</h5>
|
|
2784
|
-
<button
|
|
2785
|
-
type="button"
|
|
2786
|
-
class="btn-close"
|
|
2787
|
-
aria-label="Close"
|
|
2788
|
-
data-modal-reason="close"
|
|
2789
|
-
></button>
|
|
2790
|
-
</div>
|
|
2791
|
-
<div class="modal-body">
|
|
2792
|
-
<ul class="row row-cols-4 list-unstyled list">
|
|
2793
|
-
@for (app of data().content; track app) {
|
|
2794
|
-
<li
|
|
2795
|
-
class="col my-2"
|
|
2796
|
-
[tooltip]="app.description | translate"
|
|
2797
|
-
>
|
|
2798
|
-
<a
|
|
2799
|
-
class="d-block text-body-emphasis text-decoration-none"
|
|
2800
|
-
(click)="appSelected(app)"
|
|
2801
|
-
[class.disabled]="!app.enabled"
|
|
2802
|
-
data-modal-reason="ok"
|
|
2803
|
-
>
|
|
2804
|
-
<div class="px-3 py-4 mb-2 bg-body-secondary text-center rounded">
|
|
2805
|
-
<i [ngClass]="app.icon"></i>
|
|
2806
|
-
</div>
|
|
2807
|
-
<div class="name text-muted text-decoration-none text-center pt-1">
|
|
2808
|
-
{{ app.name | translate }}
|
|
2809
|
-
</div>
|
|
2810
|
-
</a>
|
|
2811
|
-
</li>
|
|
2812
|
-
}
|
|
2813
|
-
</ul>
|
|
2814
|
-
</div>
|
|
2815
|
-
`,
|
|
2816
|
-
hostDirectives: [{ directive: ModalDirective, inputs: ['id', 'data-instance', 'data-options'] }],
|
|
2817
|
-
}]
|
|
2818
|
-
}], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], valid: [{ type: i0.Input, args: [{ isSignal: true, alias: "valid", required: false }] }, { type: i0.Output, args: ["validChange"] }] } });
|
|
2819
|
-
|
|
2820
2738
|
class AppSelectorComponent {
|
|
2821
|
-
constructor(
|
|
2822
|
-
this._location =
|
|
2823
|
-
this.appsService =
|
|
2824
|
-
this.authService =
|
|
2825
|
-
|
|
2826
|
-
|
|
2827
|
-
return this.appsService.apps;
|
|
2739
|
+
constructor() {
|
|
2740
|
+
this._location = inject(Location);
|
|
2741
|
+
this.appsService = inject(AppsService);
|
|
2742
|
+
this.authService = inject(AuthenticationService);
|
|
2743
|
+
this.apps = this.appsService.apps;
|
|
2744
|
+
this.auth$ = this.authService.isAuthenticated$;
|
|
2828
2745
|
}
|
|
2829
2746
|
backClicked() {
|
|
2830
2747
|
this._location.back();
|
|
@@ -2832,16 +2749,13 @@ class AppSelectorComponent {
|
|
|
2832
2749
|
selectApp(app) {
|
|
2833
2750
|
this.appsService.selectApp(app, 'app');
|
|
2834
2751
|
}
|
|
2835
|
-
|
|
2836
|
-
|
|
2837
|
-
}
|
|
2838
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.7", ngImport: i0, type: AppSelectorComponent, deps: [{ token: i1$6.Location }, { token: AppsService }, { token: AuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2839
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: AppSelectorComponent, isStandalone: true, selector: "rlb-app-selector", ngImport: i0, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.apps.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y cur\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <rlb-list>\n @for (app of apps; track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.core) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.core.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.core.title | translate\"\n [disabled]=\"!app.enabled && (app.core.auth && !(auth$ | async))\" [line-2]=\"app.core.description | translate\"\n (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i2$1.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i2$1.ListItemImageComponent, selector: "rlb-list-item-image", inputs: ["active", "disabled", "counter-empty", "counter-pill", "counter-border", "avatar-size", "username", "line-1", "line-2", "avatar", "counter", "counter-color", "icon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }] }); }
|
|
2752
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2753
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AppSelectorComponent, isStandalone: true, selector: "rlb-app-selector", ngImport: i0, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.apps.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y cur\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <rlb-list>\n @for (app of apps(); track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.core) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.core.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.core.title | translate\"\n [disabled]=\"!app.enabled && (app.core.auth && !(auth$ | async))\" [line-2]=\"app.core.description | translate\"\n (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n</div>\n\n", styles: [""], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i1$3.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i1$3.ListItemImageComponent, selector: "rlb-list-item-image", inputs: ["active", "disabled", "counter-empty", "counter-pill", "counter-border", "avatar-size", "username", "line-1", "line-2", "avatar", "counter", "counter-color", "icon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2840
2754
|
}
|
|
2841
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2755
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppSelectorComponent, decorators: [{
|
|
2842
2756
|
type: Component,
|
|
2843
|
-
args: [{ selector: 'rlb-app-selector', imports: [RlbAppModule, CommonModule], template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.apps.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y cur\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <rlb-list>\n @for (app of apps; track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.core) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.core.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.core.title | translate\"\n [disabled]=\"!app.enabled && (app.core.auth && !(auth$ | async))\" [line-2]=\"app.core.description | translate\"\n (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n</div>\n" }]
|
|
2844
|
-
}]
|
|
2757
|
+
args: [{ selector: 'rlb-app-selector', imports: [RlbAppModule, CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.apps.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y cur\"\n style=\"font-size: 25px;font-weight: 600;\" (click)=\"backClicked()\"></i>\n </div>\n <rlb-list>\n @for (app of apps(); track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.core) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.core.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.core.title | translate\"\n [disabled]=\"!app.enabled && (app.core.auth && !(auth$ | async))\" [line-2]=\"app.core.description | translate\"\n (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n</div>\n\n" }]
|
|
2758
|
+
}] });
|
|
2845
2759
|
|
|
2846
2760
|
const oauthGuard = (route, state) => {
|
|
2847
2761
|
const authService = inject(AuthenticationService);
|
|
@@ -3021,10 +2935,10 @@ class OauthPasswordService {
|
|
|
3021
2935
|
}, r.expires_in * 1000 - 60000);
|
|
3022
2936
|
}
|
|
3023
2937
|
}
|
|
3024
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3025
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
2938
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OauthPasswordService, deps: [{ token: i1$2.HttpClient }, { token: AuthenticationService }, { token: AppLoggerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2939
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OauthPasswordService, providedIn: 'root' }); }
|
|
3026
2940
|
}
|
|
3027
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2941
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: OauthPasswordService, decorators: [{
|
|
3028
2942
|
type: Injectable,
|
|
3029
2943
|
args: [{
|
|
3030
2944
|
providedIn: 'root'
|
|
@@ -3111,10 +3025,10 @@ class KeycloakProfileService {
|
|
|
3111
3025
|
}
|
|
3112
3026
|
});
|
|
3113
3027
|
}
|
|
3114
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3115
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
3028
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: KeycloakProfileService, deps: [{ token: i1$2.HttpClient }, { token: AuthenticationService }, { token: ErrorManagementService }, { token: i1$5.OidcSecurityService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3029
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: KeycloakProfileService, providedIn: 'root' }); }
|
|
3116
3030
|
}
|
|
3117
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3031
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: KeycloakProfileService, decorators: [{
|
|
3118
3032
|
type: Injectable,
|
|
3119
3033
|
args: [{
|
|
3120
3034
|
providedIn: 'root',
|
|
@@ -3122,35 +3036,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.7", ngImpor
|
|
|
3122
3036
|
}], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: AuthenticationService }, { type: ErrorManagementService }, { type: i1$5.OidcSecurityService }] });
|
|
3123
3037
|
|
|
3124
3038
|
class UserAccountComponent {
|
|
3125
|
-
constructor(
|
|
3126
|
-
this._location =
|
|
3127
|
-
this.store =
|
|
3128
|
-
this.keycloakProfileService =
|
|
3129
|
-
this.modalService =
|
|
3130
|
-
this.languageService =
|
|
3131
|
-
this.authService =
|
|
3132
|
-
this.router =
|
|
3133
|
-
this.
|
|
3134
|
-
this.
|
|
3039
|
+
constructor() {
|
|
3040
|
+
this._location = inject(Location);
|
|
3041
|
+
this.store = inject((Store));
|
|
3042
|
+
this.keycloakProfileService = inject(KeycloakProfileService);
|
|
3043
|
+
this.modalService = inject(ModalService);
|
|
3044
|
+
this.languageService = inject(LanguageService);
|
|
3045
|
+
this.authService = inject(AuthenticationService);
|
|
3046
|
+
this.router = inject(Router);
|
|
3047
|
+
this.keyCloakUser = signal(undefined, ...(ngDevMode ? [{ debugName: "keyCloakUser" }] : /* istanbul ignore next */ []));
|
|
3048
|
+
this.keyCloakDevices = toSignal(this.keycloakProfileService.getDevices());
|
|
3049
|
+
this.keycloakCredentials = signal([], ...(ngDevMode ? [{ debugName: "keycloakCredentials" }] : /* istanbul ignore next */ []));
|
|
3050
|
+
this.authService.isAuthenticated$.pipe(takeUntilDestroyed(), filter(isAuth => !isAuth), switchMap(() => this.router.navigate(['/']))).subscribe();
|
|
3135
3051
|
}
|
|
3136
3052
|
backClicked() {
|
|
3137
3053
|
this._location.back();
|
|
3138
3054
|
}
|
|
3139
3055
|
ngOnInit() {
|
|
3140
|
-
this.
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
this.
|
|
3144
|
-
|
|
3145
|
-
|
|
3146
|
-
this.subs.push(this.keycloakProfileService.getCredentials().subscribe((credentials) => {
|
|
3147
|
-
this.keycloakCredentials = credentials;
|
|
3148
|
-
}));
|
|
3149
|
-
}
|
|
3150
|
-
ngOnDestroy() {
|
|
3151
|
-
while (this.subs.length) {
|
|
3152
|
-
this.subs.pop()?.unsubscribe();
|
|
3153
|
-
}
|
|
3056
|
+
this.keycloakProfileService.getUserProfile()
|
|
3057
|
+
.pipe(takeUntilDestroyed())
|
|
3058
|
+
.subscribe((user) => this.keyCloakUser.set(user));
|
|
3059
|
+
this.keycloakProfileService.getCredentials()
|
|
3060
|
+
.pipe(takeUntilDestroyed())
|
|
3061
|
+
.subscribe((credentials) => this.keycloakCredentials.set(credentials));
|
|
3154
3062
|
}
|
|
3155
3063
|
logout() {
|
|
3156
3064
|
this.store.dispatch(AuthActions.logout());
|
|
@@ -3159,18 +3067,25 @@ class UserAccountComponent {
|
|
|
3159
3067
|
return await lastValueFrom(this.modalService.openConfirmModal(this.languageService.translate("core.account.credentials.deleteTitle"), this.languageService.translate("core.account.credentials.deleteMessage"), this.languageService.translate("core.account.credentials.deleteHeader"), this.languageService.translate("common.yes"), this.languageService.translate("common.cancel")).pipe(switchMap((result) => {
|
|
3160
3068
|
if (result) {
|
|
3161
3069
|
return this.keycloakProfileService.removeCredential(id).pipe(tap(() => {
|
|
3162
|
-
|
|
3163
|
-
|
|
3164
|
-
|
|
3165
|
-
|
|
3166
|
-
|
|
3070
|
+
this.keycloakCredentials.update(credentials => {
|
|
3071
|
+
const newCredentials = [...credentials];
|
|
3072
|
+
const credType = newCredentials.find(c => c.type === type);
|
|
3073
|
+
if (credType?.userCredentialMetadatas) {
|
|
3074
|
+
credType.userCredentialMetadatas = credType.userCredentialMetadatas.filter(m => m.credential.id !== id);
|
|
3075
|
+
}
|
|
3076
|
+
return newCredentials;
|
|
3077
|
+
});
|
|
3167
3078
|
}));
|
|
3168
3079
|
}
|
|
3169
3080
|
return EMPTY;
|
|
3170
3081
|
})));
|
|
3171
3082
|
}
|
|
3172
3083
|
async updateProfile() {
|
|
3173
|
-
|
|
3084
|
+
const user = this.keyCloakUser();
|
|
3085
|
+
if (user) {
|
|
3086
|
+
return await lastValueFrom(this.keycloakProfileService.updateUserProfile(user));
|
|
3087
|
+
}
|
|
3088
|
+
return;
|
|
3174
3089
|
}
|
|
3175
3090
|
updatePassword() {
|
|
3176
3091
|
this.keycloakProfileService.updatePassword();
|
|
@@ -3178,36 +3093,36 @@ class UserAccountComponent {
|
|
|
3178
3093
|
configureOTP() {
|
|
3179
3094
|
this.keycloakProfileService.configureOTP();
|
|
3180
3095
|
}
|
|
3181
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3182
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.7", type: UserAccountComponent, isStandalone: true, selector: "rlb-user-account", ngImport: i0, template: "<div class=\"container mt-4 mb-5\">\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <h3 class=\"m-0\">{{\"Account settings\"|translate|uppercase}}</h3>\n <rlb-breadcrumb [cssClasses]=\"'p-0 px-md-1 py-md-2 m-0'\" [items]=\"[{ label: 'Home', link: '/', id: '1' },{ label: 'Account settings', id: '2' }]\" class=\"d-block\"></rlb-breadcrumb>\n </div>\n\n <!-- ACCOUNT DETAILS CARD -->\n <rlb-card class=\"mt-3\">\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h5 class=\"m-0\">{{\"Account\" | translate}}</h5>\n </rlb-card-header>\n\n <rlb-card-body class=\"px-4 py-4\">\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.username' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.username\" disabled />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.email' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.email\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.firstName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.firstName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.lastName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser.lastName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n </rlb-card-body>\n\n <rlb-card-footer>\n <div class=\"d-flex align-items-center justify-content-end gap-2\">\n <button rlb-button outline (click)=\"updateProfile()\">\n <i class=\"bi bi-floppy\"></i>\n {{'common.save' | translate}}\n </button>\n <button rlb-button outline color=\"danger\" (click)=\"logout()\">\n <i class=\"bi bi-box-arrow-right\"></i>\n {{'core.account.logout' | translate}}\n </button>\n </div>\n </rlb-card-footer>\n </rlb-card>\n\n <!-- CREDENTIALS SECTION -->\n @if (keyCloakUser) {\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.credentials.title' | translate}}</h3>\n\n @for (type of keycloakCredentials; track type) {\n <rlb-card class=\"mb-4\">\n\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h6 class=\"mb-0 fw-bold\">{{ ('core.account.credentials.'+type?.type) | translate }}</h6>\n @if (type.type === 'otp') {\n <rlb-fab (click)=\"configureOTP()\" size=\"sm\" [tooltip]=\"'core.account.credentials.addOTP' | translate\">\n <i class=\"bi bi-plus-circle\"></i>\n </rlb-fab>\n }\n </rlb-card-header>\n\n <rlb-card-body>\n <rlb-list class=\"settings m-0\">\n @for (cred of type.userCredentialMetadatas; track cred.credential.id) {\n <rlb-list-item class=\"px-4 py-3\">\n <div class=\"row align-items-center w-100\">\n <div class=\"col-md-1 text-center mb-2 mb-md-0\">\n <i class=\"bi bi-key text-secondary\" style=\"font-size: 2rem;\"></i>\n </div>\n <div class=\"col-md-5 mb-2 mb-md-0\">\n <span class=\"text-muted small d-block\">{{ 'core.account.credentials.name' | translate }}</span>\n <span class=\"fw-semibold\">{{cred.credential.userLabel || cred.credential.type}}</span>\n </div>\n <div class=\"col-md-4 mb-3 mb-md-0\">\n <span class=\"text-muted small d-block\">{{'core.account.credentials.created' | translate}}</span>\n <span>{{cred.credential.createdDate | date:'dd:MM:yyyy HH:mm' }}</span>\n </div>\n <div class=\"col-md-2 text-md-end\">\n @if (type.removeable) {\n <button rlb-button class=\"w-100\" color=\"danger\" (click)=\"removeCredential(type.type, cred.credential.id)\">\n <i class=\"bi bi-trash\"></i> {{ 'core.account.credentials.delete' | translate}}\n </button>\n } @else {\n <button rlb-button class=\"w-100\" outline (click)=\"updatePassword()\">\n <i class=\"bi bi-pencil-square\"></i> {{ 'core.account.credentials.update' | translate}}\n </button>\n }\n </div>\n </div>\n </rlb-list-item>\n }\n\n @if (type.userCredentialMetadatas.length === 0) {\n <rlb-list-item>\n <div class=\"py-4 text-center text-muted\">\n {{ 'core.account.credentials.noCredentials' | translate}}\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n\n <!-- SESSION SECTION -->\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.session.title' | translate}}</h3>\n\n <rlb-card border=\"secondary\" class=\"mb-5\">\n <rlb-card-body class=\"p-0\">\n <rlb-list class=\"settings m-0\">\n @for (d of keyCloakDevices; track d.id) {\n <rlb-list-item class=\"settings-item px-4 py-4\">\n\n <!-- Session Top Row (Device Info) -->\n <div class=\"d-flex align-items-center pb-3 mb-3\">\n <i class=\"bi bi-laptop text-secondary me-3\" style=\"font-size: 2rem;\"></i>\n <h6 class=\"mb-0 fw-bold\">{{d.os}} {{d.osVersion}} - {{d.browser}}</h6>\n @if (d.current) {\n <span class=\"badge bg-success ms-3 rounded-pill px-3 py-2\">\n {{ 'core.account.session.current' | translate}}\n </span>\n }\n </div>\n\n <div class=\"row text-center text-md-start gy-3\">\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{ 'core.account.session.ip' | translate }}</span>\n <span class=\"fw-medium\">{{d.ipAddress}}</span>\n </div>\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{'core.account.session.lastAccess' | translate}}</span>\n <span>{{d.lastAccess*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.applications' | translate}}</span>\n <span>{{d.clientslist }} </span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.started' | translate}}</span>\n <span>{{d.started*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.expires' | translate}}</span>\n <span>{{d.expires*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n</div>\n", styles: [".settings .settings-item .settings-control{width:40%}\n"], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i2$1.InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "inputId", "extValidation", "enable-validation"] }, { kind: "component", type: i2$1.BreadcrumbComponent, selector: "rlb-breadcrumb", inputs: ["divider", "items", "cssClasses"] }, { kind: "component", type: i2$1.ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: i2$1.RlbFabComponent, selector: "rlb-fab", inputs: ["color", "size", "disabled", "outline", "position"] }, { kind: "component", type: i2$1.CardBodyComponent, selector: "rlb-card-body" }, { kind: "component", type: i2$1.CardFooterComponent, selector: "rlb-card-footer" }, { kind: "component", type: i2$1.CardHeaderComponent, selector: "rlb-card-header" }, { kind: "component", type: i2$1.CardComponent, selector: "rlb-card", inputs: ["align", "overlay", "background", "border"] }, { kind: "directive", type: i2$1.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "component", type: i2$1.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i2$1.ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$3.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1$6.DatePipe, name: "date" }] }); }
|
|
3096
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UserAccountComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3097
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: UserAccountComponent, isStandalone: true, selector: "rlb-user-account", ngImport: i0, template: "<div class=\"container mt-4 mb-5\">\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <h3 class=\"m-0\">{{\"Account settings\"|translate|uppercase}}</h3>\n <rlb-breadcrumb [cssClasses]=\"'p-0 px-md-1 py-md-2 m-0'\" [items]=\"[{ label: 'Home', link: '/', id: '1' },{ label: 'Account settings', id: '2' }]\" class=\"d-block\"></rlb-breadcrumb>\n </div>\n\n <!-- ACCOUNT DETAILS CARD -->\n <rlb-card class=\"mt-3\">\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h5 class=\"m-0\">{{\"Account\" | translate}}</h5>\n </rlb-card-header>\n\n <rlb-card-body class=\"px-4 py-4\">\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.username' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [ngModel]=\"keyCloakUser()?.username\" disabled />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.email' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.email\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.firstName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.firstName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.lastName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.lastName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n </rlb-card-body>\n\n <rlb-card-footer>\n <div class=\"d-flex align-items-center justify-content-end gap-2\">\n <button rlb-button outline (click)=\"updateProfile()\">\n <i class=\"bi bi-floppy\"></i>\n {{'common.save' | translate}}\n </button>\n <button rlb-button outline color=\"danger\" (click)=\"logout()\">\n <i class=\"bi bi-box-arrow-right\"></i>\n {{'core.account.logout' | translate}}\n </button>\n </div>\n </rlb-card-footer>\n </rlb-card>\n\n <!-- CREDENTIALS SECTION -->\n @if (keyCloakUser()) {\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.credentials.title' | translate}}</h3>\n\n @for (type of keycloakCredentials(); track type) {\n <rlb-card class=\"mb-4\">\n\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h6 class=\"mb-0 fw-bold\">{{ ('core.account.credentials.'+type?.type) | translate }}</h6>\n @if (type.type === 'otp') {\n <rlb-fab (click)=\"configureOTP()\" size=\"sm\" [tooltip]=\"'core.account.credentials.addOTP' | translate\">\n <i class=\"bi bi-plus-circle\"></i>\n </rlb-fab>\n }\n </rlb-card-header>\n\n <rlb-card-body>\n <rlb-list class=\"settings m-0\">\n @for (cred of type.userCredentialMetadatas; track cred.credential.id) {\n <rlb-list-item class=\"px-4 py-3\">\n <div class=\"row align-items-center w-100\">\n <div class=\"col-md-1 text-center mb-2 mb-md-0\">\n <i class=\"bi bi-key text-secondary\" style=\"font-size: 2rem;\"></i>\n </div>\n <div class=\"col-md-5 mb-2 mb-md-0\">\n <span class=\"text-muted small d-block\">{{ 'core.account.credentials.name' | translate }}</span>\n <span class=\"fw-semibold\">{{cred.credential.userLabel || cred.credential.type}}</span>\n </div>\n <div class=\"col-md-4 mb-3 mb-md-0\">\n <span class=\"text-muted small d-block\">{{'core.account.credentials.created' | translate}}</span>\n <span>{{cred.credential.createdDate | date:'dd:MM:yyyy HH:mm' }}</span>\n </div>\n <div class=\"col-md-2 text-md-end\">\n @if (type.removeable) {\n <button rlb-button class=\"w-100\" color=\"danger\" (click)=\"removeCredential(type.type, cred.credential.id)\">\n <i class=\"bi bi-trash\"></i> {{ 'core.account.credentials.delete' | translate}}\n </button>\n } @else {\n <button rlb-button class=\"w-100\" outline (click)=\"updatePassword()\">\n <i class=\"bi bi-pencil-square\"></i> {{ 'core.account.credentials.update' | translate}}\n </button>\n }\n </div>\n </div>\n </rlb-list-item>\n }\n\n @if (type.userCredentialMetadatas.length === 0) {\n <rlb-list-item>\n <div class=\"py-4 text-center text-muted\">\n {{ 'core.account.credentials.noCredentials' | translate}}\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n\n <!-- SESSION SECTION -->\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.session.title' | translate}}</h3>\n\n <rlb-card border=\"secondary\" class=\"mb-5\">\n <rlb-card-body class=\"p-0\">\n <rlb-list class=\"settings m-0\">\n @for (d of keyCloakDevices(); track d.id) {\n <rlb-list-item class=\"settings-item px-4 py-4\">\n\n <!-- Session Top Row (Device Info) -->\n <div class=\"d-flex align-items-center pb-3 mb-3\">\n <i class=\"bi bi-laptop text-secondary me-3\" style=\"font-size: 2rem;\"></i>\n <h6 class=\"mb-0 fw-bold\">{{d.os}} {{d.osVersion}} - {{d.browser}}</h6>\n @if (d.current) {\n <span class=\"badge bg-success ms-3 rounded-pill px-3 py-2\">\n {{ 'core.account.session.current' | translate}}\n </span>\n }\n </div>\n\n <div class=\"row text-center text-md-start gy-3\">\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{ 'core.account.session.ip' | translate }}</span>\n <span class=\"fw-medium\">{{d.ipAddress}}</span>\n </div>\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{'core.account.session.lastAccess' | translate}}</span>\n <span>{{d.lastAccess*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.applications' | translate}}</span>\n <span>{{d.clientslist }} </span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.started' | translate}}</span>\n <span>{{d.started*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.expires' | translate}}</span>\n <span>{{d.expires*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}\n"], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i1$3.InputComponent, selector: "rlb-input", inputs: ["disabled", "readonly", "placeholder", "type", "size", "name", "max", "min", "step", "date-type", "timezone", "inputId", "extValidation", "enable-validation"] }, { kind: "component", type: i1$3.BreadcrumbComponent, selector: "rlb-breadcrumb", inputs: ["divider", "items", "cssClasses"] }, { kind: "component", type: i1$3.ButtonComponent, selector: "button[rlb-button], a[rlb-button]", inputs: ["color", "size", "disabled", "outline", "isLink"] }, { kind: "component", type: i1$3.RlbFabComponent, selector: "rlb-fab", inputs: ["color", "size", "disabled", "outline", "position"] }, { kind: "component", type: i1$3.CardBodyComponent, selector: "rlb-card-body" }, { kind: "component", type: i1$3.CardFooterComponent, selector: "rlb-card-footer" }, { kind: "component", type: i1$3.CardHeaderComponent, selector: "rlb-card-header" }, { kind: "component", type: i1$3.CardComponent, selector: "rlb-card", inputs: ["align", "overlay", "background", "border"] }, { kind: "directive", type: i1$3.TooltipDirective, selector: "[tooltip]", inputs: ["tooltip", "tooltip-placement", "tooltip-class", "tooltip-html"] }, { kind: "component", type: i1$3.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i1$3.ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1$6.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3183
3098
|
}
|
|
3184
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3099
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: UserAccountComponent, decorators: [{
|
|
3185
3100
|
type: Component,
|
|
3186
|
-
args: [{ selector: 'rlb-user-account', imports: [RlbAppModule, CommonModule], template: "<div class=\"container mt-4 mb-5\">\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <h3 class=\"m-0\">{{\"Account settings\"|translate|uppercase}}</h3>\n <rlb-breadcrumb [cssClasses]=\"'p-0 px-md-1 py-md-2 m-0'\" [items]=\"[{ label: 'Home', link: '/', id: '1' },{ label: 'Account settings', id: '2' }]\" class=\"d-block\"></rlb-breadcrumb>\n </div>\n\n <!-- ACCOUNT DETAILS CARD -->\n <rlb-card class=\"mt-3\">\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h5 class=\"m-0\">{{\"Account\" | translate}}</h5>\n </rlb-card-header>\n\n <rlb-card-body class=\"px-4 py-4\">\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.username' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser) {\n <rlb-input class=\"w-100\" type=\"text\" [
|
|
3187
|
-
}], ctorParameters: () => [
|
|
3101
|
+
args: [{ selector: 'rlb-user-account', imports: [RlbAppModule, CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container mt-4 mb-5\">\n\n <div class=\"d-flex align-items-center justify-content-between\">\n <h3 class=\"m-0\">{{\"Account settings\"|translate|uppercase}}</h3>\n <rlb-breadcrumb [cssClasses]=\"'p-0 px-md-1 py-md-2 m-0'\" [items]=\"[{ label: 'Home', link: '/', id: '1' },{ label: 'Account settings', id: '2' }]\" class=\"d-block\"></rlb-breadcrumb>\n </div>\n\n <!-- ACCOUNT DETAILS CARD -->\n <rlb-card class=\"mt-3\">\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h5 class=\"m-0\">{{\"Account\" | translate}}</h5>\n </rlb-card-header>\n\n <rlb-card-body class=\"px-4 py-4\">\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.username' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [ngModel]=\"keyCloakUser()?.username\" disabled />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.email' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.email\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row mb-3 align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.firstName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.firstName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n\n <div class=\"row align-items-center\">\n <label class=\"col-md-3 col-form-label fw-semibold\">{{ 'core.account.lastName' | translate}}</label>\n <div class=\"col-md-9\">\n @if (keyCloakUser()) {\n <rlb-input class=\"w-100\" type=\"text\" [(ngModel)]=\"keyCloakUser()!.lastName\" />\n } @else {\n <rlb-input class=\"w-100\" type=\"text\" readonly />\n }\n </div>\n </div>\n </rlb-card-body>\n\n <rlb-card-footer>\n <div class=\"d-flex align-items-center justify-content-end gap-2\">\n <button rlb-button outline (click)=\"updateProfile()\">\n <i class=\"bi bi-floppy\"></i>\n {{'common.save' | translate}}\n </button>\n <button rlb-button outline color=\"danger\" (click)=\"logout()\">\n <i class=\"bi bi-box-arrow-right\"></i>\n {{'core.account.logout' | translate}}\n </button>\n </div>\n </rlb-card-footer>\n </rlb-card>\n\n <!-- CREDENTIALS SECTION -->\n @if (keyCloakUser()) {\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.credentials.title' | translate}}</h3>\n\n @for (type of keycloakCredentials(); track type) {\n <rlb-card class=\"mb-4\">\n\n <rlb-card-header class=\"d-flex justify-content-between align-items-center py-3 px-4\">\n <h6 class=\"mb-0 fw-bold\">{{ ('core.account.credentials.'+type?.type) | translate }}</h6>\n @if (type.type === 'otp') {\n <rlb-fab (click)=\"configureOTP()\" size=\"sm\" [tooltip]=\"'core.account.credentials.addOTP' | translate\">\n <i class=\"bi bi-plus-circle\"></i>\n </rlb-fab>\n }\n </rlb-card-header>\n\n <rlb-card-body>\n <rlb-list class=\"settings m-0\">\n @for (cred of type.userCredentialMetadatas; track cred.credential.id) {\n <rlb-list-item class=\"px-4 py-3\">\n <div class=\"row align-items-center w-100\">\n <div class=\"col-md-1 text-center mb-2 mb-md-0\">\n <i class=\"bi bi-key text-secondary\" style=\"font-size: 2rem;\"></i>\n </div>\n <div class=\"col-md-5 mb-2 mb-md-0\">\n <span class=\"text-muted small d-block\">{{ 'core.account.credentials.name' | translate }}</span>\n <span class=\"fw-semibold\">{{cred.credential.userLabel || cred.credential.type}}</span>\n </div>\n <div class=\"col-md-4 mb-3 mb-md-0\">\n <span class=\"text-muted small d-block\">{{'core.account.credentials.created' | translate}}</span>\n <span>{{cred.credential.createdDate | date:'dd:MM:yyyy HH:mm' }}</span>\n </div>\n <div class=\"col-md-2 text-md-end\">\n @if (type.removeable) {\n <button rlb-button class=\"w-100\" color=\"danger\" (click)=\"removeCredential(type.type, cred.credential.id)\">\n <i class=\"bi bi-trash\"></i> {{ 'core.account.credentials.delete' | translate}}\n </button>\n } @else {\n <button rlb-button class=\"w-100\" outline (click)=\"updatePassword()\">\n <i class=\"bi bi-pencil-square\"></i> {{ 'core.account.credentials.update' | translate}}\n </button>\n }\n </div>\n </div>\n </rlb-list-item>\n }\n\n @if (type.userCredentialMetadatas.length === 0) {\n <rlb-list-item>\n <div class=\"py-4 text-center text-muted\">\n {{ 'core.account.credentials.noCredentials' | translate}}\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n\n <!-- SESSION SECTION -->\n <h3 class=\"mb-4 text-center mt-5\">{{ 'core.account.session.title' | translate}}</h3>\n\n <rlb-card border=\"secondary\" class=\"mb-5\">\n <rlb-card-body class=\"p-0\">\n <rlb-list class=\"settings m-0\">\n @for (d of keyCloakDevices(); track d.id) {\n <rlb-list-item class=\"settings-item px-4 py-4\">\n\n <!-- Session Top Row (Device Info) -->\n <div class=\"d-flex align-items-center pb-3 mb-3\">\n <i class=\"bi bi-laptop text-secondary me-3\" style=\"font-size: 2rem;\"></i>\n <h6 class=\"mb-0 fw-bold\">{{d.os}} {{d.osVersion}} - {{d.browser}}</h6>\n @if (d.current) {\n <span class=\"badge bg-success ms-3 rounded-pill px-3 py-2\">\n {{ 'core.account.session.current' | translate}}\n </span>\n }\n </div>\n\n <div class=\"row text-center text-md-start gy-3\">\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{ 'core.account.session.ip' | translate }}</span>\n <span class=\"fw-medium\">{{d.ipAddress}}</span>\n </div>\n <div class=\"col-sm-6 col-md-3\">\n <span class=\"text-muted small d-block\">{{'core.account.session.lastAccess' | translate}}</span>\n <span>{{d.lastAccess*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.applications' | translate}}</span>\n <span>{{d.clientslist }} </span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.started' | translate}}</span>\n <span>{{d.started*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n <div class=\"col-sm-6 col-md-2\">\n <span class=\"text-muted small d-block\">{{'core.account.session.expires' | translate}}</span>\n <span>{{d.expires*1000 | date:'dd/MM/yyyy - HH:mm'}}</span>\n </div>\n </div>\n </rlb-list-item>\n }\n </rlb-list>\n </rlb-card-body>\n </rlb-card>\n }\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}\n"] }]
|
|
3102
|
+
}], ctorParameters: () => [] });
|
|
3188
3103
|
|
|
3189
3104
|
class SettingsCoreComponent {
|
|
3190
|
-
constructor(
|
|
3191
|
-
this._location =
|
|
3192
|
-
this.toastService =
|
|
3193
|
-
this.languageService =
|
|
3194
|
-
this.store =
|
|
3105
|
+
constructor() {
|
|
3106
|
+
this._location = inject(Location);
|
|
3107
|
+
this.toastService = inject(ToastService);
|
|
3108
|
+
this.languageService = inject(LanguageService);
|
|
3109
|
+
this.store = inject(Store);
|
|
3110
|
+
this.languages = computed(() => {
|
|
3111
|
+
return this.store.selectSignal(o => o[appContextFeatureKey].supportedLanguages)()
|
|
3112
|
+
.map((lang) => {
|
|
3113
|
+
return {
|
|
3114
|
+
value: lang,
|
|
3115
|
+
label: this.languageService.getLanguageName(lang),
|
|
3116
|
+
};
|
|
3117
|
+
});
|
|
3118
|
+
}, ...(ngDevMode ? [{ debugName: "languages" }] : /* istanbul ignore next */ []));
|
|
3119
|
+
this.currentLanguage = toSignal(this.store.select(o => o[appContextFeatureKey].language), { initialValue: 'en' });
|
|
3120
|
+
this.darkMode = computed(() => this.store.selectSignal(o => o[appContextFeatureKey].theme)() === 'dark', ...(ngDevMode ? [{ debugName: "darkMode" }] : /* istanbul ignore next */ []));
|
|
3195
3121
|
}
|
|
3196
3122
|
backClicked() {
|
|
3197
3123
|
this._location.back();
|
|
3198
3124
|
}
|
|
3199
|
-
|
|
3200
|
-
return this.store.selectSignal(o => o[appContextFeatureKey].supportedLanguages)().map((lang) => {
|
|
3201
|
-
return {
|
|
3202
|
-
value: lang,
|
|
3203
|
-
label: this.languageService.getLanguageName(lang)
|
|
3204
|
-
};
|
|
3205
|
-
});
|
|
3206
|
-
}
|
|
3207
|
-
get currentLanguage() {
|
|
3208
|
-
return this.store.selectSignal(o => o[appContextFeatureKey].language)();
|
|
3209
|
-
}
|
|
3210
|
-
set currentLanguage(value) {
|
|
3125
|
+
setCurrentLanguage(value) {
|
|
3211
3126
|
this.store.dispatch(AppContextActions.setLanguage({ language: value }));
|
|
3212
3127
|
this.toastService.openToast('toast-c-1', 'toast-component', {
|
|
3213
3128
|
title: this.languageService.translate('common.saved'),
|
|
@@ -3216,10 +3131,7 @@ class SettingsCoreComponent {
|
|
|
3216
3131
|
ok: this.languageService.translate('ok'),
|
|
3217
3132
|
});
|
|
3218
3133
|
}
|
|
3219
|
-
|
|
3220
|
-
return this.store.selectSignal(o => o[appContextFeatureKey].theme)() === 'dark';
|
|
3221
|
-
}
|
|
3222
|
-
set darkMode(value) {
|
|
3134
|
+
setDarkMode(value) {
|
|
3223
3135
|
this.store.dispatch(AppContextActions.setTheme({ theme: value ? 'dark' : 'light' }));
|
|
3224
3136
|
this.toastService.openToast('toast-c-1', 'toast-component', {
|
|
3225
3137
|
title: this.languageService.translate('common.saved'),
|
|
@@ -3228,13 +3140,13 @@ class SettingsCoreComponent {
|
|
|
3228
3140
|
ok: this.languageService.translate('ok'),
|
|
3229
3141
|
});
|
|
3230
3142
|
}
|
|
3231
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3232
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
3143
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsCoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3144
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SettingsCoreComponent, isStandalone: true, selector: "rlb-settings-core", ngImport: i0, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.generalTitle' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalTheme' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [ngModel]=\"darkMode()\" (ngModelChange)=\"setDarkMode($event)\" class=\"mt-2\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalLanguage' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [ngModel]=\"currentLanguage()\" (ngModelChange)=\"setCurrentLanguage($event)\">\n @for (l of languages(); track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n </rlb-list>\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}.settings .settings-item .settings-control ::ng-deep rlb-switch .form-check{display:block;margin-left:auto}\n"], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i1$3.SwitchComponent, selector: "rlb-switch", inputs: ["disabled", "readonly", "size", "id"] }, { kind: "component", type: i1$3.SelectComponent, selector: "rlb-select", inputs: ["placeholder", "size", "disabled", "readonly", "multiple", "display", "inputId", "enable-validation"] }, { kind: "component", type: i1$3.OptionComponent, selector: "rlb-option", inputs: ["value", "disabled"] }, { kind: "component", type: i1$3.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i1$3.ListItemComponent, selector: "rlb-list-item", inputs: ["active", "disabled", "action"] }, { kind: "directive", type: i1$7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3233
3145
|
}
|
|
3234
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3146
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsCoreComponent, decorators: [{
|
|
3235
3147
|
type: Component,
|
|
3236
|
-
args: [{ selector: 'rlb-settings-core', imports: [RlbAppModule], template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.generalTitle' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalTheme' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [
|
|
3237
|
-
}]
|
|
3148
|
+
args: [{ selector: 'rlb-settings-core', imports: [RlbAppModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.generalTitle' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list class=\"settings\">\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalTheme' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-switch size=\"small\" [ngModel]=\"darkMode()\" (ngModelChange)=\"setDarkMode($event)\" class=\"mt-2\" />\n </div>\n </div>\n </rlb-list-item>\n <rlb-list-item class=\"settings-item\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"settings-text\">\n <h6 class=\"mt-1\">{{ 'core.settings.generalLanguage' | translate}}</h6>\n </div>\n <div class=\"settings-control\">\n <rlb-select size=\"small\" [ngModel]=\"currentLanguage()\" (ngModelChange)=\"setCurrentLanguage($event)\">\n @for (l of languages(); track l.value) {\n <rlb-option [value]=\"l.value\">{{l.label}}</rlb-option>\n }\n </rlb-select>\n </div>\n </div>\n </rlb-list-item>\n </rlb-list>\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}.settings .settings-item .settings-control ::ng-deep rlb-switch .form-check{display:block;margin-left:auto}\n"] }]
|
|
3149
|
+
}] });
|
|
3238
3150
|
|
|
3239
3151
|
class SettingsListComponent {
|
|
3240
3152
|
constructor(_location, appsService, authService, pageOptions) {
|
|
@@ -3242,9 +3154,8 @@ class SettingsListComponent {
|
|
|
3242
3154
|
this.appsService = appsService;
|
|
3243
3155
|
this.authService = authService;
|
|
3244
3156
|
this.pageOptions = pageOptions;
|
|
3245
|
-
|
|
3246
|
-
|
|
3247
|
-
return this.appsService.apps;
|
|
3157
|
+
this.apps = this.appsService.apps;
|
|
3158
|
+
this.pages = computed(() => this.pageOptions, ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
|
|
3248
3159
|
}
|
|
3249
3160
|
backClicked() {
|
|
3250
3161
|
this._location.back();
|
|
@@ -3252,18 +3163,15 @@ class SettingsListComponent {
|
|
|
3252
3163
|
selectApp(app) {
|
|
3253
3164
|
this.appsService.selectApp(app, 'settings');
|
|
3254
3165
|
}
|
|
3255
|
-
get pages() {
|
|
3256
|
-
return this.pageOptions;
|
|
3257
|
-
}
|
|
3258
3166
|
get auth$() {
|
|
3259
3167
|
return this.authService.isAuthenticated$;
|
|
3260
3168
|
}
|
|
3261
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3262
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
3169
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsListComponent, deps: [{ token: i1$6.Location }, { token: AppsService }, { token: AuthenticationService }, { token: RLB_CFG_PAGES, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3170
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SettingsListComponent, isStandalone: true, selector: "rlb-settings-list", ngImport: i0, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list>\n <rlb-list-item-image icon=\"bi bi-gear\" [avatar-size]=\"35\" [line-1]=\" 'core.settings.generalTitle' | translate\"\n [routerLink]=\"'/settings/general'\" [line-2]=\" 'core.settings.generalDescription' | translate\">\n </rlb-list-item-image>\n @for (app of apps(); track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.settings) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.settings.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(auth$ | async))\"\n [line-2]=\"app.settings.description | translate\" (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n\n @if (pages()?.['status']?.path || pages()?.['logger']?.path) {\n <rlb-list class=\"mt-5\">\n @if (pages()?.['status']?.path) {\n <rlb-list-item-image icon=\"bi bi-check2-circle\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.status' | translate\" [routerLink]=\"'/status'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['logger']?.path) {\n <rlb-list-item-image icon=\"bi bi-file-text\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.logger' | translate\" [routerLink]=\"'/logger'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n\n @if (pages()?.['privacy']?.path || pages()?.['cookies']?.path || pages()?.['terms']?.path || pages()?.['support']?.path) {\n <rlb-list class=\"mt-4\"\n >\n @if (pages()?.['privacy']?.path) {\n <rlb-list-item-image icon=\"bi bi-shield-check\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.privacy' | translate\" [routerLink]=\"'/privacy'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['cookies']?.path) {\n <rlb-list-item-image icon=\"bi bi bi-cookie\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.cookies' | translate\" [routerLink]=\"'/cookies'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['terms']?.path) {\n <rlb-list-item-image icon=\"bi bi-vector-pen\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.legal' | translate\" [routerLink]=\"'/terms'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['support']?.path) {\n <rlb-list-item-image icon=\"bi bi-chat-quote\" [avatar-size]=\"18\"\n [line-1]=\" 'core.settings.support' | translate\" [routerLink]=\"'/support'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}\n"], dependencies: [{ kind: "ngmodule", type: RlbAppModule }, { kind: "component", type: i1$3.ListComponent, selector: "rlb-list", inputs: ["disabled", "numbered", "flush", "horizontal"] }, { kind: "component", type: i1$3.ListItemImageComponent, selector: "rlb-list-item-image", inputs: ["active", "disabled", "counter-empty", "counter-pill", "counter-border", "avatar-size", "username", "line-1", "line-2", "avatar", "counter", "counter-color", "icon"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i1$6.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3263
3171
|
}
|
|
3264
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3172
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SettingsListComponent, decorators: [{
|
|
3265
3173
|
type: Component,
|
|
3266
|
-
args: [{ selector: 'rlb-settings-list', imports: [RlbAppModule, CommonModule], template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list>\n <rlb-list-item-image icon=\"bi bi-gear\" [avatar-size]=\"35\" [line-1]=\" 'core.settings.generalTitle' | translate\"\n [routerLink]=\"'/settings/general'\" [line-2]=\" 'core.settings.generalDescription' | translate\">\n </rlb-list-item-image>\n @for (app of apps; track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.settings) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.settings.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(auth$ | async))\"\n [line-2]=\"app.settings.description | translate\" (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n\n @if (pages?.['status']?.path || pages?.['logger']?.path) {\n <rlb-list class=\"mt-5\">\n @if (pages?.['status']?.path) {\n <rlb-list-item-image icon=\"bi bi-check2-circle\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.status' | translate\" [routerLink]=\"'/status'\">\n </rlb-list-item-image>\n }\n @if (pages?.['logger']?.path) {\n <rlb-list-item-image icon=\"bi bi-file-text\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.logger' | translate\" [routerLink]=\"'/logger'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n\n @if (pages?.['privacy']?.path || pages?.['cookies']?.path || pages?.['terms']?.path || pages?.['support']?.path) {\n <rlb-list class=\"mt-4\"\n >\n @if (pages?.['privacy']?.path) {\n <rlb-list-item-image icon=\"bi bi-shield-check\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.privacy' | translate\" [routerLink]=\"'/privacy'\">\n </rlb-list-item-image>\n }\n @if (pages?.['cookies']?.path) {\n <rlb-list-item-image icon=\"bi bi bi-cookie\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.cookies' | translate\" [routerLink]=\"'/cookies'\">\n </rlb-list-item-image>\n }\n @if (pages?.['terms']?.path) {\n <rlb-list-item-image icon=\"bi bi-vector-pen\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.legal' | translate\" [routerLink]=\"'/terms'\">\n </rlb-list-item-image>\n }\n @if (pages?.['support']?.path) {\n <rlb-list-item-image icon=\"bi bi-chat-quote\" [avatar-size]=\"18\"\n [line-1]=\" 'core.settings.support' | translate\" [routerLink]=\"'/support'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n</div>\n", styles: [".settings .settings-item .settings-control{width:40%}\n"] }]
|
|
3174
|
+
args: [{ selector: 'rlb-settings-list', imports: [RlbAppModule, CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container mt-2\">\n <div class=\"container text-center position-relative my-3\">\n <h3>{{ 'core.settings.title' | translate}}</h3>\n <i role=\"button\" class=\"bi bi-chevron-left position-absolute start-0 top-50 translate-middle-y\"\n (click)=\"backClicked()\" style=\"font-size: 25px;font-weight: 600;\"></i>\n </div>\n <rlb-list>\n <rlb-list-item-image icon=\"bi bi-gear\" [avatar-size]=\"35\" [line-1]=\" 'core.settings.generalTitle' | translate\"\n [routerLink]=\"'/settings/general'\" [line-2]=\" 'core.settings.generalDescription' | translate\">\n </rlb-list-item-image>\n @for (app of apps(); track app.id) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n @if (app.settings) {\n <ng-container ngProjectAs=\"rlb-list-item-image\">\n <rlb-list-item-image [icon]=\"app.settings.icon\" [avatar-size]=\"35\"\n [line-1]=\"app.data.friendlyName ? app.data.friendlyName : app.settings.title | translate\"\n [disabled]=\"!app.enabled && (app.settings.auth && !(auth$ | async))\"\n [line-2]=\"app.settings.description | translate\" (click)=\"selectApp(app)\">\n </rlb-list-item-image>\n </ng-container>\n }\n </ng-container>\n }\n </rlb-list>\n\n @if (pages()?.['status']?.path || pages()?.['logger']?.path) {\n <rlb-list class=\"mt-5\">\n @if (pages()?.['status']?.path) {\n <rlb-list-item-image icon=\"bi bi-check2-circle\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.status' | translate\" [routerLink]=\"'/status'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['logger']?.path) {\n <rlb-list-item-image icon=\"bi bi-file-text\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.logger' | translate\" [routerLink]=\"'/logger'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n\n @if (pages()?.['privacy']?.path || pages()?.['cookies']?.path || pages()?.['terms']?.path || pages()?.['support']?.path) {\n <rlb-list class=\"mt-4\"\n >\n @if (pages()?.['privacy']?.path) {\n <rlb-list-item-image icon=\"bi bi-shield-check\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.privacy' | translate\" [routerLink]=\"'/privacy'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['cookies']?.path) {\n <rlb-list-item-image icon=\"bi bi bi-cookie\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.cookies' | translate\" [routerLink]=\"'/cookies'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['terms']?.path) {\n <rlb-list-item-image icon=\"bi bi-vector-pen\" [avatar-size]=\"18\"\n [line-1]=\"'core.settings.legal' | translate\" [routerLink]=\"'/terms'\">\n </rlb-list-item-image>\n }\n @if (pages()?.['support']?.path) {\n <rlb-list-item-image icon=\"bi bi-chat-quote\" [avatar-size]=\"18\"\n [line-1]=\" 'core.settings.support' | translate\" [routerLink]=\"'/support'\">\n </rlb-list-item-image>\n }\n </rlb-list>\n }\n</div>\n\n", styles: [".settings .settings-item .settings-control{width:40%}\n"] }]
|
|
3267
3175
|
}], ctorParameters: () => [{ type: i1$6.Location }, { type: AppsService }, { type: AuthenticationService }, { type: undefined, decorators: [{
|
|
3268
3176
|
type: Inject,
|
|
3269
3177
|
args: [RLB_CFG_PAGES]
|
|
@@ -3318,7 +3226,7 @@ class AppContextEffects {
|
|
|
3318
3226
|
this.loggerService = loggerService;
|
|
3319
3227
|
this.apps = apps;
|
|
3320
3228
|
this.setLanguage$ = createEffect(() => {
|
|
3321
|
-
return this.actions$.pipe(ofType(AppContextActions.setLanguage), tap$1(({ language }) => this.languageService.language
|
|
3229
|
+
return this.actions$.pipe(ofType(AppContextActions.setLanguage), tap$1(({ language }) => this.languageService.setLanguage(language)), tap$1(({ language }) => {
|
|
3322
3230
|
this.renderer.setAttribute(document.documentElement, 'lang', language);
|
|
3323
3231
|
}), tap$1(({ language }) => { this.storage.writeLocal('locale', language); }), map$1(({ language }) => AppContextActionsInternal.setLanguage({ language })));
|
|
3324
3232
|
});
|
|
@@ -3352,12 +3260,12 @@ class AppContextEffects {
|
|
|
3352
3260
|
}
|
|
3353
3261
|
}
|
|
3354
3262
|
}
|
|
3355
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3356
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
3263
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContextEffects, deps: [{ token: i1$8.Actions }, { token: LanguageService }, { token: i0.RendererFactory2 }, { token: AppStorageService }, { token: i1$1.Store }, { token: i5.Router }, { token: AppLoggerService }, { token: RLB_APPS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3264
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContextEffects }); }
|
|
3357
3265
|
}
|
|
3358
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3266
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AppContextEffects, decorators: [{
|
|
3359
3267
|
type: Injectable
|
|
3360
|
-
}], ctorParameters: () => [{ type: i1$8.Actions }, { type: LanguageService }, { type: i0.RendererFactory2 }, { type: AppStorageService }, { type: i1$1.Store }, { type:
|
|
3268
|
+
}], ctorParameters: () => [{ type: i1$8.Actions }, { type: LanguageService }, { type: i0.RendererFactory2 }, { type: AppStorageService }, { type: i1$1.Store }, { type: i5.Router }, { type: AppLoggerService }, { type: undefined, decorators: [{
|
|
3361
3269
|
type: Inject,
|
|
3362
3270
|
args: [RLB_APPS]
|
|
3363
3271
|
}, {
|
|
@@ -3407,10 +3315,10 @@ class AuthEffects {
|
|
|
3407
3315
|
this.logger = this.loggerService.for(this.constructor.name);
|
|
3408
3316
|
this.logger.log(`Initialized AuthEffects}`);
|
|
3409
3317
|
}
|
|
3410
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3411
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
3318
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthEffects, deps: [{ token: i1$8.Actions }, { token: AuthenticationService }, { token: AppLoggerService }, { token: RLB_CFG_AUTH, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3319
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthEffects }); }
|
|
3412
3320
|
}
|
|
3413
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3321
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AuthEffects, decorators: [{
|
|
3414
3322
|
type: Injectable
|
|
3415
3323
|
}], ctorParameters: () => [{ type: i1$8.Actions }, { type: AuthenticationService }, { type: AppLoggerService }, { type: undefined, decorators: [{
|
|
3416
3324
|
type: Inject,
|
|
@@ -3465,8 +3373,8 @@ class ToastComponent {
|
|
|
3465
3373
|
this.data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
|
|
3466
3374
|
this.valid = true;
|
|
3467
3375
|
}
|
|
3468
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3469
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
3376
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3377
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ToastComponent, isStandalone: true, selector: "ng-component", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null } }, hostDirectives: [{ directive: i1$3.ToastDirective, inputs: ["id", "id", "data-instance", "data-instance", "data-options", "data-options"] }], ngImport: i0, template: `
|
|
3470
3378
|
<div class="toast-header">
|
|
3471
3379
|
<strong class="me-auto">
|
|
3472
3380
|
<svg
|
|
@@ -3497,12 +3405,13 @@ class ToastComponent {
|
|
|
3497
3405
|
></button>
|
|
3498
3406
|
</div>
|
|
3499
3407
|
<div class="toast-body">{{ data().content }}</div>
|
|
3500
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbAppModule }] }); }
|
|
3408
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: RlbAppModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3501
3409
|
}
|
|
3502
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3410
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToastComponent, decorators: [{
|
|
3503
3411
|
type: Component,
|
|
3504
3412
|
args: [{
|
|
3505
3413
|
imports: [RlbAppModule],
|
|
3414
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
3506
3415
|
template: `
|
|
3507
3416
|
<div class="toast-header">
|
|
3508
3417
|
<strong class="me-auto">
|