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