@mediusinc/mng-commons-layout 6.0.0-rc.2 → 6.0.0-rc.4

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 (84) hide show
  1. package/components/README.md +3 -0
  2. package/components/index.d.ts +10 -0
  3. package/{lib → components/lib}/components/footer.component.d.ts +1 -1
  4. package/{lib → components/lib}/components/main-layout.component.d.ts +1 -1
  5. package/{lib → components/lib}/components/menu-item.component.d.ts +2 -2
  6. package/{lib → components/lib}/components/menu.component.d.ts +1 -1
  7. package/{lib → components/lib}/components/settings.component.d.ts +1 -2
  8. package/{lib → components/lib}/components/sidebar.component.d.ts +1 -1
  9. package/{lib → components/lib}/components/topbar.component.d.ts +2 -2
  10. package/components/pages/error/README.md +3 -0
  11. package/components/pages/error/index.d.ts +3 -0
  12. package/{lib/components/pages/error → components/pages/error/lib}/error.page.component.d.ts +1 -1
  13. package/components/pages/main/README.md +3 -0
  14. package/components/pages/main/index.d.ts +2 -0
  15. package/components/pages/main/lazy/README.md +3 -0
  16. package/components/pages/main/lazy/index.d.ts +1 -0
  17. package/components/pages/main/lazy/lib/route-builder.d.ts +8 -0
  18. package/components/pages/main/lib/main-layout.component.d.ts +23 -0
  19. package/components/pages/not-found/README.md +3 -0
  20. package/components/pages/not-found/index.d.ts +3 -0
  21. package/{lib/components/pages/not-found → components/pages/not-found/lib}/not-found.page.component.d.ts +1 -1
  22. package/esm2022/components/index.mjs +12 -0
  23. package/esm2022/components/lib/components/breadcrumb.component.mjs +29 -0
  24. package/esm2022/components/lib/components/footer.component.mjs +23 -0
  25. package/esm2022/components/lib/components/main-layout.component.mjs +86 -0
  26. package/esm2022/components/lib/components/menu-item.component.mjs +169 -0
  27. package/esm2022/components/lib/components/menu.component.mjs +36 -0
  28. package/esm2022/components/lib/components/settings.component.mjs +87 -0
  29. package/esm2022/components/lib/components/sidebar.component.mjs +51 -0
  30. package/esm2022/components/lib/components/topbar-user.component.mjs +51 -0
  31. package/esm2022/components/lib/components/topbar.component.mjs +37 -0
  32. package/esm2022/components/lib/components/version.component.mjs +95 -0
  33. package/esm2022/components/mediusinc-mng-commons-layout-components.mjs +5 -0
  34. package/esm2022/components/pages/error/index.mjs +4 -0
  35. package/esm2022/components/pages/error/lib/error.page.component.mjs +20 -0
  36. package/esm2022/components/pages/error/mediusinc-mng-commons-layout-components-pages-error.mjs +5 -0
  37. package/esm2022/components/pages/main/index.mjs +3 -0
  38. package/esm2022/components/pages/main/lazy/index.mjs +2 -0
  39. package/esm2022/components/pages/main/lazy/lib/route-builder.mjs +11 -0
  40. package/esm2022/components/pages/main/lazy/mediusinc-mng-commons-layout-components-pages-main-lazy.mjs +5 -0
  41. package/esm2022/components/pages/main/lib/main-layout.component.mjs +84 -0
  42. package/esm2022/components/pages/main/lib/route-builder.mjs +12 -0
  43. package/esm2022/components/pages/main/mediusinc-mng-commons-layout-components-pages-main.mjs +5 -0
  44. package/esm2022/components/pages/not-found/index.mjs +4 -0
  45. package/esm2022/components/pages/not-found/lib/not-found.page.component.mjs +20 -0
  46. package/esm2022/components/pages/not-found/mediusinc-mng-commons-layout-components-pages-not-found.mjs +5 -0
  47. package/esm2022/index.mjs +2 -15
  48. package/esm2022/lib/helpers/menu-items.mjs +4 -1
  49. package/esm2022/lib/services/layout-feature-config.token.mjs +1 -1
  50. package/fesm2022/mediusinc-mng-commons-layout-components-pages-error.mjs +27 -0
  51. package/fesm2022/mediusinc-mng-commons-layout-components-pages-error.mjs.map +1 -0
  52. package/fesm2022/mediusinc-mng-commons-layout-components-pages-main-lazy.mjs +18 -0
  53. package/fesm2022/mediusinc-mng-commons-layout-components-pages-main-lazy.mjs.map +1 -0
  54. package/fesm2022/mediusinc-mng-commons-layout-components-pages-main.mjs +101 -0
  55. package/fesm2022/mediusinc-mng-commons-layout-components-pages-main.mjs.map +1 -0
  56. package/fesm2022/mediusinc-mng-commons-layout-components-pages-not-found.mjs +27 -0
  57. package/fesm2022/mediusinc-mng-commons-layout-components-pages-not-found.mjs.map +1 -0
  58. package/fesm2022/mediusinc-mng-commons-layout-components.mjs +600 -0
  59. package/fesm2022/mediusinc-mng-commons-layout-components.mjs.map +1 -0
  60. package/fesm2022/mediusinc-mng-commons-layout.mjs +69 -683
  61. package/fesm2022/mediusinc-mng-commons-layout.mjs.map +1 -1
  62. package/index.d.ts +1 -13
  63. package/lib/helpers/menu-items.d.ts +3 -0
  64. package/lib/services/layout-feature-config.token.d.ts +2 -2
  65. package/lib/services/layout.service.d.ts +2 -2
  66. package/package.json +32 -2
  67. package/version-info.json +6 -6
  68. package/esm2022/lib/components/breadcrumb.component.mjs +0 -29
  69. package/esm2022/lib/components/footer.component.mjs +0 -25
  70. package/esm2022/lib/components/main-layout.component.mjs +0 -88
  71. package/esm2022/lib/components/menu-item.component.mjs +0 -170
  72. package/esm2022/lib/components/menu.component.mjs +0 -38
  73. package/esm2022/lib/components/pages/error/error.page.component.mjs +0 -20
  74. package/esm2022/lib/components/pages/not-found/not-found.page.component.mjs +0 -20
  75. package/esm2022/lib/components/settings.component.mjs +0 -87
  76. package/esm2022/lib/components/sidebar.component.mjs +0 -52
  77. package/esm2022/lib/components/topbar-user.component.mjs +0 -52
  78. package/esm2022/lib/components/topbar.component.mjs +0 -39
  79. package/esm2022/lib/components/version.component.mjs +0 -96
  80. package/esm2022/lib/helpers/route-builder.mjs +0 -12
  81. /package/{lib → components/lib}/components/breadcrumb.component.d.ts +0 -0
  82. /package/{lib → components/lib}/components/topbar-user.component.d.ts +0 -0
  83. /package/{lib → components/lib}/components/version.component.d.ts +0 -0
  84. /package/{lib/helpers → components/pages/main/lib}/route-builder.d.ts +0 -0
@@ -0,0 +1,600 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, DestroyRef, input, signal, computed, Component, ChangeDetectionStrategy, output, viewChild, effect, untracked, ElementRef, Injector, Renderer2 } from '@angular/core';
3
+ import * as i1 from '@ngx-translate/core';
4
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
5
+ import { VersionService, COMMONS_LAYOUT_FEATURE_CONFIG_IT, LayoutService, MenuService } from '@mediusinc/mng-commons-layout';
6
+ import { CommonsConfigurationService, JsonPathPipe, CommonsService, ComponentDirective, PermissionService, toObservable as toObservable$1, NotificationWrapperComponent } from '@mediusinc/mng-commons/core';
7
+ import { toObservable, takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
8
+ import { catchError, of, switchMap, take, distinctUntilChanged } from 'rxjs';
9
+ import { map } from 'rxjs/operators';
10
+ import { NgClass, NgTemplateOutlet } from '@angular/common';
11
+ import * as i1$2 from '@angular/router';
12
+ import { RouterModule, ActivatedRoute } from '@angular/router';
13
+ import * as i3 from '@angular/forms';
14
+ import { FormsModule } from '@angular/forms';
15
+ import { Button, ButtonModule } from 'primeng/button';
16
+ import * as i4 from 'primeng/dropdown';
17
+ import { DropdownModule } from 'primeng/dropdown';
18
+ import * as i1$1 from 'primeng/ripple';
19
+ import { RippleModule } from 'primeng/ripple';
20
+ import * as i3$1 from 'primeng/styleclass';
21
+ import { StyleClassModule } from 'primeng/styleclass';
22
+ import { trigger, state, style, transition, animate } from '@angular/animations';
23
+ import { TooltipModule } from 'primeng/tooltip';
24
+ import { DomSanitizer } from '@angular/platform-browser';
25
+ import { DynamicDialogConfig, DynamicDialogRef, DialogService } from 'primeng/dynamicdialog';
26
+ import { InputSwitchModule } from 'primeng/inputswitch';
27
+ import * as i2 from 'primeng/radiobutton';
28
+ import { RadioButtonModule } from 'primeng/radiobutton';
29
+ import * as i5 from 'primeng/selectbutton';
30
+ import { SelectButtonModule } from 'primeng/selectbutton';
31
+
32
+ class VersionComponent {
33
+ constructor() {
34
+ this.versionService = inject(VersionService);
35
+ this.configService = inject(CommonsConfigurationService);
36
+ this.destroyRef = inject(DestroyRef);
37
+ this.jsonPathPipe = new JsonPathPipe();
38
+ this.versionInput = input(undefined, { alias: 'version' });
39
+ this.isLoading = signal(false);
40
+ this.loadedVersion = signal(undefined);
41
+ this.versionAsArray = computed(() => {
42
+ if (Array.isArray(this.versionInput())) {
43
+ return this.versionInput();
44
+ }
45
+ return undefined;
46
+ });
47
+ this.versionInfo = computed(() => {
48
+ if (this.versionAsArray() !== undefined) {
49
+ return undefined; // Each version will be processed separately in child component
50
+ }
51
+ const initVersion = this.versionInput();
52
+ if (typeof initVersion === 'string') {
53
+ return initVersion;
54
+ }
55
+ else if (typeof initVersion !== 'undefined' && !Array.isArray(initVersion)) {
56
+ const source = initVersion.source;
57
+ switch (source) {
58
+ case 'config':
59
+ return this.configService.getConfigValue(initVersion.configKey);
60
+ case 'httpResource':
61
+ return this.loadedVersion();
62
+ case 'info':
63
+ return initVersion.info;
64
+ default:
65
+ return initVersion;
66
+ }
67
+ }
68
+ return undefined;
69
+ });
70
+ this.versionAsString = computed(() => {
71
+ const versionInfo = this.versionInfo();
72
+ if (versionInfo == null) {
73
+ return undefined;
74
+ }
75
+ else if (typeof versionInfo === 'string') {
76
+ return versionInfo;
77
+ }
78
+ else {
79
+ return versionInfo.raw;
80
+ }
81
+ });
82
+ this.displayName = computed(() => this.versionInput()?.displayName);
83
+ this.displayText = computed(() => `${this.displayName() ?? ''}${this.displayName() && this.versionAsString() ? ': ' : ''}${!this.isLoading() ? (this.versionAsString() ?? '') : ''}`);
84
+ toObservable(this.versionInput)
85
+ .pipe(catchError(() => of(undefined)), switchMap(version => {
86
+ if (typeof version !== 'undefined' && !Array.isArray(version)) {
87
+ const config = version;
88
+ if (config.source === 'httpResource') {
89
+ this.isLoading.set(true);
90
+ const infoJsonPath = config.infoJsonPath;
91
+ return this.versionService.loadVersion(config.urlPath, config.urlBaseConfigKey).pipe(take(1), map(res => ({ res, infoJsonPath })));
92
+ }
93
+ }
94
+ return of({ res: undefined, infoJsonPath: undefined });
95
+ }), takeUntilDestroyed(this.destroyRef))
96
+ .subscribe({
97
+ next: ({ res, infoJsonPath }) => {
98
+ if (typeof res !== 'undefined') {
99
+ this.loadedVersion.set(this.jsonPathPipe.transform(res, infoJsonPath ?? '$'));
100
+ }
101
+ else {
102
+ this.loadedVersion.set(undefined);
103
+ }
104
+ this.isLoading.set(false);
105
+ },
106
+ error: () => {
107
+ this.loadedVersion.set('');
108
+ this.isLoading.set(false);
109
+ }
110
+ });
111
+ }
112
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: VersionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
113
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: VersionComponent, isStandalone: true, selector: "mng-version", inputs: { versionInput: { classPropertyName: "versionInput", publicName: "version", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (versionAsArray()) {\n @for (v of versionAsArray(); track v; let last = $last) {\n <mng-version [version]=\"v\"></mng-version>\n @if (!last) {\n <br />\n }\n }\n} @else if (displayText()) {\n {{ displayText() }}\n}\n", dependencies: [{ kind: "component", type: VersionComponent, selector: "mng-version", inputs: ["version"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
114
+ }
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: VersionComponent, decorators: [{
116
+ type: Component,
117
+ args: [{ standalone: true, selector: 'mng-version', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (versionAsArray()) {\n @for (v of versionAsArray(); track v; let last = $last) {\n <mng-version [version]=\"v\"></mng-version>\n @if (!last) {\n <br />\n }\n }\n} @else if (displayText()) {\n {{ displayText() }}\n}\n" }]
118
+ }], ctorParameters: () => [] });
119
+
120
+ class FooterComponent {
121
+ constructor() {
122
+ this.config = inject(COMMONS_LAYOUT_FEATURE_CONFIG_IT, { optional: true });
123
+ this.layout = inject(LayoutService);
124
+ this.commons = inject(CommonsService);
125
+ this.currentYear = signal(new Date().getFullYear());
126
+ this.versionComponent = signal(this.config?.components?.version === false ? undefined : (this.config?.components?.version ?? VersionComponent));
127
+ }
128
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
129
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: FooterComponent, isStandalone: true, selector: "mng-footer", ngImport: i0, template: "<div class=\"layout-footer\">\n <div class=\"footer-logo-container\">\n @if (layout.appLogo()) {\n <img id=\"footer-logo\" [src]=\"layout.appLogo()\" alt=\"atlantis-layout\" />\n }\n <span class=\"app-name\">{{ commons.appName() | translate }}</span>\n </div>\n <div class=\"flex flex-column\">\n <div>\n <span class=\"copyright\">&#169; {{ commons.appOwner() | translate }} - {{ currentYear() }}</span>\n </div>\n @if (versionComponent()) {\n <div class=\"version\" [mngComponent]=\"versionComponent()\" [inputs]=\"{version: commons.appVersion()}\" [attachToHost]=\"true\"></div>\n }\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: ComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "injectionToken", "inputs", "attachToHost", "parentInjector"], outputs: ["instanceCreated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
130
+ }
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FooterComponent, decorators: [{
132
+ type: Component,
133
+ args: [{ standalone: true, selector: 'mng-footer', imports: [TranslateModule, ComponentDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"layout-footer\">\n <div class=\"footer-logo-container\">\n @if (layout.appLogo()) {\n <img id=\"footer-logo\" [src]=\"layout.appLogo()\" alt=\"atlantis-layout\" />\n }\n <span class=\"app-name\">{{ commons.appName() | translate }}</span>\n </div>\n <div class=\"flex flex-column\">\n <div>\n <span class=\"copyright\">&#169; {{ commons.appOwner() | translate }} - {{ currentYear() }}</span>\n </div>\n @if (versionComponent()) {\n <div class=\"version\" [mngComponent]=\"versionComponent()\" [inputs]=\"{version: commons.appVersion()}\" [attachToHost]=\"true\"></div>\n }\n </div>\n</div>\n" }]
134
+ }] });
135
+
136
+ class BreadcrumbComponent {
137
+ constructor() {
138
+ this.commons = inject(CommonsService);
139
+ this.mappedBreadcrumbs = computed(() => {
140
+ const items = this.commons.breadcrumbs();
141
+ return items.map(el => this.mapMenuItem(el));
142
+ });
143
+ }
144
+ mapMenuItem(item) {
145
+ return {
146
+ ...item,
147
+ url: item.href,
148
+ badgeStyleClass: item.badgeClassName,
149
+ styleClass: item.className
150
+ };
151
+ }
152
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: BreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
153
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: BreadcrumbComponent, isStandalone: true, selector: "mng-breadcrumb", ngImport: i0, template: "<div class=\"layout-breadcrumb flex align-items-center relative h-3rem\">\n <nav>\n <ol class=\"relative z-2\">\n @for (item of mappedBreadcrumbs(); track item.id; let last = $last) {\n <li>{{ item.label! | translate }}</li>\n @if (!last) {\n <li class=\"layout-breadcrumb-chevron\">/</li>\n }\n }\n </ol>\n </nav>\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
154
+ }
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: BreadcrumbComponent, decorators: [{
156
+ type: Component,
157
+ args: [{ standalone: true, selector: 'mng-breadcrumb', imports: [TranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"layout-breadcrumb flex align-items-center relative h-3rem\">\n <nav>\n <ol class=\"relative z-2\">\n @for (item of mappedBreadcrumbs(); track item.id; let last = $last) {\n <li>{{ item.label! | translate }}</li>\n @if (!last) {\n <li class=\"layout-breadcrumb-chevron\">/</li>\n }\n }\n </ol>\n </nav>\n</div>\n" }]
158
+ }] });
159
+
160
+ class MenuItemComponent {
161
+ constructor() {
162
+ this.menuService = inject(MenuService);
163
+ this.permissionService = inject(PermissionService);
164
+ this.layout = inject(LayoutService);
165
+ this.item = input.required();
166
+ this.root = input(false);
167
+ this.visibleChange = output();
168
+ this.submenuElRef = viewChild('submenu');
169
+ this.isPermitted = toSignal(toObservable(this.item).pipe(switchMap(i => (i.permissions ? this.permissionService.isMenuItemVisible(i.permissions, i.config) : of(true)))));
170
+ this.isVisibleFromItemSettings = toSignal(toObservable(this.item).pipe(switchMap(i => (typeof i.isVisible === 'function' ? toObservable$1(i.isVisible(i.config)) : of(i.isVisible ?? true)))));
171
+ this.menuChangeEvents = toSignal(this.menuService.menuChange$.pipe(distinctUntilChanged((v1, v2) => v1.key === v2.key)));
172
+ this.active = computed(() => {
173
+ if (!this.isPermitted()) {
174
+ return false;
175
+ }
176
+ const menuChangeEvent = this.menuChangeEvents();
177
+ if (menuChangeEvent) {
178
+ return menuChangeEvent.eventType === 'reset' || !menuChangeEvent.key
179
+ ? false
180
+ : this.item().key === menuChangeEvent.key || menuChangeEvent.key.startsWith((this.item().key ?? '') + '-');
181
+ }
182
+ return false;
183
+ });
184
+ this.visible = computed(() => {
185
+ const isPermitted = this.isPermitted();
186
+ if (!isPermitted) {
187
+ return false;
188
+ }
189
+ if (!this.isVisibleFromItemSettings()) {
190
+ return false;
191
+ }
192
+ const items = this.item().items();
193
+ if (Array.isArray(items) &&
194
+ items.length > 0 &&
195
+ this.item()
196
+ .itemsVisibility()
197
+ .every(v => !v())) {
198
+ return false;
199
+ }
200
+ return true;
201
+ });
202
+ this.submenuAnimation = computed(() => {
203
+ if (this.layout.isDesktop() && (this.layout.isSlim() || this.layout.isSlimPlus())) {
204
+ return this.layout.submenuOverlayKey() === this.item().key ? 'visible' : 'hidden';
205
+ }
206
+ else {
207
+ return this.root() ? 'expanded' : this.active() ? 'expanded' : 'collapsed';
208
+ }
209
+ });
210
+ effect(() => {
211
+ if (this.root() && this.active() && this.layout.isDesktop() && (this.layout.isSlim() || this.layout.isSlimPlus())) {
212
+ this.calculatePosition(this.submenuElRef()?.nativeElement, this.submenuElRef()?.nativeElement.parentElement);
213
+ }
214
+ });
215
+ }
216
+ itemClick(event) {
217
+ const item = this.item();
218
+ // avoid processing disabled items
219
+ if (item.disabled) {
220
+ event.preventDefault();
221
+ return;
222
+ }
223
+ if (item.hasItemsOrLazyChildren()) {
224
+ // open submenu in slim/slim+ mode
225
+ if (this.root() && (this.layout.isSlim() || this.layout.isSlimPlus())) {
226
+ this.layout.onOverlaySubmenuOpen(item.key);
227
+ }
228
+ }
229
+ else {
230
+ if (this.layout.isMobile()) {
231
+ this.layout.state.update(state => ({
232
+ ...state,
233
+ staticMenuMobileActive: false
234
+ }));
235
+ }
236
+ if (this.layout.isSlim() || this.layout.isSlimPlus()) {
237
+ this.layout.state.update(state => ({
238
+ ...state,
239
+ menuHoverActive: false
240
+ }));
241
+ }
242
+ if (this.layout.submenuOverlayKey() !== undefined) {
243
+ this.layout.onOverlaySubmenuClose();
244
+ }
245
+ }
246
+ }
247
+ onSubmenuAnimated(event) {
248
+ if (event.toState === 'visible' && this.layout.isDesktop() && (this.layout.isSlim() || this.layout.isSlimPlus())) {
249
+ const el = event.element;
250
+ const elParent = el.parentElement;
251
+ this.calculatePosition(el, elParent);
252
+ }
253
+ }
254
+ onChildVisibleChange(visible, item, idx) {
255
+ this.item().itemsVisibility()[idx]?.set(visible);
256
+ }
257
+ calculatePosition(overlay, target) {
258
+ if (overlay) {
259
+ const top = target.getBoundingClientRect().top;
260
+ const vHeight = window.innerHeight;
261
+ const oHeight = overlay.offsetHeight;
262
+ // reset
263
+ overlay.style.top = '';
264
+ overlay.style.left = '';
265
+ if (this.layout.isSlim() || this.layout.isSlimPlus()) {
266
+ const height = top + oHeight;
267
+ overlay.style.top = vHeight < height ? `${top - (height - vHeight)}px` : `${top}px`;
268
+ }
269
+ }
270
+ }
271
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
272
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: MenuItemComponent, isStandalone: true, selector: "[mng-menuitem]", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, root: { classPropertyName: "root", publicName: "root", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, host: { properties: { "class.active-menuitem": "!root() && active()", "class.layout-root-menuitem": "root()" } }, providers: [PermissionService], viewQueries: [{ propertyName: "submenuElRef", first: true, predicate: ["submenu"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (visible()) {\n @if (root()) {\n <div class=\"layout-menuitem-root-text\">\n {{ item().label! | translate }}\n </div>\n }\n @if (!item().href) {\n @if (!item().routerLink || item().hasItems()) {\n <a\n [attr.href]=\"item().href\"\n [routerLink]=\"layout.isSlim() || layout.isSlimPlus() ? null : item().routerLink\"\n (click)=\"itemClick($event)\"\n (keydown.enter)=\"itemClick($event)\"\n [attr.target]=\"item().target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item().className ?? '' + (this.active() ? ' active-route' : '')\"\n pRipple>\n <i [ngClass]=\"item().icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item().label! | translate }}</span>\n @if (item().hasItemsOrLazyChildren()) {\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"></i>\n }\n @if (item().badge) {\n <span class=\"menuitem-badge\">{{ item().badge }}</span>\n }\n </a>\n } @else if (item().routerLink && !item().hasItems()) {\n <a\n (click)=\"itemClick($event)\"\n [routerLink]=\"item().routerLink\"\n [attr.target]=\"item().target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item().className ?? '' + (this.active() ? ' active-route' : '')\"\n [preserveFragment]=\"item().preserveFragment\"\n [skipLocationChange]=\"item().skipLocationChange\"\n [replaceUrl]=\"item().replaceUrl\"\n [queryParams]=\"item().queryParams\"\n pRipple>\n <i [ngClass]=\"item().icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item().label! | translate }}</span>\n @if (item().hasItemsOrLazyChildren()) {\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"></i>\n }\n @if (item().badge) {\n <span class=\"menuitem-badge\">{{ item().badge }}</span>\n }\n </a>\n }\n } @else {\n @if (!item().hasItems()) {\n <a (click)=\"itemClick($event)\" [attr.href]=\"item().href\" [attr.target]=\"item().target\" [attr.tabindex]=\"0\" [ngClass]=\"item().className ?? ''\" pRipple>\n <i [ngClass]=\"item().icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item().label! | translate }}</span>\n @if (item().hasItemsOrLazyChildren()) {\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"></i>\n }\n @if (item().badge) {\n <span class=\"menuitem-badge\">{{ item().badge }}</span>\n }\n </a>\n }\n }\n @if (item().hasItems()) {\n <ul #submenu [@children]=\"submenuAnimation()\" (@children.done)=\"onSubmenuAnimated($event)\">\n @for (child of item().items(); track child; let i = $index) {\n <li mng-menuitem [item]=\"child\" [class]=\"child.badgeClassName\" (visibleChange)=\"onChildVisibleChange($event, child, i)\"></li>\n }\n </ul>\n }\n}\n", dependencies: [{ kind: "component", type: MenuItemComponent, selector: "[mng-menuitem]", inputs: ["item", "root"], outputs: ["visibleChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i1$1.Ripple, selector: "[pRipple]" }, { kind: "ngmodule", type: TooltipModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], animations: [
273
+ trigger('children', [
274
+ state('collapsed', style({
275
+ height: '0'
276
+ })),
277
+ state('expanded', style({
278
+ height: '*'
279
+ })),
280
+ state('hidden', style({
281
+ display: 'none'
282
+ })),
283
+ state('visible', style({
284
+ display: 'block'
285
+ })),
286
+ transition('collapsed <=> expanded', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
287
+ ])
288
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
289
+ }
290
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MenuItemComponent, decorators: [{
291
+ type: Component,
292
+ args: [{ standalone: true, selector: '[mng-menuitem]', imports: [NgClass, RippleModule, TooltipModule, RouterModule, TranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, animations: [
293
+ trigger('children', [
294
+ state('collapsed', style({
295
+ height: '0'
296
+ })),
297
+ state('expanded', style({
298
+ height: '*'
299
+ })),
300
+ state('hidden', style({
301
+ display: 'none'
302
+ })),
303
+ state('visible', style({
304
+ display: 'block'
305
+ })),
306
+ transition('collapsed <=> expanded', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
307
+ ])
308
+ ], host: {
309
+ '[class.active-menuitem]': '!root() && active()',
310
+ '[class.layout-root-menuitem]': 'root()'
311
+ }, providers: [PermissionService], template: "@if (visible()) {\n @if (root()) {\n <div class=\"layout-menuitem-root-text\">\n {{ item().label! | translate }}\n </div>\n }\n @if (!item().href) {\n @if (!item().routerLink || item().hasItems()) {\n <a\n [attr.href]=\"item().href\"\n [routerLink]=\"layout.isSlim() || layout.isSlimPlus() ? null : item().routerLink\"\n (click)=\"itemClick($event)\"\n (keydown.enter)=\"itemClick($event)\"\n [attr.target]=\"item().target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item().className ?? '' + (this.active() ? ' active-route' : '')\"\n pRipple>\n <i [ngClass]=\"item().icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item().label! | translate }}</span>\n @if (item().hasItemsOrLazyChildren()) {\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"></i>\n }\n @if (item().badge) {\n <span class=\"menuitem-badge\">{{ item().badge }}</span>\n }\n </a>\n } @else if (item().routerLink && !item().hasItems()) {\n <a\n (click)=\"itemClick($event)\"\n [routerLink]=\"item().routerLink\"\n [attr.target]=\"item().target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item().className ?? '' + (this.active() ? ' active-route' : '')\"\n [preserveFragment]=\"item().preserveFragment\"\n [skipLocationChange]=\"item().skipLocationChange\"\n [replaceUrl]=\"item().replaceUrl\"\n [queryParams]=\"item().queryParams\"\n pRipple>\n <i [ngClass]=\"item().icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item().label! | translate }}</span>\n @if (item().hasItemsOrLazyChildren()) {\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"></i>\n }\n @if (item().badge) {\n <span class=\"menuitem-badge\">{{ item().badge }}</span>\n }\n </a>\n }\n } @else {\n @if (!item().hasItems()) {\n <a (click)=\"itemClick($event)\" [attr.href]=\"item().href\" [attr.target]=\"item().target\" [attr.tabindex]=\"0\" [ngClass]=\"item().className ?? ''\" pRipple>\n <i [ngClass]=\"item().icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item().label! | translate }}</span>\n @if (item().hasItemsOrLazyChildren()) {\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"></i>\n }\n @if (item().badge) {\n <span class=\"menuitem-badge\">{{ item().badge }}</span>\n }\n </a>\n }\n }\n @if (item().hasItems()) {\n <ul #submenu [@children]=\"submenuAnimation()\" (@children.done)=\"onSubmenuAnimated($event)\">\n @for (child of item().items(); track child; let i = $index) {\n <li mng-menuitem [item]=\"child\" [class]=\"child.badgeClassName\" (visibleChange)=\"onChildVisibleChange($event, child, i)\"></li>\n }\n </ul>\n }\n}\n" }]
312
+ }], ctorParameters: () => [] });
313
+
314
+ class MenuComponent {
315
+ constructor() {
316
+ this.route = inject(ActivatedRoute);
317
+ this.config = inject(COMMONS_LAYOUT_FEATURE_CONFIG_IT, { optional: true });
318
+ this.layout = inject(LayoutService);
319
+ this.menuService = inject(MenuService);
320
+ this.routeData = toSignal(this.route.data);
321
+ effect(() => {
322
+ let items = [];
323
+ if (this.config?.menuItems && Array.isArray(this.config.menuItems)) {
324
+ items = this.config.menuItems;
325
+ }
326
+ else if (Array.isArray(this.routeData()?.menuItems)) {
327
+ items = this.routeData().menuItems;
328
+ }
329
+ // Wraps menu items
330
+ if (!(this.layout.isSlim() || this.layout.isSlimPlus())) {
331
+ items = [{ items }];
332
+ }
333
+ untracked(() => this.menuService.setItems(items));
334
+ });
335
+ }
336
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
337
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: MenuComponent, isStandalone: true, selector: "mng-menu", ngImport: i0, template: "<ul class=\"layout-menu\">\n @for (item of menuService.menuItems(); track item) {\n @if (!item.separator) {\n <li mng-menuitem [item]=\"item\" [root]=\"true\"></li>\n }\n @if (item.separator) {\n <li class=\"menu-separator\"></li>\n }\n }\n</ul>\n", dependencies: [{ kind: "component", type: MenuItemComponent, selector: "[mng-menuitem]", inputs: ["item", "root"], outputs: ["visibleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
338
+ }
339
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MenuComponent, decorators: [{
340
+ type: Component,
341
+ args: [{ standalone: true, selector: 'mng-menu', imports: [MenuItemComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ul class=\"layout-menu\">\n @for (item of menuService.menuItems(); track item) {\n @if (!item.separator) {\n <li mng-menuitem [item]=\"item\" [root]=\"true\"></li>\n }\n @if (item.separator) {\n <li class=\"menu-separator\"></li>\n }\n }\n</ul>\n" }]
342
+ }], ctorParameters: () => [] });
343
+
344
+ class SidebarComponent {
345
+ constructor() {
346
+ this.config = inject(COMMONS_LAYOUT_FEATURE_CONFIG_IT, { optional: true });
347
+ this.layout = inject(LayoutService);
348
+ this.el = inject(ElementRef);
349
+ this.menuComponent = signal(this.config?.components?.menu === false ? undefined : (this.config?.components?.menu ?? MenuComponent));
350
+ this.timeout = null;
351
+ }
352
+ onMouseEnter() {
353
+ if (!this.layout.state().anchored) {
354
+ if (this.timeout) {
355
+ clearTimeout(this.timeout);
356
+ this.timeout = null;
357
+ }
358
+ this.layout.state.update(state => ({
359
+ ...state,
360
+ sidebarActive: true
361
+ }));
362
+ }
363
+ }
364
+ onMouseLeave() {
365
+ if (!this.layout.state().anchored) {
366
+ if (!this.timeout) {
367
+ this.timeout = setTimeout(() => this.layout.state.update(state => ({
368
+ ...state,
369
+ sidebarActive: false
370
+ })), 300);
371
+ }
372
+ }
373
+ }
374
+ anchor() {
375
+ this.layout.state.update(state => ({
376
+ ...state,
377
+ anchored: !state.anchored
378
+ }));
379
+ }
380
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
381
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: SidebarComponent, isStandalone: true, selector: "mng-sidebar", ngImport: i0, template: "<div class=\"layout-sidebar\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\n <div class=\"sidebar-header\">\n <a [routerLink]=\"['/']\" class=\"app-logo\">\n <div class=\"app-logo-small h-2rem\">\n @if (layout.appLogo()) {\n <img [src]=\"layout.appLogo()\" [alt]=\"'App logo'\" />\n }\n </div>\n <div class=\"app-logo-normal\">\n @if (layout.appLogo()) {\n <img class=\"h-2rem mr-3\" [src]=\"layout.appLogo()\" [alt]=\"'App logo'\" />\n }\n @if (layout.appLogoName()) {\n <img class=\"h-2rem\" [src]=\"layout.appLogoName()\" [alt]=\"'App name'\" />\n }\n </div>\n </a>\n <button class=\"layout-sidebar-anchor p-link z-2\" type=\"button\" (click)=\"anchor()\"></button>\n </div>\n\n @if (menuComponent()) {\n <div #menuContainer class=\"layout-menu-container\">\n <div [mngComponent]=\"menuComponent()\" [attachToHost]=\"true\"></div>\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: ComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "injectionToken", "inputs", "attachToHost", "parentInjector"], outputs: ["instanceCreated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
382
+ }
383
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SidebarComponent, decorators: [{
384
+ type: Component,
385
+ args: [{ standalone: true, selector: 'mng-sidebar', imports: [RouterModule, ComponentDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"layout-sidebar\" (mouseenter)=\"onMouseEnter()\" (mouseleave)=\"onMouseLeave()\">\n <div class=\"sidebar-header\">\n <a [routerLink]=\"['/']\" class=\"app-logo\">\n <div class=\"app-logo-small h-2rem\">\n @if (layout.appLogo()) {\n <img [src]=\"layout.appLogo()\" [alt]=\"'App logo'\" />\n }\n </div>\n <div class=\"app-logo-normal\">\n @if (layout.appLogo()) {\n <img class=\"h-2rem mr-3\" [src]=\"layout.appLogo()\" [alt]=\"'App logo'\" />\n }\n @if (layout.appLogoName()) {\n <img class=\"h-2rem\" [src]=\"layout.appLogoName()\" [alt]=\"'App name'\" />\n }\n </div>\n </a>\n <button class=\"layout-sidebar-anchor p-link z-2\" type=\"button\" (click)=\"anchor()\"></button>\n </div>\n\n @if (menuComponent()) {\n <div #menuContainer class=\"layout-menu-container\">\n <div [mngComponent]=\"menuComponent()\" [attachToHost]=\"true\"></div>\n </div>\n }\n</div>\n" }]
386
+ }] });
387
+
388
+ const defaultColorSchemeOpts = [
389
+ {
390
+ value: 'auto',
391
+ label: 'system'
392
+ },
393
+ {
394
+ value: 'light',
395
+ label: 'light'
396
+ },
397
+ {
398
+ value: 'dark',
399
+ label: 'dark'
400
+ }
401
+ ];
402
+ class SettingsComponent {
403
+ constructor() {
404
+ this.dynamicDialogConfig = inject(DynamicDialogConfig);
405
+ this.dynamicDialogRef = inject(DynamicDialogRef);
406
+ this.colorSchemeOptions = signal(defaultColorSchemeOpts);
407
+ this.injector = this.dynamicDialogConfig.data.injector;
408
+ this.translate = this.injector.get(TranslateService);
409
+ this.commons = this.injector.get(CommonsService);
410
+ this.layout = this.injector.get(LayoutService);
411
+ this.menuModes = this.layout.menuModes;
412
+ this.translate
413
+ .stream('mngSettings.title')
414
+ .pipe(takeUntilDestroyed())
415
+ .subscribe(t => {
416
+ setTimeout(() => (this.dynamicDialogConfig.header = t));
417
+ });
418
+ const translateKey = 'mngSettings.colorScheme.options';
419
+ this.translate
420
+ .stream(translateKey)
421
+ .pipe(takeUntilDestroyed())
422
+ .subscribe(t => {
423
+ if (t === translateKey) {
424
+ this.colorSchemeOptions.set(defaultColorSchemeOpts);
425
+ }
426
+ else {
427
+ this.colorSchemeOptions.update(options => options.map(o => ({
428
+ value: o.value,
429
+ label: `${t[o.value]}`
430
+ })));
431
+ }
432
+ });
433
+ }
434
+ switchLocale(language) {
435
+ this.commons.setAppLocale(language);
436
+ }
437
+ switchDataLocale(language) {
438
+ this.commons.setAppDataLocale(language);
439
+ }
440
+ onMenuModeChange(mode) {
441
+ this.layout.onMenuModeChange(mode);
442
+ }
443
+ onColorSchemeChange(scheme) {
444
+ this.layout.setColorScheme(scheme);
445
+ }
446
+ closeDialog() {
447
+ this.dynamicDialogRef.close();
448
+ }
449
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
450
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: SettingsComponent, isStandalone: true, selector: "mng-settings", ngImport: i0, template: "<div class=\"h-full flex flex-column\">\n <div class=\"flex-grow-1 mng-action-editor-form-container\">\n @if (commons.appLocales().length > 1 || commons.appDataLocales().length > 1) {\n <h5>{{ 'mngSettings.locales' | translate }}</h5>\n <div class=\"formgrid grid\">\n @if (commons.appLocales().length > 1) {\n <div class=\"field pr-4\">\n <i class=\"pi pi-fw pi-globe\"></i>\n <p-dropdown [ngModel]=\"commons.appLocale()\" [options]=\"commons.appLocales()\" (onChange)=\"switchLocale($event.value)\"></p-dropdown>\n </div>\n }\n @if (commons.appDataLocales().length > 1) {\n <div class=\"field pr-4\">\n <i class=\"pi pi-fw pi-database\"></i>\n <p-dropdown [ngModel]=\"commons.appDataLocale()\" [options]=\"commons.appDataLocales()\" (onChange)=\"switchDataLocale($event.value)\"></p-dropdown>\n </div>\n }\n </div>\n }\n\n <h5>{{ 'mngSettings.colorScheme.title' | translate }}</h5>\n <div class=\"formgrid grid\">\n <p-selectButton\n [options]=\"colorSchemeOptions()\"\n [ngModel]=\"layout.colorSchemeSetting()\"\n (ngModelChange)=\"onColorSchemeChange($event)\"\n optionLabel=\"label\"\n optionValue=\"value\"\n allowEmpty=\"false\" />\n </div>\n\n @if (menuModes.length > 1) {\n <h5>{{ 'mngSettings.menuMode.title' | translate }}</h5>\n <div class=\"formgrid grid\">\n @for (mode of menuModes; track mode) {\n <div class=\"field-radiobutton col-6 md:col-4\">\n <p-radioButton name=\"category\" [value]=\"mode\" [ngModel]=\"layout.menuMode()\" (ngModelChange)=\"onMenuModeChange(mode)\" />\n <label [for]=\"mode\" class=\"ml-2\">\n {{ 'mngSettings.menuMode.' + mode | translate }}\n </label>\n </div>\n }\n </div>\n }\n\n <div class=\"flex flex-row justify-content-between mng-action-editor-footer-container\">\n <div></div>\n <div>\n <p-button (onClick)=\"closeDialog()\" [label]=\"'general.close' | translate\" icon=\"pi pi-times\" styleClass=\"p-button-primary p-button-text\" />\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: RadioButtonModule }, { kind: "component", type: i2.RadioButton, selector: "p-radioButton", inputs: ["value", "formControlName", "name", "disabled", "label", "variant", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "style", "styleClass", "labelStyleClass", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i4.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputSwitchModule }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i5.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
451
+ }
452
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SettingsComponent, decorators: [{
453
+ type: Component,
454
+ args: [{ standalone: true, selector: 'mng-settings', imports: [TranslateModule, RadioButtonModule, FormsModule, Button, DropdownModule, InputSwitchModule, SelectButtonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"h-full flex flex-column\">\n <div class=\"flex-grow-1 mng-action-editor-form-container\">\n @if (commons.appLocales().length > 1 || commons.appDataLocales().length > 1) {\n <h5>{{ 'mngSettings.locales' | translate }}</h5>\n <div class=\"formgrid grid\">\n @if (commons.appLocales().length > 1) {\n <div class=\"field pr-4\">\n <i class=\"pi pi-fw pi-globe\"></i>\n <p-dropdown [ngModel]=\"commons.appLocale()\" [options]=\"commons.appLocales()\" (onChange)=\"switchLocale($event.value)\"></p-dropdown>\n </div>\n }\n @if (commons.appDataLocales().length > 1) {\n <div class=\"field pr-4\">\n <i class=\"pi pi-fw pi-database\"></i>\n <p-dropdown [ngModel]=\"commons.appDataLocale()\" [options]=\"commons.appDataLocales()\" (onChange)=\"switchDataLocale($event.value)\"></p-dropdown>\n </div>\n }\n </div>\n }\n\n <h5>{{ 'mngSettings.colorScheme.title' | translate }}</h5>\n <div class=\"formgrid grid\">\n <p-selectButton\n [options]=\"colorSchemeOptions()\"\n [ngModel]=\"layout.colorSchemeSetting()\"\n (ngModelChange)=\"onColorSchemeChange($event)\"\n optionLabel=\"label\"\n optionValue=\"value\"\n allowEmpty=\"false\" />\n </div>\n\n @if (menuModes.length > 1) {\n <h5>{{ 'mngSettings.menuMode.title' | translate }}</h5>\n <div class=\"formgrid grid\">\n @for (mode of menuModes; track mode) {\n <div class=\"field-radiobutton col-6 md:col-4\">\n <p-radioButton name=\"category\" [value]=\"mode\" [ngModel]=\"layout.menuMode()\" (ngModelChange)=\"onMenuModeChange(mode)\" />\n <label [for]=\"mode\" class=\"ml-2\">\n {{ 'mngSettings.menuMode.' + mode | translate }}\n </label>\n </div>\n }\n </div>\n }\n\n <div class=\"flex flex-row justify-content-between mng-action-editor-footer-container\">\n <div></div>\n <div>\n <p-button (onClick)=\"closeDialog()\" [label]=\"'general.close' | translate\" icon=\"pi pi-times\" styleClass=\"p-button-primary p-button-text\" />\n </div>\n </div>\n </div>\n</div>\n" }]
455
+ }], ctorParameters: () => [] });
456
+
457
+ class TopbarUserComponent {
458
+ constructor() {
459
+ this.injector = inject(Injector);
460
+ this.dialogService = inject(DialogService);
461
+ this.commons = inject(CommonsService);
462
+ this.hrefJsVoid = inject(DomSanitizer).bypassSecurityTrustUrl('javascript:void(0)');
463
+ this.config = inject(COMMONS_LAYOUT_FEATURE_CONFIG_IT, { optional: true });
464
+ this.user = computed(() => this.commons.user());
465
+ this.userRoles = computed(() => this.commons.userRoles());
466
+ this.settingsDisabled = signal(this.config?.components?.settings === false);
467
+ }
468
+ logout(user, event) {
469
+ if (typeof user?.logout === 'function') {
470
+ event.preventDefault();
471
+ event.stopPropagation();
472
+ user.logout();
473
+ }
474
+ }
475
+ openSettings() {
476
+ if (this.config?.components?.settings === false) {
477
+ return;
478
+ }
479
+ this.dialogService.open(this.config?.components?.settings ?? SettingsComponent, {
480
+ modal: true,
481
+ styleClass: 'mng-dialog mng-action-editor-dialog mng-dialog-xs',
482
+ data: {
483
+ injector: this.injector
484
+ }
485
+ });
486
+ }
487
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TopbarUserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
488
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: TopbarUserComponent, isStandalone: true, selector: "mng-topbar-user-component", ngImport: i0, template: "<a\n class=\"cursor-pointer lg:pr-4\"\n pStyleClass=\"@next\"\n enterFromClass=\"ng-hidden\"\n enterActiveClass=\"px-scalein\"\n leaveToClass=\"ng-hidden\"\n leaveActiveClass=\"px-fadeout\"\n [hideOnOutsideClick]=\"true\"\n pRipple>\n <i class=\"pi pi-fw pi-user text-2xl\"></i>\n <span class=\"hidden sm:inline-block\">&nbsp; {{ user()?.displayName ?? user()?.username }}</span>\n</a>\n<ul class=\"topbar-menu active-topbar-menu w-15rem z-5 ng-hidden border-round\">\n <li role=\"menuitem\">\n <a\n class=\"flex align-items-center transition-duration-200\"\n pStyleClass=\"@grandparent\"\n enterFromClass=\"ng-hidden\"\n enterActiveClass=\"px-scalein\"\n leaveToClass=\"ng-hidden\"\n leaveActiveClass=\"px-fadeout\">\n <i class=\"pi pi-fw pi-user text-base mr-2\"></i>\n <div>\n <strong>{{ user()?.displayName ?? user()?.username }}</strong>\n @if (userRoles().length > 0) {\n <small>\n <br />\n {{ userRoles() }}\n </small>\n }\n </div>\n </a>\n </li>\n @if (!settingsDisabled()) {\n <li role=\"menuitem\">\n <a\n [href]=\"hrefJsVoid\"\n (click)=\"openSettings()\"\n class=\"flex align-items-center transition-duration-200\"\n pStyleClass=\"@grandparent\"\n enterFromClass=\"ng-hidden\"\n enterActiveClass=\"px-scalein\"\n leaveToClass=\"ng-hidden\"\n leaveActiveClass=\"px-fadeout\">\n <i class=\"pi pi-fw pi-cog text-base mr-2\"></i>\n {{ 'mngSettings.title' | translate }}\n </a>\n </li>\n }\n @if (user()?.logout || user()?.logoutUrl) {\n <li role=\"menuitem\">\n <a\n [href]=\"user()?.logoutUrl ?? hrefJsVoid\"\n (click)=\"logout(user(), $event)\"\n class=\"flex align-items-center hover:text-primary-500 transition-duration-200\"\n pStyleClass=\"@grandparent\"\n enterFromClass=\"ng-hidden\"\n enterActiveClass=\"px-scalein\"\n leaveToClass=\"ng-hidden\"\n leaveActiveClass=\"px-fadeout\">\n <i class=\"pi pi-fw pi-sign-out text-base mr-2\"></i>\n <span>{{ 'mngTopbar.logout' | translate }}</span>\n </a>\n </li>\n }\n</ul>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i1$1.Ripple, selector: "[pRipple]" }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i3$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
489
+ }
490
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TopbarUserComponent, decorators: [{
491
+ type: Component,
492
+ args: [{ standalone: true, selector: 'mng-topbar-user-component', imports: [TranslateModule, RippleModule, StyleClassModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<a\n class=\"cursor-pointer lg:pr-4\"\n pStyleClass=\"@next\"\n enterFromClass=\"ng-hidden\"\n enterActiveClass=\"px-scalein\"\n leaveToClass=\"ng-hidden\"\n leaveActiveClass=\"px-fadeout\"\n [hideOnOutsideClick]=\"true\"\n pRipple>\n <i class=\"pi pi-fw pi-user text-2xl\"></i>\n <span class=\"hidden sm:inline-block\">&nbsp; {{ user()?.displayName ?? user()?.username }}</span>\n</a>\n<ul class=\"topbar-menu active-topbar-menu w-15rem z-5 ng-hidden border-round\">\n <li role=\"menuitem\">\n <a\n class=\"flex align-items-center transition-duration-200\"\n pStyleClass=\"@grandparent\"\n enterFromClass=\"ng-hidden\"\n enterActiveClass=\"px-scalein\"\n leaveToClass=\"ng-hidden\"\n leaveActiveClass=\"px-fadeout\">\n <i class=\"pi pi-fw pi-user text-base mr-2\"></i>\n <div>\n <strong>{{ user()?.displayName ?? user()?.username }}</strong>\n @if (userRoles().length > 0) {\n <small>\n <br />\n {{ userRoles() }}\n </small>\n }\n </div>\n </a>\n </li>\n @if (!settingsDisabled()) {\n <li role=\"menuitem\">\n <a\n [href]=\"hrefJsVoid\"\n (click)=\"openSettings()\"\n class=\"flex align-items-center transition-duration-200\"\n pStyleClass=\"@grandparent\"\n enterFromClass=\"ng-hidden\"\n enterActiveClass=\"px-scalein\"\n leaveToClass=\"ng-hidden\"\n leaveActiveClass=\"px-fadeout\">\n <i class=\"pi pi-fw pi-cog text-base mr-2\"></i>\n {{ 'mngSettings.title' | translate }}\n </a>\n </li>\n }\n @if (user()?.logout || user()?.logoutUrl) {\n <li role=\"menuitem\">\n <a\n [href]=\"user()?.logoutUrl ?? hrefJsVoid\"\n (click)=\"logout(user(), $event)\"\n class=\"flex align-items-center hover:text-primary-500 transition-duration-200\"\n pStyleClass=\"@grandparent\"\n enterFromClass=\"ng-hidden\"\n enterActiveClass=\"px-scalein\"\n leaveToClass=\"ng-hidden\"\n leaveActiveClass=\"px-fadeout\">\n <i class=\"pi pi-fw pi-sign-out text-base mr-2\"></i>\n <span>{{ 'mngTopbar.logout' | translate }}</span>\n </a>\n </li>\n }\n</ul>\n" }]
493
+ }] });
494
+
495
+ class TopbarComponent {
496
+ constructor() {
497
+ this.el = inject(ElementRef);
498
+ this.commons = inject(CommonsService);
499
+ this.layout = inject(LayoutService);
500
+ this.config = inject(COMMONS_LAYOUT_FEATURE_CONFIG_IT, { optional: true });
501
+ this.topbarUserComponent = signal(this.config?.components?.topbarUser === false ? undefined : (this.config?.components?.topbarUser ?? TopbarUserComponent));
502
+ this.breadcrumbComponent = signal(this.config?.components?.breadcrumb === false ? undefined : (this.config?.components?.breadcrumb ?? BreadcrumbComponent));
503
+ }
504
+ onMenuButtonClick() {
505
+ this.layout.onMenuToggle();
506
+ }
507
+ switchLocale(language) {
508
+ this.commons.setAppLocale(language);
509
+ }
510
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TopbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
511
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: TopbarComponent, isStandalone: true, selector: "mng-topbar", ngImport: i0, template: "<div class=\"layout-topbar\">\n <div class=\"topbar-start\">\n <button #menubutton type=\"button\" class=\"topbar-menubutton p-link p-trigger\" (click)=\"onMenuButtonClick()\">\n <i class=\"pi pi-bars\"></i>\n </button>\n\n @if (breadcrumbComponent()) {\n <div class=\"topbar-breadcrumb\">\n <div [mngComponent]=\"breadcrumbComponent()\" [attachToHost]=\"true\"></div>\n </div>\n }\n </div>\n <div class=\"layout-topbar-menu-section\">\n <mng-sidebar></mng-sidebar>\n </div>\n <div class=\"topbar-end\">\n <ul class=\"topbar-menu\">\n @if (commons.appLocales().length > 1) {\n <li class=\"profile-item\">\n <i class=\"pi pi-fw pi-globe\"></i>\n <p-dropdown [ngModel]=\"commons.appLocale()\" [options]=\"commons.appLocales()\" (onChange)=\"switchLocale($event.value)\"></p-dropdown>\n </li>\n }\n @if (topbarUserComponent()) {\n <li #userMenuItem class=\"profile-item topbar-item mr-3\" [mngComponent]=\"topbarUserComponent()\" [attachToHost]=\"true\"></li>\n }\n </ul>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: SidebarComponent, selector: "mng-sidebar" }, { kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: StyleClassModule }, { kind: "ngmodule", type: RippleModule }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i4.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "directive", type: ComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "injectionToken", "inputs", "attachToHost", "parentInjector"], outputs: ["instanceCreated"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
512
+ }
513
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TopbarComponent, decorators: [{
514
+ type: Component,
515
+ args: [{ standalone: true, selector: 'mng-topbar', imports: [SidebarComponent, ButtonModule, StyleClassModule, RippleModule, DropdownModule, ComponentDirective, FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"layout-topbar\">\n <div class=\"topbar-start\">\n <button #menubutton type=\"button\" class=\"topbar-menubutton p-link p-trigger\" (click)=\"onMenuButtonClick()\">\n <i class=\"pi pi-bars\"></i>\n </button>\n\n @if (breadcrumbComponent()) {\n <div class=\"topbar-breadcrumb\">\n <div [mngComponent]=\"breadcrumbComponent()\" [attachToHost]=\"true\"></div>\n </div>\n }\n </div>\n <div class=\"layout-topbar-menu-section\">\n <mng-sidebar></mng-sidebar>\n </div>\n <div class=\"topbar-end\">\n <ul class=\"topbar-menu\">\n @if (commons.appLocales().length > 1) {\n <li class=\"profile-item\">\n <i class=\"pi pi-fw pi-globe\"></i>\n <p-dropdown [ngModel]=\"commons.appLocale()\" [options]=\"commons.appLocales()\" (onChange)=\"switchLocale($event.value)\"></p-dropdown>\n </li>\n }\n @if (topbarUserComponent()) {\n <li #userMenuItem class=\"profile-item topbar-item mr-3\" [mngComponent]=\"topbarUserComponent()\" [attachToHost]=\"true\"></li>\n }\n </ul>\n </div>\n</div>\n" }]
516
+ }] });
517
+
518
+ class MainLayoutComponent {
519
+ constructor() {
520
+ // private readonly commonsService = inject(CommonsService);
521
+ this.config = inject(COMMONS_LAYOUT_FEATURE_CONFIG_IT, { optional: true });
522
+ this.layout = inject(LayoutService);
523
+ this.menuService = inject(MenuService);
524
+ this.renderer = inject(Renderer2);
525
+ this.appTopbar = viewChild('topbarCmp');
526
+ this.ripple = signal(this.config?.ripple ?? true);
527
+ this.topbarComponent = signal(this.config?.components?.topbar === false ? undefined : (this.config?.components?.topbar ?? TopbarComponent));
528
+ this.breadcrumbsComponent = signal(this.config?.components?.breadcrumb === false ? undefined : (this.config?.components?.breadcrumb ?? BreadcrumbComponent));
529
+ this.footerComponent = signal(this.config?.components?.footer === false ? undefined : (this.config?.components?.footer ?? FooterComponent));
530
+ this.useNotificationWrapper = signal(!this.config?.disableNotificationWrapper);
531
+ this.layout.overlayOpen$.pipe(takeUntilDestroyed()).subscribe(() => {
532
+ if (!this.menuOutsideClickListener) {
533
+ this.menuOutsideClickListener = this.renderer.listen('document', 'click', event => {
534
+ const isOutsideClicked = !(this.appTopbar()?.nativeElement.isSameNode(event.target) || this.appTopbar()?.nativeElement.contains(event.target));
535
+ if (isOutsideClicked) {
536
+ this.hideMenu();
537
+ }
538
+ });
539
+ }
540
+ if (this.layout.state().staticMenuMobileActive) {
541
+ this.blockBodyScroll();
542
+ }
543
+ });
544
+ }
545
+ blockBodyScroll() {
546
+ if (document.body.classList) {
547
+ document.body.classList.add('blocked-scroll');
548
+ }
549
+ else {
550
+ document.body.className += ' blocked-scroll';
551
+ }
552
+ }
553
+ unblockBodyScroll() {
554
+ if (document.body.classList) {
555
+ document.body.classList.remove('blocked-scroll');
556
+ }
557
+ else {
558
+ document.body.className = document.body.className.replace(new RegExp('(^|\\b)' + 'blocked-scroll'.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
559
+ }
560
+ }
561
+ hideMenu() {
562
+ this.layout.state.update(state => ({
563
+ ...state,
564
+ overlayMenuActive: false,
565
+ staticMenuMobileActive: false,
566
+ menuHoverActive: false
567
+ }));
568
+ if (this.layout.submenuOverlayKey() !== undefined) {
569
+ this.layout.onOverlaySubmenuClose();
570
+ }
571
+ if (!(this.layout.isSlim() || this.layout.isSlimPlus())) {
572
+ this.menuService.reset();
573
+ }
574
+ if (this.menuOutsideClickListener) {
575
+ this.menuOutsideClickListener();
576
+ this.menuOutsideClickListener = null;
577
+ }
578
+ this.unblockBodyScroll();
579
+ }
580
+ ngOnDestroy() {
581
+ if (this.menuOutsideClickListener) {
582
+ this.menuOutsideClickListener();
583
+ }
584
+ }
585
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MainLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
586
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: MainLayoutComponent, isStandalone: true, selector: "mng-main-layout", viewQueries: [{ propertyName: "appTopbar", first: true, predicate: ["topbarCmp"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (useNotificationWrapper()) {\n <mng-notification-wrapper>\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n </mng-notification-wrapper>\n} @else {\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n}\n\n<ng-template #content>\n <div\n class=\"layout-container\"\n [ngClass]=\"{\n 'layout-light': layout.colorScheme() === 'light',\n 'layout-dark': layout.colorScheme() === 'dark',\n 'layout-overlay': layout.menuMode() === 'overlay',\n 'layout-static': layout.menuMode() === 'static',\n 'layout-reveal': layout.menuMode() === 'reveal',\n 'layout-drawer': layout.menuMode() === 'drawer',\n 'layout-slim': layout.menuMode() === 'slim',\n 'layout-slim-plus': layout.menuMode() === 'slim-plus',\n 'layout-static-inactive': layout.state().staticMenuDesktopInactive && layout.menuMode() === 'static',\n 'layout-overlay-active': layout.state().overlayMenuActive,\n 'layout-mobile-active': layout.state().staticMenuMobileActive,\n 'p-ripple-disabled': !ripple(),\n 'layout-sidebar-active': layout.state().sidebarActive,\n 'layout-sidebar-anchored': layout.state().anchored\n }\">\n <div class=\"layout-content-wrapper\">\n @if (topbarComponent()) {\n <div #topbarCmp class=\"layout-topbar-wrapper\" [mngComponent]=\"topbarComponent()\" [attachToHost]=\"true\"></div>\n }\n @if (breadcrumbsComponent()) {\n <div class=\"content-breadcrumb\">\n <div [mngComponent]=\"breadcrumbsComponent()\" [attachToHost]=\"true\"></div>\n </div>\n }\n <div class=\"layout-content\">\n <router-outlet></router-outlet>\n </div>\n <div class=\"layout-mask\"></div>\n @if (footerComponent()) {\n <div [mngComponent]=\"footerComponent()\" [attachToHost]=\"true\"></div>\n }\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: ComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "injectionToken", "inputs", "attachToHost", "parentInjector"], outputs: ["instanceCreated"] }, { kind: "component", type: NotificationWrapperComponent, selector: "mng-notification-wrapper" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
587
+ }
588
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: MainLayoutComponent, decorators: [{
589
+ type: Component,
590
+ args: [{ standalone: true, selector: 'mng-main-layout', imports: [NgClass, RouterModule, ComponentDirective, NotificationWrapperComponent, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (useNotificationWrapper()) {\n <mng-notification-wrapper>\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n </mng-notification-wrapper>\n} @else {\n <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n}\n\n<ng-template #content>\n <div\n class=\"layout-container\"\n [ngClass]=\"{\n 'layout-light': layout.colorScheme() === 'light',\n 'layout-dark': layout.colorScheme() === 'dark',\n 'layout-overlay': layout.menuMode() === 'overlay',\n 'layout-static': layout.menuMode() === 'static',\n 'layout-reveal': layout.menuMode() === 'reveal',\n 'layout-drawer': layout.menuMode() === 'drawer',\n 'layout-slim': layout.menuMode() === 'slim',\n 'layout-slim-plus': layout.menuMode() === 'slim-plus',\n 'layout-static-inactive': layout.state().staticMenuDesktopInactive && layout.menuMode() === 'static',\n 'layout-overlay-active': layout.state().overlayMenuActive,\n 'layout-mobile-active': layout.state().staticMenuMobileActive,\n 'p-ripple-disabled': !ripple(),\n 'layout-sidebar-active': layout.state().sidebarActive,\n 'layout-sidebar-anchored': layout.state().anchored\n }\">\n <div class=\"layout-content-wrapper\">\n @if (topbarComponent()) {\n <div #topbarCmp class=\"layout-topbar-wrapper\" [mngComponent]=\"topbarComponent()\" [attachToHost]=\"true\"></div>\n }\n @if (breadcrumbsComponent()) {\n <div class=\"content-breadcrumb\">\n <div [mngComponent]=\"breadcrumbsComponent()\" [attachToHost]=\"true\"></div>\n </div>\n }\n <div class=\"layout-content\">\n <router-outlet></router-outlet>\n </div>\n <div class=\"layout-mask\"></div>\n @if (footerComponent()) {\n <div [mngComponent]=\"footerComponent()\" [attachToHost]=\"true\"></div>\n }\n </div>\n </div>\n</ng-template>\n" }]
591
+ }], ctorParameters: () => [] });
592
+
593
+ // components
594
+
595
+ /**
596
+ * Generated bundle index. Do not edit.
597
+ */
598
+
599
+ export { BreadcrumbComponent, FooterComponent, MainLayoutComponent, MenuComponent, MenuItemComponent, SettingsComponent, SidebarComponent, TopbarComponent, TopbarUserComponent, VersionComponent };
600
+ //# sourceMappingURL=mediusinc-mng-commons-layout-components.mjs.map