@es.framework/ng.ui.theme 2.0.56 → 2.0.57
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.
|
@@ -210,36 +210,36 @@ class LanguagesComponent {
|
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LanguagesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
213
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: LanguagesComponent, isStandalone: true, selector: "abp-languages", ngImport: i0, template: `
|
|
214
|
-
@if (languages(); as langs) {
|
|
215
|
-
<div>
|
|
216
|
-
<!-- -->
|
|
217
|
-
<button
|
|
218
|
-
pButton
|
|
219
|
-
type="button"
|
|
220
|
-
icon="pi pi-globe"
|
|
221
|
-
class="p-button-text"
|
|
222
|
-
[title]="'اختر اللغة'"
|
|
223
|
-
(click)="overlay.toggle($event)"
|
|
224
|
-
></button>
|
|
225
|
-
<p-popover #overlay >
|
|
226
|
-
<ul class="w-48">
|
|
227
|
-
@for (lang of langs; track lang) {
|
|
228
|
-
<li
|
|
229
|
-
class="flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-gray-100"
|
|
230
|
-
(click)="onSelectLanguage(lang.cultureName ?? ''); overlay.hide()"
|
|
231
|
-
>
|
|
232
|
-
<span>{{ lang.displayName }}</span>
|
|
233
|
-
@if (lang.cultureName === selectedLang()) {
|
|
234
|
-
<i class="pi pi-check text-green-500"></i>
|
|
235
|
-
}
|
|
236
|
-
</li>
|
|
237
|
-
}
|
|
238
|
-
</ul>
|
|
239
|
-
</p-popover>
|
|
240
|
-
</div>
|
|
241
|
-
}
|
|
242
|
-
|
|
213
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: LanguagesComponent, isStandalone: true, selector: "abp-languages", ngImport: i0, template: `
|
|
214
|
+
@if (languages(); as langs) {
|
|
215
|
+
<div>
|
|
216
|
+
<!-- -->
|
|
217
|
+
<button
|
|
218
|
+
pButton
|
|
219
|
+
type="button"
|
|
220
|
+
icon="pi pi-globe"
|
|
221
|
+
class="p-button-text"
|
|
222
|
+
[title]="'اختر اللغة'"
|
|
223
|
+
(click)="overlay.toggle($event)"
|
|
224
|
+
></button>
|
|
225
|
+
<p-popover #overlay >
|
|
226
|
+
<ul class="w-48">
|
|
227
|
+
@for (lang of langs; track lang) {
|
|
228
|
+
<li
|
|
229
|
+
class="flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-gray-100"
|
|
230
|
+
(click)="onSelectLanguage(lang.cultureName ?? ''); overlay.hide()"
|
|
231
|
+
>
|
|
232
|
+
<span>{{ lang.displayName }}</span>
|
|
233
|
+
@if (lang.cultureName === selectedLang()) {
|
|
234
|
+
<i class="pi pi-check text-green-500"></i>
|
|
235
|
+
}
|
|
236
|
+
</li>
|
|
237
|
+
}
|
|
238
|
+
</ul>
|
|
239
|
+
</p-popover>
|
|
240
|
+
</div>
|
|
241
|
+
}
|
|
242
|
+
|
|
243
243
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: SelectModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i1.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }] });
|
|
244
244
|
}
|
|
245
245
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: LanguagesComponent, decorators: [{
|
|
@@ -248,36 +248,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
248
248
|
selector: 'abp-languages',
|
|
249
249
|
standalone: true,
|
|
250
250
|
imports: [SelectModule, FormsModule, PopoverModule, ButtonModule],
|
|
251
|
-
template: `
|
|
252
|
-
@if (languages(); as langs) {
|
|
253
|
-
<div>
|
|
254
|
-
<!-- -->
|
|
255
|
-
<button
|
|
256
|
-
pButton
|
|
257
|
-
type="button"
|
|
258
|
-
icon="pi pi-globe"
|
|
259
|
-
class="p-button-text"
|
|
260
|
-
[title]="'اختر اللغة'"
|
|
261
|
-
(click)="overlay.toggle($event)"
|
|
262
|
-
></button>
|
|
263
|
-
<p-popover #overlay >
|
|
264
|
-
<ul class="w-48">
|
|
265
|
-
@for (lang of langs; track lang) {
|
|
266
|
-
<li
|
|
267
|
-
class="flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-gray-100"
|
|
268
|
-
(click)="onSelectLanguage(lang.cultureName ?? ''); overlay.hide()"
|
|
269
|
-
>
|
|
270
|
-
<span>{{ lang.displayName }}</span>
|
|
271
|
-
@if (lang.cultureName === selectedLang()) {
|
|
272
|
-
<i class="pi pi-check text-green-500"></i>
|
|
273
|
-
}
|
|
274
|
-
</li>
|
|
275
|
-
}
|
|
276
|
-
</ul>
|
|
277
|
-
</p-popover>
|
|
278
|
-
</div>
|
|
279
|
-
}
|
|
280
|
-
|
|
251
|
+
template: `
|
|
252
|
+
@if (languages(); as langs) {
|
|
253
|
+
<div>
|
|
254
|
+
<!-- -->
|
|
255
|
+
<button
|
|
256
|
+
pButton
|
|
257
|
+
type="button"
|
|
258
|
+
icon="pi pi-globe"
|
|
259
|
+
class="p-button-text"
|
|
260
|
+
[title]="'اختر اللغة'"
|
|
261
|
+
(click)="overlay.toggle($event)"
|
|
262
|
+
></button>
|
|
263
|
+
<p-popover #overlay >
|
|
264
|
+
<ul class="w-48">
|
|
265
|
+
@for (lang of langs; track lang) {
|
|
266
|
+
<li
|
|
267
|
+
class="flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-gray-100"
|
|
268
|
+
(click)="onSelectLanguage(lang.cultureName ?? ''); overlay.hide()"
|
|
269
|
+
>
|
|
270
|
+
<span>{{ lang.displayName }}</span>
|
|
271
|
+
@if (lang.cultureName === selectedLang()) {
|
|
272
|
+
<i class="pi pi-check text-green-500"></i>
|
|
273
|
+
}
|
|
274
|
+
</li>
|
|
275
|
+
}
|
|
276
|
+
</ul>
|
|
277
|
+
</p-popover>
|
|
278
|
+
</div>
|
|
279
|
+
}
|
|
280
|
+
|
|
281
281
|
`
|
|
282
282
|
}]
|
|
283
283
|
}], ctorParameters: () => [] });
|
|
@@ -636,53 +636,53 @@ class AppConfigurator {
|
|
|
636
636
|
this.layoutService.layoutConfig.update((prev) => ({ ...prev, menuMode: event }));
|
|
637
637
|
}
|
|
638
638
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppConfigurator, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
639
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppConfigurator, isStandalone: true, selector: "app-configurator", ngImport: i0, template: `
|
|
640
|
-
<div class="flex flex-col gap-4">
|
|
641
|
-
<div>
|
|
642
|
-
<span class="text-sm text-muted-color font-semibold">Primary</span>
|
|
643
|
-
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
644
|
-
@for (primaryColor of primaryColors(); track primaryColor.name) {
|
|
645
|
-
<button
|
|
646
|
-
type="button"
|
|
647
|
-
[title]="primaryColor.name"
|
|
648
|
-
(click)="updateColors($event, 'primary', primaryColor)"
|
|
649
|
-
[ngClass]="{ 'outline-primary': primaryColor.name === selectedPrimaryColor() }"
|
|
650
|
-
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
651
|
-
[style]="{
|
|
652
|
-
'background-color': primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']
|
|
653
|
-
}"
|
|
654
|
-
></button>
|
|
655
|
-
}
|
|
656
|
-
</div>
|
|
657
|
-
</div>
|
|
658
|
-
<div>
|
|
659
|
-
<span class="text-sm text-muted-color font-semibold">Surface</span>
|
|
660
|
-
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
661
|
-
@for (surface of surfaces; track surface.name) {
|
|
662
|
-
<button
|
|
663
|
-
type="button"
|
|
664
|
-
[title]="surface.name"
|
|
665
|
-
(click)="updateColors($event, 'surface', surface)"
|
|
666
|
-
[ngClass]="{ 'outline-primary': selectedSurfaceColor() ? selectedSurfaceColor() === surface.name : layoutService.layoutConfig().darkTheme ? surface.name === 'zinc' : surface.name === 'slate' }"
|
|
667
|
-
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
668
|
-
[style]="{
|
|
669
|
-
'background-color': surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']
|
|
670
|
-
}"
|
|
671
|
-
></button>
|
|
672
|
-
}
|
|
673
|
-
</div>
|
|
674
|
-
</div>
|
|
675
|
-
<div class="flex flex-col gap-2">
|
|
676
|
-
<span class="text-sm text-muted-color font-semibold">Presets</span>
|
|
677
|
-
<p-selectbutton [options]="presets" [ngModel]="selectedPreset()" (ngModelChange)="onPresetChange($event)" [allowEmpty]="false" size="small" />
|
|
678
|
-
</div>
|
|
679
|
-
@if (showMenuModeButton()) {
|
|
680
|
-
<div class="flex flex-col gap-2">
|
|
681
|
-
<span class="text-sm text-muted-color font-semibold">Menu Mode</span>
|
|
682
|
-
<p-selectbutton [ngModel]="menuMode()" (ngModelChange)="onMenuModeChange($event)" [options]="menuModeOptions" [allowEmpty]="false" size="small" />
|
|
683
|
-
</div>
|
|
684
|
-
}
|
|
685
|
-
</div>
|
|
639
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AppConfigurator, isStandalone: true, selector: "app-configurator", ngImport: i0, template: `
|
|
640
|
+
<div class="flex flex-col gap-4">
|
|
641
|
+
<div>
|
|
642
|
+
<span class="text-sm text-muted-color font-semibold">Primary</span>
|
|
643
|
+
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
644
|
+
@for (primaryColor of primaryColors(); track primaryColor.name) {
|
|
645
|
+
<button
|
|
646
|
+
type="button"
|
|
647
|
+
[title]="primaryColor.name"
|
|
648
|
+
(click)="updateColors($event, 'primary', primaryColor)"
|
|
649
|
+
[ngClass]="{ 'outline-primary': primaryColor.name === selectedPrimaryColor() }"
|
|
650
|
+
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
651
|
+
[style]="{
|
|
652
|
+
'background-color': primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']
|
|
653
|
+
}"
|
|
654
|
+
></button>
|
|
655
|
+
}
|
|
656
|
+
</div>
|
|
657
|
+
</div>
|
|
658
|
+
<div>
|
|
659
|
+
<span class="text-sm text-muted-color font-semibold">Surface</span>
|
|
660
|
+
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
661
|
+
@for (surface of surfaces; track surface.name) {
|
|
662
|
+
<button
|
|
663
|
+
type="button"
|
|
664
|
+
[title]="surface.name"
|
|
665
|
+
(click)="updateColors($event, 'surface', surface)"
|
|
666
|
+
[ngClass]="{ 'outline-primary': selectedSurfaceColor() ? selectedSurfaceColor() === surface.name : layoutService.layoutConfig().darkTheme ? surface.name === 'zinc' : surface.name === 'slate' }"
|
|
667
|
+
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
668
|
+
[style]="{
|
|
669
|
+
'background-color': surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']
|
|
670
|
+
}"
|
|
671
|
+
></button>
|
|
672
|
+
}
|
|
673
|
+
</div>
|
|
674
|
+
</div>
|
|
675
|
+
<div class="flex flex-col gap-2">
|
|
676
|
+
<span class="text-sm text-muted-color font-semibold">Presets</span>
|
|
677
|
+
<p-selectbutton [options]="presets" [ngModel]="selectedPreset()" (ngModelChange)="onPresetChange($event)" [allowEmpty]="false" size="small" />
|
|
678
|
+
</div>
|
|
679
|
+
@if (showMenuModeButton()) {
|
|
680
|
+
<div class="flex flex-col gap-2">
|
|
681
|
+
<span class="text-sm text-muted-color font-semibold">Menu Mode</span>
|
|
682
|
+
<p-selectbutton [ngModel]="menuMode()" (ngModelChange)="onMenuModeChange($event)" [options]="menuModeOptions" [allowEmpty]="false" size="small" />
|
|
683
|
+
</div>
|
|
684
|
+
}
|
|
685
|
+
</div>
|
|
686
686
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.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"] }] });
|
|
687
687
|
}
|
|
688
688
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AppConfigurator, decorators: [{
|
|
@@ -691,53 +691,53 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
691
691
|
selector: 'app-configurator',
|
|
692
692
|
standalone: true,
|
|
693
693
|
imports: [CommonModule, FormsModule, SelectButtonModule],
|
|
694
|
-
template: `
|
|
695
|
-
<div class="flex flex-col gap-4">
|
|
696
|
-
<div>
|
|
697
|
-
<span class="text-sm text-muted-color font-semibold">Primary</span>
|
|
698
|
-
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
699
|
-
@for (primaryColor of primaryColors(); track primaryColor.name) {
|
|
700
|
-
<button
|
|
701
|
-
type="button"
|
|
702
|
-
[title]="primaryColor.name"
|
|
703
|
-
(click)="updateColors($event, 'primary', primaryColor)"
|
|
704
|
-
[ngClass]="{ 'outline-primary': primaryColor.name === selectedPrimaryColor() }"
|
|
705
|
-
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
706
|
-
[style]="{
|
|
707
|
-
'background-color': primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']
|
|
708
|
-
}"
|
|
709
|
-
></button>
|
|
710
|
-
}
|
|
711
|
-
</div>
|
|
712
|
-
</div>
|
|
713
|
-
<div>
|
|
714
|
-
<span class="text-sm text-muted-color font-semibold">Surface</span>
|
|
715
|
-
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
716
|
-
@for (surface of surfaces; track surface.name) {
|
|
717
|
-
<button
|
|
718
|
-
type="button"
|
|
719
|
-
[title]="surface.name"
|
|
720
|
-
(click)="updateColors($event, 'surface', surface)"
|
|
721
|
-
[ngClass]="{ 'outline-primary': selectedSurfaceColor() ? selectedSurfaceColor() === surface.name : layoutService.layoutConfig().darkTheme ? surface.name === 'zinc' : surface.name === 'slate' }"
|
|
722
|
-
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
723
|
-
[style]="{
|
|
724
|
-
'background-color': surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']
|
|
725
|
-
}"
|
|
726
|
-
></button>
|
|
727
|
-
}
|
|
728
|
-
</div>
|
|
729
|
-
</div>
|
|
730
|
-
<div class="flex flex-col gap-2">
|
|
731
|
-
<span class="text-sm text-muted-color font-semibold">Presets</span>
|
|
732
|
-
<p-selectbutton [options]="presets" [ngModel]="selectedPreset()" (ngModelChange)="onPresetChange($event)" [allowEmpty]="false" size="small" />
|
|
733
|
-
</div>
|
|
734
|
-
@if (showMenuModeButton()) {
|
|
735
|
-
<div class="flex flex-col gap-2">
|
|
736
|
-
<span class="text-sm text-muted-color font-semibold">Menu Mode</span>
|
|
737
|
-
<p-selectbutton [ngModel]="menuMode()" (ngModelChange)="onMenuModeChange($event)" [options]="menuModeOptions" [allowEmpty]="false" size="small" />
|
|
738
|
-
</div>
|
|
739
|
-
}
|
|
740
|
-
</div>
|
|
694
|
+
template: `
|
|
695
|
+
<div class="flex flex-col gap-4">
|
|
696
|
+
<div>
|
|
697
|
+
<span class="text-sm text-muted-color font-semibold">Primary</span>
|
|
698
|
+
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
699
|
+
@for (primaryColor of primaryColors(); track primaryColor.name) {
|
|
700
|
+
<button
|
|
701
|
+
type="button"
|
|
702
|
+
[title]="primaryColor.name"
|
|
703
|
+
(click)="updateColors($event, 'primary', primaryColor)"
|
|
704
|
+
[ngClass]="{ 'outline-primary': primaryColor.name === selectedPrimaryColor() }"
|
|
705
|
+
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
706
|
+
[style]="{
|
|
707
|
+
'background-color': primaryColor?.name === 'noir' ? 'var(--text-color)' : primaryColor?.palette?.['500']
|
|
708
|
+
}"
|
|
709
|
+
></button>
|
|
710
|
+
}
|
|
711
|
+
</div>
|
|
712
|
+
</div>
|
|
713
|
+
<div>
|
|
714
|
+
<span class="text-sm text-muted-color font-semibold">Surface</span>
|
|
715
|
+
<div class="pt-2 flex gap-2 flex-wrap justify-start">
|
|
716
|
+
@for (surface of surfaces; track surface.name) {
|
|
717
|
+
<button
|
|
718
|
+
type="button"
|
|
719
|
+
[title]="surface.name"
|
|
720
|
+
(click)="updateColors($event, 'surface', surface)"
|
|
721
|
+
[ngClass]="{ 'outline-primary': selectedSurfaceColor() ? selectedSurfaceColor() === surface.name : layoutService.layoutConfig().darkTheme ? surface.name === 'zinc' : surface.name === 'slate' }"
|
|
722
|
+
class="border-none w-5 h-5 rounded-full p-0 cursor-pointer outline-none outline-offset-1"
|
|
723
|
+
[style]="{
|
|
724
|
+
'background-color': surface?.name === 'noir' ? 'var(--text-color)' : surface?.palette?.['500']
|
|
725
|
+
}"
|
|
726
|
+
></button>
|
|
727
|
+
}
|
|
728
|
+
</div>
|
|
729
|
+
</div>
|
|
730
|
+
<div class="flex flex-col gap-2">
|
|
731
|
+
<span class="text-sm text-muted-color font-semibold">Presets</span>
|
|
732
|
+
<p-selectbutton [options]="presets" [ngModel]="selectedPreset()" (ngModelChange)="onPresetChange($event)" [allowEmpty]="false" size="small" />
|
|
733
|
+
</div>
|
|
734
|
+
@if (showMenuModeButton()) {
|
|
735
|
+
<div class="flex flex-col gap-2">
|
|
736
|
+
<span class="text-sm text-muted-color font-semibold">Menu Mode</span>
|
|
737
|
+
<p-selectbutton [ngModel]="menuMode()" (ngModelChange)="onMenuModeChange($event)" [options]="menuModeOptions" [allowEmpty]="false" size="small" />
|
|
738
|
+
</div>
|
|
739
|
+
}
|
|
740
|
+
</div>
|
|
741
741
|
`,
|
|
742
742
|
}]
|
|
743
743
|
}] });
|
|
@@ -868,167 +868,167 @@ class NavItemsComponent {
|
|
|
868
868
|
this.authService.navigateToLogin();
|
|
869
869
|
}
|
|
870
870
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: NavItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
871
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: NavItemsComponent, isStandalone: true, selector: "app-nav-items", ngImport: i0, template: `
|
|
872
|
-
<header class="flex items-center justify-between px-6 h-16 bg-white shadow sticky top-0 z-9">
|
|
873
|
-
<!-- Left: Logo / Title -->
|
|
874
|
-
<div class="flex items-center space-x-3 rtl:space-x-reverse">
|
|
875
|
-
<img src="assets/logo.png" alt="Logo" class="h-8 w-8" />
|
|
876
|
-
<span class="text-lg font-semibold text-gray-800">{{ '' | translate }}</span>
|
|
877
|
-
</div>
|
|
878
|
-
|
|
879
|
-
<!-- Center: Nav Items -->
|
|
880
|
-
<div class="flex items-center space-x-4 rtl:space-x-reverse">
|
|
881
|
-
<ul class="flex space-x-4">
|
|
882
|
-
@for (item of navItems.items$ | async; track item.id) {
|
|
883
|
-
@if (!item.visible || item.visible(item)) {
|
|
884
|
-
<ng-container *frameworkVisible="!item.visible || item.visible(item)">
|
|
885
|
-
<li class="flex items-center">
|
|
886
|
-
@if (item.component) {
|
|
887
|
-
<ng-container
|
|
888
|
-
[ngComponentOutlet]="item.component"
|
|
889
|
-
[ngComponentOutletInjector]="item | toInjector"
|
|
890
|
-
></ng-container>
|
|
891
|
-
} @else {
|
|
892
|
-
<button
|
|
893
|
-
pButton
|
|
894
|
-
type="button"
|
|
895
|
-
class="p-button-text hover:bg-gray-100 focus:outline-none flex items-center"
|
|
896
|
-
(click)="item.action?.()"
|
|
897
|
-
>
|
|
898
|
-
<span [innerHTML]="item.html"></span>
|
|
899
|
-
</button>
|
|
900
|
-
}
|
|
901
|
-
</li>
|
|
902
|
-
</ng-container>
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
</ul>
|
|
906
|
-
</div>
|
|
907
|
-
|
|
908
|
-
<!-- Right: Actions -->
|
|
909
|
-
<div class="flex items-center rtl:space-x-reverse">
|
|
910
|
-
<!-- Configurator -->
|
|
911
|
-
|
|
912
|
-
<div>
|
|
913
|
-
<!-- -->
|
|
914
|
-
<button
|
|
915
|
-
pButton
|
|
916
|
-
type="button"
|
|
917
|
-
icon="pi pi-palette"
|
|
918
|
-
class="p-button-text"
|
|
919
|
-
[title]="''"
|
|
920
|
-
(click)="overlay.toggle($event)"
|
|
921
|
-
>
|
|
922
|
-
</button>
|
|
923
|
-
|
|
924
|
-
<p-popover #overlay >
|
|
925
|
-
<app-configurator />
|
|
926
|
-
</p-popover>
|
|
927
|
-
</div>
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
<!-- Dark Mode Toggle -->
|
|
931
|
-
<button
|
|
932
|
-
pButton
|
|
933
|
-
type="button"
|
|
934
|
-
[icon]="layoutService.isDarkTheme() ?'pi pi-moon': 'pi pi-sun'"
|
|
935
|
-
class="p-button-text"
|
|
936
|
-
(click)="toggleDarkMode()">
|
|
937
|
-
</button>
|
|
938
|
-
|
|
939
|
-
<!-- Language Switcher -->
|
|
940
|
-
<abp-languages></abp-languages>
|
|
941
|
-
|
|
942
|
-
<!-- User Menu -->
|
|
943
|
-
<div class="relative">
|
|
944
|
-
<button
|
|
945
|
-
class="p-link p-2"
|
|
946
|
-
(click)="menu.toggle($event)"
|
|
947
|
-
aria-label="User menu"
|
|
948
|
-
>
|
|
949
|
-
<p-avatar
|
|
950
|
-
[label]="loading ? '' : userName"
|
|
951
|
-
[icon]="loading ? 'pi pi-spinner' : ''"
|
|
952
|
-
[class]="{'pi-spin': loading}"
|
|
953
|
-
shape="circle"
|
|
954
|
-
class="bg-blue-600 text-white cursor-pointer"
|
|
955
|
-
[title]="(currentUser$ | async)?.name || ''"
|
|
956
|
-
></p-avatar>
|
|
957
|
-
</button>
|
|
958
|
-
|
|
959
|
-
<p-menu
|
|
960
|
-
#menu
|
|
961
|
-
[model]="userMenuItems"
|
|
962
|
-
[popup]="true"
|
|
963
|
-
[appendTo]="'body'"
|
|
964
|
-
styleClass="w-64 sm:w-72 shadow-lg rounded-md"
|
|
965
|
-
>
|
|
966
|
-
<ng-template pTemplate="start">
|
|
967
|
-
<div class="px-5 py-4 border-b border-gray-200 bg-gray-50 flex flex-col items-center text-center">
|
|
968
|
-
<p-avatar
|
|
969
|
-
[label]="userName"
|
|
970
|
-
shape="circle"
|
|
971
|
-
size="xlarge"
|
|
972
|
-
styleClass="bg-blue-600 text-white mb-3 shadow-lg"
|
|
973
|
-
[title]="(currentUser$ | async)?.name || ''"
|
|
974
|
-
></p-avatar>
|
|
975
|
-
<h5 class="text-xl font-semibold text-gray-800 leading-tight">
|
|
976
|
-
{{ (currentUser$ | async)?.name || 'اسم المستخدم' }}
|
|
977
|
-
</h5>
|
|
978
|
-
<p class="text-sm text-gray-600 truncate max-w-full">
|
|
979
|
-
{{ (currentUser$ | async)?.email || 'لا يوجد بريد إلكتروني' }}
|
|
980
|
-
</p>
|
|
981
|
-
@if ((selectedTenant$ | async); as tenant) {
|
|
982
|
-
<span
|
|
983
|
-
class="inline-block mt-2 px-3 py-1 text-xs rounded-full font-semibold"
|
|
984
|
-
[ngClass]="{
|
|
985
|
-
'bg-green-100 text-green-800': true
|
|
986
|
-
}"
|
|
987
|
-
>
|
|
988
|
-
{{ tenant?.name || '_' }}
|
|
989
|
-
</span>
|
|
990
|
-
}
|
|
991
|
-
</div>
|
|
992
|
-
</ng-template>
|
|
993
|
-
|
|
994
|
-
<ng-template pTemplate="item" let-item>
|
|
995
|
-
<!-- *frameworkVisible="!item.visible || item.visible(item)" -->
|
|
996
|
-
<ng-container >
|
|
997
|
-
<!-- *hasPermission="item.requiredPolicy" -->
|
|
998
|
-
<a
|
|
999
|
-
|
|
1000
|
-
class="p-menuitem-link flex items-center space-x-3 rtl:space-x-reverse px-5 py-2 hover:bg-gray-100 rounded-md"
|
|
1001
|
-
[ngClass]="item.styleClass || ''"
|
|
1002
|
-
(click)="item.command ? item.command() : null"
|
|
1003
|
-
[routerLink]="item.routerLink ? item.routerLink : null"
|
|
1004
|
-
tabindex="0"
|
|
1005
|
-
>
|
|
1006
|
-
@if (item.component) {
|
|
1007
|
-
<ng-container
|
|
1008
|
-
[ngComponentOutlet]="item.component"
|
|
1009
|
-
[ngComponentOutletInjector]="item | toInjector"
|
|
1010
|
-
></ng-container>
|
|
1011
|
-
} @else {
|
|
1012
|
-
<i [class]="item.icon + ' text-lg text-gray-600'"></i>
|
|
1013
|
-
<span class="text-gray-700">{{ item.label | translate }}</span>
|
|
1014
|
-
}
|
|
1015
|
-
</a>
|
|
1016
|
-
</ng-container>
|
|
1017
|
-
</ng-template>
|
|
1018
|
-
</p-menu>
|
|
1019
|
-
</div>
|
|
1020
|
-
|
|
1021
|
-
<!-- Logout Button (separate from menu) -->
|
|
1022
|
-
<!-- <button
|
|
1023
|
-
type="button"
|
|
1024
|
-
class="layout-topbar-action"
|
|
1025
|
-
(click)="logout()"
|
|
1026
|
-
title="تسجيل الخروج"
|
|
1027
|
-
>
|
|
1028
|
-
<i class="pi pi-sign-out"></i>
|
|
1029
|
-
</button> -->
|
|
1030
|
-
</div>
|
|
1031
|
-
</header>
|
|
871
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: NavItemsComponent, isStandalone: true, selector: "app-nav-items", ngImport: i0, template: `
|
|
872
|
+
<header class="flex items-center justify-between px-6 h-16 bg-white shadow sticky top-0 z-9">
|
|
873
|
+
<!-- Left: Logo / Title -->
|
|
874
|
+
<div class="flex items-center space-x-3 rtl:space-x-reverse">
|
|
875
|
+
<img src="assets/logo.png" alt="Logo" class="h-8 w-8" />
|
|
876
|
+
<span class="text-lg font-semibold text-gray-800">{{ '' | translate }}</span>
|
|
877
|
+
</div>
|
|
878
|
+
|
|
879
|
+
<!-- Center: Nav Items -->
|
|
880
|
+
<div class="flex items-center space-x-4 rtl:space-x-reverse">
|
|
881
|
+
<ul class="flex space-x-4">
|
|
882
|
+
@for (item of navItems.items$ | async; track item.id) {
|
|
883
|
+
@if (!item.visible || item.visible(item)) {
|
|
884
|
+
<ng-container *frameworkVisible="!item.visible || item.visible(item)">
|
|
885
|
+
<li class="flex items-center">
|
|
886
|
+
@if (item.component) {
|
|
887
|
+
<ng-container
|
|
888
|
+
[ngComponentOutlet]="item.component"
|
|
889
|
+
[ngComponentOutletInjector]="item | toInjector"
|
|
890
|
+
></ng-container>
|
|
891
|
+
} @else {
|
|
892
|
+
<button
|
|
893
|
+
pButton
|
|
894
|
+
type="button"
|
|
895
|
+
class="p-button-text hover:bg-gray-100 focus:outline-none flex items-center"
|
|
896
|
+
(click)="item.action?.()"
|
|
897
|
+
>
|
|
898
|
+
<span [innerHTML]="item.html"></span>
|
|
899
|
+
</button>
|
|
900
|
+
}
|
|
901
|
+
</li>
|
|
902
|
+
</ng-container>
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
</ul>
|
|
906
|
+
</div>
|
|
907
|
+
|
|
908
|
+
<!-- Right: Actions -->
|
|
909
|
+
<div class="flex items-center rtl:space-x-reverse">
|
|
910
|
+
<!-- Configurator -->
|
|
911
|
+
|
|
912
|
+
<div>
|
|
913
|
+
<!-- -->
|
|
914
|
+
<button
|
|
915
|
+
pButton
|
|
916
|
+
type="button"
|
|
917
|
+
icon="pi pi-palette"
|
|
918
|
+
class="p-button-text"
|
|
919
|
+
[title]="''"
|
|
920
|
+
(click)="overlay.toggle($event)"
|
|
921
|
+
>
|
|
922
|
+
</button>
|
|
923
|
+
|
|
924
|
+
<p-popover #overlay >
|
|
925
|
+
<app-configurator />
|
|
926
|
+
</p-popover>
|
|
927
|
+
</div>
|
|
928
|
+
|
|
929
|
+
|
|
930
|
+
<!-- Dark Mode Toggle -->
|
|
931
|
+
<button
|
|
932
|
+
pButton
|
|
933
|
+
type="button"
|
|
934
|
+
[icon]="layoutService.isDarkTheme() ?'pi pi-moon': 'pi pi-sun'"
|
|
935
|
+
class="p-button-text"
|
|
936
|
+
(click)="toggleDarkMode()">
|
|
937
|
+
</button>
|
|
938
|
+
|
|
939
|
+
<!-- Language Switcher -->
|
|
940
|
+
<abp-languages></abp-languages>
|
|
941
|
+
|
|
942
|
+
<!-- User Menu -->
|
|
943
|
+
<div class="relative">
|
|
944
|
+
<button
|
|
945
|
+
class="p-link p-2"
|
|
946
|
+
(click)="menu.toggle($event)"
|
|
947
|
+
aria-label="User menu"
|
|
948
|
+
>
|
|
949
|
+
<p-avatar
|
|
950
|
+
[label]="loading ? '' : userName"
|
|
951
|
+
[icon]="loading ? 'pi pi-spinner' : ''"
|
|
952
|
+
[class]="{'pi-spin': loading}"
|
|
953
|
+
shape="circle"
|
|
954
|
+
class="bg-blue-600 text-white cursor-pointer"
|
|
955
|
+
[title]="(currentUser$ | async)?.name || ''"
|
|
956
|
+
></p-avatar>
|
|
957
|
+
</button>
|
|
958
|
+
|
|
959
|
+
<p-menu
|
|
960
|
+
#menu
|
|
961
|
+
[model]="userMenuItems"
|
|
962
|
+
[popup]="true"
|
|
963
|
+
[appendTo]="'body'"
|
|
964
|
+
styleClass="w-64 sm:w-72 shadow-lg rounded-md"
|
|
965
|
+
>
|
|
966
|
+
<ng-template pTemplate="start">
|
|
967
|
+
<div class="px-5 py-4 border-b border-gray-200 bg-gray-50 flex flex-col items-center text-center">
|
|
968
|
+
<p-avatar
|
|
969
|
+
[label]="userName"
|
|
970
|
+
shape="circle"
|
|
971
|
+
size="xlarge"
|
|
972
|
+
styleClass="bg-blue-600 text-white mb-3 shadow-lg"
|
|
973
|
+
[title]="(currentUser$ | async)?.name || ''"
|
|
974
|
+
></p-avatar>
|
|
975
|
+
<h5 class="text-xl font-semibold text-gray-800 leading-tight">
|
|
976
|
+
{{ (currentUser$ | async)?.name || 'اسم المستخدم' }}
|
|
977
|
+
</h5>
|
|
978
|
+
<p class="text-sm text-gray-600 truncate max-w-full">
|
|
979
|
+
{{ (currentUser$ | async)?.email || 'لا يوجد بريد إلكتروني' }}
|
|
980
|
+
</p>
|
|
981
|
+
@if ((selectedTenant$ | async); as tenant) {
|
|
982
|
+
<span
|
|
983
|
+
class="inline-block mt-2 px-3 py-1 text-xs rounded-full font-semibold"
|
|
984
|
+
[ngClass]="{
|
|
985
|
+
'bg-green-100 text-green-800': true
|
|
986
|
+
}"
|
|
987
|
+
>
|
|
988
|
+
{{ tenant?.name || '_' }}
|
|
989
|
+
</span>
|
|
990
|
+
}
|
|
991
|
+
</div>
|
|
992
|
+
</ng-template>
|
|
993
|
+
|
|
994
|
+
<ng-template pTemplate="item" let-item>
|
|
995
|
+
<!-- *frameworkVisible="!item.visible || item.visible(item)" -->
|
|
996
|
+
<ng-container >
|
|
997
|
+
<!-- *hasPermission="item.requiredPolicy" -->
|
|
998
|
+
<a
|
|
999
|
+
|
|
1000
|
+
class="p-menuitem-link flex items-center space-x-3 rtl:space-x-reverse px-5 py-2 hover:bg-gray-100 rounded-md"
|
|
1001
|
+
[ngClass]="item.styleClass || ''"
|
|
1002
|
+
(click)="item.command ? item.command() : null"
|
|
1003
|
+
[routerLink]="item.routerLink ? item.routerLink : null"
|
|
1004
|
+
tabindex="0"
|
|
1005
|
+
>
|
|
1006
|
+
@if (item.component) {
|
|
1007
|
+
<ng-container
|
|
1008
|
+
[ngComponentOutlet]="item.component"
|
|
1009
|
+
[ngComponentOutletInjector]="item | toInjector"
|
|
1010
|
+
></ng-container>
|
|
1011
|
+
} @else {
|
|
1012
|
+
<i [class]="item.icon + ' text-lg text-gray-600'"></i>
|
|
1013
|
+
<span class="text-gray-700">{{ item.label | translate }}</span>
|
|
1014
|
+
}
|
|
1015
|
+
</a>
|
|
1016
|
+
</ng-container>
|
|
1017
|
+
</ng-template>
|
|
1018
|
+
</p-menu>
|
|
1019
|
+
</div>
|
|
1020
|
+
|
|
1021
|
+
<!-- Logout Button (separate from menu) -->
|
|
1022
|
+
<!-- <button
|
|
1023
|
+
type="button"
|
|
1024
|
+
class="layout-topbar-action"
|
|
1025
|
+
(click)="logout()"
|
|
1026
|
+
title="تسجيل الخروج"
|
|
1027
|
+
>
|
|
1028
|
+
<i class="pi pi-sign-out"></i>
|
|
1029
|
+
</button> -->
|
|
1030
|
+
</div>
|
|
1031
|
+
</header>
|
|
1032
1032
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "component", type: AppConfigurator, selector: "app-configurator" }, { kind: "component", type: LanguagesComponent, selector: "abp-languages" }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i3$1.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: MenuModule }, { kind: "component", type: i5.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex", "appendTo"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: VisibleDirective, selector: "[frameworkVisible]", inputs: ["frameworkVisible"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i1.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: ToInjectorPipe, name: "toInjector" }] });
|
|
1033
1033
|
}
|
|
1034
1034
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: NavItemsComponent, decorators: [{
|
|
@@ -1052,167 +1052,167 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
1052
1052
|
ToInjectorPipe,
|
|
1053
1053
|
PopoverModule
|
|
1054
1054
|
],
|
|
1055
|
-
template: `
|
|
1056
|
-
<header class="flex items-center justify-between px-6 h-16 bg-white shadow sticky top-0 z-9">
|
|
1057
|
-
<!-- Left: Logo / Title -->
|
|
1058
|
-
<div class="flex items-center space-x-3 rtl:space-x-reverse">
|
|
1059
|
-
<img src="assets/logo.png" alt="Logo" class="h-8 w-8" />
|
|
1060
|
-
<span class="text-lg font-semibold text-gray-800">{{ '' | translate }}</span>
|
|
1061
|
-
</div>
|
|
1062
|
-
|
|
1063
|
-
<!-- Center: Nav Items -->
|
|
1064
|
-
<div class="flex items-center space-x-4 rtl:space-x-reverse">
|
|
1065
|
-
<ul class="flex space-x-4">
|
|
1066
|
-
@for (item of navItems.items$ | async; track item.id) {
|
|
1067
|
-
@if (!item.visible || item.visible(item)) {
|
|
1068
|
-
<ng-container *frameworkVisible="!item.visible || item.visible(item)">
|
|
1069
|
-
<li class="flex items-center">
|
|
1070
|
-
@if (item.component) {
|
|
1071
|
-
<ng-container
|
|
1072
|
-
[ngComponentOutlet]="item.component"
|
|
1073
|
-
[ngComponentOutletInjector]="item | toInjector"
|
|
1074
|
-
></ng-container>
|
|
1075
|
-
} @else {
|
|
1076
|
-
<button
|
|
1077
|
-
pButton
|
|
1078
|
-
type="button"
|
|
1079
|
-
class="p-button-text hover:bg-gray-100 focus:outline-none flex items-center"
|
|
1080
|
-
(click)="item.action?.()"
|
|
1081
|
-
>
|
|
1082
|
-
<span [innerHTML]="item.html"></span>
|
|
1083
|
-
</button>
|
|
1084
|
-
}
|
|
1085
|
-
</li>
|
|
1086
|
-
</ng-container>
|
|
1087
|
-
}
|
|
1088
|
-
}
|
|
1089
|
-
</ul>
|
|
1090
|
-
</div>
|
|
1091
|
-
|
|
1092
|
-
<!-- Right: Actions -->
|
|
1093
|
-
<div class="flex items-center rtl:space-x-reverse">
|
|
1094
|
-
<!-- Configurator -->
|
|
1095
|
-
|
|
1096
|
-
<div>
|
|
1097
|
-
<!-- -->
|
|
1098
|
-
<button
|
|
1099
|
-
pButton
|
|
1100
|
-
type="button"
|
|
1101
|
-
icon="pi pi-palette"
|
|
1102
|
-
class="p-button-text"
|
|
1103
|
-
[title]="''"
|
|
1104
|
-
(click)="overlay.toggle($event)"
|
|
1105
|
-
>
|
|
1106
|
-
</button>
|
|
1107
|
-
|
|
1108
|
-
<p-popover #overlay >
|
|
1109
|
-
<app-configurator />
|
|
1110
|
-
</p-popover>
|
|
1111
|
-
</div>
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
<!-- Dark Mode Toggle -->
|
|
1115
|
-
<button
|
|
1116
|
-
pButton
|
|
1117
|
-
type="button"
|
|
1118
|
-
[icon]="layoutService.isDarkTheme() ?'pi pi-moon': 'pi pi-sun'"
|
|
1119
|
-
class="p-button-text"
|
|
1120
|
-
(click)="toggleDarkMode()">
|
|
1121
|
-
</button>
|
|
1122
|
-
|
|
1123
|
-
<!-- Language Switcher -->
|
|
1124
|
-
<abp-languages></abp-languages>
|
|
1125
|
-
|
|
1126
|
-
<!-- User Menu -->
|
|
1127
|
-
<div class="relative">
|
|
1128
|
-
<button
|
|
1129
|
-
class="p-link p-2"
|
|
1130
|
-
(click)="menu.toggle($event)"
|
|
1131
|
-
aria-label="User menu"
|
|
1132
|
-
>
|
|
1133
|
-
<p-avatar
|
|
1134
|
-
[label]="loading ? '' : userName"
|
|
1135
|
-
[icon]="loading ? 'pi pi-spinner' : ''"
|
|
1136
|
-
[class]="{'pi-spin': loading}"
|
|
1137
|
-
shape="circle"
|
|
1138
|
-
class="bg-blue-600 text-white cursor-pointer"
|
|
1139
|
-
[title]="(currentUser$ | async)?.name || ''"
|
|
1140
|
-
></p-avatar>
|
|
1141
|
-
</button>
|
|
1142
|
-
|
|
1143
|
-
<p-menu
|
|
1144
|
-
#menu
|
|
1145
|
-
[model]="userMenuItems"
|
|
1146
|
-
[popup]="true"
|
|
1147
|
-
[appendTo]="'body'"
|
|
1148
|
-
styleClass="w-64 sm:w-72 shadow-lg rounded-md"
|
|
1149
|
-
>
|
|
1150
|
-
<ng-template pTemplate="start">
|
|
1151
|
-
<div class="px-5 py-4 border-b border-gray-200 bg-gray-50 flex flex-col items-center text-center">
|
|
1152
|
-
<p-avatar
|
|
1153
|
-
[label]="userName"
|
|
1154
|
-
shape="circle"
|
|
1155
|
-
size="xlarge"
|
|
1156
|
-
styleClass="bg-blue-600 text-white mb-3 shadow-lg"
|
|
1157
|
-
[title]="(currentUser$ | async)?.name || ''"
|
|
1158
|
-
></p-avatar>
|
|
1159
|
-
<h5 class="text-xl font-semibold text-gray-800 leading-tight">
|
|
1160
|
-
{{ (currentUser$ | async)?.name || 'اسم المستخدم' }}
|
|
1161
|
-
</h5>
|
|
1162
|
-
<p class="text-sm text-gray-600 truncate max-w-full">
|
|
1163
|
-
{{ (currentUser$ | async)?.email || 'لا يوجد بريد إلكتروني' }}
|
|
1164
|
-
</p>
|
|
1165
|
-
@if ((selectedTenant$ | async); as tenant) {
|
|
1166
|
-
<span
|
|
1167
|
-
class="inline-block mt-2 px-3 py-1 text-xs rounded-full font-semibold"
|
|
1168
|
-
[ngClass]="{
|
|
1169
|
-
'bg-green-100 text-green-800': true
|
|
1170
|
-
}"
|
|
1171
|
-
>
|
|
1172
|
-
{{ tenant?.name || '_' }}
|
|
1173
|
-
</span>
|
|
1174
|
-
}
|
|
1175
|
-
</div>
|
|
1176
|
-
</ng-template>
|
|
1177
|
-
|
|
1178
|
-
<ng-template pTemplate="item" let-item>
|
|
1179
|
-
<!-- *frameworkVisible="!item.visible || item.visible(item)" -->
|
|
1180
|
-
<ng-container >
|
|
1181
|
-
<!-- *hasPermission="item.requiredPolicy" -->
|
|
1182
|
-
<a
|
|
1183
|
-
|
|
1184
|
-
class="p-menuitem-link flex items-center space-x-3 rtl:space-x-reverse px-5 py-2 hover:bg-gray-100 rounded-md"
|
|
1185
|
-
[ngClass]="item.styleClass || ''"
|
|
1186
|
-
(click)="item.command ? item.command() : null"
|
|
1187
|
-
[routerLink]="item.routerLink ? item.routerLink : null"
|
|
1188
|
-
tabindex="0"
|
|
1189
|
-
>
|
|
1190
|
-
@if (item.component) {
|
|
1191
|
-
<ng-container
|
|
1192
|
-
[ngComponentOutlet]="item.component"
|
|
1193
|
-
[ngComponentOutletInjector]="item | toInjector"
|
|
1194
|
-
></ng-container>
|
|
1195
|
-
} @else {
|
|
1196
|
-
<i [class]="item.icon + ' text-lg text-gray-600'"></i>
|
|
1197
|
-
<span class="text-gray-700">{{ item.label | translate }}</span>
|
|
1198
|
-
}
|
|
1199
|
-
</a>
|
|
1200
|
-
</ng-container>
|
|
1201
|
-
</ng-template>
|
|
1202
|
-
</p-menu>
|
|
1203
|
-
</div>
|
|
1204
|
-
|
|
1205
|
-
<!-- Logout Button (separate from menu) -->
|
|
1206
|
-
<!-- <button
|
|
1207
|
-
type="button"
|
|
1208
|
-
class="layout-topbar-action"
|
|
1209
|
-
(click)="logout()"
|
|
1210
|
-
title="تسجيل الخروج"
|
|
1211
|
-
>
|
|
1212
|
-
<i class="pi pi-sign-out"></i>
|
|
1213
|
-
</button> -->
|
|
1214
|
-
</div>
|
|
1215
|
-
</header>
|
|
1055
|
+
template: `
|
|
1056
|
+
<header class="flex items-center justify-between px-6 h-16 bg-white shadow sticky top-0 z-9">
|
|
1057
|
+
<!-- Left: Logo / Title -->
|
|
1058
|
+
<div class="flex items-center space-x-3 rtl:space-x-reverse">
|
|
1059
|
+
<img src="assets/logo.png" alt="Logo" class="h-8 w-8" />
|
|
1060
|
+
<span class="text-lg font-semibold text-gray-800">{{ '' | translate }}</span>
|
|
1061
|
+
</div>
|
|
1062
|
+
|
|
1063
|
+
<!-- Center: Nav Items -->
|
|
1064
|
+
<div class="flex items-center space-x-4 rtl:space-x-reverse">
|
|
1065
|
+
<ul class="flex space-x-4">
|
|
1066
|
+
@for (item of navItems.items$ | async; track item.id) {
|
|
1067
|
+
@if (!item.visible || item.visible(item)) {
|
|
1068
|
+
<ng-container *frameworkVisible="!item.visible || item.visible(item)">
|
|
1069
|
+
<li class="flex items-center">
|
|
1070
|
+
@if (item.component) {
|
|
1071
|
+
<ng-container
|
|
1072
|
+
[ngComponentOutlet]="item.component"
|
|
1073
|
+
[ngComponentOutletInjector]="item | toInjector"
|
|
1074
|
+
></ng-container>
|
|
1075
|
+
} @else {
|
|
1076
|
+
<button
|
|
1077
|
+
pButton
|
|
1078
|
+
type="button"
|
|
1079
|
+
class="p-button-text hover:bg-gray-100 focus:outline-none flex items-center"
|
|
1080
|
+
(click)="item.action?.()"
|
|
1081
|
+
>
|
|
1082
|
+
<span [innerHTML]="item.html"></span>
|
|
1083
|
+
</button>
|
|
1084
|
+
}
|
|
1085
|
+
</li>
|
|
1086
|
+
</ng-container>
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
</ul>
|
|
1090
|
+
</div>
|
|
1091
|
+
|
|
1092
|
+
<!-- Right: Actions -->
|
|
1093
|
+
<div class="flex items-center rtl:space-x-reverse">
|
|
1094
|
+
<!-- Configurator -->
|
|
1095
|
+
|
|
1096
|
+
<div>
|
|
1097
|
+
<!-- -->
|
|
1098
|
+
<button
|
|
1099
|
+
pButton
|
|
1100
|
+
type="button"
|
|
1101
|
+
icon="pi pi-palette"
|
|
1102
|
+
class="p-button-text"
|
|
1103
|
+
[title]="''"
|
|
1104
|
+
(click)="overlay.toggle($event)"
|
|
1105
|
+
>
|
|
1106
|
+
</button>
|
|
1107
|
+
|
|
1108
|
+
<p-popover #overlay >
|
|
1109
|
+
<app-configurator />
|
|
1110
|
+
</p-popover>
|
|
1111
|
+
</div>
|
|
1112
|
+
|
|
1113
|
+
|
|
1114
|
+
<!-- Dark Mode Toggle -->
|
|
1115
|
+
<button
|
|
1116
|
+
pButton
|
|
1117
|
+
type="button"
|
|
1118
|
+
[icon]="layoutService.isDarkTheme() ?'pi pi-moon': 'pi pi-sun'"
|
|
1119
|
+
class="p-button-text"
|
|
1120
|
+
(click)="toggleDarkMode()">
|
|
1121
|
+
</button>
|
|
1122
|
+
|
|
1123
|
+
<!-- Language Switcher -->
|
|
1124
|
+
<abp-languages></abp-languages>
|
|
1125
|
+
|
|
1126
|
+
<!-- User Menu -->
|
|
1127
|
+
<div class="relative">
|
|
1128
|
+
<button
|
|
1129
|
+
class="p-link p-2"
|
|
1130
|
+
(click)="menu.toggle($event)"
|
|
1131
|
+
aria-label="User menu"
|
|
1132
|
+
>
|
|
1133
|
+
<p-avatar
|
|
1134
|
+
[label]="loading ? '' : userName"
|
|
1135
|
+
[icon]="loading ? 'pi pi-spinner' : ''"
|
|
1136
|
+
[class]="{'pi-spin': loading}"
|
|
1137
|
+
shape="circle"
|
|
1138
|
+
class="bg-blue-600 text-white cursor-pointer"
|
|
1139
|
+
[title]="(currentUser$ | async)?.name || ''"
|
|
1140
|
+
></p-avatar>
|
|
1141
|
+
</button>
|
|
1142
|
+
|
|
1143
|
+
<p-menu
|
|
1144
|
+
#menu
|
|
1145
|
+
[model]="userMenuItems"
|
|
1146
|
+
[popup]="true"
|
|
1147
|
+
[appendTo]="'body'"
|
|
1148
|
+
styleClass="w-64 sm:w-72 shadow-lg rounded-md"
|
|
1149
|
+
>
|
|
1150
|
+
<ng-template pTemplate="start">
|
|
1151
|
+
<div class="px-5 py-4 border-b border-gray-200 bg-gray-50 flex flex-col items-center text-center">
|
|
1152
|
+
<p-avatar
|
|
1153
|
+
[label]="userName"
|
|
1154
|
+
shape="circle"
|
|
1155
|
+
size="xlarge"
|
|
1156
|
+
styleClass="bg-blue-600 text-white mb-3 shadow-lg"
|
|
1157
|
+
[title]="(currentUser$ | async)?.name || ''"
|
|
1158
|
+
></p-avatar>
|
|
1159
|
+
<h5 class="text-xl font-semibold text-gray-800 leading-tight">
|
|
1160
|
+
{{ (currentUser$ | async)?.name || 'اسم المستخدم' }}
|
|
1161
|
+
</h5>
|
|
1162
|
+
<p class="text-sm text-gray-600 truncate max-w-full">
|
|
1163
|
+
{{ (currentUser$ | async)?.email || 'لا يوجد بريد إلكتروني' }}
|
|
1164
|
+
</p>
|
|
1165
|
+
@if ((selectedTenant$ | async); as tenant) {
|
|
1166
|
+
<span
|
|
1167
|
+
class="inline-block mt-2 px-3 py-1 text-xs rounded-full font-semibold"
|
|
1168
|
+
[ngClass]="{
|
|
1169
|
+
'bg-green-100 text-green-800': true
|
|
1170
|
+
}"
|
|
1171
|
+
>
|
|
1172
|
+
{{ tenant?.name || '_' }}
|
|
1173
|
+
</span>
|
|
1174
|
+
}
|
|
1175
|
+
</div>
|
|
1176
|
+
</ng-template>
|
|
1177
|
+
|
|
1178
|
+
<ng-template pTemplate="item" let-item>
|
|
1179
|
+
<!-- *frameworkVisible="!item.visible || item.visible(item)" -->
|
|
1180
|
+
<ng-container >
|
|
1181
|
+
<!-- *hasPermission="item.requiredPolicy" -->
|
|
1182
|
+
<a
|
|
1183
|
+
|
|
1184
|
+
class="p-menuitem-link flex items-center space-x-3 rtl:space-x-reverse px-5 py-2 hover:bg-gray-100 rounded-md"
|
|
1185
|
+
[ngClass]="item.styleClass || ''"
|
|
1186
|
+
(click)="item.command ? item.command() : null"
|
|
1187
|
+
[routerLink]="item.routerLink ? item.routerLink : null"
|
|
1188
|
+
tabindex="0"
|
|
1189
|
+
>
|
|
1190
|
+
@if (item.component) {
|
|
1191
|
+
<ng-container
|
|
1192
|
+
[ngComponentOutlet]="item.component"
|
|
1193
|
+
[ngComponentOutletInjector]="item | toInjector"
|
|
1194
|
+
></ng-container>
|
|
1195
|
+
} @else {
|
|
1196
|
+
<i [class]="item.icon + ' text-lg text-gray-600'"></i>
|
|
1197
|
+
<span class="text-gray-700">{{ item.label | translate }}</span>
|
|
1198
|
+
}
|
|
1199
|
+
</a>
|
|
1200
|
+
</ng-container>
|
|
1201
|
+
</ng-template>
|
|
1202
|
+
</p-menu>
|
|
1203
|
+
</div>
|
|
1204
|
+
|
|
1205
|
+
<!-- Logout Button (separate from menu) -->
|
|
1206
|
+
<!-- <button
|
|
1207
|
+
type="button"
|
|
1208
|
+
class="layout-topbar-action"
|
|
1209
|
+
(click)="logout()"
|
|
1210
|
+
title="تسجيل الخروج"
|
|
1211
|
+
>
|
|
1212
|
+
<i class="pi pi-sign-out"></i>
|
|
1213
|
+
</button> -->
|
|
1214
|
+
</div>
|
|
1215
|
+
</header>
|
|
1216
1216
|
`
|
|
1217
1217
|
}]
|
|
1218
1218
|
}], ctorParameters: () => [] });
|
|
@@ -1434,11 +1434,11 @@ class RoutesComponent {
|
|
|
1434
1434
|
};
|
|
1435
1435
|
}
|
|
1436
1436
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: RoutesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1437
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: RoutesComponent, isStandalone: true, selector: "app-routes", host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<aside class=\"flex h-screen bg-white dark:bg-gray-900 transition-all duration-300\"\n [ngClass]=\"{ 'w-0 overflow-hidden': !sidebarVisible && isMobile }\">\n\n <!-- \uD83C\uDFA8 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0627\u0644\u0631\u0626\u064A\u0633\u064A -->\n <div\n class=\"flex flex-col justify-between pt-4 pb-2 w-16 border-l shadow-xl\n bg-gradient-to-b from-primary-500 via-primary-600 to-primary-700\n text-white rounded-r-3xl\">\n\n <!-- \uD83D\uDD1D \u0627\u0644\u0623\u0639\u0644\u0649 -->\n <div class=\"flex flex-col items-center gap-4\">\n <img src=\"/assets/logo.png\" alt=\"Logo\"\n class=\"w-9 h-9 mt-1 rounded-lg shadow-sm\"/>\n\n <!-- \u0632\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 -->\n <!-- [pTooltip]=\"'TOGGLE_MENU' | translate\" -->\n <button (click)=\"toggleAll()\"\n tooltipPosition=\"right\"\n class=\"text-white hover:scale-110 transition-transform duration-200\">\n <i class=\"pi pi-bars text-lg\"></i>\n </button>\n\n <!-- \u0623\u064A\u0642\u0648\u0646\u0627\u062A -->\n @for (item of secondToLastLevel$ | async; track item) {\n <div class=\"relative flex flex-col items-center\">\n <!-- \u0627\u0644\u0623\u064A\u0642\u0648\u0646\u0629 -->\n <div (click)=\"onMainClick(item)\"\n [pTooltip]=\"item.label | translate\"\n tooltipPosition=\"right\"\n class=\"relative flex items-center justify-center w-10 h-10 rounded-xl cursor-pointer\n hover:bg-white/20 transition-all duration-200\"\n [ngClass]=\"{ 'bg-white/30 scale-105 shadow-inner': item.expanded }\">\n <i [class]=\"item.icon + ' text-xl'\"></i>\n </div>\n </div>\n }\n </div>\n\n <!-- \u2699\uFE0F \u0627\u0644\u0623\u0633\u0641\u0644 -->\n <div class=\"flex flex-col items-center pb-3 text-white/80\">\n <i class=\"pi pi-cog text-lg hover:text-white cursor-pointer transition\"></i>\n </div>\n </div>\n\n <!-- \uD83D\uDCCB \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0641\u0631\u0639\u064A\u0629 -->\n @if (subSidebarVisible) {\n <div\n class=\"w-65 border-l border-gray-200 dark:border-gray-700 glass-bg animate-slideIn\n shadow-2xl rounded-l-3xl p-4 rtl:text-right overflow-y-auto transition-all duration-300\"\n [ngClass]=\"{ 'absolute top-0 right-16 h-full z-40': isMobile }\">\n <!-- \u0632\u0631 \u0631\u062C\u0648\u0639 -->\n <button (click)=\"closeMenu()\"\n class=\"flex items-center gap-2 mb-4 text-gray-500 dark:text-gray-300 hover:text-primary-600 transition\">\n <i class=\"pi\" [ngClass]=\"isMobile ? 'pi-angle-right' : 'pi-angle-right'\"></i>\n <span>{{ 'back' | translate }}</span>\n </button>\n <!-- Recursive rendering -->\n @if (menuItems$ | async; as menuItems) {\n <ng-container *ngTemplateOutlet=\"renderMenu; context:{ $implicit: menuItems, level: 1 }\"></ng-container>\n}\n\n<ng-template #renderMenu let-items let-level=\"level\">\n @for (item of items; track item) {\n\n @if (!item.items?.length) {\n @let link = getLinkProps(item);\n <div class=\"mb-1\">\n @if (link.isExternal) {\n <a [href]=\"link.href\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n (click)=\"$event.stopPropagation()\"\n class=\"flex items-center gap-2 px-3 py-2 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\n <i [class]=\"item.icon + ' text-base'\"></i>\n <span>{{ item.label | translate }}</span>\n <i class=\"pi pi-external-link text-[10px] opacity-50\"></i>\n </a>\n } @else {\n <div class=\"flex items-center gap-2\">\n <a [routerLink]=\"link.routerLink\"\n (click)=\"onNavigate()\"\n routerLinkActive=\"active-link\"\n class=\"flex-1 flex items-center gap-2 px-2 py-1 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\n <i [class]=\"item.icon + ' text-base'\"></i>\n <span>{{ item.label | translate }}</span>\n </a>\n\n@if (link.addRoute) {\n <a\n [routerLink]=\"[link.addRoute]\"\n (click)=\"$event.stopPropagation(); onNavigate()\"\n class=\"shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full text-gray-400 hover:text-primary-500 hover:bg-primary-50 dark:text-gray-500 dark:hover:text-primary-400 dark:hover:bg-primary-900/20 transition-all duration-200\"\n [pTooltip]=\"'ADD' | translate\"\n tooltipPosition=\"top\">\n <i class=\"pi pi-plus text-xs\"></i>\n </a>\n}\n </div>\n }\n</div>\n}\n\n @if (item.items?.length) {\n <div class=\"mb-1\">\n\n <div\n (click)=\"onParentClick(item)\"\n [style.font-size.rem]=\"1.1 - (level * 0.05)\"\n [ngClass]=\"{\n 'font-bold': level === 1,\n 'font-semibold': level === 2,\n 'font-medium': level >= 3,\n 'bg-primary-50 text-primary-700 border-r-4 border-primary-500': item.expanded\n }\"\n class=\"flex justify-between items-center py-2 px-3 rounded-lg cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition text-gray-800 dark:text-gray-200\">\n\n <div class=\"flex items-center gap-2\">\n\n <i [class]=\"item.icon + ' text-base'\"></i>\n\n <span>\n {{ item.label | translate }}\n </span>\n\n </div>\n\n <i\n class=\"pi\"\n [ngClass]=\"item.expanded ? 'pi-chevron-down' : 'pi-chevron-left'\"\n style=\"font-size:0.6rem;\">\n </i>\n\n </div>\n\n @if (item.expanded) {\n <div class=\"mr-4 border-r border-gray-200 dark:border-gray-700 pr-2 mt-1\">\n\n <ng-container\n *ngTemplateOutlet=\"renderMenu; context:{ $implicit: item.items, level: level + 1 }\">\n </ng-container>\n\n </div>\n }\n\n </div>\n }\n\n }\n</ng-template>\n\n </div>\n}\n\n</aside>\n\n<!-- \uD83C\uDF1F \u0627\u0644\u0632\u0631 \u0627\u0644\u0639\u0627\u0626\u0645 \u0627\u0644\u062D\u062F\u064A\u062B -->\n@if (isMobile && !sidebarVisible) {\n <button\n class=\"floating-btn\"\n (click)=\"openMenu()\"\n pTooltip=\"{{ 'MENU.OPEN' | translate }}\"\n tooltipPosition=\"top\">\n <img src=\"/assets/logo.png\" alt=\"App Icon\" />\n </button>\n}\n", styles: ["@charset \"UTF-8\";@keyframes slideIn{0%{transform:translate(60px);opacity:0}to{transform:translate(0);opacity:1}}.animate-slideIn{animation:slideIn .35s cubic-bezier(.25,1,.5,1)}.glass-bg{background:#ffffffbf;backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%);border:1px solid rgba(255,255,255,.25)}@media(max-width:1024px){aside{position:fixed;top:0;right:0;height:100vh;z-index:50}}.floating-btn{position:fixed;bottom:1.25rem;right:1.25rem;z-index:60;width:60px;height:60px;border-radius:50%;background:linear-gradient(135deg,var(--p-primary-500),var(--p-primary-700));box-shadow:0 4px 18px #00000040;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.floating-btn:hover{transform:scale(1.1) rotate(5deg)}.floating-btn img{width:28px;height:28px;border-radius:10px}.active-link{background-color:var(--p-primary-500)!important;color:#fff!important;font-weight:600;box-shadow:0 4px 6px -1px #0000001a;transform:translate(-3px)}.active-link i{color:#fff!important}.render-menu-container span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-item-link{background:linear-gradient(to left,var(--p-primary-50),transparent);color:var(--p-primary-600)!important;position:relative;border-right:3px solid var(--p-primary-500);border-radius:0 12px 12px 0}.active-item-link i{color:var(--p-primary-500);filter:drop-shadow(0 0 5px rgba(var(--p-primary-500-rgb),.4))}.active-item-link span{font-weight:700}.animate-slideIn{animation:slideIn .3s ease-out}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.glass-bg::-webkit-scrollbar{width:4px}.glass-bg::-webkit-scrollbar-thumb{background:#0000001a;border-radius:10px}.active-link{background-color:var(--p-primary-50)!important;color:var(--p-primary-700)!important;border-right:4px solid var(--p-primary-500)!important;border-radius:4px 12px 12px 4px!important}.active-link span{font-weight:800!important}.active-link i{color:var(--p-primary-600)!important;transform:scale(1.1)}aside{-webkit-font-smoothing:antialiased;letter-spacing:-.01em}.dark .active-link{background-color:rgba(var(--p-primary-500-rgb),.15)!important;color:var(--p-primary-300)!important}.submenu{animation:menuOpen .25s ease}@keyframes menuOpen{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}aside{box-shadow:0 10px 40px #00000026}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i3$2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1437
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: RoutesComponent, isStandalone: true, selector: "app-routes", host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<aside class=\"flex h-screen bg-white dark:bg-gray-900 transition-all duration-300\"\r\n [ngClass]=\"{ 'w-0 overflow-hidden': !sidebarVisible && isMobile }\">\r\n\r\n <!-- \uD83C\uDFA8 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0627\u0644\u0631\u0626\u064A\u0633\u064A -->\r\n <div\r\n class=\"flex flex-col justify-between pt-4 pb-2 w-16 border-l shadow-xl\r\n bg-gradient-to-b from-primary-500 via-primary-600 to-primary-700\r\n text-white rounded-r-3xl\">\r\n\r\n <!-- \uD83D\uDD1D \u0627\u0644\u0623\u0639\u0644\u0649 -->\r\n <div class=\"flex flex-col items-center gap-4\">\r\n <img src=\"/assets/logo.png\" alt=\"Logo\"\r\n class=\"w-9 h-9 mt-1 rounded-lg shadow-sm\"/>\r\n\r\n <!-- \u0632\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 -->\r\n <!-- [pTooltip]=\"'TOGGLE_MENU' | translate\" -->\r\n <button (click)=\"toggleAll()\"\r\n tooltipPosition=\"right\"\r\n class=\"text-white hover:scale-110 transition-transform duration-200\">\r\n <i class=\"pi pi-bars text-lg\"></i>\r\n </button>\r\n\r\n <!-- \u0623\u064A\u0642\u0648\u0646\u0627\u062A -->\r\n @for (item of secondToLastLevel$ | async; track item) {\r\n <div class=\"relative flex flex-col items-center\">\r\n <!-- \u0627\u0644\u0623\u064A\u0642\u0648\u0646\u0629 -->\r\n <div (click)=\"onMainClick(item)\"\r\n [pTooltip]=\"item.label | translate\"\r\n tooltipPosition=\"right\"\r\n class=\"relative flex items-center justify-center w-10 h-10 rounded-xl cursor-pointer\r\n hover:bg-white/20 transition-all duration-200\"\r\n [ngClass]=\"{ 'bg-white/30 scale-105 shadow-inner': item.expanded }\">\r\n <i [class]=\"item.icon + ' text-xl'\"></i>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- \u2699\uFE0F \u0627\u0644\u0623\u0633\u0641\u0644 -->\r\n <div class=\"flex flex-col items-center pb-3 text-white/80\">\r\n <i class=\"pi pi-cog text-lg hover:text-white cursor-pointer transition\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- \uD83D\uDCCB \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0641\u0631\u0639\u064A\u0629 -->\r\n @if (subSidebarVisible) {\r\n <div\r\n class=\"w-[290px] max-w-[290px] min-w-[260px] border-l border-gray-200 dark:border-gray-700 glass-bg animate-slideIn\r\n shadow-2xl rounded-l-3xl p-4 rtl:text-right overflow-y-auto overflow-x-hidden transition-all duration-300\"\r\n [ngClass]=\"{ 'absolute top-0 right-16 h-full z-40': isMobile }\">\r\n <!-- \u0632\u0631 \u0631\u062C\u0648\u0639 -->\r\n <button (click)=\"closeMenu()\"\r\n class=\"flex items-center gap-2 mb-4 text-gray-500 dark:text-gray-300 hover:text-primary-600 transition\">\r\n <i class=\"pi\" [ngClass]=\"isMobile ? 'pi-angle-right' : 'pi-angle-right'\"></i>\r\n <span>{{ 'back' | translate }}</span>\r\n </button>\r\n <!-- Recursive rendering -->\r\n @if (menuItems$ | async; as menuItems) {\r\n <ng-container *ngTemplateOutlet=\"renderMenu; context:{ $implicit: menuItems, level: 1 }\"></ng-container>\r\n}\r\n\r\n<ng-template #renderMenu let-items let-level=\"level\">\r\n @for (item of items; track item) {\r\n\r\n @if (!item.items?.length) {\r\n @let link = getLinkProps(item);\r\n <div class=\"mb-1\">\r\n @if (link.isExternal) {\r\n <a [href]=\"link.href\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"flex items-center gap-2 px-3 py-2 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n <span class=\"min-w-0 break-words whitespace-normal\">{{ item.label | translate }}</span>\r\n <i class=\"pi pi-external-link text-[10px] opacity-50\"></i>\r\n </a>\r\n } @else {\r\n <div class=\"flex items-center gap-2\">\r\n <a [routerLink]=\"link.routerLink\"\r\n (click)=\"onNavigate()\"\r\n routerLinkActive=\"active-link\"\r\n class=\"flex-1 min-w-0 flex items-center gap-2 px-2 py-1 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n <span class=\"min-w-0 break-words whitespace-normal\">\r\n {{ item.label | translate }}</span>\r\n </a>\r\n\r\n@if (link.addRoute) {\r\n <a\r\n [routerLink]=\"[link.addRoute]\"\r\n (click)=\"$event.stopPropagation(); onNavigate()\"\r\n class=\"shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full text-gray-400 hover:text-primary-500 hover:bg-primary-50 dark:text-gray-500 dark:hover:text-primary-400 dark:hover:bg-primary-900/20 transition-all duration-200\"\r\n [pTooltip]=\"'ADD' | translate\"\r\n tooltipPosition=\"top\">\r\n <i class=\"pi pi-plus text-xs\"></i>\r\n </a>\r\n}\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n @if (item.items?.length) {\r\n <div class=\"mb-1\">\r\n\r\n <div\r\n (click)=\"onParentClick(item)\"\r\n [style.font-size.rem]=\"1.1 - (level * 0.05)\"\r\n [ngClass]=\"{\r\n 'font-bold': level === 1,\r\n 'font-semibold': level === 2,\r\n 'font-medium': level >= 3,\r\n 'bg-primary-50 text-primary-700 border-r-4 border-primary-500': item.expanded\r\n }\"\r\n class=\"flex justify-between items-center py-2 px-3 rounded-lg cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition text-gray-800 dark:text-gray-200\">\r\n\r\n <div class=\"flex items-center gap-2\">\r\n\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n\r\n <span>\r\n {{ item.label | translate }}\r\n </span>\r\n\r\n </div>\r\n\r\n <i\r\n class=\"pi\"\r\n [ngClass]=\"item.expanded ? 'pi-chevron-down' : 'pi-chevron-left'\"\r\n style=\"font-size:0.6rem;\">\r\n </i>\r\n\r\n </div>\r\n\r\n @if (item.expanded) {\r\n <div class=\"mr-4 border-r border-gray-200 dark:border-gray-700 pr-2 mt-1\">\r\n\r\n <ng-container\r\n *ngTemplateOutlet=\"renderMenu; context:{ $implicit: item.items, level: level + 1 }\">\r\n </ng-container>\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n }\r\n\r\n }\r\n</ng-template>\r\n\r\n </div>\r\n}\r\n\r\n</aside>\r\n\r\n<!-- \uD83C\uDF1F \u0627\u0644\u0632\u0631 \u0627\u0644\u0639\u0627\u0626\u0645 \u0627\u0644\u062D\u062F\u064A\u062B -->\r\n@if (isMobile && !sidebarVisible) {\r\n <button\r\n class=\"floating-btn\"\r\n (click)=\"openMenu()\"\r\n pTooltip=\"{{ 'MENU.OPEN' | translate }}\"\r\n tooltipPosition=\"top\">\r\n <img src=\"/assets/logo.png\" alt=\"App Icon\" />\r\n </button>\r\n}\r\n", styles: ["@charset \"UTF-8\";@keyframes slideIn{0%{transform:translate(60px);opacity:0}to{transform:translate(0);opacity:1}}.animate-slideIn{animation:slideIn .35s cubic-bezier(.25,1,.5,1)}.glass-bg{background:#ffffffbf;backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%);border:1px solid rgba(255,255,255,.25)}@media(max-width:1024px){aside{position:fixed;top:0;right:0;height:100vh;z-index:50}}.floating-btn{position:fixed;bottom:1.25rem;right:1.25rem;z-index:60;width:60px;height:60px;border-radius:50%;background:linear-gradient(135deg,var(--p-primary-500),var(--p-primary-700));box-shadow:0 4px 18px #00000040;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.floating-btn:hover{transform:scale(1.1) rotate(5deg)}.floating-btn img{width:28px;height:28px;border-radius:10px}.active-link{background-color:var(--p-primary-500)!important;color:#fff!important;font-weight:600;box-shadow:0 4px 6px -1px #0000001a;transform:translate(-3px)}.active-link i{color:#fff!important}.active-item-link{background:linear-gradient(to left,var(--p-primary-50),transparent);color:var(--p-primary-600)!important;position:relative;border-right:3px solid var(--p-primary-500);border-radius:0 12px 12px 0}.active-item-link i{color:var(--p-primary-500);filter:drop-shadow(0 0 5px rgba(var(--p-primary-500-rgb),.4))}.active-item-link span{font-weight:700}.animate-slideIn{animation:slideIn .3s ease-out}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.glass-bg::-webkit-scrollbar{width:4px}.glass-bg::-webkit-scrollbar-thumb{background:#0000001a;border-radius:10px}.active-link{background-color:var(--p-primary-50)!important;color:var(--p-primary-700)!important;border-right:4px solid var(--p-primary-500)!important;border-radius:4px 12px 12px 4px!important}.active-link span{font-weight:800!important}.active-link i{color:var(--p-primary-600)!important;transform:scale(1.1)}aside{-webkit-font-smoothing:antialiased;letter-spacing:-.01em}.dark .active-link{background-color:rgba(var(--p-primary-500-rgb),.15)!important;color:var(--p-primary-300)!important}.submenu{animation:menuOpen .25s ease}@keyframes menuOpen{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}aside{box-shadow:0 10px 40px #00000026}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i3$2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1438
1438
|
}
|
|
1439
1439
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: RoutesComponent, decorators: [{
|
|
1440
1440
|
type: Component,
|
|
1441
|
-
args: [{ selector: 'app-routes', standalone: true, imports: [CommonModule, RouterModule, TooltipModule, TranslatePipe, StyleClassModule], template: "<aside class=\"flex h-screen bg-white dark:bg-gray-900 transition-all duration-300\"\n [ngClass]=\"{ 'w-0 overflow-hidden': !sidebarVisible && isMobile }\">\n\n <!-- \uD83C\uDFA8 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0627\u0644\u0631\u0626\u064A\u0633\u064A -->\n <div\n class=\"flex flex-col justify-between pt-4 pb-2 w-16 border-l shadow-xl\n bg-gradient-to-b from-primary-500 via-primary-600 to-primary-700\n text-white rounded-r-3xl\">\n\n <!-- \uD83D\uDD1D \u0627\u0644\u0623\u0639\u0644\u0649 -->\n <div class=\"flex flex-col items-center gap-4\">\n <img src=\"/assets/logo.png\" alt=\"Logo\"\n class=\"w-9 h-9 mt-1 rounded-lg shadow-sm\"/>\n\n <!-- \u0632\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 -->\n <!-- [pTooltip]=\"'TOGGLE_MENU' | translate\" -->\n <button (click)=\"toggleAll()\"\n tooltipPosition=\"right\"\n class=\"text-white hover:scale-110 transition-transform duration-200\">\n <i class=\"pi pi-bars text-lg\"></i>\n </button>\n\n <!-- \u0623\u064A\u0642\u0648\u0646\u0627\u062A -->\n @for (item of secondToLastLevel$ | async; track item) {\n <div class=\"relative flex flex-col items-center\">\n <!-- \u0627\u0644\u0623\u064A\u0642\u0648\u0646\u0629 -->\n <div (click)=\"onMainClick(item)\"\n [pTooltip]=\"item.label | translate\"\n tooltipPosition=\"right\"\n class=\"relative flex items-center justify-center w-10 h-10 rounded-xl cursor-pointer\n hover:bg-white/20 transition-all duration-200\"\n [ngClass]=\"{ 'bg-white/30 scale-105 shadow-inner': item.expanded }\">\n <i [class]=\"item.icon + ' text-xl'\"></i>\n </div>\n </div>\n }\n </div>\n\n <!-- \u2699\uFE0F \u0627\u0644\u0623\u0633\u0641\u0644 -->\n <div class=\"flex flex-col items-center pb-3 text-white/80\">\n <i class=\"pi pi-cog text-lg hover:text-white cursor-pointer transition\"></i>\n </div>\n </div>\n\n <!-- \uD83D\uDCCB \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0641\u0631\u0639\u064A\u0629 -->\n @if (subSidebarVisible) {\n <div\n
|
|
1441
|
+
args: [{ selector: 'app-routes', standalone: true, imports: [CommonModule, RouterModule, TooltipModule, TranslatePipe, StyleClassModule], template: "<aside class=\"flex h-screen bg-white dark:bg-gray-900 transition-all duration-300\"\r\n [ngClass]=\"{ 'w-0 overflow-hidden': !sidebarVisible && isMobile }\">\r\n\r\n <!-- \uD83C\uDFA8 \u0627\u0644\u0634\u0631\u064A\u0637 \u0627\u0644\u062C\u0627\u0646\u0628\u064A \u0627\u0644\u0631\u0626\u064A\u0633\u064A -->\r\n <div\r\n class=\"flex flex-col justify-between pt-4 pb-2 w-16 border-l shadow-xl\r\n bg-gradient-to-b from-primary-500 via-primary-600 to-primary-700\r\n text-white rounded-r-3xl\">\r\n\r\n <!-- \uD83D\uDD1D \u0627\u0644\u0623\u0639\u0644\u0649 -->\r\n <div class=\"flex flex-col items-center gap-4\">\r\n <img src=\"/assets/logo.png\" alt=\"Logo\"\r\n class=\"w-9 h-9 mt-1 rounded-lg shadow-sm\"/>\r\n\r\n <!-- \u0632\u0631 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 -->\r\n <!-- [pTooltip]=\"'TOGGLE_MENU' | translate\" -->\r\n <button (click)=\"toggleAll()\"\r\n tooltipPosition=\"right\"\r\n class=\"text-white hover:scale-110 transition-transform duration-200\">\r\n <i class=\"pi pi-bars text-lg\"></i>\r\n </button>\r\n\r\n <!-- \u0623\u064A\u0642\u0648\u0646\u0627\u062A -->\r\n @for (item of secondToLastLevel$ | async; track item) {\r\n <div class=\"relative flex flex-col items-center\">\r\n <!-- \u0627\u0644\u0623\u064A\u0642\u0648\u0646\u0629 -->\r\n <div (click)=\"onMainClick(item)\"\r\n [pTooltip]=\"item.label | translate\"\r\n tooltipPosition=\"right\"\r\n class=\"relative flex items-center justify-center w-10 h-10 rounded-xl cursor-pointer\r\n hover:bg-white/20 transition-all duration-200\"\r\n [ngClass]=\"{ 'bg-white/30 scale-105 shadow-inner': item.expanded }\">\r\n <i [class]=\"item.icon + ' text-xl'\"></i>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- \u2699\uFE0F \u0627\u0644\u0623\u0633\u0641\u0644 -->\r\n <div class=\"flex flex-col items-center pb-3 text-white/80\">\r\n <i class=\"pi pi-cog text-lg hover:text-white cursor-pointer transition\"></i>\r\n </div>\r\n </div>\r\n\r\n <!-- \uD83D\uDCCB \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0641\u0631\u0639\u064A\u0629 -->\r\n @if (subSidebarVisible) {\r\n <div\r\n class=\"w-[290px] max-w-[290px] min-w-[260px] border-l border-gray-200 dark:border-gray-700 glass-bg animate-slideIn\r\n shadow-2xl rounded-l-3xl p-4 rtl:text-right overflow-y-auto overflow-x-hidden transition-all duration-300\"\r\n [ngClass]=\"{ 'absolute top-0 right-16 h-full z-40': isMobile }\">\r\n <!-- \u0632\u0631 \u0631\u062C\u0648\u0639 -->\r\n <button (click)=\"closeMenu()\"\r\n class=\"flex items-center gap-2 mb-4 text-gray-500 dark:text-gray-300 hover:text-primary-600 transition\">\r\n <i class=\"pi\" [ngClass]=\"isMobile ? 'pi-angle-right' : 'pi-angle-right'\"></i>\r\n <span>{{ 'back' | translate }}</span>\r\n </button>\r\n <!-- Recursive rendering -->\r\n @if (menuItems$ | async; as menuItems) {\r\n <ng-container *ngTemplateOutlet=\"renderMenu; context:{ $implicit: menuItems, level: 1 }\"></ng-container>\r\n}\r\n\r\n<ng-template #renderMenu let-items let-level=\"level\">\r\n @for (item of items; track item) {\r\n\r\n @if (!item.items?.length) {\r\n @let link = getLinkProps(item);\r\n <div class=\"mb-1\">\r\n @if (link.isExternal) {\r\n <a [href]=\"link.href\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n (click)=\"$event.stopPropagation()\"\r\n class=\"flex items-center gap-2 px-3 py-2 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n <span class=\"min-w-0 break-words whitespace-normal\">{{ item.label | translate }}</span>\r\n <i class=\"pi pi-external-link text-[10px] opacity-50\"></i>\r\n </a>\r\n } @else {\r\n <div class=\"flex items-center gap-2\">\r\n <a [routerLink]=\"link.routerLink\"\r\n (click)=\"onNavigate()\"\r\n routerLinkActive=\"active-link\"\r\n class=\"flex-1 min-w-0 flex items-center gap-2 px-2 py-1 rounded-lg transition-all hover:bg-primary-50 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-200\">\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n <span class=\"min-w-0 break-words whitespace-normal\">\r\n {{ item.label | translate }}</span>\r\n </a>\r\n\r\n@if (link.addRoute) {\r\n <a\r\n [routerLink]=\"[link.addRoute]\"\r\n (click)=\"$event.stopPropagation(); onNavigate()\"\r\n class=\"shrink-0 inline-flex items-center justify-center w-7 h-7 rounded-full text-gray-400 hover:text-primary-500 hover:bg-primary-50 dark:text-gray-500 dark:hover:text-primary-400 dark:hover:bg-primary-900/20 transition-all duration-200\"\r\n [pTooltip]=\"'ADD' | translate\"\r\n tooltipPosition=\"top\">\r\n <i class=\"pi pi-plus text-xs\"></i>\r\n </a>\r\n}\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n @if (item.items?.length) {\r\n <div class=\"mb-1\">\r\n\r\n <div\r\n (click)=\"onParentClick(item)\"\r\n [style.font-size.rem]=\"1.1 - (level * 0.05)\"\r\n [ngClass]=\"{\r\n 'font-bold': level === 1,\r\n 'font-semibold': level === 2,\r\n 'font-medium': level >= 3,\r\n 'bg-primary-50 text-primary-700 border-r-4 border-primary-500': item.expanded\r\n }\"\r\n class=\"flex justify-between items-center py-2 px-3 rounded-lg cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 transition text-gray-800 dark:text-gray-200\">\r\n\r\n <div class=\"flex items-center gap-2\">\r\n\r\n <i [class]=\"item.icon + ' text-base'\"></i>\r\n\r\n <span>\r\n {{ item.label | translate }}\r\n </span>\r\n\r\n </div>\r\n\r\n <i\r\n class=\"pi\"\r\n [ngClass]=\"item.expanded ? 'pi-chevron-down' : 'pi-chevron-left'\"\r\n style=\"font-size:0.6rem;\">\r\n </i>\r\n\r\n </div>\r\n\r\n @if (item.expanded) {\r\n <div class=\"mr-4 border-r border-gray-200 dark:border-gray-700 pr-2 mt-1\">\r\n\r\n <ng-container\r\n *ngTemplateOutlet=\"renderMenu; context:{ $implicit: item.items, level: level + 1 }\">\r\n </ng-container>\r\n\r\n </div>\r\n }\r\n\r\n </div>\r\n }\r\n\r\n }\r\n</ng-template>\r\n\r\n </div>\r\n}\r\n\r\n</aside>\r\n\r\n<!-- \uD83C\uDF1F \u0627\u0644\u0632\u0631 \u0627\u0644\u0639\u0627\u0626\u0645 \u0627\u0644\u062D\u062F\u064A\u062B -->\r\n@if (isMobile && !sidebarVisible) {\r\n <button\r\n class=\"floating-btn\"\r\n (click)=\"openMenu()\"\r\n pTooltip=\"{{ 'MENU.OPEN' | translate }}\"\r\n tooltipPosition=\"top\">\r\n <img src=\"/assets/logo.png\" alt=\"App Icon\" />\r\n </button>\r\n}\r\n", styles: ["@charset \"UTF-8\";@keyframes slideIn{0%{transform:translate(60px);opacity:0}to{transform:translate(0);opacity:1}}.animate-slideIn{animation:slideIn .35s cubic-bezier(.25,1,.5,1)}.glass-bg{background:#ffffffbf;backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%);border:1px solid rgba(255,255,255,.25)}@media(max-width:1024px){aside{position:fixed;top:0;right:0;height:100vh;z-index:50}}.floating-btn{position:fixed;bottom:1.25rem;right:1.25rem;z-index:60;width:60px;height:60px;border-radius:50%;background:linear-gradient(135deg,var(--p-primary-500),var(--p-primary-700));box-shadow:0 4px 18px #00000040;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.floating-btn:hover{transform:scale(1.1) rotate(5deg)}.floating-btn img{width:28px;height:28px;border-radius:10px}.active-link{background-color:var(--p-primary-500)!important;color:#fff!important;font-weight:600;box-shadow:0 4px 6px -1px #0000001a;transform:translate(-3px)}.active-link i{color:#fff!important}.active-item-link{background:linear-gradient(to left,var(--p-primary-50),transparent);color:var(--p-primary-600)!important;position:relative;border-right:3px solid var(--p-primary-500);border-radius:0 12px 12px 0}.active-item-link i{color:var(--p-primary-500);filter:drop-shadow(0 0 5px rgba(var(--p-primary-500-rgb),.4))}.active-item-link span{font-weight:700}.animate-slideIn{animation:slideIn .3s ease-out}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.glass-bg::-webkit-scrollbar{width:4px}.glass-bg::-webkit-scrollbar-thumb{background:#0000001a;border-radius:10px}.active-link{background-color:var(--p-primary-50)!important;color:var(--p-primary-700)!important;border-right:4px solid var(--p-primary-500)!important;border-radius:4px 12px 12px 4px!important}.active-link span{font-weight:800!important}.active-link i{color:var(--p-primary-600)!important;transform:scale(1.1)}aside{-webkit-font-smoothing:antialiased;letter-spacing:-.01em}.dark .active-link{background-color:rgba(var(--p-primary-500-rgb),.15)!important;color:var(--p-primary-300)!important}.submenu{animation:menuOpen .25s ease}@keyframes menuOpen{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}aside{box-shadow:0 10px 40px #00000026}\n"] }]
|
|
1442
1442
|
}], ctorParameters: () => [], propDecorators: { onResize: [{
|
|
1443
1443
|
type: HostListener,
|
|
1444
1444
|
args: ['window:resize']
|
|
@@ -1447,11 +1447,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
1447
1447
|
class AuthWrapperComponent {
|
|
1448
1448
|
constructor() { }
|
|
1449
1449
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AuthWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1450
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AuthWrapperComponent, isStandalone: true, selector: "abp-auth-wrapper", ngImport: i0, template: " <ng-content></ng-content>\n\n\n<!-- <div class=\"row\">\n <div class=\"mx-auto col col-md-5\">\n @if ((service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible) {\n <abp-tenant-box\n *abpReplaceableTemplate=\"{ componentKey: service.tenantBoxKey }\"\n ></abp-tenant-box>\n }\n\n <div class=\"abp-account-container\">\n @if (service.enableLocalLogin$ | async) {\n <div class=\"card mt-3 shadow-sm rounded\">\n <div class=\"card-body p-5\">\n <ng-content></ng-content>\n </div>\n </div>\n } @else {\n <div class=\"alert alert-warning\">\n <strong>{{ 'AbpAccount::InvalidLoginRequest' | localize }}</strong>\n {{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | localize }}\n </div>\n }\n </div>\n </div>\n</div> -->\n" });
|
|
1450
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AuthWrapperComponent, isStandalone: true, selector: "abp-auth-wrapper", ngImport: i0, template: " <ng-content></ng-content>\r\n\r\n\r\n<!-- <div class=\"row\">\r\n <div class=\"mx-auto col col-md-5\">\r\n @if ((service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible) {\r\n <abp-tenant-box\r\n *abpReplaceableTemplate=\"{ componentKey: service.tenantBoxKey }\"\r\n ></abp-tenant-box>\r\n }\r\n\r\n <div class=\"abp-account-container\">\r\n @if (service.enableLocalLogin$ | async) {\r\n <div class=\"card mt-3 shadow-sm rounded\">\r\n <div class=\"card-body p-5\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"alert alert-warning\">\r\n <strong>{{ 'AbpAccount::InvalidLoginRequest' | localize }}</strong>\r\n {{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | localize }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div> -->\r\n" });
|
|
1451
1451
|
}
|
|
1452
1452
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AuthWrapperComponent, decorators: [{
|
|
1453
1453
|
type: Component,
|
|
1454
|
-
args: [{ standalone: true, imports: [], selector: 'abp-auth-wrapper', template: " <ng-content></ng-content>\n\n\n<!-- <div class=\"row\">\n <div class=\"mx-auto col col-md-5\">\n @if ((service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible) {\n <abp-tenant-box\n *abpReplaceableTemplate=\"{ componentKey: service.tenantBoxKey }\"\n ></abp-tenant-box>\n }\n\n <div class=\"abp-account-container\">\n @if (service.enableLocalLogin$ | async) {\n <div class=\"card mt-3 shadow-sm rounded\">\n <div class=\"card-body p-5\">\n <ng-content></ng-content>\n </div>\n </div>\n } @else {\n <div class=\"alert alert-warning\">\n <strong>{{ 'AbpAccount::InvalidLoginRequest' | localize }}</strong>\n {{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | localize }}\n </div>\n }\n </div>\n </div>\n</div> -->\n" }]
|
|
1454
|
+
args: [{ standalone: true, imports: [], selector: 'abp-auth-wrapper', template: " <ng-content></ng-content>\r\n\r\n\r\n<!-- <div class=\"row\">\r\n <div class=\"mx-auto col col-md-5\">\r\n @if ((service.isMultiTenancyEnabled$ | async) && service.isTenantBoxVisible) {\r\n <abp-tenant-box\r\n *abpReplaceableTemplate=\"{ componentKey: service.tenantBoxKey }\"\r\n ></abp-tenant-box>\r\n }\r\n\r\n <div class=\"abp-account-container\">\r\n @if (service.enableLocalLogin$ | async) {\r\n <div class=\"card mt-3 shadow-sm rounded\">\r\n <div class=\"card-body p-5\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"alert alert-warning\">\r\n <strong>{{ 'AbpAccount::InvalidLoginRequest' | localize }}</strong>\r\n {{ 'AbpAccount::ThereAreNoLoginSchemesConfiguredForThisClient' | localize }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</div> -->\r\n" }]
|
|
1455
1455
|
}], ctorParameters: () => [] });
|
|
1456
1456
|
|
|
1457
1457
|
class AccountLayoutComponent {
|
|
@@ -1466,11 +1466,11 @@ class AccountLayoutComponent {
|
|
|
1466
1466
|
// this.service.subscribeWindowSize();
|
|
1467
1467
|
}
|
|
1468
1468
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AccountLayoutComponent, deps: [{ token: LayoutService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1469
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AccountLayoutComponent, isStandalone: true, selector: "abp-layout-account", providers: [LayoutService, SubscriptionService], ngImport: i0, template: " <abp-auth-wrapper\n *abpReplaceableTemplate=\"{\n componentKey: authWrapperKey\n }\"\n >\n <router-outlet #outlet=\"outlet\"></router-outlet>\n </abp-auth-wrapper>\n", dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AuthWrapperComponent, selector: "abp-auth-wrapper" }, { kind: "directive", type: ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }] });
|
|
1469
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: AccountLayoutComponent, isStandalone: true, selector: "abp-layout-account", providers: [LayoutService, SubscriptionService], ngImport: i0, template: " <abp-auth-wrapper\r\n *abpReplaceableTemplate=\"{\r\n componentKey: authWrapperKey\r\n }\"\r\n >\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n </abp-auth-wrapper>\r\n", dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AuthWrapperComponent, selector: "abp-auth-wrapper" }, { kind: "directive", type: ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }] });
|
|
1470
1470
|
}
|
|
1471
1471
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AccountLayoutComponent, decorators: [{
|
|
1472
1472
|
type: Component,
|
|
1473
|
-
args: [{ standalone: true, imports: [RoutesComponent, NavItemsComponent, RouterOutlet, AuthWrapperComponent, ReplaceableTemplateDirective], selector: 'abp-layout-account', providers: [LayoutService, SubscriptionService], template: " <abp-auth-wrapper\n *abpReplaceableTemplate=\"{\n componentKey: authWrapperKey\n }\"\n >\n <router-outlet #outlet=\"outlet\"></router-outlet>\n </abp-auth-wrapper>\n" }]
|
|
1473
|
+
args: [{ standalone: true, imports: [RoutesComponent, NavItemsComponent, RouterOutlet, AuthWrapperComponent, ReplaceableTemplateDirective], selector: 'abp-layout-account', providers: [LayoutService, SubscriptionService], template: " <abp-auth-wrapper\r\n *abpReplaceableTemplate=\"{\r\n componentKey: authWrapperKey\r\n }\"\r\n >\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n </abp-auth-wrapper>\r\n" }]
|
|
1474
1474
|
}], ctorParameters: () => [{ type: LayoutService }] });
|
|
1475
1475
|
|
|
1476
1476
|
class ApplicationLayoutComponent {
|
|
@@ -1646,11 +1646,11 @@ class ApplicationLayoutComponent {
|
|
|
1646
1646
|
}
|
|
1647
1647
|
}
|
|
1648
1648
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ApplicationLayoutComponent, deps: [{ token: LayoutService }, { token: i0.Renderer2 }, { token: i2$2.Router }, { token: i0.NgZone }, { token: i3$3.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1649
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ApplicationLayoutComponent, isStandalone: true, selector: "abp-layout-application", providers: [LayoutService, SubscriptionService], ngImport: i0, template: "\n\n<div class=\"flex h-screen overflow-hidden\">\n\n <!-- Sidebar stays fixed -->\n\n <app-routes\n *abpReplaceableTemplate=\"{\n componentKey: service.routesComponentKey,\n inputs: { smallScreen: { value: service.smallScreen } }\n }\"\n class=\"mb-2 md:mb-0\"\n ></app-routes>\n\n <!-- Main content scrolls -->\n <main class=\"flex-1 flex flex-col overflow-hidden\">\n\n <!-- Optional Topbar -->\n <!-- @if (showTopbar) { -->\n\n <app-nav-items\n *abpReplaceableTemplate=\"{\n componentKey: service.navItemsComponentKey\n }\"\n ></app-nav-items>\n\n <!-- p-6 space-y-6 -->\n <div class=\"flex-1 overflow-y-auto\">\n <router-outlet #outlet=\"outlet\"></router-outlet>\n </div>\n\n <!-- <app-footer></app-footer> -->\n\n </main>\n\n </div>\n\n", dependencies: [{ kind: "component", type: RoutesComponent, selector: "app-routes" }, { kind: "component", type: NavItemsComponent, selector: "app-nav-items" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }], animations: [ /* slideFromBottom, */ /* appModuleAnimation() */] });
|
|
1649
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ApplicationLayoutComponent, isStandalone: true, selector: "abp-layout-application", providers: [LayoutService, SubscriptionService], ngImport: i0, template: "\r\n\r\n<div class=\"flex h-screen overflow-hidden\">\r\n\r\n <!-- Sidebar stays fixed -->\r\n\r\n <app-routes\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.routesComponentKey,\r\n inputs: { smallScreen: { value: service.smallScreen } }\r\n }\"\r\n class=\"mb-2 md:mb-0\"\r\n ></app-routes>\r\n\r\n <!-- Main content scrolls -->\r\n <main class=\"flex-1 flex flex-col overflow-hidden\">\r\n\r\n <!-- Optional Topbar -->\r\n <!-- @if (showTopbar) { -->\r\n\r\n <app-nav-items\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.navItemsComponentKey\r\n }\"\r\n ></app-nav-items>\r\n\r\n <!-- p-6 space-y-6 -->\r\n <div class=\"flex-1 overflow-y-auto\">\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n </div>\r\n\r\n <!-- <app-footer></app-footer> -->\r\n\r\n </main>\r\n\r\n </div>\r\n\r\n", dependencies: [{ kind: "component", type: RoutesComponent, selector: "app-routes" }, { kind: "component", type: NavItemsComponent, selector: "app-nav-items" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: ReplaceableTemplateDirective, selector: "[abpReplaceableTemplate]", inputs: ["abpReplaceableTemplate"] }], animations: [ /* slideFromBottom, */ /* appModuleAnimation() */] });
|
|
1650
1650
|
}
|
|
1651
1651
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ApplicationLayoutComponent, decorators: [{
|
|
1652
1652
|
type: Component,
|
|
1653
|
-
args: [{ standalone: true, imports: [RoutesComponent, NavItemsComponent, RouterOutlet, ReplaceableTemplateDirective], selector: 'abp-layout-application', animations: [ /* slideFromBottom, */ /* appModuleAnimation() */], providers: [LayoutService, SubscriptionService], template: "\n\n<div class=\"flex h-screen overflow-hidden\">\n\n <!-- Sidebar stays fixed -->\n\n <app-routes\n *abpReplaceableTemplate=\"{\n componentKey: service.routesComponentKey,\n inputs: { smallScreen: { value: service.smallScreen } }\n }\"\n class=\"mb-2 md:mb-0\"\n ></app-routes>\n\n <!-- Main content scrolls -->\n <main class=\"flex-1 flex flex-col overflow-hidden\">\n\n <!-- Optional Topbar -->\n <!-- @if (showTopbar) { -->\n\n <app-nav-items\n *abpReplaceableTemplate=\"{\n componentKey: service.navItemsComponentKey\n }\"\n ></app-nav-items>\n\n <!-- p-6 space-y-6 -->\n <div class=\"flex-1 overflow-y-auto\">\n <router-outlet #outlet=\"outlet\"></router-outlet>\n </div>\n\n <!-- <app-footer></app-footer> -->\n\n </main>\n\n </div>\n\n" }]
|
|
1653
|
+
args: [{ standalone: true, imports: [RoutesComponent, NavItemsComponent, RouterOutlet, ReplaceableTemplateDirective], selector: 'abp-layout-application', animations: [ /* slideFromBottom, */ /* appModuleAnimation() */], providers: [LayoutService, SubscriptionService], template: "\r\n\r\n<div class=\"flex h-screen overflow-hidden\">\r\n\r\n <!-- Sidebar stays fixed -->\r\n\r\n <app-routes\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.routesComponentKey,\r\n inputs: { smallScreen: { value: service.smallScreen } }\r\n }\"\r\n class=\"mb-2 md:mb-0\"\r\n ></app-routes>\r\n\r\n <!-- Main content scrolls -->\r\n <main class=\"flex-1 flex flex-col overflow-hidden\">\r\n\r\n <!-- Optional Topbar -->\r\n <!-- @if (showTopbar) { -->\r\n\r\n <app-nav-items\r\n *abpReplaceableTemplate=\"{\r\n componentKey: service.navItemsComponentKey\r\n }\"\r\n ></app-nav-items>\r\n\r\n <!-- p-6 space-y-6 -->\r\n <div class=\"flex-1 overflow-y-auto\">\r\n <router-outlet #outlet=\"outlet\"></router-outlet>\r\n </div>\r\n\r\n <!-- <app-footer></app-footer> -->\r\n\r\n </main>\r\n\r\n </div>\r\n\r\n" }]
|
|
1654
1654
|
}], ctorParameters: () => [{ type: LayoutService }, { type: i0.Renderer2 }, { type: i2$2.Router }, { type: i0.NgZone }, { type: i3$3.LocalizationService }] });
|
|
1655
1655
|
|
|
1656
1656
|
class EmptyLayoutComponent {
|