@rxap/layout 16.0.0-dev.2 → 16.0.0-dev.21

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.
Files changed (75) hide show
  1. package/CHANGELOG.md +442 -0
  2. package/LICENSE +621 -21
  3. package/LICENSE.md +621 -0
  4. package/README.md +7 -22
  5. package/esm2022/index.mjs +5 -6
  6. package/esm2022/lib/app-url.service.mjs +64 -0
  7. package/esm2022/lib/footer/footer.component.mjs +10 -41
  8. package/esm2022/lib/footer.directive.mjs +21 -22
  9. package/esm2022/lib/header/apps-button/apps-button.component.mjs +40 -120
  10. package/esm2022/lib/header/header.component.mjs +64 -141
  11. package/esm2022/lib/header/language-selector/language-selector.component.mjs +22 -115
  12. package/esm2022/lib/header/navigation-progress-bar/navigation-progress-bar.component.mjs +19 -24
  13. package/esm2022/lib/header/reset-button/reset-button.component.mjs +12 -19
  14. package/esm2022/lib/header/settings-button/settings-button.component.mjs +46 -0
  15. package/esm2022/lib/header/sidenav-toggle-button/sidenav-toggle-button.component.mjs +16 -39
  16. package/esm2022/lib/header/sign-out/sign-out.component.mjs +17 -28
  17. package/esm2022/lib/header/user-profile-icon/user-profile-icon.component.mjs +32 -117
  18. package/esm2022/lib/i18n-check.guard.mjs +30 -0
  19. package/esm2022/lib/i18n.service.mjs +36 -0
  20. package/esm2022/lib/language-selector.service.mjs +34 -0
  21. package/esm2022/lib/layout/layout.component.mjs +61 -91
  22. package/esm2022/lib/layout/layout.component.service.mjs +21 -22
  23. package/esm2022/lib/navigation/navigation-item/navigation-item.component.mjs +116 -264
  24. package/esm2022/lib/navigation/navigation-item.mjs +4 -4
  25. package/esm2022/lib/navigation/navigation.component.mjs +46 -106
  26. package/esm2022/lib/navigation/navigation.service.mjs +28 -27
  27. package/esm2022/lib/navigation/replace-router-paths.service.mjs +9 -10
  28. package/esm2022/lib/sidenav/sidenav-footer.directive.mjs +15 -16
  29. package/esm2022/lib/sidenav/sidenav-header.directive.mjs +15 -16
  30. package/esm2022/lib/sidenav/sidenav.component.mjs +29 -121
  31. package/esm2022/lib/sidenav/sidenav.component.service.mjs +8 -9
  32. package/esm2022/lib/sidenav/version/version.component.mjs +14 -48
  33. package/esm2022/lib/toggle-window-sidenav-button/toggle-window-sidenav-button.component.mjs +15 -38
  34. package/esm2022/lib/tokens.mjs +1 -1
  35. package/esm2022/lib/types.mjs +1 -1
  36. package/esm2022/lib/window-container-sidenav/window-container-sidenav.component.mjs +14 -33
  37. package/esm2022/rxap-layout.mjs +1 -1
  38. package/fesm2022/rxap-layout.mjs +824 -1534
  39. package/fesm2022/rxap-layout.mjs.map +1 -1
  40. package/index.d.ts +4 -3
  41. package/lib/app-url.service.d.ts +26 -0
  42. package/lib/footer.directive.d.ts +1 -1
  43. package/lib/header/apps-button/apps-button.component.d.ts +12 -20
  44. package/lib/header/header.component.d.ts +7 -12
  45. package/lib/header/language-selector/language-selector.component.d.ts +1 -16
  46. package/lib/header/settings-button/settings-button.component.d.ts +19 -0
  47. package/lib/header/sidenav-toggle-button/sidenav-toggle-button.component.d.ts +1 -1
  48. package/lib/header/sign-out/sign-out.component.d.ts +4 -4
  49. package/lib/header/user-profile-icon/user-profile-icon.component.d.ts +11 -7
  50. package/lib/i18n-check.guard.d.ts +11 -0
  51. package/lib/i18n.service.d.ts +12 -0
  52. package/lib/language-selector.service.d.ts +15 -0
  53. package/lib/layout/layout.component.d.ts +9 -4
  54. package/lib/navigation/navigation-item/navigation-item.component.d.ts +11 -18
  55. package/lib/navigation/navigation-item.d.ts +1 -1
  56. package/lib/navigation/navigation.component.d.ts +6 -6
  57. package/lib/navigation/navigation.service.d.ts +1 -1
  58. package/lib/sidenav/version/version.component.d.ts +2 -2
  59. package/lib/toggle-window-sidenav-button/toggle-window-sidenav-button.component.d.ts +2 -4
  60. package/lib/types.d.ts +3 -2
  61. package/lib/window-container-sidenav/window-container-sidenav.component.d.ts +1 -1
  62. package/package.json +101 -66
  63. package/theme.css +1 -0
  64. package/collection.json +0 -10
  65. package/esm2022/lib/layout/layout.component.module.mjs +0 -32
  66. package/esm2022/lib/sidenav-content/sidenav-content.component.mjs +0 -46
  67. package/esm2022/lib/sidenav-content/sidenav-content.component.service.mjs +0 -37
  68. package/lib/layout/layout.component.module.d.ts +0 -10
  69. package/lib/sidenav-content/sidenav-content.component.d.ts +0 -12
  70. package/lib/sidenav-content/sidenav-content.component.service.d.ts +0 -15
  71. package/migration.json +0 -4
  72. package/src/schematics/ng-add/index.d.ts +0 -2
  73. package/src/schematics/ng-add/index.js +0 -8
  74. package/src/schematics/ng-add/index.js.map +0 -1
  75. package/src/schematics/ng-add/schema.json +0 -7
@@ -1,54 +1,57 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Component, ChangeDetectionStrategy, Inject, Optional, Injectable, Input, EventEmitter, Output, TemplateRef, Directive, INJECTOR, ElementRef, Renderer2, ViewContainerRef, ViewEncapsulation, ViewChild, HostBinding, HostListener, ChangeDetectorRef, ContentChild, NgModule } from '@angular/core';
2
+ import { InjectionToken, Component, ChangeDetectionStrategy, LOCALE_ID, Injectable, Inject, signal, Optional, isDevMode, Input, ElementRef, Renderer2, ViewContainerRef, ViewEncapsulation, forwardRef, ViewChild, HostBinding, INJECTOR, ChangeDetectorRef, TemplateRef, Directive, ContentChild, EventEmitter, Output } from '@angular/core';
3
3
  import * as i1 from '@rxap/services';
4
- import { HeaderService, ResetService, WindowContainerSidenavService, FooterService, VersionService } from '@rxap/services';
4
+ import { HeaderService, ResetService, VersionService, WindowContainerSidenavService, FooterService } from '@rxap/services';
5
5
  import * as i3 from '@angular/cdk/portal';
6
6
  import { PortalModule, ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
7
7
  import * as i2 from '@angular/material/toolbar';
8
8
  import { MatToolbarModule } from '@angular/material/toolbar';
9
- import { NgIf, NgFor, AsyncPipe, NgStyle, NgClass, KeyValuePipe, NgComponentOutlet, NgTemplateOutlet } from '@angular/common';
10
- import { Subscription, BehaviorSubject, combineLatest, ReplaySubject, of, from } from 'rxjs';
11
- import { filter, map, tap, switchMap, catchError, startWith, delay, skip, distinctUntilChanged } from 'rxjs/operators';
12
- import * as i2$7 from '@angular/material/sidenav';
13
- import { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';
14
- import * as i4 from '@rxap/authentication';
15
- import { SignOutDirective, UserService } from '@rxap/authentication';
16
- import * as i2$3 from '@angular/material/menu';
17
- import { MatMenuModule } from '@angular/material/menu';
18
- import * as i2$1 from '@angular/router';
19
- import { NavigationStart, NavigationEnd, NavigationCancel, Router, RouterOutlet, RouterLinkActive, RouterLink } from '@angular/router';
20
- import * as i1$1 from '@angular/material/progress-bar';
21
- import { MatProgressBarModule } from '@angular/material/progress-bar';
22
- import * as i2$2 from '@angular/material/icon';
23
- import { MatIconModule } from '@angular/material/icon';
24
- import * as i1$2 from '@angular/material/button';
25
- import { MatButtonModule } from '@angular/material/button';
26
- import { isDefined } from '@rxap/utilities/rxjs';
27
- import { AvatarBackgroundImageDirective } from '@rxap/directives';
28
- import * as i1$3 from '@angular/flex-layout/flex';
29
- import { FlexModule } from '@angular/flex-layout/flex';
30
- import * as i1$4 from '@rxap/config';
31
- import { ConfigService } from '@rxap/config';
32
- import * as i2$4 from '@angular/flex-layout/extended';
33
- import { ExtendedModule } from '@angular/flex-layout/extended';
34
- import * as i7 from '@angular/cdk/overlay';
35
- import { CdkOverlayOrigin, CdkConnectedOverlay, Overlay } from '@angular/cdk/overlay';
36
- import * as i4$1 from '@angular/material/core';
37
- import { MatOptionModule, MatRippleModule } from '@angular/material/core';
9
+ import * as i3$2 from '@angular/common';
10
+ import { NgIf, NgFor, AsyncPipe, NgOptimizedImage, KeyValuePipe, CommonModule, NgClass, NgTemplateOutlet } from '@angular/common';
38
11
  import * as i5 from '@angular/forms';
39
12
  import { FormsModule } from '@angular/forms';
13
+ import * as i1$3 from '@angular/material/button';
14
+ import { MatButtonModule } from '@angular/material/button';
15
+ import * as i4 from '@angular/material/core';
16
+ import { MatOptionModule, MatRippleModule } from '@angular/material/core';
17
+ import * as i2$2 from '@angular/material/form-field';
18
+ import { MatFormFieldModule } from '@angular/material/form-field';
19
+ import * as i2$1 from '@angular/material/icon';
20
+ import { MatIconModule } from '@angular/material/icon';
21
+ import * as i6 from '@angular/material/menu';
22
+ import { MatMenuModule } from '@angular/material/menu';
40
23
  import * as i3$1 from '@angular/material/select';
41
24
  import { MatSelectModule } from '@angular/material/select';
42
- import * as i2$5 from '@angular/material/form-field';
43
- import { MatFormFieldModule } from '@angular/material/form-field';
44
- import { __decorate, __metadata } from 'tslib';
45
- import { Required, DebounceCall, coerceBoolean } from '@rxap/utilities';
25
+ import * as i3$4 from '@angular/material/sidenav';
26
+ import { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';
27
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
28
+ import { DataSourceCollectionDirective } from '@rxap/data-source/directive';
29
+ import { StopPropagationDirective } from '@rxap/directives';
30
+ import { StatusIndicatorComponent } from '@rxap/ngx-status-check';
31
+ import { switchMap, filter as filter$1, Subscription, BehaviorSubject, debounceTime, ReplaySubject, of, from, combineLatest } from 'rxjs';
32
+ import { filter, tap, map, switchMap as switchMap$1, startWith, catchError } from 'rxjs/operators';
33
+ import * as i1$5 from '@angular/flex-layout/flex';
34
+ import { FlexModule } from '@angular/flex-layout/flex';
35
+ import * as i1$2 from '@rxap/authentication';
36
+ import { ClickOnLink } from '@rxap/browser-utilities';
37
+ import * as i1$1 from '@rxap/config';
38
+ import { ConfigService } from '@rxap/config';
39
+ import { JoinPath, coerceBoolean } from '@rxap/utilities';
40
+ import * as i2$3 from '@angular/router';
41
+ import { NavigationStart, NavigationEnd, NavigationCancel, Router, RouterLinkActive, RouterLink, RouterOutlet } from '@angular/router';
42
+ import * as i1$4 from '@angular/material/progress-bar';
43
+ import { MatProgressBarModule } from '@angular/material/progress-bar';
44
+ import { FlexLayoutModule } from '@angular/flex-layout';
45
+ import { DetermineReleaseName, RXAP_ENVIRONMENT } from '@rxap/environment';
46
+ import * as i2$4 from '@rxap/icon';
47
+ import * as i3$3 from '@angular/material/divider';
48
+ import { MatDividerModule } from '@angular/material/divider';
46
49
  import { trigger, transition, style, animate } from '@angular/animations';
50
+ import * as i6$1 from '@angular/cdk/overlay';
51
+ import { Overlay } from '@angular/cdk/overlay';
47
52
  import { IconDirective } from '@rxap/material-directives/icon';
48
- import * as i2$6 from '@angular/material/tooltip';
49
- import { MatTooltipModule } from '@angular/material/tooltip';
50
- import * as i1$5 from '@angular/material/divider';
51
- import { MatDividerModule } from '@angular/material/divider';
53
+ import * as i2$5 from '@angular/flex-layout/extended';
54
+ import { ExtendedModule } from '@angular/flex-layout/extended';
52
55
 
53
56
  const RXAP_NAVIGATION_CONFIG = new InjectionToken('rxap/layout/navigation-config');
54
57
  const RXAP_NAVIGATION_CONFIG_INSERTS = new InjectionToken('rxap/layout/navigation-config-inserts');
@@ -57,509 +60,273 @@ const RXAP_HEADER_COMPONENT = new InjectionToken('rxap/layout/header-component')
57
60
  const RXAP_LOGO_CONFIG = new InjectionToken('rxap/layout/logo-config');
58
61
  const RXAP_LAYOUT_APPS_GRID = new InjectionToken('rxap/layout/apps-grid');
59
62
 
60
- function FooterComponent_ng_template_0_mat_toolbar_0_mat_toolbar_row_1_ng_template_1_Template(rf, ctx) { }
61
- function FooterComponent_ng_template_0_mat_toolbar_0_mat_toolbar_row_1_Template(rf, ctx) { if (rf & 1) {
62
- i0.ɵɵelementStart(0, "mat-toolbar-row");
63
- i0.ɵɵtemplate(1, FooterComponent_ng_template_0_mat_toolbar_0_mat_toolbar_row_1_ng_template_1_Template, 0, 0, "ng-template", 4);
64
- i0.ɵɵelementEnd();
65
- } if (rf & 2) {
66
- const portal_r4 = ctx.$implicit;
67
- i0.ɵɵadvance(1);
68
- i0.ɵɵproperty("cdkPortalOutlet", portal_r4);
69
- } }
70
- function FooterComponent_ng_template_0_mat_toolbar_0_Template(rf, ctx) { if (rf & 1) {
71
- i0.ɵɵelementStart(0, "mat-toolbar", 2);
72
- i0.ɵɵtemplate(1, FooterComponent_ng_template_0_mat_toolbar_0_mat_toolbar_row_1_Template, 2, 1, "mat-toolbar-row", 3);
73
- i0.ɵɵelementEnd();
74
- } if (rf & 2) {
75
- const portals_r1 = i0.ɵɵnextContext().$implicit;
76
- i0.ɵɵadvance(1);
77
- i0.ɵɵproperty("ngForOf", portals_r1);
78
- } }
79
- function FooterComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {
80
- i0.ɵɵtemplate(0, FooterComponent_ng_template_0_mat_toolbar_0_Template, 2, 1, "mat-toolbar", 1);
81
- } if (rf & 2) {
82
- const portals_r1 = ctx.$implicit;
83
- i0.ɵɵproperty("ngIf", portals_r1.length);
84
- } }
85
63
  class FooterComponent {
86
64
  constructor(footerService) {
87
65
  this.footerService = footerService;
88
66
  }
89
- static { this.ɵfac = function FooterComponent_Factory(t) { return new (t || FooterComponent)(i0.ɵɵdirectiveInject(i1.FooterService)); }; }
90
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FooterComponent, selectors: [["rxap-footer"]], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 2, vars: 3, consts: [[3, "ngIf"], ["class", "footer mat-elevation-z1", 4, "ngIf"], [1, "footer", "mat-elevation-z1"], [4, "ngFor", "ngForOf"], [3, "cdkPortalOutlet"]], template: function FooterComponent_Template(rf, ctx) { if (rf & 1) {
91
- i0.ɵɵtemplate(0, FooterComponent_ng_template_0_Template, 1, 1, "ng-template", 0);
92
- i0.ɵɵpipe(1, "async");
93
- } if (rf & 2) {
94
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(1, 1, ctx.footerService.portals$));
95
- } }, dependencies: [NgIf, MatToolbarModule, i2.MatToolbar, i2.MatToolbarRow, NgFor, PortalModule, i3.CdkPortalOutlet, AsyncPipe], changeDetection: 0 }); }
67
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: FooterComponent, deps: [{ token: i1.FooterService }], target: i0.ɵɵFactoryTarget.Component }); }
68
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: FooterComponent, isStandalone: true, selector: "rxap-footer", ngImport: i0, template: "<ng-template [ngIf]=\"footerService.portals$ | async\" let-portals>\n <mat-toolbar *ngIf=\"portals.length\" class=\"footer mat-elevation-z1\">\n <mat-toolbar-row *ngFor=\"let portal of portals\">\n <ng-template [cdkPortalOutlet]=\"portal\"></ng-template>\n </mat-toolbar-row>\n </mat-toolbar>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i2.MatToolbarRow, selector: "mat-toolbar-row", exportAs: ["matToolbarRow"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
96
69
  }
97
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FooterComponent, [{
98
- type: Component,
99
- args: [{ selector: 'rxap-footer', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, MatToolbarModule, NgFor, PortalModule, AsyncPipe], template: "<ng-template [ngIf]=\"footerService.portals$ | async\" let-portals>\n <mat-toolbar *ngIf=\"portals.length\" class=\"footer mat-elevation-z1\">\n <mat-toolbar-row *ngFor=\"let portal of portals\">\n <ng-template [cdkPortalOutlet]=\"portal\"></ng-template>\n </mat-toolbar-row>\n </mat-toolbar>\n</ng-template>\n" }]
100
- }], function () { return [{ type: i1.FooterService }]; }, null); })();
70
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: FooterComponent, decorators: [{
71
+ type: Component,
72
+ args: [{ selector: 'rxap-footer', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, MatToolbarModule, NgFor, PortalModule, AsyncPipe], template: "<ng-template [ngIf]=\"footerService.portals$ | async\" let-portals>\n <mat-toolbar *ngIf=\"portals.length\" class=\"footer mat-elevation-z1\">\n <mat-toolbar-row *ngFor=\"let portal of portals\">\n <ng-template [cdkPortalOutlet]=\"portal\"></ng-template>\n </mat-toolbar-row>\n </mat-toolbar>\n</ng-template>\n" }]
73
+ }], ctorParameters: function () { return [{ type: i1.FooterService }]; } });
101
74
 
102
- function NavigationProgressBarComponent_mat_progress_bar_0_Template(rf, ctx) { if (rf & 1) {
103
- i0.ɵɵelement(0, "mat-progress-bar", 1);
104
- } }
105
- class NavigationProgressBarComponent {
106
- constructor(router) {
107
- this.router = router;
108
- this.navigating$ = this.router.events.pipe(filter(event => event instanceof NavigationStart ||
109
- event instanceof NavigationEnd ||
110
- event instanceof NavigationCancel), map(event => event instanceof NavigationStart));
75
+ class AppUrlService {
76
+ constructor(config, localeId, userProfileService) {
77
+ this.config = config;
78
+ this.localeId = localeId;
79
+ this.userProfileService = userProfileService;
80
+ this._apps = this.config.get('navigation.apps', []);
81
+ }
82
+ getApp(appId) {
83
+ return this._apps.find(app => app.id === appId) ?? null;
84
+ }
85
+ getAppUrl(appId, path) {
86
+ const app = this.getApp(appId);
87
+ if (app) {
88
+ const prefix = this.getPathPrefix();
89
+ return JoinPath(app.href, prefix, path);
90
+ }
91
+ return null;
111
92
  }
112
- static { this.ɵfac = function NavigationProgressBarComponent_Factory(t) { return new (t || NavigationProgressBarComponent)(i0.ɵɵdirectiveInject(Router)); }; }
113
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NavigationProgressBarComponent, selectors: [["rxap-navigation-progress-bar"]], hostAttrs: [1, "rxap-navigation-progress-bar"], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 2, vars: 3, consts: [["mode", "indeterminate", "color", "accent", 4, "ngIf"], ["mode", "indeterminate", "color", "accent"]], template: function NavigationProgressBarComponent_Template(rf, ctx) { if (rf & 1) {
114
- i0.ɵɵtemplate(0, NavigationProgressBarComponent_mat_progress_bar_0_Template, 1, 0, "mat-progress-bar", 0);
115
- i0.ɵɵpipe(1, "async");
116
- } if (rf & 2) {
117
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(1, 1, ctx.navigating$));
118
- } }, dependencies: [NgIf, MatProgressBarModule, i1$1.MatProgressBar, AsyncPipe], changeDetection: 0 }); }
119
- }
120
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NavigationProgressBarComponent, [{
121
- type: Component,
122
- args: [{ selector: 'rxap-navigation-progress-bar', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'rxap-navigation-progress-bar' }, standalone: true, imports: [NgIf, MatProgressBarModule, AsyncPipe], template: "<mat-progress-bar\n *ngIf=\"navigating$ | async\"\n mode=\"indeterminate\"\n color=\"accent\"\n></mat-progress-bar>\n" }]
123
- }], function () { return [{ type: i2$1.Router, decorators: [{
124
- type: Inject,
125
- args: [Router]
126
- }] }]; }, null); })();
127
-
128
- class SignOutComponent {
129
- constructor(router) {
130
- this.router = router;
93
+ navigate(appId, path) {
94
+ const url = this.getAppUrl(appId, path);
95
+ if (url) {
96
+ ClickOnLink(url);
97
+ }
131
98
  }
132
- redirectToRoot() {
133
- this.router.navigate(['/']);
134
- }
135
- static { this.ɵfac = function SignOutComponent_Factory(t) { return new (t || SignOutComponent)(i0.ɵɵdirectiveInject(Router)); }; }
136
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SignOutComponent, selectors: [["rxap-sign-out"]], hostAttrs: [1, "rxap-sign-out"], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 3, vars: 0, consts: [["rxapSignOut", "", "mat-icon-button", "", 3, "successful"]], template: function SignOutComponent_Template(rf, ctx) { if (rf & 1) {
137
- i0.ɵɵelementStart(0, "button", 0);
138
- i0.ɵɵlistener("successful", function SignOutComponent_Template_button_successful_0_listener() { return ctx.redirectToRoot(); });
139
- i0.ɵɵelementStart(1, "mat-icon");
140
- i0.ɵɵtext(2, "login");
141
- i0.ɵɵelementEnd()();
142
- } }, dependencies: [MatButtonModule, i1$2.MatIconButton, SignOutDirective, MatIconModule, i2$2.MatIcon], changeDetection: 0 }); }
143
- }
144
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SignOutComponent, [{
145
- type: Component,
146
- args: [{ selector: 'rxap-sign-out', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'rxap-sign-out' }, standalone: true, imports: [MatButtonModule, SignOutDirective, MatIconModule], template: "<button\n rxapSignOut\n (successful)=\"redirectToRoot()\"\n mat-icon-button\n>\n <mat-icon>login</mat-icon>\n</button>\n" }]
147
- }], function () { return [{ type: i2$1.Router, decorators: [{
148
- type: Inject,
149
- args: [Router]
150
- }] }]; }, null); })();
151
-
152
- function UserProfileIconComponent_ng_template_5_button_0_Template(rf, ctx) { if (rf & 1) {
153
- i0.ɵɵelementStart(0, "button", 5)(1, "mat-icon");
154
- i0.ɵɵtext(2, "person");
155
- i0.ɵɵelementEnd();
156
- i0.ɵɵelementStart(3, "span");
157
- i0.ɵɵtext(4);
158
- i0.ɵɵelementEnd()();
159
- } if (rf & 2) {
160
- const user_r2 = i0.ɵɵnextContext().$implicit;
161
- i0.ɵɵadvance(4);
162
- i0.ɵɵtextInterpolate2("", user_r2.firstname, " ", user_r2.lastname, "");
163
- } }
164
- function UserProfileIconComponent_ng_template_5_button_1_Template(rf, ctx) { if (rf & 1) {
165
- i0.ɵɵelementStart(0, "button", 5)(1, "mat-icon");
166
- i0.ɵɵtext(2, "person");
167
- i0.ɵɵelementEnd();
168
- i0.ɵɵelementStart(3, "span");
169
- i0.ɵɵtext(4);
170
- i0.ɵɵelementEnd()();
171
- } if (rf & 2) {
172
- const user_r2 = i0.ɵɵnextContext().$implicit;
173
- i0.ɵɵadvance(4);
174
- i0.ɵɵtextInterpolate(user_r2.name);
175
- } }
176
- function UserProfileIconComponent_ng_template_5_button_2_Template(rf, ctx) { if (rf & 1) {
177
- i0.ɵɵelementStart(0, "button", 5)(1, "mat-icon");
178
- i0.ɵɵtext(2, "account_circle");
179
- i0.ɵɵelementEnd();
180
- i0.ɵɵelementStart(3, "span");
181
- i0.ɵɵtext(4);
182
- i0.ɵɵelementEnd()();
183
- } if (rf & 2) {
184
- const user_r2 = i0.ɵɵnextContext().$implicit;
185
- i0.ɵɵadvance(4);
186
- i0.ɵɵtextInterpolate(user_r2.username);
187
- } }
188
- function UserProfileIconComponent_ng_template_5_button_3_Template(rf, ctx) { if (rf & 1) {
189
- i0.ɵɵelementStart(0, "button", 5)(1, "mat-icon");
190
- i0.ɵɵtext(2, "email");
191
- i0.ɵɵelementEnd();
192
- i0.ɵɵelementStart(3, "span");
193
- i0.ɵɵtext(4);
194
- i0.ɵɵelementEnd()();
195
- } if (rf & 2) {
196
- const user_r2 = i0.ɵɵnextContext().$implicit;
197
- i0.ɵɵadvance(4);
198
- i0.ɵɵtextInterpolate(user_r2.email);
199
- } }
200
- function UserProfileIconComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {
201
- i0.ɵɵtemplate(0, UserProfileIconComponent_ng_template_5_button_0_Template, 5, 2, "button", 4);
202
- i0.ɵɵtemplate(1, UserProfileIconComponent_ng_template_5_button_1_Template, 5, 1, "button", 4);
203
- i0.ɵɵtemplate(2, UserProfileIconComponent_ng_template_5_button_2_Template, 5, 1, "button", 4);
204
- i0.ɵɵtemplate(3, UserProfileIconComponent_ng_template_5_button_3_Template, 5, 1, "button", 4);
205
- } if (rf & 2) {
206
- const user_r2 = ctx.$implicit;
207
- i0.ɵɵproperty("ngIf", user_r2.firstname && user_r2.lastname);
208
- i0.ɵɵadvance(1);
209
- i0.ɵɵproperty("ngIf", user_r2.name);
210
- i0.ɵɵadvance(1);
211
- i0.ɵɵproperty("ngIf", user_r2.username);
212
- i0.ɵɵadvance(1);
213
- i0.ɵɵproperty("ngIf", user_r2.email);
214
- } }
215
- class UserProfileIconComponent {
216
- constructor(userService) {
217
- this.userService = userService;
218
- this.userProfileUrl$ = this.userService.user$.pipe(isDefined(), map((user) => user.photoURL ?? user.avatarUrl));
219
- this.userName$ = this.userService.user$.pipe(isDefined(), map((user) => user.name ??
220
- (user.firstname || user.lastname
221
- ? [user.firstname, user.lastname].join(' ').trim()
222
- : null) ??
223
- user.username));
224
- }
225
- static { this.ɵfac = function UserProfileIconComponent_Factory(t) { return new (t || UserProfileIconComponent)(i0.ɵɵdirectiveInject(UserService)); }; }
226
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserProfileIconComponent, selectors: [["rxap-user-profile-icon"]], hostAttrs: [1, "rxap-user-profile-icon"], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 7, vars: 11, consts: [["fxLayout", "row", "fxLayoutAlign", "center center", 1, "profile-icon", 3, "matMenuTriggerFor", "rxapAvatarBackgroundImage", "name"], [3, "yPosition"], ["menu", "matMenu"], [3, "ngIf"], ["mat-menu-item", "", 4, "ngIf"], ["mat-menu-item", ""]], template: function UserProfileIconComponent_Template(rf, ctx) { if (rf & 1) {
227
- i0.ɵɵelement(0, "button", 0);
228
- i0.ɵɵpipe(1, "async");
229
- i0.ɵɵpipe(2, "async");
230
- i0.ɵɵelementStart(3, "mat-menu", 1, 2);
231
- i0.ɵɵtemplate(5, UserProfileIconComponent_ng_template_5_Template, 4, 4, "ng-template", 3);
232
- i0.ɵɵpipe(6, "async");
233
- i0.ɵɵelementEnd();
234
- } if (rf & 2) {
235
- const _r0 = i0.ɵɵreference(4);
236
- let tmp_2_0;
237
- i0.ɵɵproperty("matMenuTriggerFor", _r0)("rxapAvatarBackgroundImage", i0.ɵɵpipeBind1(1, 5, ctx.userProfileUrl$))("name", (tmp_2_0 = i0.ɵɵpipeBind1(2, 7, ctx.userName$)) !== null && tmp_2_0 !== undefined ? tmp_2_0 : "");
238
- i0.ɵɵadvance(3);
239
- i0.ɵɵproperty("yPosition", "below");
240
- i0.ɵɵadvance(2);
241
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(6, 9, ctx.userService.user$));
242
- } }, dependencies: [FlexModule, i1$3.DefaultLayoutDirective, i1$3.DefaultLayoutAlignDirective, MatMenuModule, i2$3.MatMenu, i2$3.MatMenuItem, i2$3.MatMenuTrigger, AvatarBackgroundImageDirective,
243
- NgIf,
244
- MatIconModule, i2$2.MatIcon, AsyncPipe], styles: [".profile-icon[_ngcontent-%COMP%]{border-radius:100%;border:none;height:32px;width:32px;overflow:hidden;background-position:center center;background-repeat:no-repeat;background-size:cover}.profile-icon[_ngcontent-%COMP%]:hover{cursor:pointer}.profile-icon[_ngcontent-%COMP%]:focus{outline:none}"], changeDetection: 0 }); }
99
+ async getAppList() {
100
+ const roles = await this.userProfileService.getRoleList();
101
+ return this._apps.filter(app => !app.hidden)
102
+ .map(app => ({
103
+ ...app,
104
+ href: JoinPath(app.href, this.getPathPrefix()),
105
+ }))
106
+ .filter(app => !app.permissions ||
107
+ !app.permissions.length ||
108
+ app.permissions.every(permission => roles.includes(permission)));
109
+ }
110
+ getPathPrefix() {
111
+ switch (this.localeId) {
112
+ case 'de-DE':
113
+ return 'de';
114
+ case 'en-US':
115
+ return 'en';
116
+ default:
117
+ return 'de';
118
+ }
119
+ }
120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppUrlService, deps: [{ token: i1$1.ConfigService }, { token: LOCALE_ID }, { token: i1$2.RxapUserProfileService }], target: i0.ɵɵFactoryTarget.Injectable }); }
121
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppUrlService, providedIn: 'root' }); }
245
122
  }
246
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserProfileIconComponent, [{
247
- type: Component,
248
- args: [{ selector: 'rxap-user-profile-icon', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'rxap-user-profile-icon' }, standalone: true, imports: [
249
- FlexModule,
250
- MatMenuModule,
251
- AvatarBackgroundImageDirective,
252
- NgIf,
253
- MatIconModule,
254
- AsyncPipe
255
- ], template: "<button [matMenuTriggerFor]=\"menu\"\n [rxapAvatarBackgroundImage]=\"userProfileUrl$ | async\"\n [name]=\"(userName$ | async) ?? ''\"\n class=\"profile-icon\"\n fxLayout=\"row\"\n fxLayoutAlign=\"center center\">\n</button>\n\n<mat-menu #menu=\"matMenu\" [yPosition]=\"'below'\">\n <ng-template [ngIf]=\"userService.user$ | async\" let-user>\n <button *ngIf=\"user.firstname && user.lastname\" mat-menu-item>\n <mat-icon>person</mat-icon>\n <span>{{user.firstname}} {{user.lastname}}</span>\n </button>\n <button *ngIf=\"user.name\" mat-menu-item>\n <mat-icon>person</mat-icon>\n <span>{{user.name}}</span>\n </button>\n <button *ngIf=\"user.username\" mat-menu-item>\n <mat-icon>account_circle</mat-icon>\n <span>{{user.username}}</span>\n </button>\n <button *ngIf=\"user.email\" mat-menu-item>\n <mat-icon>email</mat-icon>\n <span>{{user.email}}</span>\n </button>\n </ng-template>\n</mat-menu>\n", styles: [".profile-icon{border-radius:100%;border:none;height:32px;width:32px;overflow:hidden;background-position:center center;background-repeat:no-repeat;background-size:cover}.profile-icon:hover{cursor:pointer}.profile-icon:focus{outline:none}\n"] }]
256
- }], function () { return [{ type: i4.UserService, decorators: [{
257
- type: Inject,
258
- args: [UserService]
259
- }] }]; }, null); })();
123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppUrlService, decorators: [{
124
+ type: Injectable,
125
+ args: [{ providedIn: 'root' }]
126
+ }], ctorParameters: function () { return [{ type: i1$1.ConfigService }, { type: undefined, decorators: [{
127
+ type: Inject,
128
+ args: [LOCALE_ID]
129
+ }] }, { type: i1$2.RxapUserProfileService }]; } });
260
130
 
261
- function AppsButtonComponent_ng_template_0_ng_template_4_li_2_a_1_Template(rf, ctx) { if (rf & 1) {
262
- i0.ɵɵelementStart(0, "a", 9)(1, "span", 10);
263
- i0.ɵɵelement(2, "img", 11);
264
- i0.ɵɵelementStart(3, "span");
265
- i0.ɵɵtext(4);
266
- i0.ɵɵelementEnd()()();
267
- } if (rf & 2) {
268
- const item_r4 = i0.ɵɵnextContext().$implicit;
269
- i0.ɵɵproperty("href", item_r4.href, i0.ɵɵsanitizeUrl);
270
- i0.ɵɵadvance(2);
271
- i0.ɵɵproperty("src", item_r4.image, i0.ɵɵsanitizeUrl);
272
- i0.ɵɵadvance(2);
273
- i0.ɵɵtextInterpolate(item_r4.label);
274
- } }
275
- const _c0$5 = function (a0) { return { empty: a0 }; };
276
- function AppsButtonComponent_ng_template_0_ng_template_4_li_2_Template(rf, ctx) { if (rf & 1) {
277
- i0.ɵɵelementStart(0, "li", 7);
278
- i0.ɵɵtemplate(1, AppsButtonComponent_ng_template_0_ng_template_4_li_2_a_1_Template, 5, 3, "a", 8);
279
- i0.ɵɵelementEnd();
280
- } if (rf & 2) {
281
- const item_r4 = ctx.$implicit;
282
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(2, _c0$5, item_r4.empty));
283
- i0.ɵɵadvance(1);
284
- i0.ɵɵproperty("ngIf", !item_r4.empty);
285
- } }
286
- const _c1$4 = function (a0) { return { columns: a0 }; };
287
- function AppsButtonComponent_ng_template_0_ng_template_4_Template(rf, ctx) { if (rf & 1) {
288
- i0.ɵɵelementStart(0, "div", 4)(1, "ul", 5);
289
- i0.ɵɵtemplate(2, AppsButtonComponent_ng_template_0_ng_template_4_li_2_Template, 2, 4, "li", 6);
290
- i0.ɵɵelementEnd()();
291
- } if (rf & 2) {
292
- const ctx_r2 = i0.ɵɵnextContext(2);
293
- i0.ɵɵadvance(1);
294
- i0.ɵɵproperty("ngStyle", i0.ɵɵpureFunction1(2, _c1$4, ctx_r2.columns));
295
- i0.ɵɵadvance(1);
296
- i0.ɵɵproperty("ngForOf", ctx_r2.gridWithPadding);
297
- } }
298
- function AppsButtonComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {
299
- const _r8 = i0.ɵɵgetCurrentView();
300
- i0.ɵɵelementStart(0, "button", 1, 2);
301
- i0.ɵɵlistener("click", function AppsButtonComponent_ng_template_0_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r7.isOpen = !ctx_r7.isOpen); });
302
- i0.ɵɵelementStart(2, "mat-icon");
303
- i0.ɵɵtext(3, "apps");
304
- i0.ɵɵelementEnd()();
305
- i0.ɵɵtemplate(4, AppsButtonComponent_ng_template_0_ng_template_4_Template, 3, 4, "ng-template", 3);
306
- i0.ɵɵlistener("overlayOutsideClick", function AppsButtonComponent_ng_template_0_Template_ng_template_overlayOutsideClick_4_listener() { i0.ɵɵrestoreView(_r8); const ctx_r9 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r9.isOpen = false); });
307
- } if (rf & 2) {
308
- const _r1 = i0.ɵɵreference(1);
309
- const ctx_r0 = i0.ɵɵnextContext();
310
- i0.ɵɵadvance(4);
311
- i0.ɵɵproperty("cdkConnectedOverlayOpen", ctx_r0.isOpen)("cdkConnectedOverlayOrigin", _r1);
312
- } }
313
131
  class AppsButtonComponent {
314
- get gridWithPadding() {
315
- const gridWithPadding = this.grid.slice();
316
- while (gridWithPadding.length % this.columns !== 0) {
317
- gridWithPadding.push({ empty: true });
318
- }
319
- return gridWithPadding;
132
+ constructor(grid, appUrlService, authenticationService) {
133
+ this.appUrlService = appUrlService;
134
+ this.authenticationService = authenticationService;
135
+ this.isOpen = false;
136
+ this.appList = signal([]);
320
137
  }
321
- get columns() {
322
- if (this.grid.length < 4) {
323
- return 1;
324
- }
325
- if (this.grid.length < 6) {
326
- return 2;
138
+ ngOnInit() {
139
+ this._subscription = this.authenticationService.isAuthenticated$.pipe(filter(Boolean), switchMap(() => this.appUrlService.getAppList()), tap((apps) => this.appList.set(apps))).subscribe();
140
+ }
141
+ ngOnDestroy() {
142
+ this._subscription?.unsubscribe();
143
+ }
144
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppsButtonComponent, deps: [{ token: RXAP_LAYOUT_APPS_GRID, optional: true }, { token: AppUrlService }, { token: i1$2.RxapAuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
145
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: AppsButtonComponent, isStandalone: true, selector: "rxap-apps-button", ngImport: i0, template: "<div *ngIf=\"appList()?.length\" class=\"flex flex-row items-center gap-8\">\n\n <div *ngIf=\"isOpen\" class=\"flex flex-row items-center gap-6\">\n\n <div *ngFor=\"let app of appList()\" class=\"h-10\">\n <a [href]=\"app.href\" mat-stroked-button>\n <span class=\"flex flex-row items-center gap-4\">\n <img *ngIf=\"app.image\" [alt]=\"app.label\" [ngSrc]=\"app.image\" height=\"40\" width=\"40\">\n <span class=\"label grow-0\">{{app.label}}</span>\n </span>\n </a>\n </div>\n\n </div>\n\n <button (click)=\"isOpen = !isOpen\" mat-icon-button>\n <mat-icon svgIcon=\"apps\"></mat-icon>\n </button>\n\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FlexModule }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$3.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i1$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
146
+ }
147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: AppsButtonComponent, decorators: [{
148
+ type: Component,
149
+ args: [{ selector: 'rxap-apps-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
150
+ NgIf,
151
+ FlexModule,
152
+ NgFor,
153
+ MatButtonModule,
154
+ MatIconModule,
155
+ NgOptimizedImage,
156
+ ], template: "<div *ngIf=\"appList()?.length\" class=\"flex flex-row items-center gap-8\">\n\n <div *ngIf=\"isOpen\" class=\"flex flex-row items-center gap-6\">\n\n <div *ngFor=\"let app of appList()\" class=\"h-10\">\n <a [href]=\"app.href\" mat-stroked-button>\n <span class=\"flex flex-row items-center gap-4\">\n <img *ngIf=\"app.image\" [alt]=\"app.label\" [ngSrc]=\"app.image\" height=\"40\" width=\"40\">\n <span class=\"label grow-0\">{{app.label}}</span>\n </span>\n </a>\n </div>\n\n </div>\n\n <button (click)=\"isOpen = !isOpen\" mat-icon-button>\n <mat-icon svgIcon=\"apps\"></mat-icon>\n </button>\n\n</div>\n" }]
157
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
158
+ type: Optional
159
+ }, {
160
+ type: Inject,
161
+ args: [RXAP_LAYOUT_APPS_GRID]
162
+ }] }, { type: AppUrlService }, { type: i1$2.RxapAuthenticationService }]; } });
163
+
164
+ class I18nService {
165
+ constructor(localId, userProfileService) {
166
+ this.localId = localId;
167
+ this.userProfileService = userProfileService;
168
+ this.currentLanguage = this.localId.replace(/-[A-Z]+$/, '');
169
+ }
170
+ async setLanguage(language) {
171
+ await this.userProfileService.setLanguage(language);
172
+ this.redirect(language);
173
+ }
174
+ redirect(next, current = this.currentLanguage) {
175
+ if (current === next) {
176
+ console.warn('[I18nService] redirect not required - language unchanged');
177
+ return;
327
178
  }
328
- return 3;
179
+ const redirectUrl = location.origin +
180
+ location.pathname.replace(new RegExp(`^/${current}`), `/${next}`) +
181
+ location.search;
182
+ console.log('[I18nService] redirect to: ' + redirectUrl);
183
+ location.replace(redirectUrl);
329
184
  }
330
- constructor(grid, config) {
331
- this.config = config;
332
- this.isOpen = false;
333
- this.grid = [];
334
- this.grid = grid ?? this.config.get('navigation.apps') ?? [];
335
- }
336
- static { this.ɵfac = function AppsButtonComponent_Factory(t) { return new (t || AppsButtonComponent)(i0.ɵɵdirectiveInject(RXAP_LAYOUT_APPS_GRID, 8), i0.ɵɵdirectiveInject(ConfigService)); }; }
337
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AppsButtonComponent, selectors: [["rxap-apps-button"]], hostAttrs: [1, "rxap-apps-button"], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 1, vars: 1, consts: [[3, "ngIf"], ["cdkOverlayOrigin", "", "mat-icon-button", "", 3, "click"], ["trigger", "cdkOverlayOrigin"], ["cdkConnectedOverlay", "", 3, "cdkConnectedOverlayOpen", "cdkConnectedOverlayOrigin", "overlayOutsideClick"], [1, "grid-container"], [1, "grid", 3, "ngStyle"], [3, "ngClass", 4, "ngFor", "ngForOf"], [3, "ngClass"], [3, "href", 4, "ngIf"], [3, "href"], ["fxLayout", "column", "fxLayoutAlign", "start center", "fxLayoutGap", "12px"], ["width", "53px", 3, "src"]], template: function AppsButtonComponent_Template(rf, ctx) { if (rf & 1) {
338
- i0.ɵɵtemplate(0, AppsButtonComponent_ng_template_0_Template, 5, 2, "ng-template", 0);
339
- } if (rf & 2) {
340
- i0.ɵɵproperty("ngIf", ctx.grid && ctx.grid.length);
341
- } }, dependencies: [NgIf,
342
- MatButtonModule, i1$2.MatIconButton, CdkOverlayOrigin,
343
- MatIconModule, i2$2.MatIcon, CdkConnectedOverlay,
344
- ExtendedModule, i2$4.DefaultClassDirective, i2$4.DefaultStyleDirective, NgStyle,
345
- NgFor,
346
- NgClass,
347
- FlexModule, i1$3.DefaultLayoutDirective, i1$3.DefaultLayoutGapDirective, i1$3.DefaultLayoutAlignDirective], styles: [".grid-container[_ngcontent-%COMP%]{padding:8px;border:1px solid rgba(0,0,0,.2);border-radius:8px;box-shadow:0 1px 2px #3c40434d,0 2px 6px 2px #3c404326}.grid[_ngcontent-%COMP%]{list-style-type:none;margin:0;padding:0}.grid[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{border-radius:8px;padding:6px;height:84px;width:84px;transition-delay:0s;transition-duration:.2s;transition-property:tramsform;transition-timing-function:cubic-bezier(.333,0,0,1);position:relative}.grid[_ngcontent-%COMP%] li[_ngcontent-%COMP%] a[_ngcontent-%COMP%]{position:absolute;inset:6px;text-align:center;text-decoration:none;color:#000}"], changeDetection: 0 }); }
185
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nService, deps: [{ token: LOCALE_ID }, { token: i1$2.RxapUserProfileService }], target: i0.ɵɵFactoryTarget.Injectable }); }
186
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nService, providedIn: 'root' }); }
348
187
  }
349
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AppsButtonComponent, [{
350
- type: Component,
351
- args: [{ selector: 'rxap-apps-button', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'rxap-apps-button' }, standalone: true, imports: [
352
- NgIf,
353
- MatButtonModule,
354
- CdkOverlayOrigin,
355
- MatIconModule,
356
- CdkConnectedOverlay,
357
- ExtendedModule,
358
- NgStyle,
359
- NgFor,
360
- NgClass,
361
- FlexModule
362
- ], template: "<ng-template [ngIf]=\"grid && grid.length\">\n <button #trigger=\"cdkOverlayOrigin\" (click)=\"isOpen = !isOpen\" cdkOverlayOrigin mat-icon-button>\n <mat-icon>apps</mat-icon>\n </button>\n\n <ng-template (overlayOutsideClick)=\"isOpen = false\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n cdkConnectedOverlay>\n\n <div class=\"grid-container\">\n\n <ul [ngStyle]=\"{ columns: columns }\" class=\"grid\">\n <li *ngFor=\"let item of gridWithPadding\" [ngClass]=\"{ empty: item.empty }\">\n <a *ngIf=\"!item.empty\" [href]=\"item.href\">\n\n <span fxLayout=\"column\" fxLayoutAlign=\"start center\" fxLayoutGap=\"12px\">\n <img [src]=\"item.image\" width=\"53px\">\n <span>{{item.label}}</span>\n </span>\n\n </a>\n </li>\n </ul>\n\n </div>\n\n </ng-template>\n</ng-template>\n", styles: [".grid-container{padding:8px;border:1px solid rgba(0,0,0,.2);border-radius:8px;box-shadow:0 1px 2px #3c40434d,0 2px 6px 2px #3c404326}.grid{list-style-type:none;margin:0;padding:0}.grid li{border-radius:8px;padding:6px;height:84px;width:84px;transition-delay:0s;transition-duration:.2s;transition-property:tramsform;transition-timing-function:cubic-bezier(.333,0,0,1);position:relative}.grid li a{position:absolute;inset:6px;text-align:center;text-decoration:none;color:#000}\n"] }]
363
- }], function () { return [{ type: undefined, decorators: [{
364
- type: Optional
365
- }, {
366
- type: Inject,
367
- args: [RXAP_LAYOUT_APPS_GRID]
368
- }] }, { type: i1$4.ConfigService, decorators: [{
369
- type: Inject,
370
- args: [ConfigService]
371
- }] }]; }, null); })();
188
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nService, decorators: [{
189
+ type: Injectable,
190
+ args: [{ providedIn: 'root' }]
191
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
192
+ type: Inject,
193
+ args: [LOCALE_ID]
194
+ }] }, { type: i1$2.RxapUserProfileService }]; } });
372
195
 
373
- function LanguageSelectorComponent_ng_template_0_mat_option_3_Template(rf, ctx) { if (rf & 1) {
374
- i0.ɵɵelementStart(0, "mat-option", 4);
375
- i0.ɵɵtext(1);
376
- i0.ɵɵelementEnd();
377
- } if (rf & 2) {
378
- const item_r2 = ctx.$implicit;
379
- i0.ɵɵproperty("value", item_r2.key);
380
- i0.ɵɵadvance(1);
381
- i0.ɵɵtextInterpolate(item_r2.value);
382
- } }
383
- function LanguageSelectorComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {
384
- const _r4 = i0.ɵɵgetCurrentView();
385
- i0.ɵɵelementStart(0, "div")(1, "mat-form-field", 1)(2, "mat-select", 2);
386
- i0.ɵɵlistener("ngModelChange", function LanguageSelectorComponent_ng_template_0_Template_mat_select_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.language.setLanguage($event)); });
387
- i0.ɵɵtemplate(3, LanguageSelectorComponent_ng_template_0_mat_option_3_Template, 2, 2, "mat-option", 3);
388
- i0.ɵɵpipe(4, "keyvalue");
389
- i0.ɵɵelementEnd()()();
390
- } if (rf & 2) {
391
- const ctx_r0 = i0.ɵɵnextContext();
392
- i0.ɵɵadvance(2);
393
- i0.ɵɵproperty("ngModel", ctx_r0.language.selectedLanguage);
394
- i0.ɵɵadvance(1);
395
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(4, 2, ctx_r0.language.languages));
396
- } }
397
- const RXAP_SELECTED_LANGUAGE_LOCAL_STORAGE_KEY = 'rxap__selected_language';
398
- const RXAP_SELECTED_LANGUAGE_CHANGE_LOCAL_STORAGE_KEY = 'rxap__selected_language_last_change';
399
196
  class LanguageSelectorService {
400
- constructor(config) {
197
+ constructor(config, localId, i18nService) {
401
198
  this.config = config;
199
+ this.localId = localId;
200
+ this.i18nService = i18nService;
402
201
  this.languages = this.config.get('i18n.languages') ?? {};
403
202
  this.defaultLanguage =
404
203
  this.config.get('i18n.defaultLanguage') ??
405
204
  Object.keys(this.languages)[0] ??
406
205
  'en';
407
- this.selectedLanguage =
408
- localStorage.getItem(RXAP_SELECTED_LANGUAGE_LOCAL_STORAGE_KEY) ??
409
- this.defaultLanguage;
206
+ this.selectedLanguage = this.i18nService.currentLanguage;
410
207
  }
411
- setLanguage(language) {
412
- if (language !== this.selectedLanguage) {
413
- this.redirect(language);
208
+ async setLanguage(language) {
209
+ if (language !== this.i18nService.currentLanguage) {
210
+ await this.i18nService.setLanguage(language);
414
211
  }
415
212
  }
416
- autoRedirect() {
417
- if (localStorage.getItem(RXAP_SELECTED_LANGUAGE_LOCAL_STORAGE_KEY)) {
418
- this.redirect(localStorage.getItem(RXAP_SELECTED_LANGUAGE_LOCAL_STORAGE_KEY));
419
- }
420
- }
421
- redirect(language) {
422
- const currentUrl = location.origin + location.pathname + location.search;
423
- const redirectUrl = location.origin +
424
- `/${language}` +
425
- location.pathname.replace(new RegExp(`^\/${this.selectedLanguage}`), '') +
426
- location.search;
427
- this.selectedLanguage = language;
428
- localStorage.setItem(RXAP_SELECTED_LANGUAGE_LOCAL_STORAGE_KEY, language);
429
- if (currentUrl !== redirectUrl) {
430
- if (this.checkLastChange()) {
431
- location.replace(redirectUrl);
432
- }
433
- }
434
- else {
435
- console.log('Redirect not required');
436
- }
437
- }
438
- checkLastChange() {
439
- const lastChangeString = localStorage.getItem(RXAP_SELECTED_LANGUAGE_CHANGE_LOCAL_STORAGE_KEY);
440
- if (lastChangeString) {
441
- if (Date.now() - parseInt(lastChangeString, 10) < 1000) {
442
- return false;
443
- }
444
- }
445
- localStorage.setItem(RXAP_SELECTED_LANGUAGE_CHANGE_LOCAL_STORAGE_KEY, Date.now().toFixed(0));
446
- return true;
447
- }
448
- static { this.ɵfac = function LanguageSelectorService_Factory(t) { return new (t || LanguageSelectorService)(i0.ɵɵinject(ConfigService)); }; }
449
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: LanguageSelectorService, factory: LanguageSelectorService.ɵfac, providedIn: 'root' }); }
213
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorService, deps: [{ token: i1$1.ConfigService }, { token: LOCALE_ID }, { token: I18nService }], target: i0.ɵɵFactoryTarget.Injectable }); }
214
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorService, providedIn: 'root' }); }
450
215
  }
451
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LanguageSelectorService, [{
452
- type: Injectable,
453
- args: [{ providedIn: 'root' }]
454
- }], function () { return [{ type: i1$4.ConfigService, decorators: [{
455
- type: Inject,
456
- args: [ConfigService]
457
- }] }]; }, null); })();
216
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorService, decorators: [{
217
+ type: Injectable,
218
+ args: [{ providedIn: 'root' }]
219
+ }], ctorParameters: function () { return [{ type: i1$1.ConfigService }, { type: undefined, decorators: [{
220
+ type: Inject,
221
+ args: [LOCALE_ID]
222
+ }] }, { type: I18nService }]; } });
223
+
458
224
  class LanguageSelectorComponent {
459
225
  constructor(language) {
460
226
  this.language = language;
461
227
  }
462
- static { this.ɵfac = function LanguageSelectorComponent_Factory(t) { return new (t || LanguageSelectorComponent)(i0.ɵɵdirectiveInject(LanguageSelectorService)); }; }
463
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LanguageSelectorComponent, selectors: [["rxap-language-selector"]], hostAttrs: [1, "rxap-language-selector"], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 2, vars: 3, consts: [[3, "ngIf"], ["appearance", "outline", 1, "language-selector"], [3, "ngModel", "ngModelChange"], [3, "value", 4, "ngFor", "ngForOf"], [3, "value"]], template: function LanguageSelectorComponent_Template(rf, ctx) { if (rf & 1) {
464
- i0.ɵɵtemplate(0, LanguageSelectorComponent_ng_template_0_Template, 5, 4, "ng-template", 0);
465
- i0.ɵɵpipe(1, "keyvalue");
466
- } if (rf & 2) {
467
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(1, 1, ctx.language.languages).length);
468
- } }, dependencies: [NgIf,
469
- MatFormFieldModule, i2$5.MatFormField, MatSelectModule, i3$1.MatSelect, i4$1.MatOption, FormsModule, i5.NgControlStatus, i5.NgModel, NgFor,
470
- MatOptionModule,
471
- KeyValuePipe], styles: [".language-selector[_ngcontent-%COMP%]{width:142px}.language-selector[_ngcontent-%COMP%] .mat-form-field-wrapper{padding-bottom:0}.language-selector[_ngcontent-%COMP%] .mat-form-field-wrapper .mat-form-field-infix{padding:12px 0;border-width:6px}.language-selector[_ngcontent-%COMP%] .mat-form-field-wrapper .mat-form-field-infix .mat-select-arrow-wrapper{transform:translateY(0)}"], changeDetection: 0 }); }
228
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorComponent, deps: [{ token: LanguageSelectorService }], target: i0.ɵɵFactoryTarget.Component }); }
229
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: LanguageSelectorComponent, isStandalone: true, selector: "rxap-language-selector", ngImport: i0, template: "<ng-template [ngIf]=\"(language.languages | keyvalue).length\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-selector\" rxapStopPropagation>\n <mat-label i18n>Select Language</mat-label>\n <mat-select (ngModelChange)=\"language.setLanguage($event)\" [ngModel]=\"language.selectedLanguage\">\n <mat-option *ngFor=\"let item of language.languages | keyvalue\" [value]=\"item.key\">{{item.value}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n</ng-template>\n", styles: [".language-selector{width:calc(100% - 32px);margin:0 16px}.language-selector ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:12px 0;border-width:6px}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix .mat-select-arrow-wrapper{transform:translateY(0)}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: StopPropagationDirective, selector: "[rxapStopPropagation]" }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3$1.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
472
230
  }
473
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LanguageSelectorComponent, [{
474
- type: Component,
475
- args: [{ selector: 'rxap-language-selector', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'rxap-language-selector' }, standalone: true, imports: [
476
- NgIf,
477
- MatFormFieldModule,
478
- MatSelectModule,
479
- FormsModule,
480
- NgFor,
481
- MatOptionModule,
482
- KeyValuePipe
483
- ], template: "<ng-template [ngIf]=\"(language.languages | keyvalue).length\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-selector\">\n <mat-select (ngModelChange)=\"language.setLanguage($event)\" [ngModel]=\"language.selectedLanguage\">\n <mat-option *ngFor=\"let item of language.languages | keyvalue\" [value]=\"item.key\">{{item.value}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n</ng-template>\n", styles: [".language-selector{width:142px}.language-selector ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:12px 0;border-width:6px}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix .mat-select-arrow-wrapper{transform:translateY(0)}\n"] }]
484
- }], function () { return [{ type: LanguageSelectorService }]; }, null); })();
231
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LanguageSelectorComponent, decorators: [{
232
+ type: Component,
233
+ args: [{ selector: 'rxap-language-selector', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
234
+ NgIf,
235
+ MatFormFieldModule,
236
+ StopPropagationDirective,
237
+ MatSelectModule,
238
+ FormsModule,
239
+ NgFor,
240
+ MatOptionModule,
241
+ KeyValuePipe,
242
+ ], template: "<ng-template [ngIf]=\"(language.languages | keyvalue).length\">\n <div>\n <mat-form-field appearance=\"outline\" class=\"language-selector\" rxapStopPropagation>\n <mat-label i18n>Select Language</mat-label>\n <mat-select (ngModelChange)=\"language.setLanguage($event)\" [ngModel]=\"language.selectedLanguage\">\n <mat-option *ngFor=\"let item of language.languages | keyvalue\" [value]=\"item.key\">{{item.value}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n</ng-template>\n", styles: [".language-selector{width:calc(100% - 32px);margin:0 16px}.language-selector ::ng-deep .mat-form-field-wrapper{padding-bottom:0}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix{padding:12px 0;border-width:6px}.language-selector ::ng-deep .mat-form-field-wrapper .mat-form-field-infix .mat-select-arrow-wrapper{transform:translateY(0)}\n"] }]
243
+ }], ctorParameters: function () { return [{ type: LanguageSelectorService }]; } });
485
244
 
486
- function SidenavToggleButtonComponent_mat_icon_1_Template(rf, ctx) { if (rf & 1) {
487
- i0.ɵɵelementStart(0, "mat-icon");
488
- i0.ɵɵtext(1, "menu");
489
- i0.ɵɵelementEnd();
490
- } }
491
- function SidenavToggleButtonComponent_mat_icon_2_Template(rf, ctx) { if (rf & 1) {
492
- i0.ɵɵelementStart(0, "mat-icon");
493
- i0.ɵɵtext(1, "menu_open");
494
- i0.ɵɵelementEnd();
495
- } }
496
- class SidenavToggleButtonComponent {
497
- static { this.ɵfac = function SidenavToggleButtonComponent_Factory(t) { return new (t || SidenavToggleButtonComponent)(); }; }
498
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SidenavToggleButtonComponent, selectors: [["rxap-sidenav-toggle-button"]], hostAttrs: [1, "rxap-sidenav-toggle-button"], inputs: { sidenav: "sidenav" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 3, vars: 2, consts: [["mat-icon-button", "", 3, "click"], [4, "ngIf"]], template: function SidenavToggleButtonComponent_Template(rf, ctx) { if (rf & 1) {
499
- i0.ɵɵelementStart(0, "button", 0);
500
- i0.ɵɵlistener("click", function SidenavToggleButtonComponent_Template_button_click_0_listener() { return ctx.sidenav.toggle(); });
501
- i0.ɵɵtemplate(1, SidenavToggleButtonComponent_mat_icon_1_Template, 2, 0, "mat-icon", 1);
502
- i0.ɵɵtemplate(2, SidenavToggleButtonComponent_mat_icon_2_Template, 2, 0, "mat-icon", 1);
503
- i0.ɵɵelementEnd();
504
- } if (rf & 2) {
505
- i0.ɵɵadvance(1);
506
- i0.ɵɵproperty("ngIf", !ctx.sidenav.opened);
507
- i0.ɵɵadvance(1);
508
- i0.ɵɵproperty("ngIf", ctx.sidenav.opened);
509
- } }, dependencies: [MatButtonModule, i1$2.MatIconButton, NgIf, MatIconModule, i2$2.MatIcon], changeDetection: 0 }); }
245
+ class NavigationProgressBarComponent {
246
+ constructor(router) {
247
+ this.router = router;
248
+ this.navigating$ = this.router.events.pipe(filter(event => event instanceof NavigationStart ||
249
+ event instanceof NavigationEnd ||
250
+ event instanceof NavigationCancel), map(event => event instanceof NavigationStart));
251
+ }
252
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationProgressBarComponent, deps: [{ token: Router }], target: i0.ɵɵFactoryTarget.Component }); }
253
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: NavigationProgressBarComponent, isStandalone: true, selector: "rxap-navigation-progress-bar", ngImport: i0, template: "<mat-progress-bar\n *ngIf=\"navigating$ | async\"\n color=\"accent\"\n mode=\"indeterminate\"\n></mat-progress-bar>\n", styles: [""], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i1$4.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
510
254
  }
511
- __decorate([
512
- Required,
513
- __metadata("design:type", MatSidenav)
514
- ], SidenavToggleButtonComponent.prototype, "sidenav", void 0);
515
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SidenavToggleButtonComponent, [{
516
- type: Component,
517
- args: [{ selector: 'rxap-sidenav-toggle-button', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'rxap-sidenav-toggle-button' }, standalone: true, imports: [MatButtonModule, NgIf, MatIconModule], template: "<button (click)=\"sidenav.toggle()\" mat-icon-button>\n <mat-icon *ngIf=\"!sidenav.opened\">menu</mat-icon>\n <mat-icon *ngIf=\"sidenav.opened\">menu_open</mat-icon>\n</button>\n" }]
518
- }], null, { sidenav: [{
519
- type: Input
520
- }] }); })();
255
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationProgressBarComponent, decorators: [{
256
+ type: Component,
257
+ args: [{ selector: 'rxap-navigation-progress-bar', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
258
+ NgIf,
259
+ MatProgressBarModule,
260
+ AsyncPipe,
261
+ ], template: "<mat-progress-bar\n *ngIf=\"navigating$ | async\"\n color=\"accent\"\n mode=\"indeterminate\"\n></mat-progress-bar>\n" }]
262
+ }], ctorParameters: function () { return [{ type: i2$3.Router, decorators: [{
263
+ type: Inject,
264
+ args: [Router]
265
+ }] }]; } });
266
+
267
+ class SettingsButtonComponent {
268
+ constructor(theme, route, injector) {
269
+ this.theme = theme;
270
+ this.route = route;
271
+ this.injector = injector;
272
+ this.isDevMode = isDevMode();
273
+ this.items = signal([]);
274
+ }
275
+ ngOnDestroy() {
276
+ this._subscription?.unsubscribe();
277
+ }
278
+ ngOnInit() {
279
+ this._subscription = this.route.data.pipe(map(data => this.getCustomMenuItems(data)), map(items => items.map(item => new ComponentPortal(item, undefined, this.injector))), tap(items => this.items.set(items))).subscribe();
280
+ }
281
+ getCustomMenuItems(data) {
282
+ if (data?.layout?.header?.menu?.items?.length) {
283
+ return data.layout.header.menu.items;
284
+ }
285
+ return [];
286
+ }
287
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SettingsButtonComponent, deps: [{ token: i1.ThemeService }, { token: i2$3.ActivatedRoute }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
288
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SettingsButtonComponent, isStandalone: true, selector: "rxap-settings-button", ngImport: i0, template: "<button [matMenuTriggerFor]=\"menu\" mat-icon-button>\n <mat-icon svgIcon=\"cog\"></mat-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\">\n <button (click)=\"theme.toggleDarkTheme()\" mat-menu-item>\n <mat-icon *ngIf=\"theme.darkMode\" svgIcon=\"brightness-2\"></mat-icon>\n <mat-icon *ngIf=\"!theme.darkMode\" svgIcon=\"brightness-5\"></mat-icon>\n <span i18n>Mode</span>\n </button>\n <rxap-language-selector *ngIf=\"!isDevMode\"></rxap-language-selector>\n <ng-container *ngFor=\"let item of items()\">\n <ng-template [cdkPortalOutlet]=\"item\"></ng-template>\n </ng-container>\n</mat-menu>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: LanguageSelectorComponent, selector: "rxap-language-selector" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] }); }
289
+ }
290
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SettingsButtonComponent, decorators: [{
291
+ type: Component,
292
+ args: [{ selector: 'rxap-settings-button', standalone: true, imports: [CommonModule, MatButtonModule, MatIconModule, LanguageSelectorComponent, MatMenuModule, PortalModule], template: "<button [matMenuTriggerFor]=\"menu\" mat-icon-button>\n <mat-icon svgIcon=\"cog\"></mat-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\">\n <button (click)=\"theme.toggleDarkTheme()\" mat-menu-item>\n <mat-icon *ngIf=\"theme.darkMode\" svgIcon=\"brightness-2\"></mat-icon>\n <mat-icon *ngIf=\"!theme.darkMode\" svgIcon=\"brightness-5\"></mat-icon>\n <span i18n>Mode</span>\n </button>\n <rxap-language-selector *ngIf=\"!isDevMode\"></rxap-language-selector>\n <ng-container *ngFor=\"let item of items()\">\n <ng-template [cdkPortalOutlet]=\"item\"></ng-template>\n </ng-container>\n</mat-menu>\n" }]
293
+ }], ctorParameters: function () { return [{ type: i1.ThemeService }, { type: i2$3.ActivatedRoute }, { type: i0.Injector }]; } });
294
+
295
+ class UserProfileIconComponent {
296
+ constructor(userProfileService, authenticationService) {
297
+ this.userProfileService = userProfileService;
298
+ this.authenticationService = authenticationService;
299
+ this.username = signal(null);
300
+ }
301
+ ngOnInit() {
302
+ this._subscription = this.authenticationService.isAuthenticated$.pipe(filter$1(Boolean), switchMap$1(() => this.userProfileService.getProfile()), filter$1(Boolean), tap((user) => this.username.set(user.username ?? null))).subscribe();
303
+ }
304
+ ngOnDestroy() {
305
+ this._subscription?.unsubscribe();
306
+ }
307
+ async logout() {
308
+ await this.authenticationService.signOut();
309
+ }
310
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: UserProfileIconComponent, deps: [{ token: i1$2.RxapUserProfileService }, { token: i1$2.RxapAuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
311
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: UserProfileIconComponent, isStandalone: true, selector: "rxap-user-profile-icon", ngImport: i0, template: "<button [matMenuTriggerFor]=\"menu\"\n [disabled]=\"!username()\"\n class=\"profile-icon flex flex-row justify-center items-center\">\n <mat-icon class=\"avatar-icon\" svgIcon=\"account-circle\"></mat-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\" [yPosition]=\"'below'\" class=\"!max-w-none\">\n <button mat-menu-item>\n <span class=\"flex flex-row gap-2\">\n <mat-icon svgIcon=\"account\"></mat-icon>\n <span>{{username()}}</span>\n </span>\n </button>\n <button (click)=\"logout()\" mat-menu-item>\n <span class=\"flex flex-row gap-2\">\n <mat-icon svgIcon=\"logout\"></mat-icon>\n <span i18n>Logout</span>\n </span>\n </button>\n</mat-menu>\n", styles: [".profile-icon{border-radius:100%;border:none;height:32px;width:32px;overflow:hidden;background-position:center center;background-repeat:no-repeat;background-size:cover}.profile-icon .avatar-icon{width:32px;height:32px;font-size:32px}.profile-icon:hover{cursor:pointer}.profile-icon:focus{outline:none}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i6.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i6.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i6.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
312
+ }
313
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: UserProfileIconComponent, decorators: [{
314
+ type: Component,
315
+ args: [{ selector: 'rxap-user-profile-icon', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
316
+ MatMenuModule,
317
+ MatIconModule,
318
+ NgIf,
319
+ AsyncPipe,
320
+ ], template: "<button [matMenuTriggerFor]=\"menu\"\n [disabled]=\"!username()\"\n class=\"profile-icon flex flex-row justify-center items-center\">\n <mat-icon class=\"avatar-icon\" svgIcon=\"account-circle\"></mat-icon>\n</button>\n\n<mat-menu #menu=\"matMenu\" [yPosition]=\"'below'\" class=\"!max-w-none\">\n <button mat-menu-item>\n <span class=\"flex flex-row gap-2\">\n <mat-icon svgIcon=\"account\"></mat-icon>\n <span>{{username()}}</span>\n </span>\n </button>\n <button (click)=\"logout()\" mat-menu-item>\n <span class=\"flex flex-row gap-2\">\n <mat-icon svgIcon=\"logout\"></mat-icon>\n <span i18n>Logout</span>\n </span>\n </button>\n</mat-menu>\n", styles: [".profile-icon{border-radius:100%;border:none;height:32px;width:32px;overflow:hidden;background-position:center center;background-repeat:no-repeat;background-size:cover}.profile-icon .avatar-icon{width:32px;height:32px;font-size:32px}.profile-icon:hover{cursor:pointer}.profile-icon:focus{outline:none}\n"] }]
321
+ }], ctorParameters: function () { return [{ type: i1$2.RxapUserProfileService }, { type: i1$2.RxapAuthenticationService }]; } });
521
322
 
522
- function HeaderComponent_mat_toolbar_row_1_ng_container_1_Template(rf, ctx) { if (rf & 1) {
523
- i0.ɵɵelementContainer(0);
524
- } }
525
- function HeaderComponent_mat_toolbar_row_1_Template(rf, ctx) { if (rf & 1) {
526
- i0.ɵɵelementStart(0, "mat-toolbar-row");
527
- i0.ɵɵtemplate(1, HeaderComponent_mat_toolbar_row_1_ng_container_1_Template, 1, 0, "ng-container", 7);
528
- i0.ɵɵelementEnd();
529
- } if (rf & 2) {
530
- const headerComponent_r4 = ctx.$implicit;
531
- i0.ɵɵadvance(1);
532
- i0.ɵɵproperty("ngComponentOutlet", headerComponent_r4);
533
- } }
534
- function HeaderComponent_rxap_sidenav_toggle_button_4_Template(rf, ctx) { if (rf & 1) {
535
- i0.ɵɵelement(0, "rxap-sidenav-toggle-button", 8);
536
- } if (rf & 2) {
537
- const ctx_r1 = i0.ɵɵnextContext();
538
- i0.ɵɵproperty("sidenav", ctx_r1.sidenav);
539
- } }
540
- function HeaderComponent_rxap_user_profile_icon_9_Template(rf, ctx) { if (rf & 1) {
541
- i0.ɵɵelement(0, "rxap-user-profile-icon", 5);
542
- } }
543
- function HeaderComponent_div_11_Template(rf, ctx) { if (rf & 1) {
544
- i0.ɵɵelementStart(0, "div", 5)(1, "button", 9)(2, "mat-icon");
545
- i0.ɵɵtext(3, "settings");
546
- i0.ɵɵelementEnd()()();
547
- } if (rf & 2) {
548
- const ctx_r3 = i0.ɵɵnextContext();
549
- i0.ɵɵadvance(1);
550
- i0.ɵɵproperty("matMenuTriggerFor", ctx_r3.settingsMenuPanel);
551
- } }
552
- const _c0$4 = function (a0) { return { open: a0 }; };
553
- const _c1$3 = ["*"];
554
323
  class HeaderComponent {
555
- constructor(headerComponentService, userService, headerComponent) {
324
+ constructor(headerComponentService, headerComponent) {
556
325
  this.headerComponentService = headerComponentService;
557
- this.userService = userService;
558
326
  this.headerComponent = headerComponent;
559
327
  this.components = [];
560
328
  this.subscriptions = new Subscription();
561
- this.color = 'primary';
562
- this.hasUser$ = this.userService.user$.pipe(map(Boolean));
329
+ this.color = undefined;
563
330
  }
564
331
  ngOnInit() {
565
332
  this.updateComponents();
@@ -573,377 +340,266 @@ class HeaderComponent {
573
340
  ngOnDestroy() {
574
341
  this.subscriptions.unsubscribe();
575
342
  }
576
- static { this.ɵfac = function HeaderComponent_Factory(t) { return new (t || HeaderComponent)(i0.ɵɵdirectiveInject(HeaderService), i0.ɵɵdirectiveInject(UserService), i0.ɵɵdirectiveInject(RXAP_HEADER_COMPONENT, 8)); }; }
577
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: HeaderComponent, selectors: [["rxap-header"]], hostAttrs: [1, "rxap-layout-header"], inputs: { sidenav: "sidenav", color: "color", settingsMenuPanel: "settingsMenuPanel" }, standalone: true, features: [i0.ɵɵStandaloneFeature], ngContentSelectors: _c1$3, decls: 14, vars: 10, consts: [[1, "mat-elevation-z3", 3, "ngClass", "color"], [4, "ngFor", "ngForOf"], ["fxLayout", "row", "fxLayoutAlign", "space-between center", "fxLayoutGap", "16px", 1, "content"], ["fxFlex", "nogrow", 3, "sidenav", 4, "ngIf"], ["fxFlex", "grow"], ["fxFlex", "nogrow"], ["fxFlex", "nogrow", 4, "ngIf"], [4, "ngComponentOutlet"], ["fxFlex", "nogrow", 3, "sidenav"], ["mat-icon-button", "", 3, "matMenuTriggerFor"]], template: function HeaderComponent_Template(rf, ctx) { if (rf & 1) {
578
- i0.ɵɵprojectionDef();
579
- i0.ɵɵelementStart(0, "mat-toolbar", 0);
580
- i0.ɵɵtemplate(1, HeaderComponent_mat_toolbar_row_1_Template, 2, 1, "mat-toolbar-row", 1);
581
- i0.ɵɵelementStart(2, "mat-toolbar-row")(3, "div", 2);
582
- i0.ɵɵtemplate(4, HeaderComponent_rxap_sidenav_toggle_button_4_Template, 1, 1, "rxap-sidenav-toggle-button", 3);
583
- i0.ɵɵelementStart(5, "div", 4);
584
- i0.ɵɵprojection(6);
585
- i0.ɵɵelementEnd();
586
- i0.ɵɵelement(7, "rxap-language-selector", 5)(8, "rxap-apps-button", 5);
587
- i0.ɵɵtemplate(9, HeaderComponent_rxap_user_profile_icon_9_Template, 1, 0, "rxap-user-profile-icon", 6);
588
- i0.ɵɵpipe(10, "async");
589
- i0.ɵɵtemplate(11, HeaderComponent_div_11_Template, 4, 1, "div", 6);
590
- i0.ɵɵelement(12, "rxap-sign-out", 5);
591
- i0.ɵɵelementEnd()()();
592
- i0.ɵɵelement(13, "rxap-navigation-progress-bar");
593
- } if (rf & 2) {
594
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(8, _c0$4, ctx.sidenav == null ? null : ctx.sidenav.opened))("color", ctx.color);
595
- i0.ɵɵadvance(1);
596
- i0.ɵɵproperty("ngForOf", ctx.components);
597
- i0.ɵɵadvance(3);
598
- i0.ɵɵproperty("ngIf", ctx.sidenav);
599
- i0.ɵɵadvance(5);
600
- i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(10, 6, ctx.hasUser$));
601
- i0.ɵɵadvance(2);
602
- i0.ɵɵproperty("ngIf", ctx.settingsMenuPanel);
603
- } }, dependencies: [MatToolbarModule, i2.MatToolbar, i2.MatToolbarRow, ExtendedModule, i2$4.DefaultClassDirective, NgClass,
604
- NgFor,
605
- NgComponentOutlet,
606
- FlexModule, i1$3.DefaultLayoutDirective, i1$3.DefaultLayoutGapDirective, i1$3.DefaultLayoutAlignDirective, i1$3.DefaultFlexDirective, NgIf,
607
- SidenavToggleButtonComponent,
608
- LanguageSelectorComponent,
609
- AppsButtonComponent,
610
- UserProfileIconComponent,
611
- MatButtonModule, i1$2.MatIconButton, MatMenuModule, i2$3.MatMenuTrigger, MatIconModule, i2$2.MatIcon, SignOutComponent,
612
- NavigationProgressBarComponent,
613
- AsyncPipe], styles: [".content[_ngcontent-%COMP%]{width:100%;height:64px}"], changeDetection: 0 }); }
343
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HeaderComponent, deps: [{ token: HeaderService }, { token: RXAP_HEADER_COMPONENT, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
344
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: HeaderComponent, isStandalone: true, selector: "rxap-header", inputs: { sidenav: "sidenav", color: "color" }, ngImport: i0, template: "<mat-toolbar [color]=\"color\" [ngClass]=\"{ open: sidenav?.opened }\" class=\"mat-elevation-z3 header\">\n <div class=\"w-full flex flex-row gap-x-4 justify-between items-center\">\n <rxap-status-indicator class=\"grow-0\"></rxap-status-indicator>\n <div class=\"grow\">\n <ng-content></ng-content>\n </div>\n <rxap-apps-button class=\"grow-0\"></rxap-apps-button>\n <rxap-settings-button class=\"grow-0\"></rxap-settings-button>\n <rxap-user-profile-icon class=\"grow-0\"></rxap-user-profile-icon>\n </div>\n</mat-toolbar>\n\n<rxap-navigation-progress-bar></rxap-navigation-progress-bar>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: NavigationProgressBarComponent, selector: "rxap-navigation-progress-bar" }, { kind: "component", type: UserProfileIconComponent, selector: "rxap-user-profile-icon" }, { kind: "component", type: AppsButtonComponent, selector: "rxap-apps-button" }, { kind: "component", type: SettingsButtonComponent, selector: "rxap-settings-button" }, { kind: "component", type: StatusIndicatorComponent, selector: "rxap-status-indicator" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
345
+ }
346
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: HeaderComponent, decorators: [{
347
+ type: Component,
348
+ args: [{ selector: 'rxap-header', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
349
+ MatToolbarModule,
350
+ NgClass,
351
+ NgIf,
352
+ MatButtonModule,
353
+ MatMenuModule,
354
+ MatIconModule,
355
+ LanguageSelectorComponent,
356
+ MatFormFieldModule,
357
+ StopPropagationDirective,
358
+ MatSelectModule,
359
+ FormsModule,
360
+ MatOptionModule,
361
+ DataSourceCollectionDirective,
362
+ MatSlideToggleModule,
363
+ AsyncPipe,
364
+ NavigationProgressBarComponent,
365
+ UserProfileIconComponent,
366
+ AppsButtonComponent,
367
+ SettingsButtonComponent,
368
+ StatusIndicatorComponent,
369
+ ], template: "<mat-toolbar [color]=\"color\" [ngClass]=\"{ open: sidenav?.opened }\" class=\"mat-elevation-z3 header\">\n <div class=\"w-full flex flex-row gap-x-4 justify-between items-center\">\n <rxap-status-indicator class=\"grow-0\"></rxap-status-indicator>\n <div class=\"grow\">\n <ng-content></ng-content>\n </div>\n <rxap-apps-button class=\"grow-0\"></rxap-apps-button>\n <rxap-settings-button class=\"grow-0\"></rxap-settings-button>\n <rxap-user-profile-icon class=\"grow-0\"></rxap-user-profile-icon>\n </div>\n</mat-toolbar>\n\n<rxap-navigation-progress-bar></rxap-navigation-progress-bar>\n" }]
370
+ }], ctorParameters: function () { return [{ type: i1.HeaderService, decorators: [{
371
+ type: Inject,
372
+ args: [HeaderService]
373
+ }] }, { type: undefined, decorators: [{
374
+ type: Optional
375
+ }, {
376
+ type: Inject,
377
+ args: [RXAP_HEADER_COMPONENT]
378
+ }] }]; }, propDecorators: { sidenav: [{
379
+ type: Input
380
+ }], color: [{
381
+ type: Input
382
+ }] } });
383
+
384
+ class SignOutComponent {
385
+ constructor(authenticationService) {
386
+ this.authenticationService = authenticationService;
387
+ }
388
+ async logout() {
389
+ await this.authenticationService.signOut();
390
+ }
391
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SignOutComponent, deps: [{ token: i1$2.RxapAuthenticationService }], target: i0.ɵɵFactoryTarget.Component }); }
392
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SignOutComponent, isStandalone: true, selector: "rxap-sign-out", ngImport: i0, template: "<button\n mat-icon-button\n (click)=\"logout()\"\n>\n <mat-icon svgIcon=\"logout\"></mat-icon>\n</button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
614
393
  }
615
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(HeaderComponent, [{
616
- type: Component,
617
- args: [{ selector: 'rxap-header', changeDetection: ChangeDetectionStrategy.OnPush, host: {
618
- class: 'rxap-layout-header'
619
- }, standalone: true, imports: [
620
- MatToolbarModule,
621
- ExtendedModule,
622
- NgClass,
623
- NgFor,
624
- NgComponentOutlet,
625
- FlexModule,
626
- NgIf,
627
- SidenavToggleButtonComponent,
628
- LanguageSelectorComponent,
629
- AppsButtonComponent,
630
- UserProfileIconComponent,
631
- MatButtonModule,
632
- MatMenuModule,
633
- MatIconModule,
634
- SignOutComponent,
635
- NavigationProgressBarComponent,
636
- AsyncPipe
637
- ], template: "<mat-toolbar [ngClass]=\"{ open: sidenav?.opened }\" [color]=\"color\" class=\"mat-elevation-z3\">\n <mat-toolbar-row *ngFor=\"let headerComponent of components\">\n <ng-container *ngComponentOutlet=\"headerComponent\"></ng-container>\n </mat-toolbar-row>\n <mat-toolbar-row>\n <div\n fxLayout=\"row\"\n fxLayoutAlign=\"space-between center\"\n fxLayoutGap=\"16px\"\n class=\"content\"\n >\n <rxap-sidenav-toggle-button *ngIf=\"sidenav\" fxFlex=\"nogrow\" [sidenav]=\"sidenav\"></rxap-sidenav-toggle-button>\n <div fxFlex=\"grow\">\n <ng-content></ng-content>\n </div>\n <rxap-language-selector fxFlex=\"nogrow\"></rxap-language-selector>\n <rxap-apps-button fxFlex=\"nogrow\"></rxap-apps-button>\n <rxap-user-profile-icon *ngIf=\"hasUser$ | async\" fxFlex=\"nogrow\"></rxap-user-profile-icon>\n <div fxFlex=\"nogrow\" *ngIf=\"settingsMenuPanel\">\n <button mat-icon-button [matMenuTriggerFor]=\"settingsMenuPanel\">\n <mat-icon>settings</mat-icon>\n </button>\n </div>\n <rxap-sign-out fxFlex=\"nogrow\"></rxap-sign-out>\n </div>\n </mat-toolbar-row>\n</mat-toolbar>\n<rxap-navigation-progress-bar></rxap-navigation-progress-bar>\n", styles: [".content{width:100%;height:64px}\n"] }]
638
- }], function () { return [{ type: i1.HeaderService, decorators: [{
639
- type: Inject,
640
- args: [HeaderService]
641
- }] }, { type: i4.UserService, decorators: [{
642
- type: Inject,
643
- args: [UserService]
644
- }] }, { type: undefined, decorators: [{
645
- type: Optional
646
- }, {
647
- type: Inject,
648
- args: [RXAP_HEADER_COMPONENT]
649
- }] }]; }, { sidenav: [{
650
- type: Input
651
- }], color: [{
652
- type: Input
653
- }], settingsMenuPanel: [{
654
- type: Input
655
- }] }); })();
394
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SignOutComponent, decorators: [{
395
+ type: Component,
396
+ args: [{ selector: 'rxap-sign-out', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatButtonModule, MatIconModule], template: "<button\n mat-icon-button\n (click)=\"logout()\"\n>\n <mat-icon svgIcon=\"logout\"></mat-icon>\n</button>\n" }]
397
+ }], ctorParameters: function () { return [{ type: i1$2.RxapAuthenticationService }]; } });
656
398
 
657
399
  class ResetButtonComponent {
658
400
  constructor(resetService) {
659
401
  this.resetService = resetService;
660
402
  }
661
- static { this.ɵfac = function ResetButtonComponent_Factory(t) { return new (t || ResetButtonComponent)(i0.ɵɵdirectiveInject(ResetService)); }; }
662
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ResetButtonComponent, selectors: [["rxap-reset-button"]], hostAttrs: [1, "rxap-reset-button"], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 3, vars: 0, consts: [["mat-icon-button", "", 3, "click"]], template: function ResetButtonComponent_Template(rf, ctx) { if (rf & 1) {
663
- i0.ɵɵelementStart(0, "button", 0);
664
- i0.ɵɵlistener("click", function ResetButtonComponent_Template_button_click_0_listener() { return ctx.resetService.resetAll(); });
665
- i0.ɵɵelementStart(1, "mat-icon");
666
- i0.ɵɵtext(2, "refresh");
667
- i0.ɵɵelementEnd()();
668
- } }, dependencies: [MatButtonModule, i1$2.MatIconButton, MatIconModule, i2$2.MatIcon], changeDetection: 0 }); }
403
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ResetButtonComponent, deps: [{ token: ResetService }], target: i0.ɵɵFactoryTarget.Component }); }
404
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: ResetButtonComponent, isStandalone: true, selector: "rxap-reset-button", ngImport: i0, template: "<button (click)=\"resetService.resetAll()\" mat-icon-button>\n <mat-icon svgIcon=\"refresh\"></mat-icon>\n</button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
669
405
  }
670
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResetButtonComponent, [{
671
- type: Component,
672
- args: [{ selector: 'rxap-reset-button', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'rxap-reset-button' }, standalone: true, imports: [MatButtonModule, MatIconModule], template: "<button (click)=\"resetService.resetAll()\" mat-icon-button>\n <mat-icon>refresh</mat-icon>\n</button>\n" }]
673
- }], function () { return [{ type: i1.ResetService, decorators: [{
674
- type: Inject,
675
- args: [ResetService]
676
- }] }]; }, null); })();
406
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ResetButtonComponent, decorators: [{
407
+ type: Component,
408
+ args: [{ selector: 'rxap-reset-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatButtonModule, MatIconModule], template: "<button (click)=\"resetService.resetAll()\" mat-icon-button>\n <mat-icon svgIcon=\"refresh\"></mat-icon>\n</button>\n" }]
409
+ }], ctorParameters: function () { return [{ type: i1.ResetService, decorators: [{
410
+ type: Inject,
411
+ args: [ResetService]
412
+ }] }]; } });
677
413
 
678
- class LayoutComponentService {
679
- constructor(footerComponentService, headerComponentService, logoConfig = null, config) {
680
- this.footerComponentService = footerComponentService;
681
- this.headerComponentService = headerComponentService;
682
- this.config = config;
683
- this.opened$ = new BehaviorSubject(true);
684
- this.mode$ = new BehaviorSubject('side');
685
- this.fixedTopGap$ = new BehaviorSubject(64);
686
- this.mode$.next(this.config.get('navigation.mode', this.mode$.value));
687
- this.opened$.next(this.config.get('navigation.open', this.opened$.value));
688
- this.fixedBottomGap$ = this.footerComponentService.portalCount$.pipe(map(count => count * 64));
689
- this.fixedTopGap$.next(this.headerComponentService.countComponent * 64);
690
- this.headerComponentService.update$.pipe(tap(() => this.fixedTopGap$.next(this.headerComponentService.countComponent * 64))).subscribe();
691
- this.logo = logoConfig ?? {
692
- src: '/assets/logo.png',
693
- width: '192'
694
- };
695
- }
696
- static { this.ɵfac = function LayoutComponentService_Factory(t) { return new (t || LayoutComponentService)(i0.ɵɵinject(i1.FooterService), i0.ɵɵinject(i1.HeaderService), i0.ɵɵinject(RXAP_LOGO_CONFIG, 8), i0.ɵɵinject(ConfigService)); }; }
697
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: LayoutComponentService, factory: LayoutComponentService.ɵfac, providedIn: 'root' }); }
414
+ class SidenavToggleButtonComponent {
415
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavToggleButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
416
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SidenavToggleButtonComponent, isStandalone: true, selector: "rxap-sidenav-toggle-button", inputs: { sidenav: "sidenav" }, ngImport: i0, template: "<button (click)=\"sidenav.toggle()\" mat-icon-button>\n <mat-icon *ngIf=\"!sidenav.opened\">menu</mat-icon>\n <mat-icon *ngIf=\"sidenav.opened\">menu_open</mat-icon>\n</button>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
698
417
  }
699
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LayoutComponentService, [{
700
- type: Injectable,
701
- args: [{ providedIn: 'root' }]
702
- }], function () { return [{ type: i1.FooterService }, { type: i1.HeaderService }, { type: undefined, decorators: [{
703
- type: Optional
704
- }, {
705
- type: Inject,
706
- args: [RXAP_LOGO_CONFIG]
707
- }] }, { type: i1$4.ConfigService, decorators: [{
708
- type: Inject,
709
- args: [ConfigService]
710
- }] }]; }, null); })();
418
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavToggleButtonComponent, decorators: [{
419
+ type: Component,
420
+ args: [{ selector: 'rxap-sidenav-toggle-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
421
+ MatButtonModule,
422
+ NgIf,
423
+ MatIconModule,
424
+ ], template: "<button (click)=\"sidenav.toggle()\" mat-icon-button>\n <mat-icon *ngIf=\"!sidenav.opened\">menu</mat-icon>\n <mat-icon *ngIf=\"sidenav.opened\">menu_open</mat-icon>\n</button>\n" }]
425
+ }], propDecorators: { sidenav: [{
426
+ type: Input,
427
+ args: [{ required: true }]
428
+ }] } });
711
429
 
712
- function WindowContainerSidenavComponent_div_1_ng_template_1_Template(rf, ctx) { }
713
- function WindowContainerSidenavComponent_div_1_Template(rf, ctx) { if (rf & 1) {
714
- i0.ɵɵelementStart(0, "div", 2);
715
- i0.ɵɵtemplate(1, WindowContainerSidenavComponent_div_1_ng_template_1_Template, 0, 0, "ng-template", 3);
716
- i0.ɵɵelementEnd();
717
- } if (rf & 2) {
718
- const portalId_r1 = ctx.$implicit;
719
- const ctx_r0 = i0.ɵɵnextContext();
720
- i0.ɵɵadvance(1);
721
- i0.ɵɵproperty("cdkPortalOutlet", ctx_r0.portals.get(portalId_r1));
722
- } }
723
- class WindowContainerSidenavComponent {
724
- constructor(service) {
725
- this.service = service;
726
- this.portals = new Map();
727
- this.subscription = new Subscription();
728
- }
729
- ngOnInit() {
730
- const components = this.service.getAll();
731
- for (const component of components) {
732
- this.add(component);
733
- }
734
- this.subscription.add(this.service.add$.pipe(tap(component => this.add(component))).subscribe());
735
- this.subscription.add(this.service.remove$.pipe(tap(component => this.remove(component))).subscribe());
736
- }
737
- ngOnDestroy() {
738
- this.subscription.unsubscribe();
739
- }
740
- trackBy(index, id) {
741
- return id;
742
- }
743
- add(component) {
744
- if (this.portals.has(component.id)) {
745
- throw new Error(`Component portal with id ${component.id} already exists`);
746
- }
747
- const portal = new ComponentPortal(component.component, component.viewContainerRef, component.injector, component.componentFactoryResolver);
748
- this.portals.set(component.id, portal);
430
+ class SidenavComponentService {
431
+ constructor(config) {
432
+ this.config = config;
433
+ this.collapsed$ = new BehaviorSubject(true);
434
+ this.collapsed$.next(this.config.get('navigation.collapsed', this.collapsed$.value));
749
435
  }
750
- remove(component) {
751
- if (this.portals.has(component.id)) {
752
- const portal = this.portals.get(component.id);
753
- this.portals.delete(component.id);
754
- portal.detach();
755
- }
436
+ toggleNavigationCollapse() {
437
+ this.collapsed$.next(!this.collapsed$.value);
756
438
  }
757
- static { this.ɵfac = function WindowContainerSidenavComponent_Factory(t) { return new (t || WindowContainerSidenavComponent)(i0.ɵɵdirectiveInject(WindowContainerSidenavService)); }; }
758
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WindowContainerSidenavComponent, selectors: [["rxap-window-container-sidenav"]], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 2, vars: 2, consts: [["fxLayout", "column", "fxLayoutGap", "16px", 1, "container"], ["fxFlex", "nogrow", 4, "ngFor", "ngForOf", "ngForTrackBy"], ["fxFlex", "nogrow"], [3, "cdkPortalOutlet"]], template: function WindowContainerSidenavComponent_Template(rf, ctx) { if (rf & 1) {
759
- i0.ɵɵelementStart(0, "div", 0);
760
- i0.ɵɵtemplate(1, WindowContainerSidenavComponent_div_1_Template, 2, 1, "div", 1);
761
- i0.ɵɵelementEnd();
762
- } if (rf & 2) {
763
- i0.ɵɵadvance(1);
764
- i0.ɵɵproperty("ngForOf", ctx.portals.keys())("ngForTrackBy", ctx.trackBy);
765
- } }, dependencies: [FlexModule, i1$3.DefaultLayoutDirective, i1$3.DefaultLayoutGapDirective, i1$3.DefaultFlexDirective, NgFor, PortalModule, i3.CdkPortalOutlet], styles: [".container[_ngcontent-%COMP%]{padding:8px}"], changeDetection: 0 }); }
439
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponentService, deps: [{ token: i1$1.ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
440
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponentService, providedIn: 'root' }); }
766
441
  }
767
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WindowContainerSidenavComponent, [{
768
- type: Component,
769
- args: [{ selector: 'rxap-window-container-sidenav', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FlexModule, NgFor, PortalModule], template: "<div fxLayout=\"column\" fxLayoutGap=\"16px\" class=\"container\">\n\n <div fxFlex=\"nogrow\" *ngFor=\"let portalId of portals.keys(); trackBy: trackBy\">\n <ng-template [cdkPortalOutlet]=\"portals.get(portalId)\"></ng-template>\n </div>\n\n</div>\n", styles: [".container{padding:8px}\n"] }]
770
- }], function () { return [{ type: i1.WindowContainerSidenavService, decorators: [{
771
- type: Inject,
772
- args: [WindowContainerSidenavService]
773
- }] }]; }, null); })();
442
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponentService, decorators: [{
443
+ type: Injectable,
444
+ args: [{ providedIn: 'root' }]
445
+ }], ctorParameters: function () { return [{ type: i1$1.ConfigService }]; } });
774
446
 
775
- function ToggleWindowSidenavButtonComponent_ng_template_2_Template(rf, ctx) { if (rf & 1) {
776
- i0.ɵɵelementStart(0, "mat-icon");
777
- i0.ɵɵtext(1, "keyboard_arrow_left");
778
- i0.ɵɵelementEnd();
779
- } }
780
- function ToggleWindowSidenavButtonComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
781
- i0.ɵɵelementStart(0, "mat-icon");
782
- i0.ɵɵtext(1, "keyboard_arrow_right");
783
- i0.ɵɵelementEnd();
784
- } }
785
- class ToggleWindowSidenavButtonComponent {
786
- constructor() {
787
- this.openWindowSidenav = false;
788
- this.openWindowSidenavChange = new EventEmitter();
447
+ class NavigationItemComponent {
448
+ get isActive() {
449
+ return this._isActive;
789
450
  }
790
- ngOnInit() {
451
+ set isActive(value) {
452
+ this._isActive = value;
453
+ this.active.set(value);
791
454
  }
792
- toggle() {
793
- this.openWindowSidenav = !this.openWindowSidenav;
794
- this.openWindowSidenavChange.emit(this.openWindowSidenav);
455
+ constructor(router, sidenav, elementRef, renderer, overlay, viewContainerRef) {
456
+ this.router = router;
457
+ this.sidenav = sidenav;
458
+ this.elementRef = elementRef;
459
+ this.renderer = renderer;
460
+ this.overlay = overlay;
461
+ this.viewContainerRef = viewContainerRef;
462
+ this.level = 0;
463
+ this._isActive = false;
464
+ this.children = null;
465
+ this.active = signal(false);
466
+ this._subscription = new Subscription();
795
467
  }
796
- static { this.ɵfac = function ToggleWindowSidenavButtonComponent_Factory(t) { return new (t || ToggleWindowSidenavButtonComponent)(); }; }
797
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ToggleWindowSidenavButtonComponent, selectors: [["rxap-toggle-window-sidenav-button"]], hostAttrs: [1, "rxap-toggle-window-sidenav-button"], inputs: { openWindowSidenav: "openWindowSidenav" }, outputs: { openWindowSidenavChange: "openWindowSidenavChange" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 5, vars: 2, consts: [[1, "toggle-button"], ["mat-icon-button", "", 3, "click"], [3, "ngIfElse", "ngIf"], ["hide", ""]], template: function ToggleWindowSidenavButtonComponent_Template(rf, ctx) { if (rf & 1) {
798
- i0.ɵɵelementStart(0, "div", 0)(1, "button", 1);
799
- i0.ɵɵlistener("click", function ToggleWindowSidenavButtonComponent_Template_button_click_1_listener() { return ctx.toggle(); });
800
- i0.ɵɵtemplate(2, ToggleWindowSidenavButtonComponent_ng_template_2_Template, 2, 0, "ng-template", 2);
801
- i0.ɵɵtemplate(3, ToggleWindowSidenavButtonComponent_ng_template_3_Template, 2, 0, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor);
802
- i0.ɵɵelementEnd()();
803
- } if (rf & 2) {
804
- const _r1 = i0.ɵɵreference(4);
805
- i0.ɵɵadvance(2);
806
- i0.ɵɵproperty("ngIfElse", _r1)("ngIf", !ctx.openWindowSidenav);
807
- } }, dependencies: [MatButtonModule, i1$2.MatIconButton, NgIf, MatIconModule, i2$2.MatIcon], styles: [".toggle-button[_ngcontent-%COMP%]{position:absolute;top:70px;right:0;z-index:10000;border-radius:15px 0 0 15px;border:1px solid black;background:black}"], changeDetection: 0 }); }
808
- }
809
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ToggleWindowSidenavButtonComponent, [{
810
- type: Component,
811
- args: [{ selector: 'rxap-toggle-window-sidenav-button', changeDetection: ChangeDetectionStrategy.OnPush, host: {
812
- class: 'rxap-toggle-window-sidenav-button'
813
- }, standalone: true, imports: [MatButtonModule, NgIf, MatIconModule], template: "<div class=\"toggle-button\">\n <button (click)=\"toggle()\" mat-icon-button>\n <ng-template [ngIfElse]=\"hide\" [ngIf]=\"!openWindowSidenav\">\n <mat-icon>keyboard_arrow_left</mat-icon>\n </ng-template>\n <ng-template #hide>\n <mat-icon>keyboard_arrow_right</mat-icon>\n </ng-template>\n </button>\n</div>\n", styles: [".toggle-button{position:absolute;top:70px;right:0;z-index:10000;border-radius:15px 0 0 15px;border:1px solid black;background:black}\n"] }]
814
- }], function () { return []; }, { openWindowSidenav: [{
815
- type: Input
816
- }], openWindowSidenavChange: [{
817
- type: Output
818
- }] }); })();
819
-
820
- class SidenavContentComponentService {
821
- constructor(footerComponentService, headerComponentService) {
822
- this.footerComponentService = footerComponentService;
823
- this.headerComponentService = headerComponentService;
824
- this.headerRows$ = new BehaviorSubject(1);
825
- this.headerRows$.next(this.headerComponentService.countComponent);
826
- this.footerComponentService.portalCount$.pipe().subscribe();
827
- this.footerRows$ = this.footerComponentService.portalCount$;
828
- this.headerComponentService.update$.pipe(tap(() => this.headerRows$.next(this.headerComponentService.countComponent))).subscribe();
829
- this.innerHeight$ = combineLatest([
830
- this.headerRows$,
831
- this.footerRows$
832
- ]).pipe(map(([headerRows, footerRows]) => `calc(100% - ${64 * (headerRows + footerRows)}px)`));
833
- this.marginTop$ = this.headerRows$.pipe(map(headerRows => `${headerRows * 64}px`));
834
- this.marginBottom$ = this.footerRows$.pipe(map(footerRows => `${footerRows * 64}px`));
835
- }
836
- static { this.ɵfac = function SidenavContentComponentService_Factory(t) { return new (t || SidenavContentComponentService)(i0.ɵɵinject(FooterService), i0.ɵɵinject(HeaderService)); }; }
837
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SidenavContentComponentService, factory: SidenavContentComponentService.ɵfac, providedIn: 'root' }); }
838
- }
839
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SidenavContentComponentService, [{
840
- type: Injectable,
841
- args: [{ providedIn: 'root' }]
842
- }], function () { return [{ type: i1.FooterService, decorators: [{
843
- type: Inject,
844
- args: [FooterService]
845
- }] }, { type: i1.HeaderService, decorators: [{
846
- type: Inject,
847
- args: [HeaderService]
848
- }] }]; }, null); })();
849
-
850
- const _c0$3 = function (a0) { return { "open": a0 }; };
851
- const _c1$2 = function (a0, a1, a2) { return { height: a0, marginTop: a1, marginBottom: a2 }; };
852
- const _c2$1 = ["*"];
853
- class SidenavContentComponent {
854
- constructor(sccs) {
855
- this.sccs = sccs;
468
+ ngOnChanges(changes) {
469
+ if (changes['item']) {
470
+ const item = changes['item'].currentValue;
471
+ this.children =
472
+ item.children && item.children.length ? item.children : null;
473
+ }
856
474
  }
857
- ngOnInit() {
475
+ ngAfterViewInit() {
476
+ this._subscription.add(this.router.events
477
+ .pipe(filter((event) => event instanceof NavigationEnd), debounceTime(100), startWith(true), tap(() => {
478
+ let isActive = true;
479
+ const urlParts = this.router.url.split('/');
480
+ if (urlParts[0] === '') {
481
+ urlParts[0] = '/';
482
+ }
483
+ for (let i = 0; i < this.item.routerLink.length; i++) {
484
+ if (urlParts[i] !== this.item.routerLink[i]) {
485
+ isActive = false;
486
+ break;
487
+ }
488
+ }
489
+ this.isActive = isActive;
490
+ if (isActive) {
491
+ this.renderer.addClass(this.elementRef.nativeElement, 'active');
492
+ }
493
+ else {
494
+ this.renderer.removeClass(this.elementRef.nativeElement, 'active');
495
+ }
496
+ }))
497
+ .subscribe());
858
498
  }
859
- static { this.ɵfac = function SidenavContentComponent_Factory(t) { return new (t || SidenavContentComponent)(i0.ɵɵdirectiveInject(SidenavContentComponentService)); }; }
860
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SidenavContentComponent, selectors: [["rxap-sidenav-content"]], inputs: { sidenav: "sidenav" }, standalone: true, features: [i0.ɵɵStandaloneFeature], ngContentSelectors: _c2$1, decls: 8, vars: 16, consts: [[1, "container", 3, "ngClass", "ngStyle"], [1, "inner"]], template: function SidenavContentComponent_Template(rf, ctx) { if (rf & 1) {
861
- i0.ɵɵprojectionDef();
862
- i0.ɵɵelementStart(0, "div", 0);
863
- i0.ɵɵpipe(1, "async");
864
- i0.ɵɵpipe(2, "async");
865
- i0.ɵɵpipe(3, "async");
866
- i0.ɵɵpipe(4, "async");
867
- i0.ɵɵelementStart(5, "div", 1);
868
- i0.ɵɵelement(6, "router-outlet");
869
- i0.ɵɵprojection(7);
870
- i0.ɵɵelementEnd()();
871
- } if (rf & 2) {
872
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(10, _c0$3, i0.ɵɵpipeBind1(1, 2, ctx.sidenav.openedChange)))("ngStyle", i0.ɵɵpureFunction3(12, _c1$2, i0.ɵɵpipeBind1(2, 4, ctx.sccs.innerHeight$), i0.ɵɵpipeBind1(3, 6, ctx.sccs.marginTop$), i0.ɵɵpipeBind1(4, 8, ctx.sccs.marginBottom$)));
873
- } }, dependencies: [NgClass, NgStyle, RouterOutlet, AsyncPipe], styles: [".container[_ngcontent-%COMP%] .inner[_ngcontent-%COMP%]{padding:0;overflow:auto;height:100%}"], changeDetection: 0 }); }
874
- }
875
- __decorate([
876
- Required,
877
- __metadata("design:type", MatSidenav)
878
- ], SidenavContentComponent.prototype, "sidenav", void 0);
879
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SidenavContentComponent, [{
880
- type: Component,
881
- args: [{ selector: 'rxap-sidenav-content', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgClass, NgStyle, RouterOutlet, AsyncPipe], template: "<div [ngClass]=\"{ 'open': (sidenav.openedChange | async) }\" [ngStyle]=\"{\n height: sccs.innerHeight$ | async,\n marginTop: sccs.marginTop$ | async,\n marginBottom: sccs.marginBottom$ | async\n}\" class=\"container\">\n <!-- <dx-breadcrumb></dx-breadcrumb>-->\n <div class=\"inner\">\n <router-outlet></router-outlet>\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".container .inner{padding:0;overflow:auto;height:100%}\n"] }]
882
- }], function () { return [{ type: SidenavContentComponentService }]; }, { sidenav: [{
883
- type: Input
884
- }] }); })();
885
-
886
- class SidenavHeaderDirective {
887
- constructor(template) {
888
- this.template = template;
499
+ ngOnDestroy() {
500
+ this._subscription?.unsubscribe();
889
501
  }
890
- static { this.ɵfac = function SidenavHeaderDirective_Factory(t) { return new (t || SidenavHeaderDirective)(i0.ɵɵdirectiveInject(TemplateRef)); }; }
891
- static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: SidenavHeaderDirective, selectors: [["", "rxapSidenavHeader", ""]], standalone: true }); }
892
- }
893
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SidenavHeaderDirective, [{
894
- type: Directive,
895
- args: [{
896
- selector: '[rxapSidenavHeader]',
897
- standalone: true
898
- }]
899
- }], function () { return [{ type: i0.TemplateRef, decorators: [{
900
- type: Inject,
901
- args: [TemplateRef]
902
- }] }]; }, null); })();
903
-
904
- class SidenavFooterDirective {
905
- constructor(template) {
906
- this.template = template;
502
+ // region type save item property
503
+ // required to check the type of the item property in the ngFor loop
504
+ isNavigationDividerItem(item) {
505
+ return item['divider'];
907
506
  }
908
- static { this.ɵfac = function SidenavFooterDirective_Factory(t) { return new (t || SidenavFooterDirective)(i0.ɵɵdirectiveInject(TemplateRef)); }; }
909
- static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: SidenavFooterDirective, selectors: [["", "rxapSidenavFooter", ""]], standalone: true }); }
910
- }
911
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SidenavFooterDirective, [{
912
- type: Directive,
913
- args: [{
914
- selector: '[rxapSidenavFooter]',
915
- standalone: true
916
- }]
917
- }], function () { return [{ type: i0.TemplateRef, decorators: [{
918
- type: Inject,
919
- args: [TemplateRef]
920
- }] }]; }, null); })();
921
-
922
- class SidenavComponentService {
923
- constructor(config) {
924
- this.config = config;
925
- this.collapsed$ = new BehaviorSubject(true);
926
- this.collapsed$.next(this.config.get('navigation.collapsed', this.collapsed$.value));
507
+ isNavigationItem(item) {
508
+ return !this.isNavigationDividerItem(item);
927
509
  }
928
- toggleNavigationCollapse() {
929
- this.collapsed$.next(!this.collapsed$.value);
510
+ asNavigationItem(item) {
511
+ if (!this.isNavigationItem(item)) {
512
+ throw new Error('The item is not a NavigationItem');
513
+ }
514
+ return item;
930
515
  }
931
- static { this.ɵfac = function SidenavComponentService_Factory(t) { return new (t || SidenavComponentService)(i0.ɵɵinject(i1$4.ConfigService)); }; }
932
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SidenavComponentService, factory: SidenavComponentService.ɵfac, providedIn: 'root' }); }
516
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationItemComponent, deps: [{ token: Router }, { token: SidenavComponentService }, { token: ElementRef }, { token: Renderer2 }, { token: Overlay }, { token: ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); }
517
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: NavigationItemComponent, isStandalone: true, selector: "li[rxap-navigation-item]", inputs: { level: "level", item: "item" }, host: { properties: { "class.active": "this.isActive" } }, viewQueries: [{ propertyName: "routerLinkActive", first: true, predicate: RouterLinkActive, descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div [ngClass]=\"{\n 'border-l-4 text-accent-400 border-accent-600': active(),\n }\">\n <a [routerLink]=\"item.routerLink\"\n class=\"h-12 pl-4 pr-5 flex flex-row justify-between items-center gap-x-4\"\n matRipple\n routerLinkActive\n\n >\n <span\n [ngClass]=\"{\n 'pl-0': level === 0,\n 'pl-4': level === 1,\n 'pl-8': level === 2,\n 'pl-12': level === 3\n }\"\n class=\"grow whitespace-nowrap\"\n >\n {{ item.label }}\n </span>\n <mat-icon *ngIf=\"item.icon\" [rxapIcon]=\"item.icon\"></mat-icon>\n </a>\n\n <ng-container *ngIf=\"item.children?.length && active()\">\n\n <mat-divider></mat-divider>\n\n <ul [@sub-nav]\n [items]=\"children ?? []\"\n [level]=\"level + 1\"\n rxap-navigation\n >\n </ul>\n\n <mat-divider></mat-divider>\n\n </ng-container>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return RouterLinkActive; }), selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i0.forwardRef(function () { return RouterLink; }), selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i0.forwardRef(function () { return NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatRippleModule; }) }, { kind: "directive", type: i0.forwardRef(function () { return i4.MatRipple; }), selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatIconModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i2$1.MatIcon; }), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i0.forwardRef(function () { return IconDirective; }), selector: "mat-icon[rxapIcon]", inputs: ["rxapIcon"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatDividerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i3$3.MatDivider; }), selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i0.forwardRef(function () { return NavigationComponent; }), selector: "ul[rxap-navigation]", inputs: ["items", "level", "root"] }, { kind: "directive", type: i0.forwardRef(function () { return NgClass; }), selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [
518
+ trigger('sub-nav', [
519
+ transition(':enter', [
520
+ style({
521
+ display: 'block',
522
+ height: '0',
523
+ overflow: 'hidden',
524
+ }),
525
+ animate(150, style({ height: '*' })),
526
+ ]),
527
+ transition(':leave', [
528
+ style({ overflow: 'hidden' }),
529
+ animate(300, style({ height: '0' })),
530
+ style({ display: 'none' }),
531
+ ]),
532
+ ]),
533
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
933
534
  }
934
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SidenavComponentService, [{
935
- type: Injectable,
936
- args: [{ providedIn: 'root' }]
937
- }], function () { return [{ type: i1$4.ConfigService }]; }, null); })();
535
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationItemComponent, decorators: [{
536
+ type: Component,
537
+ args: [{ selector: 'li[rxap-navigation-item]', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, animations: [
538
+ trigger('sub-nav', [
539
+ transition(':enter', [
540
+ style({
541
+ display: 'block',
542
+ height: '0',
543
+ overflow: 'hidden',
544
+ }),
545
+ animate(150, style({ height: '*' })),
546
+ ]),
547
+ transition(':leave', [
548
+ style({ overflow: 'hidden' }),
549
+ animate(300, style({ height: '0' })),
550
+ style({ display: 'none' }),
551
+ ]),
552
+ ]),
553
+ ], standalone: true, imports: [
554
+ RouterLinkActive,
555
+ RouterLink,
556
+ NgIf,
557
+ MatRippleModule,
558
+ MatIconModule,
559
+ IconDirective,
560
+ MatDividerModule,
561
+ forwardRef(() => NavigationComponent),
562
+ NgClass,
563
+ ], template: "<div [ngClass]=\"{\n 'border-l-4 text-accent-400 border-accent-600': active(),\n }\">\n <a [routerLink]=\"item.routerLink\"\n class=\"h-12 pl-4 pr-5 flex flex-row justify-between items-center gap-x-4\"\n matRipple\n routerLinkActive\n\n >\n <span\n [ngClass]=\"{\n 'pl-0': level === 0,\n 'pl-4': level === 1,\n 'pl-8': level === 2,\n 'pl-12': level === 3\n }\"\n class=\"grow whitespace-nowrap\"\n >\n {{ item.label }}\n </span>\n <mat-icon *ngIf=\"item.icon\" [rxapIcon]=\"item.icon\"></mat-icon>\n </a>\n\n <ng-container *ngIf=\"item.children?.length && active()\">\n\n <mat-divider></mat-divider>\n\n <ul [@sub-nav]\n [items]=\"children ?? []\"\n [level]=\"level + 1\"\n rxap-navigation\n >\n </ul>\n\n <mat-divider></mat-divider>\n\n </ng-container>\n</div>\n" }]
564
+ }], ctorParameters: function () { return [{ type: i2$3.Router, decorators: [{
565
+ type: Inject,
566
+ args: [Router]
567
+ }] }, { type: SidenavComponentService, decorators: [{
568
+ type: Inject,
569
+ args: [SidenavComponentService]
570
+ }] }, { type: i0.ElementRef, decorators: [{
571
+ type: Inject,
572
+ args: [ElementRef]
573
+ }] }, { type: i0.Renderer2, decorators: [{
574
+ type: Inject,
575
+ args: [Renderer2]
576
+ }] }, { type: i6$1.Overlay, decorators: [{
577
+ type: Inject,
578
+ args: [Overlay]
579
+ }] }, { type: i0.ViewContainerRef, decorators: [{
580
+ type: Inject,
581
+ args: [ViewContainerRef]
582
+ }] }]; }, propDecorators: { level: [{
583
+ type: Input
584
+ }], routerLinkActive: [{
585
+ type: ViewChild,
586
+ args: [RouterLinkActive, { static: true }]
587
+ }], item: [{
588
+ type: Input,
589
+ args: [{ required: true }]
590
+ }], isActive: [{
591
+ type: HostBinding,
592
+ args: ['class.active']
593
+ }] } });
938
594
 
939
595
  function IsNavigationDividerItem(item) {
940
- return item && item.hasOwnProperty('divider') && item.divider;
596
+ return !!item && !!item['divider'];
941
597
  }
942
598
  function IsNavigationInsertItem(item) {
943
- return item && item.hasOwnProperty('insert');
599
+ return !!item && !!item['insert'];
944
600
  }
945
601
  function IsNavigationItem(item) {
946
- return (item && item.hasOwnProperty('routerLink') && item.hasOwnProperty('label'));
602
+ return (!!item && !!item['routerLink'] && !!item['label']);
947
603
  }
948
604
 
949
605
  class NavigationService {
@@ -961,7 +617,7 @@ class NavigationService {
961
617
  Object.entries(inserts).forEach(([id, insert]) => this.insert(id, insert, false));
962
618
  }
963
619
  this.updateNavigation();
964
- this.config$ = this.navigation$.pipe(switchMap((navigationWithoutStatusCheck) => this.checkNavigationStatusProviders(navigationWithoutStatusCheck)));
620
+ this.config$ = this.navigation$.pipe(switchMap$1((navigationWithoutStatusCheck) => this.checkNavigationStatusProviders(navigationWithoutStatusCheck)));
965
621
  }
966
622
  /**
967
623
  * @deprecated use add instead
@@ -1011,12 +667,14 @@ class NavigationService {
1011
667
  else {
1012
668
  return from(isVisible);
1013
669
  }
1014
- }).map(isVisible$ => isVisible$.pipe(catchError(e => {
1015
- console.error('isVisible method failed: ' + e.message);
670
+ })
671
+ .map(isVisible$ => isVisible$.pipe(catchError(e => {
672
+ console.error('isVisible method failed: ' +
673
+ e.message);
1016
674
  return of(false);
1017
675
  })));
1018
676
  // TODO : dont wait for all status services to complete, but cancel waiting if one returns false
1019
- return combineLatest(isVisibleArray$).pipe(map((isVisibleArray) => isVisibleArray.reduce((acc, isVisible) => acc && isVisible, true)), map((isVisible) => (isVisible ? navigationItem : null)), switchMap((navigationItemOrNull) => {
677
+ return combineLatest(isVisibleArray$).pipe(map((isVisibleArray) => isVisibleArray.reduce((acc, isVisible) => acc && isVisible, true)), map((isVisible) => (isVisible ? navigationItem : null)), switchMap$1((navigationItemOrNull) => {
1020
678
  if (navigationItemOrNull) {
1021
679
  if (navigationItemOrNull.children?.length) {
1022
680
  return this.checkNavigationStatusProviders(navigationItemOrNull.children).pipe(map((children) => ({
@@ -1064,370 +722,35 @@ class NavigationService {
1064
722
  }
1065
723
  return navigation;
1066
724
  }
1067
- static { this.ɵfac = function NavigationService_Factory(t) { return new (t || NavigationService)(i0.ɵɵinject(RXAP_NAVIGATION_CONFIG), i0.ɵɵinject(INJECTOR), i0.ɵɵinject(RXAP_NAVIGATION_CONFIG_INSERTS, 8)); }; }
1068
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: NavigationService, factory: NavigationService.ɵfac, providedIn: 'root' }); }
725
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationService, deps: [{ token: RXAP_NAVIGATION_CONFIG }, { token: INJECTOR }, { token: RXAP_NAVIGATION_CONFIG_INSERTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
726
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationService, providedIn: 'root' }); }
1069
727
  }
1070
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NavigationService, [{
1071
- type: Injectable,
1072
- args: [{ providedIn: 'root' }]
1073
- }], function () { return [{ type: undefined, decorators: [{
1074
- type: Inject,
1075
- args: [RXAP_NAVIGATION_CONFIG]
1076
- }] }, { type: undefined, decorators: [{
1077
- type: Inject,
1078
- args: [INJECTOR]
1079
- }] }, { type: undefined, decorators: [{
1080
- type: Optional
1081
- }, {
1082
- type: Inject,
1083
- args: [RXAP_NAVIGATION_CONFIG_INSERTS]
1084
- }] }]; }, null); })();
728
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationService, decorators: [{
729
+ type: Injectable,
730
+ args: [{ providedIn: 'root' }]
731
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
732
+ type: Inject,
733
+ args: [RXAP_NAVIGATION_CONFIG]
734
+ }] }, { type: undefined, decorators: [{
735
+ type: Inject,
736
+ args: [INJECTOR]
737
+ }] }, { type: undefined, decorators: [{
738
+ type: Optional
739
+ }, {
740
+ type: Inject,
741
+ args: [RXAP_NAVIGATION_CONFIG_INSERTS]
742
+ }] }]; } });
1085
743
 
1086
- const _c0$2 = ["navigationOverlay"];
1087
- const _c1$1 = ["rxap-navigation-item", ""];
1088
- function NavigationItemComponent_mat_icon_2_Template(rf, ctx) { if (rf & 1) {
1089
- i0.ɵɵelement(0, "mat-icon", 5);
1090
- } if (rf & 2) {
1091
- const ctx_r0 = i0.ɵɵnextContext();
1092
- i0.ɵɵproperty("rxapIcon", ctx_r0.item.icon);
1093
- } }
1094
- function NavigationItemComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
1095
- i0.ɵɵelementStart(0, "span", 6);
1096
- i0.ɵɵtext(1);
1097
- i0.ɵɵelementEnd();
1098
- } if (rf & 2) {
1099
- const ctx_r1 = i0.ɵɵnextContext();
1100
- i0.ɵɵadvance(1);
1101
- i0.ɵɵtextInterpolate(ctx_r1.item.label);
1102
- } }
1103
- function NavigationItemComponent_ul_5_Template(rf, ctx) { if (rf & 1) {
1104
- i0.ɵɵelement(0, "ul", 7);
1105
- } if (rf & 2) {
1106
- const ctx_r2 = i0.ɵɵnextContext();
1107
- i0.ɵɵproperty("@sub-nav", undefined)("items", ctx_r2.children)("level", ctx_r2.level + 1);
1108
- } }
1109
- function NavigationItemComponent_ng_template_7_li_2_a_1_mat_icon_1_Template(rf, ctx) { if (rf & 1) {
1110
- i0.ɵɵelement(0, "mat-icon", 5);
1111
- } if (rf & 2) {
1112
- const child_r6 = i0.ɵɵnextContext(2).$implicit;
1113
- const ctx_r8 = i0.ɵɵnextContext(2);
1114
- i0.ɵɵproperty("rxapIcon", ctx_r8.asNavigationItem(child_r6).icon);
1115
- } }
1116
- function NavigationItemComponent_ng_template_7_li_2_a_1_Template(rf, ctx) { if (rf & 1) {
1117
- i0.ɵɵelementStart(0, "a", 11);
1118
- i0.ɵɵtemplate(1, NavigationItemComponent_ng_template_7_li_2_a_1_mat_icon_1_Template, 1, 1, "mat-icon", 1);
1119
- i0.ɵɵelementStart(2, "span", 6);
1120
- i0.ɵɵtext(3);
1121
- i0.ɵɵelementEnd()();
1122
- } if (rf & 2) {
1123
- const child_r6 = i0.ɵɵnextContext().$implicit;
1124
- const ctx_r7 = i0.ɵɵnextContext(2);
1125
- i0.ɵɵproperty("routerLink", ctx_r7.asNavigationItem(child_r6).routerLink);
1126
- i0.ɵɵadvance(1);
1127
- i0.ɵɵproperty("ngIf", ctx_r7.asNavigationItem(child_r6).icon);
1128
- i0.ɵɵadvance(2);
1129
- i0.ɵɵtextInterpolate(ctx_r7.asNavigationItem(child_r6).label);
1130
- } }
1131
- function NavigationItemComponent_ng_template_7_li_2_Template(rf, ctx) { if (rf & 1) {
1132
- i0.ɵɵelementStart(0, "li");
1133
- i0.ɵɵtemplate(1, NavigationItemComponent_ng_template_7_li_2_a_1_Template, 4, 3, "a", 10);
1134
- i0.ɵɵelementEnd();
1135
- } if (rf & 2) {
1136
- const child_r6 = ctx.$implicit;
1137
- const ctx_r5 = i0.ɵɵnextContext(2);
1138
- i0.ɵɵadvance(1);
1139
- i0.ɵɵproperty("ngIf", ctx_r5.isNavigationItem(child_r6));
1140
- } }
1141
- function NavigationItemComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {
1142
- const _r12 = i0.ɵɵgetCurrentView();
1143
- i0.ɵɵelementStart(0, "div", 8);
1144
- i0.ɵɵlistener("mouseenter", function NavigationItemComponent_ng_template_7_Template_div_mouseenter_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.lockeOverlay = true); })("mouseleave", function NavigationItemComponent_ng_template_7_Template_div_mouseleave_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r13 = i0.ɵɵnextContext(); ctx_r13.lockeOverlay = false; return i0.ɵɵresetView(ctx_r13.onMouseleave()); });
1145
- i0.ɵɵelementStart(1, "ul");
1146
- i0.ɵɵtemplate(2, NavigationItemComponent_ng_template_7_li_2_Template, 2, 1, "li", 9);
1147
- i0.ɵɵelementEnd()();
1148
- } if (rf & 2) {
1149
- const ctx_r4 = i0.ɵɵnextContext();
1150
- i0.ɵɵadvance(2);
1151
- i0.ɵɵproperty("ngForOf", ctx_r4.children);
1152
- } }
1153
- class NavigationItemComponent {
1154
- constructor(router, sidenav, elementRef, renderer, overlay, viewContainerRef) {
1155
- this.router = router;
1156
- this.sidenav = sidenav;
1157
- this.elementRef = elementRef;
1158
- this.renderer = renderer;
1159
- this.overlay = overlay;
1160
- this.viewContainerRef = viewContainerRef;
1161
- this.children = null;
1162
- this.level = 0;
1163
- this.isActive = false;
1164
- this._subscription = new Subscription();
1165
- /**
1166
- * indicates the mouse is over the
1167
- */
1168
- this.lockeOverlay = false;
1169
- }
1170
- ngOnChanges(changes) {
1171
- if (changes.item) {
1172
- const item = changes.item.currentValue;
1173
- this.children =
1174
- item.children && item.children.length ? item.children : null;
1175
- }
1176
- }
1177
- ngAfterViewInit() {
1178
- this._subscription.add(this.router.events
1179
- .pipe(filter((event) => event instanceof NavigationEnd), startWith(true), delay(100), tap(() => {
1180
- if (this.routerLinkActive.isActive) {
1181
- if (!this.sidenav.collapsed$.value) {
1182
- // only close the overlay if sidenav collapsed
1183
- this._overlayRef?.detach();
1184
- }
1185
- this.renderer.addClass(this.elementRef.nativeElement, 'active');
1186
- }
1187
- else {
1188
- this.renderer.removeClass(this.elementRef.nativeElement, 'active');
1189
- }
1190
- }))
1191
- .subscribe());
1192
- }
1193
- ngOnInit() {
1194
- // detach the navigation overlay if the sidenav collapsed
1195
- // state is changed
1196
- this._subscription.add(this.sidenav.collapsed$
1197
- .pipe(skip(1), distinctUntilChanged(), tap(() => this._overlayRef?.detach()))
1198
- .subscribe());
1199
- }
1200
- ngOnDestroy() {
1201
- this._subscription?.unsubscribe();
1202
- this._overlayRef?.dispose();
1203
- }
1204
- onMouseenter() {
1205
- if (this.children) {
1206
- if (!this.routerLinkActive.isActive || this.sidenav.collapsed$.value) {
1207
- if (!this._overlayRef) {
1208
- this._overlayRef = this.overlay.create({
1209
- positionStrategy: this.overlay
1210
- .position()
1211
- .flexibleConnectedTo(this.elementRef)
1212
- .withPositions([
1213
- {
1214
- originY: 'top',
1215
- originX: 'end',
1216
- overlayY: 'top',
1217
- overlayX: 'start',
1218
- },
1219
- ]),
1220
- });
1221
- }
1222
- if (!this._overlayRef.hasAttached()) {
1223
- this._embeddedViewRef = this._overlayRef.attach(new TemplatePortal(this._navigationOverlay, this.viewContainerRef));
1224
- }
1225
- }
1226
- }
1227
- }
1228
- onMouseleave() {
1229
- if (!this.lockeOverlay) {
1230
- this._overlayRef?.detach();
1231
- }
1232
- }
1233
- // region type save item property
1234
- // required to check the type of the item property in the ngFor loop
1235
- isNavigationDividerItem(item) {
1236
- return item['divider'];
1237
- }
1238
- isNavigationItem(item) {
1239
- return !this.isNavigationDividerItem(item);
1240
- }
1241
- asNavigationItem(item) {
1242
- if (!this.isNavigationItem(item)) {
1243
- throw new Error('The item is not a NavigationItem');
1244
- }
1245
- return item;
1246
- }
1247
- static { this.ɵfac = function NavigationItemComponent_Factory(t) { return new (t || NavigationItemComponent)(i0.ɵɵdirectiveInject(Router), i0.ɵɵdirectiveInject(SidenavComponentService), i0.ɵɵdirectiveInject(ElementRef), i0.ɵɵdirectiveInject(Renderer2), i0.ɵɵdirectiveInject(Overlay), i0.ɵɵdirectiveInject(ViewContainerRef)); }; }
1248
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NavigationItemComponent, selectors: [["li", "rxap-navigation-item", ""]], viewQuery: function NavigationItemComponent_Query(rf, ctx) { if (rf & 1) {
1249
- i0.ɵɵviewQuery(RouterLinkActive, 7);
1250
- i0.ɵɵviewQuery(_c0$2, 5);
1251
- } if (rf & 2) {
1252
- let _t;
1253
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.routerLinkActive = _t.first);
1254
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx._navigationOverlay = _t.first);
1255
- } }, hostAttrs: [1, "rxap-navigation-item"], hostVars: 2, hostBindings: function NavigationItemComponent_HostBindings(rf, ctx) { if (rf & 1) {
1256
- i0.ɵɵlistener("mouseenter", function NavigationItemComponent_mouseenter_HostBindingHandler() { return ctx.onMouseenter(); })("mouseleave", function NavigationItemComponent_mouseleave_HostBindingHandler() { return ctx.onMouseleave(); });
1257
- } if (rf & 2) {
1258
- i0.ɵɵclassProp("active", ctx.isActive);
1259
- } }, inputs: { item: "item", level: "level" }, standalone: true, features: [i0.ɵɵNgOnChangesFeature, i0.ɵɵStandaloneFeature], attrs: _c1$1, decls: 9, vars: 15, consts: [["routerLinkActive", "link-active", "matRipple", "", 3, "routerLink", "matTooltipDisabled", "matTooltip"], ["class", "icon", 3, "rxapIcon", 4, "ngIf"], [3, "ngIf"], ["rxap-navigation", "", "class", "sub-items", "fxFlex", "nogrow", 3, "items", "level", 4, "ngIf"], ["navigationOverlay", ""], [1, "icon", 3, "rxapIcon"], [1, "label"], ["rxap-navigation", "", "fxFlex", "nogrow", 1, "sub-items", 3, "items", "level"], [1, "navigation-overlay-container", "mat-elevation-z1", 3, "mouseenter", "mouseleave"], [4, "ngFor", "ngForOf"], ["class", "navigation-link mat-subtitle-2 mat-body-strong", "matRipple", "", 3, "routerLink", 4, "ngIf"], ["matRipple", "", 1, "navigation-link", "mat-subtitle-2", "mat-body-strong", 3, "routerLink"]], template: function NavigationItemComponent_Template(rf, ctx) { if (rf & 1) {
1260
- i0.ɵɵelementStart(0, "a", 0);
1261
- i0.ɵɵpipe(1, "async");
1262
- i0.ɵɵtemplate(2, NavigationItemComponent_mat_icon_2_Template, 1, 1, "mat-icon", 1);
1263
- i0.ɵɵtemplate(3, NavigationItemComponent_ng_template_3_Template, 2, 1, "ng-template", 2);
1264
- i0.ɵɵpipe(4, "async");
1265
- i0.ɵɵelementEnd();
1266
- i0.ɵɵtemplate(5, NavigationItemComponent_ul_5_Template, 1, 3, "ul", 3);
1267
- i0.ɵɵpipe(6, "async");
1268
- i0.ɵɵtemplate(7, NavigationItemComponent_ng_template_7_Template, 3, 1, "ng-template", null, 4, i0.ɵɵtemplateRefExtractor);
1269
- } if (rf & 2) {
1270
- i0.ɵɵclassMapInterpolate1("navigation-link mat-body-2 mat-body-strong navigation-level-", ctx.level, "");
1271
- i0.ɵɵproperty("routerLink", ctx.item.routerLink)("matTooltipDisabled", !i0.ɵɵpipeBind1(1, 9, ctx.sidenav.collapsed$))("matTooltip", ctx.item.label);
1272
- i0.ɵɵadvance(2);
1273
- i0.ɵɵproperty("ngIf", ctx.item.icon);
1274
- i0.ɵɵadvance(1);
1275
- i0.ɵɵproperty("ngIf", !i0.ɵɵpipeBind1(4, 11, ctx.sidenav.collapsed$));
1276
- i0.ɵɵadvance(2);
1277
- i0.ɵɵproperty("ngIf", ctx.routerLinkActive.isActive && !i0.ɵɵpipeBind1(6, 13, ctx.sidenav.collapsed$) && ctx.children);
1278
- } }, dependencies: [RouterLinkActive,
1279
- MatRippleModule, i4$1.MatRipple, RouterLink,
1280
- MatTooltipModule, i2$6.MatTooltip, NgIf,
1281
- MatIconModule, i2$2.MatIcon, IconDirective,
1282
- NavigationComponent,
1283
- FlexModule, i1$3.DefaultFlexDirective, NgFor,
1284
- AsyncPipe], styles: [".rxap-navigation-item,.navigation-overlay-container{display:flex;flex-direction:column;min-height:48px}.rxap-navigation-item .navigation-link,.navigation-overlay-container .navigation-link{display:flex;flex-direction:row;align-items:center;text-decoration:none;height:48px}.rxap-navigation-item .navigation-link .icon,.navigation-overlay-container .navigation-link .icon{margin:0 16px}.rxap-navigation-item .navigation-link .label,.navigation-overlay-container .navigation-link .label{padding-right:12px}.rxap-navigation-item .navigation-link.navigation-level-1,.navigation-overlay-container .navigation-link.navigation-level-1{padding-left:52px}.rxap-navigation-item .navigation-link.navigation-level-1 .icon,.navigation-overlay-container .navigation-link.navigation-level-1 .icon{padding-left:0}.rxap-navigation-item .navigation-link.navigation-level-2,.navigation-overlay-container .navigation-link.navigation-level-2{padding-left:88px}.rxap-navigation-item .navigation-link.navigation-level-2 .icon,.navigation-overlay-container .navigation-link.navigation-level-2 .icon{padding-left:0}.navigation-overlay-container{padding:0 16px}.navigation-overlay-container ul{list-style-type:none;margin:0;padding:0}.navigation-overlay-container ul .navigation-link .label{padding-right:0}.navigation-overlay-container ul .navigation-link .icon{margin-left:0}\n"], encapsulation: 2, data: { animation: [
1285
- trigger('sub-nav', [
1286
- transition(':enter', [
1287
- style({ display: 'block', height: '0', overflow: 'hidden' }),
1288
- animate(150, style({ height: '*' }))
1289
- ]),
1290
- transition(':leave', [
1291
- style({ overflow: 'hidden' }),
1292
- animate(300, style({ height: '0' })),
1293
- style({ display: 'none' })
1294
- ])
1295
- ])
1296
- ] }, changeDetection: 0 }); }
1297
- }
1298
- __decorate([
1299
- Required,
1300
- __metadata("design:type", Object)
1301
- ], NavigationItemComponent.prototype, "item", void 0);
1302
- __decorate([
1303
- DebounceCall(100),
1304
- __metadata("design:type", Function),
1305
- __metadata("design:paramtypes", []),
1306
- __metadata("design:returntype", void 0)
1307
- ], NavigationItemComponent.prototype, "onMouseleave", null);
1308
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NavigationItemComponent, [{
1309
- type: Component,
1310
- args: [{ selector: 'li[rxap-navigation-item]', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
1311
- class: 'rxap-navigation-item'
1312
- }, animations: [
1313
- trigger('sub-nav', [
1314
- transition(':enter', [
1315
- style({ display: 'block', height: '0', overflow: 'hidden' }),
1316
- animate(150, style({ height: '*' }))
1317
- ]),
1318
- transition(':leave', [
1319
- style({ overflow: 'hidden' }),
1320
- animate(300, style({ height: '0' })),
1321
- style({ display: 'none' })
1322
- ])
1323
- ])
1324
- ], standalone: true, imports: [
1325
- RouterLinkActive,
1326
- MatRippleModule,
1327
- RouterLink,
1328
- MatTooltipModule,
1329
- NgIf,
1330
- MatIconModule,
1331
- IconDirective,
1332
- NavigationComponent,
1333
- FlexModule,
1334
- NgFor,
1335
- AsyncPipe
1336
- ], template: "<a [routerLink]=\"item.routerLink\"\n routerLinkActive=\"link-active\"\n [matTooltipDisabled]=\"!(sidenav.collapsed$ | async)\"\n [matTooltip]=\"item.label\"\n class=\"navigation-link mat-body-2 mat-body-strong navigation-level-{{level}}\" matRipple>\n <mat-icon *ngIf=\"item.icon\" [rxapIcon]=\"item.icon\" class=\"icon\"></mat-icon>\n <ng-template [ngIf]=\"!(sidenav.collapsed$ | async)\">\n <span class=\"label\">{{ item.label }}</span>\n </ng-template>\n</a>\n\n<ul rxap-navigation\n *ngIf=\"routerLinkActive.isActive && !(sidenav.collapsed$ | async) && children\"\n [@sub-nav]\n [items]=\"children\"\n [level]=\"level + 1\"\n class=\"sub-items\"\n fxFlex=\"nogrow\"\n>\n</ul>\n\n<ng-template #navigationOverlay>\n <div class=\"navigation-overlay-container mat-elevation-z1\"\n (mouseenter)=\"lockeOverlay = true\" (mouseleave)=\"lockeOverlay = false; onMouseleave()\">\n <ul>\n <li *ngFor=\"let child of children\">\n <a *ngIf=\"isNavigationItem(child)\" [routerLink]=\"asNavigationItem(child).routerLink\"\n class=\"navigation-link mat-subtitle-2 mat-body-strong\" matRipple>\n <mat-icon *ngIf=\"asNavigationItem(child).icon\" [rxapIcon]=\"asNavigationItem(child).icon\" class=\"icon\"></mat-icon>\n <span class=\"label\">{{ asNavigationItem(child).label }}</span>\n </a>\n </li>\n </ul>\n </div>\n</ng-template>\n", styles: [".rxap-navigation-item,.navigation-overlay-container{display:flex;flex-direction:column;min-height:48px}.rxap-navigation-item .navigation-link,.navigation-overlay-container .navigation-link{display:flex;flex-direction:row;align-items:center;text-decoration:none;height:48px}.rxap-navigation-item .navigation-link .icon,.navigation-overlay-container .navigation-link .icon{margin:0 16px}.rxap-navigation-item .navigation-link .label,.navigation-overlay-container .navigation-link .label{padding-right:12px}.rxap-navigation-item .navigation-link.navigation-level-1,.navigation-overlay-container .navigation-link.navigation-level-1{padding-left:52px}.rxap-navigation-item .navigation-link.navigation-level-1 .icon,.navigation-overlay-container .navigation-link.navigation-level-1 .icon{padding-left:0}.rxap-navigation-item .navigation-link.navigation-level-2,.navigation-overlay-container .navigation-link.navigation-level-2{padding-left:88px}.rxap-navigation-item .navigation-link.navigation-level-2 .icon,.navigation-overlay-container .navigation-link.navigation-level-2 .icon{padding-left:0}.navigation-overlay-container{padding:0 16px}.navigation-overlay-container ul{list-style-type:none;margin:0;padding:0}.navigation-overlay-container ul .navigation-link .label{padding-right:0}.navigation-overlay-container ul .navigation-link .icon{margin-left:0}\n"] }]
1337
- }], function () { return [{ type: i2$1.Router, decorators: [{
1338
- type: Inject,
1339
- args: [Router]
1340
- }] }, { type: SidenavComponentService, decorators: [{
1341
- type: Inject,
1342
- args: [SidenavComponentService]
1343
- }] }, { type: i0.ElementRef, decorators: [{
1344
- type: Inject,
1345
- args: [ElementRef]
1346
- }] }, { type: i0.Renderer2, decorators: [{
1347
- type: Inject,
1348
- args: [Renderer2]
1349
- }] }, { type: i7.Overlay, decorators: [{
1350
- type: Inject,
1351
- args: [Overlay]
1352
- }] }, { type: i0.ViewContainerRef, decorators: [{
1353
- type: Inject,
1354
- args: [ViewContainerRef]
1355
- }] }]; }, { routerLinkActive: [{
1356
- type: ViewChild,
1357
- args: [RouterLinkActive, { static: true }]
1358
- }], item: [{
1359
- type: Input
1360
- }], level: [{
1361
- type: Input
1362
- }], isActive: [{
1363
- type: HostBinding,
1364
- args: ['class.active']
1365
- }], _navigationOverlay: [{
1366
- type: ViewChild,
1367
- args: ['navigationOverlay']
1368
- }], onMouseenter: [{
1369
- type: HostListener,
1370
- args: ['mouseenter']
1371
- }], onMouseleave: [{
1372
- type: HostListener,
1373
- args: ['mouseleave']
1374
- }] }); })();
1375
-
1376
- const _c0$1 = ["rxap-navigation", ""];
1377
- function NavigationComponent_ng_template_0_ng_template_0_div_1_span_1_Template(rf, ctx) { if (rf & 1) {
1378
- i0.ɵɵelementStart(0, "span", 2);
1379
- i0.ɵɵtext(1);
1380
- i0.ɵɵelementEnd();
1381
- } if (rf & 2) {
1382
- const item_r1 = i0.ɵɵnextContext(3).$implicit;
1383
- i0.ɵɵadvance(1);
1384
- i0.ɵɵtextInterpolate(item_r1.title);
1385
- } }
1386
- function NavigationComponent_ng_template_0_ng_template_0_div_1_Template(rf, ctx) { if (rf & 1) {
1387
- i0.ɵɵelementStart(0, "div", 4);
1388
- i0.ɵɵtemplate(1, NavigationComponent_ng_template_0_ng_template_0_div_1_span_1_Template, 2, 1, "span", 5);
1389
- i0.ɵɵelementEnd();
1390
- } if (rf & 2) {
1391
- const item_r1 = i0.ɵɵnextContext(2).$implicit;
1392
- i0.ɵɵadvance(1);
1393
- i0.ɵɵproperty("ngIf", item_r1.title);
1394
- } }
1395
- function NavigationComponent_ng_template_0_ng_template_0_Template(rf, ctx) { if (rf & 1) {
1396
- i0.ɵɵelement(0, "mat-divider", 2);
1397
- i0.ɵɵtemplate(1, NavigationComponent_ng_template_0_ng_template_0_div_1_Template, 2, 1, "div", 3);
1398
- i0.ɵɵpipe(2, "async");
1399
- } if (rf & 2) {
1400
- const ctx_r2 = i0.ɵɵnextContext(2);
1401
- i0.ɵɵadvance(1);
1402
- i0.ɵɵproperty("ngIf", !i0.ɵɵpipeBind1(2, 1, ctx_r2.sidenav.collapsed$));
1403
- } }
1404
- function NavigationComponent_ng_template_0_ng_template_1_Template(rf, ctx) { if (rf & 1) {
1405
- i0.ɵɵelement(0, "li", 6);
1406
- } if (rf & 2) {
1407
- const item_r1 = i0.ɵɵnextContext().$implicit;
1408
- const ctx_r3 = i0.ɵɵnextContext();
1409
- i0.ɵɵproperty("level", ctx_r3.level)("item", ctx_r3.asNavigationItem(item_r1));
1410
- } }
1411
- function NavigationComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {
1412
- i0.ɵɵtemplate(0, NavigationComponent_ng_template_0_ng_template_0_Template, 3, 3, "ng-template", 1);
1413
- i0.ɵɵtemplate(1, NavigationComponent_ng_template_0_ng_template_1_Template, 1, 2, "ng-template", 1);
1414
- } if (rf & 2) {
1415
- const item_r1 = ctx.$implicit;
1416
- const ctx_r0 = i0.ɵɵnextContext();
1417
- i0.ɵɵproperty("ngIf", ctx_r0.isNavigationDividerItem(item_r1));
1418
- i0.ɵɵadvance(1);
1419
- i0.ɵɵproperty("ngIf", ctx_r0.isNavigationItem(item_r1));
1420
- } }
1421
744
  class NavigationComponent {
1422
- set root(value) {
1423
- this._root = coerceBoolean(value);
1424
- }
1425
745
  constructor(navigationService, cdr, sidenav) {
1426
746
  this.navigationService = navigationService;
1427
747
  this.cdr = cdr;
1428
748
  this.sidenav = sidenav;
1429
- this._root = false;
1430
749
  this.level = 0;
750
+ this._root = false;
751
+ }
752
+ set root(value) {
753
+ this._root = coerceBoolean(value);
1431
754
  }
1432
755
  ngOnInit() {
1433
756
  if (this._root) {
@@ -1436,6 +759,7 @@ class NavigationComponent {
1436
759
  .pipe(tap((navigation) => (this.items = navigation)), tap(() => this.cdr.detectChanges()))
1437
760
  .subscribe();
1438
761
  }
762
+ this.items ??= [];
1439
763
  }
1440
764
  ngOnDestroy() {
1441
765
  this.subscription?.unsubscribe();
@@ -1454,314 +778,200 @@ class NavigationComponent {
1454
778
  }
1455
779
  return item;
1456
780
  }
1457
- static { this.ɵfac = function NavigationComponent_Factory(t) { return new (t || NavigationComponent)(i0.ɵɵdirectiveInject(NavigationService), i0.ɵɵdirectiveInject(ChangeDetectorRef), i0.ɵɵdirectiveInject(SidenavComponentService)); }; }
1458
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NavigationComponent, selectors: [["ul", "rxap-navigation", ""]], hostAttrs: [1, "rxap-navigation"], hostVars: 2, hostBindings: function NavigationComponent_HostBindings(rf, ctx) { if (rf & 2) {
1459
- i0.ɵɵclassProp("rxap-root-navigation", ctx._root);
1460
- } }, inputs: { root: "root", items: "items", level: "level" }, standalone: true, features: [i0.ɵɵStandaloneFeature], attrs: _c0$1, decls: 1, vars: 1, consts: [["ngFor", "", 3, "ngForOf"], [3, "ngIf"], ["fxFlex", "nogrow"], ["class", "divider-title", "fxFlex", "nogrow", "fxLayout", "row", "fxLayoutAlign", "start end", 4, "ngIf"], ["fxFlex", "nogrow", "fxLayout", "row", "fxLayoutAlign", "start end", 1, "divider-title"], ["fxFlex", "nogrow", 4, "ngIf"], ["rxap-navigation-item", "", 1, "item", 3, "level", "item"]], template: function NavigationComponent_Template(rf, ctx) { if (rf & 1) {
1461
- i0.ɵɵtemplate(0, NavigationComponent_ng_template_0_Template, 2, 2, "ng-template", 0);
1462
- } if (rf & 2) {
1463
- i0.ɵɵproperty("ngForOf", ctx.items);
1464
- } }, dependencies: [NgFor,
1465
- NgIf,
1466
- MatDividerModule, i1$5.MatDivider, FlexModule, i1$3.DefaultLayoutDirective, i1$3.DefaultLayoutAlignDirective, i1$3.DefaultFlexDirective, NavigationItemComponent,
1467
- AsyncPipe], styles: [".rxap-navigation{list-style-type:none;padding:0}.rxap-navigation .divider-title{padding-left:18px;height:28px;align-content:center}\n"], encapsulation: 2, changeDetection: 0 }); }
781
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationComponent, deps: [{ token: NavigationService }, { token: ChangeDetectorRef }, { token: SidenavComponentService }], target: i0.ɵɵFactoryTarget.Component }); }
782
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: NavigationComponent, isStandalone: true, selector: "ul[rxap-navigation]", inputs: { items: "items", level: "level", root: "root" }, host: { properties: { "class.rxap-root-navigation": "this._root" }, classAttribute: "list-none dark:text-neutral-400 text-neutral-700" }, ngImport: i0, template: "<ng-template [ngForOf]=\"items\" let-item ngFor>\n <ng-template [ngIf]=\"isNavigationDividerItem(item)\">\n <mat-divider></mat-divider>\n <div *ngIf=\"(sidenav.collapsed$ | async) === false\" class=\"pl-5 h-6\">\n <span *ngIf=\"item.title\">{{item.title}}</span>\n </div>\n </ng-template>\n <ng-template [ngIf]=\"isNavigationItem(item)\">\n <li [item]=\"asNavigationItem(item)\" [level]=\"level\" class=\"dark:hover:text-white hover:text-black\"\n rxap-navigation-item></li>\n </ng-template>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return NgFor; }), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(function () { return NgIf; }), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(function () { return MatDividerModule; }) }, { kind: "component", type: i0.forwardRef(function () { return i3$3.MatDivider; }), selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i0.forwardRef(function () { return NavigationItemComponent; }), selector: "li[rxap-navigation-item]", inputs: ["level", "item"] }, { kind: "pipe", type: i0.forwardRef(function () { return AsyncPipe; }), name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1468
783
  }
1469
- __decorate([
1470
- Required,
1471
- __metadata("design:type", Array)
1472
- ], NavigationComponent.prototype, "items", void 0);
1473
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NavigationComponent, [{
1474
- type: Component,
1475
- args: [{ selector: 'ul[rxap-navigation]', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'rxap-navigation' }, standalone: true, imports: [
1476
- NgFor,
1477
- NgIf,
1478
- MatDividerModule,
1479
- FlexModule,
1480
- NavigationItemComponent,
1481
- AsyncPipe
1482
- ], template: "<ng-template [ngForOf]=\"items\" let-item ngFor>\n <ng-template [ngIf]=\"isNavigationDividerItem(item)\">\n <mat-divider fxFlex=\"nogrow\"></mat-divider>\n <div *ngIf=\"!(sidenav.collapsed$ | async)\" class=\"divider-title\" fxFlex=\"nogrow\" fxLayout=\"row\" fxLayoutAlign=\"start end\">\n <span fxFlex=\"nogrow\" *ngIf=\"item.title\">{{item.title}}</span>\n </div>\n </ng-template>\n <ng-template [ngIf]=\"isNavigationItem(item)\">\n <li class=\"item\" rxap-navigation-item [level]=\"level\" [item]=\"asNavigationItem(item)\"></li>\n </ng-template>\n</ng-template>\n", styles: [".rxap-navigation{list-style-type:none;padding:0}.rxap-navigation .divider-title{padding-left:18px;height:28px;align-content:center}\n"] }]
1483
- }], function () { return [{ type: NavigationService, decorators: [{
1484
- type: Inject,
1485
- args: [NavigationService]
1486
- }] }, { type: i0.ChangeDetectorRef, decorators: [{
1487
- type: Inject,
1488
- args: [ChangeDetectorRef]
1489
- }] }, { type: SidenavComponentService, decorators: [{
1490
- type: Inject,
1491
- args: [SidenavComponentService]
1492
- }] }]; }, { _root: [{
1493
- type: HostBinding,
1494
- args: ['class.rxap-root-navigation']
1495
- }], root: [{
1496
- type: Input
1497
- }], items: [{
1498
- type: Input
1499
- }], level: [{
1500
- type: Input
1501
- }] }); })();
784
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: NavigationComponent, decorators: [{
785
+ type: Component,
786
+ args: [{ selector: 'ul[rxap-navigation]', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, host: {
787
+ class: 'list-none dark:text-neutral-400 text-neutral-700',
788
+ }, imports: [
789
+ NgFor,
790
+ NgIf,
791
+ MatDividerModule,
792
+ forwardRef(() => NavigationItemComponent),
793
+ AsyncPipe,
794
+ ], template: "<ng-template [ngForOf]=\"items\" let-item ngFor>\n <ng-template [ngIf]=\"isNavigationDividerItem(item)\">\n <mat-divider></mat-divider>\n <div *ngIf=\"(sidenav.collapsed$ | async) === false\" class=\"pl-5 h-6\">\n <span *ngIf=\"item.title\">{{item.title}}</span>\n </div>\n </ng-template>\n <ng-template [ngIf]=\"isNavigationItem(item)\">\n <li [item]=\"asNavigationItem(item)\" [level]=\"level\" class=\"dark:hover:text-white hover:text-black\"\n rxap-navigation-item></li>\n </ng-template>\n</ng-template>\n" }]
795
+ }], ctorParameters: function () { return [{ type: NavigationService, decorators: [{
796
+ type: Inject,
797
+ args: [NavigationService]
798
+ }] }, { type: i0.ChangeDetectorRef, decorators: [{
799
+ type: Inject,
800
+ args: [ChangeDetectorRef]
801
+ }] }, { type: SidenavComponentService, decorators: [{
802
+ type: Inject,
803
+ args: [SidenavComponentService]
804
+ }] }]; }, propDecorators: { items: [{
805
+ type: Input
806
+ }], level: [{
807
+ type: Input
808
+ }], _root: [{
809
+ type: HostBinding,
810
+ args: ['class.rxap-root-navigation']
811
+ }], root: [{
812
+ type: Input
813
+ }] } });
1502
814
 
1503
- function SidenavComponent_ng_template_3_ng_container_2_Template(rf, ctx) { if (rf & 1) {
1504
- i0.ɵɵelementContainer(0);
1505
- } }
1506
- function SidenavComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
1507
- i0.ɵɵelementStart(0, "div", 11);
1508
- i0.ɵɵpipe(1, "async");
1509
- i0.ɵɵtemplate(2, SidenavComponent_ng_template_3_ng_container_2_Template, 1, 0, "ng-container", 12);
1510
- i0.ɵɵelementEnd();
1511
- i0.ɵɵelement(3, "mat-divider", 13);
1512
- i0.ɵɵpipe(4, "async");
1513
- } if (rf & 2) {
1514
- const ctx_r0 = i0.ɵɵnextContext();
1515
- let tmp_1_0;
1516
- i0.ɵɵproperty("fxHide", i0.ɵɵpipeBind1(1, 3, ctx_r0.sidenav.collapsed$));
1517
- i0.ɵɵadvance(2);
1518
- i0.ɵɵproperty("ngTemplateOutlet", (tmp_1_0 = ctx_r0.sidenavHeaderDirective == null ? null : ctx_r0.sidenavHeaderDirective.template) !== null && tmp_1_0 !== undefined ? tmp_1_0 : null);
1519
- i0.ɵɵadvance(1);
1520
- i0.ɵɵproperty("fxHide", i0.ɵɵpipeBind1(4, 5, ctx_r0.sidenav.collapsed$));
1521
- } }
1522
- function SidenavComponent_ng_template_15_ng_container_4_Template(rf, ctx) { if (rf & 1) {
1523
- i0.ɵɵelementContainer(0);
1524
- } }
1525
- function SidenavComponent_ng_template_15_Template(rf, ctx) { if (rf & 1) {
1526
- i0.ɵɵelement(0, "mat-divider", 13);
1527
- i0.ɵɵpipe(1, "async");
1528
- i0.ɵɵelementStart(2, "div", 14);
1529
- i0.ɵɵpipe(3, "async");
1530
- i0.ɵɵtemplate(4, SidenavComponent_ng_template_15_ng_container_4_Template, 1, 0, "ng-container", 12);
1531
- i0.ɵɵelementEnd();
1532
- } if (rf & 2) {
1533
- const ctx_r1 = i0.ɵɵnextContext();
1534
- let tmp_2_0;
1535
- i0.ɵɵproperty("fxHide", i0.ɵɵpipeBind1(1, 3, ctx_r1.sidenav.collapsed$));
1536
- i0.ɵɵadvance(2);
1537
- i0.ɵɵproperty("fxHide", i0.ɵɵpipeBind1(3, 5, ctx_r1.sidenav.collapsed$));
1538
- i0.ɵɵadvance(2);
1539
- i0.ɵɵproperty("ngTemplateOutlet", (tmp_2_0 = ctx_r1.sidenavFooterDirective == null ? null : ctx_r1.sidenavFooterDirective.template) !== null && tmp_2_0 !== undefined ? tmp_2_0 : null);
1540
- } }
1541
- const _c2 = function (a0) { return { "collapsed": a0 }; };
1542
- class SidenavComponent {
1543
- constructor(sidenav) {
1544
- this.sidenav = sidenav;
815
+ class LayoutComponentService {
816
+ constructor(footerComponentService, headerComponentService, logoConfig = null, config) {
817
+ this.footerComponentService = footerComponentService;
818
+ this.headerComponentService = headerComponentService;
819
+ this.config = config;
820
+ this.opened$ = new BehaviorSubject(true);
821
+ this.mode$ = new BehaviorSubject('side');
822
+ this.fixedTopGap$ = new BehaviorSubject(64);
823
+ this.mode$.next(this.config.get('navigation.mode', this.mode$.value));
824
+ this.opened$.next(this.config.get('navigation.open', this.opened$.value));
825
+ this.fixedBottomGap$ = this.footerComponentService.portalCount$.pipe(map(count => count * 64));
826
+ this.fixedTopGap$.next(this.headerComponentService.countComponent * 64);
827
+ this.headerComponentService.update$.pipe(tap(() => this.fixedTopGap$.next(this.headerComponentService.countComponent * 64))).subscribe();
828
+ this.logo = logoConfig ?? {
829
+ src: '/assets/logo.png',
830
+ width: 192,
831
+ };
1545
832
  }
1546
- static { this.ɵfac = function SidenavComponent_Factory(t) { return new (t || SidenavComponent)(i0.ɵɵdirectiveInject(SidenavComponentService)); }; }
1547
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SidenavComponent, selectors: [["rxap-sidenav"]], contentQueries: function SidenavComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
1548
- i0.ɵɵcontentQuery(dirIndex, SidenavFooterDirective, 5);
1549
- i0.ɵɵcontentQuery(dirIndex, SidenavHeaderDirective, 5);
1550
- } if (rf & 2) {
1551
- let _t;
1552
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.sidenavFooterDirective = _t.first);
1553
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.sidenavHeaderDirective = _t.first);
1554
- } }, hostAttrs: [1, "rxap-layout-sidenav"], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 16, vars: 15, consts: function () { let i18n_0; if (typeof ngI18nClosureMode !== "undefined" && ngI18nClosureMode) {
1555
- /**
1556
- * @suppress {msgDescriptions}
1557
- */
1558
- const MSG_EXTERNAL_1144722711335201698$$LIB_SIDENAV_SIDENAV_COMPONENT_TS_1 = goog.getMsg("Collapse sidebar");
1559
- i18n_0 = MSG_EXTERNAL_1144722711335201698$$LIB_SIDENAV_SIDENAV_COMPONENT_TS_1;
1560
- }
1561
- else {
1562
- i18n_0 = $localize `:␟98effe6eb558f87ab061ab608a31b44adec4e2ae␟1144722711335201698:Collapse sidebar`;
1563
- } return [[1, "container", 3, "ngClass"], ["fxLayout", "column", "fxLayoutAlign", "space-between stretch", 1, "inner"], [3, "ngIf"], ["fxFlex", "grow", 1, "nav-container"], ["fxLayout", "column", "root", "", "rxap-navigation", ""], ["fxFlex", "nogrow"], ["mat-button", "", "fxFlex", "nogrow", 1, "sidebar-toggle", 3, "ngClass", "click"], ["fxLayout", "row", "fxLayoutAlign", "start center", "fxLayoutGap", "16px", 1, "sidebar-toggle-inner"], ["fxFlex", "nogrow", 1, "arrow"], ["fxFlex", "grow", 1, "label", 3, "fxHide"], i18n_0, ["fxFlex", "nogrow", 1, "header", 3, "fxHide"], [4, "ngTemplateOutlet"], ["fxFlex", "nogrow", 3, "fxHide"], ["fxFlex", "nogrow", 1, "footer", 3, "fxHide"]]; }, template: function SidenavComponent_Template(rf, ctx) { if (rf & 1) {
1564
- i0.ɵɵelementStart(0, "div", 0);
1565
- i0.ɵɵpipe(1, "async");
1566
- i0.ɵɵelementStart(2, "div", 1);
1567
- i0.ɵɵtemplate(3, SidenavComponent_ng_template_3_Template, 5, 7, "ng-template", 2);
1568
- i0.ɵɵelementStart(4, "div", 3);
1569
- i0.ɵɵelement(5, "ul", 4);
1570
- i0.ɵɵelementEnd();
1571
- i0.ɵɵelement(6, "mat-divider", 5);
1572
- i0.ɵɵelementStart(7, "button", 6);
1573
- i0.ɵɵlistener("click", function SidenavComponent_Template_button_click_7_listener() { return ctx.sidenav.toggleNavigationCollapse(); });
1574
- i0.ɵɵpipe(8, "async");
1575
- i0.ɵɵelementStart(9, "span", 7)(10, "mat-icon", 8);
1576
- i0.ɵɵtext(11, "double_arrow");
1577
- i0.ɵɵelementEnd();
1578
- i0.ɵɵelementStart(12, "span", 9);
1579
- i0.ɵɵi18n(13, 10);
1580
- i0.ɵɵpipe(14, "async");
1581
- i0.ɵɵelementEnd()()();
1582
- i0.ɵɵtemplate(15, SidenavComponent_ng_template_15_Template, 5, 7, "ng-template", 2);
1583
- i0.ɵɵelementEnd()();
1584
- } if (rf & 2) {
1585
- let tmp_4_0;
1586
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(11, _c2, i0.ɵɵpipeBind1(1, 5, ctx.sidenav.collapsed$)));
1587
- i0.ɵɵadvance(3);
1588
- i0.ɵɵproperty("ngIf", ctx.sidenavHeaderDirective == null ? null : ctx.sidenavHeaderDirective.template);
1589
- i0.ɵɵadvance(4);
1590
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(13, _c2, i0.ɵɵpipeBind1(8, 7, ctx.sidenav.collapsed$)));
1591
- i0.ɵɵadvance(5);
1592
- i0.ɵɵproperty("fxHide", i0.ɵɵpipeBind1(14, 9, ctx.sidenav.collapsed$));
1593
- i0.ɵɵadvance(3);
1594
- i0.ɵɵproperty("ngIf", (tmp_4_0 = ctx.sidenavFooterDirective == null ? null : ctx.sidenavFooterDirective.template) !== null && tmp_4_0 !== undefined ? tmp_4_0 : null);
1595
- } }, dependencies: [ExtendedModule, i2$4.DefaultShowHideDirective, i2$4.DefaultClassDirective, NgClass,
1596
- FlexModule, i1$3.DefaultLayoutDirective, i1$3.DefaultLayoutGapDirective, i1$3.DefaultLayoutAlignDirective, i1$3.DefaultFlexDirective, NgIf,
1597
- NgTemplateOutlet,
1598
- MatDividerModule, i1$5.MatDivider, NavigationComponent,
1599
- MatButtonModule, i1$2.MatButton, MatIconModule, i2$2.MatIcon, AsyncPipe], styles: [".container[_ngcontent-%COMP%], .container[_ngcontent-%COMP%] .inner[_ngcontent-%COMP%]{height:100%}.container[_ngcontent-%COMP%] .inner[_ngcontent-%COMP%] .header[_ngcontent-%COMP%]{padding-bottom:12px}.container[_ngcontent-%COMP%] .inner[_ngcontent-%COMP%] .footer[_ngcontent-%COMP%]{padding-top:12px}.container[_ngcontent-%COMP%] .inner[_ngcontent-%COMP%] .nav-container[_ngcontent-%COMP%]{overflow-y:scroll;padding-top:12px}.container[_ngcontent-%COMP%] .inner[_ngcontent-%COMP%] .nav-container[_ngcontent-%COMP%]::-webkit-scrollbar{width:6px}.container[_ngcontent-%COMP%] .inner[_ngcontent-%COMP%] .nav-container[_ngcontent-%COMP%]::-webkit-scrollbar-track{border-radius:2px}.container[_ngcontent-%COMP%] .inner[_ngcontent-%COMP%] .nav-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{border-radius:10px}.container[_ngcontent-%COMP%] .sidebar-toggle[_ngcontent-%COMP%]{min-height:48px}.container[_ngcontent-%COMP%] .sidebar-toggle[_ngcontent-%COMP%] .sidebar-toggle-inner[_ngcontent-%COMP%]{padding:0}.container[_ngcontent-%COMP%] .sidebar-toggle[_ngcontent-%COMP%] .arrow[_ngcontent-%COMP%]{transform:rotate(180deg)}.container[_ngcontent-%COMP%] .sidebar-toggle.collapsed[_ngcontent-%COMP%] .arrow[_ngcontent-%COMP%]{transform:initial}.container[_ngcontent-%COMP%] .sidebar-toggle.collapsed[_ngcontent-%COMP%] .sidebar-toggle-inner[_ngcontent-%COMP%]{justify-content:space-around!important}"], changeDetection: 0 }); }
833
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponentService, deps: [{ token: i1.FooterService }, { token: i1.HeaderService }, { token: RXAP_LOGO_CONFIG, optional: true }, { token: ConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
834
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponentService, providedIn: 'root' }); }
1600
835
  }
1601
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SidenavComponent, [{
1602
- type: Component,
1603
- args: [{ selector: 'rxap-sidenav', changeDetection: ChangeDetectionStrategy.OnPush, host: {
1604
- class: 'rxap-layout-sidenav'
1605
- }, standalone: true, imports: [
1606
- ExtendedModule,
1607
- NgClass,
1608
- FlexModule,
1609
- NgIf,
1610
- NgTemplateOutlet,
1611
- MatDividerModule,
1612
- NavigationComponent,
1613
- MatButtonModule,
1614
- MatIconModule,
1615
- AsyncPipe
1616
- ], template: "<div class=\"container\" [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\">\n <div class=\"inner\"\n fxLayout=\"column\"\n fxLayoutAlign=\"space-between stretch\">\n <ng-template [ngIf]=\"sidenavHeaderDirective?.template\">\n <div fxFlex=\"nogrow\" class=\"header\" [fxHide]=\"sidenav.collapsed$ | async\">\n <ng-container *ngTemplateOutlet=\"sidenavHeaderDirective?.template ?? null\"></ng-container>\n </div>\n <mat-divider fxFlex=\"nogrow\" [fxHide]=\"sidenav.collapsed$ | async\"></mat-divider>\n </ng-template>\n <div fxFlex=\"grow\" class=\"nav-container\">\n <ul fxLayout=\"column\" root rxap-navigation></ul>\n </div>\n <mat-divider fxFlex=\"nogrow\"></mat-divider>\n <button mat-button class=\"sidebar-toggle\" [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\" fxFlex=\"nogrow\"\n (click)=\"sidenav.toggleNavigationCollapse()\">\n <span class=\"sidebar-toggle-inner\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"16px\">\n <mat-icon fxFlex=\"nogrow\" class=\"arrow\">double_arrow</mat-icon>\n <span [fxHide]=\"sidenav.collapsed$ | async\" class=\"label\" fxFlex=\"grow\" i18n>Collapse sidebar</span>\n </span>\n </button>\n <ng-template [ngIf]=\"sidenavFooterDirective?.template ?? null\">\n <mat-divider fxFlex=\"nogrow\" [fxHide]=\"sidenav.collapsed$ | async\"></mat-divider>\n <div fxFlex=\"nogrow\" class=\"footer\" [fxHide]=\"sidenav.collapsed$ | async\">\n <ng-container *ngTemplateOutlet=\"sidenavFooterDirective?.template ?? null\"></ng-container>\n </div>\n </ng-template>\n </div>\n</div>\n", styles: [".container,.container .inner{height:100%}.container .inner .header{padding-bottom:12px}.container .inner .footer{padding-top:12px}.container .inner .nav-container{overflow-y:scroll;padding-top:12px}.container .inner .nav-container::-webkit-scrollbar{width:6px}.container .inner .nav-container::-webkit-scrollbar-track{border-radius:2px}.container .inner .nav-container::-webkit-scrollbar-thumb{border-radius:10px}.container .sidebar-toggle{min-height:48px}.container .sidebar-toggle .sidebar-toggle-inner{padding:0}.container .sidebar-toggle .arrow{transform:rotate(180deg)}.container .sidebar-toggle.collapsed .arrow{transform:initial}.container .sidebar-toggle.collapsed .sidebar-toggle-inner{justify-content:space-around!important}\n"] }]
1617
- }], function () { return [{ type: SidenavComponentService }]; }, { sidenavFooterDirective: [{
1618
- type: ContentChild,
1619
- args: [SidenavFooterDirective]
1620
- }], sidenavHeaderDirective: [{
1621
- type: ContentChild,
1622
- args: [SidenavHeaderDirective]
1623
- }] }); })();
836
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponentService, decorators: [{
837
+ type: Injectable,
838
+ args: [{ providedIn: 'root' }]
839
+ }], ctorParameters: function () { return [{ type: i1.FooterService }, { type: i1.HeaderService }, { type: undefined, decorators: [{
840
+ type: Optional
841
+ }, {
842
+ type: Inject,
843
+ args: [RXAP_LOGO_CONFIG]
844
+ }] }, { type: i1$1.ConfigService, decorators: [{
845
+ type: Inject,
846
+ args: [ConfigService]
847
+ }] }]; } });
1624
848
 
1625
- const _c0 = function () { return ["/"]; };
1626
- function LayoutComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) {
1627
- i0.ɵɵelement(0, "img", 9);
1628
- } if (rf & 2) {
1629
- const ctx_r0 = i0.ɵɵnextContext();
1630
- i0.ɵɵproperty("routerLink", i0.ɵɵpureFunction0(3, _c0))("width", ctx_r0.layoutComponentService.logo.width)("src", ctx_r0.layoutComponentService.logo.src, i0.ɵɵsanitizeUrl);
1631
- } }
1632
- const _c1 = ["*"];
1633
849
  class LayoutComponent {
1634
- constructor(layoutComponentService) {
850
+ constructor(layoutComponentService, environment, iconLoaderService) {
1635
851
  this.layoutComponentService = layoutComponentService;
1636
- this.openWindowSidenav = false;
852
+ this.environment = environment;
853
+ this.sidenavMode = 'over';
854
+ iconLoaderService.load();
1637
855
  }
1638
- static { this.ɵfac = function LayoutComponent_Factory(t) { return new (t || LayoutComponent)(i0.ɵɵdirectiveInject(LayoutComponentService)); }; }
1639
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LayoutComponent, selectors: [["rxap-layout"]], viewQuery: function LayoutComponent_Query(rf, ctx) { if (rf & 1) {
1640
- i0.ɵɵviewQuery(MatSidenav, 7);
1641
- } if (rf & 2) {
1642
- let _t;
1643
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.sidenav = _t.first);
1644
- } }, standalone: true, features: [i0.ɵɵStandaloneFeature], ngContentSelectors: _c1, decls: 18, vars: 24, consts: [[1, "header", 3, "sidenav"], ["autosize", "", 1, "container"], [1, "sidenav", 3, "fixedBottomGap", "fixedInViewport", "fixedTopGap", "mode", "opened"], ["rxapSidenavHeader", ""], [1, "content"], [3, "sidenav"], [3, "openWindowSidenav", "openWindowSidenavChange"], ["mode", "side", "position", "end", 1, "window-container-sidenav", 3, "fixedBottomGap", "fixedInViewport", "fixedTopGap", "opened"], [1, "footer"], ["alt", "logo", 1, "logo", 3, "routerLink", "width", "src"]], template: function LayoutComponent_Template(rf, ctx) { if (rf & 1) {
1645
- i0.ɵɵprojectionDef();
1646
- i0.ɵɵelement(0, "rxap-header", 0);
1647
- i0.ɵɵelementStart(1, "mat-sidenav-container", 1)(2, "mat-sidenav", 2);
1648
- i0.ɵɵpipe(3, "async");
1649
- i0.ɵɵpipe(4, "async");
1650
- i0.ɵɵpipe(5, "async");
1651
- i0.ɵɵpipe(6, "async");
1652
- i0.ɵɵelementStart(7, "rxap-sidenav");
1653
- i0.ɵɵtemplate(8, LayoutComponent_ng_template_8_Template, 1, 4, "ng-template", 3);
1654
- i0.ɵɵelementEnd()();
1655
- i0.ɵɵelementStart(9, "mat-sidenav-content", 4)(10, "rxap-sidenav-content", 5);
1656
- i0.ɵɵprojection(11);
1657
- i0.ɵɵelementStart(12, "rxap-toggle-window-sidenav-button", 6);
1658
- i0.ɵɵlistener("openWindowSidenavChange", function LayoutComponent_Template_rxap_toggle_window_sidenav_button_openWindowSidenavChange_12_listener($event) { return ctx.openWindowSidenav = $event; });
1659
- i0.ɵɵelementEnd()()();
1660
- i0.ɵɵelementStart(13, "mat-sidenav", 7);
1661
- i0.ɵɵpipe(14, "async");
1662
- i0.ɵɵpipe(15, "async");
1663
- i0.ɵɵelement(16, "rxap-window-container-sidenav");
1664
- i0.ɵɵelementEnd()();
1665
- i0.ɵɵelement(17, "rxap-footer", 8);
1666
- } if (rf & 2) {
1667
- let tmp_4_0;
1668
- let tmp_5_0;
1669
- i0.ɵɵproperty("sidenav", ctx.sidenav);
1670
- i0.ɵɵadvance(2);
1671
- i0.ɵɵproperty("fixedBottomGap", i0.ɵɵpipeBind1(3, 12, ctx.layoutComponentService.fixedBottomGap$))("fixedInViewport", true)("fixedTopGap", i0.ɵɵpipeBind1(4, 14, ctx.layoutComponentService.fixedTopGap$))("mode", (tmp_4_0 = i0.ɵɵpipeBind1(5, 16, ctx.layoutComponentService.mode$)) !== null && tmp_4_0 !== undefined ? tmp_4_0 : "side")("opened", (tmp_5_0 = i0.ɵɵpipeBind1(6, 18, ctx.layoutComponentService.opened$)) !== null && tmp_5_0 !== undefined ? tmp_5_0 : true);
1672
- i0.ɵɵadvance(8);
1673
- i0.ɵɵproperty("sidenav", ctx.sidenav);
1674
- i0.ɵɵadvance(2);
1675
- i0.ɵɵproperty("openWindowSidenav", ctx.openWindowSidenav);
1676
- i0.ɵɵadvance(1);
1677
- i0.ɵɵproperty("fixedBottomGap", i0.ɵɵpipeBind1(14, 20, ctx.layoutComponentService.fixedBottomGap$))("fixedInViewport", true)("fixedTopGap", i0.ɵɵpipeBind1(15, 22, ctx.layoutComponentService.fixedTopGap$))("opened", ctx.openWindowSidenav);
1678
- } }, dependencies: [HeaderComponent,
1679
- MatSidenavModule, i2$7.MatSidenav, i2$7.MatSidenavContainer, i2$7.MatSidenavContent, SidenavComponent,
1680
- SidenavHeaderDirective,
1681
- RouterLink,
1682
- SidenavContentComponent,
1683
- ToggleWindowSidenavButtonComponent,
1684
- WindowContainerSidenavComponent,
1685
- FooterComponent,
1686
- AsyncPipe], styles: [".container[_ngcontent-%COMP%], .content[_ngcontent-%COMP%]{height:100%}.sidenav[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:auto}.sidenav[_ngcontent-%COMP%] .logo[_ngcontent-%COMP%]{padding:16px}.footer[_ngcontent-%COMP%]{position:fixed;bottom:0;left:0;right:0;z-index:100}.header[_ngcontent-%COMP%]{position:fixed;top:0;left:0;right:0;z-index:100}"], changeDetection: 0 }); }
1687
- }
1688
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LayoutComponent, [{
1689
- type: Component,
1690
- args: [{ selector: 'rxap-layout', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
1691
- HeaderComponent,
1692
- MatSidenavModule,
1693
- SidenavComponent,
1694
- SidenavHeaderDirective,
1695
- RouterLink,
1696
- SidenavContentComponent,
1697
- ToggleWindowSidenavButtonComponent,
1698
- WindowContainerSidenavComponent,
1699
- FooterComponent,
1700
- AsyncPipe
1701
- ], template: "<rxap-header [sidenav]=\"sidenav\" class=\"header\"></rxap-header>\n<mat-sidenav-container autosize class=\"container\">\n <mat-sidenav\n [fixedBottomGap]=\"layoutComponentService.fixedBottomGap$ | async\"\n [fixedInViewport]=\"true\"\n [fixedTopGap]=\"layoutComponentService.fixedTopGap$ | async\"\n [mode]=\"(layoutComponentService.mode$ | async) ?? 'side'\"\n [opened]=\"(layoutComponentService.opened$ | async) ?? true\"\n class=\"sidenav\"\n >\n <rxap-sidenav>\n <ng-template rxapSidenavHeader>\n <img\n [routerLink]=\"['/']\"\n alt=\"logo\"\n class=\"logo\"\n [width]=\"layoutComponentService.logo.width\"\n [src]=\"layoutComponentService.logo.src\"\n />\n </ng-template>\n </rxap-sidenav>\n </mat-sidenav>\n <mat-sidenav-content class=\"content\">\n <rxap-sidenav-content [sidenav]=\"sidenav\">\n <ng-content></ng-content>\n <rxap-toggle-window-sidenav-button [(openWindowSidenav)]=\"openWindowSidenav\"></rxap-toggle-window-sidenav-button>\n </rxap-sidenav-content>\n </mat-sidenav-content>\n <mat-sidenav\n [fixedBottomGap]=\"layoutComponentService.fixedBottomGap$ | async\"\n [fixedInViewport]=\"true\"\n [fixedTopGap]=\"layoutComponentService.fixedTopGap$ | async\"\n [opened]=\"openWindowSidenav\"\n mode=\"side\"\n class=\"window-container-sidenav\"\n position=\"end\"\n >\n <rxap-window-container-sidenav></rxap-window-container-sidenav>\n </mat-sidenav>\n</mat-sidenav-container>\n<rxap-footer class=\"footer\"></rxap-footer>\n", styles: [".container,.content{height:100%}.sidenav{display:flex;align-items:center;justify-content:center;width:auto}.sidenav .logo{padding:16px}.footer{position:fixed;bottom:0;left:0;right:0;z-index:100}.header{position:fixed;top:0;left:0;right:0;z-index:100}\n"] }]
1702
- }], function () { return [{ type: LayoutComponentService }]; }, { sidenav: [{
1703
- type: ViewChild,
1704
- args: [MatSidenav, { static: true }]
1705
- }] }); })();
1706
-
1707
- class LayoutModule {
1708
- static withNavigation(navigation) {
1709
- return {
1710
- ngModule: LayoutModule,
1711
- providers: [
1712
- {
1713
- provide: RXAP_NAVIGATION_CONFIG,
1714
- useValue: navigation
1715
- }
1716
- ]
1717
- };
856
+ get release() {
857
+ return DetermineReleaseName(this.environment);
1718
858
  }
1719
- static { this.ɵfac = function LayoutModule_Factory(t) { return new (t || LayoutModule)(); }; }
1720
- static { this.ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: LayoutModule }); }
1721
- static { this.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [LayoutComponent] }); }
859
+ toggleSidenavMode() {
860
+ if (this.sidenavMode === 'over') {
861
+ this.sidenavMode = 'side';
862
+ this.sidenav.open();
863
+ }
864
+ else {
865
+ this.sidenavMode = 'over';
866
+ }
867
+ }
868
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponent, deps: [{ token: LayoutComponentService }, { token: RXAP_ENVIRONMENT }, { token: i2$4.IconLoaderService }], target: i0.ɵɵFactoryTarget.Component }); }
869
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: LayoutComponent, isStandalone: true, selector: "rxap-layout", viewQueries: [{ propertyName: "sidenav", first: true, predicate: MatSidenav, descendants: true, static: true }], ngImport: i0, template: "<div class=\"flex flex-col h-screen justify-between\">\n <rxap-header [sidenav]=\"sidenav\" class=\"z-10 w-full fixed top-0\"></rxap-header>\n <mat-sidenav-container [ngClass]=\"{\n 'mb-16': (layoutComponentService.fixedBottomGap$ | async) === 64,\n 'mb-32': (layoutComponentService.fixedBottomGap$ | async) === 128,\n }\" class=\"grow mt-16\">\n <mat-sidenav\n #matSidenav=\"matSidenav\"\n (mouseenter)=\"sidenavMode === 'over' && matSidenav.open()\"\n (mouseleave)=\"sidenavMode === 'over' && matSidenav.close()\"\n [fixedBottomGap]=\"layoutComponentService.fixedBottomGap$ | async\"\n [fixedInViewport]=\"true\"\n [fixedTopGap]=\"layoutComponentService.fixedTopGap$ | async\"\n [mode]=\"sidenavMode\"\n [opened]=\"false\"\n class=\"sidenav\"\n >\n <div class=\"h-full py-2 flex flex-col items-center gap-y-5 justify-items-stretch\">\n\n <div (click)=\"toggleSidenavMode()\"\n class=\"pl-2 pr-2 self-stretch grow-0 flex flex-row justify-between items-center\">\n <span class=\"text-lg\" i18n>Navigation</span>\n <button mat-icon-button>\n <mat-icon *ngIf=\"sidenavMode === 'over'\">radio_button_unchecked</mat-icon>\n <mat-icon *ngIf=\"sidenavMode === 'side'\">radio_button_checked</mat-icon>\n </button>\n </div>\n\n <ul class=\"grow self-stretch\" root rxap-navigation></ul>\n\n <img\n [src]=\"layoutComponentService.logo.src ?? 'https://via.placeholder.com/256x128px'\"\n [routerLink]=\"['/']\"\n [width]=\"layoutComponentService.logo.width ?? 256\"\n alt=\"logo\"\n class=\"grow-0 mx-16\"\n />\n <div class=\"grow-0 px-16\">\n <span>{{release}}</span>\n </div>\n </div>\n </mat-sidenav>\n <mat-sidenav-content class=\"ml-16 p-4\">\n <router-outlet></router-outlet>\n </mat-sidenav-content>\n </mat-sidenav-container>\n <rxap-footer class=\"z-10 w-full fixed bottom-0\"></rxap-footer>\n</div>\n<!--<rxap-window-task-bar-container></rxap-window-task-bar-container>-->\n", styles: [":host .sidenav:not(.mat-drawer-opened){transform:translate(calc(-100% + 64px))!important;visibility:visible!important;box-shadow:inherit!important;transition-property:transform;transition-delay:.25s;display:flex;border-right:solid 1px rgba(0,0,0,.12)}:host .sidenav ::ng-deep .mat-drawer-inner-container::-webkit-scrollbar{display:none}\n"], dependencies: [{ kind: "component", type: HeaderComponent, selector: "rxap-header", inputs: ["sidenav", "color"] }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "component", type: i3$4.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i3$4.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i3$4.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FlexLayoutModule }, { kind: "directive", type: i2$5.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FooterComponent, selector: "rxap-footer" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: NavigationComponent, selector: "ul[rxap-navigation]", inputs: ["items", "level", "root"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1722
870
  }
1723
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LayoutModule, [{
1724
- type: NgModule,
1725
- args: [{
1726
- imports: [
1727
- LayoutComponent
1728
- ],
1729
- exports: [LayoutComponent]
1730
- }]
1731
- }], null, null); })();
1732
- (function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(LayoutModule, { imports: [LayoutComponent], exports: [LayoutComponent] }); })();
871
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: LayoutComponent, decorators: [{
872
+ type: Component,
873
+ args: [{ selector: 'rxap-layout', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
874
+ HeaderComponent,
875
+ MatSidenavModule,
876
+ AsyncPipe,
877
+ FlexLayoutModule,
878
+ MatIconModule,
879
+ MatButtonModule,
880
+ RouterLink,
881
+ NgIf,
882
+ FooterComponent,
883
+ MatMenuModule,
884
+ NgOptimizedImage,
885
+ NavigationComponent,
886
+ RouterOutlet,
887
+ ], template: "<div class=\"flex flex-col h-screen justify-between\">\n <rxap-header [sidenav]=\"sidenav\" class=\"z-10 w-full fixed top-0\"></rxap-header>\n <mat-sidenav-container [ngClass]=\"{\n 'mb-16': (layoutComponentService.fixedBottomGap$ | async) === 64,\n 'mb-32': (layoutComponentService.fixedBottomGap$ | async) === 128,\n }\" class=\"grow mt-16\">\n <mat-sidenav\n #matSidenav=\"matSidenav\"\n (mouseenter)=\"sidenavMode === 'over' && matSidenav.open()\"\n (mouseleave)=\"sidenavMode === 'over' && matSidenav.close()\"\n [fixedBottomGap]=\"layoutComponentService.fixedBottomGap$ | async\"\n [fixedInViewport]=\"true\"\n [fixedTopGap]=\"layoutComponentService.fixedTopGap$ | async\"\n [mode]=\"sidenavMode\"\n [opened]=\"false\"\n class=\"sidenav\"\n >\n <div class=\"h-full py-2 flex flex-col items-center gap-y-5 justify-items-stretch\">\n\n <div (click)=\"toggleSidenavMode()\"\n class=\"pl-2 pr-2 self-stretch grow-0 flex flex-row justify-between items-center\">\n <span class=\"text-lg\" i18n>Navigation</span>\n <button mat-icon-button>\n <mat-icon *ngIf=\"sidenavMode === 'over'\">radio_button_unchecked</mat-icon>\n <mat-icon *ngIf=\"sidenavMode === 'side'\">radio_button_checked</mat-icon>\n </button>\n </div>\n\n <ul class=\"grow self-stretch\" root rxap-navigation></ul>\n\n <img\n [src]=\"layoutComponentService.logo.src ?? 'https://via.placeholder.com/256x128px'\"\n [routerLink]=\"['/']\"\n [width]=\"layoutComponentService.logo.width ?? 256\"\n alt=\"logo\"\n class=\"grow-0 mx-16\"\n />\n <div class=\"grow-0 px-16\">\n <span>{{release}}</span>\n </div>\n </div>\n </mat-sidenav>\n <mat-sidenav-content class=\"ml-16 p-4\">\n <router-outlet></router-outlet>\n </mat-sidenav-content>\n </mat-sidenav-container>\n <rxap-footer class=\"z-10 w-full fixed bottom-0\"></rxap-footer>\n</div>\n<!--<rxap-window-task-bar-container></rxap-window-task-bar-container>-->\n", styles: [":host .sidenav:not(.mat-drawer-opened){transform:translate(calc(-100% + 64px))!important;visibility:visible!important;box-shadow:inherit!important;transition-property:transform;transition-delay:.25s;display:flex;border-right:solid 1px rgba(0,0,0,.12)}:host .sidenav ::ng-deep .mat-drawer-inner-container::-webkit-scrollbar{display:none}\n"] }]
888
+ }], ctorParameters: function () { return [{ type: LayoutComponentService }, { type: undefined, decorators: [{
889
+ type: Inject,
890
+ args: [RXAP_ENVIRONMENT]
891
+ }] }, { type: i2$4.IconLoaderService }]; }, propDecorators: { sidenav: [{
892
+ type: ViewChild,
893
+ args: [MatSidenav, { static: true }]
894
+ }] } });
1733
895
 
1734
896
  class ReplaceRouterPathsService {
1735
897
  transform(routerLink) {
1736
898
  return of(routerLink);
1737
899
  }
1738
- static { this.ɵfac = function ReplaceRouterPathsService_Factory(t) { return new (t || ReplaceRouterPathsService)(); }; }
1739
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ReplaceRouterPathsService, factory: ReplaceRouterPathsService.ɵfac, providedIn: 'root' }); }
900
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ReplaceRouterPathsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
901
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ReplaceRouterPathsService, providedIn: 'root' }); }
1740
902
  }
1741
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ReplaceRouterPathsService, [{
1742
- type: Injectable,
1743
- args: [{ providedIn: 'root' }]
1744
- }], null, null); })();
903
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ReplaceRouterPathsService, decorators: [{
904
+ type: Injectable,
905
+ args: [{ providedIn: 'root' }]
906
+ }] });
907
+
908
+ class SidenavFooterDirective {
909
+ constructor(template) {
910
+ this.template = template;
911
+ }
912
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavFooterDirective, deps: [{ token: TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
913
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.4", type: SidenavFooterDirective, isStandalone: true, selector: "[rxapSidenavFooter]", ngImport: i0 }); }
914
+ }
915
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavFooterDirective, decorators: [{
916
+ type: Directive,
917
+ args: [{
918
+ selector: '[rxapSidenavFooter]',
919
+ standalone: true,
920
+ }]
921
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef, decorators: [{
922
+ type: Inject,
923
+ args: [TemplateRef]
924
+ }] }]; } });
925
+
926
+ class SidenavHeaderDirective {
927
+ constructor(template) {
928
+ this.template = template;
929
+ }
930
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavHeaderDirective, deps: [{ token: TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
931
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.4", type: SidenavHeaderDirective, isStandalone: true, selector: "[rxapSidenavHeader]", ngImport: i0 }); }
932
+ }
933
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavHeaderDirective, decorators: [{
934
+ type: Directive,
935
+ args: [{
936
+ selector: '[rxapSidenavHeader]',
937
+ standalone: true,
938
+ }]
939
+ }], ctorParameters: function () { return [{ type: i0.TemplateRef, decorators: [{
940
+ type: Inject,
941
+ args: [TemplateRef]
942
+ }] }]; } });
943
+
944
+ class SidenavComponent {
945
+ constructor(sidenav) {
946
+ this.sidenav = sidenav;
947
+ }
948
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponent, deps: [{ token: SidenavComponentService }], target: i0.ɵɵFactoryTarget.Component }); }
949
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: SidenavComponent, isStandalone: true, selector: "rxap-sidenav", host: { classAttribute: "rxap-layout-sidenav" }, queries: [{ propertyName: "sidenavFooterDirective", first: true, predicate: SidenavFooterDirective, descendants: true }, { propertyName: "sidenavHeaderDirective", first: true, predicate: SidenavHeaderDirective, descendants: true }], ngImport: i0, template: "<div [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\" class=\"container\">\n <div class=\"inner\"\n fxLayout=\"column\"\n fxLayoutAlign=\"space-between stretch\">\n <ng-template [ngIf]=\"sidenavHeaderDirective?.template\">\n <div [fxHide]=\"sidenav.collapsed$ | async\" class=\"header\" fxFlex=\"nogrow\">\n <ng-container *ngTemplateOutlet=\"sidenavHeaderDirective?.template ?? null\"></ng-container>\n </div>\n <mat-divider [fxHide]=\"sidenav.collapsed$ | async\" fxFlex=\"nogrow\"></mat-divider>\n </ng-template>\n <div class=\"nav-container\" fxFlex=\"grow\">\n <ul fxLayout=\"column\" root rxap-navigation></ul>\n </div>\n <mat-divider fxFlex=\"nogrow\"></mat-divider>\n <button (click)=\"sidenav.toggleNavigationCollapse()\" [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\"\n class=\"sidebar-toggle\"\n fxFlex=\"nogrow\"\n mat-button>\n <span class=\"sidebar-toggle-inner\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"16px\">\n <mat-icon class=\"arrow\" fxFlex=\"nogrow\">double_arrow</mat-icon>\n <span [fxHide]=\"sidenav.collapsed$ | async\" class=\"label\" fxFlex=\"grow\" i18n>Collapse sidebar</span>\n </span>\n </button>\n <ng-template [ngIf]=\"sidenavFooterDirective?.template ?? null\">\n <mat-divider [fxHide]=\"sidenav.collapsed$ | async\" fxFlex=\"nogrow\"></mat-divider>\n <div [fxHide]=\"sidenav.collapsed$ | async\" class=\"footer\" fxFlex=\"nogrow\">\n <ng-container *ngTemplateOutlet=\"sidenavFooterDirective?.template ?? null\"></ng-container>\n </div>\n </ng-template>\n </div>\n</div>\n", styles: [".container,.container .inner{height:100%}.container .inner .header{padding-bottom:12px}.container .inner .footer{padding-top:12px}.container .inner .nav-container{overflow-y:scroll;padding-top:12px}.container .inner .nav-container::-webkit-scrollbar{width:6px}.container .inner .nav-container::-webkit-scrollbar-track{border-radius:2px}.container .inner .nav-container::-webkit-scrollbar-thumb{border-radius:10px}.container .sidebar-toggle{min-height:48px}.container .sidebar-toggle .sidebar-toggle-inner{padding:0}.container .sidebar-toggle .arrow{transform:rotate(180deg)}.container .sidebar-toggle.collapsed .arrow{transform:initial}.container .sidebar-toggle.collapsed .sidebar-toggle-inner{justify-content:space-around!important}\n"], dependencies: [{ kind: "ngmodule", type: ExtendedModule }, { kind: "directive", type: i2$5.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }, { kind: "directive", type: i2$5.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i1$5.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i1$5.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i1$5.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i1$5.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i3$3.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: NavigationComponent, selector: "ul[rxap-navigation]", inputs: ["items", "level", "root"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
950
+ }
951
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: SidenavComponent, decorators: [{
952
+ type: Component,
953
+ args: [{ selector: 'rxap-sidenav', changeDetection: ChangeDetectionStrategy.OnPush, host: {
954
+ class: 'rxap-layout-sidenav',
955
+ }, standalone: true, imports: [
956
+ ExtendedModule,
957
+ NgClass,
958
+ FlexModule,
959
+ NgIf,
960
+ NgTemplateOutlet,
961
+ MatDividerModule,
962
+ NavigationComponent,
963
+ MatButtonModule,
964
+ MatIconModule,
965
+ AsyncPipe,
966
+ ], template: "<div [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\" class=\"container\">\n <div class=\"inner\"\n fxLayout=\"column\"\n fxLayoutAlign=\"space-between stretch\">\n <ng-template [ngIf]=\"sidenavHeaderDirective?.template\">\n <div [fxHide]=\"sidenav.collapsed$ | async\" class=\"header\" fxFlex=\"nogrow\">\n <ng-container *ngTemplateOutlet=\"sidenavHeaderDirective?.template ?? null\"></ng-container>\n </div>\n <mat-divider [fxHide]=\"sidenav.collapsed$ | async\" fxFlex=\"nogrow\"></mat-divider>\n </ng-template>\n <div class=\"nav-container\" fxFlex=\"grow\">\n <ul fxLayout=\"column\" root rxap-navigation></ul>\n </div>\n <mat-divider fxFlex=\"nogrow\"></mat-divider>\n <button (click)=\"sidenav.toggleNavigationCollapse()\" [ngClass]=\"{ 'collapsed': sidenav.collapsed$ | async }\"\n class=\"sidebar-toggle\"\n fxFlex=\"nogrow\"\n mat-button>\n <span class=\"sidebar-toggle-inner\" fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"16px\">\n <mat-icon class=\"arrow\" fxFlex=\"nogrow\">double_arrow</mat-icon>\n <span [fxHide]=\"sidenav.collapsed$ | async\" class=\"label\" fxFlex=\"grow\" i18n>Collapse sidebar</span>\n </span>\n </button>\n <ng-template [ngIf]=\"sidenavFooterDirective?.template ?? null\">\n <mat-divider [fxHide]=\"sidenav.collapsed$ | async\" fxFlex=\"nogrow\"></mat-divider>\n <div [fxHide]=\"sidenav.collapsed$ | async\" class=\"footer\" fxFlex=\"nogrow\">\n <ng-container *ngTemplateOutlet=\"sidenavFooterDirective?.template ?? null\"></ng-container>\n </div>\n </ng-template>\n </div>\n</div>\n", styles: [".container,.container .inner{height:100%}.container .inner .header{padding-bottom:12px}.container .inner .footer{padding-top:12px}.container .inner .nav-container{overflow-y:scroll;padding-top:12px}.container .inner .nav-container::-webkit-scrollbar{width:6px}.container .inner .nav-container::-webkit-scrollbar-track{border-radius:2px}.container .inner .nav-container::-webkit-scrollbar-thumb{border-radius:10px}.container .sidebar-toggle{min-height:48px}.container .sidebar-toggle .sidebar-toggle-inner{padding:0}.container .sidebar-toggle .arrow{transform:rotate(180deg)}.container .sidebar-toggle.collapsed .arrow{transform:initial}.container .sidebar-toggle.collapsed .sidebar-toggle-inner{justify-content:space-around!important}\n"] }]
967
+ }], ctorParameters: function () { return [{ type: SidenavComponentService }]; }, propDecorators: { sidenavFooterDirective: [{
968
+ type: ContentChild,
969
+ args: [SidenavFooterDirective]
970
+ }], sidenavHeaderDirective: [{
971
+ type: ContentChild,
972
+ args: [SidenavHeaderDirective]
973
+ }] } });
1745
974
 
1746
- function VersionComponent_div_1_Template(rf, ctx) { if (rf & 1) {
1747
- i0.ɵɵelementStart(0, "div", 2)(1, "span", 3);
1748
- i0.ɵɵtext(2);
1749
- i0.ɵɵelementEnd();
1750
- i0.ɵɵelementStart(3, "span", 4);
1751
- i0.ɵɵtext(4);
1752
- i0.ɵɵelementEnd();
1753
- i0.ɵɵelementStart(5, "span", 5);
1754
- i0.ɵɵtext(6);
1755
- i0.ɵɵelementEnd()();
1756
- } if (rf & 2) {
1757
- const module_r1 = ctx.$implicit;
1758
- i0.ɵɵadvance(2);
1759
- i0.ɵɵtextInterpolate(module_r1.value.name);
1760
- i0.ɵɵadvance(2);
1761
- i0.ɵɵtextInterpolate(module_r1.value.semantic);
1762
- i0.ɵɵadvance(2);
1763
- i0.ɵɵtextInterpolate(module_r1.value.hash);
1764
- } }
1765
975
  class VersionComponent {
1766
976
  constructor(version) {
1767
977
  this.version = version;
@@ -1773,28 +983,84 @@ class VersionComponent {
1773
983
  ngOnDestroy() {
1774
984
  this.subscription?.unsubscribe();
1775
985
  }
1776
- static { this.ɵfac = function VersionComponent_Factory(t) { return new (t || VersionComponent)(i0.ɵɵdirectiveInject(VersionService)); }; }
1777
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VersionComponent, selectors: [["rxap-version"]], standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 3, vars: 3, consts: [["fxFlex", "nogrow", "fxLayout", "column", "fxLayoutAlign", "start start", "fxLayoutGap", "8px", 1, "version"], ["fxFlex", "nogrow", "fxLayout", "column", 4, "ngFor", "ngForOf"], ["fxFlex", "nogrow", "fxLayout", "column"], ["fxFlex", "nogrow", 1, "name"], ["fxFlex", "nogrow", 1, "semantic"], ["fxFlex", "nogrow", 1, "hash"]], template: function VersionComponent_Template(rf, ctx) { if (rf & 1) {
1778
- i0.ɵɵelementStart(0, "div", 0);
1779
- i0.ɵɵtemplate(1, VersionComponent_div_1_Template, 7, 3, "div", 1);
1780
- i0.ɵɵpipe(2, "keyvalue");
1781
- i0.ɵɵelementEnd();
1782
- } if (rf & 2) {
1783
- i0.ɵɵadvance(1);
1784
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, ctx.modules));
1785
- } }, dependencies: [FlexModule, i1$3.DefaultLayoutDirective, i1$3.DefaultLayoutGapDirective, i1$3.DefaultLayoutAlignDirective, i1$3.DefaultFlexDirective, NgFor, KeyValuePipe], styles: [".version[_ngcontent-%COMP%]{width:100%;font-size:9px;padding:8px}.version[_ngcontent-%COMP%] .name[_ngcontent-%COMP%]{padding-bottom:12px;font-size:10px}"], changeDetection: 0 }); }
986
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: VersionComponent, deps: [{ token: VersionService }], target: i0.ɵɵFactoryTarget.Component }); }
987
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: VersionComponent, isStandalone: true, selector: "rxap-version", ngImport: i0, template: "<div class=\"version\" fxFlex=\"nogrow\" fxLayout=\"column\" fxLayoutAlign=\"start start\" fxLayoutGap=\"8px\">\n <div *ngFor=\"let module of modules | keyvalue\" fxFlex=\"nogrow\" fxLayout=\"column\">\n <span class=\"name\" fxFlex=\"nogrow\">{{module.value.name}}</span>\n <span class=\"semantic\" fxFlex=\"nogrow\">{{module.value.semantic}}</span>\n <span class=\"hash\" fxFlex=\"nogrow\">{{module.value.hash}}</span>\n </div>\n</div>\n", styles: [".version{width:100%;font-size:9px;padding:8px}.version .name{padding-bottom:12px;font-size:10px}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i1$5.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i1$5.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i1$5.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i1$5.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1786
988
  }
1787
- __decorate([
1788
- Required,
1789
- __metadata("design:type", Object)
1790
- ], VersionComponent.prototype, "modules", void 0);
1791
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VersionComponent, [{
1792
- type: Component,
1793
- args: [{ selector: 'rxap-version', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FlexModule, NgFor, KeyValuePipe], template: "<div class=\"version\" fxFlex=\"nogrow\" fxLayout=\"column\" fxLayoutAlign=\"start start\" fxLayoutGap=\"8px\">\n <div *ngFor=\"let module of modules | keyvalue\" fxFlex=\"nogrow\" fxLayout=\"column\">\n <span class=\"name\" fxFlex=\"nogrow\">{{module.value.name}}</span>\n <span class=\"semantic\" fxFlex=\"nogrow\">{{module.value.semantic}}</span>\n <span class=\"hash\" fxFlex=\"nogrow\">{{module.value.hash}}</span>\n </div>\n</div>\n", styles: [".version{width:100%;font-size:9px;padding:8px}.version .name{padding-bottom:12px;font-size:10px}\n"] }]
1794
- }], function () { return [{ type: i1.VersionService, decorators: [{
1795
- type: Inject,
1796
- args: [VersionService]
1797
- }] }]; }, { modules: [] }); })();
989
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: VersionComponent, decorators: [{
990
+ type: Component,
991
+ args: [{ selector: 'rxap-version', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FlexModule, NgFor, KeyValuePipe], template: "<div class=\"version\" fxFlex=\"nogrow\" fxLayout=\"column\" fxLayoutAlign=\"start start\" fxLayoutGap=\"8px\">\n <div *ngFor=\"let module of modules | keyvalue\" fxFlex=\"nogrow\" fxLayout=\"column\">\n <span class=\"name\" fxFlex=\"nogrow\">{{module.value.name}}</span>\n <span class=\"semantic\" fxFlex=\"nogrow\">{{module.value.semantic}}</span>\n <span class=\"hash\" fxFlex=\"nogrow\">{{module.value.hash}}</span>\n </div>\n</div>\n", styles: [".version{width:100%;font-size:9px;padding:8px}.version .name{padding-bottom:12px;font-size:10px}\n"] }]
992
+ }], ctorParameters: function () { return [{ type: i1.VersionService, decorators: [{
993
+ type: Inject,
994
+ args: [VersionService]
995
+ }] }]; } });
996
+
997
+ class ToggleWindowSidenavButtonComponent {
998
+ constructor() {
999
+ this.openWindowSidenav = false;
1000
+ this.openWindowSidenavChange = new EventEmitter();
1001
+ }
1002
+ toggle() {
1003
+ this.openWindowSidenav = !this.openWindowSidenav;
1004
+ this.openWindowSidenavChange.emit(this.openWindowSidenav);
1005
+ }
1006
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ToggleWindowSidenavButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1007
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: ToggleWindowSidenavButtonComponent, isStandalone: true, selector: "rxap-toggle-window-sidenav-button", inputs: { openWindowSidenav: "openWindowSidenav" }, outputs: { openWindowSidenavChange: "openWindowSidenavChange" }, host: { classAttribute: "rxap-toggle-window-sidenav-button" }, ngImport: i0, template: "<div class=\"toggle-button\">\n <button (click)=\"toggle()\" mat-icon-button>\n <ng-template [ngIfElse]=\"hide\" [ngIf]=\"!openWindowSidenav\">\n <mat-icon svgIcon=\"arrow-left-bold\"></mat-icon>\n </ng-template>\n <ng-template #hide>\n <mat-icon svgIcon=\"arrow-right-bold\"></mat-icon>\n </ng-template>\n </button>\n</div>\n", styles: [".toggle-button{position:absolute;top:70px;right:0;z-index:10000;border-radius:15px 0 0 15px;border:1px solid black;background:black}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1008
+ }
1009
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: ToggleWindowSidenavButtonComponent, decorators: [{
1010
+ type: Component,
1011
+ args: [{ selector: 'rxap-toggle-window-sidenav-button', changeDetection: ChangeDetectionStrategy.OnPush, host: {
1012
+ class: 'rxap-toggle-window-sidenav-button',
1013
+ }, standalone: true, imports: [MatButtonModule, NgIf, MatIconModule], template: "<div class=\"toggle-button\">\n <button (click)=\"toggle()\" mat-icon-button>\n <ng-template [ngIfElse]=\"hide\" [ngIf]=\"!openWindowSidenav\">\n <mat-icon svgIcon=\"arrow-left-bold\"></mat-icon>\n </ng-template>\n <ng-template #hide>\n <mat-icon svgIcon=\"arrow-right-bold\"></mat-icon>\n </ng-template>\n </button>\n</div>\n", styles: [".toggle-button{position:absolute;top:70px;right:0;z-index:10000;border-radius:15px 0 0 15px;border:1px solid black;background:black}\n"] }]
1014
+ }], propDecorators: { openWindowSidenav: [{
1015
+ type: Input
1016
+ }], openWindowSidenavChange: [{
1017
+ type: Output
1018
+ }] } });
1019
+
1020
+ class WindowContainerSidenavComponent {
1021
+ constructor(service) {
1022
+ this.service = service;
1023
+ this.portals = new Map();
1024
+ this.subscription = new Subscription();
1025
+ }
1026
+ ngOnInit() {
1027
+ const components = this.service.getAll();
1028
+ for (const component of components) {
1029
+ this.add(component);
1030
+ }
1031
+ this.subscription.add(this.service.add$.pipe(tap(component => this.add(component))).subscribe());
1032
+ this.subscription.add(this.service.remove$.pipe(tap(component => this.remove(component))).subscribe());
1033
+ }
1034
+ ngOnDestroy() {
1035
+ this.subscription.unsubscribe();
1036
+ }
1037
+ trackBy(index, id) {
1038
+ return id;
1039
+ }
1040
+ add(component) {
1041
+ if (this.portals.has(component.id)) {
1042
+ throw new Error(`Component portal with id ${component.id} already exists`);
1043
+ }
1044
+ const portal = new ComponentPortal(component.component, component.viewContainerRef, component.injector, component.componentFactoryResolver);
1045
+ this.portals.set(component.id, portal);
1046
+ }
1047
+ remove(component) {
1048
+ if (this.portals.has(component.id)) {
1049
+ const portal = this.portals.get(component.id);
1050
+ this.portals.delete(component.id);
1051
+ portal.detach();
1052
+ }
1053
+ }
1054
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: WindowContainerSidenavComponent, deps: [{ token: WindowContainerSidenavService }], target: i0.ɵɵFactoryTarget.Component }); }
1055
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.4", type: WindowContainerSidenavComponent, isStandalone: true, selector: "rxap-window-container-sidenav", ngImport: i0, template: "<div class=\"container\" fxLayout=\"column\" fxLayoutGap=\"16px\">\n\n <div *ngFor=\"let portalId of portals.keys(); trackBy: trackBy\" fxFlex=\"nogrow\">\n <ng-template [cdkPortalOutlet]=\"portals.get(portalId)\"></ng-template>\n </div>\n\n</div>\n", styles: [".container{padding:8px}\n"], dependencies: [{ kind: "ngmodule", type: FlexModule }, { kind: "directive", type: i1$5.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i1$5.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i1$5.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1056
+ }
1057
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: WindowContainerSidenavComponent, decorators: [{
1058
+ type: Component,
1059
+ args: [{ selector: 'rxap-window-container-sidenav', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FlexModule, NgFor, PortalModule], template: "<div class=\"container\" fxLayout=\"column\" fxLayoutGap=\"16px\">\n\n <div *ngFor=\"let portalId of portals.keys(); trackBy: trackBy\" fxFlex=\"nogrow\">\n <ng-template [cdkPortalOutlet]=\"portals.get(portalId)\"></ng-template>\n </div>\n\n</div>\n", styles: [".container{padding:8px}\n"] }]
1060
+ }], ctorParameters: function () { return [{ type: i1.WindowContainerSidenavService, decorators: [{
1061
+ type: Inject,
1062
+ args: [WindowContainerSidenavService]
1063
+ }] }]; } });
1798
1064
 
1799
1065
  class FooterDirective {
1800
1066
  constructor(footerService, template, viewContainerRef) {
@@ -1811,29 +1077,53 @@ class FooterDirective {
1811
1077
  this.footerService.removePortal(this._portal);
1812
1078
  }
1813
1079
  }
1814
- static { this.ɵfac = function FooterDirective_Factory(t) { return new (t || FooterDirective)(i0.ɵɵdirectiveInject(FooterService), i0.ɵɵdirectiveInject(TemplateRef), i0.ɵɵdirectiveInject(ViewContainerRef)); }; }
1815
- static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: FooterDirective, selectors: [["", "rxapFooter", ""]], standalone: true }); }
1080
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: FooterDirective, deps: [{ token: FooterService }, { token: TemplateRef }, { token: ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }
1081
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.4", type: FooterDirective, isStandalone: true, selector: "[rxapFooter]", ngImport: i0 }); }
1082
+ }
1083
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: FooterDirective, decorators: [{
1084
+ type: Directive,
1085
+ args: [{
1086
+ selector: '[rxapFooter]',
1087
+ standalone: true,
1088
+ }]
1089
+ }], ctorParameters: function () { return [{ type: i1.FooterService, decorators: [{
1090
+ type: Inject,
1091
+ args: [FooterService]
1092
+ }] }, { type: i0.TemplateRef, decorators: [{
1093
+ type: Inject,
1094
+ args: [TemplateRef]
1095
+ }] }, { type: i0.ViewContainerRef, decorators: [{
1096
+ type: Inject,
1097
+ args: [ViewContainerRef]
1098
+ }] }]; } });
1099
+
1100
+ class I18nCheckGuard {
1101
+ constructor(i18nService, userProfileService) {
1102
+ this.i18nService = i18nService;
1103
+ this.userProfileService = userProfileService;
1104
+ }
1105
+ async canActivate() {
1106
+ if (isDevMode()) {
1107
+ return true;
1108
+ }
1109
+ const selectedLanguage = (await this.userProfileService.getLanguage()) ?? 'en';
1110
+ if (this.i18nService.currentLanguage !== selectedLanguage) {
1111
+ this.i18nService.redirect(selectedLanguage);
1112
+ return false;
1113
+ }
1114
+ return true;
1115
+ }
1116
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nCheckGuard, deps: [{ token: I18nService }, { token: i1$2.RxapUserProfileService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1117
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nCheckGuard, providedIn: 'root' }); }
1816
1118
  }
1817
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FooterDirective, [{
1818
- type: Directive,
1819
- args: [{
1820
- selector: '[rxapFooter]',
1821
- standalone: true
1822
- }]
1823
- }], function () { return [{ type: i1.FooterService, decorators: [{
1824
- type: Inject,
1825
- args: [FooterService]
1826
- }] }, { type: i0.TemplateRef, decorators: [{
1827
- type: Inject,
1828
- args: [TemplateRef]
1829
- }] }, { type: i0.ViewContainerRef, decorators: [{
1830
- type: Inject,
1831
- args: [ViewContainerRef]
1832
- }] }]; }, null); })();
1119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.4", ngImport: i0, type: I18nCheckGuard, decorators: [{
1120
+ type: Injectable,
1121
+ args: [{ providedIn: 'root' }]
1122
+ }], ctorParameters: function () { return [{ type: I18nService }, { type: i1$2.RxapUserProfileService }]; } });
1833
1123
 
1834
1124
  /**
1835
1125
  * Generated bundle index. Do not edit.
1836
1126
  */
1837
1127
 
1838
- export { AppsButtonComponent, FooterComponent, FooterDirective, HeaderComponent, IsNavigationDividerItem, IsNavigationInsertItem, IsNavigationItem, LayoutComponent, LayoutComponentService, LayoutModule, NavigationComponent, NavigationItemComponent, NavigationProgressBarComponent, NavigationService, RXAP_FOOTER_COMPONENT, RXAP_HEADER_COMPONENT, RXAP_LAYOUT_APPS_GRID, RXAP_LOGO_CONFIG, RXAP_NAVIGATION_CONFIG, RXAP_NAVIGATION_CONFIG_INSERTS, ReplaceRouterPathsService, ResetButtonComponent, SidenavComponent, SidenavComponentService, SidenavContentComponent, SidenavContentComponentService, SidenavFooterDirective, SidenavHeaderDirective, SidenavToggleButtonComponent, SignOutComponent, ToggleWindowSidenavButtonComponent, UserProfileIconComponent, VersionComponent, WindowContainerSidenavComponent };
1128
+ export { AppUrlService, AppsButtonComponent, FooterComponent, FooterDirective, HeaderComponent, I18nCheckGuard, I18nService, IsNavigationDividerItem, IsNavigationInsertItem, IsNavigationItem, LanguageSelectorService, LayoutComponent, LayoutComponentService, NavigationComponent, NavigationItemComponent, NavigationProgressBarComponent, NavigationService, RXAP_FOOTER_COMPONENT, RXAP_HEADER_COMPONENT, RXAP_LAYOUT_APPS_GRID, RXAP_LOGO_CONFIG, RXAP_NAVIGATION_CONFIG, RXAP_NAVIGATION_CONFIG_INSERTS, ReplaceRouterPathsService, ResetButtonComponent, SidenavComponent, SidenavComponentService, SidenavFooterDirective, SidenavHeaderDirective, SidenavToggleButtonComponent, SignOutComponent, ToggleWindowSidenavButtonComponent, UserProfileIconComponent, VersionComponent, WindowContainerSidenavComponent };
1839
1129
  //# sourceMappingURL=rxap-layout.mjs.map