@sd-angular/core 19.0.0-beta.58 → 19.0.0-beta.59
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/components/avatar/src/avatar.component.d.ts +14 -10
- package/fesm2022/sd-angular-core-components-avatar.mjs +46 -31
- package/fesm2022/sd-angular-core-components-avatar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-layout.mjs +1 -1
- package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
- package/package.json +49 -49
- package/sd-angular-core-19.0.0-beta.59.tgz +0 -0
- package/sd-angular-core-19.0.0-beta.58.tgz +0 -0
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import { OnInit } from '@angular/core';
|
|
2
1
|
import * as i0 from "@angular/core";
|
|
3
|
-
export declare class SdAvatar
|
|
2
|
+
export declare class SdAvatar {
|
|
4
3
|
#private;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
/**
|
|
5
|
+
* The source string to be used for the avatar.
|
|
6
|
+
* - If it matches a URL pattern, an image is displayed.
|
|
7
|
+
* - If it is a string representing a name, initials and a colored background are generated.
|
|
8
|
+
* - If undefined, it falls back to a neutral ? initial.
|
|
9
|
+
*/
|
|
10
|
+
readonly src: import("@angular/core").InputSignal<string | null | undefined>;
|
|
11
|
+
readonly size: import("@angular/core").InputSignal<number>;
|
|
12
|
+
constructor();
|
|
13
|
+
readonly isUrl: import("@angular/core").Signal<boolean>;
|
|
14
|
+
readonly bgColor: import("@angular/core").Signal<string>;
|
|
15
|
+
readonly initials: import("@angular/core").Signal<string>;
|
|
12
16
|
handleError(): void;
|
|
13
17
|
static ɵfac: i0.ɵɵFactoryDeclaration<SdAvatar, never>;
|
|
14
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SdAvatar, "sd-avatar", never, { "src": { "alias": "src"; "required": true; }; "size": { "alias": "size"; "required": false;
|
|
18
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SdAvatar, "sd-avatar", never, { "src": { "alias": "src"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
15
19
|
}
|
|
@@ -1,33 +1,55 @@
|
|
|
1
1
|
import { CommonModule } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { input, signal, effect, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
4
|
|
|
5
5
|
class SdAvatar {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
/**
|
|
7
|
+
* The source string to be used for the avatar.
|
|
8
|
+
* - If it matches a URL pattern, an image is displayed.
|
|
9
|
+
* - If it is a string representing a name, initials and a colored background are generated.
|
|
10
|
+
* - If undefined, it falls back to a neutral ? initial.
|
|
11
|
+
*/
|
|
12
|
+
src = input.required();
|
|
13
|
+
size = input(32);
|
|
14
|
+
#imageError = signal(false);
|
|
15
|
+
constructor() {
|
|
16
|
+
// Reset image error state whenever src changes
|
|
17
|
+
effect(() => {
|
|
18
|
+
this.src();
|
|
19
|
+
this.#imageError.set(false);
|
|
20
|
+
});
|
|
14
21
|
}
|
|
15
|
-
|
|
16
|
-
//
|
|
22
|
+
isUrl = computed(() => {
|
|
23
|
+
// If image has failed to load, treat it as a non-url to fallback to initials using the literal URL text
|
|
24
|
+
if (this.#imageError()) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const val = this.src() || '';
|
|
17
28
|
const urlPattern = /^(http|https|data:image|\/)/;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
29
|
+
return urlPattern.test(val);
|
|
30
|
+
});
|
|
31
|
+
bgColor = computed(() => {
|
|
32
|
+
if (this.isUrl()) {
|
|
33
|
+
return 'transparent';
|
|
22
34
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
35
|
+
const val = this.src() || '';
|
|
36
|
+
if (!val) {
|
|
37
|
+
return '#bdc3c7';
|
|
26
38
|
}
|
|
27
|
-
|
|
39
|
+
return this.#generateColor(val);
|
|
40
|
+
});
|
|
41
|
+
initials = computed(() => {
|
|
42
|
+
if (this.isUrl()) {
|
|
43
|
+
return '';
|
|
44
|
+
}
|
|
45
|
+
const val = this.src() || '';
|
|
46
|
+
if (!val) {
|
|
47
|
+
return '?';
|
|
48
|
+
}
|
|
49
|
+
return this.#getInitials(val);
|
|
50
|
+
});
|
|
28
51
|
handleError() {
|
|
29
|
-
this.
|
|
30
|
-
this.#init();
|
|
52
|
+
this.#imageError.set(true);
|
|
31
53
|
}
|
|
32
54
|
#getInitials = (name) => {
|
|
33
55
|
return (name
|
|
@@ -68,19 +90,12 @@ class SdAvatar {
|
|
|
68
90
|
return colors[Math.abs(hash) % colors.length];
|
|
69
91
|
};
|
|
70
92
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdAvatar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
71
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdAvatar, isStandalone: true, selector: "sd-avatar", inputs: { src: "src", size: "size",
|
|
93
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: SdAvatar, isStandalone: true, selector: "sd-avatar", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"sd-avatar\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [style.line-height.px]=\"size()\" [style.backgroundColor]=\"bgColor()\">\n @if (isUrl()) {\n <img [src]=\"src()\" (error)=\"handleError()\" alt=\"avatar\" />\n } @else {\n <span class=\"sd-avatar-text\" [style.fontSize.px]=\"size() / 2.5\">\n {{ initials() }}\n </span>\n }\n</div>\n", styles: [".sd-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:50%;overflow:hidden;color:#fff;font-weight:500;-webkit-user-select:none;user-select:none;background-size:cover}.sd-avatar img{width:100%;height:100%;object-fit:cover}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
72
94
|
}
|
|
73
95
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdAvatar, decorators: [{
|
|
74
96
|
type: Component,
|
|
75
|
-
args: [{ selector: 'sd-avatar', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sd-avatar\" [style.width.px]=\"size\" [style.height.px]=\"size\" [style.line-height.px]=\"size\" [style.backgroundColor]=\"bgColor\">\
|
|
76
|
-
}],
|
|
77
|
-
type: Input,
|
|
78
|
-
args: [{ required: true }]
|
|
79
|
-
}], size: [{
|
|
80
|
-
type: Input
|
|
81
|
-
}], name: [{
|
|
82
|
-
type: Input
|
|
83
|
-
}] } });
|
|
97
|
+
args: [{ selector: 'sd-avatar', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sd-avatar\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [style.line-height.px]=\"size()\" [style.backgroundColor]=\"bgColor()\">\n @if (isUrl()) {\n <img [src]=\"src()\" (error)=\"handleError()\" alt=\"avatar\" />\n } @else {\n <span class=\"sd-avatar-text\" [style.fontSize.px]=\"size() / 2.5\">\n {{ initials() }}\n </span>\n }\n</div>\n", styles: [".sd-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:50%;overflow:hidden;color:#fff;font-weight:500;-webkit-user-select:none;user-select:none;background-size:cover}.sd-avatar img{width:100%;height:100%;object-fit:cover}\n"] }]
|
|
98
|
+
}], ctorParameters: () => [] });
|
|
84
99
|
|
|
85
100
|
/**
|
|
86
101
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components-avatar.mjs","sources":["../../../projects/sd-angular/components/avatar/src/avatar.component.ts","../../../projects/sd-angular/components/avatar/src/avatar.component.html","../../../projects/sd-angular/components/avatar/sd-angular-core-components-avatar.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-avatar.mjs","sources":["../../../projects/sd-angular/components/avatar/src/avatar.component.ts","../../../projects/sd-angular/components/avatar/src/avatar.component.html","../../../projects/sd-angular/components/avatar/sd-angular-core-components-avatar.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, input, signal } from '@angular/core';\n\n@Component({\n selector: 'sd-avatar',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './avatar.component.html',\n styleUrls: ['./avatar.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdAvatar {\n /**\n * The source string to be used for the avatar.\n * - If it matches a URL pattern, an image is displayed.\n * - If it is a string representing a name, initials and a colored background are generated.\n * - If undefined, it falls back to a neutral ? initial.\n */\n readonly src = input.required<string | undefined | null>();\n readonly size = input<number>(32);\n\n readonly #imageError = signal<boolean>(false);\n\n constructor() {\n // Reset image error state whenever src changes\n effect(() => {\n this.src();\n this.#imageError.set(false);\n });\n }\n\n readonly isUrl = computed(() => {\n // If image has failed to load, treat it as a non-url to fallback to initials using the literal URL text\n if (this.#imageError()) {\n return false;\n }\n const val = this.src() || '';\n const urlPattern = /^(http|https|data:image|\\/)/;\n return urlPattern.test(val);\n });\n\n readonly bgColor = computed(() => {\n if (this.isUrl()) {\n return 'transparent';\n }\n const val = this.src() || '';\n if (!val) {\n return '#bdc3c7';\n }\n return this.#generateColor(val);\n });\n\n readonly initials = computed(() => {\n if (this.isUrl()) {\n return '';\n }\n const val = this.src() || '';\n if (!val) {\n return '?';\n }\n return this.#getInitials(val);\n });\n\n handleError() {\n this.#imageError.set(true);\n }\n\n #getInitials = (name: string): string => {\n return (\n name\n .trim()\n .split(' ')\n .filter(Boolean)\n .map(n => n[0])\n .join('')\n .toUpperCase()\n .substring(0, 2) || ''\n );\n };\n\n #generateColor = (name: string): string => {\n const colors = [\n '#1abc9c',\n '#2ecc71',\n '#3498db',\n '#9b59b6',\n '#34495e',\n '#16a085',\n '#27ae60',\n '#2980b9',\n '#8e44ad',\n '#2c3e50',\n '#f1c40f',\n '#e67e22',\n '#e74c3c',\n '#95a5a6',\n '#f39c12',\n '#d35400',\n '#c0392b',\n '#bdc3c7',\n '#7f8c8d',\n ];\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return colors[Math.abs(hash) % colors.length];\n };\n}\n","<div class=\"sd-avatar\" [style.width.px]=\"size()\" [style.height.px]=\"size()\" [style.line-height.px]=\"size()\" [style.backgroundColor]=\"bgColor()\">\n @if (isUrl()) {\n <img [src]=\"src()\" (error)=\"handleError()\" alt=\"avatar\" />\n } @else {\n <span class=\"sd-avatar-text\" [style.fontSize.px]=\"size() / 2.5\">\n {{ initials() }}\n </span>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -339,7 +339,7 @@ class LayoutUserComponent {
|
|
|
339
339
|
this.toggleMenuLock.emit(event);
|
|
340
340
|
};
|
|
341
341
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: LayoutUserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
342
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: LayoutUserComponent, isStandalone: true, selector: "lib-layout-user", inputs: { isMobileOrTablet: { classPropertyName: "isMobileOrTablet", publicName: "isMobileOrTablet", isSignal: true, isRequired: false, transformFunction: null }, isMenuLock: { classPropertyName: "isMenuLock", publicName: "isMenuLock", isSignal: true, isRequired: false, transformFunction: null }, isShowSidebar: { classPropertyName: "isShowSidebar", publicName: "isShowSidebar", isSignal: true, isRequired: false, transformFunction: null }, userInfo: { classPropertyName: "userInfo", publicName: "userInfo", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { menuClosed: "menuClosed", menuOpened: "menuOpened", toggleMenuLock: "toggleMenuLock" }, ngImport: i0, template: "@let _userInfo = userInfo();\r\n@let avatar = _userInfo?.avatar || _userInfo?.fullName || _userInfo?.username || _userInfo?.email;\r\n\r\n<div class=\"c-layout-user-wrapper\">\r\n <div class=\"c-layout-user-avatar\" [matMenuTriggerFor]=\"userMenu\" (menuClosed)=\"onMenuClosed()\" (menuOpened)=\"onMenuOpened()\">\r\n <sd-avatar [src]=\"avatar\" [size]=\"32\"></sd-avatar>\r\n </div>\r\n\r\n @if (!isMobileOrTablet()) {\r\n <div aria-hidden=\"true\" mat-mini-fab class=\"c-layout-icon-toggle\" (click)=\"onToggleMenuLock($event)\">\r\n <mat-icon style=\"color: #8c8c8c\">\r\n {{ isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left' }}\r\n </mat-icon>\r\n </div>\r\n }\r\n</div>\r\n\r\n<mat-menu #userMenu=\"matMenu\" xPosition=\"before\" backdropClass=\"c-user-menu-backdrop-f90ce131-fa4c-4f71-a49b-ab7fa374fdd0\">\r\n <div aria-hidden=\"true\" class=\"c-user-menu-wrapper\" (click)=\"keepOpenWhenClickInsideMenu($event)\">\r\n <div class=\"c-user-info-wrapper\">\r\n <div class=\"c-user-avatar\">\r\n <sd-avatar [src]=\"avatar\" [size]=\"40\"></sd-avatar>\r\n </div>\r\n <span class=\"c-user-name\">{{ _userInfo.fullName || _userInfo.username }}</span>\r\n <span class=\"c-user-email\">{{ _userInfo.email }}</span>\r\n </div>\r\n\r\n @if (changePasswordLayoutConfig) {\r\n <div class=\"c-sign-button-wrapper\">\r\n <button class=\"c-account-options\" (click)=\"changePassword()\">\r\n <img alt=\"lock\" />\r\n <span>\u0110\u1ED5i m\u1EADt kh\u1EA9u</span>\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"c-sign-button-wrapper\">\r\n <button class=\"c-sign-button\" mat-flat-button (click)=\"logout()\">\u0110\u0103ng xu\u1EA5t</button>\r\n </div>\r\n </div>\r\n</mat-menu>", styles: ["::ng-deep .c-user-menu-backdrop-f90ce131-fa4c-4f71-a49b-ab7fa374fdd0+* .cdk-overlay-pane{transform:translate(277px,83px)}.c-layout-user-wrapper{display:flex;flex-direction:column;align-items:center;width:60px;height:80px}.c-layout-user-wrapper .c-layout-user-avatar{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer}.c-layout-user-wrapper .c-layout-icon-toggle{background-color:transparent;border-top:1px solid #f0f0f0;box-shadow:none;margin-top:10px;width:32px;height:40px;display:flex;justify-content:center;align-items:center;cursor:pointer}.c-user-menu-wrapper .c-user-info-wrapper{width:250px;padding:16px;display:flex;flex-direction:column;align-items:center;gap:8px}.c-user-menu-wrapper .c-user-info-wrapper .c-user-avatar{width:40px;height:40px}.c-user-menu-wrapper .c-user-info-wrapper .c-user-name{font-size:16px;font-weight:700;text-align:center}.c-user-menu-wrapper .c-user-info-wrapper .c-user-email{font-size:14px;color:#7a7a7a;text-align:center}.c-user-menu-wrapper .c-sign-button-wrapper{text-align:center;padding:16px 16px 8px;width:100%;border-top:1px solid #dee2e6}.c-user-menu-wrapper .c-sign-button-wrapper .c-account-options{all:unset;cursor:pointer;font-size:14px;display:flex;align-items:center;gap:8px}.c-user-menu-wrapper .c-sign-button-wrapper .c-account-options img{scale:.875;content:url('data:image/svg+xml,<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A <path%0D%0A d=\"M12 5.66667H11.3333V4.33333C11.3333 2.49333 9.83996 1 7.99996 1C6.15996 1 4.66663 2.49333 4.66663 4.33333V5.66667H3.99996C3.26663 5.66667 2.66663 6.26667 2.66663 7V13.6667C2.66663 14.4 3.26663 15 3.99996 15H12C12.7333 15 13.3333 14.4 13.3333 13.6667V7C13.3333 6.26667 12.7333 5.66667 12 5.66667ZM5.99996 4.33333C5.99996 3.22667 6.89329 2.33333 7.99996 2.33333C9.10663 2.33333 9.99996 3.22667 9.99996 4.33333V5.66667H5.99996V4.33333ZM12 13.6667H3.99996V7H12V13.6667ZM7.99996 11.6667C8.73329 11.6667 9.33329 11.0667 9.33329 10.3333C9.33329 9.6 8.73329 9 7.99996 9C7.26663 9 6.66663 9.6 6.66663 10.3333C6.66663 11.0667 7.26663 11.6667 7.99996 11.6667Z\"%0D%0A fill=\"%23757575\" />%0D%0A</svg>')}.c-user-menu-wrapper .c-sign-button-wrapper .c-sign-button{width:100%;color:#000;padding:16px;font-weight:700;background-color:#eef0f2}.c-avatar{max-width:100%;object-fit:cover}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i1$2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: SdAvatar, selector: "sd-avatar", inputs: ["src", "size"
|
|
342
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: LayoutUserComponent, isStandalone: true, selector: "lib-layout-user", inputs: { isMobileOrTablet: { classPropertyName: "isMobileOrTablet", publicName: "isMobileOrTablet", isSignal: true, isRequired: false, transformFunction: null }, isMenuLock: { classPropertyName: "isMenuLock", publicName: "isMenuLock", isSignal: true, isRequired: false, transformFunction: null }, isShowSidebar: { classPropertyName: "isShowSidebar", publicName: "isShowSidebar", isSignal: true, isRequired: false, transformFunction: null }, userInfo: { classPropertyName: "userInfo", publicName: "userInfo", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { menuClosed: "menuClosed", menuOpened: "menuOpened", toggleMenuLock: "toggleMenuLock" }, ngImport: i0, template: "@let _userInfo = userInfo();\r\n@let avatar = _userInfo?.avatar || _userInfo?.fullName || _userInfo?.username || _userInfo?.email;\r\n\r\n<div class=\"c-layout-user-wrapper\">\r\n <div class=\"c-layout-user-avatar\" [matMenuTriggerFor]=\"userMenu\" (menuClosed)=\"onMenuClosed()\" (menuOpened)=\"onMenuOpened()\">\r\n <sd-avatar [src]=\"avatar\" [size]=\"32\"></sd-avatar>\r\n </div>\r\n\r\n @if (!isMobileOrTablet()) {\r\n <div aria-hidden=\"true\" mat-mini-fab class=\"c-layout-icon-toggle\" (click)=\"onToggleMenuLock($event)\">\r\n <mat-icon style=\"color: #8c8c8c\">\r\n {{ isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left' }}\r\n </mat-icon>\r\n </div>\r\n }\r\n</div>\r\n\r\n<mat-menu #userMenu=\"matMenu\" xPosition=\"before\" backdropClass=\"c-user-menu-backdrop-f90ce131-fa4c-4f71-a49b-ab7fa374fdd0\">\r\n <div aria-hidden=\"true\" class=\"c-user-menu-wrapper\" (click)=\"keepOpenWhenClickInsideMenu($event)\">\r\n <div class=\"c-user-info-wrapper\">\r\n <div class=\"c-user-avatar\">\r\n <sd-avatar [src]=\"avatar\" [size]=\"40\"></sd-avatar>\r\n </div>\r\n <span class=\"c-user-name\">{{ _userInfo.fullName || _userInfo.username }}</span>\r\n <span class=\"c-user-email\">{{ _userInfo.email }}</span>\r\n </div>\r\n\r\n @if (changePasswordLayoutConfig) {\r\n <div class=\"c-sign-button-wrapper\">\r\n <button class=\"c-account-options\" (click)=\"changePassword()\">\r\n <img alt=\"lock\" />\r\n <span>\u0110\u1ED5i m\u1EADt kh\u1EA9u</span>\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"c-sign-button-wrapper\">\r\n <button class=\"c-sign-button\" mat-flat-button (click)=\"logout()\">\u0110\u0103ng xu\u1EA5t</button>\r\n </div>\r\n </div>\r\n</mat-menu>", styles: ["::ng-deep .c-user-menu-backdrop-f90ce131-fa4c-4f71-a49b-ab7fa374fdd0+* .cdk-overlay-pane{transform:translate(277px,83px)}.c-layout-user-wrapper{display:flex;flex-direction:column;align-items:center;width:60px;height:80px}.c-layout-user-wrapper .c-layout-user-avatar{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer}.c-layout-user-wrapper .c-layout-icon-toggle{background-color:transparent;border-top:1px solid #f0f0f0;box-shadow:none;margin-top:10px;width:32px;height:40px;display:flex;justify-content:center;align-items:center;cursor:pointer}.c-user-menu-wrapper .c-user-info-wrapper{width:250px;padding:16px;display:flex;flex-direction:column;align-items:center;gap:8px}.c-user-menu-wrapper .c-user-info-wrapper .c-user-avatar{width:40px;height:40px}.c-user-menu-wrapper .c-user-info-wrapper .c-user-name{font-size:16px;font-weight:700;text-align:center}.c-user-menu-wrapper .c-user-info-wrapper .c-user-email{font-size:14px;color:#7a7a7a;text-align:center}.c-user-menu-wrapper .c-sign-button-wrapper{text-align:center;padding:16px 16px 8px;width:100%;border-top:1px solid #dee2e6}.c-user-menu-wrapper .c-sign-button-wrapper .c-account-options{all:unset;cursor:pointer;font-size:14px;display:flex;align-items:center;gap:8px}.c-user-menu-wrapper .c-sign-button-wrapper .c-account-options img{scale:.875;content:url('data:image/svg+xml,<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">%0D%0A <path%0D%0A d=\"M12 5.66667H11.3333V4.33333C11.3333 2.49333 9.83996 1 7.99996 1C6.15996 1 4.66663 2.49333 4.66663 4.33333V5.66667H3.99996C3.26663 5.66667 2.66663 6.26667 2.66663 7V13.6667C2.66663 14.4 3.26663 15 3.99996 15H12C12.7333 15 13.3333 14.4 13.3333 13.6667V7C13.3333 6.26667 12.7333 5.66667 12 5.66667ZM5.99996 4.33333C5.99996 3.22667 6.89329 2.33333 7.99996 2.33333C9.10663 2.33333 9.99996 3.22667 9.99996 4.33333V5.66667H5.99996V4.33333ZM12 13.6667H3.99996V7H12V13.6667ZM7.99996 11.6667C8.73329 11.6667 9.33329 11.0667 9.33329 10.3333C9.33329 9.6 8.73329 9 7.99996 9C7.26663 9 6.66663 9.6 6.66663 10.3333C6.66663 11.0667 7.26663 11.6667 7.99996 11.6667Z\"%0D%0A fill=\"%23757575\" />%0D%0A</svg>')}.c-user-menu-wrapper .c-sign-button-wrapper .c-sign-button{width:100%;color:#000;padding:16px;font-weight:700;background-color:#eef0f2}.c-avatar{max-width:100%;object-fit:cover}\n"], dependencies: [{ kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i1$2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i1$2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: SdAvatar, selector: "sd-avatar", inputs: ["src", "size"] }] });
|
|
343
343
|
}
|
|
344
344
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: LayoutUserComponent, decorators: [{
|
|
345
345
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-modules-layout.mjs","sources":["../../../projects/sd-angular/modules/layout/components/page/page.component.ts","../../../projects/sd-angular/modules/layout/components/page/page.component.html","../../../projects/sd-angular/modules/layout/services/storage/storage.service.ts","../../../projects/sd-angular/modules/layout/configurations/layout.configuration.ts","../../../projects/sd-angular/modules/layout/services/layout.service.ts","../../../projects/sd-angular/modules/layout/pipes/menu.pipe.ts","../../../projects/sd-angular/modules/layout/pipes/menu-focus.pipe.ts","../../../projects/sd-angular/modules/layout/pipes/high-light-search.pipe.ts","../../../projects/sd-angular/modules/layout/components/sidebar-v1/components/user/user.component.ts","../../../projects/sd-angular/modules/layout/components/sidebar-v1/components/user/user.component.html","../../../projects/sd-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.ts","../../../projects/sd-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.html","../../../projects/sd-angular/modules/layout/components/sidebar-v1/main.component.ts","../../../projects/sd-angular/modules/layout/components/sidebar-v1/main.component.html","../../../projects/sd-angular/modules/layout/components/layout-main/layout-main.component.ts","../../../projects/sd-angular/modules/layout/components/layout-main/layout-main.component.html","../../../projects/sd-angular/modules/layout/modules/home/components/home-page/home-page.component.ts","../../../projects/sd-angular/modules/layout/modules/home/components/home-page/home-page.component.html","../../../projects/sd-angular/modules/layout/modules/home/guards/home-redirect.guard.ts","../../../projects/sd-angular/modules/layout/modules/home/home.routing.ts","../../../projects/sd-angular/modules/layout/modules/home/home.module.ts","../../../projects/sd-angular/modules/layout/modules/not-found/pages/root/root.component.ts","../../../projects/sd-angular/modules/layout/modules/not-found/pages/root/root.component.html","../../../projects/sd-angular/modules/layout/modules/not-found/not-found.routing.ts","../../../projects/sd-angular/modules/layout/modules/not-found/not-found.module.ts","../../../projects/sd-angular/modules/layout/modules/forbidden/pages/root/root.component.ts","../../../projects/sd-angular/modules/layout/modules/forbidden/pages/root/root.component.html","../../../projects/sd-angular/modules/layout/modules/forbidden/forbidden.routing.ts","../../../projects/sd-angular/modules/layout/modules/forbidden/forbidden.module.ts","../../../projects/sd-angular/modules/layout/layout.routing.ts","../../../projects/sd-angular/modules/layout/layout.module.ts","../../../projects/sd-angular/modules/layout/sd-angular-core-modules-layout.ts"],"sourcesContent":["import { booleanAttribute, Component, effect, ElementRef, inject, input } from '@angular/core';\n\n@Component({\n selector: 'sd-page',\n templateUrl: './page.component.html',\n styleUrls: ['./page.component.scss'],\n})\nexport class SdPageComponent {\n private el = inject(ElementRef);\n\n title = input<string>('', { alias: 'title' });\n description = input<string>('', { alias: 'description' });\n noHeader = input(false, { transform: booleanAttribute, alias: 'noHeader' });\n\n constructor() {\n effect(() => {\n if (this.title()) {\n this.el.nativeElement.removeAttribute('title');\n }\n });\n }\n}\n","@if (!noHeader()) {\n <div class=\"c-page-header bg-white\">\n <div class=\"p-16 d-flex align-items-center w-full justify-content-between\">\n <div class=\"d-flex\">\n <ng-content select=\"[headerLeft]\">\n <div class=\"d-flex flex-column\">\n <div class=\"T20M\">{{ title() }}</div>\n @if (description()) {\n <div class=\"T14R text-secondary mt-4\">{{ description() }}</div>\n }\n </div>\n </ng-content>\n </div>\n <ng-content select=\"[headerRight]\"></ng-content>\n </div>\n </div>\n}\n\n<div class=\"c-page-wrapper px-0\">\n <div class=\"c-page-content\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\r\nimport { SdStorage, SdStorageService } from '@sd-angular/core/services';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdLayoutStorageService {\r\n // Thông tin state của sidebar\r\n isShowSidebar: SdStorage<boolean>;\r\n menuLockStatus: SdStorage<boolean>;\r\n lastActiveMenuGroupId: SdStorage<string>;\r\n // End\r\n\r\n constructor(private sdStorageService: SdStorageService) {\r\n // State sidebar\r\n this.isShowSidebar = this.sdStorageService.create('cb07c316-ed6d-4620-9e92-53dbef6aa983');\r\n this.menuLockStatus = this.sdStorageService.create('2c2f4816-18b3-4ec3-8177-7b90bff036c3');\r\n this.lastActiveMenuGroupId = this.sdStorageService.create('2e6961d0-3380-4a94-a6a1-38837560cd96');\r\n // End\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { SdMaybeAsync } from '@sd-angular/core/utilities/models';\r\nexport interface ISdLayoutConfiguration {\r\n homeUrl?: string;\r\n sidebar: ISdSidebarConfiguration | (() => SdMaybeAsync<ISdSidebarConfiguration>);\r\n userInfo: SdLayoutUserInfo | (() => SdMaybeAsync<SdLayoutUserInfo>);\r\n signout: () => void | Promise<void>;\r\n changePassword?: () => void | Promise<void>;\r\n}\r\n\r\nexport interface SdLayoutUserInfo {\r\n /**\r\n * Tên đăng nhập hoặc tên định danh của người dùng.\r\n * Thường dùng làm định danh rút gọn hoặc fallback hiển thị nếu user chưa cập nhật fullName.\r\n */\r\n username?: string;\r\n\r\n /**\r\n * Địa chỉ thư điện tử của người dùng.\r\n * Thường được hiển thị bên dưới tên người dùng trong popup/menu thông tin tài khoản.\r\n */\r\n email?: string;\r\n\r\n /**\r\n * Họ và tên đầy đủ của người dùng.\r\n * Đây là thông tin được ưu tiên hiển thị chính trên giao diện (VD: góc phải màn hình, lời chào).\r\n */\r\n fullName?: string;\r\n\r\n /**\r\n * Hình đại diện (avatar) của người dùng.\r\n * Nếu để trống, hệ thống sẽ tự động lấy ký tự đầu tiên của fullName hoặc username để tạo avatar mặc định.\r\n * Hỗ trợ các định dạng: URL (http/https), chuỗi base64 (data:image), hoặc đường dẫn nội bộ.\r\n */\r\n avatar?: string;\r\n}\r\n\r\nexport type ISdSidebarConfiguration = SidebarConfigurationV1;\r\n\r\nexport interface SidebarConfigurationV1 {\r\n version: 1;\r\n\r\n /**\r\n * Màu brand chính.\r\n * Nên sử dụng mã màu #HEX hoặc rgb để hỗ trợ opacity khi hover.\r\n * Ví dụ: #1890ff, rgb(24,144,255)\r\n */\r\n brandColor?: string;\r\n\r\n /**\r\n * Màu brand nhạt (light).\r\n * Dùng cho background, hover nhẹ.\r\n */\r\n brandLightColor?: string;\r\n\r\n /**\r\n * URL logo hiển thị ở sidebar.\r\n * Nên đặt trong thư mục public hoặc dùng URL CDN.\r\n */\r\n logoUrl?: string;\r\n\r\n /**\r\n * Title mặc định của hệ thống.\r\n * Nếu menu không truyền title thì sẽ dùng giá trị này.\r\n * @default \"Back Office\"\r\n */\r\n defaultTitle?: string;\r\n}\r\n\r\nexport const SD_LAYOUT_CONFIGURATION = new InjectionToken<ISdLayoutConfiguration>('sd.layout.configuration');\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { SdResolveMaybeAsync } from '@sd-angular/core/utilities/models';\r\nimport { ISdLayoutConfiguration, ISdSidebarConfiguration, SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../configurations';\r\n\r\n@Injectable({\r\n providedIn: 'root' // Có thể đổi thành 'any' hoặc khai báo trong mảng providers của LayoutModule tùy kiến trúc của bạn\r\n})\r\nexport class SdLayoutService {\r\n // ==========================================\r\n // INJECT CONFIGURATIONS\r\n // ==========================================\r\n #layoutConfiguration = inject<ISdLayoutConfiguration>(SD_LAYOUT_CONFIGURATION);\r\n\r\n // ==========================================\r\n // SHARED SIGNALS (STATE)\r\n // ==========================================\r\n userInfo = signal<SdLayoutUserInfo | undefined>(undefined);\r\n sidebar = signal<ISdSidebarConfiguration | undefined>(undefined);\r\n\r\n constructor() {\r\n this.#initUserInfo();\r\n this.#initSidebar();\r\n }\r\n\r\n // ==========================================\r\n // PRIVATE METHODS\r\n // ==========================================\r\n #initUserInfo(): void {\r\n const userInfoConfig = this.#layoutConfiguration.userInfo;\r\n if (typeof userInfoConfig === 'function') {\r\n SdResolveMaybeAsync(userInfoConfig()).then(userInfo => this.userInfo.set(userInfo));\r\n } else {\r\n this.userInfo.set(userInfoConfig);\r\n }\r\n }\r\n\r\n #initSidebar(): void {\r\n const sidebarConfig = this.#layoutConfiguration.sidebar;\r\n if (typeof sidebarConfig === 'function') {\r\n SdResolveMaybeAsync(sidebarConfig()).then(config => this.sidebar.set(config));\r\n } else {\r\n this.sidebar.set(sidebarConfig);\r\n }\r\n }\r\n}","import * as uuid from 'uuid';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\nimport { Injectable, Pipe, PipeTransform } from '@angular/core';\r\n\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SdLayoutMenu, Menus } from '../services/menu/menu.model';\r\nimport { Params } from '@angular/router';\r\nimport { SdPermissionService } from '@sd-angular/core/modules/permission';\r\n// End\r\n@Pipe({\r\n name: 'menu',\r\n})\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MenuPipe implements PipeTransform {\r\n constructor(private permissionService: SdPermissionService) {}\r\n transform(menus: SdLayoutMenu[]): SdLayoutMenu[] {\r\n const results: Menus = [];\r\n const check = (menu: SdLayoutMenu): SdLayoutMenu | null => {\r\n if ('children' in menu) {\r\n const children: Menus = [];\r\n menu.children?.forEach(childMenu => {\r\n childMenu = check(childMenu) as SdLayoutMenu;\r\n if (childMenu) {\r\n children.push({ ...childMenu, id: this.#getHashIdMenu(childMenu) });\r\n }\r\n });\r\n\r\n if (!children.length) {\r\n return null;\r\n }\r\n\r\n return {\r\n ...menu,\r\n children,\r\n id: this.#getHashIdMenu(menu),\r\n };\r\n }\r\n\r\n if ('permission' in menu) {\r\n const path = menu?.path?.includes('http') ? menu.path : menu.path;\r\n if (!menu.path) {\r\n return null;\r\n }\r\n\r\n if (\r\n (typeof menu.permission === 'string' || Array.isArray(menu.permission)) &&\r\n this.permissionService.hasPermission(menu.permission)\r\n ) {\r\n return {\r\n ...menu,\r\n path,\r\n id: this.#getHashIdMenu(menu),\r\n };\r\n }\r\n\r\n if (typeof menu.permission === 'boolean' && menu.permission) {\r\n return {\r\n ...menu,\r\n path,\r\n id: this.#getHashIdMenu(menu),\r\n };\r\n }\r\n\r\n if (typeof menu.permission === 'function' && menu.permission()) {\r\n return {\r\n ...menu,\r\n path,\r\n id: this.#getHashIdMenu(menu),\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n return {\r\n ...menu,\r\n id: uuid.v4(),\r\n };\r\n };\r\n\r\n menus?.forEach(menu => {\r\n menu = check(menu) as SdLayoutMenu;\r\n if (menu) {\r\n results.push(menu);\r\n }\r\n });\r\n return results;\r\n }\r\n\r\n #getHashIdMenu = (menu: SdLayoutMenu): string => {\r\n const extendedMenu = menu as SdLayoutMenu & { path?: string; permission?: string; queryParams?: Params };\r\n const hashKeys: (keyof typeof extendedMenu)[] = ['title', 'path', 'permission', 'queryParams', 'icon', 'level', 'tooltipTitle'];\r\n const hashData = hashKeys.reduce(\r\n (acc, key) => {\r\n const value = extendedMenu[key];\r\n if (value !== undefined && value !== null) {\r\n acc[key as string] = value;\r\n }\r\n return acc;\r\n },\r\n {} as Record<string, any>\r\n );\r\n\r\n return Object.keys(hashData).length > 0 ? SdUtilities.hash(hashData) : uuid.v4();\r\n };\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\r\n\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SdLayoutMenu } from '../services';\r\n// End\r\n@Pipe({\r\n name: 'menuFocus',\r\n})\r\n@Injectable({ providedIn: 'root' })\r\nexport class MenuFocusPipe implements PipeTransform {\r\n transform(routePath: string, menuItem: SdLayoutMenu): boolean {\r\n if (!routePath) {\r\n return false;\r\n }\r\n if ('children' in menuItem && menuItem.children) {\r\n return menuItem.children.some(child => {\r\n return 'path' in child && child.path ? this.#match(routePath, child.path) : false;\r\n });\r\n }\r\n return 'path' in menuItem && this.#match(routePath, menuItem.path);\r\n }\r\n\r\n #match = (routePath: string, path: string): boolean => {\r\n if (!path) {\r\n return false;\r\n }\r\n if (routePath === path) {\r\n return true;\r\n }\r\n return this.#normalizePath(routePath).startsWith(this.#normalizePath(path));\r\n };\r\n\r\n #normalizePath = (p: string): string => {\r\n return p.endsWith('/') ? p : p + '/';\r\n };\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n\r\n@Pipe({\r\n name: 'highLightSearch',\r\n})\r\nexport class HighlightSearchPipe implements PipeTransform {\r\n transform(\r\n value: string,\r\n keyword: string,\r\n args?: {\r\n color?: string;\r\n }\r\n ): string {\r\n const { color = '#ffff00' } = args ?? {};\r\n keyword = this.#normalizeValue(keyword);\r\n if (!keyword || keyword.length < 3) {\r\n return value;\r\n }\r\n value = value?.trim() || '';\r\n const regex = new RegExp(SdUtilities.changeAliasLowerCase(keyword), 'gi'); //'gi' for case insensitive and can use 'g' if you want the search to be case sensitive.\r\n const aliasLowerCaseStr = SdUtilities.changeAliasLowerCase(value);\r\n const strs: string[] = [];\r\n let previousOffset = 0;\r\n aliasLowerCaseStr.replace(regex, (_, offset) => {\r\n strs.push(value.substring(previousOffset, offset));\r\n strs.push(`<mark style=\"background-color: ${color}\">${value.substring(offset, offset + keyword.length)}</mark>`);\r\n previousOffset = offset + keyword.length;\r\n return `<mark style=\"background-color: ${color}\">${value.substring(offset, offset + keyword.length)}</mark>`;\r\n });\r\n strs.push(value.substring(previousOffset, value.length));\r\n return strs.join('');\r\n }\r\n\r\n #normalizeValue = (keyword: string) => {\r\n let str: string = keyword?.toString() ?? '';\r\n /* eslint-disable no-useless-escape */\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\r\n str = str.replace(/ + /g, ' ');\r\n str = str.trim();\r\n return str;\r\n };\r\n}\r\n","import { Component, inject, input, output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n// Import sd-core\r\nimport { SdAvatar } from '@sd-angular/core/components';\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../../../../configurations';\r\n\r\n@Component({\r\n selector: 'lib-layout-user',\r\n templateUrl: './user.component.html',\r\n styleUrls: ['./user.component.scss'],\r\n imports: [MatMenuModule, MatButtonModule, MatIconModule, MatTooltipModule, SdAvatar],\r\n standalone: true,\r\n})\r\nexport class LayoutUserComponent {\r\n // ==========================================\r\n // INJECT SERVICES\r\n // ==========================================\r\n #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\r\n\r\n // ==========================================\r\n // SIGNAL INPUTS & OUTPUTS\r\n // ==========================================\r\n isMobileOrTablet = input<boolean>(false);\r\n isMenuLock = input<boolean>(false);\r\n isShowSidebar = input<boolean>(false);\r\n userInfo = input.required<SdLayoutUserInfo>();\r\n\r\n // Chuyển thành void vì các hàm emit hiện tại không truyền data\r\n menuClosed = output<void>();\r\n menuOpened = output<void>();\r\n toggleMenuLock = output<Event>();\r\n\r\n // Config actions\r\n singoutLayoutConfig = this.#layoutConfiguration.signout;\r\n changePasswordLayoutConfig = this.#layoutConfiguration?.changePassword;\r\n\r\n\r\n // ==========================================\r\n // EVENT HANDLERS\r\n // ==========================================\r\n onMenuOpened = (): void => {\r\n this.menuOpened.emit();\r\n };\r\n\r\n onMenuClosed = (): void => {\r\n this.menuClosed.emit();\r\n };\r\n\r\n keepOpenWhenClickInsideMenu = (event: Event): void => {\r\n event.stopPropagation();\r\n };\r\n\r\n logout = (): void => {\r\n this.singoutLayoutConfig();\r\n };\r\n\r\n changePassword = (): void => {\r\n // Dùng Optional Chaining gọi hàm cực gọn\r\n this.changePasswordLayoutConfig?.(); \r\n };\r\n\r\n onToggleMenuLock = (event: Event): void => {\r\n this.toggleMenuLock.emit(event);\r\n };\r\n}\r\n\r\n","@let _userInfo = userInfo();\r\n@let avatar = _userInfo?.avatar || _userInfo?.fullName || _userInfo?.username || _userInfo?.email;\r\n\r\n<div class=\"c-layout-user-wrapper\">\r\n <div class=\"c-layout-user-avatar\" [matMenuTriggerFor]=\"userMenu\" (menuClosed)=\"onMenuClosed()\" (menuOpened)=\"onMenuOpened()\">\r\n <sd-avatar [src]=\"avatar\" [size]=\"32\"></sd-avatar>\r\n </div>\r\n\r\n @if (!isMobileOrTablet()) {\r\n <div aria-hidden=\"true\" mat-mini-fab class=\"c-layout-icon-toggle\" (click)=\"onToggleMenuLock($event)\">\r\n <mat-icon style=\"color: #8c8c8c\">\r\n {{ isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left' }}\r\n </mat-icon>\r\n </div>\r\n }\r\n</div>\r\n\r\n<mat-menu #userMenu=\"matMenu\" xPosition=\"before\" backdropClass=\"c-user-menu-backdrop-f90ce131-fa4c-4f71-a49b-ab7fa374fdd0\">\r\n <div aria-hidden=\"true\" class=\"c-user-menu-wrapper\" (click)=\"keepOpenWhenClickInsideMenu($event)\">\r\n <div class=\"c-user-info-wrapper\">\r\n <div class=\"c-user-avatar\">\r\n <sd-avatar [src]=\"avatar\" [size]=\"40\"></sd-avatar>\r\n </div>\r\n <span class=\"c-user-name\">{{ _userInfo.fullName || _userInfo.username }}</span>\r\n <span class=\"c-user-email\">{{ _userInfo.email }}</span>\r\n </div>\r\n\r\n @if (changePasswordLayoutConfig) {\r\n <div class=\"c-sign-button-wrapper\">\r\n <button class=\"c-account-options\" (click)=\"changePassword()\">\r\n <img alt=\"lock\" />\r\n <span>Đổi mật khẩu</span>\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"c-sign-button-wrapper\">\r\n <button class=\"c-sign-button\" mat-flat-button (click)=\"logout()\">Đăng xuất</button>\r\n </div>\r\n </div>\r\n</mat-menu>","import { NestedTreeControl } from '@angular/cdk/tree';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';\r\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\r\n\r\nimport { SdInput, SdSuffixDefDirective } from '@sd-angular/core/forms';\r\nimport { SdSafeHtmlPipe } from '@sd-angular/core/pipes';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n\r\n// NOTE: Import nội bộ trong module layout\r\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\r\nimport { HighlightSearchPipe, MenuFocusPipe } from '../../../../pipes';\r\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\r\nimport { LayoutUserComponent } from '../user/user.component';\r\n\r\n@Component({\r\n selector: 'sidebar',\r\n standalone: true,\r\n imports: [\r\n SdInput,\r\n FormsModule,\r\n CommonModule,\r\n RouterModule,\r\n MatIconModule,\r\n MatTreeModule,\r\n SdSafeHtmlPipe,\r\n MatInputModule,\r\n MenuFocusPipe,\r\n MatTooltipModule,\r\n HighlightSearchPipe,\r\n SdSuffixDefDirective,\r\n LayoutUserComponent,\r\n ],\r\n templateUrl: './sidebar.component.html',\r\n styleUrl: './sidebar.component.scss',\r\n})\r\nexport class SidebarComponent {\r\n // ==========================================\r\n // INJECT SERVICES (Thay thế Constructor rườm rà)\r\n // ==========================================\r\n #router = inject(Router);\r\n #layoutStorageService = inject(SdLayoutStorageService);\r\n #menuFocusPipe = inject(MenuFocusPipe);\r\n #destroyRef = inject(DestroyRef); // Dùng để unsubscribe RxJS tự động\r\n\r\n // ==========================================\r\n // SIGNAL INPUTS & OUTPUTS\r\n // ==========================================\r\n isShowSidebar = input.required<boolean>();\r\n menus = input.required<SdLayoutMenu[]>();\r\n userInfo = input.required<SdLayoutUserInfo>();\r\n sidebar = input.required<SidebarConfigurationV1>();\r\n\r\n expandSideBar = output<void>();\r\n popupUserMenuClosed = output<void>();\r\n popupUserMenuOpened = output<void>();\r\n showSideBar = output<boolean | null>();\r\n\r\n // ==========================================\r\n // STATE SIGNALS\r\n // ==========================================\r\n screenHeight = window.innerHeight;\r\n isMobileOrTablet = SdUtilities.isMobile();\r\n \r\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\r\n currentPath = signal<string>(window.location.pathname);\r\n searchText = signal<string>('');\r\n titleMenuGroup = signal<string | undefined>('');\r\n idMenuGroupActive = signal<string | undefined>('');\r\n menusByGroup = signal<SdLayoutMenu[]>([]);\r\n\r\n // ==========================================\r\n // COMPUTED STATE\r\n // ==========================================\r\n totalMenuInMenusByGroup = computed(() => this.#getTotalMenus(this.menusByGroup()));\r\n\r\n // ==========================================\r\n // DATA STRUCTURES\r\n // ==========================================\r\n dataSource = new MatTreeNestedDataSource<SdLayoutMenu>();\r\n treeControl = new NestedTreeControl<SdLayoutMenu>(node =>\r\n 'children' in node && node.children?.length ? node.children : []\r\n );\r\n\r\n constructor() {\r\n // 1. EFFECT: Lắng nghe menus đầu vào thay đổi\r\n effect(() => {\r\n const currentMenus = this.menus();\r\n \r\n untracked(() => {\r\n const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\r\n // Lần đầu vào web, nếu user chưa thao tác gì sẽ mặc định hiện menuGroup đầu tiên\r\n if (!lastActiveMenuGroupId) {\r\n this.#layoutStorageService.lastActiveMenuGroupId.set(currentMenus?.[0]?.id ?? '');\r\n }\r\n this.#bindingMenuGroupByCurrentPath(currentMenus);\r\n });\r\n });\r\n\r\n // 2. Lắng nghe Router Event (Sử dụng takeUntilDestroyed thay thế ngOnDestroy)\r\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\r\n if (event instanceof NavigationEnd) {\r\n if (this.currentPath() !== window.location.pathname) {\r\n this.currentPath.set(window.location.pathname);\r\n this.#bindingMenuGroupByCurrentPath(this.menus());\r\n }\r\n }\r\n });\r\n }\r\n\r\n // ==========================================\r\n // EVENT HANDLERS\r\n // ==========================================\r\n hasChild = (_: number, node: SdLayoutMenu): boolean => 'children' in node && !!node.children?.length;\r\n\r\n onToggleMenuNode = (menu: SdLayoutMenu): void => {\r\n this.treeControl.toggle(menu);\r\n };\r\n\r\n #onExpandAllMenuNodes = (menus: SdLayoutMenu[]): void => {\r\n menus?.forEach(menu => {\r\n this.treeControl.expand(menu);\r\n if ('children' in menu && menu.children?.length) {\r\n this.#onExpandAllMenuNodes(menu.children);\r\n }\r\n });\r\n };\r\n\r\n #onCollapseAllMenuNodes = (menus: SdLayoutMenu[]): void => {\r\n menus?.forEach(menu => {\r\n this.treeControl.collapse(menu);\r\n if ('children' in menu && menu.children?.length) {\r\n this.#onCollapseAllMenuNodes(menu.children);\r\n }\r\n });\r\n };\r\n\r\n toggleMenuLock(event: Event): void {\r\n event.stopPropagation();\r\n this.isMenuLock.update(v => !v);\r\n this.#layoutStorageService.menuLockStatus?.set(this.isMenuLock());\r\n this.showSideBar.emit(this.isMenuLock());\r\n }\r\n\r\n openHomePage = (): void => {\r\n if (!this.isMobileOrTablet) {\r\n this.#router.navigateByUrl('/layout/home');\r\n } else {\r\n window.location.href = '/layout/home';\r\n }\r\n this.searchText.set('');\r\n this.#layoutStorageService.lastActiveMenuGroupId.set('');\r\n };\r\n\r\n onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\r\n onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\r\n\r\n navigate = (args: { path: string; queryParams: Params }): void => {\r\n const { path, queryParams } = args;\r\n if (path.includes('http')) {\r\n window.open(path);\r\n return;\r\n }\r\n this.#router.navigate([path.split('?')[0]], {\r\n queryParams,\r\n state: { switchTab: true },\r\n });\r\n\r\n if (this.isMobileOrTablet) {\r\n this.#closeMenu();\r\n }\r\n };\r\n\r\n onFilterSearchText = (event: string): void => {\r\n this.searchText.set(event);\r\n this.#filterMenuBySearchText(this.menusByGroup());\r\n };\r\n\r\n onClearSearchText = (): void => {\r\n this.searchText.set('');\r\n this.#filterMenuBySearchText(this.menusByGroup());\r\n };\r\n\r\n expandMenuGroup = (menuGroupNode: SdLayoutMenu): void => {\r\n this.titleMenuGroup.set(menuGroupNode?.tooltipTitle || menuGroupNode?.title);\r\n \r\n // Case 1: Menu không có children\r\n if (!('children' in menuGroupNode && menuGroupNode.children?.length)) {\r\n if ('path' in menuGroupNode) {\r\n this.navigate({ path: menuGroupNode.path, queryParams: menuGroupNode?.queryParams ?? {} });\r\n return;\r\n }\r\n }\r\n\r\n // Case 2: Menu có children\r\n if ('children' in menuGroupNode && menuGroupNode.children?.length) {\r\n this.menusByGroup.set(menuGroupNode.children);\r\n this.dataSource.data = this.menusByGroup();\r\n this.searchText.set('');\r\n this.onFilterSearchText('');\r\n this.expandSideBar.emit();\r\n }\r\n \r\n this.idMenuGroupActive.set(menuGroupNode?.id);\r\n this.#layoutStorageService.lastActiveMenuGroupId.set(menuGroupNode?.id || '');\r\n if (!this.currentPath()) {\r\n this.currentPath.set(window.location.pathname);\r\n }\r\n };\r\n\r\n // ==========================================\r\n // CỤM HOVER MENU GROUP & NODE\r\n // ==========================================\r\n onMouseOverMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\r\n if (this.idMenuGroupActive() !== menuNode?.id) {\r\n const menuGroup = event.currentTarget as HTMLElement;\r\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\r\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\r\n \r\n if (menuGroupIcon) {\r\n menuGroupIcon.style.transition = 'all 0.15s';\r\n menuGroupIcon.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\r\n if (!(menuGroupIcon instanceof HTMLImageElement)) {\r\n menuGroupIcon.style.color = this.sidebar()?.brandColor || '#2962FF';\r\n }\r\n }\r\n }\r\n };\r\n\r\n onMouseLeaveMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\r\n if (this.idMenuGroupActive() !== menuNode?.id) {\r\n const menuGroup = event.currentTarget as HTMLElement;\r\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\r\n\r\n if (menuGroupIcon) {\r\n menuGroupIcon.style.transition = 'all 0.15s';\r\n menuGroupIcon.style.backgroundColor = 'transparent';\r\n if (menuGroupIcon instanceof HTMLImageElement) {\r\n menuGroupIcon.style.opacity = '0.55';\r\n } else {\r\n menuGroupIcon.style.color = '#8C8C8C';\r\n }\r\n }\r\n }\r\n };\r\n\r\n onMouseOverMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\r\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\r\n const menuNode = event.currentTarget as HTMLElement;\r\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\r\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\r\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\r\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\r\n \r\n if (menuNode) {\r\n menuNode.style.transition = 'all 0.15s';\r\n menuNode.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\r\n\r\n const brandColor = this.sidebar()?.brandColor || '#2962FF';\r\n if (iconMenu) { iconMenu.style.transition = 'all 0.15s'; iconMenu.style.color = brandColor; }\r\n if (content) { content.style.transition = 'all 0.15s'; content.style.color = brandColor; }\r\n if (iconExpand) { iconExpand.style.transition = 'all 0.15s'; iconExpand.style.color = brandColor; }\r\n }\r\n }\r\n };\r\n\r\n onMouseLeaveMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\r\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\r\n const menuNode = event.currentTarget as HTMLElement;\r\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\r\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\r\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\r\n\r\n if (menuNode) {\r\n menuNode.style.transition = 'all 0.15s';\r\n menuNode.style.backgroundColor = 'transparent';\r\n\r\n if (iconMenu) { iconMenu.style.transition = 'all 0.15s'; iconMenu.style.color = '#8C8C8C'; }\r\n if (content) { content.style.transition = 'all 0.15s'; content.style.color = '#1F1F1F'; }\r\n if (iconExpand) { iconExpand.style.transition = 'all 0.15s'; iconExpand.style.color = '#8C8C8C'; }\r\n }\r\n }\r\n };\r\n\r\n // ==========================================\r\n // PRIVATE LOGIC\r\n // ==========================================\r\n #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[], menuGroup?: SdLayoutMenu): SdLayoutMenu[] => {\r\n for (const menu of menus) {\r\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\r\n return [menuGroup ?? menu];\r\n }\r\n if ('children' in menu && menu.children?.length) {\r\n const result = this.#getMenuGroupByCurrentPath(menu.children, menuGroup ?? menu);\r\n if (result?.length) return result;\r\n }\r\n }\r\n return [];\r\n };\r\n\r\n #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\r\n const normalizeSearchText = this.#normalizeSearchText(this.searchText());\r\n\r\n if (!normalizeSearchText || normalizeSearchText.length < 3) {\r\n let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\r\n \r\n if (!menuGroupByPath?.length) {\r\n const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\r\n menuGroupByPath = this.menus()?.filter(menu => menu?.id === lastActiveId) || [];\r\n }\r\n \r\n if (menuGroupByPath?.length) {\r\n const matchedGroup = menuGroupByPath[0];\r\n this.idMenuGroupActive.set(matchedGroup?.id);\r\n this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\r\n this.titleMenuGroup.set(matchedGroup?.tooltipTitle || matchedGroup?.title);\r\n \r\n if ('children' in matchedGroup && matchedGroup.children?.length) {\r\n this.menusByGroup.set(matchedGroup.children);\r\n this.#expandParentNodesByCurrentPath(this.menusByGroup());\r\n } else {\r\n this.menusByGroup.set([]);\r\n }\r\n } else {\r\n this.idMenuGroupActive.set('');\r\n this.titleMenuGroup.set('');\r\n this.menusByGroup.set([]);\r\n }\r\n \r\n this.dataSource.data = this.menusByGroup();\r\n }\r\n };\r\n\r\n #expandParentNodesByCurrentPath(menus: SdLayoutMenu[]): boolean {\r\n let shouldPropagate = false;\r\n for (const menu of menus) {\r\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\r\n shouldPropagate = true;\r\n }\r\n if ('children' in menu && menu.children?.length) {\r\n const childHasMatch = this.#expandParentNodesByCurrentPath(menu.children);\r\n if (childHasMatch) {\r\n this.treeControl.expand(menu);\r\n shouldPropagate = true;\r\n }\r\n }\r\n }\r\n return shouldPropagate;\r\n }\r\n\r\n #filterMenuBySearchText = (menus: SdLayoutMenu[]): void => {\r\n const normalizeSearchText = this.#normalizeSearchText(this.searchText());\r\n\r\n if (!normalizeSearchText || normalizeSearchText.length < 3) {\r\n this.dataSource.data = menus;\r\n this.#onCollapseAllMenuNodes(menus);\r\n this.#expandParentNodesByCurrentPath(menus);\r\n } else {\r\n const aliasSearchText = SdUtilities.changeAliasLowerCase(normalizeSearchText);\r\n this.dataSource.data = this.#getMenuByAliasSearchText(menus, aliasSearchText);\r\n if (this.dataSource.data?.length) {\r\n this.#onExpandAllMenuNodes(this.dataSource.data);\r\n }\r\n }\r\n };\r\n\r\n #getMenuByAliasSearchText = (menus: SdLayoutMenu[], aliasSearchText: string): SdLayoutMenu[] => {\r\n const result: SdLayoutMenu[] = [];\r\n for (const menu of menus) {\r\n const aliasTitle = SdUtilities.changeAliasLowerCase(menu.title as string);\r\n \r\n if (aliasTitle.includes(aliasSearchText)) {\r\n result.push(menu);\r\n continue;\r\n }\r\n\r\n let matchedChildren: SdLayoutMenu[] = [];\r\n if ('children' in menu && menu.children?.length) {\r\n matchedChildren = this.#getMenuByAliasSearchText(menu.children, aliasSearchText);\r\n }\r\n\r\n if (matchedChildren?.length) {\r\n result.push({ ...menu, children: matchedChildren });\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n #isMenuPathMatchByCurrentPath = (path: string): boolean => {\r\n if (!path) return false;\r\n if (this.currentPath() === path) return true;\r\n return this.#normalizePath(this.currentPath()).startsWith(this.#normalizePath(path));\r\n };\r\n\r\n #normalizePath = (p: string): string => p.endsWith('/') ? p : p + '/';\r\n \r\n #closeMenu(): void {\r\n this.showSideBar.emit(null);\r\n }\r\n\r\n #convertColor = (input: string | undefined, opacity = 1): string => {\r\n if (!input) return '';\r\n input = input.trim();\r\n\r\n const hexRegex = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\r\n const rgbRegex = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/i;\r\n\r\n if (hexRegex.test(input)) {\r\n let hex = input.slice(1);\r\n if (hex.length === 3) {\r\n hex = hex.split('').map(c => c + c).join('');\r\n }\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\r\n }\r\n\r\n const rgbMatch = input.match(rgbRegex);\r\n if (rgbMatch) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [_, r, g, b] = rgbMatch;\r\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\r\n }\r\n\r\n return input;\r\n };\r\n\r\n #normalizeSearchText = (searchText: string) => {\r\n let str: string = searchText?.toString() ?? '';\r\n /* eslint-disable no-useless-escape */\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\r\n str = str.replace(/ + /g, ' ');\r\n return str.trim();\r\n };\r\n\r\n #getTotalMenus = (menus: SdLayoutMenu[]): number => {\r\n return menus.reduce((total, menu) => total + this.#countMenuNode(menu), 0);\r\n };\r\n\r\n #countMenuNode = (menu: SdLayoutMenu): number => {\r\n let count = 0;\r\n if ('children' in menu && menu.children?.length) {\r\n for (const child of menu.children) {\r\n count += this.#countMenuNode(child);\r\n }\r\n }\r\n return count;\r\n };\r\n}","@let _userInfo = userInfo();\r\n@let _sidebar = sidebar();\r\n\r\n@if (_userInfo && _sidebar) {\r\n <div class=\"wrapper\" [style.height]=\"isMobileOrTablet ? screenHeight + 'px' : '100%'\">\r\n <div class=\"c-header\">\r\n @if (_sidebar.logoUrl) {\r\n <div class=\"c-logo\">\r\n <a href=\"javascript:;\" (click)=\"openHomePage()\">\r\n <img alt=\"logo\" [src]=\"_sidebar.logoUrl\" />\r\n </a>\r\n </div>\r\n }\r\n <div class=\"c-title-menu-group\">\r\n <span>{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\r\n </div>\r\n </div>\r\n <div class=\"c-body\">\r\n <div class=\"c-menu\">\r\n <div class=\"c-menu-group\">\r\n @for (nodeMenuGroup of menus(); track nodeMenuGroup.id) {\r\n <button\r\n (mouseenter)=\"onMouseOverMenuGroupNode($event, nodeMenuGroup)\"\r\n (mouseleave)=\"onMouseLeaveMenuGroupNode($event, nodeMenuGroup)\"\r\n (click)=\"expandMenuGroup(nodeMenuGroup)\"\r\n [matTooltip]=\"nodeMenuGroup.tooltipTitle || nodeMenuGroup.title\"\r\n [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\r\n [matTooltipPosition]=\"'right'\"\r\n style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\r\n @if (nodeMenuGroup.iconUrl) {\r\n <span\r\n class=\"c-menu-group-icon\"\r\n [ngStyle]=\"{\r\n backgroundColor: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\r\n }\">\r\n <img width=\"24px\" height=\"24px\" [src]=\"nodeMenuGroup.iconUrl\" [alt]=\"nodeMenuGroup.title\" />\r\n </span>\r\n } @else {\r\n <mat-icon\r\n class=\"c-menu-group-icon\"\r\n [ngStyle]=\"{\r\n color: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandColor || '#2962FF' : '#8C8C8C',\r\n backgroundColor: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\r\n }\">\r\n {{ nodeMenuGroup.icon || 'widgets' }}\r\n </mat-icon>\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div class=\"c-menu-tree\">\r\n @if (totalMenuInMenusByGroup() >= 10) {\r\n <div style=\"padding: 0px 4px\" class=\"c-menu-tree-search\">\r\n <sd-input size=\"sm\" placeholder=\"Tìm kiếm\" [model]=\"searchText()\" (sdChange)=\"onFilterSearchText($event)\">\r\n <ng-template sdSuffixDef>\r\n @if (searchText()) {\r\n <mat-icon class=\"c-search-prefix-icon cancel\" (click)=\"onClearSearchText()\">cancel</mat-icon>\r\n } @else {\r\n <mat-icon class=\"c-search-prefix-icon search\">search</mat-icon>\r\n }\r\n </ng-template>\r\n </sd-input>\r\n </div>\r\n }\r\n <div class=\"c-menu-tree-container\">\r\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" [style.backgroundColor]=\"'transparent'\">\r\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: !hasChild\">\r\n <li\r\n class=\"c-menu-node\"\r\n (mouseenter)=\"onMouseOverMenuNode($event, node)\"\r\n (mouseleave)=\"onMouseLeaveMenuNode($event, node)\"\r\n [ngStyle]=\"{\r\n backgroundColor: (currentPath() | menuFocus: node) ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\r\n }\">\r\n <div aria-hidden=\"true\" class=\"c-menu-node-description\" (click)=\"navigate(node)\" [class.d-none]=\"!isShowSidebar()\">\r\n <div\r\n class=\"c-menu-node-description-content\"\r\n [ngStyle]=\"{\r\n color: (currentPath() | menuFocus: node) ? _sidebar.brandColor || '#2962FF' : '#1F1F1F',\r\n }\"\r\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\r\n </div>\r\n </li>\r\n </mat-nested-tree-node>\r\n\r\n <mat-nested-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n aria-hidden=\"true\"\r\n [class]=\"{ expanded: treeControl.isExpanded(node), isfocus: currentPath() | menuFocus: node }\">\r\n <li>\r\n <div\r\n class=\"c-menu-node\"\r\n (mouseenter)=\"onMouseOverMenuNode($event, node)\"\r\n (mouseleave)=\"onMouseLeaveMenuNode($event, node)\">\r\n <div class=\"d-flex align-items-center\" style=\"gap: 10px; width: 100%\">\r\n <div [class.d-none]=\"!isShowSidebar()\" class=\"c-menu-node-description\" (click)=\"onToggleMenuNode(node)\">\r\n <div\r\n class=\"c-menu-node-description-content\"\r\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\r\n <mat-icon class=\"c-menu-node-description-icon-expand\">\r\n {{ treeControl.isExpanded(node) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\r\n </mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <ul class=\"p-0\" [class.d-none]=\"!treeControl.isExpanded(node)\">\r\n <ng-container matTreeNodeOutlet></ng-container>\r\n </ul>\r\n </li>\r\n </mat-nested-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"c-footer\">\r\n <lib-layout-user\r\n [userInfo]=\"_userInfo\"\r\n [isMobileOrTablet]=\"isMobileOrTablet\"\r\n (menuOpened)=\"onUserMenuOpened()\"\r\n (menuClosed)=\"onUserMenuClosed()\"\r\n [isShowSidebar]=\"isShowSidebar()\"\r\n (toggleMenuLock)=\"toggleMenuLock($event)\">\r\n </lib-layout-user>\r\n </div>\r\n\r\n <div class=\"c-vertical\"></div>\r\n </div>\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\r\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n\r\n// NOTE: Import nội bộ trong module layout\r\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\r\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\r\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\r\n\r\n@Component({\r\n selector: 'sidebar-v1',\r\n templateUrl: './main.component.html',\r\n styleUrls: ['./main.component.scss'],\r\n imports: [MatSidenavModule, CommonModule, SidebarComponent],\r\n standalone: true,\r\n})\r\nexport class SidebarV1Component {\r\n // ==========================================\r\n // INJECT SERVICES\r\n // ==========================================\r\n #layoutStorageService = inject(SdLayoutStorageService);\r\n\r\n // ==========================================\r\n // VIEW CHILD & INPUTS\r\n // ==========================================\r\n sidenav = viewChild.required<MatSidenav>('sidenav');\r\n menus = input<SdLayoutMenu[]>([]);\r\n userInfo = input.required<SdLayoutUserInfo>();\r\n sidebar = input.required<SidebarConfigurationV1>();\r\n\r\n // ==========================================\r\n // STATE SIGNALS\r\n // ==========================================\r\n isMobileOrTablet = signal<boolean>(SdUtilities.isMobile());\r\n\r\n // Trạng thái khóa menu (luôn mở rộng hay không)\r\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\r\n\r\n // Trạng thái hiển thị (mở/đóng) của Sidenav\r\n isShowSidebar = signal<boolean>(SdUtilities.isMobile() ? false : (this.#layoutStorageService.menuLockStatus?.get() ?? true));\r\n\r\n onhover = signal<boolean>(false);\r\n\r\n // ==========================================\r\n // PRIVATE TIMERS\r\n // ==========================================\r\n #timerMouseInMenu: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor() {\r\n // EFFECT: Tự động đồng bộ isShowSidebar vào storage service mỗi khi nó thay đổi\r\n effect(() => {\r\n const isShow = this.isShowSidebar();\r\n untracked(() => {\r\n this.#layoutStorageService.isShowSidebar.set(isShow);\r\n });\r\n });\r\n }\r\n\r\n // ==========================================\r\n // EVENT HANDLERS\r\n // ==========================================\r\n\r\n #mouseLeave = (): void => {\r\n if (this.#timerMouseInMenu) {\r\n clearTimeout(this.#timerMouseInMenu);\r\n }\r\n\r\n if (this.onhover() && this.isShowSidebar()) {\r\n this.isShowSidebar.set(false);\r\n this.onhover.set(false);\r\n }\r\n };\r\n\r\n #handleMouseLeaveTransition = (): void => {\r\n if (!this.isShowSidebar()) {\r\n const delayTime = 400;\r\n if (this.#timerMouseInMenu) {\r\n clearTimeout(this.#timerMouseInMenu);\r\n }\r\n setTimeout(() => {\r\n this.#mouseLeave();\r\n }, delayTime);\r\n } else {\r\n this.#mouseLeave();\r\n }\r\n };\r\n\r\n openSidebar = (): void => {\r\n if (!this.isMobileOrTablet()) {\r\n return;\r\n }\r\n\r\n if (!this.isShowSidebar()) {\r\n this.isShowSidebar.set(true);\r\n this.onhover.set(true);\r\n }\r\n };\r\n\r\n onPopupOfSideBarOpened = (): void => {\r\n this.onhover.set(false);\r\n this.isShowSidebar.set(true);\r\n };\r\n\r\n onPopupOfSideBarClosed = (): void => {\r\n const delayTime = 500;\r\n if (!this.isMenuLock()) {\r\n this.onhover.set(true);\r\n setTimeout(() => {\r\n this.#mouseLeave();\r\n }, delayTime);\r\n }\r\n };\r\n\r\n onExpandSideBar = (): void => {\r\n if (this.isMobileOrTablet()) {\r\n return;\r\n }\r\n if (!this.isShowSidebar()) {\r\n this.isShowSidebar.set(true);\r\n this.onhover.set(true);\r\n }\r\n };\r\n\r\n onMouseleaveSideBar = (): void => {\r\n if (this.isMobileOrTablet()) {\r\n return;\r\n }\r\n this.#mouseLeave();\r\n };\r\n\r\n onToggle = (data: boolean | null) => {\r\n if (data === null) {\r\n this.#handleMouseLeaveTransition();\r\n } else {\r\n this.#mouseLeave();\r\n this.isShowSidebar.set(data);\r\n this.isMenuLock.set(data);\r\n\r\n // Toggle component MatSidenav\r\n const sidenavComp = this.sidenav();\r\n if (sidenavComp) {\r\n data ? sidenavComp.open() : sidenavComp.close();\r\n }\r\n }\r\n };\r\n}\r\n","<mat-sidenav-container class=\"c-layout-wrapper\">\r\n <mat-sidenav\r\n #sidenav\r\n [opened]=\"isShowSidebar()\"\r\n (openedChange)=\"isShowSidebar.set($event)\"\r\n class=\"c-layout-sidebar\"\r\n (click)=\"openSidebar()\"\r\n (mouseleave)=\"onMouseleaveSideBar()\"\r\n [mode]=\"isMobileOrTablet() ? 'over' : 'side'\"\r\n [fixedInViewport]=\"isMobileOrTablet()\">\r\n <sidebar\r\n [menus]=\"menus()\"\r\n [userInfo]=\"userInfo()\"\r\n [sidebar]=\"sidebar()\"\r\n [isShowSidebar]=\"isShowSidebar()\"\r\n (showSideBar)=\"onToggle($event)\"\r\n (expandSideBar)=\"onExpandSideBar()\"\r\n (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\r\n (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\">\r\n </sidebar>\r\n </mat-sidenav>\r\n\r\n <mat-sidenav-content class=\"c-layout-content\" [class.isShowSidebar]=\"isMenuLock()\">\r\n <mat-drawer-container class=\"c-mat-drawer-container\">\r\n <mat-drawer-content>\r\n <ng-content></ng-content>\r\n </mat-drawer-content>\r\n </mat-drawer-container>\r\n </mat-sidenav-content>\r\n</mat-sidenav-container>","import { Component, computed, inject, input } from '@angular/core';\r\n\r\n// Import nội bộ trong module layout\r\nimport { SdLayoutMenu, SdLayoutService } from '../../services';\r\nimport { MenuPipe } from '../../pipes';\r\nimport { SidebarV1Component } from '../sidebar-v1/main.component';\r\n\r\n@Component({\r\n selector: 'sd-layout',\r\n templateUrl: './layout-main.component.html',\r\n styleUrls: ['./layout-main.component.scss'],\r\n imports: [SidebarV1Component],\r\n standalone: true,\r\n})\r\nexport class SdLayoutComponent {\r\n // ==========================================\r\n // INJECT SERVICES\r\n // ==========================================\r\n #menuPipe = inject(MenuPipe);\r\n #layoutService = inject(SdLayoutService); // Inject LayoutService\r\n\r\n // ==========================================\r\n // SIGNAL INPUTS\r\n // ==========================================\r\n menusInput = input<SdLayoutMenu[]>([], { alias: 'menus' });\r\n\r\n // Tự động format qua MenuPipe mỗi khi menusInput từ component cha thay đổi\r\n menus = computed(() => this.#menuPipe.transform(this.menusInput() || []));\r\n\r\n // ==========================================\r\n // CONSUME SHARED STATE (Tuỳ chọn)\r\n // ==========================================\r\n // Bạn có thể gán biến ngắn gọn để xài trong HTML (ví dụ: userInfo() thay vì layoutService.userInfo())\r\n userInfo = this.#layoutService.userInfo;\r\n sidebar = this.#layoutService.sidebar;\r\n}\r\n","@let _userInfo = userInfo();\r\n@let _sidebar = sidebar();\r\n\r\n@if (_userInfo && _sidebar?.version === 1) {\r\n <sidebar-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebar!\">\r\n <ng-content></ng-content>\r\n </sidebar-v1>\r\n}\r\n","import { Component, inject, signal } from '@angular/core';\r\nimport { SdTabComponent } from '@sd-angular/core/components';\r\n\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SdPageComponent } from '../../../../components';\r\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\r\nimport { ActivatedRoute } from '@angular/router';\r\n// End\r\n\r\n@Component({\r\n selector: 'app-home-page',\r\n imports: [SdPageComponent],\r\n templateUrl: './home-page.component.html',\r\n styleUrls: ['./home-page.component.scss'],\r\n standalone: true,\r\n})\r\n@SdTabComponent({\r\n component: HomePageComponent,\r\n name: 'Trang chủ',\r\n icon: 'home',\r\n color: 'primary',\r\n})\r\nexport class HomePageComponent {\r\n // ==========================================\r\n // INJECT SERVICES (Modern Angular)\r\n // ==========================================\r\n readonly #route = inject(ActivatedRoute);\r\n readonly #layoutService = inject(SdLayoutService);\r\n\r\n // ==========================================\r\n // SIGNALS (STATE)\r\n // ==========================================\r\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\r\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\r\n userInfo = this.#layoutService.userInfo;\r\n // ==========================================\r\n // PRIVATE METHODS\r\n // ==========================================\r\n\r\n #getTimezone() {\r\n const now = new Date();\r\n const timezoneOffset = now.getTimezoneOffset();\r\n const offsetHours = -timezoneOffset / 60;\r\n const sign = offsetHours >= 0 ? '+' : '';\r\n const simpleGmtString = `GMT${sign}${offsetHours}`;\r\n return simpleGmtString;\r\n }\r\n\r\n #getTodayInfo(date: Date) {\r\n const mapping = {\r\n 0: 'Chủ Nhật',\r\n 1: 'Thứ 2',\r\n 2: 'Thứ 3',\r\n 3: 'Thứ 4',\r\n 4: 'Thứ 5',\r\n 5: 'Thứ 6',\r\n 6: 'Thứ 7',\r\n };\r\n return `${mapping[date.getDay() as keyof typeof mapping]}, ngày ${date.toLocaleDateString('vi-VN', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })} (${this.#getTimezone()})`;\r\n }\r\n}\r\n","@let _userInfo = userInfo();\r\n<sd-page>\r\n <div class=\"d-flex flex-column\" headerLeft>\r\n <div class=\"font-weight-medium fs-20\">Xin chào, {{ _userInfo?.fullName || _userInfo?.email || _userInfo?.username }}</div>\r\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\r\n </div>\r\n\r\n <div class=\"wrapper\">\r\n <img alt=\"welcome-photo\" class=\"welcome-image\" />\r\n <span class=\"first-line\">Chúc bạn một ngày làm việc</span>\r\n <span class=\"second-line\">tràn đầy năng lượng & hiệu quả!</span>\r\n </div>\r\n</sd-page>\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { CanActivate, Router } from '@angular/router';\r\n\r\n// Giả sử bạn có một service để đọc config\r\nimport { ISdLayoutConfiguration, SD_LAYOUT_CONFIGURATION } from '../../../configurations';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HomeRedirectGuard implements CanActivate {\r\n constructor(\r\n private router: Router,\r\n @Inject(SD_LAYOUT_CONFIGURATION) private layoutConfiguration: ISdLayoutConfiguration\r\n ) {}\r\n\r\n async canActivate() {\r\n const homeUrl = this.layoutConfiguration?.homeUrl;\r\n if (homeUrl) {\r\n // Nếu có config homeUrl, tạo một UrlTree để redirect\r\n // Đây là cách redirect chính thống từ trong guard\r\n return this.router.createUrlTree([homeUrl]);\r\n }\r\n // Nếu không có homeUrl, cho phép kích hoạt route\r\n return true;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { HomePageComponent } from './components/home-page/home-page.component';\r\nimport { HomeRedirectGuard } from './guards/home-redirect.guard';\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '',\r\n canActivate: [HomeRedirectGuard],\r\n component: HomePageComponent,\r\n },\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule],\r\n})\r\nexport class HomeRoutingModule {}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HomeRoutingModule } from './home.routing';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [CommonModule, HomeRoutingModule],\r\n})\r\nexport class HomeModule {}\r\n","import { Component, inject, signal } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { SdButton } from '@sd-angular/core/components';\r\n\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SdPageComponent } from '../../../../components';\r\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\r\n// End\r\n\r\n@Component({\r\n templateUrl: './root.component.html',\r\n styleUrls: ['./root.component.scss'],\r\n imports: [SdButton, SdPageComponent],\r\n})\r\nexport class RootComponent {\r\n // ==========================================\r\n // INJECT SERVICES (Modern Angular)\r\n // ==========================================\r\n readonly #route = inject(ActivatedRoute);\r\n readonly #layoutService = inject(SdLayoutService);\r\n\r\n // ==========================================\r\n // SIGNALS (STATE)\r\n // ==========================================\r\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\r\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\r\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\r\n userInfo = this.#layoutService.userInfo;\r\n // ==========================================\r\n // PRIVATE METHODS\r\n // ==========================================\r\n #getTodayInfo(date: Date): string {\r\n const mapping = {\r\n 0: 'Chủ Nhật',\r\n 1: 'Thứ 2',\r\n 2: 'Thứ 3',\r\n 3: 'Thứ 4',\r\n 4: 'Thứ 5',\r\n 5: 'Thứ 6',\r\n 6: 'Thứ 7',\r\n };\r\n\r\n return `${mapping[date.getDay() as keyof typeof mapping]}, ngày ${date.toLocaleDateString('vi-VN', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })}`;\r\n }\r\n\r\n // ==========================================\r\n // PUBLIC METHODS\r\n // ==========================================\r\n reload() {\r\n window.location.href = '';\r\n }\r\n}\r\n","@let _userInfo = userInfo();\r\n<sd-page>\r\n <div class=\"d-flex flex-column\" headerLeft>\r\n <div class=\"font-weight-medium fs-20\">Xin chào, {{ _userInfo?.fullName || _userInfo?.email || _userInfo?.username }}</div>\r\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\r\n </div>\r\n\r\n <div class=\"h-full d-flex flex-column align-items-center\">\r\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\r\n <img alt=\"error-image\" class=\"error-image\" />\r\n <span class=\"T16M mt-24\">404 - Trang không tồn tại</span>\r\n <span class=\"T16R text-secondary mt-4\">\r\n Trang bạn tìm không tồn tại hoặc đã bị xóa. Vui lòng kiểm tra lại địa chỉ URL hoặc quay lại trang chủ để tiếp tục.\r\n </span>\r\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" title=\"Quay trở lại\" prefixIcon=\"arrow_back\"> </sd-button>\r\n </div>\r\n </div>\r\n</sd-page>\r\n","import { Route } from '@angular/router';\r\nimport { RootComponent } from './pages/root/root.component';\r\n\r\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { Routes } from './not-found.routing';\r\n\r\n@NgModule({\r\n imports: [CommonModule, RouterModule.forChild(Routes)],\r\n exports: [],\r\n})\r\nexport class NotFoundModule {}\r\n","import { Component, inject, signal } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { SdButton } from '@sd-angular/core/components';\r\n\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SdPageComponent } from '../../../../components';\r\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\r\n// End\r\n\r\n@Component({\r\n templateUrl: './root.component.html',\r\n styleUrls: ['./root.component.scss'],\r\n imports: [SdButton, SdPageComponent],\r\n})\r\nexport class RootComponent {\r\n // ==========================================\r\n // INJECT SERVICES (Modern Angular)\r\n // ==========================================\r\n readonly #route = inject(ActivatedRoute);\r\n readonly #layoutService = inject(SdLayoutService);\r\n\r\n // ==========================================\r\n // SIGNALS (STATE)\r\n // ==========================================\r\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\r\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\r\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\r\n userInfo = this.#layoutService.userInfo;\r\n // ==========================================\r\n // PRIVATE METHODS\r\n // ==========================================\r\n #getTodayInfo(date: Date): string {\r\n const mapping = {\r\n 0: 'Chủ Nhật',\r\n 1: 'Thứ 2',\r\n 2: 'Thứ 3',\r\n 3: 'Thứ 4',\r\n 4: 'Thứ 5',\r\n 5: 'Thứ 6',\r\n 6: 'Thứ 7',\r\n };\r\n\r\n return `${mapping[date.getDay() as keyof typeof mapping]}, ngày ${date.toLocaleDateString('vi-VN', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })}`;\r\n }\r\n\r\n // ==========================================\r\n // PUBLIC METHODS\r\n // ==========================================\r\n reload() {\r\n window.location.href = '';\r\n }\r\n}\r\n","@let _userInfo = userInfo();\r\n<sd-page>\r\n <div class=\"d-flex flex-column\" headerLeft>\r\n <div class=\"font-weight-medium fs-20\">Xin chào, {{ _userInfo?.fullName || _userInfo?.email || _userInfo?.username }}</div>\r\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\r\n </div>\r\n <div class=\"h-full d-flex flex-column align-items-center\">\r\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\r\n <img alt=\"error-image\" class=\"error-image\" />\r\n <span class=\"T16M mt-24\">Không được phép truy cập</span>\r\n <span class=\"T14R text-secondary mt-4\"\r\n >Bạn không có quyền truy cập vào trang này. Liên hệ với quản trị viên hoặc quay lại trang chủ</span\r\n >\r\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" title=\"Quay lại trang chủ\"> </sd-button>\r\n </div>\r\n </div>\r\n</sd-page>\r\n","import { Route } from '@angular/router';\r\nimport { RootComponent } from './pages/root/root.component';\r\n\r\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { Routes } from './forbidden.routing';\r\n\r\n@NgModule({\r\n imports: [CommonModule, RouterModule.forChild(Routes)],\r\n exports: [],\r\n})\r\nexport class ForbiddenModule {}\r\n","import { Route } from '@angular/router';\r\n\r\nexport const Routes: Route[] = [\r\n {\r\n path: '',\r\n pathMatch: 'full',\r\n redirectTo: 'not-found',\r\n },\r\n {\r\n path: 'home',\r\n loadChildren: () => import('./modules/home').then(m => m.HomeModule),\r\n },\r\n {\r\n path: 'not-found',\r\n loadChildren: () => import('./modules/not-found').then(m => m.NotFoundModule),\r\n },\r\n {\r\n path: 'forbidden',\r\n loadChildren: () => import('./modules/forbidden').then(m => m.ForbiddenModule),\r\n },\r\n];\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { Routes } from './layout.routing';\r\n@NgModule({\r\n declarations: [],\r\n imports: [RouterModule.forChild(Routes)],\r\n providers: [],\r\n})\r\nexport class SdLayoutModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3","RootComponent","Routes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sd-angular-core-modules-layout.mjs","sources":["../../../projects/sd-angular/modules/layout/components/page/page.component.ts","../../../projects/sd-angular/modules/layout/components/page/page.component.html","../../../projects/sd-angular/modules/layout/services/storage/storage.service.ts","../../../projects/sd-angular/modules/layout/configurations/layout.configuration.ts","../../../projects/sd-angular/modules/layout/services/layout.service.ts","../../../projects/sd-angular/modules/layout/pipes/menu.pipe.ts","../../../projects/sd-angular/modules/layout/pipes/menu-focus.pipe.ts","../../../projects/sd-angular/modules/layout/pipes/high-light-search.pipe.ts","../../../projects/sd-angular/modules/layout/components/sidebar-v1/components/user/user.component.ts","../../../projects/sd-angular/modules/layout/components/sidebar-v1/components/user/user.component.html","../../../projects/sd-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.ts","../../../projects/sd-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.html","../../../projects/sd-angular/modules/layout/components/sidebar-v1/main.component.ts","../../../projects/sd-angular/modules/layout/components/sidebar-v1/main.component.html","../../../projects/sd-angular/modules/layout/components/layout-main/layout-main.component.ts","../../../projects/sd-angular/modules/layout/components/layout-main/layout-main.component.html","../../../projects/sd-angular/modules/layout/modules/home/components/home-page/home-page.component.ts","../../../projects/sd-angular/modules/layout/modules/home/components/home-page/home-page.component.html","../../../projects/sd-angular/modules/layout/modules/home/guards/home-redirect.guard.ts","../../../projects/sd-angular/modules/layout/modules/home/home.routing.ts","../../../projects/sd-angular/modules/layout/modules/home/home.module.ts","../../../projects/sd-angular/modules/layout/modules/not-found/pages/root/root.component.ts","../../../projects/sd-angular/modules/layout/modules/not-found/pages/root/root.component.html","../../../projects/sd-angular/modules/layout/modules/not-found/not-found.routing.ts","../../../projects/sd-angular/modules/layout/modules/not-found/not-found.module.ts","../../../projects/sd-angular/modules/layout/modules/forbidden/pages/root/root.component.ts","../../../projects/sd-angular/modules/layout/modules/forbidden/pages/root/root.component.html","../../../projects/sd-angular/modules/layout/modules/forbidden/forbidden.routing.ts","../../../projects/sd-angular/modules/layout/modules/forbidden/forbidden.module.ts","../../../projects/sd-angular/modules/layout/layout.routing.ts","../../../projects/sd-angular/modules/layout/layout.module.ts","../../../projects/sd-angular/modules/layout/sd-angular-core-modules-layout.ts"],"sourcesContent":["import { booleanAttribute, Component, effect, ElementRef, inject, input } from '@angular/core';\n\n@Component({\n selector: 'sd-page',\n templateUrl: './page.component.html',\n styleUrls: ['./page.component.scss'],\n})\nexport class SdPageComponent {\n private el = inject(ElementRef);\n\n title = input<string>('', { alias: 'title' });\n description = input<string>('', { alias: 'description' });\n noHeader = input(false, { transform: booleanAttribute, alias: 'noHeader' });\n\n constructor() {\n effect(() => {\n if (this.title()) {\n this.el.nativeElement.removeAttribute('title');\n }\n });\n }\n}\n","@if (!noHeader()) {\n <div class=\"c-page-header bg-white\">\n <div class=\"p-16 d-flex align-items-center w-full justify-content-between\">\n <div class=\"d-flex\">\n <ng-content select=\"[headerLeft]\">\n <div class=\"d-flex flex-column\">\n <div class=\"T20M\">{{ title() }}</div>\n @if (description()) {\n <div class=\"T14R text-secondary mt-4\">{{ description() }}</div>\n }\n </div>\n </ng-content>\n </div>\n <ng-content select=\"[headerRight]\"></ng-content>\n </div>\n </div>\n}\n\n<div class=\"c-page-wrapper px-0\">\n <div class=\"c-page-content\">\n <ng-content></ng-content>\n </div>\n</div>\n","import { Injectable } from '@angular/core';\r\nimport { SdStorage, SdStorageService } from '@sd-angular/core/services';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdLayoutStorageService {\r\n // Thông tin state của sidebar\r\n isShowSidebar: SdStorage<boolean>;\r\n menuLockStatus: SdStorage<boolean>;\r\n lastActiveMenuGroupId: SdStorage<string>;\r\n // End\r\n\r\n constructor(private sdStorageService: SdStorageService) {\r\n // State sidebar\r\n this.isShowSidebar = this.sdStorageService.create('cb07c316-ed6d-4620-9e92-53dbef6aa983');\r\n this.menuLockStatus = this.sdStorageService.create('2c2f4816-18b3-4ec3-8177-7b90bff036c3');\r\n this.lastActiveMenuGroupId = this.sdStorageService.create('2e6961d0-3380-4a94-a6a1-38837560cd96');\r\n // End\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { SdMaybeAsync } from '@sd-angular/core/utilities/models';\r\nexport interface ISdLayoutConfiguration {\r\n homeUrl?: string;\r\n sidebar: ISdSidebarConfiguration | (() => SdMaybeAsync<ISdSidebarConfiguration>);\r\n userInfo: SdLayoutUserInfo | (() => SdMaybeAsync<SdLayoutUserInfo>);\r\n signout: () => void | Promise<void>;\r\n changePassword?: () => void | Promise<void>;\r\n}\r\n\r\nexport interface SdLayoutUserInfo {\r\n /**\r\n * Tên đăng nhập hoặc tên định danh của người dùng.\r\n * Thường dùng làm định danh rút gọn hoặc fallback hiển thị nếu user chưa cập nhật fullName.\r\n */\r\n username?: string;\r\n\r\n /**\r\n * Địa chỉ thư điện tử của người dùng.\r\n * Thường được hiển thị bên dưới tên người dùng trong popup/menu thông tin tài khoản.\r\n */\r\n email?: string;\r\n\r\n /**\r\n * Họ và tên đầy đủ của người dùng.\r\n * Đây là thông tin được ưu tiên hiển thị chính trên giao diện (VD: góc phải màn hình, lời chào).\r\n */\r\n fullName?: string;\r\n\r\n /**\r\n * Hình đại diện (avatar) của người dùng.\r\n * Nếu để trống, hệ thống sẽ tự động lấy ký tự đầu tiên của fullName hoặc username để tạo avatar mặc định.\r\n * Hỗ trợ các định dạng: URL (http/https), chuỗi base64 (data:image), hoặc đường dẫn nội bộ.\r\n */\r\n avatar?: string;\r\n}\r\n\r\nexport type ISdSidebarConfiguration = SidebarConfigurationV1;\r\n\r\nexport interface SidebarConfigurationV1 {\r\n version: 1;\r\n\r\n /**\r\n * Màu brand chính.\r\n * Nên sử dụng mã màu #HEX hoặc rgb để hỗ trợ opacity khi hover.\r\n * Ví dụ: #1890ff, rgb(24,144,255)\r\n */\r\n brandColor?: string;\r\n\r\n /**\r\n * Màu brand nhạt (light).\r\n * Dùng cho background, hover nhẹ.\r\n */\r\n brandLightColor?: string;\r\n\r\n /**\r\n * URL logo hiển thị ở sidebar.\r\n * Nên đặt trong thư mục public hoặc dùng URL CDN.\r\n */\r\n logoUrl?: string;\r\n\r\n /**\r\n * Title mặc định của hệ thống.\r\n * Nếu menu không truyền title thì sẽ dùng giá trị này.\r\n * @default \"Back Office\"\r\n */\r\n defaultTitle?: string;\r\n}\r\n\r\nexport const SD_LAYOUT_CONFIGURATION = new InjectionToken<ISdLayoutConfiguration>('sd.layout.configuration');\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { SdResolveMaybeAsync } from '@sd-angular/core/utilities/models';\r\nimport { ISdLayoutConfiguration, ISdSidebarConfiguration, SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../configurations';\r\n\r\n@Injectable({\r\n providedIn: 'root' // Có thể đổi thành 'any' hoặc khai báo trong mảng providers của LayoutModule tùy kiến trúc của bạn\r\n})\r\nexport class SdLayoutService {\r\n // ==========================================\r\n // INJECT CONFIGURATIONS\r\n // ==========================================\r\n #layoutConfiguration = inject<ISdLayoutConfiguration>(SD_LAYOUT_CONFIGURATION);\r\n\r\n // ==========================================\r\n // SHARED SIGNALS (STATE)\r\n // ==========================================\r\n userInfo = signal<SdLayoutUserInfo | undefined>(undefined);\r\n sidebar = signal<ISdSidebarConfiguration | undefined>(undefined);\r\n\r\n constructor() {\r\n this.#initUserInfo();\r\n this.#initSidebar();\r\n }\r\n\r\n // ==========================================\r\n // PRIVATE METHODS\r\n // ==========================================\r\n #initUserInfo(): void {\r\n const userInfoConfig = this.#layoutConfiguration.userInfo;\r\n if (typeof userInfoConfig === 'function') {\r\n SdResolveMaybeAsync(userInfoConfig()).then(userInfo => this.userInfo.set(userInfo));\r\n } else {\r\n this.userInfo.set(userInfoConfig);\r\n }\r\n }\r\n\r\n #initSidebar(): void {\r\n const sidebarConfig = this.#layoutConfiguration.sidebar;\r\n if (typeof sidebarConfig === 'function') {\r\n SdResolveMaybeAsync(sidebarConfig()).then(config => this.sidebar.set(config));\r\n } else {\r\n this.sidebar.set(sidebarConfig);\r\n }\r\n }\r\n}","import * as uuid from 'uuid';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\nimport { Injectable, Pipe, PipeTransform } from '@angular/core';\r\n\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SdLayoutMenu, Menus } from '../services/menu/menu.model';\r\nimport { Params } from '@angular/router';\r\nimport { SdPermissionService } from '@sd-angular/core/modules/permission';\r\n// End\r\n@Pipe({\r\n name: 'menu',\r\n})\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MenuPipe implements PipeTransform {\r\n constructor(private permissionService: SdPermissionService) {}\r\n transform(menus: SdLayoutMenu[]): SdLayoutMenu[] {\r\n const results: Menus = [];\r\n const check = (menu: SdLayoutMenu): SdLayoutMenu | null => {\r\n if ('children' in menu) {\r\n const children: Menus = [];\r\n menu.children?.forEach(childMenu => {\r\n childMenu = check(childMenu) as SdLayoutMenu;\r\n if (childMenu) {\r\n children.push({ ...childMenu, id: this.#getHashIdMenu(childMenu) });\r\n }\r\n });\r\n\r\n if (!children.length) {\r\n return null;\r\n }\r\n\r\n return {\r\n ...menu,\r\n children,\r\n id: this.#getHashIdMenu(menu),\r\n };\r\n }\r\n\r\n if ('permission' in menu) {\r\n const path = menu?.path?.includes('http') ? menu.path : menu.path;\r\n if (!menu.path) {\r\n return null;\r\n }\r\n\r\n if (\r\n (typeof menu.permission === 'string' || Array.isArray(menu.permission)) &&\r\n this.permissionService.hasPermission(menu.permission)\r\n ) {\r\n return {\r\n ...menu,\r\n path,\r\n id: this.#getHashIdMenu(menu),\r\n };\r\n }\r\n\r\n if (typeof menu.permission === 'boolean' && menu.permission) {\r\n return {\r\n ...menu,\r\n path,\r\n id: this.#getHashIdMenu(menu),\r\n };\r\n }\r\n\r\n if (typeof menu.permission === 'function' && menu.permission()) {\r\n return {\r\n ...menu,\r\n path,\r\n id: this.#getHashIdMenu(menu),\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n return {\r\n ...menu,\r\n id: uuid.v4(),\r\n };\r\n };\r\n\r\n menus?.forEach(menu => {\r\n menu = check(menu) as SdLayoutMenu;\r\n if (menu) {\r\n results.push(menu);\r\n }\r\n });\r\n return results;\r\n }\r\n\r\n #getHashIdMenu = (menu: SdLayoutMenu): string => {\r\n const extendedMenu = menu as SdLayoutMenu & { path?: string; permission?: string; queryParams?: Params };\r\n const hashKeys: (keyof typeof extendedMenu)[] = ['title', 'path', 'permission', 'queryParams', 'icon', 'level', 'tooltipTitle'];\r\n const hashData = hashKeys.reduce(\r\n (acc, key) => {\r\n const value = extendedMenu[key];\r\n if (value !== undefined && value !== null) {\r\n acc[key as string] = value;\r\n }\r\n return acc;\r\n },\r\n {} as Record<string, any>\r\n );\r\n\r\n return Object.keys(hashData).length > 0 ? SdUtilities.hash(hashData) : uuid.v4();\r\n };\r\n}\r\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\r\n\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SdLayoutMenu } from '../services';\r\n// End\r\n@Pipe({\r\n name: 'menuFocus',\r\n})\r\n@Injectable({ providedIn: 'root' })\r\nexport class MenuFocusPipe implements PipeTransform {\r\n transform(routePath: string, menuItem: SdLayoutMenu): boolean {\r\n if (!routePath) {\r\n return false;\r\n }\r\n if ('children' in menuItem && menuItem.children) {\r\n return menuItem.children.some(child => {\r\n return 'path' in child && child.path ? this.#match(routePath, child.path) : false;\r\n });\r\n }\r\n return 'path' in menuItem && this.#match(routePath, menuItem.path);\r\n }\r\n\r\n #match = (routePath: string, path: string): boolean => {\r\n if (!path) {\r\n return false;\r\n }\r\n if (routePath === path) {\r\n return true;\r\n }\r\n return this.#normalizePath(routePath).startsWith(this.#normalizePath(path));\r\n };\r\n\r\n #normalizePath = (p: string): string => {\r\n return p.endsWith('/') ? p : p + '/';\r\n };\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n\r\n@Pipe({\r\n name: 'highLightSearch',\r\n})\r\nexport class HighlightSearchPipe implements PipeTransform {\r\n transform(\r\n value: string,\r\n keyword: string,\r\n args?: {\r\n color?: string;\r\n }\r\n ): string {\r\n const { color = '#ffff00' } = args ?? {};\r\n keyword = this.#normalizeValue(keyword);\r\n if (!keyword || keyword.length < 3) {\r\n return value;\r\n }\r\n value = value?.trim() || '';\r\n const regex = new RegExp(SdUtilities.changeAliasLowerCase(keyword), 'gi'); //'gi' for case insensitive and can use 'g' if you want the search to be case sensitive.\r\n const aliasLowerCaseStr = SdUtilities.changeAliasLowerCase(value);\r\n const strs: string[] = [];\r\n let previousOffset = 0;\r\n aliasLowerCaseStr.replace(regex, (_, offset) => {\r\n strs.push(value.substring(previousOffset, offset));\r\n strs.push(`<mark style=\"background-color: ${color}\">${value.substring(offset, offset + keyword.length)}</mark>`);\r\n previousOffset = offset + keyword.length;\r\n return `<mark style=\"background-color: ${color}\">${value.substring(offset, offset + keyword.length)}</mark>`;\r\n });\r\n strs.push(value.substring(previousOffset, value.length));\r\n return strs.join('');\r\n }\r\n\r\n #normalizeValue = (keyword: string) => {\r\n let str: string = keyword?.toString() ?? '';\r\n /* eslint-disable no-useless-escape */\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\r\n str = str.replace(/ + /g, ' ');\r\n str = str.trim();\r\n return str;\r\n };\r\n}\r\n","import { Component, inject, input, output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n// Import sd-core\r\nimport { SdAvatar } from '@sd-angular/core/components';\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../../../../configurations';\r\n\r\n@Component({\r\n selector: 'lib-layout-user',\r\n templateUrl: './user.component.html',\r\n styleUrls: ['./user.component.scss'],\r\n imports: [MatMenuModule, MatButtonModule, MatIconModule, MatTooltipModule, SdAvatar],\r\n standalone: true,\r\n})\r\nexport class LayoutUserComponent {\r\n // ==========================================\r\n // INJECT SERVICES\r\n // ==========================================\r\n #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\r\n\r\n // ==========================================\r\n // SIGNAL INPUTS & OUTPUTS\r\n // ==========================================\r\n isMobileOrTablet = input<boolean>(false);\r\n isMenuLock = input<boolean>(false);\r\n isShowSidebar = input<boolean>(false);\r\n userInfo = input.required<SdLayoutUserInfo>();\r\n\r\n // Chuyển thành void vì các hàm emit hiện tại không truyền data\r\n menuClosed = output<void>();\r\n menuOpened = output<void>();\r\n toggleMenuLock = output<Event>();\r\n\r\n // Config actions\r\n singoutLayoutConfig = this.#layoutConfiguration.signout;\r\n changePasswordLayoutConfig = this.#layoutConfiguration?.changePassword;\r\n\r\n\r\n // ==========================================\r\n // EVENT HANDLERS\r\n // ==========================================\r\n onMenuOpened = (): void => {\r\n this.menuOpened.emit();\r\n };\r\n\r\n onMenuClosed = (): void => {\r\n this.menuClosed.emit();\r\n };\r\n\r\n keepOpenWhenClickInsideMenu = (event: Event): void => {\r\n event.stopPropagation();\r\n };\r\n\r\n logout = (): void => {\r\n this.singoutLayoutConfig();\r\n };\r\n\r\n changePassword = (): void => {\r\n // Dùng Optional Chaining gọi hàm cực gọn\r\n this.changePasswordLayoutConfig?.(); \r\n };\r\n\r\n onToggleMenuLock = (event: Event): void => {\r\n this.toggleMenuLock.emit(event);\r\n };\r\n}\r\n\r\n","@let _userInfo = userInfo();\r\n@let avatar = _userInfo?.avatar || _userInfo?.fullName || _userInfo?.username || _userInfo?.email;\r\n\r\n<div class=\"c-layout-user-wrapper\">\r\n <div class=\"c-layout-user-avatar\" [matMenuTriggerFor]=\"userMenu\" (menuClosed)=\"onMenuClosed()\" (menuOpened)=\"onMenuOpened()\">\r\n <sd-avatar [src]=\"avatar\" [size]=\"32\"></sd-avatar>\r\n </div>\r\n\r\n @if (!isMobileOrTablet()) {\r\n <div aria-hidden=\"true\" mat-mini-fab class=\"c-layout-icon-toggle\" (click)=\"onToggleMenuLock($event)\">\r\n <mat-icon style=\"color: #8c8c8c\">\r\n {{ isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left' }}\r\n </mat-icon>\r\n </div>\r\n }\r\n</div>\r\n\r\n<mat-menu #userMenu=\"matMenu\" xPosition=\"before\" backdropClass=\"c-user-menu-backdrop-f90ce131-fa4c-4f71-a49b-ab7fa374fdd0\">\r\n <div aria-hidden=\"true\" class=\"c-user-menu-wrapper\" (click)=\"keepOpenWhenClickInsideMenu($event)\">\r\n <div class=\"c-user-info-wrapper\">\r\n <div class=\"c-user-avatar\">\r\n <sd-avatar [src]=\"avatar\" [size]=\"40\"></sd-avatar>\r\n </div>\r\n <span class=\"c-user-name\">{{ _userInfo.fullName || _userInfo.username }}</span>\r\n <span class=\"c-user-email\">{{ _userInfo.email }}</span>\r\n </div>\r\n\r\n @if (changePasswordLayoutConfig) {\r\n <div class=\"c-sign-button-wrapper\">\r\n <button class=\"c-account-options\" (click)=\"changePassword()\">\r\n <img alt=\"lock\" />\r\n <span>Đổi mật khẩu</span>\r\n </button>\r\n </div>\r\n }\r\n\r\n <div class=\"c-sign-button-wrapper\">\r\n <button class=\"c-sign-button\" mat-flat-button (click)=\"logout()\">Đăng xuất</button>\r\n </div>\r\n </div>\r\n</mat-menu>","import { NestedTreeControl } from '@angular/cdk/tree';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n untracked\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';\r\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\r\n\r\nimport { SdInput, SdSuffixDefDirective } from '@sd-angular/core/forms';\r\nimport { SdSafeHtmlPipe } from '@sd-angular/core/pipes';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n\r\n// NOTE: Import nội bộ trong module layout\r\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\r\nimport { HighlightSearchPipe, MenuFocusPipe } from '../../../../pipes';\r\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\r\nimport { LayoutUserComponent } from '../user/user.component';\r\n\r\n@Component({\r\n selector: 'sidebar',\r\n standalone: true,\r\n imports: [\r\n SdInput,\r\n FormsModule,\r\n CommonModule,\r\n RouterModule,\r\n MatIconModule,\r\n MatTreeModule,\r\n SdSafeHtmlPipe,\r\n MatInputModule,\r\n MenuFocusPipe,\r\n MatTooltipModule,\r\n HighlightSearchPipe,\r\n SdSuffixDefDirective,\r\n LayoutUserComponent,\r\n ],\r\n templateUrl: './sidebar.component.html',\r\n styleUrl: './sidebar.component.scss',\r\n})\r\nexport class SidebarComponent {\r\n // ==========================================\r\n // INJECT SERVICES (Thay thế Constructor rườm rà)\r\n // ==========================================\r\n #router = inject(Router);\r\n #layoutStorageService = inject(SdLayoutStorageService);\r\n #menuFocusPipe = inject(MenuFocusPipe);\r\n #destroyRef = inject(DestroyRef); // Dùng để unsubscribe RxJS tự động\r\n\r\n // ==========================================\r\n // SIGNAL INPUTS & OUTPUTS\r\n // ==========================================\r\n isShowSidebar = input.required<boolean>();\r\n menus = input.required<SdLayoutMenu[]>();\r\n userInfo = input.required<SdLayoutUserInfo>();\r\n sidebar = input.required<SidebarConfigurationV1>();\r\n\r\n expandSideBar = output<void>();\r\n popupUserMenuClosed = output<void>();\r\n popupUserMenuOpened = output<void>();\r\n showSideBar = output<boolean | null>();\r\n\r\n // ==========================================\r\n // STATE SIGNALS\r\n // ==========================================\r\n screenHeight = window.innerHeight;\r\n isMobileOrTablet = SdUtilities.isMobile();\r\n \r\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\r\n currentPath = signal<string>(window.location.pathname);\r\n searchText = signal<string>('');\r\n titleMenuGroup = signal<string | undefined>('');\r\n idMenuGroupActive = signal<string | undefined>('');\r\n menusByGroup = signal<SdLayoutMenu[]>([]);\r\n\r\n // ==========================================\r\n // COMPUTED STATE\r\n // ==========================================\r\n totalMenuInMenusByGroup = computed(() => this.#getTotalMenus(this.menusByGroup()));\r\n\r\n // ==========================================\r\n // DATA STRUCTURES\r\n // ==========================================\r\n dataSource = new MatTreeNestedDataSource<SdLayoutMenu>();\r\n treeControl = new NestedTreeControl<SdLayoutMenu>(node =>\r\n 'children' in node && node.children?.length ? node.children : []\r\n );\r\n\r\n constructor() {\r\n // 1. EFFECT: Lắng nghe menus đầu vào thay đổi\r\n effect(() => {\r\n const currentMenus = this.menus();\r\n \r\n untracked(() => {\r\n const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\r\n // Lần đầu vào web, nếu user chưa thao tác gì sẽ mặc định hiện menuGroup đầu tiên\r\n if (!lastActiveMenuGroupId) {\r\n this.#layoutStorageService.lastActiveMenuGroupId.set(currentMenus?.[0]?.id ?? '');\r\n }\r\n this.#bindingMenuGroupByCurrentPath(currentMenus);\r\n });\r\n });\r\n\r\n // 2. Lắng nghe Router Event (Sử dụng takeUntilDestroyed thay thế ngOnDestroy)\r\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\r\n if (event instanceof NavigationEnd) {\r\n if (this.currentPath() !== window.location.pathname) {\r\n this.currentPath.set(window.location.pathname);\r\n this.#bindingMenuGroupByCurrentPath(this.menus());\r\n }\r\n }\r\n });\r\n }\r\n\r\n // ==========================================\r\n // EVENT HANDLERS\r\n // ==========================================\r\n hasChild = (_: number, node: SdLayoutMenu): boolean => 'children' in node && !!node.children?.length;\r\n\r\n onToggleMenuNode = (menu: SdLayoutMenu): void => {\r\n this.treeControl.toggle(menu);\r\n };\r\n\r\n #onExpandAllMenuNodes = (menus: SdLayoutMenu[]): void => {\r\n menus?.forEach(menu => {\r\n this.treeControl.expand(menu);\r\n if ('children' in menu && menu.children?.length) {\r\n this.#onExpandAllMenuNodes(menu.children);\r\n }\r\n });\r\n };\r\n\r\n #onCollapseAllMenuNodes = (menus: SdLayoutMenu[]): void => {\r\n menus?.forEach(menu => {\r\n this.treeControl.collapse(menu);\r\n if ('children' in menu && menu.children?.length) {\r\n this.#onCollapseAllMenuNodes(menu.children);\r\n }\r\n });\r\n };\r\n\r\n toggleMenuLock(event: Event): void {\r\n event.stopPropagation();\r\n this.isMenuLock.update(v => !v);\r\n this.#layoutStorageService.menuLockStatus?.set(this.isMenuLock());\r\n this.showSideBar.emit(this.isMenuLock());\r\n }\r\n\r\n openHomePage = (): void => {\r\n if (!this.isMobileOrTablet) {\r\n this.#router.navigateByUrl('/layout/home');\r\n } else {\r\n window.location.href = '/layout/home';\r\n }\r\n this.searchText.set('');\r\n this.#layoutStorageService.lastActiveMenuGroupId.set('');\r\n };\r\n\r\n onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\r\n onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\r\n\r\n navigate = (args: { path: string; queryParams: Params }): void => {\r\n const { path, queryParams } = args;\r\n if (path.includes('http')) {\r\n window.open(path);\r\n return;\r\n }\r\n this.#router.navigate([path.split('?')[0]], {\r\n queryParams,\r\n state: { switchTab: true },\r\n });\r\n\r\n if (this.isMobileOrTablet) {\r\n this.#closeMenu();\r\n }\r\n };\r\n\r\n onFilterSearchText = (event: string): void => {\r\n this.searchText.set(event);\r\n this.#filterMenuBySearchText(this.menusByGroup());\r\n };\r\n\r\n onClearSearchText = (): void => {\r\n this.searchText.set('');\r\n this.#filterMenuBySearchText(this.menusByGroup());\r\n };\r\n\r\n expandMenuGroup = (menuGroupNode: SdLayoutMenu): void => {\r\n this.titleMenuGroup.set(menuGroupNode?.tooltipTitle || menuGroupNode?.title);\r\n \r\n // Case 1: Menu không có children\r\n if (!('children' in menuGroupNode && menuGroupNode.children?.length)) {\r\n if ('path' in menuGroupNode) {\r\n this.navigate({ path: menuGroupNode.path, queryParams: menuGroupNode?.queryParams ?? {} });\r\n return;\r\n }\r\n }\r\n\r\n // Case 2: Menu có children\r\n if ('children' in menuGroupNode && menuGroupNode.children?.length) {\r\n this.menusByGroup.set(menuGroupNode.children);\r\n this.dataSource.data = this.menusByGroup();\r\n this.searchText.set('');\r\n this.onFilterSearchText('');\r\n this.expandSideBar.emit();\r\n }\r\n \r\n this.idMenuGroupActive.set(menuGroupNode?.id);\r\n this.#layoutStorageService.lastActiveMenuGroupId.set(menuGroupNode?.id || '');\r\n if (!this.currentPath()) {\r\n this.currentPath.set(window.location.pathname);\r\n }\r\n };\r\n\r\n // ==========================================\r\n // CỤM HOVER MENU GROUP & NODE\r\n // ==========================================\r\n onMouseOverMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\r\n if (this.idMenuGroupActive() !== menuNode?.id) {\r\n const menuGroup = event.currentTarget as HTMLElement;\r\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\r\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\r\n \r\n if (menuGroupIcon) {\r\n menuGroupIcon.style.transition = 'all 0.15s';\r\n menuGroupIcon.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\r\n if (!(menuGroupIcon instanceof HTMLImageElement)) {\r\n menuGroupIcon.style.color = this.sidebar()?.brandColor || '#2962FF';\r\n }\r\n }\r\n }\r\n };\r\n\r\n onMouseLeaveMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\r\n if (this.idMenuGroupActive() !== menuNode?.id) {\r\n const menuGroup = event.currentTarget as HTMLElement;\r\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\r\n\r\n if (menuGroupIcon) {\r\n menuGroupIcon.style.transition = 'all 0.15s';\r\n menuGroupIcon.style.backgroundColor = 'transparent';\r\n if (menuGroupIcon instanceof HTMLImageElement) {\r\n menuGroupIcon.style.opacity = '0.55';\r\n } else {\r\n menuGroupIcon.style.color = '#8C8C8C';\r\n }\r\n }\r\n }\r\n };\r\n\r\n onMouseOverMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\r\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\r\n const menuNode = event.currentTarget as HTMLElement;\r\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\r\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\r\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\r\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\r\n \r\n if (menuNode) {\r\n menuNode.style.transition = 'all 0.15s';\r\n menuNode.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\r\n\r\n const brandColor = this.sidebar()?.brandColor || '#2962FF';\r\n if (iconMenu) { iconMenu.style.transition = 'all 0.15s'; iconMenu.style.color = brandColor; }\r\n if (content) { content.style.transition = 'all 0.15s'; content.style.color = brandColor; }\r\n if (iconExpand) { iconExpand.style.transition = 'all 0.15s'; iconExpand.style.color = brandColor; }\r\n }\r\n }\r\n };\r\n\r\n onMouseLeaveMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\r\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\r\n const menuNode = event.currentTarget as HTMLElement;\r\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\r\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\r\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\r\n\r\n if (menuNode) {\r\n menuNode.style.transition = 'all 0.15s';\r\n menuNode.style.backgroundColor = 'transparent';\r\n\r\n if (iconMenu) { iconMenu.style.transition = 'all 0.15s'; iconMenu.style.color = '#8C8C8C'; }\r\n if (content) { content.style.transition = 'all 0.15s'; content.style.color = '#1F1F1F'; }\r\n if (iconExpand) { iconExpand.style.transition = 'all 0.15s'; iconExpand.style.color = '#8C8C8C'; }\r\n }\r\n }\r\n };\r\n\r\n // ==========================================\r\n // PRIVATE LOGIC\r\n // ==========================================\r\n #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[], menuGroup?: SdLayoutMenu): SdLayoutMenu[] => {\r\n for (const menu of menus) {\r\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\r\n return [menuGroup ?? menu];\r\n }\r\n if ('children' in menu && menu.children?.length) {\r\n const result = this.#getMenuGroupByCurrentPath(menu.children, menuGroup ?? menu);\r\n if (result?.length) return result;\r\n }\r\n }\r\n return [];\r\n };\r\n\r\n #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\r\n const normalizeSearchText = this.#normalizeSearchText(this.searchText());\r\n\r\n if (!normalizeSearchText || normalizeSearchText.length < 3) {\r\n let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\r\n \r\n if (!menuGroupByPath?.length) {\r\n const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\r\n menuGroupByPath = this.menus()?.filter(menu => menu?.id === lastActiveId) || [];\r\n }\r\n \r\n if (menuGroupByPath?.length) {\r\n const matchedGroup = menuGroupByPath[0];\r\n this.idMenuGroupActive.set(matchedGroup?.id);\r\n this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\r\n this.titleMenuGroup.set(matchedGroup?.tooltipTitle || matchedGroup?.title);\r\n \r\n if ('children' in matchedGroup && matchedGroup.children?.length) {\r\n this.menusByGroup.set(matchedGroup.children);\r\n this.#expandParentNodesByCurrentPath(this.menusByGroup());\r\n } else {\r\n this.menusByGroup.set([]);\r\n }\r\n } else {\r\n this.idMenuGroupActive.set('');\r\n this.titleMenuGroup.set('');\r\n this.menusByGroup.set([]);\r\n }\r\n \r\n this.dataSource.data = this.menusByGroup();\r\n }\r\n };\r\n\r\n #expandParentNodesByCurrentPath(menus: SdLayoutMenu[]): boolean {\r\n let shouldPropagate = false;\r\n for (const menu of menus) {\r\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\r\n shouldPropagate = true;\r\n }\r\n if ('children' in menu && menu.children?.length) {\r\n const childHasMatch = this.#expandParentNodesByCurrentPath(menu.children);\r\n if (childHasMatch) {\r\n this.treeControl.expand(menu);\r\n shouldPropagate = true;\r\n }\r\n }\r\n }\r\n return shouldPropagate;\r\n }\r\n\r\n #filterMenuBySearchText = (menus: SdLayoutMenu[]): void => {\r\n const normalizeSearchText = this.#normalizeSearchText(this.searchText());\r\n\r\n if (!normalizeSearchText || normalizeSearchText.length < 3) {\r\n this.dataSource.data = menus;\r\n this.#onCollapseAllMenuNodes(menus);\r\n this.#expandParentNodesByCurrentPath(menus);\r\n } else {\r\n const aliasSearchText = SdUtilities.changeAliasLowerCase(normalizeSearchText);\r\n this.dataSource.data = this.#getMenuByAliasSearchText(menus, aliasSearchText);\r\n if (this.dataSource.data?.length) {\r\n this.#onExpandAllMenuNodes(this.dataSource.data);\r\n }\r\n }\r\n };\r\n\r\n #getMenuByAliasSearchText = (menus: SdLayoutMenu[], aliasSearchText: string): SdLayoutMenu[] => {\r\n const result: SdLayoutMenu[] = [];\r\n for (const menu of menus) {\r\n const aliasTitle = SdUtilities.changeAliasLowerCase(menu.title as string);\r\n \r\n if (aliasTitle.includes(aliasSearchText)) {\r\n result.push(menu);\r\n continue;\r\n }\r\n\r\n let matchedChildren: SdLayoutMenu[] = [];\r\n if ('children' in menu && menu.children?.length) {\r\n matchedChildren = this.#getMenuByAliasSearchText(menu.children, aliasSearchText);\r\n }\r\n\r\n if (matchedChildren?.length) {\r\n result.push({ ...menu, children: matchedChildren });\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n #isMenuPathMatchByCurrentPath = (path: string): boolean => {\r\n if (!path) return false;\r\n if (this.currentPath() === path) return true;\r\n return this.#normalizePath(this.currentPath()).startsWith(this.#normalizePath(path));\r\n };\r\n\r\n #normalizePath = (p: string): string => p.endsWith('/') ? p : p + '/';\r\n \r\n #closeMenu(): void {\r\n this.showSideBar.emit(null);\r\n }\r\n\r\n #convertColor = (input: string | undefined, opacity = 1): string => {\r\n if (!input) return '';\r\n input = input.trim();\r\n\r\n const hexRegex = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\r\n const rgbRegex = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/i;\r\n\r\n if (hexRegex.test(input)) {\r\n let hex = input.slice(1);\r\n if (hex.length === 3) {\r\n hex = hex.split('').map(c => c + c).join('');\r\n }\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\r\n }\r\n\r\n const rgbMatch = input.match(rgbRegex);\r\n if (rgbMatch) {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const [_, r, g, b] = rgbMatch;\r\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\r\n }\r\n\r\n return input;\r\n };\r\n\r\n #normalizeSearchText = (searchText: string) => {\r\n let str: string = searchText?.toString() ?? '';\r\n /* eslint-disable no-useless-escape */\r\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\r\n str = str.replace(/ + /g, ' ');\r\n return str.trim();\r\n };\r\n\r\n #getTotalMenus = (menus: SdLayoutMenu[]): number => {\r\n return menus.reduce((total, menu) => total + this.#countMenuNode(menu), 0);\r\n };\r\n\r\n #countMenuNode = (menu: SdLayoutMenu): number => {\r\n let count = 0;\r\n if ('children' in menu && menu.children?.length) {\r\n for (const child of menu.children) {\r\n count += this.#countMenuNode(child);\r\n }\r\n }\r\n return count;\r\n };\r\n}","@let _userInfo = userInfo();\r\n@let _sidebar = sidebar();\r\n\r\n@if (_userInfo && _sidebar) {\r\n <div class=\"wrapper\" [style.height]=\"isMobileOrTablet ? screenHeight + 'px' : '100%'\">\r\n <div class=\"c-header\">\r\n @if (_sidebar.logoUrl) {\r\n <div class=\"c-logo\">\r\n <a href=\"javascript:;\" (click)=\"openHomePage()\">\r\n <img alt=\"logo\" [src]=\"_sidebar.logoUrl\" />\r\n </a>\r\n </div>\r\n }\r\n <div class=\"c-title-menu-group\">\r\n <span>{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\r\n </div>\r\n </div>\r\n <div class=\"c-body\">\r\n <div class=\"c-menu\">\r\n <div class=\"c-menu-group\">\r\n @for (nodeMenuGroup of menus(); track nodeMenuGroup.id) {\r\n <button\r\n (mouseenter)=\"onMouseOverMenuGroupNode($event, nodeMenuGroup)\"\r\n (mouseleave)=\"onMouseLeaveMenuGroupNode($event, nodeMenuGroup)\"\r\n (click)=\"expandMenuGroup(nodeMenuGroup)\"\r\n [matTooltip]=\"nodeMenuGroup.tooltipTitle || nodeMenuGroup.title\"\r\n [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\r\n [matTooltipPosition]=\"'right'\"\r\n style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\r\n @if (nodeMenuGroup.iconUrl) {\r\n <span\r\n class=\"c-menu-group-icon\"\r\n [ngStyle]=\"{\r\n backgroundColor: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\r\n }\">\r\n <img width=\"24px\" height=\"24px\" [src]=\"nodeMenuGroup.iconUrl\" [alt]=\"nodeMenuGroup.title\" />\r\n </span>\r\n } @else {\r\n <mat-icon\r\n class=\"c-menu-group-icon\"\r\n [ngStyle]=\"{\r\n color: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandColor || '#2962FF' : '#8C8C8C',\r\n backgroundColor: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\r\n }\">\r\n {{ nodeMenuGroup.icon || 'widgets' }}\r\n </mat-icon>\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div class=\"c-menu-tree\">\r\n @if (totalMenuInMenusByGroup() >= 10) {\r\n <div style=\"padding: 0px 4px\" class=\"c-menu-tree-search\">\r\n <sd-input size=\"sm\" placeholder=\"Tìm kiếm\" [model]=\"searchText()\" (sdChange)=\"onFilterSearchText($event)\">\r\n <ng-template sdSuffixDef>\r\n @if (searchText()) {\r\n <mat-icon class=\"c-search-prefix-icon cancel\" (click)=\"onClearSearchText()\">cancel</mat-icon>\r\n } @else {\r\n <mat-icon class=\"c-search-prefix-icon search\">search</mat-icon>\r\n }\r\n </ng-template>\r\n </sd-input>\r\n </div>\r\n }\r\n <div class=\"c-menu-tree-container\">\r\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" [style.backgroundColor]=\"'transparent'\">\r\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: !hasChild\">\r\n <li\r\n class=\"c-menu-node\"\r\n (mouseenter)=\"onMouseOverMenuNode($event, node)\"\r\n (mouseleave)=\"onMouseLeaveMenuNode($event, node)\"\r\n [ngStyle]=\"{\r\n backgroundColor: (currentPath() | menuFocus: node) ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\r\n }\">\r\n <div aria-hidden=\"true\" class=\"c-menu-node-description\" (click)=\"navigate(node)\" [class.d-none]=\"!isShowSidebar()\">\r\n <div\r\n class=\"c-menu-node-description-content\"\r\n [ngStyle]=\"{\r\n color: (currentPath() | menuFocus: node) ? _sidebar.brandColor || '#2962FF' : '#1F1F1F',\r\n }\"\r\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\r\n </div>\r\n </li>\r\n </mat-nested-tree-node>\r\n\r\n <mat-nested-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n aria-hidden=\"true\"\r\n [class]=\"{ expanded: treeControl.isExpanded(node), isfocus: currentPath() | menuFocus: node }\">\r\n <li>\r\n <div\r\n class=\"c-menu-node\"\r\n (mouseenter)=\"onMouseOverMenuNode($event, node)\"\r\n (mouseleave)=\"onMouseLeaveMenuNode($event, node)\">\r\n <div class=\"d-flex align-items-center\" style=\"gap: 10px; width: 100%\">\r\n <div [class.d-none]=\"!isShowSidebar()\" class=\"c-menu-node-description\" (click)=\"onToggleMenuNode(node)\">\r\n <div\r\n class=\"c-menu-node-description-content\"\r\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\r\n <mat-icon class=\"c-menu-node-description-icon-expand\">\r\n {{ treeControl.isExpanded(node) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\r\n </mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n <ul class=\"p-0\" [class.d-none]=\"!treeControl.isExpanded(node)\">\r\n <ng-container matTreeNodeOutlet></ng-container>\r\n </ul>\r\n </li>\r\n </mat-nested-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"c-footer\">\r\n <lib-layout-user\r\n [userInfo]=\"_userInfo\"\r\n [isMobileOrTablet]=\"isMobileOrTablet\"\r\n (menuOpened)=\"onUserMenuOpened()\"\r\n (menuClosed)=\"onUserMenuClosed()\"\r\n [isShowSidebar]=\"isShowSidebar()\"\r\n (toggleMenuLock)=\"toggleMenuLock($event)\">\r\n </lib-layout-user>\r\n </div>\r\n\r\n <div class=\"c-vertical\"></div>\r\n </div>\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\r\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\n\r\n// NOTE: Import nội bộ trong module layout\r\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\r\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\r\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\r\n\r\n@Component({\r\n selector: 'sidebar-v1',\r\n templateUrl: './main.component.html',\r\n styleUrls: ['./main.component.scss'],\r\n imports: [MatSidenavModule, CommonModule, SidebarComponent],\r\n standalone: true,\r\n})\r\nexport class SidebarV1Component {\r\n // ==========================================\r\n // INJECT SERVICES\r\n // ==========================================\r\n #layoutStorageService = inject(SdLayoutStorageService);\r\n\r\n // ==========================================\r\n // VIEW CHILD & INPUTS\r\n // ==========================================\r\n sidenav = viewChild.required<MatSidenav>('sidenav');\r\n menus = input<SdLayoutMenu[]>([]);\r\n userInfo = input.required<SdLayoutUserInfo>();\r\n sidebar = input.required<SidebarConfigurationV1>();\r\n\r\n // ==========================================\r\n // STATE SIGNALS\r\n // ==========================================\r\n isMobileOrTablet = signal<boolean>(SdUtilities.isMobile());\r\n\r\n // Trạng thái khóa menu (luôn mở rộng hay không)\r\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\r\n\r\n // Trạng thái hiển thị (mở/đóng) của Sidenav\r\n isShowSidebar = signal<boolean>(SdUtilities.isMobile() ? false : (this.#layoutStorageService.menuLockStatus?.get() ?? true));\r\n\r\n onhover = signal<boolean>(false);\r\n\r\n // ==========================================\r\n // PRIVATE TIMERS\r\n // ==========================================\r\n #timerMouseInMenu: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor() {\r\n // EFFECT: Tự động đồng bộ isShowSidebar vào storage service mỗi khi nó thay đổi\r\n effect(() => {\r\n const isShow = this.isShowSidebar();\r\n untracked(() => {\r\n this.#layoutStorageService.isShowSidebar.set(isShow);\r\n });\r\n });\r\n }\r\n\r\n // ==========================================\r\n // EVENT HANDLERS\r\n // ==========================================\r\n\r\n #mouseLeave = (): void => {\r\n if (this.#timerMouseInMenu) {\r\n clearTimeout(this.#timerMouseInMenu);\r\n }\r\n\r\n if (this.onhover() && this.isShowSidebar()) {\r\n this.isShowSidebar.set(false);\r\n this.onhover.set(false);\r\n }\r\n };\r\n\r\n #handleMouseLeaveTransition = (): void => {\r\n if (!this.isShowSidebar()) {\r\n const delayTime = 400;\r\n if (this.#timerMouseInMenu) {\r\n clearTimeout(this.#timerMouseInMenu);\r\n }\r\n setTimeout(() => {\r\n this.#mouseLeave();\r\n }, delayTime);\r\n } else {\r\n this.#mouseLeave();\r\n }\r\n };\r\n\r\n openSidebar = (): void => {\r\n if (!this.isMobileOrTablet()) {\r\n return;\r\n }\r\n\r\n if (!this.isShowSidebar()) {\r\n this.isShowSidebar.set(true);\r\n this.onhover.set(true);\r\n }\r\n };\r\n\r\n onPopupOfSideBarOpened = (): void => {\r\n this.onhover.set(false);\r\n this.isShowSidebar.set(true);\r\n };\r\n\r\n onPopupOfSideBarClosed = (): void => {\r\n const delayTime = 500;\r\n if (!this.isMenuLock()) {\r\n this.onhover.set(true);\r\n setTimeout(() => {\r\n this.#mouseLeave();\r\n }, delayTime);\r\n }\r\n };\r\n\r\n onExpandSideBar = (): void => {\r\n if (this.isMobileOrTablet()) {\r\n return;\r\n }\r\n if (!this.isShowSidebar()) {\r\n this.isShowSidebar.set(true);\r\n this.onhover.set(true);\r\n }\r\n };\r\n\r\n onMouseleaveSideBar = (): void => {\r\n if (this.isMobileOrTablet()) {\r\n return;\r\n }\r\n this.#mouseLeave();\r\n };\r\n\r\n onToggle = (data: boolean | null) => {\r\n if (data === null) {\r\n this.#handleMouseLeaveTransition();\r\n } else {\r\n this.#mouseLeave();\r\n this.isShowSidebar.set(data);\r\n this.isMenuLock.set(data);\r\n\r\n // Toggle component MatSidenav\r\n const sidenavComp = this.sidenav();\r\n if (sidenavComp) {\r\n data ? sidenavComp.open() : sidenavComp.close();\r\n }\r\n }\r\n };\r\n}\r\n","<mat-sidenav-container class=\"c-layout-wrapper\">\r\n <mat-sidenav\r\n #sidenav\r\n [opened]=\"isShowSidebar()\"\r\n (openedChange)=\"isShowSidebar.set($event)\"\r\n class=\"c-layout-sidebar\"\r\n (click)=\"openSidebar()\"\r\n (mouseleave)=\"onMouseleaveSideBar()\"\r\n [mode]=\"isMobileOrTablet() ? 'over' : 'side'\"\r\n [fixedInViewport]=\"isMobileOrTablet()\">\r\n <sidebar\r\n [menus]=\"menus()\"\r\n [userInfo]=\"userInfo()\"\r\n [sidebar]=\"sidebar()\"\r\n [isShowSidebar]=\"isShowSidebar()\"\r\n (showSideBar)=\"onToggle($event)\"\r\n (expandSideBar)=\"onExpandSideBar()\"\r\n (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\r\n (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\">\r\n </sidebar>\r\n </mat-sidenav>\r\n\r\n <mat-sidenav-content class=\"c-layout-content\" [class.isShowSidebar]=\"isMenuLock()\">\r\n <mat-drawer-container class=\"c-mat-drawer-container\">\r\n <mat-drawer-content>\r\n <ng-content></ng-content>\r\n </mat-drawer-content>\r\n </mat-drawer-container>\r\n </mat-sidenav-content>\r\n</mat-sidenav-container>","import { Component, computed, inject, input } from '@angular/core';\r\n\r\n// Import nội bộ trong module layout\r\nimport { SdLayoutMenu, SdLayoutService } from '../../services';\r\nimport { MenuPipe } from '../../pipes';\r\nimport { SidebarV1Component } from '../sidebar-v1/main.component';\r\n\r\n@Component({\r\n selector: 'sd-layout',\r\n templateUrl: './layout-main.component.html',\r\n styleUrls: ['./layout-main.component.scss'],\r\n imports: [SidebarV1Component],\r\n standalone: true,\r\n})\r\nexport class SdLayoutComponent {\r\n // ==========================================\r\n // INJECT SERVICES\r\n // ==========================================\r\n #menuPipe = inject(MenuPipe);\r\n #layoutService = inject(SdLayoutService); // Inject LayoutService\r\n\r\n // ==========================================\r\n // SIGNAL INPUTS\r\n // ==========================================\r\n menusInput = input<SdLayoutMenu[]>([], { alias: 'menus' });\r\n\r\n // Tự động format qua MenuPipe mỗi khi menusInput từ component cha thay đổi\r\n menus = computed(() => this.#menuPipe.transform(this.menusInput() || []));\r\n\r\n // ==========================================\r\n // CONSUME SHARED STATE (Tuỳ chọn)\r\n // ==========================================\r\n // Bạn có thể gán biến ngắn gọn để xài trong HTML (ví dụ: userInfo() thay vì layoutService.userInfo())\r\n userInfo = this.#layoutService.userInfo;\r\n sidebar = this.#layoutService.sidebar;\r\n}\r\n","@let _userInfo = userInfo();\r\n@let _sidebar = sidebar();\r\n\r\n@if (_userInfo && _sidebar?.version === 1) {\r\n <sidebar-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebar!\">\r\n <ng-content></ng-content>\r\n </sidebar-v1>\r\n}\r\n","import { Component, inject, signal } from '@angular/core';\r\nimport { SdTabComponent } from '@sd-angular/core/components';\r\n\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SdPageComponent } from '../../../../components';\r\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\r\nimport { ActivatedRoute } from '@angular/router';\r\n// End\r\n\r\n@Component({\r\n selector: 'app-home-page',\r\n imports: [SdPageComponent],\r\n templateUrl: './home-page.component.html',\r\n styleUrls: ['./home-page.component.scss'],\r\n standalone: true,\r\n})\r\n@SdTabComponent({\r\n component: HomePageComponent,\r\n name: 'Trang chủ',\r\n icon: 'home',\r\n color: 'primary',\r\n})\r\nexport class HomePageComponent {\r\n // ==========================================\r\n // INJECT SERVICES (Modern Angular)\r\n // ==========================================\r\n readonly #route = inject(ActivatedRoute);\r\n readonly #layoutService = inject(SdLayoutService);\r\n\r\n // ==========================================\r\n // SIGNALS (STATE)\r\n // ==========================================\r\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\r\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\r\n userInfo = this.#layoutService.userInfo;\r\n // ==========================================\r\n // PRIVATE METHODS\r\n // ==========================================\r\n\r\n #getTimezone() {\r\n const now = new Date();\r\n const timezoneOffset = now.getTimezoneOffset();\r\n const offsetHours = -timezoneOffset / 60;\r\n const sign = offsetHours >= 0 ? '+' : '';\r\n const simpleGmtString = `GMT${sign}${offsetHours}`;\r\n return simpleGmtString;\r\n }\r\n\r\n #getTodayInfo(date: Date) {\r\n const mapping = {\r\n 0: 'Chủ Nhật',\r\n 1: 'Thứ 2',\r\n 2: 'Thứ 3',\r\n 3: 'Thứ 4',\r\n 4: 'Thứ 5',\r\n 5: 'Thứ 6',\r\n 6: 'Thứ 7',\r\n };\r\n return `${mapping[date.getDay() as keyof typeof mapping]}, ngày ${date.toLocaleDateString('vi-VN', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })} (${this.#getTimezone()})`;\r\n }\r\n}\r\n","@let _userInfo = userInfo();\r\n<sd-page>\r\n <div class=\"d-flex flex-column\" headerLeft>\r\n <div class=\"font-weight-medium fs-20\">Xin chào, {{ _userInfo?.fullName || _userInfo?.email || _userInfo?.username }}</div>\r\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\r\n </div>\r\n\r\n <div class=\"wrapper\">\r\n <img alt=\"welcome-photo\" class=\"welcome-image\" />\r\n <span class=\"first-line\">Chúc bạn một ngày làm việc</span>\r\n <span class=\"second-line\">tràn đầy năng lượng & hiệu quả!</span>\r\n </div>\r\n</sd-page>\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { CanActivate, Router } from '@angular/router';\r\n\r\n// Giả sử bạn có một service để đọc config\r\nimport { ISdLayoutConfiguration, SD_LAYOUT_CONFIGURATION } from '../../../configurations';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HomeRedirectGuard implements CanActivate {\r\n constructor(\r\n private router: Router,\r\n @Inject(SD_LAYOUT_CONFIGURATION) private layoutConfiguration: ISdLayoutConfiguration\r\n ) {}\r\n\r\n async canActivate() {\r\n const homeUrl = this.layoutConfiguration?.homeUrl;\r\n if (homeUrl) {\r\n // Nếu có config homeUrl, tạo một UrlTree để redirect\r\n // Đây là cách redirect chính thống từ trong guard\r\n return this.router.createUrlTree([homeUrl]);\r\n }\r\n // Nếu không có homeUrl, cho phép kích hoạt route\r\n return true;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { HomePageComponent } from './components/home-page/home-page.component';\r\nimport { HomeRedirectGuard } from './guards/home-redirect.guard';\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '',\r\n canActivate: [HomeRedirectGuard],\r\n component: HomePageComponent,\r\n },\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule],\r\n})\r\nexport class HomeRoutingModule {}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HomeRoutingModule } from './home.routing';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [CommonModule, HomeRoutingModule],\r\n})\r\nexport class HomeModule {}\r\n","import { Component, inject, signal } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { SdButton } from '@sd-angular/core/components';\r\n\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SdPageComponent } from '../../../../components';\r\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\r\n// End\r\n\r\n@Component({\r\n templateUrl: './root.component.html',\r\n styleUrls: ['./root.component.scss'],\r\n imports: [SdButton, SdPageComponent],\r\n})\r\nexport class RootComponent {\r\n // ==========================================\r\n // INJECT SERVICES (Modern Angular)\r\n // ==========================================\r\n readonly #route = inject(ActivatedRoute);\r\n readonly #layoutService = inject(SdLayoutService);\r\n\r\n // ==========================================\r\n // SIGNALS (STATE)\r\n // ==========================================\r\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\r\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\r\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\r\n userInfo = this.#layoutService.userInfo;\r\n // ==========================================\r\n // PRIVATE METHODS\r\n // ==========================================\r\n #getTodayInfo(date: Date): string {\r\n const mapping = {\r\n 0: 'Chủ Nhật',\r\n 1: 'Thứ 2',\r\n 2: 'Thứ 3',\r\n 3: 'Thứ 4',\r\n 4: 'Thứ 5',\r\n 5: 'Thứ 6',\r\n 6: 'Thứ 7',\r\n };\r\n\r\n return `${mapping[date.getDay() as keyof typeof mapping]}, ngày ${date.toLocaleDateString('vi-VN', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })}`;\r\n }\r\n\r\n // ==========================================\r\n // PUBLIC METHODS\r\n // ==========================================\r\n reload() {\r\n window.location.href = '';\r\n }\r\n}\r\n","@let _userInfo = userInfo();\r\n<sd-page>\r\n <div class=\"d-flex flex-column\" headerLeft>\r\n <div class=\"font-weight-medium fs-20\">Xin chào, {{ _userInfo?.fullName || _userInfo?.email || _userInfo?.username }}</div>\r\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\r\n </div>\r\n\r\n <div class=\"h-full d-flex flex-column align-items-center\">\r\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\r\n <img alt=\"error-image\" class=\"error-image\" />\r\n <span class=\"T16M mt-24\">404 - Trang không tồn tại</span>\r\n <span class=\"T16R text-secondary mt-4\">\r\n Trang bạn tìm không tồn tại hoặc đã bị xóa. Vui lòng kiểm tra lại địa chỉ URL hoặc quay lại trang chủ để tiếp tục.\r\n </span>\r\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" title=\"Quay trở lại\" prefixIcon=\"arrow_back\"> </sd-button>\r\n </div>\r\n </div>\r\n</sd-page>\r\n","import { Route } from '@angular/router';\r\nimport { RootComponent } from './pages/root/root.component';\r\n\r\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { Routes } from './not-found.routing';\r\n\r\n@NgModule({\r\n imports: [CommonModule, RouterModule.forChild(Routes)],\r\n exports: [],\r\n})\r\nexport class NotFoundModule {}\r\n","import { Component, inject, signal } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { SdButton } from '@sd-angular/core/components';\r\n\r\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\r\nimport { SdPageComponent } from '../../../../components';\r\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\r\n// End\r\n\r\n@Component({\r\n templateUrl: './root.component.html',\r\n styleUrls: ['./root.component.scss'],\r\n imports: [SdButton, SdPageComponent],\r\n})\r\nexport class RootComponent {\r\n // ==========================================\r\n // INJECT SERVICES (Modern Angular)\r\n // ==========================================\r\n readonly #route = inject(ActivatedRoute);\r\n readonly #layoutService = inject(SdLayoutService);\r\n\r\n // ==========================================\r\n // SIGNALS (STATE)\r\n // ==========================================\r\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\r\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\r\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\r\n userInfo = this.#layoutService.userInfo;\r\n // ==========================================\r\n // PRIVATE METHODS\r\n // ==========================================\r\n #getTodayInfo(date: Date): string {\r\n const mapping = {\r\n 0: 'Chủ Nhật',\r\n 1: 'Thứ 2',\r\n 2: 'Thứ 3',\r\n 3: 'Thứ 4',\r\n 4: 'Thứ 5',\r\n 5: 'Thứ 6',\r\n 6: 'Thứ 7',\r\n };\r\n\r\n return `${mapping[date.getDay() as keyof typeof mapping]}, ngày ${date.toLocaleDateString('vi-VN', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })}`;\r\n }\r\n\r\n // ==========================================\r\n // PUBLIC METHODS\r\n // ==========================================\r\n reload() {\r\n window.location.href = '';\r\n }\r\n}\r\n","@let _userInfo = userInfo();\r\n<sd-page>\r\n <div class=\"d-flex flex-column\" headerLeft>\r\n <div class=\"font-weight-medium fs-20\">Xin chào, {{ _userInfo?.fullName || _userInfo?.email || _userInfo?.username }}</div>\r\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\r\n </div>\r\n <div class=\"h-full d-flex flex-column align-items-center\">\r\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\r\n <img alt=\"error-image\" class=\"error-image\" />\r\n <span class=\"T16M mt-24\">Không được phép truy cập</span>\r\n <span class=\"T14R text-secondary mt-4\"\r\n >Bạn không có quyền truy cập vào trang này. Liên hệ với quản trị viên hoặc quay lại trang chủ</span\r\n >\r\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" title=\"Quay lại trang chủ\"> </sd-button>\r\n </div>\r\n </div>\r\n</sd-page>\r\n","import { Route } from '@angular/router';\r\nimport { RootComponent } from './pages/root/root.component';\r\n\r\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { Routes } from './forbidden.routing';\r\n\r\n@NgModule({\r\n imports: [CommonModule, RouterModule.forChild(Routes)],\r\n exports: [],\r\n})\r\nexport class ForbiddenModule {}\r\n","import { Route } from '@angular/router';\r\n\r\nexport const Routes: Route[] = [\r\n {\r\n path: '',\r\n pathMatch: 'full',\r\n redirectTo: 'not-found',\r\n },\r\n {\r\n path: 'home',\r\n loadChildren: () => import('./modules/home').then(m => m.HomeModule),\r\n },\r\n {\r\n path: 'not-found',\r\n loadChildren: () => import('./modules/not-found').then(m => m.NotFoundModule),\r\n },\r\n {\r\n path: 'forbidden',\r\n loadChildren: () => import('./modules/forbidden').then(m => m.ForbiddenModule),\r\n },\r\n];\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { Routes } from './layout.routing';\r\n@NgModule({\r\n declarations: [],\r\n imports: [RouterModule.forChild(Routes)],\r\n providers: [],\r\n})\r\nexport class SdLayoutModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3","RootComponent","Routes"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sd-angular/core",
|
|
3
|
-
"version": "19.0.0-beta.
|
|
3
|
+
"version": "19.0.0-beta.59",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": "^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
6
6
|
"@angular/core": "^19.0.0 || ^20.0.0 || ^21.0.0",
|
|
@@ -98,10 +98,6 @@
|
|
|
98
98
|
"types": "./components/button/index.d.ts",
|
|
99
99
|
"default": "./fesm2022/sd-angular-core-components-button.mjs"
|
|
100
100
|
},
|
|
101
|
-
"./components/history": {
|
|
102
|
-
"types": "./components/history/index.d.ts",
|
|
103
|
-
"default": "./fesm2022/sd-angular-core-components-history.mjs"
|
|
104
|
-
},
|
|
105
101
|
"./components/code-editor": {
|
|
106
102
|
"types": "./components/code-editor/index.d.ts",
|
|
107
103
|
"default": "./fesm2022/sd-angular-core-components-code-editor.mjs"
|
|
@@ -110,6 +106,10 @@
|
|
|
110
106
|
"types": "./components/document-builder/index.d.ts",
|
|
111
107
|
"default": "./fesm2022/sd-angular-core-components-document-builder.mjs"
|
|
112
108
|
},
|
|
109
|
+
"./components/history": {
|
|
110
|
+
"types": "./components/history/index.d.ts",
|
|
111
|
+
"default": "./fesm2022/sd-angular-core-components-history.mjs"
|
|
112
|
+
},
|
|
113
113
|
"./components/mini-editor": {
|
|
114
114
|
"types": "./components/mini-editor/index.d.ts",
|
|
115
115
|
"default": "./fesm2022/sd-angular-core-components-mini-editor.mjs"
|
|
@@ -122,10 +122,6 @@
|
|
|
122
122
|
"types": "./components/modal/index.d.ts",
|
|
123
123
|
"default": "./fesm2022/sd-angular-core-components-modal.mjs"
|
|
124
124
|
},
|
|
125
|
-
"./components/preview": {
|
|
126
|
-
"types": "./components/preview/index.d.ts",
|
|
127
|
-
"default": "./fesm2022/sd-angular-core-components-preview.mjs"
|
|
128
|
-
},
|
|
129
125
|
"./components/query-builder": {
|
|
130
126
|
"types": "./components/query-builder/index.d.ts",
|
|
131
127
|
"default": "./fesm2022/sd-angular-core-components-query-builder.mjs"
|
|
@@ -134,42 +130,42 @@
|
|
|
134
130
|
"types": "./components/quick-action/index.d.ts",
|
|
135
131
|
"default": "./fesm2022/sd-angular-core-components-quick-action.mjs"
|
|
136
132
|
},
|
|
133
|
+
"./components/preview": {
|
|
134
|
+
"types": "./components/preview/index.d.ts",
|
|
135
|
+
"default": "./fesm2022/sd-angular-core-components-preview.mjs"
|
|
136
|
+
},
|
|
137
137
|
"./components/section": {
|
|
138
138
|
"types": "./components/section/index.d.ts",
|
|
139
139
|
"default": "./fesm2022/sd-angular-core-components-section.mjs"
|
|
140
140
|
},
|
|
141
|
-
"./components/tab-router": {
|
|
142
|
-
"types": "./components/tab-router/index.d.ts",
|
|
143
|
-
"default": "./fesm2022/sd-angular-core-components-tab-router.mjs"
|
|
144
|
-
},
|
|
145
141
|
"./components/side-drawer": {
|
|
146
142
|
"types": "./components/side-drawer/index.d.ts",
|
|
147
143
|
"default": "./fesm2022/sd-angular-core-components-side-drawer.mjs"
|
|
148
144
|
},
|
|
145
|
+
"./components/tab-router": {
|
|
146
|
+
"types": "./components/tab-router/index.d.ts",
|
|
147
|
+
"default": "./fesm2022/sd-angular-core-components-tab-router.mjs"
|
|
148
|
+
},
|
|
149
149
|
"./components/table": {
|
|
150
150
|
"types": "./components/table/index.d.ts",
|
|
151
151
|
"default": "./fesm2022/sd-angular-core-components-table.mjs"
|
|
152
152
|
},
|
|
153
|
-
"./components/
|
|
154
|
-
"types": "./components/
|
|
155
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
156
|
-
},
|
|
157
|
-
"./components/workflow": {
|
|
158
|
-
"types": "./components/workflow/index.d.ts",
|
|
159
|
-
"default": "./fesm2022/sd-angular-core-components-workflow.mjs"
|
|
153
|
+
"./components/upload-file": {
|
|
154
|
+
"types": "./components/upload-file/index.d.ts",
|
|
155
|
+
"default": "./fesm2022/sd-angular-core-components-upload-file.mjs"
|
|
160
156
|
},
|
|
161
157
|
"./forms/autocomplete": {
|
|
162
158
|
"types": "./forms/autocomplete/index.d.ts",
|
|
163
159
|
"default": "./fesm2022/sd-angular-core-forms-autocomplete.mjs"
|
|
164
160
|
},
|
|
161
|
+
"./components/workflow": {
|
|
162
|
+
"types": "./components/workflow/index.d.ts",
|
|
163
|
+
"default": "./fesm2022/sd-angular-core-components-workflow.mjs"
|
|
164
|
+
},
|
|
165
165
|
"./forms/checkbox": {
|
|
166
166
|
"types": "./forms/checkbox/index.d.ts",
|
|
167
167
|
"default": "./fesm2022/sd-angular-core-forms-checkbox.mjs"
|
|
168
168
|
},
|
|
169
|
-
"./forms/chip-calendar": {
|
|
170
|
-
"types": "./forms/chip-calendar/index.d.ts",
|
|
171
|
-
"default": "./fesm2022/sd-angular-core-forms-chip-calendar.mjs"
|
|
172
|
-
},
|
|
173
169
|
"./forms/chip": {
|
|
174
170
|
"types": "./forms/chip/index.d.ts",
|
|
175
171
|
"default": "./fesm2022/sd-angular-core-forms-chip.mjs"
|
|
@@ -178,6 +174,10 @@
|
|
|
178
174
|
"types": "./forms/date/index.d.ts",
|
|
179
175
|
"default": "./fesm2022/sd-angular-core-forms-date.mjs"
|
|
180
176
|
},
|
|
177
|
+
"./forms/chip-calendar": {
|
|
178
|
+
"types": "./forms/chip-calendar/index.d.ts",
|
|
179
|
+
"default": "./fesm2022/sd-angular-core-forms-chip-calendar.mjs"
|
|
180
|
+
},
|
|
181
181
|
"./forms/datetime": {
|
|
182
182
|
"types": "./forms/datetime/index.d.ts",
|
|
183
183
|
"default": "./fesm2022/sd-angular-core-forms-datetime.mjs"
|
|
@@ -194,14 +194,14 @@
|
|
|
194
194
|
"types": "./forms/input/index.d.ts",
|
|
195
195
|
"default": "./fesm2022/sd-angular-core-forms-input.mjs"
|
|
196
196
|
},
|
|
197
|
-
"./forms/label": {
|
|
198
|
-
"types": "./forms/label/index.d.ts",
|
|
199
|
-
"default": "./fesm2022/sd-angular-core-forms-label.mjs"
|
|
200
|
-
},
|
|
201
197
|
"./forms/input-number": {
|
|
202
198
|
"types": "./forms/input-number/index.d.ts",
|
|
203
199
|
"default": "./fesm2022/sd-angular-core-forms-input-number.mjs"
|
|
204
200
|
},
|
|
201
|
+
"./forms/label": {
|
|
202
|
+
"types": "./forms/label/index.d.ts",
|
|
203
|
+
"default": "./fesm2022/sd-angular-core-forms-label.mjs"
|
|
204
|
+
},
|
|
205
205
|
"./forms/models": {
|
|
206
206
|
"types": "./forms/models/index.d.ts",
|
|
207
207
|
"default": "./fesm2022/sd-angular-core-forms-models.mjs"
|
|
@@ -214,6 +214,10 @@
|
|
|
214
214
|
"types": "./forms/select/index.d.ts",
|
|
215
215
|
"default": "./fesm2022/sd-angular-core-forms-select.mjs"
|
|
216
216
|
},
|
|
217
|
+
"./forms/switch": {
|
|
218
|
+
"types": "./forms/switch/index.d.ts",
|
|
219
|
+
"default": "./fesm2022/sd-angular-core-forms-switch.mjs"
|
|
220
|
+
},
|
|
217
221
|
"./forms/textarea": {
|
|
218
222
|
"types": "./forms/textarea/index.d.ts",
|
|
219
223
|
"default": "./fesm2022/sd-angular-core-forms-textarea.mjs"
|
|
@@ -222,22 +226,18 @@
|
|
|
222
226
|
"types": "./guards/permission/index.d.ts",
|
|
223
227
|
"default": "./fesm2022/sd-angular-core-guards-permission.mjs"
|
|
224
228
|
},
|
|
225
|
-
"./forms/switch": {
|
|
226
|
-
"types": "./forms/switch/index.d.ts",
|
|
227
|
-
"default": "./fesm2022/sd-angular-core-forms-switch.mjs"
|
|
228
|
-
},
|
|
229
229
|
"./modules/auth": {
|
|
230
230
|
"types": "./modules/auth/index.d.ts",
|
|
231
231
|
"default": "./fesm2022/sd-angular-core-modules-auth.mjs"
|
|
232
232
|
},
|
|
233
|
-
"./modules/layout": {
|
|
234
|
-
"types": "./modules/layout/index.d.ts",
|
|
235
|
-
"default": "./fesm2022/sd-angular-core-modules-layout.mjs"
|
|
236
|
-
},
|
|
237
233
|
"./modules/keycloak": {
|
|
238
234
|
"types": "./modules/keycloak/index.d.ts",
|
|
239
235
|
"default": "./fesm2022/sd-angular-core-modules-keycloak.mjs"
|
|
240
236
|
},
|
|
237
|
+
"./modules/layout": {
|
|
238
|
+
"types": "./modules/layout/index.d.ts",
|
|
239
|
+
"default": "./fesm2022/sd-angular-core-modules-layout.mjs"
|
|
240
|
+
},
|
|
241
241
|
"./modules/permission": {
|
|
242
242
|
"types": "./modules/permission/index.d.ts",
|
|
243
243
|
"default": "./fesm2022/sd-angular-core-modules-permission.mjs"
|
|
@@ -258,30 +258,30 @@
|
|
|
258
258
|
"types": "./services/docx/index.d.ts",
|
|
259
259
|
"default": "./fesm2022/sd-angular-core-services-docx.mjs"
|
|
260
260
|
},
|
|
261
|
-
"./services/excel": {
|
|
262
|
-
"types": "./services/excel/index.d.ts",
|
|
263
|
-
"default": "./fesm2022/sd-angular-core-services-excel.mjs"
|
|
264
|
-
},
|
|
265
261
|
"./services/firebase": {
|
|
266
262
|
"types": "./services/firebase/index.d.ts",
|
|
267
263
|
"default": "./fesm2022/sd-angular-core-services-firebase.mjs"
|
|
268
264
|
},
|
|
269
|
-
"./services/
|
|
270
|
-
"types": "./services/
|
|
271
|
-
"default": "./fesm2022/sd-angular-core-services-
|
|
265
|
+
"./services/excel": {
|
|
266
|
+
"types": "./services/excel/index.d.ts",
|
|
267
|
+
"default": "./fesm2022/sd-angular-core-services-excel.mjs"
|
|
272
268
|
},
|
|
273
269
|
"./services/license": {
|
|
274
270
|
"types": "./services/license/index.d.ts",
|
|
275
271
|
"default": "./fesm2022/sd-angular-core-services-license.mjs"
|
|
276
272
|
},
|
|
277
|
-
"./services/
|
|
278
|
-
"types": "./services/
|
|
279
|
-
"default": "./fesm2022/sd-angular-core-services-
|
|
273
|
+
"./services/loading": {
|
|
274
|
+
"types": "./services/loading/index.d.ts",
|
|
275
|
+
"default": "./fesm2022/sd-angular-core-services-loading.mjs"
|
|
280
276
|
},
|
|
281
277
|
"./services/notify": {
|
|
282
278
|
"types": "./services/notify/index.d.ts",
|
|
283
279
|
"default": "./fesm2022/sd-angular-core-services-notify.mjs"
|
|
284
280
|
},
|
|
281
|
+
"./services/storage": {
|
|
282
|
+
"types": "./services/storage/index.d.ts",
|
|
283
|
+
"default": "./fesm2022/sd-angular-core-services-storage.mjs"
|
|
284
|
+
},
|
|
285
285
|
"./utilities/extensions": {
|
|
286
286
|
"types": "./utilities/extensions/index.d.ts",
|
|
287
287
|
"default": "./fesm2022/sd-angular-core-utilities-extensions.mjs"
|
|
@@ -290,9 +290,9 @@
|
|
|
290
290
|
"types": "./utilities/models/index.d.ts",
|
|
291
291
|
"default": "./fesm2022/sd-angular-core-utilities-models.mjs"
|
|
292
292
|
},
|
|
293
|
-
"./components/
|
|
294
|
-
"types": "./components/
|
|
295
|
-
"default": "./fesm2022/sd-angular-core-components-
|
|
293
|
+
"./components/view": {
|
|
294
|
+
"types": "./components/view/index.d.ts",
|
|
295
|
+
"default": "./fesm2022/sd-angular-core-components-view.mjs"
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
298
|
}
|
|
Binary file
|
|
Binary file
|