@flusys/ng-layout 0.1.0-beta.3 → 1.1.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/fesm2022/flusys-ng-layout.mjs +83 -75
- package/fesm2022/flusys-ng-layout.mjs.map +1 -1
- package/package.json +3 -3
- package/types/flusys-ng-layout.d.ts +13 -13
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i1 from '@angular/common';
|
|
2
2
|
import { isPlatformBrowser, CommonModule, DOCUMENT as DOCUMENT$1 } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { inject, PLATFORM_ID, Injectable, DOCUMENT, signal, computed, effect, Component, InjectionToken, DestroyRef, ElementRef, viewChild, input, Renderer2, ViewChild } from '@angular/core';
|
|
4
|
+
import { inject, PLATFORM_ID, Injectable, DOCUMENT, signal, computed, effect, Component, ChangeDetectionStrategy, InjectionToken, DestroyRef, ElementRef, viewChild, input, Renderer2, ViewChild } from '@angular/core';
|
|
5
5
|
import * as i2 from '@angular/forms';
|
|
6
6
|
import { FormsModule } from '@angular/forms';
|
|
7
7
|
import * as i1$2 from '@angular/router';
|
|
@@ -13,6 +13,7 @@ import Nora from '@primeuix/themes/nora';
|
|
|
13
13
|
import { PrimeNG } from 'primeng/config';
|
|
14
14
|
import * as i3 from 'primeng/selectbutton';
|
|
15
15
|
import { SelectButtonModule } from 'primeng/selectbutton';
|
|
16
|
+
import { APP_CONFIG, DEFAULT_APP_NAME, DEFAULT_AUTHOR, isCompanyFeatureEnabled } from '@flusys/ng-core';
|
|
16
17
|
import * as i2$2 from '@flusys/ng-shared';
|
|
17
18
|
import { evaluateLogicNode, PermissionValidatorService, PlatformService, AngularModule, IconComponent } from '@flusys/ng-shared';
|
|
18
19
|
import { Subject, fromEvent, filter as filter$1 } from 'rxjs';
|
|
@@ -21,7 +22,6 @@ import { ButtonModule } from 'primeng/button';
|
|
|
21
22
|
import * as i2$1 from 'primeng/styleclass';
|
|
22
23
|
import { StyleClassModule } from 'primeng/styleclass';
|
|
23
24
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
24
|
-
import { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';
|
|
25
25
|
import { filter } from 'rxjs/operators';
|
|
26
26
|
import { MessageService } from 'primeng/api';
|
|
27
27
|
import * as i4 from 'primeng/select';
|
|
@@ -131,8 +131,7 @@ class LayoutPersistenceService {
|
|
|
131
131
|
const parsed = JSON.parse(stored);
|
|
132
132
|
return this.validateConfig(parsed);
|
|
133
133
|
}
|
|
134
|
-
catch
|
|
135
|
-
console.warn('[LayoutPersistence] Failed to load config:', error);
|
|
134
|
+
catch {
|
|
136
135
|
this.clear();
|
|
137
136
|
return null;
|
|
138
137
|
}
|
|
@@ -153,8 +152,8 @@ class LayoutPersistenceService {
|
|
|
153
152
|
};
|
|
154
153
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(toStore));
|
|
155
154
|
}
|
|
156
|
-
catch
|
|
157
|
-
|
|
155
|
+
catch {
|
|
156
|
+
// Silent fail - localStorage may be full or disabled
|
|
158
157
|
}
|
|
159
158
|
}
|
|
160
159
|
/**
|
|
@@ -176,18 +175,15 @@ class LayoutPersistenceService {
|
|
|
176
175
|
validateConfig(config) {
|
|
177
176
|
// Version mismatch - clear and return null
|
|
178
177
|
if (config._version && config._version !== STORAGE_VERSION) {
|
|
179
|
-
console.warn('[LayoutPersistence] Version mismatch, clearing config');
|
|
180
178
|
this.clear();
|
|
181
179
|
return null;
|
|
182
180
|
}
|
|
183
|
-
// Validate preset
|
|
181
|
+
// Validate preset - silently fix invalid values
|
|
184
182
|
if (config.preset && !this.validPresets.includes(config.preset)) {
|
|
185
|
-
console.warn(`[LayoutPersistence] Invalid preset "${config.preset}", using Aura`);
|
|
186
183
|
config.preset = 'Aura';
|
|
187
184
|
}
|
|
188
|
-
// Validate menuMode
|
|
185
|
+
// Validate menuMode - silently fix invalid values
|
|
189
186
|
if (config.menuMode && !this.validMenuModes.includes(config.menuMode)) {
|
|
190
|
-
console.warn(`[LayoutPersistence] Invalid menuMode "${config.menuMode}", using static`);
|
|
191
187
|
config.menuMode = 'static';
|
|
192
188
|
}
|
|
193
189
|
// Validate darkTheme
|
|
@@ -198,10 +194,10 @@ class LayoutPersistenceService {
|
|
|
198
194
|
const { _version, ...cleanConfig } = config;
|
|
199
195
|
return cleanConfig;
|
|
200
196
|
}
|
|
201
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
202
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.
|
|
197
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutPersistenceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
198
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutPersistenceService, providedIn: 'root' });
|
|
203
199
|
}
|
|
204
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
200
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutPersistenceService, decorators: [{
|
|
205
201
|
type: Injectable,
|
|
206
202
|
args: [{
|
|
207
203
|
providedIn: 'root',
|
|
@@ -217,6 +213,7 @@ class LayoutService {
|
|
|
217
213
|
platformId = inject(PLATFORM_ID);
|
|
218
214
|
isBrowser = isPlatformBrowser(this.platformId);
|
|
219
215
|
persistence = inject(LayoutPersistenceService);
|
|
216
|
+
appConfig = inject(APP_CONFIG, { optional: true });
|
|
220
217
|
defaultConfig = {
|
|
221
218
|
preset: 'Aura',
|
|
222
219
|
primary: 'emerald',
|
|
@@ -245,7 +242,10 @@ class LayoutService {
|
|
|
245
242
|
// User Profile Signals
|
|
246
243
|
userProfile = signal(null, ...(ngDevMode ? [{ debugName: "userProfile" }] : []));
|
|
247
244
|
companyProfile = signal(null, ...(ngDevMode ? [{ debugName: "companyProfile" }] : []));
|
|
248
|
-
appName = signal(
|
|
245
|
+
appName = signal(this.appConfig?.appName ?? DEFAULT_APP_NAME, ...(ngDevMode ? [{ debugName: "appName" }] : []));
|
|
246
|
+
// Author/Brand Signals
|
|
247
|
+
authorName = signal(this.appConfig?.author?.name ?? DEFAULT_AUTHOR.name, ...(ngDevMode ? [{ debugName: "authorName" }] : []));
|
|
248
|
+
authorUrl = signal(this.appConfig?.author?.url ?? DEFAULT_AUTHOR.url, ...(ngDevMode ? [{ debugName: "authorUrl" }] : []));
|
|
249
249
|
// App Launcher Signals
|
|
250
250
|
_rawApps = signal([], ...(ngDevMode ? [{ debugName: "_rawApps" }] : []));
|
|
251
251
|
/**
|
|
@@ -271,7 +271,6 @@ class LayoutService {
|
|
|
271
271
|
return filterMenuByPermissions(raw, permission);
|
|
272
272
|
}, ...(ngDevMode ? [{ debugName: "menu" }] : []));
|
|
273
273
|
// Computed signals - Layout
|
|
274
|
-
theme = computed(() => this.layoutConfig()?.darkTheme ? 'light' : 'dark', ...(ngDevMode ? [{ debugName: "theme" }] : []));
|
|
275
274
|
isSidebarActive = computed(() => this.layoutState().overlayMenuActive ||
|
|
276
275
|
this.layoutState().staticMenuMobileActive, ...(ngDevMode ? [{ debugName: "isSidebarActive" }] : []));
|
|
277
276
|
isDarkTheme = computed(() => this.layoutConfig().darkTheme, ...(ngDevMode ? [{ debugName: "isDarkTheme" }] : []));
|
|
@@ -282,7 +281,13 @@ class LayoutService {
|
|
|
282
281
|
userName = computed(() => this.userProfile()?.name ?? 'User', ...(ngDevMode ? [{ debugName: "userName" }] : []));
|
|
283
282
|
userEmail = computed(() => this.userProfile()?.email ?? '', ...(ngDevMode ? [{ debugName: "userEmail" }] : []));
|
|
284
283
|
userProfilePictureUrl = computed(() => this.userProfile()?.profilePictureUrl ?? null, ...(ngDevMode ? [{ debugName: "userProfilePictureUrl" }] : []));
|
|
285
|
-
companyName = computed(() =>
|
|
284
|
+
companyName = computed(() => {
|
|
285
|
+
// If company feature is disabled, always show app name
|
|
286
|
+
if (!this.appConfig || !isCompanyFeatureEnabled(this.appConfig)) {
|
|
287
|
+
return this.appName();
|
|
288
|
+
}
|
|
289
|
+
return this.companyProfile()?.name ?? this.appName();
|
|
290
|
+
}, ...(ngDevMode ? [{ debugName: "companyName" }] : []));
|
|
286
291
|
companyLogoUrl = computed(() => this.companyProfile()?.logoUrl ?? null, ...(ngDevMode ? [{ debugName: "companyLogoUrl" }] : []));
|
|
287
292
|
isAuthenticated = computed(() => !!this.userProfile(), ...(ngDevMode ? [{ debugName: "isAuthenticated" }] : []));
|
|
288
293
|
// Computed signals - App Launcher
|
|
@@ -442,10 +447,10 @@ class LayoutService {
|
|
|
442
447
|
clearApps() {
|
|
443
448
|
this._rawApps.set([]);
|
|
444
449
|
}
|
|
445
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
446
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.
|
|
450
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
451
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutService, providedIn: 'root' });
|
|
447
452
|
}
|
|
448
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
453
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LayoutService, decorators: [{
|
|
449
454
|
type: Injectable,
|
|
450
455
|
args: [{
|
|
451
456
|
providedIn: 'root',
|
|
@@ -459,10 +464,9 @@ const presets = {
|
|
|
459
464
|
};
|
|
460
465
|
class AppConfigurator {
|
|
461
466
|
router = inject(Router);
|
|
462
|
-
|
|
467
|
+
primeng = inject(PrimeNG);
|
|
463
468
|
layoutService = inject(LayoutService);
|
|
464
469
|
platformService = inject(PlatformService);
|
|
465
|
-
primeng = inject(PrimeNG);
|
|
466
470
|
presets = Object.keys(presets);
|
|
467
471
|
showMenuModeButton = signal(!this.router.url.includes('auth'), ...(ngDevMode ? [{ debugName: "showMenuModeButton" }] : []));
|
|
468
472
|
menuModeOptions = [
|
|
@@ -819,8 +823,8 @@ class AppConfigurator {
|
|
|
819
823
|
menuMode: event,
|
|
820
824
|
}));
|
|
821
825
|
}
|
|
822
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
823
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.
|
|
826
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
827
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppConfigurator, isStandalone: true, selector: "app-configurator", host: { styleAttribute: "background-color: var(--surface-overlay)", classAttribute: "hidden absolute top-[3.25rem] right-0 w-72 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]" }, ngImport: i0, template: `
|
|
824
828
|
<div class="flex flex-col gap-4">
|
|
825
829
|
<div>
|
|
826
830
|
<span class="text-sm text-muted-color font-semibold">Primary</span>
|
|
@@ -889,7 +893,7 @@ class AppConfigurator {
|
|
|
889
893
|
</div>
|
|
890
894
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i3.SelectButton, selector: "p-selectButton, p-selectbutton, p-select-button", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "styleClass", "ariaLabelledBy", "dataKey", "autofocus", "size", "fluid"], outputs: ["onOptionClick", "onChange"] }] });
|
|
891
895
|
}
|
|
892
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
896
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppConfigurator, decorators: [{
|
|
893
897
|
type: Component,
|
|
894
898
|
args: [{
|
|
895
899
|
selector: 'app-configurator',
|
|
@@ -976,8 +980,8 @@ class AppFloatingConfigurator {
|
|
|
976
980
|
toggleDarkMode() {
|
|
977
981
|
this.LayoutService.layoutConfig.update((state) => ({ ...state, darkTheme: !state.darkTheme }));
|
|
978
982
|
}
|
|
979
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
980
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.
|
|
983
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppFloatingConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
984
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AppFloatingConfigurator, isStandalone: true, selector: "app-floating-configurator", ngImport: i0, template: `
|
|
981
985
|
<div class="fixed flex flex-col md:flex-row gap-4 top-8 right-0 md:right-8 z-99">
|
|
982
986
|
<p-button type="button" (onClick)="toggleDarkMode()" [rounded]="true" [icon]="isDarkTheme() ? 'pi pi-moon' : 'pi pi-sun'" severity="secondary" />
|
|
983
987
|
<div class="relative">
|
|
@@ -987,7 +991,7 @@ class AppFloatingConfigurator {
|
|
|
987
991
|
</div>
|
|
988
992
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i2$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfigurator, selector: "app-configurator" }] });
|
|
989
993
|
}
|
|
990
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
994
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppFloatingConfigurator, decorators: [{
|
|
991
995
|
type: Component,
|
|
992
996
|
args: [{
|
|
993
997
|
selector: 'app-floating-configurator',
|
|
@@ -1006,22 +1010,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
|
|
|
1006
1010
|
|
|
1007
1011
|
class AppFooter {
|
|
1008
1012
|
layoutService = inject(LayoutService);
|
|
1009
|
-
//
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1013
|
+
// Footer shows product branding (appName), not user's company
|
|
1014
|
+
appName = this.layoutService.appName;
|
|
1015
|
+
authorName = this.layoutService.authorName;
|
|
1016
|
+
authorUrl = this.layoutService.authorUrl;
|
|
1017
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppFooter, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1018
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AppFooter, isStandalone: true, selector: "app-footer", ngImport: i0, template: `<div class="layout-footer">
|
|
1019
|
+
{{ appName() }} by
|
|
1020
|
+
<a [href]="authorUrl()" target="_blank" rel="noopener noreferrer" class="text-primary font-bold hover:underline">{{ authorName() }}</a>
|
|
1021
|
+
</div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1016
1022
|
}
|
|
1017
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
1023
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppFooter, decorators: [{
|
|
1018
1024
|
type: Component,
|
|
1019
1025
|
args: [{
|
|
1020
1026
|
standalone: true,
|
|
1021
1027
|
selector: 'app-footer',
|
|
1028
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
1022
1029
|
template: `<div class="layout-footer">
|
|
1023
|
-
{{
|
|
1024
|
-
<a href="
|
|
1030
|
+
{{ appName() }} by
|
|
1031
|
+
<a [href]="authorUrl()" target="_blank" rel="noopener noreferrer" class="text-primary font-bold hover:underline">{{ authorName() }}</a>
|
|
1025
1032
|
</div>`,
|
|
1026
1033
|
}]
|
|
1027
1034
|
}] });
|
|
@@ -1162,8 +1169,8 @@ class AppCompanyBranchSelector {
|
|
|
1162
1169
|
},
|
|
1163
1170
|
});
|
|
1164
1171
|
}
|
|
1165
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
1166
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.
|
|
1172
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppCompanyBranchSelector, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1173
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppCompanyBranchSelector, isStandalone: true, selector: "app-company-branch-selector", host: { classAttribute: "relative" }, ngImport: i0, template: `
|
|
1167
1174
|
<button
|
|
1168
1175
|
type="button"
|
|
1169
1176
|
class="layout-topbar-action"
|
|
@@ -1238,7 +1245,7 @@ class AppCompanyBranchSelector {
|
|
|
1238
1245
|
</div>
|
|
1239
1246
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i2$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i4.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }] });
|
|
1240
1247
|
}
|
|
1241
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
1248
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppCompanyBranchSelector, decorators: [{
|
|
1242
1249
|
type: Component,
|
|
1243
1250
|
args: [{
|
|
1244
1251
|
selector: 'app-company-branch-selector',
|
|
@@ -1341,8 +1348,8 @@ class AppLauncher {
|
|
|
1341
1348
|
togglePanel() {
|
|
1342
1349
|
this.isActive.update((v) => !v);
|
|
1343
1350
|
}
|
|
1344
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
1345
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.
|
|
1351
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppLauncher, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1352
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppLauncher, isStandalone: true, selector: "app-launcher", host: { classAttribute: "relative" }, ngImport: i0, template: `
|
|
1346
1353
|
<button
|
|
1347
1354
|
type="button"
|
|
1348
1355
|
class="layout-topbar-action"
|
|
@@ -1392,7 +1399,7 @@ class AppLauncher {
|
|
|
1392
1399
|
</div>
|
|
1393
1400
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i2$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: IconComponent, selector: "lib-icon", inputs: ["icon", "iconType"] }] });
|
|
1394
1401
|
}
|
|
1395
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
1402
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppLauncher, decorators: [{
|
|
1396
1403
|
type: Component,
|
|
1397
1404
|
args: [{
|
|
1398
1405
|
selector: 'app-launcher',
|
|
@@ -1455,6 +1462,7 @@ class AppProfile {
|
|
|
1455
1462
|
destroyRef = inject(DestroyRef);
|
|
1456
1463
|
authState = inject(LAYOUT_AUTH_STATE, { optional: true });
|
|
1457
1464
|
authApi = inject(LAYOUT_AUTH_API, { optional: true });
|
|
1465
|
+
layoutService = inject(LayoutService);
|
|
1458
1466
|
messageService = inject(MessageService);
|
|
1459
1467
|
document = inject(DOCUMENT$1);
|
|
1460
1468
|
elementRef = inject(ElementRef);
|
|
@@ -1474,7 +1482,8 @@ class AppProfile {
|
|
|
1474
1482
|
}
|
|
1475
1483
|
userName = computed(() => this.authState?.loginUserData()?.name ?? 'Guest', ...(ngDevMode ? [{ debugName: "userName" }] : []));
|
|
1476
1484
|
userEmail = computed(() => this.authState?.loginUserData()?.email ?? '', ...(ngDevMode ? [{ debugName: "userEmail" }] : []));
|
|
1477
|
-
|
|
1485
|
+
// Use LayoutService for profile picture URL (synced by AuthLayoutSyncService)
|
|
1486
|
+
profilePicture = computed(() => this.layoutService.userProfilePictureUrl() ?? '', ...(ngDevMode ? [{ debugName: "profilePicture" }] : []));
|
|
1478
1487
|
logout() {
|
|
1479
1488
|
if (!this.authApi)
|
|
1480
1489
|
return;
|
|
@@ -1511,8 +1520,7 @@ class AppProfile {
|
|
|
1511
1520
|
detail: 'Sign Up Link copied.',
|
|
1512
1521
|
});
|
|
1513
1522
|
})
|
|
1514
|
-
.catch((
|
|
1515
|
-
console.error('Failed to copy signup link: ', err);
|
|
1523
|
+
.catch(() => {
|
|
1516
1524
|
this.messageService.add({
|
|
1517
1525
|
severity: 'error',
|
|
1518
1526
|
summary: 'Sorry',
|
|
@@ -1520,8 +1528,8 @@ class AppProfile {
|
|
|
1520
1528
|
});
|
|
1521
1529
|
});
|
|
1522
1530
|
}
|
|
1523
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
1524
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.
|
|
1531
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppProfile, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1532
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppProfile, isStandalone: true, selector: "app-profile", host: { classAttribute: "relative" }, ngImport: i0, template: `
|
|
1525
1533
|
<button
|
|
1526
1534
|
type="button"
|
|
1527
1535
|
class="layout-topbar-action"
|
|
@@ -1590,7 +1598,7 @@ class AppProfile {
|
|
|
1590
1598
|
</div>
|
|
1591
1599
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2$2.IsEmptyImageDirective, selector: "img", inputs: ["src"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i2$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }] });
|
|
1592
1600
|
}
|
|
1593
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
1601
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppProfile, decorators: [{
|
|
1594
1602
|
type: Component,
|
|
1595
1603
|
args: [{
|
|
1596
1604
|
selector: 'app-profile',
|
|
@@ -1703,8 +1711,8 @@ class AppTopbar {
|
|
|
1703
1711
|
this.activePanel.set(null);
|
|
1704
1712
|
}
|
|
1705
1713
|
}
|
|
1706
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
1707
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.
|
|
1714
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppTopbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1715
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppTopbar, isStandalone: true, selector: "app-topbar", viewQueries: [{ propertyName: "configContainer", first: true, predicate: ["configContainer"], descendants: true, isSignal: true }], ngImport: i0, template: ` <div class="layout-topbar">
|
|
1708
1716
|
<div class="layout-topbar-logo-container">
|
|
1709
1717
|
<button
|
|
1710
1718
|
class="layout-menu-button layout-topbar-action"
|
|
@@ -1776,7 +1784,7 @@ class AppTopbar {
|
|
|
1776
1784
|
</div>
|
|
1777
1785
|
</div>`, isInline: true, 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: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i2$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfigurator, selector: "app-configurator" }, { kind: "component", type: AppProfile, selector: "app-profile" }, { kind: "component", type: AppCompanyBranchSelector, selector: "app-company-branch-selector" }, { kind: "component", type: AppLauncher, selector: "app-launcher" }] });
|
|
1778
1786
|
}
|
|
1779
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
1787
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppTopbar, decorators: [{
|
|
1780
1788
|
type: Component,
|
|
1781
1789
|
args: [{
|
|
1782
1790
|
selector: 'app-topbar',
|
|
@@ -1959,8 +1967,8 @@ class AppMenuitem {
|
|
|
1959
1967
|
}
|
|
1960
1968
|
this.layoutService.onMenuStateChange({ key: this.key() });
|
|
1961
1969
|
}
|
|
1962
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
1963
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.
|
|
1970
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppMenuitem, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1971
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppMenuitem, isStandalone: true, selector: "[app-menuitem]", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null }, parentKey: { classPropertyName: "parentKey", publicName: "parentKey", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.active-menuitem": "active()" } }, ngImport: i0, template: `
|
|
1964
1972
|
<ng-container>
|
|
1965
1973
|
@if (item().children?.length) {
|
|
1966
1974
|
<a (click)="itemClick()" tabindex="0" pRipple>
|
|
@@ -2018,7 +2026,7 @@ class AppMenuitem {
|
|
|
2018
2026
|
</ng-container>
|
|
2019
2027
|
`, isInline: true, styles: [":host ul{overflow:hidden;transition:max-height .4s cubic-bezier(.86,0,.07,1)}:host ul.submenu-collapsed{max-height:0}:host ul.submenu-expanded{max-height:1000px}\n"], dependencies: [{ kind: "component", type: AppMenuitem, selector: "[app-menuitem]", inputs: ["item", "index", "parentKey"] }, { kind: "component", type: IconComponent, selector: "lib-icon", inputs: ["icon", "iconType"] }, { 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: i1$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i2$3.Ripple, selector: "[pRipple]" }] });
|
|
2020
2028
|
}
|
|
2021
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
2029
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppMenuitem, decorators: [{
|
|
2022
2030
|
type: Component,
|
|
2023
2031
|
args: [{ selector: '[app-menuitem]', standalone: true, imports: [IconComponent, RouterModule, RippleModule], template: `
|
|
2024
2032
|
<ng-container>
|
|
@@ -2095,8 +2103,8 @@ class AppMenu {
|
|
|
2095
2103
|
* - Permission state changes (user permissions updated)
|
|
2096
2104
|
*/
|
|
2097
2105
|
menuItems = this.layoutService.menu;
|
|
2098
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
2099
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.
|
|
2106
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2107
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppMenu, isStandalone: true, selector: "app-menu", ngImport: i0, template: `<div class="layout-menu">
|
|
2100
2108
|
<ul>
|
|
2101
2109
|
@for (
|
|
2102
2110
|
item of menuItems();
|
|
@@ -2108,7 +2116,7 @@ class AppMenu {
|
|
|
2108
2116
|
</ul>
|
|
2109
2117
|
</div>`, isInline: true, dependencies: [{ kind: "component", type: AppMenuitem, selector: "[app-menuitem]", inputs: ["item", "index", "parentKey"] }, { kind: "ngmodule", type: RouterModule }] });
|
|
2110
2118
|
}
|
|
2111
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
2119
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppMenu, decorators: [{
|
|
2112
2120
|
type: Component,
|
|
2113
2121
|
args: [{
|
|
2114
2122
|
selector: 'app-menu',
|
|
@@ -2129,26 +2137,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
|
|
|
2129
2137
|
}] });
|
|
2130
2138
|
|
|
2131
2139
|
class AppSidebar {
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
<app-menu></app-menu>
|
|
2139
|
-
</div>`, isInline: true, dependencies: [{ kind: "component", type: AppMenu, selector: "app-menu" }] });
|
|
2140
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2141
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AppSidebar, isStandalone: true, selector: "app-sidebar", ngImport: i0, template: `
|
|
2142
|
+
<div class="layout-sidebar">
|
|
2143
|
+
<app-menu />
|
|
2144
|
+
</div>
|
|
2145
|
+
`, isInline: true, dependencies: [{ kind: "component", type: AppMenu, selector: "app-menu" }] });
|
|
2140
2146
|
}
|
|
2141
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
2147
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppSidebar, decorators: [{
|
|
2142
2148
|
type: Component,
|
|
2143
2149
|
args: [{
|
|
2144
2150
|
selector: 'app-sidebar',
|
|
2145
2151
|
standalone: true,
|
|
2146
2152
|
imports: [AppMenu],
|
|
2147
|
-
template: `
|
|
2148
|
-
|
|
2149
|
-
|
|
2153
|
+
template: `
|
|
2154
|
+
<div class="layout-sidebar">
|
|
2155
|
+
<app-menu />
|
|
2156
|
+
</div>
|
|
2157
|
+
`,
|
|
2150
2158
|
}]
|
|
2151
|
-
}]
|
|
2159
|
+
}] });
|
|
2152
2160
|
|
|
2153
2161
|
class AppLayout {
|
|
2154
2162
|
destroyRef = inject(DestroyRef);
|
|
@@ -2217,8 +2225,8 @@ class AppLayout {
|
|
|
2217
2225
|
'layout-mobile-active': state.staticMenuMobileActive,
|
|
2218
2226
|
};
|
|
2219
2227
|
}
|
|
2220
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.
|
|
2221
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.
|
|
2228
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppLayout, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2229
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AppLayout, isStandalone: true, selector: "app-layout", viewQueries: [{ propertyName: "appSidebar", first: true, predicate: AppSidebar, descendants: true }, { propertyName: "appTopBar", first: true, predicate: AppTopbar, descendants: true }], ngImport: i0, template: `
|
|
2222
2230
|
<div class="layout-wrapper" [ngClass]="containerClass">
|
|
2223
2231
|
<app-topbar></app-topbar>
|
|
2224
2232
|
<app-sidebar></app-sidebar>
|
|
@@ -2232,7 +2240,7 @@ class AppLayout {
|
|
|
2232
2240
|
</div>
|
|
2233
2241
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: AppTopbar, selector: "app-topbar" }, { kind: "component", type: AppSidebar, selector: "app-sidebar" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AppFooter, selector: "app-footer" }] });
|
|
2234
2242
|
}
|
|
2235
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.
|
|
2243
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppLayout, decorators: [{
|
|
2236
2244
|
type: Component,
|
|
2237
2245
|
args: [{
|
|
2238
2246
|
selector: 'app-layout',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-layout.mjs","sources":["../../../projects/ng-layout/utils/apps-filter.util.ts","../../../projects/ng-layout/utils/menu-filter.util.ts","../../../projects/ng-layout/services/layout-persistence.service.ts","../../../projects/ng-layout/services/layout.service.ts","../../../projects/ng-layout/components/app.configurator.ts","../../../projects/ng-layout/components/app.floatingconfigurator.ts","../../../projects/ng-layout/components/app.footer.ts","../../../projects/ng-layout/interfaces/layout-auth.interface.ts","../../../projects/ng-layout/components/top-bar/app.company-branch-selector.ts","../../../projects/ng-layout/components/top-bar/app.launcher.ts","../../../projects/ng-layout/components/top-bar/app.profile.ts","../../../projects/ng-layout/components/app.topbar.ts","../../../projects/ng-layout/components/app.menuitem.ts","../../../projects/ng-layout/components/app.menu.ts","../../../projects/ng-layout/components/app.sidebar.ts","../../../projects/ng-layout/components/app.layout.ts","../../../projects/ng-layout/theme/green-theme.ts","../../../projects/ng-layout/theme/navy-blue-theme.ts","../../../projects/ng-layout/public-api.ts","../../../projects/ng-layout/flusys-ng-layout.ts"],"sourcesContent":["import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { ILauncherApp } from '../interfaces/layout-auth.interface';\n\n/** Filter launcher apps based on user permission codes */\nexport function filterAppsByPermissions(\n apps: ILauncherApp[],\n permissionCodes: string[],\n): ILauncherApp[] {\n return apps.filter(\n (app) =>\n !app.permissionLogic ||\n evaluateLogicNode(app.permissionLogic, permissionCodes),\n );\n}\n","import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { IMenuItem } from '../interfaces/layout-auth.interface';\n\n/**\n * Filter menu items based on permission and role checker\n *\n * @param items - Array of menu items to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role (optional, defaults to always false)\n * @returns Filtered menu items array\n *\n * @example\n * ```typescript\n * const filteredMenu = filterMenuByPermissions(\n * menuItems,\n * (actionCode) => permissionState.hasAction(actionCode)\n * );\n * ```\n */\nexport function filterMenuByPermissions(\n items: IMenuItem[],\n permissionCode: string[],\n): IMenuItem[] {\n return items\n .map((item) => filterMenuItem(item, permissionCode))\n .filter((item): item is IMenuItem => item !== null);\n}\n\n/**\n * Filter a single menu item and its children recursively\n *\n * @param item - Menu item to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role\n * @returns Filtered menu item or null if user doesn't have permission\n */\nfunction filterMenuItem(\n item: IMenuItem,\n permissionCode: string[],\n): IMenuItem | null {\n // Skip separators - they have no permission checks\n if (item.separator) {\n return item;\n }\n\n // Check permission logic tree\n if (item.permissionLogic) {\n const hasAccess = evaluateLogicNode(item.permissionLogic, permissionCode);\n if (!hasAccess) {\n return null; // User doesn't pass permission logic\n }\n }\n\n // Filter child items recursively\n if (item.children && item.children.length > 0) {\n const filteredChildren = filterMenuByPermissions(\n item.children,\n permissionCode,\n );\n\n // If parent has no visible children, hide parent too\n if (filteredChildren.length === 0) {\n return null;\n }\n\n return { ...item, children: filteredChildren };\n }\n\n return item;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { LayoutConfig } from './layout.service';\n\nconst STORAGE_KEY = 'flusys.layout.config';\nconst STORAGE_VERSION = 1;\n\ninterface PersistedLayoutConfig extends LayoutConfig {\n _version?: number;\n}\n\n/**\n * Service for persisting layout configuration to localStorage.\n * Handles loading, saving, and validation of layout preferences with SSR-safe checks.\n *\n * @example\n * ```typescript\n * const persistence = inject(LayoutPersistenceService);\n *\n * // Load saved config\n * const config = persistence.load();\n *\n * // Save config\n * persistence.save({ darkTheme: true, preset: 'Aura' });\n *\n * // Clear saved config\n * persistence.clear();\n * ```\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LayoutPersistenceService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private readonly validPresets = ['Aura', 'Lara', 'Nora'];\n private readonly validMenuModes = ['static', 'overlay'];\n\n /**\n * Load configuration from localStorage.\n * Returns null if no saved config or invalid data.\n * SSR-safe (returns null on server).\n *\n * @returns Validated layout configuration or null\n */\n load(): LayoutConfig | null {\n if (!this.isBrowser) return null;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return null;\n\n const parsed = JSON.parse(stored) as PersistedLayoutConfig;\n return this.validateConfig(parsed);\n } catch (error) {\n console.warn('[LayoutPersistence] Failed to load config:', error);\n this.clear();\n return null;\n }\n }\n\n /**\n * Save configuration to localStorage.\n * SSR-safe (no-op on server).\n *\n * @param config Layout configuration to save\n */\n save(config: LayoutConfig): void {\n if (!this.isBrowser) return;\n\n try {\n const toStore: PersistedLayoutConfig = {\n ...config,\n _version: STORAGE_VERSION,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(toStore));\n } catch (error) {\n console.warn('[LayoutPersistence] Failed to save config:', error);\n }\n }\n\n /**\n * Clear stored configuration.\n * SSR-safe (no-op on server).\n */\n clear(): void {\n if (!this.isBrowser) return;\n localStorage.removeItem(STORAGE_KEY);\n }\n\n /**\n * Validate and sanitize configuration.\n * Returns null if version mismatch.\n *\n * @param config Configuration to validate\n * @returns Validated configuration or null\n */\n private validateConfig(config: PersistedLayoutConfig): LayoutConfig | null {\n // Version mismatch - clear and return null\n if (config._version && config._version !== STORAGE_VERSION) {\n console.warn('[LayoutPersistence] Version mismatch, clearing config');\n this.clear();\n return null;\n }\n\n // Validate preset\n if (config.preset && !this.validPresets.includes(config.preset)) {\n console.warn(\n `[LayoutPersistence] Invalid preset \"${config.preset}\", using Aura`,\n );\n config.preset = 'Aura';\n }\n\n // Validate menuMode\n if (config.menuMode && !this.validMenuModes.includes(config.menuMode)) {\n console.warn(\n `[LayoutPersistence] Invalid menuMode \"${config.menuMode}\", using static`,\n );\n config.menuMode = 'static';\n }\n\n // Validate darkTheme\n if (typeof config.darkTheme !== 'boolean') {\n config.darkTheme = false;\n }\n\n // Remove version field from returned config\n const { _version, ...cleanConfig } = config;\n return cleanConfig as LayoutConfig;\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DOCUMENT,\n effect,\n inject,\n Injectable,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport { PermissionValidatorService } from '@flusys/ng-shared';\nimport { Subject } from 'rxjs';\nimport { ILauncherApp, IMenuItem } from '../interfaces/layout-auth.interface';\nimport { filterAppsByPermissions } from '../utils/apps-filter.util';\nimport { filterMenuByPermissions } from '../utils/menu-filter.util';\nimport { LayoutPersistenceService } from './layout-persistence.service';\n\nexport interface LayoutConfig {\n preset?: string;\n primary?: string;\n surface?: string | null;\n darkTheme?: boolean;\n menuMode?: 'static' | 'overlay';\n}\n\nexport interface LayoutState {\n staticMenuDesktopInactive?: boolean;\n overlayMenuActive?: boolean;\n configSidebarVisible?: boolean;\n staticMenuMobileActive?: boolean;\n menuHoverActive?: boolean;\n}\n\nexport interface MenuChangeEvent {\n key: string;\n routeEvent?: boolean;\n}\n\n/**\n * User profile information for display in layout\n */\nexport interface UserProfile {\n id: string;\n name: string;\n email: string;\n profilePictureUrl?: string | null;\n}\n\n/**\n * Company information for display in layout\n */\nexport interface CompanyProfile {\n id: string;\n name: string;\n slug: string;\n logoUrl?: string | null;\n}\n\n/**\n * Service managing layout configuration and state.\n * Provides signals for reactive layout updates.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LayoutService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly persistence = inject(LayoutPersistenceService);\n\n private readonly defaultConfig: LayoutConfig = {\n preset: 'Aura',\n primary: 'emerald',\n surface: null,\n darkTheme: false,\n menuMode: 'static',\n };\n\n // Load persisted config merged with defaults\n private readonly initialConfig: LayoutConfig = (() => {\n const persisted = this.persistence.load();\n return persisted\n ? { ...this.defaultConfig, ...persisted }\n : this.defaultConfig;\n })();\n\n private readonly defaultState: LayoutState = {\n staticMenuDesktopInactive: false,\n overlayMenuActive: false,\n configSidebarVisible: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n };\n\n // Signals\n readonly layoutConfig = signal<LayoutConfig>(this.initialConfig);\n readonly layoutState = signal<LayoutState>(this.defaultState);\n readonly transitionComplete = signal<boolean>(false);\n\n // User Profile Signals\n readonly userProfile = signal<UserProfile | null>(null);\n readonly companyProfile = signal<CompanyProfile | null>(null);\n readonly appName = signal<string>('FLUSYS');\n\n // App Launcher Signals\n private readonly _rawApps = signal<ILauncherApp[]>([]);\n\n /**\n * Filtered launcher apps based on user permissions.\n * Automatically recomputes when raw apps or permissions change.\n */\n readonly apps = computed<ILauncherApp[]>(() => {\n const raw = this._rawApps();\n const permission = this.permissionValidator.permissions();\n return filterAppsByPermissions(raw, permission);\n });\n\n // Menu Signals\n private readonly _rawMenu = signal<IMenuItem[]>([]);\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n /**\n * Filtered menu items based on user permissions.\n * Automatically recomputes when raw menu or permission checker changes.\n * Role checker is optional - if not set, role-based permissions will be denied.\n */\n readonly menu = computed<IMenuItem[]>(() => {\n const raw = this._rawMenu(); // Track permission changes\n const permission = this.permissionValidator.permissions();\n return filterMenuByPermissions(raw, permission);\n });\n\n // Computed signals - Layout\n readonly theme = computed(() =>\n this.layoutConfig()?.darkTheme ? 'light' : 'dark',\n );\n\n readonly isSidebarActive = computed(\n () =>\n this.layoutState().overlayMenuActive ||\n this.layoutState().staticMenuMobileActive,\n );\n readonly isDarkTheme = computed(() => this.layoutConfig().darkTheme);\n readonly getPrimary = computed(() => this.layoutConfig().primary);\n readonly getSurface = computed(() => this.layoutConfig().surface);\n readonly isOverlay = computed(\n () => this.layoutConfig().menuMode === 'overlay',\n );\n\n // Computed signals - User Profile\n readonly userName = computed(() => this.userProfile()?.name ?? 'User');\n readonly userEmail = computed(() => this.userProfile()?.email ?? '');\n readonly userProfilePictureUrl = computed(\n () => this.userProfile()?.profilePictureUrl ?? null,\n );\n readonly companyName = computed(\n () => this.companyProfile()?.name ?? this.appName(),\n );\n readonly companyLogoUrl = computed(\n () => this.companyProfile()?.logoUrl ?? null,\n );\n readonly isAuthenticated = computed(() => !!this.userProfile());\n\n // Computed signals - App Launcher\n readonly hasApps = computed(() => this.apps().length > 0);\n\n // RxJS Subjects for event communication\n private readonly configUpdate = new Subject<LayoutConfig>();\n private readonly overlayOpen = new Subject<void>();\n private readonly menuSource = new Subject<MenuChangeEvent>();\n private readonly resetSource = new Subject<boolean>();\n\n readonly menuSource$ = this.menuSource.asObservable();\n readonly resetSource$ = this.resetSource.asObservable();\n readonly configUpdate$ = this.configUpdate.asObservable();\n readonly overlayOpen$ = this.overlayOpen.asObservable();\n\n private initialized = false;\n\n constructor() {\n effect(() => {\n const config = this.layoutConfig();\n if (config) {\n this.onConfigUpdate();\n }\n });\n\n effect(() => {\n const config = this.layoutConfig();\n if (!this.initialized || !config) {\n this.initialized = true;\n return;\n }\n this.handleDarkModeTransition(config);\n });\n\n // Auto-save configuration changes to localStorage\n effect(() => {\n const config = this.layoutConfig();\n if (config && this.initialized) {\n this.persistence.save(config);\n }\n });\n }\n\n private handleDarkModeTransition(config: LayoutConfig): void {\n if ((this.document as any).startViewTransition) {\n this.startViewTransition(config);\n } else {\n this.toggleDarkMode(config);\n this.onTransitionEnd();\n }\n }\n\n private startViewTransition(config: LayoutConfig): void {\n const transition = (this.document as any).startViewTransition(() => {\n this.toggleDarkMode(config);\n });\n transition.ready.then(() => this.onTransitionEnd()).catch(() => {});\n }\n\n toggleDarkMode(config?: LayoutConfig): void {\n const _config = config || this.layoutConfig();\n if (_config.darkTheme) {\n this.document.documentElement.classList.add('app-dark');\n } else {\n this.document.documentElement.classList.remove('app-dark');\n }\n }\n\n private onTransitionEnd(): void {\n this.transitionComplete.set(true);\n setTimeout(() => this.transitionComplete.set(false));\n }\n\n onMenuToggle(): void {\n if (this.isOverlay()) {\n this.layoutState.update((prev) => ({\n ...prev,\n overlayMenuActive: !this.layoutState().overlayMenuActive,\n }));\n if (this.layoutState().overlayMenuActive) {\n this.overlayOpen.next();\n }\n }\n\n if (this.isDesktop()) {\n this.layoutState.update((prev) => ({\n ...prev,\n staticMenuDesktopInactive:\n !this.layoutState().staticMenuDesktopInactive,\n }));\n } else {\n this.layoutState.update((prev) => ({\n ...prev,\n staticMenuMobileActive: !this.layoutState().staticMenuMobileActive,\n }));\n if (this.layoutState().staticMenuMobileActive) {\n this.overlayOpen.next();\n }\n }\n }\n\n isDesktop(): boolean {\n return this.isBrowser ? window.innerWidth > 991 : true;\n }\n\n isMobile(): boolean {\n return !this.isDesktop();\n }\n\n onConfigUpdate(): void {\n this.configUpdate.next(this.layoutConfig());\n }\n\n onMenuStateChange(event: MenuChangeEvent): void {\n this.menuSource.next(event);\n }\n\n reset(): void {\n this.resetSource.next(true);\n }\n\n // ==========================================================================\n // User Profile Methods\n // ==========================================================================\n\n /**\n * Set the current user profile for display in layout.\n * Called by auth integration to sync user data.\n */\n setUserProfile(profile: UserProfile | null): void {\n this.userProfile.set(profile);\n }\n\n /**\n * Set the current company profile for display in layout.\n * Called by auth integration to sync company data.\n */\n setCompanyProfile(profile: CompanyProfile | null): void {\n this.companyProfile.set(profile);\n }\n\n // ==========================================================================\n // Menu Methods\n // ==========================================================================\n\n /**\n * Set the raw menu items (unfiltered).\n * Menu will be automatically filtered based on permission checker.\n * Called by app initialization to set menu from IAM or other source.\n */\n setMenu(items: IMenuItem[]): void {\n this._rawMenu.set(items);\n }\n\n /**\n * Clear menu and permission/role checkers.\n * Called on logout.\n */\n clearMenu(): void {\n this._rawMenu.set([]);\n }\n\n // ==========================================================================\n // App Launcher Methods\n // ==========================================================================\n\n /**\n * Set launcher apps for display in header.\n * Apps will be automatically filtered based on user permissions.\n * If empty after filtering, the app launcher button is hidden.\n */\n setApps(apps: ILauncherApp[]): void {\n this._rawApps.set(apps);\n }\n\n /**\n * Clear launcher apps.\n * Called on logout.\n */\n clearApps(): void {\n this._rawApps.set([]);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { $t, updatePreset, updateSurfacePalette } from '@primeuix/themes';\nimport Aura from '@primeuix/themes/aura';\nimport Lara from '@primeuix/themes/lara';\nimport Nora from '@primeuix/themes/nora';\nimport { PrimeNG } from 'primeng/config';\nimport { SelectButtonModule } from 'primeng/selectbutton';\nimport { LayoutService } from '../services/public-api';\nimport { PlatformService } from '@flusys/ng-shared';\n\nconst presets = {\n Aura,\n Lara,\n Nora,\n} as const;\n\ndeclare type KeyOfType<T> = keyof T extends infer U ? U : never;\n\ndeclare type SurfacesType = {\n name?: string;\n palette?: {\n 0?: string;\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n 950?: string;\n };\n};\n\n@Component({\n selector: 'app-configurator',\n standalone: true,\n imports: [CommonModule, FormsModule, SelectButtonModule],\n template: `\n <div class=\"flex flex-col gap-4\">\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">Primary</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (primaryColor of primaryColors(); track primaryColor.name) {\n <button\n type=\"button\"\n [title]=\"primaryColor.name\"\n (click)=\"updateColors($event, 'primary', primaryColor)\"\n [ngClass]=\"{\n 'outline-primary': primaryColor.name === selectedPrimaryColor()\n }\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style]=\"{\n 'background-color': primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']\n }\"\n ></button>\n }\n </div>\n </div>\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">Surface</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (surface of surfaces; track surface.name) {\n <button\n type=\"button\"\n [title]=\"surface.name\"\n (click)=\"updateColors($event, 'surface', surface)\"\n [ngClass]=\"{\n 'outline-primary': selectedSurfaceColor()\n ? selectedSurfaceColor() === surface.name\n : layoutService.layoutConfig().darkTheme\n ? surface.name === 'zinc'\n : surface.name === 'slate'\n }\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style]=\"{\n 'background-color': surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']\n }\"\n ></button>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">Presets</span>\n <p-selectbutton\n [options]=\"presets\"\n [ngModel]=\"selectedPreset()\"\n (ngModelChange)=\"onPresetChange($event)\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n @if (showMenuModeButton()) {\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">Menu Mode</span>\n <p-selectbutton\n [ngModel]=\"menuMode()\"\n (ngModelChange)=\"onMenuModeChange($event)\"\n [options]=\"menuModeOptions\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n }\n </div>\n `,\n host: {\n class:\n 'hidden absolute top-[3.25rem] right-0 w-72 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]',\n style: 'background-color: var(--surface-overlay)',\n },\n})\nexport class AppConfigurator {\n router = inject(Router);\n config: PrimeNG = inject(PrimeNG);\n layoutService: LayoutService = inject(LayoutService);\n platformService: PlatformService = inject(PlatformService);\n\n primeng = inject(PrimeNG);\n\n presets = Object.keys(presets);\n\n showMenuModeButton = signal(!this.router.url.includes('auth'));\n\n menuModeOptions = [\n { label: 'Static', value: 'static' },\n { label: 'Overlay', value: 'overlay' },\n ];\n\n ngOnInit() {\n if (!this.platformService.isServer) {\n this.onPresetChange(this.layoutService.layoutConfig().preset);\n }\n }\n\n surfaces: SurfacesType[] = [\n {\n name: 'slate',\n palette: {\n 0: '#ffffff',\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n },\n {\n name: 'gray',\n palette: {\n 0: '#ffffff',\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n },\n {\n name: 'zinc',\n palette: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f4f4f5',\n 200: '#e4e4e7',\n 300: '#d4d4d8',\n 400: '#a1a1aa',\n 500: '#71717a',\n 600: '#52525b',\n 700: '#3f3f46',\n 800: '#27272a',\n 900: '#18181b',\n 950: '#09090b',\n },\n },\n {\n name: 'neutral',\n palette: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#e5e5e5',\n 300: '#d4d4d4',\n 400: '#a3a3a3',\n 500: '#737373',\n 600: '#525252',\n 700: '#404040',\n 800: '#262626',\n 900: '#171717',\n 950: '#0a0a0a',\n },\n },\n {\n name: 'stone',\n palette: {\n 0: '#ffffff',\n 50: '#fafaf9',\n 100: '#f5f5f4',\n 200: '#e7e5e4',\n 300: '#d6d3d1',\n 400: '#a8a29e',\n 500: '#78716c',\n 600: '#57534e',\n 700: '#44403c',\n 800: '#292524',\n 900: '#1c1917',\n 950: '#0c0a09',\n },\n },\n {\n name: 'soho',\n palette: {\n 0: '#ffffff',\n 50: '#ececec',\n 100: '#dedfdf',\n 200: '#c4c4c6',\n 300: '#adaeb0',\n 400: '#97979b',\n 500: '#7f8084',\n 600: '#6a6b70',\n 700: '#55565b',\n 800: '#3f4046',\n 900: '#2c2c34',\n 950: '#16161d',\n },\n },\n {\n name: 'viva',\n palette: {\n 0: '#ffffff',\n 50: '#f3f3f3',\n 100: '#e7e7e8',\n 200: '#cfd0d0',\n 300: '#b7b8b9',\n 400: '#9fa1a1',\n 500: '#87898a',\n 600: '#6e7173',\n 700: '#565a5b',\n 800: '#3e4244',\n 900: '#262b2c',\n 950: '#0e1315',\n },\n },\n {\n name: 'ocean',\n palette: {\n 0: '#ffffff',\n 50: '#fbfcfc',\n 100: '#F7F9F8',\n 200: '#EFF3F2',\n 300: '#DADEDD',\n 400: '#B1B7B6',\n 500: '#828787',\n 600: '#5F7274',\n 700: '#415B61',\n 800: '#29444E',\n 900: '#183240',\n 950: '#0c1920',\n },\n },\n ];\n\n selectedPrimaryColor = computed(() => {\n return this.layoutService.layoutConfig().primary;\n });\n\n selectedSurfaceColor = computed(\n () => this.layoutService.layoutConfig().surface\n );\n\n selectedPreset = computed(() => this.layoutService.layoutConfig().preset);\n\n menuMode = computed(() => this.layoutService.layoutConfig().menuMode);\n\n primaryColors = computed<SurfacesType[]>(() => {\n const presetPalette =\n presets[\n this.layoutService.layoutConfig().preset as KeyOfType<typeof presets>\n ].primitive;\n const colors = [\n 'emerald',\n 'green',\n 'lime',\n 'orange',\n 'amber',\n 'yellow',\n 'teal',\n 'cyan',\n 'sky',\n 'blue',\n 'indigo',\n 'violet',\n 'purple',\n 'fuchsia',\n 'pink',\n 'rose',\n ];\n const palettes: SurfacesType[] = [{ name: 'noir', palette: {} }];\n\n colors.forEach((color) => {\n palettes.push({\n name: color,\n palette: presetPalette?.[\n color as KeyOfType<typeof presetPalette>\n ] as SurfacesType['palette'],\n });\n });\n\n return palettes;\n });\n\n getPresetExt() {\n const color: SurfacesType =\n this.primaryColors().find(\n (c) => c.name === this.selectedPrimaryColor()\n ) || {};\n const preset = this.layoutService.layoutConfig().preset;\n\n if (color.name === 'noir') {\n return {\n semantic: {\n primary: {\n 50: '{surface.50}',\n 100: '{surface.100}',\n 200: '{surface.200}',\n 300: '{surface.300}',\n 400: '{surface.400}',\n 500: '{surface.500}',\n 600: '{surface.600}',\n 700: '{surface.700}',\n 800: '{surface.800}',\n 900: '{surface.900}',\n 950: '{surface.950}',\n },\n colorScheme: {\n light: {\n primary: {\n color: '{primary.950}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.800}',\n activeColor: '{primary.700}',\n },\n highlight: {\n background: '{primary.950}',\n focusBackground: '{primary.700}',\n color: '#ffffff',\n focusColor: '#ffffff',\n },\n },\n dark: {\n primary: {\n color: '{primary.50}',\n contrastColor: '{primary.950}',\n hoverColor: '{primary.200}',\n activeColor: '{primary.300}',\n },\n highlight: {\n background: '{primary.50}',\n focusBackground: '{primary.300}',\n color: '{primary.950}',\n focusColor: '{primary.950}',\n },\n },\n },\n },\n };\n } else {\n if (preset === 'Nora') {\n return {\n semantic: {\n primary: color.palette,\n colorScheme: {\n light: {\n primary: {\n color: '{primary.600}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.700}',\n activeColor: '{primary.800}',\n },\n highlight: {\n background: '{primary.600}',\n focusBackground: '{primary.700}',\n color: '#ffffff',\n focusColor: '#ffffff',\n },\n },\n dark: {\n primary: {\n color: '{primary.500}',\n contrastColor: '{surface.900}',\n hoverColor: '{primary.400}',\n activeColor: '{primary.300}',\n },\n highlight: {\n background: '{primary.500}',\n focusBackground: '{primary.400}',\n color: '{surface.900}',\n focusColor: '{surface.900}',\n },\n },\n },\n },\n };\n } else {\n return {\n semantic: {\n primary: color.palette,\n colorScheme: {\n light: {\n primary: {\n color: '{primary.500}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.600}',\n activeColor: '{primary.700}',\n },\n highlight: {\n background: '{primary.50}',\n focusBackground: '{primary.100}',\n color: '{primary.700}',\n focusColor: '{primary.800}',\n },\n },\n dark: {\n primary: {\n color: '{primary.400}',\n contrastColor: '{surface.900}',\n hoverColor: '{primary.300}',\n activeColor: '{primary.200}',\n },\n highlight: {\n background:\n 'color-mix(in srgb, {primary.400}, transparent 84%)',\n focusBackground:\n 'color-mix(in srgb, {primary.400}, transparent 76%)',\n color: 'rgba(255,255,255,.87)',\n focusColor: 'rgba(255,255,255,.87)',\n },\n },\n },\n },\n };\n }\n }\n }\n\n updateColors(event: any, type: string, color: any) {\n if (type === 'primary') {\n this.layoutService.layoutConfig.update((state) => ({\n ...state,\n primary: color.name,\n }));\n } else if (type === 'surface') {\n this.layoutService.layoutConfig.update((state) => ({\n ...state,\n surface: color.name,\n }));\n }\n this.applyTheme(type, color);\n\n event.stopPropagation();\n }\n\n applyTheme(type: string, color: any) {\n if (type === 'primary') {\n updatePreset(this.getPresetExt());\n } else if (type === 'surface') {\n updateSurfacePalette(color.palette);\n }\n }\n\n onPresetChange(event: any) {\n this.layoutService.layoutConfig.update((state) => ({\n ...state,\n preset: event,\n }));\n const preset = presets[event as KeyOfType<typeof presets>];\n const surfacePalette = this.surfaces.find(\n (s) => s.name === this.selectedSurfaceColor()\n )?.palette;\n $t()\n .preset(preset)\n .preset(this.getPresetExt())\n .surfacePalette(surfacePalette)\n .use({ useDefaultOptions: true });\n }\n\n onMenuModeChange(event: 'static' | 'overlay') {\n this.layoutService.layoutConfig.update((prev) => ({\n ...prev,\n menuMode: event,\n }));\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { ButtonModule } from 'primeng/button';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { AppConfigurator } from './app.configurator';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-floating-configurator',\n imports: [ButtonModule, StyleClassModule, AppConfigurator],\n template: `\n <div class=\"fixed flex flex-col md:flex-row gap-4 top-8 right-0 md:right-8 z-99\">\n <p-button type=\"button\" (onClick)=\"toggleDarkMode()\" [rounded]=\"true\" [icon]=\"isDarkTheme() ? 'pi pi-moon' : 'pi pi-sun'\" severity=\"secondary\" />\n <div class=\"relative\">\n <p-button icon=\"pi pi-palette\" pStyleClass=\"@next\" enterFromClass=\"hidden\" enterActiveClass=\"animate-scalein\" leaveToClass=\"hidden\" leaveActiveClass=\"animate-fadeout\" [hideOnOutsideClick]=\"true\" type=\"button\" rounded />\n <app-configurator />\n </div>\n </div>\n `\n})\nexport class AppFloatingConfigurator {\n LayoutService = inject(LayoutService);\n\n isDarkTheme = computed(() => this.LayoutService.layoutConfig().darkTheme);\n\n toggleDarkMode() {\n this.LayoutService.layoutConfig.update((state) => ({ ...state, darkTheme: !state.darkTheme }));\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n standalone: true,\n selector: 'app-footer',\n template: `<div class=\"layout-footer\">\n {{ companyName() }} by\n <a href=\"https://flusys.vercel.app\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-primary font-bold hover:underline\">Flusys</a>\n </div>`,\n})\nexport class AppFooter {\n private readonly layoutService = inject(LayoutService);\n\n // Use layoutService.companyName which falls back to appName\n readonly companyName = this.layoutService.companyName;\n}\n","import { InjectionToken, Signal } from '@angular/core';\nimport type { IconTypeEnum, ILogicNode } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\n\nexport interface ILauncherApp {\n id: string;\n name: string;\n iconType: IconTypeEnum;\n icon: string;\n url: string;\n /** Optional permission logic - if set, app only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ICompanyInfo {\n id: string;\n name: string;\n slug: string;\n imageId: string;\n}\n\nexport interface IBranchInfo {\n id: string;\n name: string;\n slug: string;\n imageId?: string;\n}\n\nexport interface IUserInfo {\n id: string;\n name: string;\n email: string;\n profilePicture?: { url: string } | null;\n}\n\nexport interface IMenuItem {\n id?: string;\n label?: string;\n icon?: string;\n iconType?: number;\n routerLink?: string[];\n children?: IMenuItem[];\n parent?: { id: string } | null;\n separator?: boolean;\n /** Optional permission logic - if set, item only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ILayoutAuthState {\n currentCompanyInfo: Signal<ICompanyInfo | null>;\n currentBranchInfo: Signal<IBranchInfo | null>;\n loginUserData: Signal<IUserInfo | null>;\n}\n\nexport interface ILayoutAuthApi {\n logOut(): Observable<any>;\n navigateLogin(withUrl?: boolean): void;\n switchCompany(companyId: string, branchId: string): Observable<any>;\n getUserCompanies(): Observable<ICompanyInfo[]>;\n getCompanyBranches(companyId: string): Observable<IBranchInfo[]>;\n}\n\nexport const LAYOUT_AUTH_STATE = new InjectionToken<ILayoutAuthState>(\n 'LAYOUT_AUTH_STATE',\n);\n\nexport const LAYOUT_AUTH_API = new InjectionToken<ILayoutAuthApi>(\n 'LAYOUT_AUTH_API',\n);\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AngularModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { ButtonModule } from 'primeng/button';\nimport { SelectModule } from 'primeng/select';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type { IBranchInfo, ICompanyInfo } from '../../interfaces/public-api';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\n\n/** Company/branch switcher displayed in top bar */\n@Component({\n selector: 'app-company-branch-selector',\n standalone: true,\n imports: [AngularModule, StyleClassModule, ButtonModule, SelectModule],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"onPanelToggle()\"\n >\n <i class=\"pi pi-building\"></i>\n <span>{{ currentCompanyName() }}</span>\n @if (currentBranchName()) {\n <span class=\"text-xs opacity-70\"> | {{ currentBranchName() }}</span>\n }\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] right-0 z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]\"\n style=\"background-color: var(--surface-overlay)\"\n >\n <div class=\"flex flex-col gap-4 min-w-[280px]\">\n <span class=\"text-sm text-muted-color font-semibold\"\n >Switch Company & Branch</span\n >\n\n <!-- Company Selector -->\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">Company</label>\n <p-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"onCompanyChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select Company\"\n class=\"w-full\"\n [loading]=\"isLoadingCompanies()\"\n />\n </div>\n\n <!-- Branch Selector -->\n @if (selectedCompanyId() && branches().length > 0) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">Branch</label>\n <p-select\n [options]=\"branches()\"\n [ngModel]=\"selectedBranchId()\"\n (ngModelChange)=\"onBranchChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select Branch\"\n class=\"w-full\"\n [loading]=\"isLoadingBranches()\"\n />\n </div>\n }\n\n <!-- Actions -->\n <div class=\"flex gap-2 pt-2\">\n <p-button\n label=\"Switch\"\n icon=\"pi pi-sync\"\n styleClass=\"flex-1\"\n [loading]=\"isSwitching()\"\n [disabled]=\"!canSwitch()\"\n (onClick)=\"onSwitch()\"\n />\n </div>\n </div>\n </div>\n `,\n})\nexport class AppCompanyBranchSelector {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly messageService = inject(MessageService);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n readonly isActive = signal(false);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.isActive.set(false);\n }\n });\n }\n\n readonly currentCompanyName = computed(\n () => this.authState?.currentCompanyInfo()?.name ?? 'No Company',\n );\n readonly currentBranchName = computed(\n () => this.authState?.currentBranchInfo()?.name ?? null,\n );\n\n readonly companies = signal<ICompanyInfo[]>([]);\n readonly branches = signal<IBranchInfo[]>([]);\n readonly selectedCompanyId = signal<string | null>(null);\n readonly selectedBranchId = signal<string | null>(null);\n readonly isLoadingCompanies = signal(false);\n readonly isLoadingBranches = signal(false);\n readonly isSwitching = signal(false);\n\n readonly canSwitch = computed(() => {\n const selectedCompany = this.selectedCompanyId();\n if (!selectedCompany) return false;\n\n const currentCompanyId = this.authState?.currentCompanyInfo()?.id;\n const currentBranchId = this.authState?.currentBranchInfo()?.id;\n const selectedBranch = this.selectedBranchId();\n\n return selectedCompany !== currentCompanyId || selectedBranch !== currentBranchId;\n });\n\n onPanelToggle(): void {\n this.isActive.update((v) => !v);\n if (this.isActive() && this.companies().length === 0) {\n this.loadCompanies();\n }\n }\n\n private loadCompanies(): void {\n if (!this.authApi) return;\n\n this.isLoadingCompanies.set(true);\n this.authApi\n .getUserCompanies()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (companies) => {\n this.companies.set(companies);\n this.isLoadingCompanies.set(false);\n },\n error: (err) => {\n this.isLoadingCompanies.set(false);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: err?.message || 'Failed to load companies',\n });\n },\n });\n }\n\n onCompanyChange(companyId: string | null): void {\n this.selectedCompanyId.set(companyId);\n\n if (!companyId) {\n this.branches.set([]);\n this.selectedBranchId.set(null);\n return;\n }\n\n this.loadBranches(companyId);\n }\n\n onBranchChange(branchId: string | null): void {\n this.selectedBranchId.set(branchId);\n }\n\n private loadBranches(companyId: string): void {\n if (!this.authApi) return;\n\n this.isLoadingBranches.set(true);\n this.selectedBranchId.set(null);\n\n this.authApi\n .getCompanyBranches(companyId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (branches) => {\n this.branches.set(branches);\n this.isLoadingBranches.set(false);\n\n // Auto-select if only one branch available\n if (branches.length === 1) {\n this.selectedBranchId.set(branches[0].id);\n }\n },\n error: (err) => {\n this.isLoadingBranches.set(false);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: err?.message || 'Failed to load branches',\n });\n },\n });\n }\n\n onSwitch(): void {\n const selectedCompany = this.selectedCompanyId();\n const selectedBranch = this.selectedBranchId();\n\n if (!this.authApi || !selectedCompany) return;\n\n if (this.branches().length > 0 && !selectedBranch) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Branch Required',\n detail: 'Please select a branch',\n });\n return;\n }\n\n this.isSwitching.set(true);\n\n this.authApi\n .switchCompany(selectedCompany, selectedBranch || '')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {},\n error: (err) => {\n this.isSwitching.set(false);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: err?.message || 'Failed to switch company',\n });\n },\n });\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Component, DestroyRef, ElementRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IconComponent } from '@flusys/ng-shared';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-launcher',\n standalone: true,\n imports: [StyleClassModule, IconComponent],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\"\n >\n <i class=\"pi pi-th-large\"></i>\n <span>Apps</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] right-0 z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]\"\n style=\"background-color: var(--surface-overlay)\"\n >\n <div class=\"flex flex-col gap-2 min-w-[240px]\">\n <span class=\"text-sm text-muted-color font-semibold\">Applications</span>\n <div class=\"grid grid-cols-3 gap-2\">\n @for (app of layoutService.apps(); track app.id) {\n <a\n class=\"group flex flex-col items-center w-20 p-2 rounded-border cursor-pointer no-underline transition-all duration-200 hover:bg-emphasis\"\n [href]=\"app.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <div\n class=\"flex items-center justify-center w-10 h-10 rounded-border bg-emphasis group-hover:bg-primary transition-all duration-200\"\n >\n <lib-icon\n [icon]=\"app.icon\"\n [iconType]=\"app.iconType\"\n class=\"text-xl text-primary group-hover:text-primary-contrast transition-colors duration-200\"\n />\n </div>\n <span\n class=\"text-xs mt-2 text-center text-muted-color group-hover:text-color transition-colors duration-200\"\n >{{ app.name }}</span\n >\n </a>\n }\n </div>\n </div>\n </div>\n `,\n})\nexport class AppLauncher {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n public readonly layoutService = inject(LayoutService);\n\n readonly isActive = signal(false);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this.isActive.update((v) => !v);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AngularModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\n\n@Component({\n selector: 'app-profile',\n standalone: true,\n imports: [AngularModule, StyleClassModule],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\"\n >\n <i class=\"pi pi-user\"></i>\n <span>Profile</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] right-0 z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]\"\n style=\"background-color: var(--surface-overlay)\"\n >\n <div class=\"flex flex-col gap-3 min-w-[240px]\">\n <!-- User Info -->\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline hover:bg-emphasis transition-all duration-200\"\n routerLink=\"/profile\"\n >\n @if (profilePicture()) {\n <img\n [src]=\"profilePicture()\"\n class=\"w-12 h-12 rounded-border object-cover\"\n alt=\"Profile\"\n />\n } @else {\n <div\n class=\"w-12 h-12 rounded-border bg-primary flex items-center justify-center\"\n >\n <i class=\"pi pi-user text-xl text-primary-contrast\"></i>\n </div>\n }\n <div class=\"flex flex-col\">\n <span class=\"font-semibold text-color\">{{ userName() }}</span>\n <span class=\"text-sm text-muted-color\">{{ userEmail() }}</span>\n </div>\n </a>\n\n <!-- Divider -->\n <div class=\"border-t border-surface\"></div>\n\n <!-- Menu Items -->\n <div class=\"flex flex-col gap-1\">\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"copySignUpLink()\"\n >\n <i class=\"pi pi-link text-muted-color\"></i>\n <span>Copy SignUp Link</span>\n </a>\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"logout()\"\n >\n <i class=\"pi pi-sign-out text-muted-color\"></i>\n <span>Logout</span>\n </a>\n </div>\n </div>\n </div>\n `,\n})\nexport class AppProfile {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly messageService = inject(MessageService);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n readonly isActive = signal(false);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this.isActive.update((v) => !v);\n }\n\n userName = computed(() => this.authState?.loginUserData()?.name ?? 'Guest');\n userEmail = computed(() => this.authState?.loginUserData()?.email ?? '');\n profilePicture = computed(\n () => this.authState?.loginUserData()?.profilePicture?.url ?? '',\n );\n\n logout() {\n if (!this.authApi) return;\n\n this.authApi\n .logOut()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (result: any) => {\n this.messageService.add({\n severity: 'success',\n summary: 'Success!',\n detail: result.message,\n });\n this.authApi?.navigateLogin(false);\n },\n error: (err) => {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: err?.message || 'Failed to logout',\n });\n },\n });\n }\n\n copySignUpLink() {\n const slug = this.authState?.currentCompanyInfo()?.slug ?? '';\n const signUpLink = `${window.location.origin}/auth/register?companySlug=${slug}`;\n navigator.clipboard\n .writeText(signUpLink)\n .then(() => {\n this.messageService.add({\n severity: 'success',\n summary: 'Link Copied',\n detail: 'Sign Up Link copied.',\n });\n })\n .catch((err) => {\n console.error('Failed to copy signup link: ', err);\n this.messageService.add({\n severity: 'error',\n summary: 'Sorry',\n detail: 'Failed to copy signup link.',\n });\n });\n }\n}\n","import { CommonModule, DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterModule } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { LayoutService } from '../services/public-api';\nimport { AppConfigurator } from './app.configurator';\nimport { AppCompanyBranchSelector } from './top-bar/app.company-branch-selector';\nimport { AppLauncher } from './top-bar/app.launcher';\nimport { AppProfile } from './top-bar/app.profile';\n\ntype ActivePanel = 'config' | null;\n\n@Component({\n selector: 'app-topbar',\n standalone: true,\n imports: [\n RouterModule,\n CommonModule,\n StyleClassModule,\n AppConfigurator,\n AppProfile,\n AppCompanyBranchSelector,\n AppLauncher,\n ],\n template: ` <div class=\"layout-topbar\">\n <div class=\"layout-topbar-logo-container\">\n <button\n class=\"layout-menu-button layout-topbar-action\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <i class=\"pi pi-bars\"></i>\n </button>\n <a class=\"layout-topbar-logo\" routerLink=\"/\">\n <span>{{ companyName() }}</span>\n </a>\n </div>\n\n <div class=\"layout-topbar-actions\">\n <div class=\"layout-config-menu\">\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n (click)=\"toggleDarkMode()\"\n >\n <i\n [ngClass]=\"{\n 'pi ': true,\n 'pi-moon': layoutService.isDarkTheme(),\n 'pi-sun': !layoutService.isDarkTheme(),\n }\"\n ></i>\n </button>\n <div class=\"relative\" #configContainer>\n <button\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"activePanel() === 'config'\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel('config')\"\n >\n <i class=\"pi pi-palette\"></i>\n </button>\n <app-configurator />\n </div>\n </div>\n\n <button\n class=\"layout-topbar-menu-button layout-topbar-action\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n >\n <i class=\"pi pi-ellipsis-v\"></i>\n </button>\n\n <div class=\"layout-topbar-menu hidden lg:block\">\n <div class=\"layout-topbar-menu-content\">\n @if (layoutService.hasApps()) {\n <app-launcher />\n }\n @if (enableCompanyFeature()) {\n <app-company-branch-selector />\n }\n <app-profile />\n </div>\n </div>\n </div>\n </div>`,\n})\nexport class AppTopbar {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n readonly layoutService = inject(LayoutService);\n\n private readonly configContainer =\n viewChild<ElementRef<HTMLElement>>('configContainer');\n\n readonly activePanel = signal<ActivePanel>(null);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.activePanel() !== null),\n )\n .subscribe((event) => {\n this.handleOutsideClick(event);\n });\n }\n\n // Use layoutService.companyName which falls back to appName\n readonly companyName = this.layoutService.companyName;\n\n enableCompanyFeature = computed(() => {\n return isCompanyFeatureEnabled(this.appConfig);\n });\n\n toggleDarkMode() {\n this.layoutService.layoutConfig.update((state) => ({\n ...state,\n darkTheme: !state.darkTheme,\n }));\n }\n\n togglePanel(panel: ActivePanel) {\n this.activePanel.update((current) => (current === panel ? null : panel));\n }\n\n private handleOutsideClick(event: MouseEvent) {\n const target = event.target as HTMLElement;\n const configEl = this.configContainer()?.nativeElement;\n\n if (configEl && !configEl.contains(target)) {\n this.activePanel.set(null);\n }\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { IconComponent } from '@flusys/ng-shared';\nimport { RippleModule } from 'primeng/ripple';\nimport { filter } from 'rxjs/operators';\nimport { IMenuItem, LAYOUT_AUTH_STATE } from '../interfaces/public-api';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: '[app-menuitem]',\n standalone: true,\n imports: [IconComponent, RouterModule, RippleModule],\n template: `\n <ng-container>\n @if (item().children?.length) {\n <a (click)=\"itemClick()\" tabindex=\"0\" pRipple>\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{ item().label }}</span>\n @if (item().children) {\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"></i>\n }\n </a>\n }\n @if (item().routerLink && !item().children?.length) {\n <a\n (click)=\"itemClick()\"\n [routerLink]=\"routerLink()\"\n routerLinkActive=\"active-route\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n tabindex=\"0\"\n pRipple\n >\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{ item().label }}</span>\n </a>\n }\n @if (item().children) {\n <ul\n [class.submenu-expanded]=\"active()\"\n [class.submenu-collapsed]=\"!active()\"\n >\n @for (\n child of item().children;\n track 'menu' + child.id + '' + i;\n let i = $index\n ) {\n <li\n app-menuitem\n [item]=\"child\"\n [index]=\"i\"\n [parentKey]=\"key()\"\n ></li>\n }\n </ul>\n }\n </ng-container>\n `,\n styles: `\n :host ul {\n overflow: hidden;\n transition: max-height 400ms cubic-bezier(0.86, 0, 0.07, 1);\n }\n :host ul.submenu-collapsed {\n max-height: 0;\n }\n :host ul.submenu-expanded {\n max-height: 1000px;\n }\n `,\n host: {\n '[class.active-menuitem]': 'active()',\n },\n})\nexport class AppMenuitem {\n // Signal inputs\n readonly item = input.required<IMenuItem>();\n readonly index = input.required<number>();\n readonly parentKey = input<string>('');\n\n // Injected services\n private readonly router = inject(Router);\n private readonly layoutService = inject(LayoutService);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n\n // State signals\n readonly active = signal(false);\n\n // Computed signals\n readonly key = computed(() => {\n const parent = this.parentKey();\n return parent ? `${parent}-${this.index()}` : String(this.index());\n });\n\n readonly routerLink = computed(() => {\n const menuItem = this.item();\n return menuItem.routerLink ?? [];\n });\n\n // Computed options for routerLinkActive - use 'exact' for root, 'subset' for others\n readonly routerLinkActiveOptions = computed(() => {\n const link = this.routerLink();\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n return {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n } as const;\n });\n\n constructor() {\n // Subscribe to menu source changes\n this.layoutService.menuSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n Promise.resolve(null).then(() => {\n const currentKey = this.key();\n if (value.routeEvent) {\n this.active.set(\n value.key === currentKey ||\n value.key?.startsWith(currentKey + '-'),\n );\n } else if (\n value.key !== currentKey &&\n !value.key?.startsWith(currentKey + '-')\n ) {\n this.active.set(false);\n }\n });\n });\n\n // Subscribe to menu reset\n this.layoutService.resetSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.active.set(false));\n\n // Subscribe to navigation events\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n if (this.item().routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n\n // Effect to update active state on init when item has routerLink\n effect(() => {\n const menuItem = this.item();\n if (menuItem.routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n }\n\n private updateActiveStateFromRoute(): void {\n const link = this.routerLink();\n if (!link.length) return;\n\n // Use 'exact' for root path to avoid matching all routes\n // Use 'subset' for all other paths to match child routes\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n\n const isActive = this.router.isActive(link[0], {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n });\n\n if (isActive) {\n this.layoutService.onMenuStateChange({\n key: this.key(),\n routeEvent: true,\n });\n }\n }\n\n itemClick(): void {\n if (this.item().children) {\n this.active.update((prev) => !prev);\n }\n this.layoutService.onMenuStateChange({ key: this.key() });\n }\n}\n","import { Component, inject } from '@angular/core';\n\nimport { RouterModule } from '@angular/router';\nimport { LayoutService } from '../services/layout.service';\nimport { AppMenuitem } from './app.menuitem';\n\n/**\n * Main menu component that displays filtered menu items.\n * Menu is automatically filtered based on user permissions using the permission checker (logicNode pattern).\n * The filtering happens internally in LayoutService via computed signal.\n */\n@Component({\n selector: 'app-menu',\n standalone: true,\n imports: [AppMenuitem, RouterModule],\n template: `<div class=\"layout-menu\">\n <ul>\n @for (\n item of menuItems();\n track 'menu' + item.id + '' + i;\n let i = $index\n ) {\n <li app-menuitem [item]=\"item\" [index]=\"i\"></li>\n }\n </ul>\n </div>`,\n})\nexport class AppMenu {\n private readonly layoutService = inject(LayoutService);\n\n /**\n * Filtered menu items from layout service.\n * This signal is computed in LayoutService and automatically updates when:\n * - Raw menu changes (setMenu called)\n * - Permission state changes (user permissions updated)\n */\n readonly menuItems = this.layoutService.menu;\n}\n","import { Component, ElementRef } from '@angular/core';\nimport { AppMenu } from './app.menu';\n\n@Component({\n selector: 'app-sidebar',\n standalone: true,\n imports: [AppMenu],\n template: ` <div class=\"layout-sidebar\">\n <app-menu></app-menu>\n </div>`\n})\nexport class AppSidebar {\n constructor(public el: ElementRef) {}\n}\n","import { Component, DestroyRef, inject, Renderer2, ViewChild, DOCUMENT } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CommonModule } from '@angular/common';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AppTopbar } from './app.topbar';\nimport { AppSidebar } from './app.sidebar';\nimport { AppFooter } from './app.footer';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-layout',\n standalone: true,\n imports: [CommonModule, AppTopbar, AppSidebar, RouterModule, AppFooter],\n template: `\n <div class=\"layout-wrapper\" [ngClass]=\"containerClass\">\n <app-topbar></app-topbar>\n <app-sidebar></app-sidebar>\n <div class=\"layout-main-container\">\n <div class=\"layout-main\">\n <router-outlet></router-outlet>\n </div>\n <app-footer></app-footer>\n </div>\n <div class=\"layout-mask animate-fadein\"></div>\n </div>\n `,\n})\nexport class AppLayout {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n readonly layoutService = inject(LayoutService);\n private readonly renderer = inject(Renderer2);\n private readonly router = inject(Router);\n\n private menuOutsideClickListener: (() => void) | null = null;\n\n @ViewChild(AppSidebar) appSidebar!: AppSidebar;\n @ViewChild(AppTopbar) appTopBar!: AppTopbar;\n\n constructor() {\n this.layoutService.overlayOpen$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (!this.menuOutsideClickListener) {\n this.menuOutsideClickListener = this.renderer.listen(\n this.document,\n 'click',\n (event) => {\n if (this.isOutsideClicked(event)) {\n this.hideMenu();\n }\n }\n );\n }\n if (this.layoutService.layoutState().staticMenuMobileActive) {\n this.blockBodyScroll();\n }\n });\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => this.hideMenu());\n }\n\n isOutsideClicked(event: MouseEvent): boolean {\n const sidebarEl = this.document.querySelector('.layout-sidebar');\n const topbarEl = this.document.querySelector('.layout-menu-button');\n const eventTarget = event.target as Node;\n\n return !(\n sidebarEl?.isSameNode(eventTarget) ||\n sidebarEl?.contains(eventTarget) ||\n topbarEl?.isSameNode(eventTarget) ||\n topbarEl?.contains(eventTarget)\n );\n }\n\n hideMenu(): void {\n this.layoutService.layoutState.update((prev) => ({\n ...prev,\n overlayMenuActive: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n }));\n if (this.menuOutsideClickListener) {\n this.menuOutsideClickListener();\n this.menuOutsideClickListener = null;\n }\n this.unblockBodyScroll();\n }\n\n blockBodyScroll(): void {\n this.document.body.classList.add('blocked-scroll');\n }\n\n unblockBodyScroll(): void {\n this.document.body.classList.remove('blocked-scroll');\n }\n\n get containerClass() {\n const config = this.layoutService.layoutConfig();\n const state = this.layoutService.layoutState();\n return {\n 'layout-overlay': config.menuMode === 'overlay',\n 'layout-static': config.menuMode === 'static',\n 'layout-static-inactive': state.staticMenuDesktopInactive && config.menuMode === 'static',\n 'layout-overlay-active': state.overlayMenuActive,\n 'layout-mobile-active': state.staticMenuMobileActive,\n };\n }\n}\n","\nimport Material from '@primeuix/themes/material';\nimport { definePreset } from '@primeuix/themes';\n\nexport const GreenTheme = definePreset(Material, {\n semantic: {\n colorScheme: {\n light: {\n primary: {\n color: '#01712c',\n inverseColor: '#119744',\n hoverColor: '#119744',\n activeColor: '#119744',\n },\n highlight: {\n background: '#e2e8f0',\n focusBackground: '#e2e8f0',\n color: '#01712c',\n focusColor: '#01712c',\n },\n },\n },\n },\n});","\nimport Material from '@primeuix/themes/material';\nimport { definePreset } from '@primeuix/themes';\n\nexport const NavyBlueTheme = definePreset(Material, {\n semantic: {\n colorScheme: {\n light: {\n primary: {\n color: '#3535cd',\n inverseColor: '#0707a9',\n hoverColor: '#0707a9',\n activeColor: '#0707a9',\n },\n highlight: {\n background: '#e2e8f0',\n focusBackground: '#e2e8f0',\n color: '#3535cd',\n focusColor: '#3535cd',\n },\n },\n },\n },\n });","// Components\nexport * from './components/app.configurator';\nexport * from './components/app.floatingconfigurator';\nexport * from './components/app.footer';\nexport * from './components/app.layout';\nexport * from './components/app.menu';\nexport * from './components/app.menuitem';\nexport * from './components/app.sidebar';\nexport * from './components/app.topbar';\nexport * from './components/top-bar/app.company-branch-selector';\nexport * from './components/top-bar/app.launcher';\nexport * from './components/top-bar/app.profile';\n\n// Interfaces\nexport * from './interfaces/layout-auth.interface';\n\n// Services\nexport * from './services/layout-persistence.service';\nexport * from './services/layout.service';\n\n// Utils\nexport * from './utils/apps-filter.util';\nexport * from './utils/menu-filter.util';\n\n// Themes\nexport * from './theme/green-theme';\nexport * from './theme/navy-blue-theme';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","DOCUMENT","i3","filter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flusys-ng-layout.mjs","sources":["../../../projects/ng-layout/utils/apps-filter.util.ts","../../../projects/ng-layout/utils/menu-filter.util.ts","../../../projects/ng-layout/services/layout-persistence.service.ts","../../../projects/ng-layout/services/layout.service.ts","../../../projects/ng-layout/components/app.configurator.ts","../../../projects/ng-layout/components/app.floatingconfigurator.ts","../../../projects/ng-layout/components/app.footer.ts","../../../projects/ng-layout/interfaces/layout-auth.interface.ts","../../../projects/ng-layout/components/top-bar/app.company-branch-selector.ts","../../../projects/ng-layout/components/top-bar/app.launcher.ts","../../../projects/ng-layout/components/top-bar/app.profile.ts","../../../projects/ng-layout/components/app.topbar.ts","../../../projects/ng-layout/components/app.menuitem.ts","../../../projects/ng-layout/components/app.menu.ts","../../../projects/ng-layout/components/app.sidebar.ts","../../../projects/ng-layout/components/app.layout.ts","../../../projects/ng-layout/theme/green-theme.ts","../../../projects/ng-layout/theme/navy-blue-theme.ts","../../../projects/ng-layout/public-api.ts","../../../projects/ng-layout/flusys-ng-layout.ts"],"sourcesContent":["import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { ILauncherApp } from '../interfaces/layout-auth.interface';\n\n/** Filter launcher apps based on user permission codes */\nexport function filterAppsByPermissions(\n apps: ILauncherApp[],\n permissionCodes: string[],\n): ILauncherApp[] {\n return apps.filter(\n (app) =>\n !app.permissionLogic ||\n evaluateLogicNode(app.permissionLogic, permissionCodes),\n );\n}\n","import { evaluateLogicNode } from '@flusys/ng-shared';\nimport { IMenuItem } from '../interfaces/layout-auth.interface';\n\n/**\n * Filter menu items based on permission and role checker\n *\n * @param items - Array of menu items to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role (optional, defaults to always false)\n * @returns Filtered menu items array\n *\n * @example\n * ```typescript\n * const filteredMenu = filterMenuByPermissions(\n * menuItems,\n * (actionCode) => permissionState.hasAction(actionCode)\n * );\n * ```\n */\nexport function filterMenuByPermissions(\n items: IMenuItem[],\n permissionCode: string[],\n): IMenuItem[] {\n return items\n .map((item) => filterMenuItem(item, permissionCode))\n .filter((item): item is IMenuItem => item !== null);\n}\n\n/**\n * Filter a single menu item and its children recursively\n *\n * @param item - Menu item to filter\n * @param hasPermission - Function to check if user has permission\n * @param hasRole - Function to check if user has role\n * @returns Filtered menu item or null if user doesn't have permission\n */\nfunction filterMenuItem(\n item: IMenuItem,\n permissionCode: string[],\n): IMenuItem | null {\n // Skip separators - they have no permission checks\n if (item.separator) {\n return item;\n }\n\n // Check permission logic tree\n if (item.permissionLogic) {\n const hasAccess = evaluateLogicNode(item.permissionLogic, permissionCode);\n if (!hasAccess) {\n return null; // User doesn't pass permission logic\n }\n }\n\n // Filter child items recursively\n if (item.children && item.children.length > 0) {\n const filteredChildren = filterMenuByPermissions(\n item.children,\n permissionCode,\n );\n\n // If parent has no visible children, hide parent too\n if (filteredChildren.length === 0) {\n return null;\n }\n\n return { ...item, children: filteredChildren };\n }\n\n return item;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { LayoutConfig } from './layout.service';\n\nconst STORAGE_KEY = 'flusys.layout.config';\nconst STORAGE_VERSION = 1;\n\ninterface PersistedLayoutConfig extends LayoutConfig {\n _version?: number;\n}\n\n/**\n * Service for persisting layout configuration to localStorage.\n * Handles loading, saving, and validation of layout preferences with SSR-safe checks.\n *\n * @example\n * ```typescript\n * const persistence = inject(LayoutPersistenceService);\n *\n * // Load saved config\n * const config = persistence.load();\n *\n * // Save config\n * persistence.save({ darkTheme: true, preset: 'Aura' });\n *\n * // Clear saved config\n * persistence.clear();\n * ```\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LayoutPersistenceService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n\n private readonly validPresets = ['Aura', 'Lara', 'Nora'];\n private readonly validMenuModes = ['static', 'overlay'];\n\n /**\n * Load configuration from localStorage.\n * Returns null if no saved config or invalid data.\n * SSR-safe (returns null on server).\n *\n * @returns Validated layout configuration or null\n */\n load(): LayoutConfig | null {\n if (!this.isBrowser) return null;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (!stored) return null;\n\n const parsed = JSON.parse(stored) as PersistedLayoutConfig;\n return this.validateConfig(parsed);\n } catch {\n this.clear();\n return null;\n }\n }\n\n /**\n * Save configuration to localStorage.\n * SSR-safe (no-op on server).\n *\n * @param config Layout configuration to save\n */\n save(config: LayoutConfig): void {\n if (!this.isBrowser) return;\n\n try {\n const toStore: PersistedLayoutConfig = {\n ...config,\n _version: STORAGE_VERSION,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(toStore));\n } catch {\n // Silent fail - localStorage may be full or disabled\n }\n }\n\n /**\n * Clear stored configuration.\n * SSR-safe (no-op on server).\n */\n clear(): void {\n if (!this.isBrowser) return;\n localStorage.removeItem(STORAGE_KEY);\n }\n\n /**\n * Validate and sanitize configuration.\n * Returns null if version mismatch.\n *\n * @param config Configuration to validate\n * @returns Validated configuration or null\n */\n private validateConfig(config: PersistedLayoutConfig): LayoutConfig | null {\n // Version mismatch - clear and return null\n if (config._version && config._version !== STORAGE_VERSION) {\n this.clear();\n return null;\n }\n\n // Validate preset - silently fix invalid values\n if (config.preset && !this.validPresets.includes(config.preset)) {\n config.preset = 'Aura';\n }\n\n // Validate menuMode - silently fix invalid values\n if (config.menuMode && !this.validMenuModes.includes(config.menuMode)) {\n config.menuMode = 'static';\n }\n\n // Validate darkTheme\n if (typeof config.darkTheme !== 'boolean') {\n config.darkTheme = false;\n }\n\n // Remove version field from returned config\n const { _version, ...cleanConfig } = config;\n return cleanConfig as LayoutConfig;\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DOCUMENT,\n effect,\n inject,\n Injectable,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport { APP_CONFIG, DEFAULT_APP_NAME, DEFAULT_AUTHOR, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { PermissionValidatorService } from '@flusys/ng-shared';\nimport { Subject } from 'rxjs';\nimport { ILauncherApp, IMenuItem } from '../interfaces/layout-auth.interface';\nimport { filterAppsByPermissions } from '../utils/apps-filter.util';\nimport { filterMenuByPermissions } from '../utils/menu-filter.util';\nimport { LayoutPersistenceService } from './layout-persistence.service';\n\nexport interface LayoutConfig {\n preset?: string;\n primary?: string;\n surface?: string | null;\n darkTheme?: boolean;\n menuMode?: 'static' | 'overlay';\n}\n\nexport interface LayoutState {\n staticMenuDesktopInactive?: boolean;\n overlayMenuActive?: boolean;\n configSidebarVisible?: boolean;\n staticMenuMobileActive?: boolean;\n menuHoverActive?: boolean;\n}\n\nexport interface MenuChangeEvent {\n key: string;\n routeEvent?: boolean;\n}\n\n/**\n * User profile information for display in layout\n */\nexport interface UserProfile {\n id: string;\n name: string;\n email: string;\n profilePictureUrl?: string | null;\n}\n\n/**\n * Company information for display in layout\n */\nexport interface CompanyProfile {\n id: string;\n name: string;\n slug: string;\n logoUrl?: string | null;\n}\n\n/**\n * Service managing layout configuration and state.\n * Provides signals for reactive layout updates.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LayoutService {\n private readonly document = inject(DOCUMENT);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly persistence = inject(LayoutPersistenceService);\n private readonly appConfig = inject(APP_CONFIG, { optional: true });\n\n private readonly defaultConfig: LayoutConfig = {\n preset: 'Aura',\n primary: 'emerald',\n surface: null,\n darkTheme: false,\n menuMode: 'static',\n };\n\n // Load persisted config merged with defaults\n private readonly initialConfig: LayoutConfig = (() => {\n const persisted = this.persistence.load();\n return persisted\n ? { ...this.defaultConfig, ...persisted }\n : this.defaultConfig;\n })();\n\n private readonly defaultState: LayoutState = {\n staticMenuDesktopInactive: false,\n overlayMenuActive: false,\n configSidebarVisible: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n };\n\n // Signals\n readonly layoutConfig = signal<LayoutConfig>(this.initialConfig);\n readonly layoutState = signal<LayoutState>(this.defaultState);\n readonly transitionComplete = signal<boolean>(false);\n\n // User Profile Signals\n readonly userProfile = signal<UserProfile | null>(null);\n readonly companyProfile = signal<CompanyProfile | null>(null);\n readonly appName = signal<string>(this.appConfig?.appName ?? DEFAULT_APP_NAME);\n\n // Author/Brand Signals\n readonly authorName = signal<string>(this.appConfig?.author?.name ?? DEFAULT_AUTHOR.name);\n readonly authorUrl = signal<string>(this.appConfig?.author?.url ?? DEFAULT_AUTHOR.url);\n\n // App Launcher Signals\n private readonly _rawApps = signal<ILauncherApp[]>([]);\n\n /**\n * Filtered launcher apps based on user permissions.\n * Automatically recomputes when raw apps or permissions change.\n */\n readonly apps = computed<ILauncherApp[]>(() => {\n const raw = this._rawApps();\n const permission = this.permissionValidator.permissions();\n return filterAppsByPermissions(raw, permission);\n });\n\n // Menu Signals\n private readonly _rawMenu = signal<IMenuItem[]>([]);\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n /**\n * Filtered menu items based on user permissions.\n * Automatically recomputes when raw menu or permission checker changes.\n * Role checker is optional - if not set, role-based permissions will be denied.\n */\n readonly menu = computed<IMenuItem[]>(() => {\n const raw = this._rawMenu(); // Track permission changes\n const permission = this.permissionValidator.permissions();\n return filterMenuByPermissions(raw, permission);\n });\n\n // Computed signals - Layout\n readonly isSidebarActive = computed(\n () =>\n this.layoutState().overlayMenuActive ||\n this.layoutState().staticMenuMobileActive,\n );\n readonly isDarkTheme = computed(() => this.layoutConfig().darkTheme);\n readonly getPrimary = computed(() => this.layoutConfig().primary);\n readonly getSurface = computed(() => this.layoutConfig().surface);\n readonly isOverlay = computed(\n () => this.layoutConfig().menuMode === 'overlay',\n );\n\n // Computed signals - User Profile\n readonly userName = computed(() => this.userProfile()?.name ?? 'User');\n readonly userEmail = computed(() => this.userProfile()?.email ?? '');\n readonly userProfilePictureUrl = computed(\n () => this.userProfile()?.profilePictureUrl ?? null,\n );\n readonly companyName = computed(() => {\n // If company feature is disabled, always show app name\n if (!this.appConfig || !isCompanyFeatureEnabled(this.appConfig)) {\n return this.appName();\n }\n return this.companyProfile()?.name ?? this.appName();\n });\n readonly companyLogoUrl = computed(\n () => this.companyProfile()?.logoUrl ?? null,\n );\n readonly isAuthenticated = computed(() => !!this.userProfile());\n\n // Computed signals - App Launcher\n readonly hasApps = computed(() => this.apps().length > 0);\n\n // RxJS Subjects for event communication\n private readonly configUpdate = new Subject<LayoutConfig>();\n private readonly overlayOpen = new Subject<void>();\n private readonly menuSource = new Subject<MenuChangeEvent>();\n private readonly resetSource = new Subject<boolean>();\n\n readonly menuSource$ = this.menuSource.asObservable();\n readonly resetSource$ = this.resetSource.asObservable();\n readonly configUpdate$ = this.configUpdate.asObservable();\n readonly overlayOpen$ = this.overlayOpen.asObservable();\n\n private initialized = false;\n\n constructor() {\n effect(() => {\n const config = this.layoutConfig();\n if (config) {\n this.onConfigUpdate();\n }\n });\n\n effect(() => {\n const config = this.layoutConfig();\n if (!this.initialized || !config) {\n this.initialized = true;\n return;\n }\n this.handleDarkModeTransition(config);\n });\n\n // Auto-save configuration changes to localStorage\n effect(() => {\n const config = this.layoutConfig();\n if (config && this.initialized) {\n this.persistence.save(config);\n }\n });\n }\n\n private handleDarkModeTransition(config: LayoutConfig): void {\n if ((this.document as any).startViewTransition) {\n this.startViewTransition(config);\n } else {\n this.toggleDarkMode(config);\n this.onTransitionEnd();\n }\n }\n\n private startViewTransition(config: LayoutConfig): void {\n const transition = (this.document as any).startViewTransition(() => {\n this.toggleDarkMode(config);\n });\n transition.ready.then(() => this.onTransitionEnd()).catch(() => {});\n }\n\n toggleDarkMode(config?: LayoutConfig): void {\n const _config = config || this.layoutConfig();\n if (_config.darkTheme) {\n this.document.documentElement.classList.add('app-dark');\n } else {\n this.document.documentElement.classList.remove('app-dark');\n }\n }\n\n private onTransitionEnd(): void {\n this.transitionComplete.set(true);\n setTimeout(() => this.transitionComplete.set(false));\n }\n\n onMenuToggle(): void {\n if (this.isOverlay()) {\n this.layoutState.update((prev) => ({\n ...prev,\n overlayMenuActive: !this.layoutState().overlayMenuActive,\n }));\n if (this.layoutState().overlayMenuActive) {\n this.overlayOpen.next();\n }\n }\n\n if (this.isDesktop()) {\n this.layoutState.update((prev) => ({\n ...prev,\n staticMenuDesktopInactive:\n !this.layoutState().staticMenuDesktopInactive,\n }));\n } else {\n this.layoutState.update((prev) => ({\n ...prev,\n staticMenuMobileActive: !this.layoutState().staticMenuMobileActive,\n }));\n if (this.layoutState().staticMenuMobileActive) {\n this.overlayOpen.next();\n }\n }\n }\n\n isDesktop(): boolean {\n return this.isBrowser ? window.innerWidth > 991 : true;\n }\n\n isMobile(): boolean {\n return !this.isDesktop();\n }\n\n onConfigUpdate(): void {\n this.configUpdate.next(this.layoutConfig());\n }\n\n onMenuStateChange(event: MenuChangeEvent): void {\n this.menuSource.next(event);\n }\n\n reset(): void {\n this.resetSource.next(true);\n }\n\n // ==========================================================================\n // User Profile Methods\n // ==========================================================================\n\n /**\n * Set the current user profile for display in layout.\n * Called by auth integration to sync user data.\n */\n setUserProfile(profile: UserProfile | null): void {\n this.userProfile.set(profile);\n }\n\n /**\n * Set the current company profile for display in layout.\n * Called by auth integration to sync company data.\n */\n setCompanyProfile(profile: CompanyProfile | null): void {\n this.companyProfile.set(profile);\n }\n\n // ==========================================================================\n // Menu Methods\n // ==========================================================================\n\n /**\n * Set the raw menu items (unfiltered).\n * Menu will be automatically filtered based on permission checker.\n * Called by app initialization to set menu from IAM or other source.\n */\n setMenu(items: IMenuItem[]): void {\n this._rawMenu.set(items);\n }\n\n /**\n * Clear menu and permission/role checkers.\n * Called on logout.\n */\n clearMenu(): void {\n this._rawMenu.set([]);\n }\n\n // ==========================================================================\n // App Launcher Methods\n // ==========================================================================\n\n /**\n * Set launcher apps for display in header.\n * Apps will be automatically filtered based on user permissions.\n * If empty after filtering, the app launcher button is hidden.\n */\n setApps(apps: ILauncherApp[]): void {\n this._rawApps.set(apps);\n }\n\n /**\n * Clear launcher apps.\n * Called on logout.\n */\n clearApps(): void {\n this._rawApps.set([]);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { $t, updatePreset, updateSurfacePalette } from '@primeuix/themes';\nimport Aura from '@primeuix/themes/aura';\nimport Lara from '@primeuix/themes/lara';\nimport Nora from '@primeuix/themes/nora';\nimport { PrimeNG } from 'primeng/config';\nimport { SelectButtonModule } from 'primeng/selectbutton';\nimport { LayoutService } from '../services/public-api';\nimport { PlatformService } from '@flusys/ng-shared';\n\nconst presets = {\n Aura,\n Lara,\n Nora,\n} as const;\n\ndeclare type KeyOfType<T> = keyof T extends infer U ? U : never;\n\ndeclare type SurfacesType = {\n name?: string;\n palette?: {\n 0?: string;\n 50?: string;\n 100?: string;\n 200?: string;\n 300?: string;\n 400?: string;\n 500?: string;\n 600?: string;\n 700?: string;\n 800?: string;\n 900?: string;\n 950?: string;\n };\n};\n\n@Component({\n selector: 'app-configurator',\n standalone: true,\n imports: [CommonModule, FormsModule, SelectButtonModule],\n template: `\n <div class=\"flex flex-col gap-4\">\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">Primary</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (primaryColor of primaryColors(); track primaryColor.name) {\n <button\n type=\"button\"\n [title]=\"primaryColor.name\"\n (click)=\"updateColors($event, 'primary', primaryColor)\"\n [ngClass]=\"{\n 'outline-primary': primaryColor.name === selectedPrimaryColor()\n }\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style]=\"{\n 'background-color': primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']\n }\"\n ></button>\n }\n </div>\n </div>\n <div>\n <span class=\"text-sm text-muted-color font-semibold\">Surface</span>\n <div class=\"pt-2 flex gap-2 flex-wrap justify-start\">\n @for (surface of surfaces; track surface.name) {\n <button\n type=\"button\"\n [title]=\"surface.name\"\n (click)=\"updateColors($event, 'surface', surface)\"\n [ngClass]=\"{\n 'outline-primary': selectedSurfaceColor()\n ? selectedSurfaceColor() === surface.name\n : layoutService.layoutConfig().darkTheme\n ? surface.name === 'zinc'\n : surface.name === 'slate'\n }\"\n class=\"border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1\"\n [style]=\"{\n 'background-color': surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']\n }\"\n ></button>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">Presets</span>\n <p-selectbutton\n [options]=\"presets\"\n [ngModel]=\"selectedPreset()\"\n (ngModelChange)=\"onPresetChange($event)\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n @if (showMenuModeButton()) {\n <div class=\"flex flex-col gap-2\">\n <span class=\"text-sm text-muted-color font-semibold\">Menu Mode</span>\n <p-selectbutton\n [ngModel]=\"menuMode()\"\n (ngModelChange)=\"onMenuModeChange($event)\"\n [options]=\"menuModeOptions\"\n [allowEmpty]=\"false\"\n size=\"small\"\n />\n </div>\n }\n </div>\n `,\n host: {\n class:\n 'hidden absolute top-[3.25rem] right-0 w-72 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]',\n style: 'background-color: var(--surface-overlay)',\n },\n})\nexport class AppConfigurator {\n private readonly router = inject(Router);\n private readonly primeng = inject(PrimeNG);\n readonly layoutService = inject(LayoutService);\n private readonly platformService = inject(PlatformService);\n\n presets = Object.keys(presets);\n\n showMenuModeButton = signal(!this.router.url.includes('auth'));\n\n menuModeOptions = [\n { label: 'Static', value: 'static' },\n { label: 'Overlay', value: 'overlay' },\n ];\n\n ngOnInit() {\n if (!this.platformService.isServer) {\n this.onPresetChange(this.layoutService.layoutConfig().preset);\n }\n }\n\n surfaces: SurfacesType[] = [\n {\n name: 'slate',\n palette: {\n 0: '#ffffff',\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n },\n {\n name: 'gray',\n palette: {\n 0: '#ffffff',\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#030712',\n },\n },\n {\n name: 'zinc',\n palette: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f4f4f5',\n 200: '#e4e4e7',\n 300: '#d4d4d8',\n 400: '#a1a1aa',\n 500: '#71717a',\n 600: '#52525b',\n 700: '#3f3f46',\n 800: '#27272a',\n 900: '#18181b',\n 950: '#09090b',\n },\n },\n {\n name: 'neutral',\n palette: {\n 0: '#ffffff',\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#e5e5e5',\n 300: '#d4d4d4',\n 400: '#a3a3a3',\n 500: '#737373',\n 600: '#525252',\n 700: '#404040',\n 800: '#262626',\n 900: '#171717',\n 950: '#0a0a0a',\n },\n },\n {\n name: 'stone',\n palette: {\n 0: '#ffffff',\n 50: '#fafaf9',\n 100: '#f5f5f4',\n 200: '#e7e5e4',\n 300: '#d6d3d1',\n 400: '#a8a29e',\n 500: '#78716c',\n 600: '#57534e',\n 700: '#44403c',\n 800: '#292524',\n 900: '#1c1917',\n 950: '#0c0a09',\n },\n },\n {\n name: 'soho',\n palette: {\n 0: '#ffffff',\n 50: '#ececec',\n 100: '#dedfdf',\n 200: '#c4c4c6',\n 300: '#adaeb0',\n 400: '#97979b',\n 500: '#7f8084',\n 600: '#6a6b70',\n 700: '#55565b',\n 800: '#3f4046',\n 900: '#2c2c34',\n 950: '#16161d',\n },\n },\n {\n name: 'viva',\n palette: {\n 0: '#ffffff',\n 50: '#f3f3f3',\n 100: '#e7e7e8',\n 200: '#cfd0d0',\n 300: '#b7b8b9',\n 400: '#9fa1a1',\n 500: '#87898a',\n 600: '#6e7173',\n 700: '#565a5b',\n 800: '#3e4244',\n 900: '#262b2c',\n 950: '#0e1315',\n },\n },\n {\n name: 'ocean',\n palette: {\n 0: '#ffffff',\n 50: '#fbfcfc',\n 100: '#F7F9F8',\n 200: '#EFF3F2',\n 300: '#DADEDD',\n 400: '#B1B7B6',\n 500: '#828787',\n 600: '#5F7274',\n 700: '#415B61',\n 800: '#29444E',\n 900: '#183240',\n 950: '#0c1920',\n },\n },\n ];\n\n selectedPrimaryColor = computed(() => {\n return this.layoutService.layoutConfig().primary;\n });\n\n selectedSurfaceColor = computed(\n () => this.layoutService.layoutConfig().surface\n );\n\n selectedPreset = computed(() => this.layoutService.layoutConfig().preset);\n\n menuMode = computed(() => this.layoutService.layoutConfig().menuMode);\n\n primaryColors = computed<SurfacesType[]>(() => {\n const presetPalette =\n presets[\n this.layoutService.layoutConfig().preset as KeyOfType<typeof presets>\n ].primitive;\n const colors = [\n 'emerald',\n 'green',\n 'lime',\n 'orange',\n 'amber',\n 'yellow',\n 'teal',\n 'cyan',\n 'sky',\n 'blue',\n 'indigo',\n 'violet',\n 'purple',\n 'fuchsia',\n 'pink',\n 'rose',\n ];\n const palettes: SurfacesType[] = [{ name: 'noir', palette: {} }];\n\n colors.forEach((color) => {\n palettes.push({\n name: color,\n palette: presetPalette?.[\n color as KeyOfType<typeof presetPalette>\n ] as SurfacesType['palette'],\n });\n });\n\n return palettes;\n });\n\n getPresetExt() {\n const color: SurfacesType =\n this.primaryColors().find(\n (c) => c.name === this.selectedPrimaryColor()\n ) || {};\n const preset = this.layoutService.layoutConfig().preset;\n\n if (color.name === 'noir') {\n return {\n semantic: {\n primary: {\n 50: '{surface.50}',\n 100: '{surface.100}',\n 200: '{surface.200}',\n 300: '{surface.300}',\n 400: '{surface.400}',\n 500: '{surface.500}',\n 600: '{surface.600}',\n 700: '{surface.700}',\n 800: '{surface.800}',\n 900: '{surface.900}',\n 950: '{surface.950}',\n },\n colorScheme: {\n light: {\n primary: {\n color: '{primary.950}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.800}',\n activeColor: '{primary.700}',\n },\n highlight: {\n background: '{primary.950}',\n focusBackground: '{primary.700}',\n color: '#ffffff',\n focusColor: '#ffffff',\n },\n },\n dark: {\n primary: {\n color: '{primary.50}',\n contrastColor: '{primary.950}',\n hoverColor: '{primary.200}',\n activeColor: '{primary.300}',\n },\n highlight: {\n background: '{primary.50}',\n focusBackground: '{primary.300}',\n color: '{primary.950}',\n focusColor: '{primary.950}',\n },\n },\n },\n },\n };\n } else {\n if (preset === 'Nora') {\n return {\n semantic: {\n primary: color.palette,\n colorScheme: {\n light: {\n primary: {\n color: '{primary.600}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.700}',\n activeColor: '{primary.800}',\n },\n highlight: {\n background: '{primary.600}',\n focusBackground: '{primary.700}',\n color: '#ffffff',\n focusColor: '#ffffff',\n },\n },\n dark: {\n primary: {\n color: '{primary.500}',\n contrastColor: '{surface.900}',\n hoverColor: '{primary.400}',\n activeColor: '{primary.300}',\n },\n highlight: {\n background: '{primary.500}',\n focusBackground: '{primary.400}',\n color: '{surface.900}',\n focusColor: '{surface.900}',\n },\n },\n },\n },\n };\n } else {\n return {\n semantic: {\n primary: color.palette,\n colorScheme: {\n light: {\n primary: {\n color: '{primary.500}',\n contrastColor: '#ffffff',\n hoverColor: '{primary.600}',\n activeColor: '{primary.700}',\n },\n highlight: {\n background: '{primary.50}',\n focusBackground: '{primary.100}',\n color: '{primary.700}',\n focusColor: '{primary.800}',\n },\n },\n dark: {\n primary: {\n color: '{primary.400}',\n contrastColor: '{surface.900}',\n hoverColor: '{primary.300}',\n activeColor: '{primary.200}',\n },\n highlight: {\n background:\n 'color-mix(in srgb, {primary.400}, transparent 84%)',\n focusBackground:\n 'color-mix(in srgb, {primary.400}, transparent 76%)',\n color: 'rgba(255,255,255,.87)',\n focusColor: 'rgba(255,255,255,.87)',\n },\n },\n },\n },\n };\n }\n }\n }\n\n updateColors(event: any, type: string, color: any) {\n if (type === 'primary') {\n this.layoutService.layoutConfig.update((state) => ({\n ...state,\n primary: color.name,\n }));\n } else if (type === 'surface') {\n this.layoutService.layoutConfig.update((state) => ({\n ...state,\n surface: color.name,\n }));\n }\n this.applyTheme(type, color);\n\n event.stopPropagation();\n }\n\n applyTheme(type: string, color: any) {\n if (type === 'primary') {\n updatePreset(this.getPresetExt());\n } else if (type === 'surface') {\n updateSurfacePalette(color.palette);\n }\n }\n\n onPresetChange(event: any) {\n this.layoutService.layoutConfig.update((state) => ({\n ...state,\n preset: event,\n }));\n const preset = presets[event as KeyOfType<typeof presets>];\n const surfacePalette = this.surfaces.find(\n (s) => s.name === this.selectedSurfaceColor()\n )?.palette;\n $t()\n .preset(preset)\n .preset(this.getPresetExt())\n .surfacePalette(surfacePalette)\n .use({ useDefaultOptions: true });\n }\n\n onMenuModeChange(event: 'static' | 'overlay') {\n this.layoutService.layoutConfig.update((prev) => ({\n ...prev,\n menuMode: event,\n }));\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { ButtonModule } from 'primeng/button';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { AppConfigurator } from './app.configurator';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-floating-configurator',\n imports: [ButtonModule, StyleClassModule, AppConfigurator],\n template: `\n <div class=\"fixed flex flex-col md:flex-row gap-4 top-8 right-0 md:right-8 z-99\">\n <p-button type=\"button\" (onClick)=\"toggleDarkMode()\" [rounded]=\"true\" [icon]=\"isDarkTheme() ? 'pi pi-moon' : 'pi pi-sun'\" severity=\"secondary\" />\n <div class=\"relative\">\n <p-button icon=\"pi pi-palette\" pStyleClass=\"@next\" enterFromClass=\"hidden\" enterActiveClass=\"animate-scalein\" leaveToClass=\"hidden\" leaveActiveClass=\"animate-fadeout\" [hideOnOutsideClick]=\"true\" type=\"button\" rounded />\n <app-configurator />\n </div>\n </div>\n `\n})\nexport class AppFloatingConfigurator {\n LayoutService = inject(LayoutService);\n\n isDarkTheme = computed(() => this.LayoutService.layoutConfig().darkTheme);\n\n toggleDarkMode() {\n this.LayoutService.layoutConfig.update((state) => ({ ...state, darkTheme: !state.darkTheme }));\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n standalone: true,\n selector: 'app-footer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<div class=\"layout-footer\">\n {{ appName() }} by\n <a [href]=\"authorUrl()\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-primary font-bold hover:underline\">{{ authorName() }}</a>\n </div>`,\n})\nexport class AppFooter {\n private readonly layoutService = inject(LayoutService);\n\n // Footer shows product branding (appName), not user's company\n readonly appName = this.layoutService.appName;\n readonly authorName = this.layoutService.authorName;\n readonly authorUrl = this.layoutService.authorUrl;\n}\n","import { InjectionToken, Signal } from '@angular/core';\nimport type { IconTypeEnum, ILogicNode } from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\n\nexport interface ILauncherApp {\n id: string;\n name: string;\n iconType: IconTypeEnum;\n icon: string;\n url: string;\n /** Optional permission logic - if set, app only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ICompanyInfo {\n id: string;\n name: string;\n slug: string;\n imageId: string;\n}\n\nexport interface IBranchInfo {\n id: string;\n name: string;\n slug: string;\n imageId?: string;\n}\n\nexport interface IUserInfo {\n id: string;\n name: string;\n email: string;\n profilePicture?: { url: string } | null;\n}\n\nexport interface IMenuItem {\n id?: string;\n label?: string;\n icon?: string;\n iconType?: number;\n routerLink?: string[];\n children?: IMenuItem[];\n parent?: { id: string } | null;\n separator?: boolean;\n /** Optional permission logic - if set, item only visible when logic passes */\n permissionLogic?: ILogicNode | null;\n}\n\nexport interface ILayoutAuthState {\n currentCompanyInfo: Signal<ICompanyInfo | null>;\n currentBranchInfo: Signal<IBranchInfo | null>;\n loginUserData: Signal<IUserInfo | null>;\n}\n\nexport interface ILayoutAuthApi {\n logOut(): Observable<any>;\n navigateLogin(withUrl?: boolean): void;\n switchCompany(companyId: string, branchId: string): Observable<any>;\n getUserCompanies(): Observable<ICompanyInfo[]>;\n getCompanyBranches(companyId: string): Observable<IBranchInfo[]>;\n}\n\nexport const LAYOUT_AUTH_STATE = new InjectionToken<ILayoutAuthState>(\n 'LAYOUT_AUTH_STATE',\n);\n\nexport const LAYOUT_AUTH_API = new InjectionToken<ILayoutAuthApi>(\n 'LAYOUT_AUTH_API',\n);\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AngularModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { ButtonModule } from 'primeng/button';\nimport { SelectModule } from 'primeng/select';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type { IBranchInfo, ICompanyInfo } from '../../interfaces/public-api';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\n\n/** Company/branch switcher displayed in top bar */\n@Component({\n selector: 'app-company-branch-selector',\n standalone: true,\n imports: [AngularModule, StyleClassModule, ButtonModule, SelectModule],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"onPanelToggle()\"\n >\n <i class=\"pi pi-building\"></i>\n <span>{{ currentCompanyName() }}</span>\n @if (currentBranchName()) {\n <span class=\"text-xs opacity-70\"> | {{ currentBranchName() }}</span>\n }\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] right-0 z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]\"\n style=\"background-color: var(--surface-overlay)\"\n >\n <div class=\"flex flex-col gap-4 min-w-[280px]\">\n <span class=\"text-sm text-muted-color font-semibold\"\n >Switch Company & Branch</span\n >\n\n <!-- Company Selector -->\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">Company</label>\n <p-select\n [options]=\"companies()\"\n [ngModel]=\"selectedCompanyId()\"\n (ngModelChange)=\"onCompanyChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select Company\"\n class=\"w-full\"\n [loading]=\"isLoadingCompanies()\"\n />\n </div>\n\n <!-- Branch Selector -->\n @if (selectedCompanyId() && branches().length > 0) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm text-muted-color font-semibold\">Branch</label>\n <p-select\n [options]=\"branches()\"\n [ngModel]=\"selectedBranchId()\"\n (ngModelChange)=\"onBranchChange($event)\"\n optionLabel=\"name\"\n optionValue=\"id\"\n placeholder=\"Select Branch\"\n class=\"w-full\"\n [loading]=\"isLoadingBranches()\"\n />\n </div>\n }\n\n <!-- Actions -->\n <div class=\"flex gap-2 pt-2\">\n <p-button\n label=\"Switch\"\n icon=\"pi pi-sync\"\n styleClass=\"flex-1\"\n [loading]=\"isSwitching()\"\n [disabled]=\"!canSwitch()\"\n (onClick)=\"onSwitch()\"\n />\n </div>\n </div>\n </div>\n `,\n})\nexport class AppCompanyBranchSelector {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly messageService = inject(MessageService);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n readonly isActive = signal(false);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.isActive.set(false);\n }\n });\n }\n\n readonly currentCompanyName = computed(\n () => this.authState?.currentCompanyInfo()?.name ?? 'No Company',\n );\n readonly currentBranchName = computed(\n () => this.authState?.currentBranchInfo()?.name ?? null,\n );\n\n readonly companies = signal<ICompanyInfo[]>([]);\n readonly branches = signal<IBranchInfo[]>([]);\n readonly selectedCompanyId = signal<string | null>(null);\n readonly selectedBranchId = signal<string | null>(null);\n readonly isLoadingCompanies = signal(false);\n readonly isLoadingBranches = signal(false);\n readonly isSwitching = signal(false);\n\n readonly canSwitch = computed(() => {\n const selectedCompany = this.selectedCompanyId();\n if (!selectedCompany) return false;\n\n const currentCompanyId = this.authState?.currentCompanyInfo()?.id;\n const currentBranchId = this.authState?.currentBranchInfo()?.id;\n const selectedBranch = this.selectedBranchId();\n\n return selectedCompany !== currentCompanyId || selectedBranch !== currentBranchId;\n });\n\n onPanelToggle(): void {\n this.isActive.update((v) => !v);\n if (this.isActive() && this.companies().length === 0) {\n this.loadCompanies();\n }\n }\n\n private loadCompanies(): void {\n if (!this.authApi) return;\n\n this.isLoadingCompanies.set(true);\n this.authApi\n .getUserCompanies()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (companies) => {\n this.companies.set(companies);\n this.isLoadingCompanies.set(false);\n },\n error: (err) => {\n this.isLoadingCompanies.set(false);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: err?.message || 'Failed to load companies',\n });\n },\n });\n }\n\n onCompanyChange(companyId: string | null): void {\n this.selectedCompanyId.set(companyId);\n\n if (!companyId) {\n this.branches.set([]);\n this.selectedBranchId.set(null);\n return;\n }\n\n this.loadBranches(companyId);\n }\n\n onBranchChange(branchId: string | null): void {\n this.selectedBranchId.set(branchId);\n }\n\n private loadBranches(companyId: string): void {\n if (!this.authApi) return;\n\n this.isLoadingBranches.set(true);\n this.selectedBranchId.set(null);\n\n this.authApi\n .getCompanyBranches(companyId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (branches) => {\n this.branches.set(branches);\n this.isLoadingBranches.set(false);\n\n // Auto-select if only one branch available\n if (branches.length === 1) {\n this.selectedBranchId.set(branches[0].id);\n }\n },\n error: (err) => {\n this.isLoadingBranches.set(false);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: err?.message || 'Failed to load branches',\n });\n },\n });\n }\n\n onSwitch(): void {\n const selectedCompany = this.selectedCompanyId();\n const selectedBranch = this.selectedBranchId();\n\n if (!this.authApi || !selectedCompany) return;\n\n if (this.branches().length > 0 && !selectedBranch) {\n this.messageService.add({\n severity: 'warn',\n summary: 'Branch Required',\n detail: 'Please select a branch',\n });\n return;\n }\n\n this.isSwitching.set(true);\n\n this.authApi\n .switchCompany(selectedCompany, selectedBranch || '')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {},\n error: (err) => {\n this.isSwitching.set(false);\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: err?.message || 'Failed to switch company',\n });\n },\n });\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Component, DestroyRef, ElementRef, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IconComponent } from '@flusys/ng-shared';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-launcher',\n standalone: true,\n imports: [StyleClassModule, IconComponent],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\"\n >\n <i class=\"pi pi-th-large\"></i>\n <span>Apps</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] right-0 z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]\"\n style=\"background-color: var(--surface-overlay)\"\n >\n <div class=\"flex flex-col gap-2 min-w-[240px]\">\n <span class=\"text-sm text-muted-color font-semibold\">Applications</span>\n <div class=\"grid grid-cols-3 gap-2\">\n @for (app of layoutService.apps(); track app.id) {\n <a\n class=\"group flex flex-col items-center w-20 p-2 rounded-border cursor-pointer no-underline transition-all duration-200 hover:bg-emphasis\"\n [href]=\"app.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <div\n class=\"flex items-center justify-center w-10 h-10 rounded-border bg-emphasis group-hover:bg-primary transition-all duration-200\"\n >\n <lib-icon\n [icon]=\"app.icon\"\n [iconType]=\"app.iconType\"\n class=\"text-xl text-primary group-hover:text-primary-contrast transition-colors duration-200\"\n />\n </div>\n <span\n class=\"text-xs mt-2 text-center text-muted-color group-hover:text-color transition-colors duration-200\"\n >{{ app.name }}</span\n >\n </a>\n }\n </div>\n </div>\n </div>\n `,\n})\nexport class AppLauncher {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n public readonly layoutService = inject(LayoutService);\n\n readonly isActive = signal(false);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this.isActive.update((v) => !v);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AngularModule } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n LAYOUT_AUTH_API,\n LAYOUT_AUTH_STATE,\n} from '../../interfaces/public-api';\nimport { LayoutService } from '../../services/layout.service';\n\n@Component({\n selector: 'app-profile',\n standalone: true,\n imports: [AngularModule, StyleClassModule],\n host: { class: 'relative' },\n template: `\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"isActive()\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel()\"\n >\n <i class=\"pi pi-user\"></i>\n <span>Profile</span>\n </button>\n <div\n class=\"hidden absolute top-[3.25rem] right-0 z-50 p-4 border border-surface rounded-border origin-top shadow-[0px_3px_5px_rgba(0,0,0,0.02),0px_0px_2px_rgba(0,0,0,0.05),0px_1px_4px_rgba(0,0,0,0.08)]\"\n style=\"background-color: var(--surface-overlay)\"\n >\n <div class=\"flex flex-col gap-3 min-w-[240px]\">\n <!-- User Info -->\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline hover:bg-emphasis transition-all duration-200\"\n routerLink=\"/profile\"\n >\n @if (profilePicture()) {\n <img\n [src]=\"profilePicture()\"\n class=\"w-12 h-12 rounded-border object-cover\"\n alt=\"Profile\"\n />\n } @else {\n <div\n class=\"w-12 h-12 rounded-border bg-primary flex items-center justify-center\"\n >\n <i class=\"pi pi-user text-xl text-primary-contrast\"></i>\n </div>\n }\n <div class=\"flex flex-col\">\n <span class=\"font-semibold text-color\">{{ userName() }}</span>\n <span class=\"text-sm text-muted-color\">{{ userEmail() }}</span>\n </div>\n </a>\n\n <!-- Divider -->\n <div class=\"border-t border-surface\"></div>\n\n <!-- Menu Items -->\n <div class=\"flex flex-col gap-1\">\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"copySignUpLink()\"\n >\n <i class=\"pi pi-link text-muted-color\"></i>\n <span>Copy SignUp Link</span>\n </a>\n <a\n class=\"flex items-center gap-3 p-3 rounded-border cursor-pointer no-underline text-color hover:bg-emphasis transition-all duration-200\"\n (click)=\"logout()\"\n >\n <i class=\"pi pi-sign-out text-muted-color\"></i>\n <span>Logout</span>\n </a>\n </div>\n </div>\n </div>\n `,\n})\nexport class AppProfile {\n private readonly destroyRef = inject(DestroyRef);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly authApi = inject(LAYOUT_AUTH_API, { optional: true });\n private readonly layoutService = inject(LayoutService);\n private readonly messageService = inject(MessageService);\n private readonly document = inject(DOCUMENT);\n private readonly elementRef = inject(ElementRef);\n\n readonly isActive = signal(false);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.isActive()),\n )\n .subscribe((event) => {\n const target = event.target as HTMLElement;\n if (!this.elementRef.nativeElement.contains(target)) {\n this.isActive.set(false);\n }\n });\n }\n\n togglePanel(): void {\n this.isActive.update((v) => !v);\n }\n\n userName = computed(() => this.authState?.loginUserData()?.name ?? 'Guest');\n userEmail = computed(() => this.authState?.loginUserData()?.email ?? '');\n // Use LayoutService for profile picture URL (synced by AuthLayoutSyncService)\n profilePicture = computed(() => this.layoutService.userProfilePictureUrl() ?? '');\n\n logout() {\n if (!this.authApi) return;\n\n this.authApi\n .logOut()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (result: any) => {\n this.messageService.add({\n severity: 'success',\n summary: 'Success!',\n detail: result.message,\n });\n this.authApi?.navigateLogin(false);\n },\n error: (err) => {\n this.messageService.add({\n severity: 'error',\n summary: 'Error',\n detail: err?.message || 'Failed to logout',\n });\n },\n });\n }\n\n copySignUpLink() {\n const slug = this.authState?.currentCompanyInfo()?.slug ?? '';\n const signUpLink = `${window.location.origin}/auth/register?companySlug=${slug}`;\n navigator.clipboard\n .writeText(signUpLink)\n .then(() => {\n this.messageService.add({\n severity: 'success',\n summary: 'Link Copied',\n detail: 'Sign Up Link copied.',\n });\n })\n .catch(() => {\n this.messageService.add({\n severity: 'error',\n summary: 'Sorry',\n detail: 'Failed to copy signup link.',\n });\n });\n }\n}\n","import { CommonModule, DOCUMENT } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { RouterModule } from '@angular/router';\nimport { APP_CONFIG, isCompanyFeatureEnabled } from '@flusys/ng-core';\nimport { StyleClassModule } from 'primeng/styleclass';\nimport { fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { LayoutService } from '../services/public-api';\nimport { AppConfigurator } from './app.configurator';\nimport { AppCompanyBranchSelector } from './top-bar/app.company-branch-selector';\nimport { AppLauncher } from './top-bar/app.launcher';\nimport { AppProfile } from './top-bar/app.profile';\n\ntype ActivePanel = 'config' | null;\n\n@Component({\n selector: 'app-topbar',\n standalone: true,\n imports: [\n RouterModule,\n CommonModule,\n StyleClassModule,\n AppConfigurator,\n AppProfile,\n AppCompanyBranchSelector,\n AppLauncher,\n ],\n template: ` <div class=\"layout-topbar\">\n <div class=\"layout-topbar-logo-container\">\n <button\n class=\"layout-menu-button layout-topbar-action\"\n (click)=\"layoutService.onMenuToggle()\"\n >\n <i class=\"pi pi-bars\"></i>\n </button>\n <a class=\"layout-topbar-logo\" routerLink=\"/\">\n <span>{{ companyName() }}</span>\n </a>\n </div>\n\n <div class=\"layout-topbar-actions\">\n <div class=\"layout-config-menu\">\n <button\n type=\"button\"\n class=\"layout-topbar-action\"\n (click)=\"toggleDarkMode()\"\n >\n <i\n [ngClass]=\"{\n 'pi ': true,\n 'pi-moon': layoutService.isDarkTheme(),\n 'pi-sun': !layoutService.isDarkTheme(),\n }\"\n ></i>\n </button>\n <div class=\"relative\" #configContainer>\n <button\n class=\"layout-topbar-action\"\n [class.layout-topbar-action-highlight]=\"activePanel() === 'config'\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n (click)=\"togglePanel('config')\"\n >\n <i class=\"pi pi-palette\"></i>\n </button>\n <app-configurator />\n </div>\n </div>\n\n <button\n class=\"layout-topbar-menu-button layout-topbar-action\"\n pStyleClass=\"@next\"\n enterFromClass=\"hidden\"\n enterActiveClass=\"animate-scalein\"\n leaveToClass=\"hidden\"\n leaveActiveClass=\"animate-fadeout\"\n [hideOnOutsideClick]=\"true\"\n >\n <i class=\"pi pi-ellipsis-v\"></i>\n </button>\n\n <div class=\"layout-topbar-menu hidden lg:block\">\n <div class=\"layout-topbar-menu-content\">\n @if (layoutService.hasApps()) {\n <app-launcher />\n }\n @if (enableCompanyFeature()) {\n <app-company-branch-selector />\n }\n <app-profile />\n </div>\n </div>\n </div>\n </div>`,\n})\nexport class AppTopbar {\n private readonly appConfig = inject(APP_CONFIG);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n readonly layoutService = inject(LayoutService);\n\n private readonly configContainer =\n viewChild<ElementRef<HTMLElement>>('configContainer');\n\n readonly activePanel = signal<ActivePanel>(null);\n\n constructor() {\n fromEvent<MouseEvent>(this.document, 'click')\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(() => this.activePanel() !== null),\n )\n .subscribe((event) => {\n this.handleOutsideClick(event);\n });\n }\n\n // Use layoutService.companyName which falls back to appName\n readonly companyName = this.layoutService.companyName;\n\n enableCompanyFeature = computed(() => {\n return isCompanyFeatureEnabled(this.appConfig);\n });\n\n toggleDarkMode() {\n this.layoutService.layoutConfig.update((state) => ({\n ...state,\n darkTheme: !state.darkTheme,\n }));\n }\n\n togglePanel(panel: ActivePanel) {\n this.activePanel.update((current) => (current === panel ? null : panel));\n }\n\n private handleOutsideClick(event: MouseEvent) {\n const target = event.target as HTMLElement;\n const configEl = this.configContainer()?.nativeElement;\n\n if (configEl && !configEl.contains(target)) {\n this.activePanel.set(null);\n }\n }\n}\n","import {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { IconComponent } from '@flusys/ng-shared';\nimport { RippleModule } from 'primeng/ripple';\nimport { filter } from 'rxjs/operators';\nimport { IMenuItem, LAYOUT_AUTH_STATE } from '../interfaces/public-api';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: '[app-menuitem]',\n standalone: true,\n imports: [IconComponent, RouterModule, RippleModule],\n template: `\n <ng-container>\n @if (item().children?.length) {\n <a (click)=\"itemClick()\" tabindex=\"0\" pRipple>\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{ item().label }}</span>\n @if (item().children) {\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\"></i>\n }\n </a>\n }\n @if (item().routerLink && !item().children?.length) {\n <a\n (click)=\"itemClick()\"\n [routerLink]=\"routerLink()\"\n routerLinkActive=\"active-route\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n tabindex=\"0\"\n pRipple\n >\n @if (item().icon) {\n <lib-icon\n [icon]=\"item().icon!\"\n [iconType]=\"item().iconType\"\n class=\"layout-menuitem-icon\"\n />\n }\n <span class=\"layout-menuitem-text\">{{ item().label }}</span>\n </a>\n }\n @if (item().children) {\n <ul\n [class.submenu-expanded]=\"active()\"\n [class.submenu-collapsed]=\"!active()\"\n >\n @for (\n child of item().children;\n track 'menu' + child.id + '' + i;\n let i = $index\n ) {\n <li\n app-menuitem\n [item]=\"child\"\n [index]=\"i\"\n [parentKey]=\"key()\"\n ></li>\n }\n </ul>\n }\n </ng-container>\n `,\n styles: `\n :host ul {\n overflow: hidden;\n transition: max-height 400ms cubic-bezier(0.86, 0, 0.07, 1);\n }\n :host ul.submenu-collapsed {\n max-height: 0;\n }\n :host ul.submenu-expanded {\n max-height: 1000px;\n }\n `,\n host: {\n '[class.active-menuitem]': 'active()',\n },\n})\nexport class AppMenuitem {\n // Signal inputs\n readonly item = input.required<IMenuItem>();\n readonly index = input.required<number>();\n readonly parentKey = input<string>('');\n\n // Injected services\n private readonly router = inject(Router);\n private readonly layoutService = inject(LayoutService);\n private readonly authState = inject(LAYOUT_AUTH_STATE, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n\n // State signals\n readonly active = signal(false);\n\n // Computed signals\n readonly key = computed(() => {\n const parent = this.parentKey();\n return parent ? `${parent}-${this.index()}` : String(this.index());\n });\n\n readonly routerLink = computed(() => {\n const menuItem = this.item();\n return menuItem.routerLink ?? [];\n });\n\n // Computed options for routerLinkActive - use 'exact' for root, 'subset' for others\n readonly routerLinkActiveOptions = computed(() => {\n const link = this.routerLink();\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n return {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n } as const;\n });\n\n constructor() {\n // Subscribe to menu source changes\n this.layoutService.menuSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value) => {\n Promise.resolve(null).then(() => {\n const currentKey = this.key();\n if (value.routeEvent) {\n this.active.set(\n value.key === currentKey ||\n value.key?.startsWith(currentKey + '-'),\n );\n } else if (\n value.key !== currentKey &&\n !value.key?.startsWith(currentKey + '-')\n ) {\n this.active.set(false);\n }\n });\n });\n\n // Subscribe to menu reset\n this.layoutService.resetSource$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.active.set(false));\n\n // Subscribe to navigation events\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n if (this.item().routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n\n // Effect to update active state on init when item has routerLink\n effect(() => {\n const menuItem = this.item();\n if (menuItem.routerLink) {\n this.updateActiveStateFromRoute();\n }\n });\n }\n\n private updateActiveStateFromRoute(): void {\n const link = this.routerLink();\n if (!link.length) return;\n\n // Use 'exact' for root path to avoid matching all routes\n // Use 'subset' for all other paths to match child routes\n const pathsMatch = link[0] === '/' ? 'exact' : 'subset';\n\n const isActive = this.router.isActive(link[0], {\n paths: pathsMatch,\n queryParams: 'ignored',\n matrixParams: 'ignored',\n fragment: 'ignored',\n });\n\n if (isActive) {\n this.layoutService.onMenuStateChange({\n key: this.key(),\n routeEvent: true,\n });\n }\n }\n\n itemClick(): void {\n if (this.item().children) {\n this.active.update((prev) => !prev);\n }\n this.layoutService.onMenuStateChange({ key: this.key() });\n }\n}\n","import { Component, inject } from '@angular/core';\n\nimport { RouterModule } from '@angular/router';\nimport { LayoutService } from '../services/layout.service';\nimport { AppMenuitem } from './app.menuitem';\n\n/**\n * Main menu component that displays filtered menu items.\n * Menu is automatically filtered based on user permissions using the permission checker (logicNode pattern).\n * The filtering happens internally in LayoutService via computed signal.\n */\n@Component({\n selector: 'app-menu',\n standalone: true,\n imports: [AppMenuitem, RouterModule],\n template: `<div class=\"layout-menu\">\n <ul>\n @for (\n item of menuItems();\n track 'menu' + item.id + '' + i;\n let i = $index\n ) {\n <li app-menuitem [item]=\"item\" [index]=\"i\"></li>\n }\n </ul>\n </div>`,\n})\nexport class AppMenu {\n private readonly layoutService = inject(LayoutService);\n\n /**\n * Filtered menu items from layout service.\n * This signal is computed in LayoutService and automatically updates when:\n * - Raw menu changes (setMenu called)\n * - Permission state changes (user permissions updated)\n */\n readonly menuItems = this.layoutService.menu;\n}\n","import { Component } from '@angular/core';\nimport { AppMenu } from './app.menu';\n\n@Component({\n selector: 'app-sidebar',\n standalone: true,\n imports: [AppMenu],\n template: `\n <div class=\"layout-sidebar\">\n <app-menu />\n </div>\n `,\n})\nexport class AppSidebar {}\n","import { Component, DestroyRef, inject, Renderer2, ViewChild, DOCUMENT } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CommonModule } from '@angular/common';\nimport { NavigationEnd, Router, RouterModule } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AppTopbar } from './app.topbar';\nimport { AppSidebar } from './app.sidebar';\nimport { AppFooter } from './app.footer';\nimport { LayoutService } from '../services/public-api';\n\n@Component({\n selector: 'app-layout',\n standalone: true,\n imports: [CommonModule, AppTopbar, AppSidebar, RouterModule, AppFooter],\n template: `\n <div class=\"layout-wrapper\" [ngClass]=\"containerClass\">\n <app-topbar></app-topbar>\n <app-sidebar></app-sidebar>\n <div class=\"layout-main-container\">\n <div class=\"layout-main\">\n <router-outlet></router-outlet>\n </div>\n <app-footer></app-footer>\n </div>\n <div class=\"layout-mask animate-fadein\"></div>\n </div>\n `,\n})\nexport class AppLayout {\n private readonly destroyRef = inject(DestroyRef);\n private readonly document = inject(DOCUMENT);\n readonly layoutService = inject(LayoutService);\n private readonly renderer = inject(Renderer2);\n private readonly router = inject(Router);\n\n private menuOutsideClickListener: (() => void) | null = null;\n\n @ViewChild(AppSidebar) appSidebar!: AppSidebar;\n @ViewChild(AppTopbar) appTopBar!: AppTopbar;\n\n constructor() {\n this.layoutService.overlayOpen$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (!this.menuOutsideClickListener) {\n this.menuOutsideClickListener = this.renderer.listen(\n this.document,\n 'click',\n (event) => {\n if (this.isOutsideClicked(event)) {\n this.hideMenu();\n }\n }\n );\n }\n if (this.layoutService.layoutState().staticMenuMobileActive) {\n this.blockBodyScroll();\n }\n });\n\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => this.hideMenu());\n }\n\n isOutsideClicked(event: MouseEvent): boolean {\n const sidebarEl = this.document.querySelector('.layout-sidebar');\n const topbarEl = this.document.querySelector('.layout-menu-button');\n const eventTarget = event.target as Node;\n\n return !(\n sidebarEl?.isSameNode(eventTarget) ||\n sidebarEl?.contains(eventTarget) ||\n topbarEl?.isSameNode(eventTarget) ||\n topbarEl?.contains(eventTarget)\n );\n }\n\n hideMenu(): void {\n this.layoutService.layoutState.update((prev) => ({\n ...prev,\n overlayMenuActive: false,\n staticMenuMobileActive: false,\n menuHoverActive: false,\n }));\n if (this.menuOutsideClickListener) {\n this.menuOutsideClickListener();\n this.menuOutsideClickListener = null;\n }\n this.unblockBodyScroll();\n }\n\n blockBodyScroll(): void {\n this.document.body.classList.add('blocked-scroll');\n }\n\n unblockBodyScroll(): void {\n this.document.body.classList.remove('blocked-scroll');\n }\n\n get containerClass() {\n const config = this.layoutService.layoutConfig();\n const state = this.layoutService.layoutState();\n return {\n 'layout-overlay': config.menuMode === 'overlay',\n 'layout-static': config.menuMode === 'static',\n 'layout-static-inactive': state.staticMenuDesktopInactive && config.menuMode === 'static',\n 'layout-overlay-active': state.overlayMenuActive,\n 'layout-mobile-active': state.staticMenuMobileActive,\n };\n }\n}\n","\nimport Material from '@primeuix/themes/material';\nimport { definePreset } from '@primeuix/themes';\n\nexport const GreenTheme = definePreset(Material, {\n semantic: {\n colorScheme: {\n light: {\n primary: {\n color: '#01712c',\n inverseColor: '#119744',\n hoverColor: '#119744',\n activeColor: '#119744',\n },\n highlight: {\n background: '#e2e8f0',\n focusBackground: '#e2e8f0',\n color: '#01712c',\n focusColor: '#01712c',\n },\n },\n },\n },\n});","\nimport Material from '@primeuix/themes/material';\nimport { definePreset } from '@primeuix/themes';\n\nexport const NavyBlueTheme = definePreset(Material, {\n semantic: {\n colorScheme: {\n light: {\n primary: {\n color: '#3535cd',\n inverseColor: '#0707a9',\n hoverColor: '#0707a9',\n activeColor: '#0707a9',\n },\n highlight: {\n background: '#e2e8f0',\n focusBackground: '#e2e8f0',\n color: '#3535cd',\n focusColor: '#3535cd',\n },\n },\n },\n },\n });","// Components\nexport * from './components/app.configurator';\nexport * from './components/app.floatingconfigurator';\nexport * from './components/app.footer';\nexport * from './components/app.layout';\nexport * from './components/app.menu';\nexport * from './components/app.menuitem';\nexport * from './components/app.sidebar';\nexport * from './components/app.topbar';\nexport * from './components/top-bar/app.company-branch-selector';\nexport * from './components/top-bar/app.launcher';\nexport * from './components/top-bar/app.profile';\n\n// Interfaces\nexport * from './interfaces/layout-auth.interface';\n\n// Services\nexport * from './services/layout-persistence.service';\nexport * from './services/layout.service';\n\n// Utils\nexport * from './utils/apps-filter.util';\nexport * from './utils/menu-filter.util';\n\n// Themes\nexport * from './theme/green-theme';\nexport * from './theme/navy-blue-theme';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","DOCUMENT","i3","filter"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flusys/ng-layout",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.1.0-beta",
|
|
4
4
|
"description": "Layout components for FLUSYS Angular applications",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"peerDependencies": {
|
|
7
7
|
"@angular/common": "^21.0.0",
|
|
8
8
|
"@angular/core": "^21.0.0",
|
|
9
9
|
"@angular/router": "^21.0.0",
|
|
10
|
-
"@flusys/ng-core": "^
|
|
11
|
-
"@flusys/ng-shared": "^
|
|
10
|
+
"@flusys/ng-core": "^1.1.0-beta",
|
|
11
|
+
"@flusys/ng-shared": "^1.1.0-beta",
|
|
12
12
|
"@primeuix/themes": "^1.0.0",
|
|
13
13
|
"primeicons": "^7.0.0",
|
|
14
14
|
"primeng": "^21.0.0",
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { Signal, InjectionToken
|
|
3
|
-
import { Router } from '@angular/router';
|
|
4
|
-
import { PrimeNG } from 'primeng/config';
|
|
2
|
+
import { Signal, InjectionToken } from '@angular/core';
|
|
5
3
|
import * as rxjs from 'rxjs';
|
|
6
4
|
import { Observable } from 'rxjs';
|
|
7
|
-
import { IconTypeEnum, ILogicNode
|
|
5
|
+
import { IconTypeEnum, ILogicNode } from '@flusys/ng-shared';
|
|
8
6
|
import * as _flusys_ng_layout from '@flusys/ng-layout';
|
|
9
7
|
import * as _primeuix_themes_types from '@primeuix/themes/types';
|
|
10
8
|
|
|
@@ -111,6 +109,7 @@ declare class LayoutService {
|
|
|
111
109
|
private readonly platformId;
|
|
112
110
|
private readonly isBrowser;
|
|
113
111
|
private readonly persistence;
|
|
112
|
+
private readonly appConfig;
|
|
114
113
|
private readonly defaultConfig;
|
|
115
114
|
private readonly initialConfig;
|
|
116
115
|
private readonly defaultState;
|
|
@@ -120,6 +119,8 @@ declare class LayoutService {
|
|
|
120
119
|
readonly userProfile: _angular_core.WritableSignal<UserProfile | null>;
|
|
121
120
|
readonly companyProfile: _angular_core.WritableSignal<CompanyProfile | null>;
|
|
122
121
|
readonly appName: _angular_core.WritableSignal<string>;
|
|
122
|
+
readonly authorName: _angular_core.WritableSignal<string>;
|
|
123
|
+
readonly authorUrl: _angular_core.WritableSignal<string>;
|
|
123
124
|
private readonly _rawApps;
|
|
124
125
|
/**
|
|
125
126
|
* Filtered launcher apps based on user permissions.
|
|
@@ -134,7 +135,6 @@ declare class LayoutService {
|
|
|
134
135
|
* Role checker is optional - if not set, role-based permissions will be denied.
|
|
135
136
|
*/
|
|
136
137
|
readonly menu: _angular_core.Signal<IMenuItem[]>;
|
|
137
|
-
readonly theme: _angular_core.Signal<"light" | "dark">;
|
|
138
138
|
readonly isSidebarActive: _angular_core.Signal<boolean | undefined>;
|
|
139
139
|
readonly isDarkTheme: _angular_core.Signal<boolean | undefined>;
|
|
140
140
|
readonly getPrimary: _angular_core.Signal<string | undefined>;
|
|
@@ -276,11 +276,10 @@ declare type SurfacesType = {
|
|
|
276
276
|
};
|
|
277
277
|
};
|
|
278
278
|
declare class AppConfigurator {
|
|
279
|
-
router
|
|
280
|
-
|
|
281
|
-
layoutService: LayoutService;
|
|
282
|
-
platformService
|
|
283
|
-
primeng: PrimeNG;
|
|
279
|
+
private readonly router;
|
|
280
|
+
private readonly primeng;
|
|
281
|
+
readonly layoutService: LayoutService;
|
|
282
|
+
private readonly platformService;
|
|
284
283
|
presets: string[];
|
|
285
284
|
showMenuModeButton: _angular_core.WritableSignal<boolean>;
|
|
286
285
|
menuModeOptions: {
|
|
@@ -360,7 +359,9 @@ declare class AppFloatingConfigurator {
|
|
|
360
359
|
|
|
361
360
|
declare class AppFooter {
|
|
362
361
|
private readonly layoutService;
|
|
363
|
-
readonly
|
|
362
|
+
readonly appName: _angular_core.WritableSignal<string>;
|
|
363
|
+
readonly authorName: _angular_core.WritableSignal<string>;
|
|
364
|
+
readonly authorUrl: _angular_core.WritableSignal<string>;
|
|
364
365
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppFooter, never>;
|
|
365
366
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppFooter, "app-footer", never, {}, {}, never, never, true, never>;
|
|
366
367
|
}
|
|
@@ -384,8 +385,6 @@ declare class AppTopbar {
|
|
|
384
385
|
}
|
|
385
386
|
|
|
386
387
|
declare class AppSidebar {
|
|
387
|
-
el: ElementRef;
|
|
388
|
-
constructor(el: ElementRef);
|
|
389
388
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppSidebar, never>;
|
|
390
389
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppSidebar, "app-sidebar", never, {}, {}, never, never, true, never>;
|
|
391
390
|
}
|
|
@@ -503,6 +502,7 @@ declare class AppProfile {
|
|
|
503
502
|
private readonly destroyRef;
|
|
504
503
|
private readonly authState;
|
|
505
504
|
private readonly authApi;
|
|
505
|
+
private readonly layoutService;
|
|
506
506
|
private readonly messageService;
|
|
507
507
|
private readonly document;
|
|
508
508
|
private readonly elementRef;
|