@sd-angular/core 19.0.0-beta.55 → 19.0.0-beta.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/assets/scss/core/form.scss +4 -1
  2. package/components/button/src/button.component.d.ts +5 -1
  3. package/components/document-builder/src/document-builder.component.d.ts +3 -14
  4. package/components/document-builder/src/document-builder.model.d.ts +4 -1
  5. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +1 -0
  6. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +39 -0
  7. package/components/section/src/section.component.d.ts +1 -1
  8. package/components/side-drawer/src/side-drawer.component.d.ts +11 -23
  9. package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +12 -2
  10. package/components/table/src/components/desktop-cell-view/desktop-cell-view.component.d.ts +12 -2
  11. package/components/table/src/components/selector-action/selector-action.component.d.ts +5 -3
  12. package/components/table/src/models/table-column.model.d.ts +1 -0
  13. package/components/table/src/models/table-option-config.model.d.ts +5 -0
  14. package/fesm2022/sd-angular-core-components-badge.mjs +11 -11
  15. package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
  16. package/fesm2022/sd-angular-core-components-button.mjs +8 -2
  17. package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
  18. package/fesm2022/sd-angular-core-components-document-builder.mjs +458 -186
  19. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  20. package/fesm2022/sd-angular-core-components-import-excel.mjs +1 -1
  21. package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
  22. package/fesm2022/sd-angular-core-components-preview.mjs +1 -1
  23. package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
  24. package/fesm2022/sd-angular-core-components-section.mjs +3 -3
  25. package/fesm2022/sd-angular-core-components-section.mjs.map +1 -1
  26. package/fesm2022/sd-angular-core-components-side-drawer.mjs +70 -89
  27. package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
  28. package/fesm2022/sd-angular-core-components-table.mjs +88 -26
  29. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  30. package/fesm2022/sd-angular-core-components-upload-file.mjs +1 -1
  31. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  32. package/fesm2022/sd-angular-core-components-workflow.mjs +23 -23
  33. package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
  34. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +5 -2
  35. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
  36. package/fesm2022/sd-angular-core-forms-chip.mjs +5 -2
  37. package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
  38. package/fesm2022/sd-angular-core-forms-date-range.mjs +4 -3
  39. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  40. package/fesm2022/sd-angular-core-forms-date.mjs +4 -3
  41. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  42. package/fesm2022/sd-angular-core-forms-datetime.mjs +4 -3
  43. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  44. package/fesm2022/sd-angular-core-forms-input-number.mjs +3 -2
  45. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  46. package/fesm2022/sd-angular-core-forms-input.mjs +6 -4
  47. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  48. package/fesm2022/sd-angular-core-forms-select.mjs +3 -2
  49. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  50. package/fesm2022/sd-angular-core-forms-textarea.mjs +3 -2
  51. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  52. package/fesm2022/sd-angular-core-modules-layout.mjs +5 -5
  53. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  54. package/fesm2022/sd-angular-core-services-confirm.mjs +1 -1
  55. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  56. package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
  57. package/forms/chip/src/chip.component.d.ts +3 -2
  58. package/forms/chip-calendar/src/chip-calendar.component.d.ts +3 -2
  59. package/forms/date/src/date.component.d.ts +3 -2
  60. package/forms/date-range/src/date-range.component.d.ts +3 -2
  61. package/forms/datetime/src/datetime.component.d.ts +3 -2
  62. package/forms/input/src/input.component.d.ts +3 -2
  63. package/forms/input-number/src/input-number.component.d.ts +3 -2
  64. package/forms/select/src/select.component.d.ts +3 -2
  65. package/forms/textarea/src/textarea.component.d.ts +3 -2
  66. package/modules/layout/pipes/high-light-search.pipe.d.ts +1 -1
  67. package/package.json +55 -55
  68. package/sd-angular-core-19.0.0-beta.57.tgz +0 -0
  69. package/services/notify/index.d.ts +1 -0
  70. package/services/notify/src/notify.model.d.ts +1 -1
  71. package/services/notify/src/notify.service.d.ts +5 -5
  72. package/sd-angular-core-19.0.0-beta.55.tgz +0 -0
@@ -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 agrs?: {\r\n color?: string;\r\n }\r\n ): string {\r\n const { color = '#ffff00' } = agrs ?? {};\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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"}