@sdcorejs/angular 21.0.7 → 21.0.8

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 (78) hide show
  1. package/README.md +8 -2
  2. package/assets/STYLE-GUIDE.md +13 -0
  3. package/fesm2022/sdcorejs-angular-components-anchor.mjs +2 -3
  4. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  5. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +195 -25
  6. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  7. package/fesm2022/sdcorejs-angular-components-badge.mjs +2 -2
  8. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  9. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  10. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  11. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +5 -6
  12. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  13. package/fesm2022/sdcorejs-angular-components-editor.mjs +4 -4
  14. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  15. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +4 -4
  16. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  17. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  18. package/fesm2022/sdcorejs-angular-components-inform.mjs +2 -2
  19. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  20. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +2 -2
  21. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  22. package/fesm2022/sdcorejs-angular-components-modal.mjs +2 -2
  23. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  24. package/fesm2022/sdcorejs-angular-components-operator.mjs +2 -2
  25. package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +2 -2
  27. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-components-preview.mjs +3 -3
  29. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +8 -8
  31. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-section.mjs +2 -2
  33. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +6 -4
  35. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-table.mjs +8 -9
  37. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-tree.mjs +2 -2
  39. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  40. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +6 -7
  41. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +4 -5
  43. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +3 -3
  45. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +4 -4
  47. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-forms-chip.mjs +4 -4
  49. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +8 -9
  51. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-forms-date.mjs +5 -6
  53. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +5 -6
  55. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-forms-inline-text.mjs +2 -2
  57. package/fesm2022/sdcorejs-angular-forms-inline-text.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +5 -6
  59. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-forms-input.mjs +3 -3
  61. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-forms-radio.mjs +3 -4
  63. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-forms-select.mjs +2 -2
  65. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-switch.mjs +3 -4
  67. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +5 -7
  69. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-modules-layout.mjs +2 -3
  71. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-services-api.mjs +1 -2
  73. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-services-confirm.mjs +2 -2
  75. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  76. package/package.json +1 -1
  77. package/types/sdcorejs-angular-components-autoid-inspector.d.ts +47 -137
  78. package/types/sdcorejs-angular-forms-input-number.d.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-modules-layout.mjs","sources":["../../../projects/sdcorejs-angular/modules/layout/components/page/page.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/page/page.component.html","../../../projects/sdcorejs-angular/modules/layout/services/storage/storage.service.ts","../../../projects/sdcorejs-angular/modules/layout/configurations/layout.configuration.ts","../../../projects/sdcorejs-angular/modules/layout/services/layout.service.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/menu.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/menu-focus.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/high-light-search.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/user/user.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/user/user.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/user/user.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/user/user.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/layout-main/layout-main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/layout-main/layout-main.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/home/components/home-page/home-page.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/components/home-page/home-page.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/home/guards/home-redirect.guard.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/home.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/home.module.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/pages/root/root.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/pages/root/root.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/not-found.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/not-found.module.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/pages/root/root.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/pages/root/root.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/forbidden.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/forbidden.module.ts","../../../projects/sdcorejs-angular/modules/layout/layout.routing.ts","../../../projects/sdcorejs-angular/modules/layout/layout.module.ts","../../../projects/sdcorejs-angular/modules/layout/sdcorejs-angular-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, inject } from '@angular/core';\nimport { SdStorage, SdStorageService } from '@sdcorejs/angular/services';\nimport { ISdLayoutConfiguration, SD_LAYOUT_CONFIGURATION } from '../../configurations';\nimport { SdLayoutChildrenMenu } from '../menu/menu.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdLayoutStorageService {\n // Thông tin state của sidebar\n isShowSidebar: SdStorage<boolean>;\n menuLockStatus: SdStorage<boolean>;\n lastActiveMenuGroupId: SdStorage<string>;\n pinnedMenuGroup: SdStorage<SdLayoutChildrenMenu>;\n // End\n\n constructor(private sdStorageService: SdStorageService) {\n // State sidebar\n this.isShowSidebar = this.sdStorageService.create('cb07c316-ed6d-4620-9e92-53dbef6aa983');\n this.menuLockStatus = this.sdStorageService.create('2c2f4816-18b3-4ec3-8177-7b90bff036c3');\n this.lastActiveMenuGroupId = this.sdStorageService.create('2e6961d0-3380-4a94-a6a1-38837560cd96');\n this.pinnedMenuGroup = this.sdStorageService.create('e81da122-5dab-4250-b309-64197fb19d44');\n // End\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { MaybeAsync } from '@sdcorejs/utils/models';\nexport interface ISdLayoutConfiguration {\n homeUrl?: string;\n sidebar: ISdSidebarConfiguration | (() => MaybeAsync<ISdSidebarConfiguration>);\n userInfo: SdLayoutUserInfo | (() => MaybeAsync<SdLayoutUserInfo>);\n signout: () => void | Promise<void>;\n changePassword?: () => void | Promise<void>;\n}\n\nexport interface SdLayoutUserInfo {\n /**\n * Tên đăng nhập hoặc tên định danh của người dùng.\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.\n */\n username?: string;\n\n /**\n * Địa chỉ thư điện tử của người dùng.\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.\n */\n email?: string;\n\n /**\n * Họ và tên đầy đủ của người dùng.\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).\n */\n fullName?: string;\n\n /**\n * Hình đại diện (avatar) của người dùng.\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.\n * Hỗ trợ các định dạng: URL (http/https), chuỗi base64 (data:image), hoặc đường dẫn nội bộ.\n */\n avatar?: string;\n}\n\nexport type ISdSidebarConfiguration = SidebarConfigurationV1;\n\nexport interface SidebarConfigurationV1 {\n version: 1;\n\n /**\n * Màu brand chính.\n * Nên sử dụng mã màu #HEX hoặc rgb để hỗ trợ opacity khi hover.\n * Ví dụ: #1890ff, rgb(24,144,255)\n */\n brandColor?: string;\n\n /**\n * Màu brand nhạt (light).\n * Dùng cho background, hover nhẹ.\n */\n brandLightColor?: string;\n\n /**\n * URL logo hiển thị ở sidebar.\n * Nên đặt trong thư mục public hoặc dùng URL CDN.\n */\n logoUrl?: string;\n\n /**\n * Title mặc định của hệ thống.\n * Nếu menu không truyền title thì sẽ dùng giá trị này.\n * @default \"Back Office\"\n */\n defaultTitle?: string;\n\n /**\n * Cấu hình tính năng ghim menu.\n * - `enabled`: bật/tắt tính năng ghim.\n * Hệ thống mặc định là false\n */\n pin?: {\n enabled?: boolean;\n };\n}\n\nexport const SD_LAYOUT_CONFIGURATION = new InjectionToken<ISdLayoutConfiguration>('sd.layout.configuration');\n","import { Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { resolveMaybeAsync } from '@sdcorejs/utils/models';\nimport { ISdLayoutConfiguration, ISdSidebarConfiguration, SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../configurations';\n\n@Injectable({\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\n})\nexport class SdLayoutService {\n // ==========================================\n // INJECT CONFIGURATIONS\n // ==========================================\n // WHY: optional=true cho phép layout module chạy không cần SD_LAYOUT_CONFIGURATION\n // (use case demo / khởi tạo nhanh). Khi token không có → fallback mock data trong constructor.\n #layoutConfiguration = inject<ISdLayoutConfiguration | null>(SD_LAYOUT_CONFIGURATION, { optional: true });\n #i18n = inject(I18nService);\n\n // ==========================================\n // SHARED SIGNALS (STATE)\n // ==========================================\n userInfo = signal<SdLayoutUserInfo | undefined>(undefined);\n sidebar = signal<ISdSidebarConfiguration | undefined>(undefined);\n\n constructor() {\n if (!this.#layoutConfiguration) {\n // WHY: cho phép layout module chạy không cần config (use case demo / khởi tạo nhanh).\n // Fallback dùng mock data đã i18n hóa; thật tế khi tích hợp portal cần provide SD_LAYOUT_CONFIGURATION.\n // @i18n-ignore dev-facing console.warn — không cần dịch\n console.warn(\n // @i18n-ignore\n '[SdLayoutService] SD_LAYOUT_CONFIGURATION chưa được inject — đang dùng mock data. ' +\n // @i18n-ignore\n 'Provide token này (xem ISdLayoutConfiguration) để custom user info / sidebar / signout.'\n );\n this.userInfo.set(this.#mockUserInfo());\n this.sidebar.set(this.#mockSidebar());\n return;\n }\n this.#initUserInfo();\n this.#initSidebar();\n }\n\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #initUserInfo(): void {\n const userInfoConfig = this.#layoutConfiguration!.userInfo;\n if (typeof userInfoConfig === 'function') {\n resolveMaybeAsync(userInfoConfig()).then(userInfo => this.userInfo.set(userInfo));\n } else {\n this.userInfo.set(userInfoConfig);\n }\n }\n\n #initSidebar(): void {\n const sidebarConfig = this.#layoutConfiguration!.sidebar;\n if (typeof sidebarConfig === 'function') {\n resolveMaybeAsync(sidebarConfig()).then(config => this.sidebar.set(config));\n } else {\n this.sidebar.set(sidebarConfig);\n }\n }\n\n #mockUserInfo(): SdLayoutUserInfo {\n return {\n fullName: this.#i18n.t('core.module.layout.mock.user.full-name'),\n email: 'demo@example.com',\n username: 'demo',\n };\n }\n\n #mockSidebar(): ISdSidebarConfiguration {\n return {\n version: 1,\n defaultTitle: 'Back Office',\n };\n }\n}\n","import * as uuid from 'uuid';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { Injectable, Pipe, PipeTransform } from '@angular/core';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu, Menus } from '../services/menu/menu.model';\nimport { Params } from '@angular/router';\nimport { SdPermissionService } from '@sdcorejs/angular/modules/permission';\n// End\n@Pipe({\n name: 'menu',\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class MenuPipe implements PipeTransform {\n constructor(private permissionService: SdPermissionService) {}\n transform(menus: SdLayoutMenu[]): SdLayoutMenu[] {\n const results: Menus = [];\n const check = (menu: SdLayoutMenu): SdLayoutMenu | null => {\n if ('children' in menu) {\n const children: Menus = [];\n menu.children?.forEach(childMenu => {\n childMenu = check(childMenu) as SdLayoutMenu;\n if (childMenu) {\n children.push({ ...childMenu, id: this.#getHashIdMenu(childMenu) });\n }\n });\n\n if (!children.length) {\n return null;\n }\n\n return {\n ...menu,\n children,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if ('permission' in menu) {\n const path = menu?.path?.includes('http') ? menu.path : menu.path;\n if (!menu.path) {\n return null;\n }\n\n if ((typeof menu.permission === 'string' || Array.isArray(menu.permission)) && this.permissionService.hasPermission(menu.permission, menu.permissionKey)) {\n return {\n ...menu,\n path,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if (typeof menu.permission === 'boolean' && menu.permission) {\n return {\n ...menu,\n path,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if (typeof menu.permission === 'function' && menu.permission()) {\n return {\n ...menu,\n path,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n return null;\n }\n return {\n ...menu,\n id: uuid.v4(),\n };\n };\n\n menus?.forEach(menu => {\n menu = check(menu) as SdLayoutMenu;\n if (menu) {\n results.push(menu);\n }\n });\n return results;\n }\n\n #getHashIdMenu = (menu: SdLayoutMenu): string => {\n const extendedMenu = menu as SdLayoutMenu & {\n path?: string;\n permission?: string;\n permissionKey?: string;\n queryParams?: Params;\n };\n const hashKeys: (keyof typeof extendedMenu)[] = ['title', 'path', 'permission', 'permissionKey', 'queryParams', 'icon', 'level', 'tooltipTitle'];\n const hashData = hashKeys.reduce(\n (acc, key) => {\n const value = extendedMenu[key];\n if (value !== undefined && value !== null) {\n acc[key as string] = value;\n }\n return acc;\n },\n {} as Record<string, any>\n );\n\n return Object.keys(hashData).length > 0 ? Utilities.hash(hashData) : uuid.v4();\n };\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu } from '../services';\n// End\n@Pipe({\n name: 'menuFocus',\n})\n@Injectable({ providedIn: 'root' })\nexport class MenuFocusPipe implements PipeTransform {\n transform(routePath: string, menuItem: SdLayoutMenu): boolean {\n if (!routePath) {\n return false;\n }\n if ('children' in menuItem && menuItem.children) {\n return menuItem.children.some(child => {\n return 'path' in child && child.path ? this.#match(routePath, child.path) : false;\n });\n }\n return 'path' in menuItem && this.#match(routePath, menuItem.path);\n }\n\n #match = (routePath: string, path: string): boolean => {\n if (!path) {\n return false;\n }\n if (routePath === path) {\n return true;\n }\n return this.#normalizePath(routePath).startsWith(this.#normalizePath(path));\n };\n\n #normalizePath = (p: string): string => {\n return p.endsWith('/') ? p : p + '/';\n };\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\n@Pipe({\n name: 'highLightSearch',\n})\nexport class HighlightSearchPipe implements PipeTransform {\n transform(\n value: string,\n keyword: string,\n args?: {\n color?: string;\n }\n ): string {\n const { color = '#ffff00' } = args ?? {};\n keyword = this.#normalizeValue(keyword);\n if (!keyword || keyword.length < 2) {\n return value;\n }\n value = value?.trim() || '';\n const regex = new RegExp(StringUtilities.changeAliasLowerCase(keyword), 'gi'); //'gi' for case insensitive and can use 'g' if you want the search to be case sensitive.\n const aliasLowerCaseStr = StringUtilities.changeAliasLowerCase(value);\n const strs: string[] = [];\n let previousOffset = 0;\n aliasLowerCaseStr.replace(regex, (_, offset) => {\n strs.push(value.substring(previousOffset, offset));\n strs.push(`<mark style=\"background-color: ${color}\">${value.substring(offset, offset + keyword.length)}</mark>`);\n previousOffset = offset + keyword.length;\n return `<mark style=\"background-color: ${color}\">${value.substring(offset, offset + keyword.length)}</mark>`;\n });\n strs.push(value.substring(previousOffset, value.length));\n return strs.join('');\n }\n\n #normalizeValue = (keyword: string) => {\n let str: string = keyword?.toString() ?? '';\n /* eslint-disable no-useless-escape */\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\n str = str.replace(/ + /g, ' ');\n str = str.trim();\n return str;\n };\n}\n","import { Component, inject, input, output } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n// Import sd-core\nimport { SdAvatar } from '@sdcorejs/angular/components';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../../../../configurations';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrls: ['./user.component.scss'],\n imports: [MatMenuModule, MatButtonModule, MatIconModule, MatTooltipModule, SdAvatar, TranslatePipe],\n standalone: true,\n})\nexport class LayoutUserComponent {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\n\n // ==========================================\n // SIGNAL INPUTS & OUTPUTS\n // ==========================================\n isMobileOrTablet = input<boolean>(false);\n isMenuLock = input<boolean>(false);\n isShowSidebar = input<boolean>(false);\n userInfo = input.required<SdLayoutUserInfo>();\n\n // Chuyển thành void vì các hàm emit hiện tại không truyền data\n menuClosed = output<void>();\n menuOpened = output<void>();\n toggleMenuLock = output<Event>();\n\n // Config actions\n singoutLayoutConfig = this.#layoutConfiguration.signout;\n changePasswordLayoutConfig = this.#layoutConfiguration?.changePassword;\n\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n onMenuOpened = (): void => {\n this.menuOpened.emit();\n };\n\n onMenuClosed = (): void => {\n this.menuClosed.emit();\n };\n\n keepOpenWhenClickInsideMenu = (event: Event): void => {\n event.stopPropagation();\n };\n\n logout = (): void => {\n this.singoutLayoutConfig();\n };\n\n changePassword = (): void => {\n // Dùng Optional Chaining gọi hàm cực gọn\n this.changePasswordLayoutConfig?.(); \n };\n\n onToggleMenuLock = (event: Event): void => {\n this.toggleMenuLock.emit(event);\n };\n}\n\n","@let _userInfo = userInfo();\n@let avatar = _userInfo?.avatar || _userInfo?.fullName || _userInfo?.username || _userInfo?.email;\n\n<div class=\"c-layout-user-wrapper\">\n <div class=\"c-layout-user-avatar\" [matMenuTriggerFor]=\"userMenu\" (menuClosed)=\"onMenuClosed()\" (menuOpened)=\"onMenuOpened()\">\n <sd-avatar [src]=\"avatar\" [size]=\"32\"></sd-avatar>\n </div>\n\n @if (!isMobileOrTablet()) {\n <div aria-hidden=\"true\" mat-mini-fab class=\"c-layout-icon-toggle\" (click)=\"onToggleMenuLock($event)\">\n <mat-icon style=\"color: #8c8c8c\">\n {{ isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left' }}\n </mat-icon>\n </div>\n }\n</div>\n\n<mat-menu #userMenu=\"matMenu\" xPosition=\"before\" backdropClass=\"c-user-menu-backdrop-f90ce131-fa4c-4f71-a49b-ab7fa374fdd0\">\n <div aria-hidden=\"true\" class=\"c-user-menu-wrapper\" (click)=\"keepOpenWhenClickInsideMenu($event)\">\n <div class=\"c-user-info-wrapper\">\n <div class=\"c-user-avatar\">\n <sd-avatar [src]=\"avatar\" [size]=\"40\"></sd-avatar>\n </div>\n <span class=\"c-user-name\">{{ _userInfo.fullName || _userInfo.username }}</span>\n <span class=\"c-user-email\">{{ _userInfo.email }}</span>\n </div>\n\n @if (changePasswordLayoutConfig) {\n <div class=\"c-sign-button-wrapper\">\n <button class=\"c-account-options\" (click)=\"changePassword()\">\n <mat-icon fontSet=\"material-icons-outlined\">lock</mat-icon>\n <span>{{ 'core.module.layout.user.change-password' | translate }}</span>\n </button>\n </div>\n }\n\n <div class=\"c-sign-button-wrapper\">\n <button class=\"c-sign-button\" mat-flat-button (click)=\"logout()\">{{ 'core.module.layout.user.logout' | translate }}</button>\n </div>\n </div>\n</mat-menu>","import { NestedTreeControl } from '@angular/cdk/tree';\nimport { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\n\nimport { SdInput, SdSuffixDefDirective } from '@sdcorejs/angular/forms';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdSafeHtmlPipe } from '@sdcorejs/angular/pipes';\nimport { BrowserUtilities, StringUtilities } from '@sdcorejs/utils/fns';\n\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { HighlightSearchPipe, MenuFocusPipe } from '../../../../pipes';\nimport { SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\n\n@Component({\n selector: 'sidebar',\n standalone: true,\n imports: [\n SdInput,\n FormsModule,\n CommonModule,\n RouterModule,\n MatIconModule,\n MatTreeModule,\n SdSafeHtmlPipe,\n MatInputModule,\n MenuFocusPipe,\n MatTooltipModule,\n HighlightSearchPipe,\n SdSuffixDefDirective,\n LayoutUserComponent,\n TranslatePipe,\n ],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n})\nexport class SidebarComponent {\n // ==========================================\n // INJECT SERVICES (Thay thế Constructor rườm rà)\n // ==========================================\n #router = inject(Router);\n #layoutStorageService = inject(SdLayoutStorageService);\n #menuFocusPipe = inject(MenuFocusPipe);\n #destroyRef = inject(DestroyRef); // Dùng để unsubscribe RxJS tự động\n\n // ==========================================\n // SIGNAL INPUTS & OUTPUTS\n // ==========================================\n isShowSidebar = input.required<boolean>();\n menus = input.required<SdLayoutMenu[]>();\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n expandSideBar = output<void>();\n popupUserMenuClosed = output<void>();\n popupUserMenuOpened = output<void>();\n showSideBar = output<boolean | null>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n screenHeight = window.innerHeight;\n isMobileOrTablet = BrowserUtilities.isMobile();\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n currentPath = signal<string>(window.location.pathname);\n searchText = signal<string>('');\n titleMenuGroup = signal<string | undefined>('');\n idMenuGroupActive = signal<string | undefined>('');\n menusByGroup = signal<SdLayoutMenu[]>([]);\n #hoveredMenuNodeKey = signal<string | null>(null);\n #pinIconHoverTimerId = signal<ReturnType<typeof setTimeout> | null>(null);\n pinnedMenuGroup = signal<SdLayoutChildrenMenu>(\n this.#layoutStorageService.pinnedMenuGroup.get() ?? {\n id: 'pinned-menu-group',\n title: 'Đã ghim',\n children: [],\n }\n );\n\n // ==========================================\n // COMPUTED STATE\n // ==========================================\n totalMenuInMenusByGroup = computed(() => this.#getTotalMenus(this.menusByGroup()));\n pinnedNodeKeys = computed(() => new Set(this.pinnedMenuGroup().children?.map(m => this.#getMenuNodeKey(m)) ?? []));\n isPinnedMenuGroupActive = computed(() => this.idMenuGroupActive() === this.pinnedMenuGroup().id);\n\n // ==========================================\n // DATA STRUCTURES\n // ==========================================\n #pinIconHoverTimerDelay: number = 300;\n #isFirstBindingMenu = signal<boolean>(true);\n dataSource = new MatTreeNestedDataSource<SdLayoutMenu>();\n treeControl = new NestedTreeControl<SdLayoutMenu>(node => ('children' in node && node.children?.length ? node.children : []));\n\n constructor() {\n this.#setupEffects();\n this.#setupSubscriptions();\n }\n\n #setupEffects(): void {\n effect(() => {\n const currentMenus = this.menus();\n untracked(() => {\n const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\n const pinnedGroup = this.pinnedMenuGroup();\n const isPinEnabled = this.sidebar()?.pin?.enabled;\n // Xử lý khi lần đầu vào web (nếu chưa có active group)\n if (!lastActiveMenuGroupId || (lastActiveMenuGroupId === pinnedGroup?.id && !isPinEnabled)) {\n // Ưu tiên pinnedGroup nếu đủ điều kiện, còn không lấy menu đầu tiền dev khai báo\n const targetId = isPinEnabled && pinnedGroup?.children?.length ? pinnedGroup?.id : currentMenus?.[0]?.id;\n this.#layoutStorageService.lastActiveMenuGroupId.set(targetId ?? '');\n }\n\n this.#bindingMenuGroupByCurrentPath(currentMenus);\n this.#isFirstBindingMenu.set(false);\n });\n });\n }\n\n #setupSubscriptions(): void {\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) {\n if (this.currentPath() !== window.location.pathname) {\n this.currentPath.set(window.location.pathname);\n this.#bindingMenuGroupByCurrentPath(this.menus());\n }\n }\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n hasChild = (_: number, node: SdLayoutMenu): boolean => 'children' in node && !!node.children?.length;\n\n onToggleMenuNode = (menu: SdLayoutMenu): void => {\n this.treeControl.toggle(menu);\n };\n\n isPinnedNode = (node: SdLayoutMenu): boolean => this.pinnedNodeKeys().has(this.#getMenuNodeKey(node));\n isHoveredNode = (node: SdLayoutMenu): boolean => this.#hoveredMenuNodeKey() === this.#getMenuNodeKey(node);\n\n expandPinnedGroup = (): void => {\n const group = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(group.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(group.id || '');\n this.titleMenuGroup.set(group.title);\n this.#setMenusByGroup(group.children ?? []);\n this.searchText.set('');\n this.expandSideBar.emit();\n };\n\n onTogglePin = (event: MouseEvent, node: SdLayoutMenu): void => {\n event.stopPropagation();\n const key = this.#getMenuNodeKey(node);\n this.pinnedMenuGroup.update(group => {\n const children = group.children ?? [];\n const exists = children.some(m => this.#getMenuNodeKey(m) === key);\n const updatedChildren = exists ? children.filter(m => this.#getMenuNodeKey(m) !== key) : [...children, node];\n const updatedGroup = { id: 'pinned-menu-group', title: 'Đã ghim', children: updatedChildren };\n this.#layoutStorageService.pinnedMenuGroup.set(updatedGroup);\n return updatedGroup;\n });\n };\n\n #onExpandAllMenuNodes = (menus: SdLayoutMenu[]): void => {\n menus?.forEach(menu => {\n this.treeControl.expand(menu);\n if ('children' in menu && menu.children?.length) {\n this.#onExpandAllMenuNodes(menu.children);\n }\n });\n };\n\n #onCollapseAllMenuNodes = (menus: SdLayoutMenu[]): void => {\n menus?.forEach(menu => {\n this.treeControl.collapse(menu);\n if ('children' in menu && menu.children?.length) {\n this.#onCollapseAllMenuNodes(menu.children);\n }\n });\n };\n\n toggleMenuLock(event: Event): void {\n event.stopPropagation();\n this.isMenuLock.update(v => !v);\n this.#layoutStorageService.menuLockStatus?.set(this.isMenuLock());\n this.showSideBar.emit(this.isMenuLock());\n }\n\n openHomePage = (): void => {\n if (!this.isMobileOrTablet) {\n this.#router.navigateByUrl('/layout/home');\n } else {\n window.location.href = '/layout/home';\n }\n this.searchText.set('');\n this.#layoutStorageService.lastActiveMenuGroupId.set('');\n };\n\n onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\n\n onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\n\n navigate = (args: { path: string; queryParams: Params }): void => {\n const { path, queryParams } = args;\n if (path.includes('http')) {\n window.open(path);\n return;\n }\n this.#router.navigate([path.split('?')[0]], {\n queryParams,\n state: { switchTab: true },\n });\n\n if (this.isMobileOrTablet) {\n this.#closeMenu();\n }\n };\n\n onFilterSearchText = (event: string): void => {\n this.searchText.set(event);\n this.#filterMenuBySearchText(this.menusByGroup());\n };\n\n onClearSearchText = (): void => {\n this.searchText.set('');\n this.#filterMenuBySearchText(this.menusByGroup());\n };\n\n expandMenuGroup = (menuGroupNode: SdLayoutMenu): void => {\n this.titleMenuGroup.set(menuGroupNode?.tooltipTitle || menuGroupNode?.title);\n\n // Case 1: Menu không có children\n if (!('children' in menuGroupNode && menuGroupNode.children?.length)) {\n if ('path' in menuGroupNode) {\n this.navigate({ path: menuGroupNode.path, queryParams: menuGroupNode?.queryParams ?? {} });\n return;\n }\n }\n\n // Case 2: Menu có children\n if ('children' in menuGroupNode && menuGroupNode.children?.length) {\n this.#setMenusByGroup(menuGroupNode.children);\n this.searchText.set('');\n this.onFilterSearchText('');\n this.expandSideBar.emit();\n }\n\n this.idMenuGroupActive.set(menuGroupNode?.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(menuGroupNode?.id || '');\n if (!this.currentPath()) {\n this.currentPath.set(window.location.pathname);\n }\n };\n\n // ==========================================\n // CỤM HOVER MENU GROUP & NODE\n // ==========================================\n onMouseOverMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\n if (this.idMenuGroupActive() !== menuNode?.id) {\n const menuGroup = event.currentTarget as HTMLElement;\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\n\n if (menuGroupIcon) {\n menuGroupIcon.style.transition = 'all 0.15s';\n menuGroupIcon.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\n if (!(menuGroupIcon instanceof HTMLImageElement)) {\n menuGroupIcon.style.color = this.sidebar()?.brandColor || '#2962FF';\n }\n }\n }\n };\n\n onMouseLeaveMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\n if (this.idMenuGroupActive() !== menuNode?.id) {\n const menuGroup = event.currentTarget as HTMLElement;\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\n\n if (menuGroupIcon) {\n menuGroupIcon.style.transition = 'all 0.15s';\n menuGroupIcon.style.backgroundColor = 'transparent';\n if (menuGroupIcon instanceof HTMLImageElement) {\n menuGroupIcon.style.opacity = '0.55';\n } else {\n menuGroupIcon.style.color = '#8C8C8C';\n }\n }\n }\n };\n\n onMouseOverMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\n const menuNode = event.currentTarget as HTMLElement;\n const brandColor = this.sidebar()?.brandColor || '#2962FF';\n\n // Nếu có bật config pin menu\n if (this.sidebar()?.pin?.enabled) {\n const iconPin = menuNode.querySelector('.c-menu-node-description-icon-pin') as HTMLElement;\n if (iconPin) {\n if (this.#pinIconHoverTimerId()) {\n clearTimeout(this.#pinIconHoverTimerId()!);\n this.#pinIconHoverTimerId.set(null);\n }\n\n this.#pinIconHoverTimerId.set(\n setTimeout(() => {\n this.#hoveredMenuNodeKey.set(this.#getMenuNodeKey(menuItem));\n iconPin.style.color = brandColor;\n iconPin.style.transition = 'all 0.15s';\n iconPin.style.opacity = '1';\n this.#pinIconHoverTimerId.set(null);\n }, this.#pinIconHoverTimerDelay)\n );\n }\n }\n\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\n\n if (menuNode) {\n menuNode.style.transition = 'all 0.15s';\n menuNode.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\n\n if (iconMenu) {\n iconMenu.style.transition = 'all 0.15s';\n iconMenu.style.color = brandColor;\n }\n if (content) {\n content.style.transition = 'all 0.15s';\n content.style.color = brandColor;\n }\n if (iconExpand) {\n iconExpand.style.transition = 'all 0.15s';\n iconExpand.style.color = brandColor;\n }\n }\n }\n };\n\n onMouseLeaveMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\n const menuNode = event.currentTarget as HTMLElement;\n\n // Nếu có bật config pin menu\n if (this.sidebar()?.pin?.enabled) {\n const iconPin = menuNode.querySelector('.c-menu-node-description-icon-pin') as HTMLElement;\n if (iconPin) {\n if (this.#pinIconHoverTimerId()) {\n clearTimeout(this.#pinIconHoverTimerId()!);\n this.#pinIconHoverTimerId.set(null);\n }\n this.#hoveredMenuNodeKey.set(null);\n\n iconPin.style.transition = 'all 0.15s';\n if (!this.isPinnedNode(menuItem)) {\n iconPin.style.color = '#8C8C8C';\n iconPin.style.opacity = '0';\n }\n }\n }\n\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\n\n if (menuNode) {\n menuNode.style.transition = 'all 0.15s';\n menuNode.style.backgroundColor = 'transparent';\n\n if (iconMenu) {\n iconMenu.style.transition = 'all 0.15s';\n iconMenu.style.color = '#8C8C8C';\n }\n if (content) {\n content.style.transition = 'all 0.15s';\n content.style.color = '#1F1F1F';\n }\n if (iconExpand) {\n iconExpand.style.transition = 'all 0.15s';\n iconExpand.style.color = '#8C8C8C';\n }\n }\n }\n };\n\n // ==========================================\n // PRIVATE LOGIC\n // ==========================================\n #setMenusByGroup = (menus: SdLayoutMenu[]): void => {\n this.menusByGroup.set(menus);\n this.dataSource.data = menus;\n };\n\n #getMenuNodeKey = (node: SdLayoutMenu): string => {\n if (node?.id) {\n return node.id;\n }\n if ('path' in node && node.path) {\n return node.path;\n }\n\n return node.title || '';\n };\n\n #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[], menuGroup?: SdLayoutMenu): SdLayoutMenu[] => {\n for (const menu of menus) {\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n return [menuGroup ?? menu];\n }\n if ('children' in menu && menu.children?.length) {\n const result = this.#getMenuGroupByCurrentPath(menu.children, menuGroup ?? menu);\n if (result?.length) {\n return result;\n }\n }\n }\n return [];\n };\n\n #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\n // Chỉ bindingGroup mới khi người dùng không searchText\n if (!this.#getValidSearchText()) {\n const pinnedChildren = this.pinnedMenuGroup()?.children ?? [];\n\n // Ưu tiên: Current path khớp với item trong pinMenuGroup thì lần đầu vào trang sẽ hiện pinnedMenuGroup\n const isPinnedPathMatchValid =\n this.sidebar()?.pin?.enabled &&\n pinnedChildren?.length &&\n this.#getMenuGroupByCurrentPath(pinnedChildren)?.length &&\n this.#isFirstBindingMenu() &&\n this.idMenuGroupActive() !== this.pinnedMenuGroup()?.id;\n\n if (isPinnedPathMatchValid) {\n const pinned = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(pinned.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(pinned.id ?? '');\n this.titleMenuGroup.set(pinned.title);\n this.#setMenusByGroup(pinnedChildren);\n this.#expandParentNodesByCurrentPath(pinnedChildren);\n return;\n }\n\n let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\n // Nếu không tìm được path nào khớp với menu\n if (!menuGroupByPath?.length) {\n const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\n // Nếu có pinned group thì hiện mậc định là pinnedMenuGroup\n if (this.sidebar()?.pin?.enabled && lastActiveId === this.pinnedMenuGroup()?.id && pinnedChildren?.length) {\n const pinned = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(pinned.id);\n this.titleMenuGroup.set(pinned.title);\n this.#setMenusByGroup(pinnedChildren);\n this.#expandParentNodesByCurrentPath(pinnedChildren);\n return;\n }\n // Nếu không có pinnedMenuGroup thì menuGroup lấy từ thao tác cuối cùng của người dùng\n menuGroupByPath = this.menus()?.filter(menu => menu?.id === lastActiveId) || [];\n }\n\n // Kiểm tra lại menuGroupPath đã thực sự tìm được chưa?\n if (menuGroupByPath?.length) {\n // Nếu user đang ở pinedGroup và curentPath có chứa trong pinnedMenuGroup thì return luôn, không chuyển sang menuGroup mới\n if (\n this.sidebar()?.pin?.enabled &&\n this.idMenuGroupActive() === this.pinnedMenuGroup()?.id &&\n this.#getMenuGroupByCurrentPath(pinnedChildren)?.length\n ) {\n return;\n } else {\n const matchedGroup = menuGroupByPath[0];\n this.idMenuGroupActive.set(matchedGroup?.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\n this.titleMenuGroup.set(matchedGroup?.tooltipTitle || matchedGroup?.title);\n\n if ('children' in matchedGroup && matchedGroup.children?.length) {\n this.menusByGroup.set(matchedGroup.children);\n this.#expandParentNodesByCurrentPath(this.menusByGroup());\n } else {\n this.menusByGroup.set([]);\n }\n }\n } else {\n this.idMenuGroupActive.set('');\n this.titleMenuGroup.set('');\n this.menusByGroup.set([]);\n }\n\n this.dataSource.data = this.menusByGroup();\n }\n };\n\n #expandParentNodesByCurrentPath(menus: SdLayoutMenu[]): boolean {\n let shouldPropagate = false;\n for (const menu of menus) {\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n shouldPropagate = true;\n }\n if ('children' in menu && menu.children?.length) {\n const childHasMatch = this.#expandParentNodesByCurrentPath(menu.children);\n if (childHasMatch) {\n this.treeControl.expand(menu);\n shouldPropagate = true;\n }\n }\n }\n return shouldPropagate;\n }\n\n #filterMenuBySearchText = (menus: SdLayoutMenu[]): void => {\n const validSearchText = this.#getValidSearchText();\n if (!validSearchText) {\n this.dataSource.data = menus;\n this.#onCollapseAllMenuNodes(menus);\n this.#expandParentNodesByCurrentPath(menus);\n } else {\n const aliasSearchText = StringUtilities.changeAliasLowerCase(validSearchText);\n this.dataSource.data = this.#getMenuByAliasSearchText(menus, aliasSearchText);\n if (this.dataSource.data?.length) {\n this.#onExpandAllMenuNodes(this.dataSource.data);\n }\n }\n };\n\n #getMenuByAliasSearchText = (menus: SdLayoutMenu[], aliasSearchText: string): SdLayoutMenu[] => {\n const result: SdLayoutMenu[] = [];\n for (const menu of menus) {\n const aliasTitle = StringUtilities.changeAliasLowerCase(menu.title as string);\n\n if (aliasTitle.includes(aliasSearchText)) {\n result.push(menu);\n continue;\n }\n\n let matchedChildren: SdLayoutMenu[] = [];\n if ('children' in menu && menu.children?.length) {\n matchedChildren = this.#getMenuByAliasSearchText(menu.children, aliasSearchText);\n }\n\n if (matchedChildren?.length) {\n result.push({ ...menu, children: matchedChildren });\n }\n }\n return result;\n };\n\n #isMenuPathMatchByCurrentPath = (path: string): boolean => {\n if (!path) {\n return false;\n }\n\n if (this.currentPath() === path) {\n return true;\n }\n\n return this.#normalizePath(this.currentPath()).startsWith(this.#normalizePath(path));\n };\n\n #normalizePath = (p: string): string => (p.endsWith('/') ? p : p + '/');\n\n #closeMenu(): void {\n this.showSideBar.emit(null);\n }\n\n #convertColor = (input: string | undefined, opacity = 1): string => {\n if (!input) {\n return '';\n }\n\n input = input.trim();\n const hexRegex = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n const rgbRegex = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/i;\n\n if (hexRegex.test(input)) {\n let hex = input.slice(1);\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map(c => c + c)\n .join('');\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n\n const rgbMatch = input.match(rgbRegex);\n if (rgbMatch) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, r, g, b] = rgbMatch;\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n\n return input;\n };\n\n #getValidSearchText = (): string => {\n const normalized = this.#normalizeSearchText(this.searchText());\n return normalized && normalized.length >= 2 ? normalized : '';\n };\n\n #normalizeSearchText = (searchText: string) => {\n let str: string = searchText?.toString() ?? '';\n /* eslint-disable no-useless-escape */\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\n str = str.replace(/ + /g, ' ');\n return str.trim();\n };\n\n #getTotalMenus = (menus: SdLayoutMenu[]): number => {\n return menus.reduce((total, menu) => total + this.#countMenuChildrenNode(menu), 0);\n };\n\n #countMenuChildrenNode = (menu: SdLayoutMenu): number => {\n if (!('children' in menu) || !menu.children?.length) {\n return 0;\n }\n\n let count = menu.children.length;\n for (const child of menu.children) {\n count += this.#countMenuChildrenNode(child);\n }\n return count;\n };\n}\n","@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar) {\n <div class=\"wrapper\" [style.height]=\"isMobileOrTablet ? screenHeight + 'px' : '100%'\">\n <div class=\"c-header\">\n @if (_sidebar.logoUrl) {\n <div class=\"c-logo\">\n <a href=\"javascript:;\" (click)=\"openHomePage()\">\n <img alt=\"logo\" [src]=\"_sidebar.logoUrl\" />\n </a>\n </div>\n }\n <div class=\"c-title-menu-group\">\n <span>{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\n </div>\n </div>\n <div class=\"c-body\">\n <div class=\"c-menu\">\n <div class=\"c-menu-group\">\n @if (_sidebar?.pin?.enabled && pinnedMenuGroup().children?.length) {\n <button\n (mouseenter)=\"onMouseOverMenuGroupNode($event, pinnedMenuGroup())\"\n (mouseleave)=\"onMouseLeaveMenuGroupNode($event, pinnedMenuGroup())\"\n (click)=\"expandPinnedGroup()\"\n [matTooltip]=\"'Đã ghim'\"\n [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\n [matTooltipPosition]=\"'right'\"\n style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\n <mat-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color: isPinnedMenuGroupActive() ? _sidebar.brandColor || '#2962FF' : '#8C8C8C',\n backgroundColor: isPinnedMenuGroupActive() ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\n }\">\n push_pin\n </mat-icon>\n </button>\n }\n @for (nodeMenuGroup of menus(); track nodeMenuGroup.id) {\n <button\n (mouseenter)=\"onMouseOverMenuGroupNode($event, nodeMenuGroup)\"\n (mouseleave)=\"onMouseLeaveMenuGroupNode($event, nodeMenuGroup)\"\n (click)=\"expandMenuGroup(nodeMenuGroup)\"\n [matTooltip]=\"nodeMenuGroup.tooltipTitle || nodeMenuGroup.title\"\n [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\n [matTooltipPosition]=\"'right'\"\n style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\n @if (nodeMenuGroup.iconUrl) {\n <span\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n backgroundColor: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\n }\">\n <img width=\"24px\" height=\"24px\" [src]=\"nodeMenuGroup.iconUrl\" [alt]=\"nodeMenuGroup.title\" />\n </span>\n } @else {\n <mat-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandColor || '#2962FF' : '#8C8C8C',\n backgroundColor: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\n }\">\n {{ nodeMenuGroup.icon || 'widgets' }}\n </mat-icon>\n }\n </button>\n }\n </div>\n <div class=\"c-menu-tree\">\n @if (totalMenuInMenusByGroup() >= 10) {\n <div style=\"padding: 0px 4px\" class=\"c-menu-tree-search\">\n <sd-input size=\"sm\" [placeholder]=\"'core.module.layout.sidebar.search' | translate\" [model]=\"searchText()\" (sdChange)=\"onFilterSearchText($event)\">\n <ng-template sdSuffixDef>\n @if (searchText()) {\n <mat-icon class=\"c-search-prefix-icon cancel\" (click)=\"onClearSearchText()\">cancel</mat-icon>\n } @else {\n <mat-icon class=\"c-search-prefix-icon search\">search</mat-icon>\n }\n </ng-template>\n </sd-input>\n </div>\n }\n <div class=\"c-menu-tree-container\">\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" [style.backgroundColor]=\"'transparent'\">\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: !hasChild\">\n <li\n class=\"c-menu-node\"\n (mouseenter)=\"onMouseOverMenuNode($event, node)\"\n (mouseleave)=\"onMouseLeaveMenuNode($event, node)\"\n [ngStyle]=\"{\n backgroundColor: (currentPath() | menuFocus: node) ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\n }\">\n <div aria-hidden=\"true\" class=\"c-menu-node-description\" (click)=\"navigate(node)\" [class.d-none]=\"!isShowSidebar()\">\n <div\n class=\"c-menu-node-description-content\"\n [ngStyle]=\"{\n color: (currentPath() | menuFocus: node) ? _sidebar.brandColor || '#2962FF' : '#1F1F1F',\n }\"\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\n\n @if (_sidebar?.pin?.enabled) {\n <mat-icon\n class=\"c-menu-node-description-icon-pin\"\n [fontSet]=\"isPinnedNode(node) ? 'material-icons' : 'material-icons-outlined'\"\n [style.opacity]=\"isPinnedNode(node) || isHoveredNode(node) ? '1' : null\"\n [style.color]=\"isPinnedNode(node) || isHoveredNode(node) ? sidebar().brandColor || '#2962FF' : null\"\n (click)=\"onTogglePin($event, node)\"\n >push_pin\n </mat-icon>\n }\n </div>\n </li>\n </mat-nested-tree-node>\n\n <mat-nested-tree-node\n *matTreeNodeDef=\"let node; when: hasChild\"\n aria-hidden=\"true\"\n [class]=\"{ expanded: treeControl.isExpanded(node), isfocus: currentPath() | menuFocus: node }\">\n <li>\n <div\n class=\"c-menu-node\"\n (mouseenter)=\"onMouseOverMenuNode($event, node)\"\n (mouseleave)=\"onMouseLeaveMenuNode($event, node)\">\n <div class=\"d-flex align-items-center\" style=\"gap: 10px; width: 100%\">\n <div [class.d-none]=\"!isShowSidebar()\" class=\"c-menu-node-description\" (click)=\"onToggleMenuNode(node)\">\n <div\n class=\"c-menu-node-description-content\"\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\n <mat-icon class=\"c-menu-node-description-icon-expand\">\n {{ treeControl.isExpanded(node) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\n </mat-icon>\n </div>\n </div>\n </div>\n <ul class=\"p-0\" [class.d-none]=\"!treeControl.isExpanded(node)\">\n <ng-container matTreeNodeOutlet></ng-container>\n </ul>\n </li>\n </mat-nested-tree-node>\n </mat-tree>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"c-footer\">\n <lib-layout-user\n [userInfo]=\"_userInfo\"\n [isMobileOrTablet]=\"isMobileOrTablet\"\n (menuOpened)=\"onUserMenuOpened()\"\n (menuClosed)=\"onUserMenuClosed()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (toggleMenuLock)=\"toggleMenuLock($event)\">\n </lib-layout-user>\n </div>\n\n <div class=\"c-vertical\"></div>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\n\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\n\n@Component({\n selector: 'sidebar-v1',\n templateUrl: './main.component.html',\n styleUrls: ['./main.component.scss'],\n imports: [MatSidenavModule, CommonModule, SidebarComponent],\n standalone: true,\n})\nexport class SidebarV1Component {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #layoutStorageService = inject(SdLayoutStorageService);\n\n // ==========================================\n // VIEW CHILD & INPUTS\n // ==========================================\n sidenav = viewChild.required<MatSidenav>('sidenav');\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n isMobileOrTablet = signal<boolean>(BrowserUtilities.isMobile());\n\n // Trạng thái khóa menu (luôn mở rộng hay không)\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n\n // Trạng thái hiển thị (mở/đóng) của Sidenav\n isShowSidebar = signal<boolean>(BrowserUtilities.isMobile() ? false : (this.#layoutStorageService.menuLockStatus?.get() ?? true));\n\n onhover = signal<boolean>(false);\n\n // ==========================================\n // PRIVATE TIMERS\n // ==========================================\n #timerMouseInMenu: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n // EFFECT: Tự động đồng bộ isShowSidebar vào storage service mỗi khi nó thay đổi\n effect(() => {\n const isShow = this.isShowSidebar();\n untracked(() => {\n this.#layoutStorageService.isShowSidebar.set(isShow);\n });\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n\n #mouseLeave = (): void => {\n if (this.#timerMouseInMenu) {\n clearTimeout(this.#timerMouseInMenu);\n }\n\n if (this.onhover() && this.isShowSidebar()) {\n this.isShowSidebar.set(false);\n this.onhover.set(false);\n }\n };\n\n #handleMouseLeaveTransition = (): void => {\n if (!this.isShowSidebar()) {\n const delayTime = 400;\n if (this.#timerMouseInMenu) {\n clearTimeout(this.#timerMouseInMenu);\n }\n setTimeout(() => {\n this.#mouseLeave();\n }, delayTime);\n } else {\n this.#mouseLeave();\n }\n };\n\n openSidebar = (): void => {\n if (!this.isMobileOrTablet()) {\n return;\n }\n\n if (!this.isShowSidebar()) {\n this.isShowSidebar.set(true);\n this.onhover.set(true);\n }\n };\n\n onPopupOfSideBarOpened = (): void => {\n this.onhover.set(false);\n this.isShowSidebar.set(true);\n };\n\n onPopupOfSideBarClosed = (): void => {\n const delayTime = 500;\n if (!this.isMenuLock()) {\n this.onhover.set(true);\n setTimeout(() => {\n this.#mouseLeave();\n }, delayTime);\n }\n };\n\n onExpandSideBar = (): void => {\n if (this.isMobileOrTablet()) {\n return;\n }\n if (!this.isShowSidebar()) {\n this.isShowSidebar.set(true);\n this.onhover.set(true);\n }\n };\n\n onMouseleaveSideBar = (): void => {\n if (this.isMobileOrTablet()) {\n return;\n }\n this.#mouseLeave();\n };\n\n onToggle = (data: boolean | null) => {\n if (data === null) {\n this.#handleMouseLeaveTransition();\n } else {\n this.#mouseLeave();\n this.isShowSidebar.set(data);\n this.isMenuLock.set(data);\n\n // Toggle component MatSidenav\n const sidenavComp = this.sidenav();\n if (sidenavComp) {\n data ? sidenavComp.open() : sidenavComp.close();\n }\n }\n };\n}\n","<mat-sidenav-container class=\"c-layout-wrapper\">\n <mat-sidenav\n #sidenav\n [opened]=\"isShowSidebar()\"\n (openedChange)=\"isShowSidebar.set($event)\"\n class=\"c-layout-sidebar\"\n (click)=\"openSidebar()\"\n (mouseleave)=\"onMouseleaveSideBar()\"\n [mode]=\"isMobileOrTablet() ? 'over' : 'side'\"\n [fixedInViewport]=\"isMobileOrTablet()\">\n <sidebar\n [menus]=\"menus()\"\n [userInfo]=\"userInfo()\"\n [sidebar]=\"sidebar()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (showSideBar)=\"onToggle($event)\"\n (expandSideBar)=\"onExpandSideBar()\"\n (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\n (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\">\n </sidebar>\n </mat-sidenav>\n\n <mat-sidenav-content class=\"c-layout-content\" [class.isShowSidebar]=\"isMenuLock()\">\n <mat-drawer-container class=\"c-mat-drawer-container\">\n <mat-drawer-content>\n <ng-content></ng-content>\n </mat-drawer-content>\n </mat-drawer-container>\n </mat-sidenav-content>\n</mat-sidenav-container>","import { Component, inject, input, output, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n// Import sd-core\nimport { SdAvatar } from '@sdcorejs/angular/components';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../../../../configurations';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrls: ['./user.component.scss'],\n imports: [MatMenuModule, MatButtonModule, MatIconModule, MatTooltipModule, SdAvatar, TranslatePipe],\n standalone: true,\n})\nexport class LayoutUserComponent {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\n\n // ==========================================\n // SIGNAL INPUTS & OUTPUTS\n // ==========================================\n isMobileOrTablet = input<boolean>(false);\n isMenuLock = input<boolean>(false);\n isShowSidebar = input<boolean>(false);\n userInfo = input.required<SdLayoutUserInfo>();\n\n menuClosed = output<void>();\n menuOpened = output<void>();\n toggleMenuLock = output<Event>();\n\n // Config actions\n singoutLayoutConfig = this.#layoutConfiguration.signout;\n changePasswordLayoutConfig = this.#layoutConfiguration?.changePassword;\n\n // Accordion state for mobile inline expand\n isExpanded = signal<boolean>(false);\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n onMenuOpened = (): void => {\n this.menuOpened.emit();\n };\n\n onMenuClosed = (): void => {\n this.menuClosed.emit();\n };\n\n keepOpenWhenClickInsideMenu = (event: Event): void => {\n event.stopPropagation();\n };\n\n toggleExpanded = (): void => {\n this.isExpanded.update(v => !v);\n if (this.isExpanded()) {\n this.menuOpened.emit();\n } else {\n this.menuClosed.emit();\n }\n };\n\n logout = (): void => {\n this.singoutLayoutConfig();\n };\n\n changePassword = (): void => {\n this.changePasswordLayoutConfig?.();\n };\n\n onToggleMenuLock = (event: Event): void => {\n this.toggleMenuLock.emit(event);\n };\n}\n\n","@let _userInfo = userInfo();\n@let avatar = _userInfo?.avatar || _userInfo?.fullName || _userInfo?.username || _userInfo?.email;\n\n@if (isMobileOrTablet()) {\n <!-- Mobile: accordion inline expand -->\n <div class=\"m-user-card\">\n <button class=\"m-user-row\" (click)=\"toggleExpanded()\">\n <sd-avatar [src]=\"avatar\" [size]=\"44\"></sd-avatar>\n <div class=\"m-user-info\">\n <span class=\"m-user-name\">{{ _userInfo?.fullName || _userInfo?.username }}</span>\n @if (_userInfo?.email) {\n <span class=\"m-user-email\">{{ _userInfo?.email }}</span>\n }\n </div>\n <mat-icon class=\"m-expand-icon\" [class.m-expand-icon--open]=\"isExpanded()\">\n keyboard_arrow_down\n </mat-icon>\n </button>\n\n @if (isExpanded()) {\n <div class=\"m-user-body\">\n @if (changePasswordLayoutConfig) {\n <button class=\"m-user-action\" (click)=\"changePassword()\">\n <mat-icon>lock_outline</mat-icon>\n <span>{{ 'core.module.layout.user.change-password' | translate }}</span>\n </button>\n }\n <button class=\"m-user-action m-user-action--logout\" (click)=\"logout()\">\n <mat-icon>logout</mat-icon>\n <span>{{ 'core.module.layout.user.logout' | translate }}</span>\n </button>\n </div>\n }\n </div>\n} @else {\n <!-- Desktop: chỉ hiển thị avatar + nút toggle -->\n <div class=\"c-layout-user-wrapper\">\n <div class=\"c-layout-user-avatar\" [matMenuTriggerFor]=\"userMenu\" (menuClosed)=\"onMenuClosed()\" (menuOpened)=\"onMenuOpened()\">\n <sd-avatar [src]=\"avatar\" [size]=\"32\"></sd-avatar>\n </div>\n\n <div aria-hidden=\"true\" mat-mini-fab class=\"c-layout-icon-toggle\" (click)=\"onToggleMenuLock($event)\">\n <mat-icon style=\"color: #8c8c8c\">\n {{ isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left' }}\n </mat-icon>\n </div>\n </div>\n}\n\n<mat-menu #userMenu=\"matMenu\" xPosition=\"before\" backdropClass=\"c-user-menu-backdrop-f90ce131-fa4c-4f71-a49b-ab7fa374fdd0\">\n <div aria-hidden=\"true\" class=\"c-user-menu-wrapper\" (click)=\"keepOpenWhenClickInsideMenu($event)\">\n <div class=\"c-user-info-wrapper\">\n <div class=\"c-user-avatar\">\n <sd-avatar [src]=\"avatar\" [size]=\"40\"></sd-avatar>\n </div>\n <span class=\"c-user-name\">{{ _userInfo?.fullName || _userInfo?.username }}</span>\n <span class=\"c-user-email\">{{ _userInfo?.email }}</span>\n </div>\n\n @if (changePasswordLayoutConfig) {\n <div class=\"c-sign-button-wrapper\">\n <button class=\"c-account-options\" (click)=\"changePassword()\">\n <mat-icon fontSet=\"material-icons-outlined\">lock</mat-icon>\n <span>{{ 'core.module.layout.user.change-password' | translate }}</span>\n </button>\n </div>\n }\n\n <div class=\"c-sign-button-wrapper\">\n <button class=\"c-sign-button\" mat-flat-button (click)=\"logout()\">{{ 'core.module.layout.user.logout' | translate }}</button>\n </div>\n </div>\n</mat-menu>\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\n\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\n\n@Component({\n selector: 'sd-sidebar-mobile-overlay',\n standalone: true,\n imports: [\n CommonModule,\n RouterModule,\n MatIconModule,\n LayoutUserComponent,\n ],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n})\nexport class SidebarMobileOverlayComponent {\n #router = inject(Router);\n #destroyRef = inject(DestroyRef);\n #layoutStorageService = inject(SdLayoutStorageService);\n\n // ==========================================\n // INPUTS & OUTPUTS\n // ==========================================\n isShowSidebar = input<boolean>(false);\n menus = input.required<SdLayoutMenu[]>();\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n\n // showSideBar(null) = đóng sidebar (tương thích với onToggle của main component)\n showSideBar = output<boolean | null>();\n expandSideBar = output<void>();\n popupUserMenuOpened = output<void>();\n popupUserMenuClosed = output<void>();\n titleMenuGroupChanged = output<string | undefined>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n titleMenuGroup = signal<string | undefined>('');\n currentPath = signal<string>(window.location.pathname);\n\n // Lưu danh sách ID các menu group đang được mở\n expandedMobileGroups = signal<Set<string>>(new Set<string>());\n\n constructor() {\n // Bind title khi menus thay đổi\n effect(() => {\n const currentMenus = this.menus();\n untracked(() => {\n const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\n if (!lastActiveMenuGroupId) {\n this.#layoutStorageService.lastActiveMenuGroupId.set(currentMenus?.[0]?.id ?? '');\n }\n this.#bindingMenuGroupByCurrentPath(currentMenus);\n });\n });\n\n // Bind title khi điều hướng\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) {\n if (this.currentPath() !== window.location.pathname) {\n this.currentPath.set(window.location.pathname);\n this.#bindingMenuGroupByCurrentPath(this.menus());\n }\n }\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n toggleMobileGroup(groupId: string | undefined): void {\n if (!groupId) return;\n this.expandedMobileGroups.update(groups => {\n const newGroups = new Set(groups);\n if (newGroups.has(groupId)) {\n newGroups.delete(groupId);\n } else {\n newGroups.add(groupId);\n }\n return newGroups;\n });\n }\n\n isExpanded(groupId: string | undefined): boolean {\n if (!groupId) return false;\n return this.expandedMobileGroups().has(groupId);\n }\n\n navigate(args: { path?: string; queryParams?: Params }): void {\n const { path, queryParams } = args;\n if (!path) return;\n\n if (path.includes('http')) {\n window.open(path);\n return;\n }\n\n this.#router.navigate([path.split('?')[0]], {\n queryParams: queryParams ?? {},\n state: { switchTab: true },\n });\n\n // Sau khi điều hướng trên mobile, tự động đóng sidebar\n this.onClose();\n }\n\n onClose(): void {\n this.showSideBar.emit(null);\n }\n\n // Kiểm tra menu có children (là SdLayoutChildrenMenu)\n hasChildren(menu: SdLayoutMenu): boolean {\n return 'children' in menu && !!menu.children?.length;\n }\n\n // Lấy danh sách children an toàn (type-safe)\n getChildren(menu: SdLayoutMenu): SdLayoutMenu[] {\n return 'children' in menu ? (menu.children ?? []) : [];\n }\n\n // Lấy path an toàn từ leaf menu (SdLayoutRootMenu)\n getPath(menu: SdLayoutMenu): string | undefined {\n return 'path' in menu ? menu.path : undefined;\n }\n\n // Lấy queryParams an toàn từ leaf menu\n getQueryParams(menu: SdLayoutMenu): Params {\n return ('queryParams' in menu ? menu.queryParams : undefined) ?? {};\n }\n\n onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\n onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\n\n // ==========================================\n // PRIVATE LOGIC\n // ==========================================\n #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\n let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\n\n if (!menuGroupByPath?.length) {\n const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\n menuGroupByPath = menus?.filter(menu => menu?.id === lastActiveId) || [];\n }\n\n if (menuGroupByPath?.length) {\n const matchedGroup = menuGroupByPath[0];\n this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\n const title = matchedGroup?.tooltipTitle || matchedGroup?.title;\n this.titleMenuGroup.set(title);\n this.titleMenuGroupChanged.emit(title);\n } else {\n this.titleMenuGroup.set('');\n this.titleMenuGroupChanged.emit('');\n }\n };\n\n #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[], menuGroup?: SdLayoutMenu): SdLayoutMenu[] => {\n for (const menu of menus) {\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n return [menuGroup ?? menu];\n }\n if ('children' in menu && menu.children?.length) {\n const result = this.#getMenuGroupByCurrentPath(menu.children, menuGroup ?? menu);\n if (result?.length) return result;\n }\n }\n return [];\n };\n\n #isMenuPathMatchByCurrentPath = (path: string): boolean => {\n if (!path) return false;\n if (this.currentPath() === path) return true;\n return this.#normalizePath(this.currentPath()).startsWith(this.#normalizePath(path));\n };\n\n #normalizePath = (p: string): string => p.endsWith('/') ? p : p + '/';\n}\n","@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar) {\n <div\n class=\"m-backdrop\"\n [class.m-backdrop--visible]=\"isShowSidebar()\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onClose()\"\n (keydown.escape)=\"onClose()\">\n </div>\n\n <div class=\"m-wrapper\" [class.m-wrapper--open]=\"isShowSidebar()\">\n <div class=\"m-header\">\n <div class=\"m-title-group\">\n @if (_sidebar.logoUrl) {\n <img class=\"m-logo\" alt=\"logo\" [src]=\"_sidebar.logoUrl\" />\n }\n <span class=\"m-title\">{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\n </div>\n <button class=\"m-close-btn\" (click)=\"onClose()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"m-user-section\">\n <lib-layout-user\n [userInfo]=\"_userInfo\"\n [isMobileOrTablet]=\"true\"\n (menuOpened)=\"onUserMenuOpened()\"\n (menuClosed)=\"onUserMenuClosed()\">\n </lib-layout-user>\n </div>\n\n <div class=\"m-menu-list\">\n @for (group of menus(); track group.id) {\n <div class=\"m-menu-card\">\n <button class=\"m-card-header\" (click)=\"toggleMobileGroup(group.id)\">\n <div class=\"m-card-header-left\">\n @if (group.iconUrl) {\n <img class=\"m-group-icon\" [src]=\"group.iconUrl\" [alt]=\"group.title\" />\n } @else {\n <mat-icon class=\"m-group-icon\">{{ group.icon || 'widgets' }}</mat-icon>\n }\n <span class=\"m-group-title\">{{ group.title }}</span>\n </div>\n <mat-icon class=\"m-expand-icon\">\n {{ expandedMobileGroups().has(group.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\n </mat-icon>\n </button>\n\n @if (expandedMobileGroups().has(group.id ?? '') && hasChildren(group)) {\n <div class=\"m-card-body\">\n @for (child of getChildren(group); track child.id) {\n @if (hasChildren(child)) {\n <div class=\"m-sub-group\">\n <button class=\"m-sub-group-header\" (click)=\"toggleMobileGroup(child.id)\">\n <div class=\"m-item-left\">\n @if (child.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"child.iconUrl\" alt=\"icon\" />\n } @else {\n <mat-icon class=\"m-item-icon\">{{ child.icon || 'folder' }}</mat-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <mat-icon class=\"m-expand-icon\">\n {{ expandedMobileGroups().has(child.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\n </mat-icon>\n </button>\n @if (expandedMobileGroups().has(child.id ?? '')) {\n @for (subChild of getChildren(child); track subChild.id) {\n <button class=\"m-menu-item m-menu-item--indented\"\n (click)=\"navigate({ path: getPath(subChild), queryParams: getQueryParams(subChild) })\">\n <div class=\"m-item-left\">\n @if (subChild.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"subChild.iconUrl\" alt=\"icon\" />\n } @else {\n <mat-icon class=\"m-item-icon\">{{ subChild.icon || 'insert_drive_file' }}</mat-icon>\n }\n <span class=\"m-item-title\">{{ subChild.title }}</span>\n </div>\n <mat-icon class=\"m-nav-icon\">chevron_right</mat-icon>\n </button>\n }\n }\n </div>\n } @else {\n <button class=\"m-menu-item\" (click)=\"navigate({ path: getPath(child), queryParams: getQueryParams(child) })\">\n <div class=\"m-item-left\">\n @if (child.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"child.iconUrl\" alt=\"icon\" />\n } @else {\n <mat-icon class=\"m-item-icon\">{{ child.icon || 'insert_drive_file' }}</mat-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <mat-icon class=\"m-nav-icon\">chevron_right</mat-icon>\n </button>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input, signal, untracked } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\nimport { SidebarMobileOverlayComponent } from './components/sidebar/sidebar.component';\n\n@Component({\n selector: 'sidebar-mobile-v1',\n templateUrl: './main.component.html',\n styleUrls: ['./main.component.scss'],\n imports: [MatIconModule, CommonModule, SidebarMobileOverlayComponent],\n standalone: true,\n})\nexport class SidebarMobileV1Component {\n #layoutStorageService = inject(SdLayoutStorageService);\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n\n // Sidebar luôn bắt đầu đóng trên mobile\n isShowSidebar = signal<boolean>(false);\n titleMenuGroup = signal<string | undefined>('');\n\n constructor() {\n effect(() => {\n const isShow = this.isShowSidebar();\n untracked(() => {\n this.#layoutStorageService.isShowSidebar.set(isShow);\n });\n });\n }\n\n openSidebar = (): void => {\n this.isShowSidebar.set(true);\n };\n\n onToggle = (_data: boolean | null): void => {\n this.isShowSidebar.set(false);\n };\n\n onPopupOfSideBarOpened = (): void => {};\n onPopupOfSideBarClosed = (): void => {};\n onExpandSideBar = (): void => {};\n onMouseleaveSideBar = (): void => {};\n onTitleMenuGroupChanged = (title: string | undefined): void => {\n this.titleMenuGroup.set(title);\n };\n}\n","<div class=\"c-mobile-layout\">\n <div class=\"c-mobile-topbar\">\n <div class=\"c-topbar-brand\">\n @if (sidebar().logoUrl) {\n <img class=\"c-topbar-logo\" [src]=\"sidebar().logoUrl\" alt=\"logo\" />\n }\n <span class=\"c-topbar-title\">{{ titleMenuGroup() || sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n <button class=\"c-hamburger-btn\" (click)=\"openSidebar()\">\n <mat-icon>menu</mat-icon>\n </button>\n </div>\n\n <div class=\"c-mobile-content\">\n <ng-content></ng-content>\n </div>\n\n <sd-sidebar-mobile-overlay\n [menus]=\"menus()\"\n [userInfo]=\"userInfo()\"\n [sidebar]=\"sidebar()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (showSideBar)=\"onToggle($event)\"\n (expandSideBar)=\"onExpandSideBar()\"\n (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\n (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\"\n (titleMenuGroupChanged)=\"onTitleMenuGroupChanged($event)\">\n </sd-sidebar-mobile-overlay>\n</div>\n","import {Component, computed, inject, input, signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n// Import nội bộ trong module layout\nimport { SdLayoutMenu, SdLayoutService } from '../../services';\nimport { MenuPipe } from '../../pipes';\nimport { SidebarV1Component } from '../sidebar-v1/main.component';\nimport { SidebarMobileV1Component } from '../sidebar-mobile-v1/main.component';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\n\n@Component({\n selector: 'sd-layout',\n templateUrl: './layout-main.component.html',\n styleUrls: ['./layout-main.component.scss'],\n imports: [SidebarV1Component, SidebarMobileV1Component, NgTemplateOutlet],\n standalone: true,\n})\nexport class SdLayoutComponent {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #menuPipe = inject(MenuPipe);\n #layoutService = inject(SdLayoutService);\n\n // ==========================================\n // SIGNAL INPUTS\n // ==========================================\n menusInput = input<SdLayoutMenu[]>([], { alias: 'menus' });\n menus = computed(() => this.#menuPipe.transform(this.menusInput() || []));\n\n // ==========================================\n // CONSUME SHARED STATE\n // ==========================================\n userInfo = this.#layoutService.userInfo;\n sidebar = this.#layoutService.sidebar;\n\n isMobileOrTablet = signal(BrowserUtilities.isMobile());\n}\n","<ng-template #projectedContent>\n <ng-content></ng-content>\n</ng-template>\n\n@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar?.version === 1) {\n @if (!isMobileOrTablet()) {\n <sidebar-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebar!\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-v1>\n } @else {\n <sidebar-mobile-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebar!\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-mobile-v1>\n }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18N_STORAGE_KEY, I18N_MESSAGES, I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Language } from '@sdcorejs/angular/models';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\nimport { ActivatedRoute } from '@angular/router';\n// End\n\n@Component({\n selector: 'app-home-page',\n imports: [SdPageComponent, TranslatePipe, MatIconModule],\n templateUrl: './home-page.component.html',\n styleUrls: ['./home-page.component.scss'],\n standalone: true,\n})\n@SdTabComponent({\n component: HomePageComponent,\n // WHY: decorator chạy trước Angular DI, nên không inject được I18nService.\n // Đọc ngôn ngữ hiện tại trực tiếp từ localStorage + I18N_MESSAGES để có giá trị đã dịch.\n name: () => {\n const lang = ((): Language => {\n try {\n const stored = localStorage.getItem(I18N_STORAGE_KEY) as Language | null;\n if (stored) return stored;\n } catch { /* ignore */ }\n return 'vi';\n })();\n return I18N_MESSAGES[lang]?.['core.module.layout.home.tab-name'] ?? I18N_MESSAGES.vi['core.module.layout.home.tab-name'];\n },\n icon: 'home',\n color: 'primary',\n})\nexport class HomePageComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // Map Language code → BCP 47 locale tag dùng cho Intl date formatting\n // WHY: must be declared before todayInfo — field init runs top-to-bottom; #getTodayInfo reads #localeMap.\n readonly #localeMap: Record<Language, string> = {\n vi: 'vi-VN',\n en: 'en-US',\n ja: 'ja-JP',\n ko: 'ko-KR',\n zh: 'zh-CN',\n };\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n\n // WHY: static data, không cần signal. `storage` + `schema` thay cho `database` + `account_tree`\n // để đảm bảo render trên mọi version của Material Icons mặc định.\n readonly features = [\n { icon: 'storage', key: 'core.module.layout.home.feature.data', area: 'data' },\n { icon: 'insights', key: 'core.module.layout.home.feature.reports', area: 'report' },\n { icon: 'group', key: 'core.module.layout.home.feature.users', area: 'users' },\n { icon: 'schema', key: 'core.module.layout.home.feature.workflow', area: 'flow' },\n { icon: 'verified_user', key: 'core.module.layout.home.feature.audit', area: 'audit' },\n { icon: 'hub', key: 'core.module.layout.home.feature.integration', area: 'integ' },\n ] as const;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n\n #getTimezone() {\n const now = new Date();\n const timezoneOffset = now.getTimezoneOffset();\n const offsetHours = -timezoneOffset / 60;\n const sign = offsetHours >= 0 ? '+' : '';\n const simpleGmtString = `GMT${sign}${offsetHours}`;\n return simpleGmtString;\n }\n\n #getTodayInfo(date: Date) {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n // WHY: dùng locale theo ngôn ngữ hiện tại để định dạng số (dd/mm/yyyy vs mm/dd/yyyy ...)\n const locale = this.#localeMap[this.#i18n.language()] ?? 'vi-VN';\n const dateStr = date.toLocaleDateString(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n const formatted = this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n return `${formatted} (${this.#getTimezone()})`;\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">\n {{ 'core.module.layout.greeting.hello' | translate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}\n </div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n\n <div class=\"wrapper\">\n <div class=\"bento\">\n <!-- Hero -->\n <div class=\"card hero-card\">\n <div class=\"hero-ring ring-3\"></div>\n <div class=\"hero-ring ring-2\"></div>\n <div class=\"hero-ring ring-1\"></div>\n <div class=\"hero-core\">\n <mat-icon class=\"hero-icon\">space_dashboard</mat-icon>\n </div>\n <div class=\"hero-decoration\">\n <span class=\"dot d1\"></span>\n <span class=\"dot d2\"></span>\n <span class=\"dot d3\"></span>\n </div>\n </div>\n\n <!-- Features -->\n @for (feature of features; track feature.key; let i = $index) {\n <div\n class=\"card feature-card\"\n [class.feature-wide]=\"feature.area === 'audit' || feature.area === 'integ'\"\n [style.gridArea]=\"feature.area\"\n [style.animation-delay.ms]=\"(i + 1) * 80\"\n >\n <div class=\"feature-accent\"></div>\n <div class=\"feature-content\">\n <div class=\"feature-icon-wrap\">\n <mat-icon class=\"feature-icon\">{{ feature.icon }}</mat-icon>\n </div>\n <span class=\"feature-label\">{{ feature.key | translate }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n</sd-page>\n","import { Inject, Injectable } from '@angular/core';\nimport { CanActivate, Router } from '@angular/router';\n\n// Giả sử bạn có một service để đọc config\nimport { ISdLayoutConfiguration, SD_LAYOUT_CONFIGURATION } from '../../../configurations';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HomeRedirectGuard implements CanActivate {\n constructor(\n private router: Router,\n @Inject(SD_LAYOUT_CONFIGURATION) private layoutConfiguration: ISdLayoutConfiguration\n ) {}\n\n async canActivate() {\n const homeUrl = this.layoutConfiguration?.homeUrl;\n if (homeUrl) {\n // Nếu có config homeUrl, tạo một UrlTree để redirect\n // Đây là cách redirect chính thống từ trong guard\n return this.router.createUrlTree([homeUrl]);\n }\n // Nếu không có homeUrl, cho phép kích hoạt route\n return true;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { HomePageComponent } from './components/home-page/home-page.component';\nimport { HomeRedirectGuard } from './guards/home-redirect.guard';\n\nconst routes: Routes = [\n {\n path: '',\n canActivate: [HomeRedirectGuard],\n component: HomePageComponent,\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class HomeRoutingModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HomeRoutingModule } from './home.routing';\n\n@NgModule({\n declarations: [],\n imports: [CommonModule, HomeRoutingModule],\n})\nexport class HomeModule {}\n","import { Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { SdButton } from '@sdcorejs/angular/components';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrls: ['./root.component.scss'],\n imports: [SdButton, SdPageComponent, TranslatePipe],\n})\nexport class RootComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #route = inject(ActivatedRoute);\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #getTodayInfo(date: Date): string {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n const dateStr = date.toLocaleDateString('vi-VN', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n return this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n }\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n reload() {\n window.location.href = '';\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">{{ 'core.module.layout.greeting.hello' | translate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}</div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n\n <div class=\"h-full d-flex flex-column align-items-center\">\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\n <img alt=\"not-found\" class=\"sd-image-not-found\" />\n <span class=\"T16M mt-24\">{{ 'core.module.layout.not-found.title' | translate }}</span>\n <span class=\"T16R text-secondary mt-4\">\n {{ 'core.module.layout.not-found.message' | translate }}\n </span>\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.not-found.back' | translate\" prefixIcon=\"arrow_back\"> </sd-button>\n </div>\n </div>\n</sd-page>\n","import { Route } from '@angular/router';\nimport { RootComponent } from './pages/root/root.component';\n\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './not-found.routing';\n\n@NgModule({\n imports: [CommonModule, RouterModule.forChild(Routes)],\n exports: [],\n})\nexport class NotFoundModule {}\n","import { Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { SdButton } from '@sdcorejs/angular/components';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrls: ['./root.component.scss'],\n imports: [SdButton, SdPageComponent, TranslatePipe],\n})\nexport class RootComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #route = inject(ActivatedRoute);\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #getTodayInfo(date: Date): string {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n const dateStr = date.toLocaleDateString('vi-VN', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n return this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n }\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n reload() {\n window.location.href = '';\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">{{ 'core.module.layout.greeting.hello' | translate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}</div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n <div class=\"h-full d-flex flex-column align-items-center\">\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\n <img alt=\"forbidden\" class=\"sd-image-forbidden\" />\n <span class=\"T16M mt-24\">{{ 'core.module.layout.forbidden.title' | translate }}</span>\n <span class=\"T14R text-secondary mt-4\"\n >{{ 'core.module.layout.forbidden.message' | translate }}</span\n >\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.forbidden.back-home' | translate\"> </sd-button>\n </div>\n </div>\n</sd-page>\n","import { Route } from '@angular/router';\nimport { RootComponent } from './pages/root/root.component';\n\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './forbidden.routing';\n\n@NgModule({\n imports: [CommonModule, RouterModule.forChild(Routes)],\n exports: [],\n})\nexport class ForbiddenModule {}\n","import { Route } from '@angular/router';\n\nexport const Routes: Route[] = [\n {\n path: '',\n pathMatch: 'full',\n redirectTo: 'not-found',\n },\n {\n path: 'home',\n loadChildren: () => import('./modules/home').then(m => m.HomeModule),\n },\n {\n path: 'not-found',\n loadChildren: () => import('./modules/not-found').then(m => m.NotFoundModule),\n },\n {\n path: 'forbidden',\n loadChildren: () => import('./modules/forbidden').then(m => m.ForbiddenModule),\n },\n];\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './layout.routing';\n@NgModule({\n declarations: [],\n imports: [RouterModule.forChild(Routes)],\n providers: [],\n})\nexport class SdLayoutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i3","LayoutUserComponent","i2","RootComponent","Routes"],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-modules-layout.mjs","sources":["../../../projects/sdcorejs-angular/modules/layout/components/page/page.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/page/page.component.html","../../../projects/sdcorejs-angular/modules/layout/services/storage/storage.service.ts","../../../projects/sdcorejs-angular/modules/layout/configurations/layout.configuration.ts","../../../projects/sdcorejs-angular/modules/layout/services/layout.service.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/menu.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/menu-focus.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/high-light-search.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/user/user.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/user/user.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/user/user.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/user/user.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/layout-main/layout-main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/layout-main/layout-main.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/home/components/home-page/home-page.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/components/home-page/home-page.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/home/guards/home-redirect.guard.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/home.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/home.module.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/pages/root/root.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/pages/root/root.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/not-found.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/not-found.module.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/pages/root/root.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/pages/root/root.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/forbidden.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/forbidden.module.ts","../../../projects/sdcorejs-angular/modules/layout/layout.routing.ts","../../../projects/sdcorejs-angular/modules/layout/layout.module.ts","../../../projects/sdcorejs-angular/modules/layout/sdcorejs-angular-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, inject } from '@angular/core';\nimport { SdStorage, SdStorageService } from '@sdcorejs/angular/services';\nimport { ISdLayoutConfiguration, SD_LAYOUT_CONFIGURATION } from '../../configurations';\nimport { SdLayoutChildrenMenu } from '../menu/menu.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdLayoutStorageService {\n // Thông tin state của sidebar\n isShowSidebar: SdStorage<boolean>;\n menuLockStatus: SdStorage<boolean>;\n lastActiveMenuGroupId: SdStorage<string>;\n pinnedMenuGroup: SdStorage<SdLayoutChildrenMenu>;\n // End\n\n constructor(private sdStorageService: SdStorageService) {\n // State sidebar\n this.isShowSidebar = this.sdStorageService.create('cb07c316-ed6d-4620-9e92-53dbef6aa983');\n this.menuLockStatus = this.sdStorageService.create('2c2f4816-18b3-4ec3-8177-7b90bff036c3');\n this.lastActiveMenuGroupId = this.sdStorageService.create('2e6961d0-3380-4a94-a6a1-38837560cd96');\n this.pinnedMenuGroup = this.sdStorageService.create('e81da122-5dab-4250-b309-64197fb19d44');\n // End\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { MaybeAsync } from '@sdcorejs/utils/models';\nexport interface ISdLayoutConfiguration {\n homeUrl?: string;\n sidebar: ISdSidebarConfiguration | (() => MaybeAsync<ISdSidebarConfiguration>);\n userInfo: SdLayoutUserInfo | (() => MaybeAsync<SdLayoutUserInfo>);\n signout: () => void | Promise<void>;\n changePassword?: () => void | Promise<void>;\n}\n\nexport interface SdLayoutUserInfo {\n /**\n * Tên đăng nhập hoặc tên định danh của người dùng.\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.\n */\n username?: string;\n\n /**\n * Địa chỉ thư điện tử của người dùng.\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.\n */\n email?: string;\n\n /**\n * Họ và tên đầy đủ của người dùng.\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).\n */\n fullName?: string;\n\n /**\n * Hình đại diện (avatar) của người dùng.\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.\n * Hỗ trợ các định dạng: URL (http/https), chuỗi base64 (data:image), hoặc đường dẫn nội bộ.\n */\n avatar?: string;\n}\n\nexport type ISdSidebarConfiguration = SidebarConfigurationV1;\n\nexport interface SidebarConfigurationV1 {\n version: 1;\n\n /**\n * Màu brand chính.\n * Nên sử dụng mã màu #HEX hoặc rgb để hỗ trợ opacity khi hover.\n * Ví dụ: #1890ff, rgb(24,144,255)\n */\n brandColor?: string;\n\n /**\n * Màu brand nhạt (light).\n * Dùng cho background, hover nhẹ.\n */\n brandLightColor?: string;\n\n /**\n * URL logo hiển thị ở sidebar.\n * Nên đặt trong thư mục public hoặc dùng URL CDN.\n */\n logoUrl?: string;\n\n /**\n * Title mặc định của hệ thống.\n * Nếu menu không truyền title thì sẽ dùng giá trị này.\n * @default \"Back Office\"\n */\n defaultTitle?: string;\n\n /**\n * Cấu hình tính năng ghim menu.\n * - `enabled`: bật/tắt tính năng ghim.\n * Hệ thống mặc định là false\n */\n pin?: {\n enabled?: boolean;\n };\n}\n\nexport const SD_LAYOUT_CONFIGURATION = new InjectionToken<ISdLayoutConfiguration>('sd.layout.configuration');\n","import { Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { resolveMaybeAsync } from '@sdcorejs/utils/models';\nimport { ISdLayoutConfiguration, ISdSidebarConfiguration, SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../configurations';\n\n@Injectable({\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\n})\nexport class SdLayoutService {\n // ==========================================\n // INJECT CONFIGURATIONS\n // ==========================================\n // WHY: optional=true cho phép layout module chạy không cần SD_LAYOUT_CONFIGURATION\n // (use case demo / khởi tạo nhanh). Khi token không có → fallback mock data trong constructor.\n #layoutConfiguration = inject<ISdLayoutConfiguration | null>(SD_LAYOUT_CONFIGURATION, { optional: true });\n #i18n = inject(I18nService);\n\n // ==========================================\n // SHARED SIGNALS (STATE)\n // ==========================================\n userInfo = signal<SdLayoutUserInfo | undefined>(undefined);\n sidebar = signal<ISdSidebarConfiguration | undefined>(undefined);\n\n constructor() {\n if (!this.#layoutConfiguration) {\n // WHY: cho phép layout module chạy không cần config (use case demo / khởi tạo nhanh).\n // Fallback dùng mock data đã i18n hóa; thật tế khi tích hợp portal cần provide SD_LAYOUT_CONFIGURATION.\n // @i18n-ignore dev-facing console.warn — không cần dịch\n console.warn(\n // @i18n-ignore\n '[SdLayoutService] SD_LAYOUT_CONFIGURATION chưa được inject — đang dùng mock data. ' +\n // @i18n-ignore\n 'Provide token này (xem ISdLayoutConfiguration) để custom user info / sidebar / signout.'\n );\n this.userInfo.set(this.#mockUserInfo());\n this.sidebar.set(this.#mockSidebar());\n return;\n }\n this.#initUserInfo();\n this.#initSidebar();\n }\n\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #initUserInfo(): void {\n const userInfoConfig = this.#layoutConfiguration!.userInfo;\n if (typeof userInfoConfig === 'function') {\n resolveMaybeAsync(userInfoConfig()).then(userInfo => this.userInfo.set(userInfo));\n } else {\n this.userInfo.set(userInfoConfig);\n }\n }\n\n #initSidebar(): void {\n const sidebarConfig = this.#layoutConfiguration!.sidebar;\n if (typeof sidebarConfig === 'function') {\n resolveMaybeAsync(sidebarConfig()).then(config => this.sidebar.set(config));\n } else {\n this.sidebar.set(sidebarConfig);\n }\n }\n\n #mockUserInfo(): SdLayoutUserInfo {\n return {\n fullName: this.#i18n.t('core.module.layout.mock.user.full-name'),\n email: 'demo@example.com',\n username: 'demo',\n };\n }\n\n #mockSidebar(): ISdSidebarConfiguration {\n return {\n version: 1,\n defaultTitle: 'Back Office',\n };\n }\n}\n","import { Utilities } from '@sdcorejs/utils/fns';\nimport { Injectable, Pipe, PipeTransform } from '@angular/core';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu, Menus } from '../services/menu/menu.model';\nimport { Params } from '@angular/router';\nimport { SdPermissionService } from '@sdcorejs/angular/modules/permission';\n// End\n@Pipe({\n name: 'menu',\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class MenuPipe implements PipeTransform {\n constructor(private permissionService: SdPermissionService) {}\n transform(menus: SdLayoutMenu[]): SdLayoutMenu[] {\n const results: Menus = [];\n const check = (menu: SdLayoutMenu): SdLayoutMenu | null => {\n if ('children' in menu) {\n const children: Menus = [];\n menu.children?.forEach(childMenu => {\n childMenu = check(childMenu) as SdLayoutMenu;\n if (childMenu) {\n children.push({ ...childMenu, id: this.#getHashIdMenu(childMenu) });\n }\n });\n\n if (!children.length) {\n return null;\n }\n\n return {\n ...menu,\n children,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if ('permission' in menu) {\n const path = menu?.path?.includes('http') ? menu.path : menu.path;\n if (!menu.path) {\n return null;\n }\n\n if ((typeof menu.permission === 'string' || Array.isArray(menu.permission)) && this.permissionService.hasPermission(menu.permission, menu.permissionKey)) {\n return {\n ...menu,\n path,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if (typeof menu.permission === 'boolean' && menu.permission) {\n return {\n ...menu,\n path,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if (typeof menu.permission === 'function' && menu.permission()) {\n return {\n ...menu,\n path,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n return null;\n }\n return {\n ...menu,\n id: Utilities.generateUuid(),\n };\n };\n\n menus?.forEach(menu => {\n menu = check(menu) as SdLayoutMenu;\n if (menu) {\n results.push(menu);\n }\n });\n return results;\n }\n\n #getHashIdMenu = (menu: SdLayoutMenu): string => {\n const extendedMenu = menu as SdLayoutMenu & {\n path?: string;\n permission?: string;\n permissionKey?: string;\n queryParams?: Params;\n };\n const hashKeys: (keyof typeof extendedMenu)[] = ['title', 'path', 'permission', 'permissionKey', 'queryParams', 'icon', 'level', 'tooltipTitle'];\n const hashData = hashKeys.reduce(\n (acc, key) => {\n const value = extendedMenu[key];\n if (value !== undefined && value !== null) {\n acc[key as string] = value;\n }\n return acc;\n },\n {} as Record<string, any>\n );\n\n return Object.keys(hashData).length > 0 ? Utilities.hash(hashData) : Utilities.generateUuid();\n };\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu } from '../services';\n// End\n@Pipe({\n name: 'menuFocus',\n})\n@Injectable({ providedIn: 'root' })\nexport class MenuFocusPipe implements PipeTransform {\n transform(routePath: string, menuItem: SdLayoutMenu): boolean {\n if (!routePath) {\n return false;\n }\n if ('children' in menuItem && menuItem.children) {\n return menuItem.children.some(child => {\n return 'path' in child && child.path ? this.#match(routePath, child.path) : false;\n });\n }\n return 'path' in menuItem && this.#match(routePath, menuItem.path);\n }\n\n #match = (routePath: string, path: string): boolean => {\n if (!path) {\n return false;\n }\n if (routePath === path) {\n return true;\n }\n return this.#normalizePath(routePath).startsWith(this.#normalizePath(path));\n };\n\n #normalizePath = (p: string): string => {\n return p.endsWith('/') ? p : p + '/';\n };\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\n@Pipe({\n name: 'highLightSearch',\n})\nexport class HighlightSearchPipe implements PipeTransform {\n transform(\n value: string,\n keyword: string,\n args?: {\n color?: string;\n }\n ): string {\n const { color = '#ffff00' } = args ?? {};\n keyword = this.#normalizeValue(keyword);\n if (!keyword || keyword.length < 2) {\n return value;\n }\n value = value?.trim() || '';\n const regex = new RegExp(StringUtilities.changeAliasLowerCase(keyword), 'gi'); //'gi' for case insensitive and can use 'g' if you want the search to be case sensitive.\n const aliasLowerCaseStr = StringUtilities.changeAliasLowerCase(value);\n const strs: string[] = [];\n let previousOffset = 0;\n aliasLowerCaseStr.replace(regex, (_, offset) => {\n strs.push(value.substring(previousOffset, offset));\n strs.push(`<mark style=\"background-color: ${color}\">${value.substring(offset, offset + keyword.length)}</mark>`);\n previousOffset = offset + keyword.length;\n return `<mark style=\"background-color: ${color}\">${value.substring(offset, offset + keyword.length)}</mark>`;\n });\n strs.push(value.substring(previousOffset, value.length));\n return strs.join('');\n }\n\n #normalizeValue = (keyword: string) => {\n let str: string = keyword?.toString() ?? '';\n /* eslint-disable no-useless-escape */\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\n str = str.replace(/ + /g, ' ');\n str = str.trim();\n return str;\n };\n}\n","import { Component, inject, input, output } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n// Import sd-core\nimport { SdAvatar } from '@sdcorejs/angular/components';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../../../../configurations';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrls: ['./user.component.scss'],\n imports: [MatMenuModule, MatButtonModule, MatIconModule, MatTooltipModule, SdAvatar, TranslatePipe],\n standalone: true,\n})\nexport class LayoutUserComponent {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\n\n // ==========================================\n // SIGNAL INPUTS & OUTPUTS\n // ==========================================\n isMobileOrTablet = input<boolean>(false);\n isMenuLock = input<boolean>(false);\n isShowSidebar = input<boolean>(false);\n userInfo = input.required<SdLayoutUserInfo>();\n\n // Chuyển thành void vì các hàm emit hiện tại không truyền data\n menuClosed = output<void>();\n menuOpened = output<void>();\n toggleMenuLock = output<Event>();\n\n // Config actions\n singoutLayoutConfig = this.#layoutConfiguration.signout;\n changePasswordLayoutConfig = this.#layoutConfiguration?.changePassword;\n\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n onMenuOpened = (): void => {\n this.menuOpened.emit();\n };\n\n onMenuClosed = (): void => {\n this.menuClosed.emit();\n };\n\n keepOpenWhenClickInsideMenu = (event: Event): void => {\n event.stopPropagation();\n };\n\n logout = (): void => {\n this.singoutLayoutConfig();\n };\n\n changePassword = (): void => {\n // Dùng Optional Chaining gọi hàm cực gọn\n this.changePasswordLayoutConfig?.(); \n };\n\n onToggleMenuLock = (event: Event): void => {\n this.toggleMenuLock.emit(event);\n };\n}\n\n","@let _userInfo = userInfo();\n@let avatar = _userInfo?.avatar || _userInfo?.fullName || _userInfo?.username || _userInfo?.email;\n\n<div class=\"c-layout-user-wrapper\">\n <div class=\"c-layout-user-avatar\" [matMenuTriggerFor]=\"userMenu\" (menuClosed)=\"onMenuClosed()\" (menuOpened)=\"onMenuOpened()\">\n <sd-avatar [src]=\"avatar\" [size]=\"32\"></sd-avatar>\n </div>\n\n @if (!isMobileOrTablet()) {\n <div aria-hidden=\"true\" mat-mini-fab class=\"c-layout-icon-toggle\" (click)=\"onToggleMenuLock($event)\">\n <mat-icon style=\"color: #8c8c8c\">\n {{ isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left' }}\n </mat-icon>\n </div>\n }\n</div>\n\n<mat-menu #userMenu=\"matMenu\" xPosition=\"before\" backdropClass=\"c-user-menu-backdrop-f90ce131-fa4c-4f71-a49b-ab7fa374fdd0\">\n <div aria-hidden=\"true\" class=\"c-user-menu-wrapper\" (click)=\"keepOpenWhenClickInsideMenu($event)\">\n <div class=\"c-user-info-wrapper\">\n <div class=\"c-user-avatar\">\n <sd-avatar [src]=\"avatar\" [size]=\"40\"></sd-avatar>\n </div>\n <span class=\"c-user-name\">{{ _userInfo.fullName || _userInfo.username }}</span>\n <span class=\"c-user-email\">{{ _userInfo.email }}</span>\n </div>\n\n @if (changePasswordLayoutConfig) {\n <div class=\"c-sign-button-wrapper\">\n <button class=\"c-account-options\" (click)=\"changePassword()\">\n <mat-icon fontSet=\"material-icons-outlined\">lock</mat-icon>\n <span>{{ 'core.module.layout.user.change-password' | translate }}</span>\n </button>\n </div>\n }\n\n <div class=\"c-sign-button-wrapper\">\n <button class=\"c-sign-button\" mat-flat-button (click)=\"logout()\">{{ 'core.module.layout.user.logout' | translate }}</button>\n </div>\n </div>\n</mat-menu>","import { NestedTreeControl } from '@angular/cdk/tree';\nimport { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\n\nimport { SdInput, SdSuffixDefDirective } from '@sdcorejs/angular/forms';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdSafeHtmlPipe } from '@sdcorejs/angular/pipes';\nimport { BrowserUtilities, StringUtilities } from '@sdcorejs/utils/fns';\n\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { HighlightSearchPipe, MenuFocusPipe } from '../../../../pipes';\nimport { SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\n\n@Component({\n selector: 'sidebar',\n standalone: true,\n imports: [\n SdInput,\n FormsModule,\n CommonModule,\n RouterModule,\n MatIconModule,\n MatTreeModule,\n SdSafeHtmlPipe,\n MatInputModule,\n MenuFocusPipe,\n MatTooltipModule,\n HighlightSearchPipe,\n SdSuffixDefDirective,\n LayoutUserComponent,\n TranslatePipe,\n ],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n})\nexport class SidebarComponent {\n // ==========================================\n // INJECT SERVICES (Thay thế Constructor rườm rà)\n // ==========================================\n #router = inject(Router);\n #layoutStorageService = inject(SdLayoutStorageService);\n #menuFocusPipe = inject(MenuFocusPipe);\n #destroyRef = inject(DestroyRef); // Dùng để unsubscribe RxJS tự động\n\n // ==========================================\n // SIGNAL INPUTS & OUTPUTS\n // ==========================================\n isShowSidebar = input.required<boolean>();\n menus = input.required<SdLayoutMenu[]>();\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n expandSideBar = output<void>();\n popupUserMenuClosed = output<void>();\n popupUserMenuOpened = output<void>();\n showSideBar = output<boolean | null>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n screenHeight = window.innerHeight;\n isMobileOrTablet = BrowserUtilities.isMobile();\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n currentPath = signal<string>(window.location.pathname);\n searchText = signal<string>('');\n titleMenuGroup = signal<string | undefined>('');\n idMenuGroupActive = signal<string | undefined>('');\n menusByGroup = signal<SdLayoutMenu[]>([]);\n #hoveredMenuNodeKey = signal<string | null>(null);\n #pinIconHoverTimerId = signal<ReturnType<typeof setTimeout> | null>(null);\n pinnedMenuGroup = signal<SdLayoutChildrenMenu>(\n this.#layoutStorageService.pinnedMenuGroup.get() ?? {\n id: 'pinned-menu-group',\n title: 'Đã ghim',\n children: [],\n }\n );\n\n // ==========================================\n // COMPUTED STATE\n // ==========================================\n totalMenuInMenusByGroup = computed(() => this.#getTotalMenus(this.menusByGroup()));\n pinnedNodeKeys = computed(() => new Set(this.pinnedMenuGroup().children?.map(m => this.#getMenuNodeKey(m)) ?? []));\n isPinnedMenuGroupActive = computed(() => this.idMenuGroupActive() === this.pinnedMenuGroup().id);\n\n // ==========================================\n // DATA STRUCTURES\n // ==========================================\n #pinIconHoverTimerDelay: number = 300;\n #isFirstBindingMenu = signal<boolean>(true);\n dataSource = new MatTreeNestedDataSource<SdLayoutMenu>();\n treeControl = new NestedTreeControl<SdLayoutMenu>(node => ('children' in node && node.children?.length ? node.children : []));\n\n constructor() {\n this.#setupEffects();\n this.#setupSubscriptions();\n }\n\n #setupEffects(): void {\n effect(() => {\n const currentMenus = this.menus();\n untracked(() => {\n const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\n const pinnedGroup = this.pinnedMenuGroup();\n const isPinEnabled = this.sidebar()?.pin?.enabled;\n // Xử lý khi lần đầu vào web (nếu chưa có active group)\n if (!lastActiveMenuGroupId || (lastActiveMenuGroupId === pinnedGroup?.id && !isPinEnabled)) {\n // Ưu tiên pinnedGroup nếu đủ điều kiện, còn không lấy menu đầu tiền dev khai báo\n const targetId = isPinEnabled && pinnedGroup?.children?.length ? pinnedGroup?.id : currentMenus?.[0]?.id;\n this.#layoutStorageService.lastActiveMenuGroupId.set(targetId ?? '');\n }\n\n this.#bindingMenuGroupByCurrentPath(currentMenus);\n this.#isFirstBindingMenu.set(false);\n });\n });\n }\n\n #setupSubscriptions(): void {\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) {\n if (this.currentPath() !== window.location.pathname) {\n this.currentPath.set(window.location.pathname);\n this.#bindingMenuGroupByCurrentPath(this.menus());\n }\n }\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n hasChild = (_: number, node: SdLayoutMenu): boolean => 'children' in node && !!node.children?.length;\n\n onToggleMenuNode = (menu: SdLayoutMenu): void => {\n this.treeControl.toggle(menu);\n };\n\n isPinnedNode = (node: SdLayoutMenu): boolean => this.pinnedNodeKeys().has(this.#getMenuNodeKey(node));\n isHoveredNode = (node: SdLayoutMenu): boolean => this.#hoveredMenuNodeKey() === this.#getMenuNodeKey(node);\n\n expandPinnedGroup = (): void => {\n const group = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(group.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(group.id || '');\n this.titleMenuGroup.set(group.title);\n this.#setMenusByGroup(group.children ?? []);\n this.searchText.set('');\n this.expandSideBar.emit();\n };\n\n onTogglePin = (event: MouseEvent, node: SdLayoutMenu): void => {\n event.stopPropagation();\n const key = this.#getMenuNodeKey(node);\n this.pinnedMenuGroup.update(group => {\n const children = group.children ?? [];\n const exists = children.some(m => this.#getMenuNodeKey(m) === key);\n const updatedChildren = exists ? children.filter(m => this.#getMenuNodeKey(m) !== key) : [...children, node];\n const updatedGroup = { id: 'pinned-menu-group', title: 'Đã ghim', children: updatedChildren };\n this.#layoutStorageService.pinnedMenuGroup.set(updatedGroup);\n return updatedGroup;\n });\n };\n\n #onExpandAllMenuNodes = (menus: SdLayoutMenu[]): void => {\n menus?.forEach(menu => {\n this.treeControl.expand(menu);\n if ('children' in menu && menu.children?.length) {\n this.#onExpandAllMenuNodes(menu.children);\n }\n });\n };\n\n #onCollapseAllMenuNodes = (menus: SdLayoutMenu[]): void => {\n menus?.forEach(menu => {\n this.treeControl.collapse(menu);\n if ('children' in menu && menu.children?.length) {\n this.#onCollapseAllMenuNodes(menu.children);\n }\n });\n };\n\n toggleMenuLock(event: Event): void {\n event.stopPropagation();\n this.isMenuLock.update(v => !v);\n this.#layoutStorageService.menuLockStatus?.set(this.isMenuLock());\n this.showSideBar.emit(this.isMenuLock());\n }\n\n openHomePage = (): void => {\n if (!this.isMobileOrTablet) {\n this.#router.navigateByUrl('/layout/home');\n } else {\n window.location.href = '/layout/home';\n }\n this.searchText.set('');\n this.#layoutStorageService.lastActiveMenuGroupId.set('');\n };\n\n onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\n\n onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\n\n navigate = (args: { path: string; queryParams: Params }): void => {\n const { path, queryParams } = args;\n if (path.includes('http')) {\n window.open(path);\n return;\n }\n this.#router.navigate([path.split('?')[0]], {\n queryParams,\n state: { switchTab: true },\n });\n\n if (this.isMobileOrTablet) {\n this.#closeMenu();\n }\n };\n\n onFilterSearchText = (event: string): void => {\n this.searchText.set(event);\n this.#filterMenuBySearchText(this.menusByGroup());\n };\n\n onClearSearchText = (): void => {\n this.searchText.set('');\n this.#filterMenuBySearchText(this.menusByGroup());\n };\n\n expandMenuGroup = (menuGroupNode: SdLayoutMenu): void => {\n this.titleMenuGroup.set(menuGroupNode?.tooltipTitle || menuGroupNode?.title);\n\n // Case 1: Menu không có children\n if (!('children' in menuGroupNode && menuGroupNode.children?.length)) {\n if ('path' in menuGroupNode) {\n this.navigate({ path: menuGroupNode.path, queryParams: menuGroupNode?.queryParams ?? {} });\n return;\n }\n }\n\n // Case 2: Menu có children\n if ('children' in menuGroupNode && menuGroupNode.children?.length) {\n this.#setMenusByGroup(menuGroupNode.children);\n this.searchText.set('');\n this.onFilterSearchText('');\n this.expandSideBar.emit();\n }\n\n this.idMenuGroupActive.set(menuGroupNode?.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(menuGroupNode?.id || '');\n if (!this.currentPath()) {\n this.currentPath.set(window.location.pathname);\n }\n };\n\n // ==========================================\n // CỤM HOVER MENU GROUP & NODE\n // ==========================================\n onMouseOverMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\n if (this.idMenuGroupActive() !== menuNode?.id) {\n const menuGroup = event.currentTarget as HTMLElement;\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\n\n if (menuGroupIcon) {\n menuGroupIcon.style.transition = 'all 0.15s';\n menuGroupIcon.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\n if (!(menuGroupIcon instanceof HTMLImageElement)) {\n menuGroupIcon.style.color = this.sidebar()?.brandColor || '#2962FF';\n }\n }\n }\n };\n\n onMouseLeaveMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\n if (this.idMenuGroupActive() !== menuNode?.id) {\n const menuGroup = event.currentTarget as HTMLElement;\n const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\n\n if (menuGroupIcon) {\n menuGroupIcon.style.transition = 'all 0.15s';\n menuGroupIcon.style.backgroundColor = 'transparent';\n if (menuGroupIcon instanceof HTMLImageElement) {\n menuGroupIcon.style.opacity = '0.55';\n } else {\n menuGroupIcon.style.color = '#8C8C8C';\n }\n }\n }\n };\n\n onMouseOverMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\n const menuNode = event.currentTarget as HTMLElement;\n const brandColor = this.sidebar()?.brandColor || '#2962FF';\n\n // Nếu có bật config pin menu\n if (this.sidebar()?.pin?.enabled) {\n const iconPin = menuNode.querySelector('.c-menu-node-description-icon-pin') as HTMLElement;\n if (iconPin) {\n if (this.#pinIconHoverTimerId()) {\n clearTimeout(this.#pinIconHoverTimerId()!);\n this.#pinIconHoverTimerId.set(null);\n }\n\n this.#pinIconHoverTimerId.set(\n setTimeout(() => {\n this.#hoveredMenuNodeKey.set(this.#getMenuNodeKey(menuItem));\n iconPin.style.color = brandColor;\n iconPin.style.transition = 'all 0.15s';\n iconPin.style.opacity = '1';\n this.#pinIconHoverTimerId.set(null);\n }, this.#pinIconHoverTimerDelay)\n );\n }\n }\n\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\n const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\n\n if (menuNode) {\n menuNode.style.transition = 'all 0.15s';\n menuNode.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\n\n if (iconMenu) {\n iconMenu.style.transition = 'all 0.15s';\n iconMenu.style.color = brandColor;\n }\n if (content) {\n content.style.transition = 'all 0.15s';\n content.style.color = brandColor;\n }\n if (iconExpand) {\n iconExpand.style.transition = 'all 0.15s';\n iconExpand.style.color = brandColor;\n }\n }\n }\n };\n\n onMouseLeaveMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\n const menuNode = event.currentTarget as HTMLElement;\n\n // Nếu có bật config pin menu\n if (this.sidebar()?.pin?.enabled) {\n const iconPin = menuNode.querySelector('.c-menu-node-description-icon-pin') as HTMLElement;\n if (iconPin) {\n if (this.#pinIconHoverTimerId()) {\n clearTimeout(this.#pinIconHoverTimerId()!);\n this.#pinIconHoverTimerId.set(null);\n }\n this.#hoveredMenuNodeKey.set(null);\n\n iconPin.style.transition = 'all 0.15s';\n if (!this.isPinnedNode(menuItem)) {\n iconPin.style.color = '#8C8C8C';\n iconPin.style.opacity = '0';\n }\n }\n }\n\n if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\n const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\n const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\n const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\n\n if (menuNode) {\n menuNode.style.transition = 'all 0.15s';\n menuNode.style.backgroundColor = 'transparent';\n\n if (iconMenu) {\n iconMenu.style.transition = 'all 0.15s';\n iconMenu.style.color = '#8C8C8C';\n }\n if (content) {\n content.style.transition = 'all 0.15s';\n content.style.color = '#1F1F1F';\n }\n if (iconExpand) {\n iconExpand.style.transition = 'all 0.15s';\n iconExpand.style.color = '#8C8C8C';\n }\n }\n }\n };\n\n // ==========================================\n // PRIVATE LOGIC\n // ==========================================\n #setMenusByGroup = (menus: SdLayoutMenu[]): void => {\n this.menusByGroup.set(menus);\n this.dataSource.data = menus;\n };\n\n #getMenuNodeKey = (node: SdLayoutMenu): string => {\n if (node?.id) {\n return node.id;\n }\n if ('path' in node && node.path) {\n return node.path;\n }\n\n return node.title || '';\n };\n\n #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[], menuGroup?: SdLayoutMenu): SdLayoutMenu[] => {\n for (const menu of menus) {\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n return [menuGroup ?? menu];\n }\n if ('children' in menu && menu.children?.length) {\n const result = this.#getMenuGroupByCurrentPath(menu.children, menuGroup ?? menu);\n if (result?.length) {\n return result;\n }\n }\n }\n return [];\n };\n\n #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\n // Chỉ bindingGroup mới khi người dùng không searchText\n if (!this.#getValidSearchText()) {\n const pinnedChildren = this.pinnedMenuGroup()?.children ?? [];\n\n // Ưu tiên: Current path khớp với item trong pinMenuGroup thì lần đầu vào trang sẽ hiện pinnedMenuGroup\n const isPinnedPathMatchValid =\n this.sidebar()?.pin?.enabled &&\n pinnedChildren?.length &&\n this.#getMenuGroupByCurrentPath(pinnedChildren)?.length &&\n this.#isFirstBindingMenu() &&\n this.idMenuGroupActive() !== this.pinnedMenuGroup()?.id;\n\n if (isPinnedPathMatchValid) {\n const pinned = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(pinned.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(pinned.id ?? '');\n this.titleMenuGroup.set(pinned.title);\n this.#setMenusByGroup(pinnedChildren);\n this.#expandParentNodesByCurrentPath(pinnedChildren);\n return;\n }\n\n let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\n // Nếu không tìm được path nào khớp với menu\n if (!menuGroupByPath?.length) {\n const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\n // Nếu có pinned group thì hiện mậc định là pinnedMenuGroup\n if (this.sidebar()?.pin?.enabled && lastActiveId === this.pinnedMenuGroup()?.id && pinnedChildren?.length) {\n const pinned = this.pinnedMenuGroup();\n this.idMenuGroupActive.set(pinned.id);\n this.titleMenuGroup.set(pinned.title);\n this.#setMenusByGroup(pinnedChildren);\n this.#expandParentNodesByCurrentPath(pinnedChildren);\n return;\n }\n // Nếu không có pinnedMenuGroup thì menuGroup lấy từ thao tác cuối cùng của người dùng\n menuGroupByPath = this.menus()?.filter(menu => menu?.id === lastActiveId) || [];\n }\n\n // Kiểm tra lại menuGroupPath đã thực sự tìm được chưa?\n if (menuGroupByPath?.length) {\n // Nếu user đang ở pinedGroup và curentPath có chứa trong pinnedMenuGroup thì return luôn, không chuyển sang menuGroup mới\n if (\n this.sidebar()?.pin?.enabled &&\n this.idMenuGroupActive() === this.pinnedMenuGroup()?.id &&\n this.#getMenuGroupByCurrentPath(pinnedChildren)?.length\n ) {\n return;\n } else {\n const matchedGroup = menuGroupByPath[0];\n this.idMenuGroupActive.set(matchedGroup?.id);\n this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\n this.titleMenuGroup.set(matchedGroup?.tooltipTitle || matchedGroup?.title);\n\n if ('children' in matchedGroup && matchedGroup.children?.length) {\n this.menusByGroup.set(matchedGroup.children);\n this.#expandParentNodesByCurrentPath(this.menusByGroup());\n } else {\n this.menusByGroup.set([]);\n }\n }\n } else {\n this.idMenuGroupActive.set('');\n this.titleMenuGroup.set('');\n this.menusByGroup.set([]);\n }\n\n this.dataSource.data = this.menusByGroup();\n }\n };\n\n #expandParentNodesByCurrentPath(menus: SdLayoutMenu[]): boolean {\n let shouldPropagate = false;\n for (const menu of menus) {\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n shouldPropagate = true;\n }\n if ('children' in menu && menu.children?.length) {\n const childHasMatch = this.#expandParentNodesByCurrentPath(menu.children);\n if (childHasMatch) {\n this.treeControl.expand(menu);\n shouldPropagate = true;\n }\n }\n }\n return shouldPropagate;\n }\n\n #filterMenuBySearchText = (menus: SdLayoutMenu[]): void => {\n const validSearchText = this.#getValidSearchText();\n if (!validSearchText) {\n this.dataSource.data = menus;\n this.#onCollapseAllMenuNodes(menus);\n this.#expandParentNodesByCurrentPath(menus);\n } else {\n const aliasSearchText = StringUtilities.changeAliasLowerCase(validSearchText);\n this.dataSource.data = this.#getMenuByAliasSearchText(menus, aliasSearchText);\n if (this.dataSource.data?.length) {\n this.#onExpandAllMenuNodes(this.dataSource.data);\n }\n }\n };\n\n #getMenuByAliasSearchText = (menus: SdLayoutMenu[], aliasSearchText: string): SdLayoutMenu[] => {\n const result: SdLayoutMenu[] = [];\n for (const menu of menus) {\n const aliasTitle = StringUtilities.changeAliasLowerCase(menu.title as string);\n\n if (aliasTitle.includes(aliasSearchText)) {\n result.push(menu);\n continue;\n }\n\n let matchedChildren: SdLayoutMenu[] = [];\n if ('children' in menu && menu.children?.length) {\n matchedChildren = this.#getMenuByAliasSearchText(menu.children, aliasSearchText);\n }\n\n if (matchedChildren?.length) {\n result.push({ ...menu, children: matchedChildren });\n }\n }\n return result;\n };\n\n #isMenuPathMatchByCurrentPath = (path: string): boolean => {\n if (!path) {\n return false;\n }\n\n if (this.currentPath() === path) {\n return true;\n }\n\n return this.#normalizePath(this.currentPath()).startsWith(this.#normalizePath(path));\n };\n\n #normalizePath = (p: string): string => (p.endsWith('/') ? p : p + '/');\n\n #closeMenu(): void {\n this.showSideBar.emit(null);\n }\n\n #convertColor = (input: string | undefined, opacity = 1): string => {\n if (!input) {\n return '';\n }\n\n input = input.trim();\n const hexRegex = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n const rgbRegex = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/i;\n\n if (hexRegex.test(input)) {\n let hex = input.slice(1);\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map(c => c + c)\n .join('');\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n\n const rgbMatch = input.match(rgbRegex);\n if (rgbMatch) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, r, g, b] = rgbMatch;\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n }\n\n return input;\n };\n\n #getValidSearchText = (): string => {\n const normalized = this.#normalizeSearchText(this.searchText());\n return normalized && normalized.length >= 2 ? normalized : '';\n };\n\n #normalizeSearchText = (searchText: string) => {\n let str: string = searchText?.toString() ?? '';\n /* eslint-disable no-useless-escape */\n str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\n str = str.replace(/ + /g, ' ');\n return str.trim();\n };\n\n #getTotalMenus = (menus: SdLayoutMenu[]): number => {\n return menus.reduce((total, menu) => total + this.#countMenuChildrenNode(menu), 0);\n };\n\n #countMenuChildrenNode = (menu: SdLayoutMenu): number => {\n if (!('children' in menu) || !menu.children?.length) {\n return 0;\n }\n\n let count = menu.children.length;\n for (const child of menu.children) {\n count += this.#countMenuChildrenNode(child);\n }\n return count;\n };\n}\n","@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar) {\n <div class=\"wrapper\" [style.height]=\"isMobileOrTablet ? screenHeight + 'px' : '100%'\">\n <div class=\"c-header\">\n @if (_sidebar.logoUrl) {\n <div class=\"c-logo\">\n <a href=\"javascript:;\" (click)=\"openHomePage()\">\n <img alt=\"logo\" [src]=\"_sidebar.logoUrl\" />\n </a>\n </div>\n }\n <div class=\"c-title-menu-group\">\n <span>{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\n </div>\n </div>\n <div class=\"c-body\">\n <div class=\"c-menu\">\n <div class=\"c-menu-group\">\n @if (_sidebar?.pin?.enabled && pinnedMenuGroup().children?.length) {\n <button\n (mouseenter)=\"onMouseOverMenuGroupNode($event, pinnedMenuGroup())\"\n (mouseleave)=\"onMouseLeaveMenuGroupNode($event, pinnedMenuGroup())\"\n (click)=\"expandPinnedGroup()\"\n [matTooltip]=\"'Đã ghim'\"\n [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\n [matTooltipPosition]=\"'right'\"\n style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\n <mat-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color: isPinnedMenuGroupActive() ? _sidebar.brandColor || '#2962FF' : '#8C8C8C',\n backgroundColor: isPinnedMenuGroupActive() ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\n }\">\n push_pin\n </mat-icon>\n </button>\n }\n @for (nodeMenuGroup of menus(); track nodeMenuGroup.id) {\n <button\n (mouseenter)=\"onMouseOverMenuGroupNode($event, nodeMenuGroup)\"\n (mouseleave)=\"onMouseLeaveMenuGroupNode($event, nodeMenuGroup)\"\n (click)=\"expandMenuGroup(nodeMenuGroup)\"\n [matTooltip]=\"nodeMenuGroup.tooltipTitle || nodeMenuGroup.title\"\n [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\n [matTooltipPosition]=\"'right'\"\n style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\n @if (nodeMenuGroup.iconUrl) {\n <span\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n backgroundColor: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\n }\">\n <img width=\"24px\" height=\"24px\" [src]=\"nodeMenuGroup.iconUrl\" [alt]=\"nodeMenuGroup.title\" />\n </span>\n } @else {\n <mat-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandColor || '#2962FF' : '#8C8C8C',\n backgroundColor: idMenuGroupActive() === nodeMenuGroup?.id ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\n }\">\n {{ nodeMenuGroup.icon || 'widgets' }}\n </mat-icon>\n }\n </button>\n }\n </div>\n <div class=\"c-menu-tree\">\n @if (totalMenuInMenusByGroup() >= 10) {\n <div style=\"padding: 0px 4px\" class=\"c-menu-tree-search\">\n <sd-input size=\"sm\" [placeholder]=\"'core.module.layout.sidebar.search' | translate\" [model]=\"searchText()\" (sdChange)=\"onFilterSearchText($event)\">\n <ng-template sdSuffixDef>\n @if (searchText()) {\n <mat-icon class=\"c-search-prefix-icon cancel\" (click)=\"onClearSearchText()\">cancel</mat-icon>\n } @else {\n <mat-icon class=\"c-search-prefix-icon search\">search</mat-icon>\n }\n </ng-template>\n </sd-input>\n </div>\n }\n <div class=\"c-menu-tree-container\">\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" [style.backgroundColor]=\"'transparent'\">\n <mat-nested-tree-node *matTreeNodeDef=\"let node; when: !hasChild\">\n <li\n class=\"c-menu-node\"\n (mouseenter)=\"onMouseOverMenuNode($event, node)\"\n (mouseleave)=\"onMouseLeaveMenuNode($event, node)\"\n [ngStyle]=\"{\n backgroundColor: (currentPath() | menuFocus: node) ? _sidebar.brandLightColor || '#F8F9FA' : 'transparent',\n }\">\n <div aria-hidden=\"true\" class=\"c-menu-node-description\" (click)=\"navigate(node)\" [class.d-none]=\"!isShowSidebar()\">\n <div\n class=\"c-menu-node-description-content\"\n [ngStyle]=\"{\n color: (currentPath() | menuFocus: node) ? _sidebar.brandColor || '#2962FF' : '#1F1F1F',\n }\"\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\n\n @if (_sidebar?.pin?.enabled) {\n <mat-icon\n class=\"c-menu-node-description-icon-pin\"\n [fontSet]=\"isPinnedNode(node) ? 'material-icons' : 'material-icons-outlined'\"\n [style.opacity]=\"isPinnedNode(node) || isHoveredNode(node) ? '1' : null\"\n [style.color]=\"isPinnedNode(node) || isHoveredNode(node) ? sidebar().brandColor || '#2962FF' : null\"\n (click)=\"onTogglePin($event, node)\"\n >push_pin\n </mat-icon>\n }\n </div>\n </li>\n </mat-nested-tree-node>\n\n <mat-nested-tree-node\n *matTreeNodeDef=\"let node; when: hasChild\"\n aria-hidden=\"true\"\n [class]=\"{ expanded: treeControl.isExpanded(node), isfocus: currentPath() | menuFocus: node }\">\n <li>\n <div\n class=\"c-menu-node\"\n (mouseenter)=\"onMouseOverMenuNode($event, node)\"\n (mouseleave)=\"onMouseLeaveMenuNode($event, node)\">\n <div class=\"d-flex align-items-center\" style=\"gap: 10px; width: 100%\">\n <div [class.d-none]=\"!isShowSidebar()\" class=\"c-menu-node-description\" (click)=\"onToggleMenuNode(node)\">\n <div\n class=\"c-menu-node-description-content\"\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\n <mat-icon class=\"c-menu-node-description-icon-expand\">\n {{ treeControl.isExpanded(node) ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\n </mat-icon>\n </div>\n </div>\n </div>\n <ul class=\"p-0\" [class.d-none]=\"!treeControl.isExpanded(node)\">\n <ng-container matTreeNodeOutlet></ng-container>\n </ul>\n </li>\n </mat-nested-tree-node>\n </mat-tree>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"c-footer\">\n <lib-layout-user\n [userInfo]=\"_userInfo\"\n [isMobileOrTablet]=\"isMobileOrTablet\"\n (menuOpened)=\"onUserMenuOpened()\"\n (menuClosed)=\"onUserMenuClosed()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (toggleMenuLock)=\"toggleMenuLock($event)\">\n </lib-layout-user>\n </div>\n\n <div class=\"c-vertical\"></div>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\n\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\n\n@Component({\n selector: 'sidebar-v1',\n templateUrl: './main.component.html',\n styleUrls: ['./main.component.scss'],\n imports: [MatSidenavModule, CommonModule, SidebarComponent],\n standalone: true,\n})\nexport class SidebarV1Component {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #layoutStorageService = inject(SdLayoutStorageService);\n\n // ==========================================\n // VIEW CHILD & INPUTS\n // ==========================================\n sidenav = viewChild.required<MatSidenav>('sidenav');\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n isMobileOrTablet = signal<boolean>(BrowserUtilities.isMobile());\n\n // Trạng thái khóa menu (luôn mở rộng hay không)\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n\n // Trạng thái hiển thị (mở/đóng) của Sidenav\n isShowSidebar = signal<boolean>(BrowserUtilities.isMobile() ? false : (this.#layoutStorageService.menuLockStatus?.get() ?? true));\n\n onhover = signal<boolean>(false);\n\n // ==========================================\n // PRIVATE TIMERS\n // ==========================================\n #timerMouseInMenu: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n // EFFECT: Tự động đồng bộ isShowSidebar vào storage service mỗi khi nó thay đổi\n effect(() => {\n const isShow = this.isShowSidebar();\n untracked(() => {\n this.#layoutStorageService.isShowSidebar.set(isShow);\n });\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n\n #mouseLeave = (): void => {\n if (this.#timerMouseInMenu) {\n clearTimeout(this.#timerMouseInMenu);\n }\n\n if (this.onhover() && this.isShowSidebar()) {\n this.isShowSidebar.set(false);\n this.onhover.set(false);\n }\n };\n\n #handleMouseLeaveTransition = (): void => {\n if (!this.isShowSidebar()) {\n const delayTime = 400;\n if (this.#timerMouseInMenu) {\n clearTimeout(this.#timerMouseInMenu);\n }\n setTimeout(() => {\n this.#mouseLeave();\n }, delayTime);\n } else {\n this.#mouseLeave();\n }\n };\n\n openSidebar = (): void => {\n if (!this.isMobileOrTablet()) {\n return;\n }\n\n if (!this.isShowSidebar()) {\n this.isShowSidebar.set(true);\n this.onhover.set(true);\n }\n };\n\n onPopupOfSideBarOpened = (): void => {\n this.onhover.set(false);\n this.isShowSidebar.set(true);\n };\n\n onPopupOfSideBarClosed = (): void => {\n const delayTime = 500;\n if (!this.isMenuLock()) {\n this.onhover.set(true);\n setTimeout(() => {\n this.#mouseLeave();\n }, delayTime);\n }\n };\n\n onExpandSideBar = (): void => {\n if (this.isMobileOrTablet()) {\n return;\n }\n if (!this.isShowSidebar()) {\n this.isShowSidebar.set(true);\n this.onhover.set(true);\n }\n };\n\n onMouseleaveSideBar = (): void => {\n if (this.isMobileOrTablet()) {\n return;\n }\n this.#mouseLeave();\n };\n\n onToggle = (data: boolean | null) => {\n if (data === null) {\n this.#handleMouseLeaveTransition();\n } else {\n this.#mouseLeave();\n this.isShowSidebar.set(data);\n this.isMenuLock.set(data);\n\n // Toggle component MatSidenav\n const sidenavComp = this.sidenav();\n if (sidenavComp) {\n data ? sidenavComp.open() : sidenavComp.close();\n }\n }\n };\n}\n","<mat-sidenav-container class=\"c-layout-wrapper\">\n <mat-sidenav\n #sidenav\n [opened]=\"isShowSidebar()\"\n (openedChange)=\"isShowSidebar.set($event)\"\n class=\"c-layout-sidebar\"\n (click)=\"openSidebar()\"\n (mouseleave)=\"onMouseleaveSideBar()\"\n [mode]=\"isMobileOrTablet() ? 'over' : 'side'\"\n [fixedInViewport]=\"isMobileOrTablet()\">\n <sidebar\n [menus]=\"menus()\"\n [userInfo]=\"userInfo()\"\n [sidebar]=\"sidebar()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (showSideBar)=\"onToggle($event)\"\n (expandSideBar)=\"onExpandSideBar()\"\n (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\n (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\">\n </sidebar>\n </mat-sidenav>\n\n <mat-sidenav-content class=\"c-layout-content\" [class.isShowSidebar]=\"isMenuLock()\">\n <mat-drawer-container class=\"c-mat-drawer-container\">\n <mat-drawer-content>\n <ng-content></ng-content>\n </mat-drawer-content>\n </mat-drawer-container>\n </mat-sidenav-content>\n</mat-sidenav-container>","import { Component, inject, input, output, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n// Import sd-core\nimport { SdAvatar } from '@sdcorejs/angular/components';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../../../../configurations';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrls: ['./user.component.scss'],\n imports: [MatMenuModule, MatButtonModule, MatIconModule, MatTooltipModule, SdAvatar, TranslatePipe],\n standalone: true,\n})\nexport class LayoutUserComponent {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\n\n // ==========================================\n // SIGNAL INPUTS & OUTPUTS\n // ==========================================\n isMobileOrTablet = input<boolean>(false);\n isMenuLock = input<boolean>(false);\n isShowSidebar = input<boolean>(false);\n userInfo = input.required<SdLayoutUserInfo>();\n\n menuClosed = output<void>();\n menuOpened = output<void>();\n toggleMenuLock = output<Event>();\n\n // Config actions\n singoutLayoutConfig = this.#layoutConfiguration.signout;\n changePasswordLayoutConfig = this.#layoutConfiguration?.changePassword;\n\n // Accordion state for mobile inline expand\n isExpanded = signal<boolean>(false);\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n onMenuOpened = (): void => {\n this.menuOpened.emit();\n };\n\n onMenuClosed = (): void => {\n this.menuClosed.emit();\n };\n\n keepOpenWhenClickInsideMenu = (event: Event): void => {\n event.stopPropagation();\n };\n\n toggleExpanded = (): void => {\n this.isExpanded.update(v => !v);\n if (this.isExpanded()) {\n this.menuOpened.emit();\n } else {\n this.menuClosed.emit();\n }\n };\n\n logout = (): void => {\n this.singoutLayoutConfig();\n };\n\n changePassword = (): void => {\n this.changePasswordLayoutConfig?.();\n };\n\n onToggleMenuLock = (event: Event): void => {\n this.toggleMenuLock.emit(event);\n };\n}\n\n","@let _userInfo = userInfo();\n@let avatar = _userInfo?.avatar || _userInfo?.fullName || _userInfo?.username || _userInfo?.email;\n\n@if (isMobileOrTablet()) {\n <!-- Mobile: accordion inline expand -->\n <div class=\"m-user-card\">\n <button class=\"m-user-row\" (click)=\"toggleExpanded()\">\n <sd-avatar [src]=\"avatar\" [size]=\"44\"></sd-avatar>\n <div class=\"m-user-info\">\n <span class=\"m-user-name\">{{ _userInfo?.fullName || _userInfo?.username }}</span>\n @if (_userInfo?.email) {\n <span class=\"m-user-email\">{{ _userInfo?.email }}</span>\n }\n </div>\n <mat-icon class=\"m-expand-icon\" [class.m-expand-icon--open]=\"isExpanded()\">\n keyboard_arrow_down\n </mat-icon>\n </button>\n\n @if (isExpanded()) {\n <div class=\"m-user-body\">\n @if (changePasswordLayoutConfig) {\n <button class=\"m-user-action\" (click)=\"changePassword()\">\n <mat-icon>lock_outline</mat-icon>\n <span>{{ 'core.module.layout.user.change-password' | translate }}</span>\n </button>\n }\n <button class=\"m-user-action m-user-action--logout\" (click)=\"logout()\">\n <mat-icon>logout</mat-icon>\n <span>{{ 'core.module.layout.user.logout' | translate }}</span>\n </button>\n </div>\n }\n </div>\n} @else {\n <!-- Desktop: chỉ hiển thị avatar + nút toggle -->\n <div class=\"c-layout-user-wrapper\">\n <div class=\"c-layout-user-avatar\" [matMenuTriggerFor]=\"userMenu\" (menuClosed)=\"onMenuClosed()\" (menuOpened)=\"onMenuOpened()\">\n <sd-avatar [src]=\"avatar\" [size]=\"32\"></sd-avatar>\n </div>\n\n <div aria-hidden=\"true\" mat-mini-fab class=\"c-layout-icon-toggle\" (click)=\"onToggleMenuLock($event)\">\n <mat-icon style=\"color: #8c8c8c\">\n {{ isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left' }}\n </mat-icon>\n </div>\n </div>\n}\n\n<mat-menu #userMenu=\"matMenu\" xPosition=\"before\" backdropClass=\"c-user-menu-backdrop-f90ce131-fa4c-4f71-a49b-ab7fa374fdd0\">\n <div aria-hidden=\"true\" class=\"c-user-menu-wrapper\" (click)=\"keepOpenWhenClickInsideMenu($event)\">\n <div class=\"c-user-info-wrapper\">\n <div class=\"c-user-avatar\">\n <sd-avatar [src]=\"avatar\" [size]=\"40\"></sd-avatar>\n </div>\n <span class=\"c-user-name\">{{ _userInfo?.fullName || _userInfo?.username }}</span>\n <span class=\"c-user-email\">{{ _userInfo?.email }}</span>\n </div>\n\n @if (changePasswordLayoutConfig) {\n <div class=\"c-sign-button-wrapper\">\n <button class=\"c-account-options\" (click)=\"changePassword()\">\n <mat-icon fontSet=\"material-icons-outlined\">lock</mat-icon>\n <span>{{ 'core.module.layout.user.change-password' | translate }}</span>\n </button>\n </div>\n }\n\n <div class=\"c-sign-button-wrapper\">\n <button class=\"c-sign-button\" mat-flat-button (click)=\"logout()\">{{ 'core.module.layout.user.logout' | translate }}</button>\n </div>\n </div>\n</mat-menu>\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\n\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\n\n@Component({\n selector: 'sd-sidebar-mobile-overlay',\n standalone: true,\n imports: [\n CommonModule,\n RouterModule,\n MatIconModule,\n LayoutUserComponent,\n ],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n})\nexport class SidebarMobileOverlayComponent {\n #router = inject(Router);\n #destroyRef = inject(DestroyRef);\n #layoutStorageService = inject(SdLayoutStorageService);\n\n // ==========================================\n // INPUTS & OUTPUTS\n // ==========================================\n isShowSidebar = input<boolean>(false);\n menus = input.required<SdLayoutMenu[]>();\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n\n // showSideBar(null) = đóng sidebar (tương thích với onToggle của main component)\n showSideBar = output<boolean | null>();\n expandSideBar = output<void>();\n popupUserMenuOpened = output<void>();\n popupUserMenuClosed = output<void>();\n titleMenuGroupChanged = output<string | undefined>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n titleMenuGroup = signal<string | undefined>('');\n currentPath = signal<string>(window.location.pathname);\n\n // Lưu danh sách ID các menu group đang được mở\n expandedMobileGroups = signal<Set<string>>(new Set<string>());\n\n constructor() {\n // Bind title khi menus thay đổi\n effect(() => {\n const currentMenus = this.menus();\n untracked(() => {\n const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\n if (!lastActiveMenuGroupId) {\n this.#layoutStorageService.lastActiveMenuGroupId.set(currentMenus?.[0]?.id ?? '');\n }\n this.#bindingMenuGroupByCurrentPath(currentMenus);\n });\n });\n\n // Bind title khi điều hướng\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) {\n if (this.currentPath() !== window.location.pathname) {\n this.currentPath.set(window.location.pathname);\n this.#bindingMenuGroupByCurrentPath(this.menus());\n }\n }\n });\n }\n\n // ==========================================\n // EVENT HANDLERS\n // ==========================================\n toggleMobileGroup(groupId: string | undefined): void {\n if (!groupId) return;\n this.expandedMobileGroups.update(groups => {\n const newGroups = new Set(groups);\n if (newGroups.has(groupId)) {\n newGroups.delete(groupId);\n } else {\n newGroups.add(groupId);\n }\n return newGroups;\n });\n }\n\n isExpanded(groupId: string | undefined): boolean {\n if (!groupId) return false;\n return this.expandedMobileGroups().has(groupId);\n }\n\n navigate(args: { path?: string; queryParams?: Params }): void {\n const { path, queryParams } = args;\n if (!path) return;\n\n if (path.includes('http')) {\n window.open(path);\n return;\n }\n\n this.#router.navigate([path.split('?')[0]], {\n queryParams: queryParams ?? {},\n state: { switchTab: true },\n });\n\n // Sau khi điều hướng trên mobile, tự động đóng sidebar\n this.onClose();\n }\n\n onClose(): void {\n this.showSideBar.emit(null);\n }\n\n // Kiểm tra menu có children (là SdLayoutChildrenMenu)\n hasChildren(menu: SdLayoutMenu): boolean {\n return 'children' in menu && !!menu.children?.length;\n }\n\n // Lấy danh sách children an toàn (type-safe)\n getChildren(menu: SdLayoutMenu): SdLayoutMenu[] {\n return 'children' in menu ? (menu.children ?? []) : [];\n }\n\n // Lấy path an toàn từ leaf menu (SdLayoutRootMenu)\n getPath(menu: SdLayoutMenu): string | undefined {\n return 'path' in menu ? menu.path : undefined;\n }\n\n // Lấy queryParams an toàn từ leaf menu\n getQueryParams(menu: SdLayoutMenu): Params {\n return ('queryParams' in menu ? menu.queryParams : undefined) ?? {};\n }\n\n onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\n onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\n\n // ==========================================\n // PRIVATE LOGIC\n // ==========================================\n #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\n let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\n\n if (!menuGroupByPath?.length) {\n const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\n menuGroupByPath = menus?.filter(menu => menu?.id === lastActiveId) || [];\n }\n\n if (menuGroupByPath?.length) {\n const matchedGroup = menuGroupByPath[0];\n this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\n const title = matchedGroup?.tooltipTitle || matchedGroup?.title;\n this.titleMenuGroup.set(title);\n this.titleMenuGroupChanged.emit(title);\n } else {\n this.titleMenuGroup.set('');\n this.titleMenuGroupChanged.emit('');\n }\n };\n\n #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[], menuGroup?: SdLayoutMenu): SdLayoutMenu[] => {\n for (const menu of menus) {\n if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n return [menuGroup ?? menu];\n }\n if ('children' in menu && menu.children?.length) {\n const result = this.#getMenuGroupByCurrentPath(menu.children, menuGroup ?? menu);\n if (result?.length) return result;\n }\n }\n return [];\n };\n\n #isMenuPathMatchByCurrentPath = (path: string): boolean => {\n if (!path) return false;\n if (this.currentPath() === path) return true;\n return this.#normalizePath(this.currentPath()).startsWith(this.#normalizePath(path));\n };\n\n #normalizePath = (p: string): string => p.endsWith('/') ? p : p + '/';\n}\n","@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar) {\n <div\n class=\"m-backdrop\"\n [class.m-backdrop--visible]=\"isShowSidebar()\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"onClose()\"\n (keydown.escape)=\"onClose()\">\n </div>\n\n <div class=\"m-wrapper\" [class.m-wrapper--open]=\"isShowSidebar()\">\n <div class=\"m-header\">\n <div class=\"m-title-group\">\n @if (_sidebar.logoUrl) {\n <img class=\"m-logo\" alt=\"logo\" [src]=\"_sidebar.logoUrl\" />\n }\n <span class=\"m-title\">{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\n </div>\n <button class=\"m-close-btn\" (click)=\"onClose()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"m-user-section\">\n <lib-layout-user\n [userInfo]=\"_userInfo\"\n [isMobileOrTablet]=\"true\"\n (menuOpened)=\"onUserMenuOpened()\"\n (menuClosed)=\"onUserMenuClosed()\">\n </lib-layout-user>\n </div>\n\n <div class=\"m-menu-list\">\n @for (group of menus(); track group.id) {\n <div class=\"m-menu-card\">\n <button class=\"m-card-header\" (click)=\"toggleMobileGroup(group.id)\">\n <div class=\"m-card-header-left\">\n @if (group.iconUrl) {\n <img class=\"m-group-icon\" [src]=\"group.iconUrl\" [alt]=\"group.title\" />\n } @else {\n <mat-icon class=\"m-group-icon\">{{ group.icon || 'widgets' }}</mat-icon>\n }\n <span class=\"m-group-title\">{{ group.title }}</span>\n </div>\n <mat-icon class=\"m-expand-icon\">\n {{ expandedMobileGroups().has(group.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\n </mat-icon>\n </button>\n\n @if (expandedMobileGroups().has(group.id ?? '') && hasChildren(group)) {\n <div class=\"m-card-body\">\n @for (child of getChildren(group); track child.id) {\n @if (hasChildren(child)) {\n <div class=\"m-sub-group\">\n <button class=\"m-sub-group-header\" (click)=\"toggleMobileGroup(child.id)\">\n <div class=\"m-item-left\">\n @if (child.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"child.iconUrl\" alt=\"icon\" />\n } @else {\n <mat-icon class=\"m-item-icon\">{{ child.icon || 'folder' }}</mat-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <mat-icon class=\"m-expand-icon\">\n {{ expandedMobileGroups().has(child.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down' }}\n </mat-icon>\n </button>\n @if (expandedMobileGroups().has(child.id ?? '')) {\n @for (subChild of getChildren(child); track subChild.id) {\n <button class=\"m-menu-item m-menu-item--indented\"\n (click)=\"navigate({ path: getPath(subChild), queryParams: getQueryParams(subChild) })\">\n <div class=\"m-item-left\">\n @if (subChild.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"subChild.iconUrl\" alt=\"icon\" />\n } @else {\n <mat-icon class=\"m-item-icon\">{{ subChild.icon || 'insert_drive_file' }}</mat-icon>\n }\n <span class=\"m-item-title\">{{ subChild.title }}</span>\n </div>\n <mat-icon class=\"m-nav-icon\">chevron_right</mat-icon>\n </button>\n }\n }\n </div>\n } @else {\n <button class=\"m-menu-item\" (click)=\"navigate({ path: getPath(child), queryParams: getQueryParams(child) })\">\n <div class=\"m-item-left\">\n @if (child.iconUrl) {\n <img class=\"m-item-icon-img\" [src]=\"child.iconUrl\" alt=\"icon\" />\n } @else {\n <mat-icon class=\"m-item-icon\">{{ child.icon || 'insert_drive_file' }}</mat-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <mat-icon class=\"m-nav-icon\">chevron_right</mat-icon>\n </button>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input, signal, untracked } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\nimport { SidebarMobileOverlayComponent } from './components/sidebar/sidebar.component';\n\n@Component({\n selector: 'sidebar-mobile-v1',\n templateUrl: './main.component.html',\n styleUrls: ['./main.component.scss'],\n imports: [MatIconModule, CommonModule, SidebarMobileOverlayComponent],\n standalone: true,\n})\nexport class SidebarMobileV1Component {\n #layoutStorageService = inject(SdLayoutStorageService);\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV1>();\n\n // Sidebar luôn bắt đầu đóng trên mobile\n isShowSidebar = signal<boolean>(false);\n titleMenuGroup = signal<string | undefined>('');\n\n constructor() {\n effect(() => {\n const isShow = this.isShowSidebar();\n untracked(() => {\n this.#layoutStorageService.isShowSidebar.set(isShow);\n });\n });\n }\n\n openSidebar = (): void => {\n this.isShowSidebar.set(true);\n };\n\n onToggle = (_data: boolean | null): void => {\n this.isShowSidebar.set(false);\n };\n\n onPopupOfSideBarOpened = (): void => {};\n onPopupOfSideBarClosed = (): void => {};\n onExpandSideBar = (): void => {};\n onMouseleaveSideBar = (): void => {};\n onTitleMenuGroupChanged = (title: string | undefined): void => {\n this.titleMenuGroup.set(title);\n };\n}\n","<div class=\"c-mobile-layout\">\n <div class=\"c-mobile-topbar\">\n <div class=\"c-topbar-brand\">\n @if (sidebar().logoUrl) {\n <img class=\"c-topbar-logo\" [src]=\"sidebar().logoUrl\" alt=\"logo\" />\n }\n <span class=\"c-topbar-title\">{{ titleMenuGroup() || sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n <button class=\"c-hamburger-btn\" (click)=\"openSidebar()\">\n <mat-icon>menu</mat-icon>\n </button>\n </div>\n\n <div class=\"c-mobile-content\">\n <ng-content></ng-content>\n </div>\n\n <sd-sidebar-mobile-overlay\n [menus]=\"menus()\"\n [userInfo]=\"userInfo()\"\n [sidebar]=\"sidebar()\"\n [isShowSidebar]=\"isShowSidebar()\"\n (showSideBar)=\"onToggle($event)\"\n (expandSideBar)=\"onExpandSideBar()\"\n (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\n (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\"\n (titleMenuGroupChanged)=\"onTitleMenuGroupChanged($event)\">\n </sd-sidebar-mobile-overlay>\n</div>\n","import {Component, computed, inject, input, signal } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n// Import nội bộ trong module layout\nimport { SdLayoutMenu, SdLayoutService } from '../../services';\nimport { MenuPipe } from '../../pipes';\nimport { SidebarV1Component } from '../sidebar-v1/main.component';\nimport { SidebarMobileV1Component } from '../sidebar-mobile-v1/main.component';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\n\n@Component({\n selector: 'sd-layout',\n templateUrl: './layout-main.component.html',\n styleUrls: ['./layout-main.component.scss'],\n imports: [SidebarV1Component, SidebarMobileV1Component, NgTemplateOutlet],\n standalone: true,\n})\nexport class SdLayoutComponent {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #menuPipe = inject(MenuPipe);\n #layoutService = inject(SdLayoutService);\n\n // ==========================================\n // SIGNAL INPUTS\n // ==========================================\n menusInput = input<SdLayoutMenu[]>([], { alias: 'menus' });\n menus = computed(() => this.#menuPipe.transform(this.menusInput() || []));\n\n // ==========================================\n // CONSUME SHARED STATE\n // ==========================================\n userInfo = this.#layoutService.userInfo;\n sidebar = this.#layoutService.sidebar;\n\n isMobileOrTablet = signal(BrowserUtilities.isMobile());\n}\n","<ng-template #projectedContent>\n <ng-content></ng-content>\n</ng-template>\n\n@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar?.version === 1) {\n @if (!isMobileOrTablet()) {\n <sidebar-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebar!\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-v1>\n } @else {\n <sidebar-mobile-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebar!\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-mobile-v1>\n }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18N_STORAGE_KEY, I18N_MESSAGES, I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Language } from '@sdcorejs/angular/models';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\nimport { ActivatedRoute } from '@angular/router';\n// End\n\n@Component({\n selector: 'app-home-page',\n imports: [SdPageComponent, TranslatePipe, MatIconModule],\n templateUrl: './home-page.component.html',\n styleUrls: ['./home-page.component.scss'],\n standalone: true,\n})\n@SdTabComponent({\n component: HomePageComponent,\n // WHY: decorator chạy trước Angular DI, nên không inject được I18nService.\n // Đọc ngôn ngữ hiện tại trực tiếp từ localStorage + I18N_MESSAGES để có giá trị đã dịch.\n name: () => {\n const lang = ((): Language => {\n try {\n const stored = localStorage.getItem(I18N_STORAGE_KEY) as Language | null;\n if (stored) return stored;\n } catch { /* ignore */ }\n return 'vi';\n })();\n return I18N_MESSAGES[lang]?.['core.module.layout.home.tab-name'] ?? I18N_MESSAGES.vi['core.module.layout.home.tab-name'];\n },\n icon: 'home',\n color: 'primary',\n})\nexport class HomePageComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // Map Language code → BCP 47 locale tag dùng cho Intl date formatting\n // WHY: must be declared before todayInfo — field init runs top-to-bottom; #getTodayInfo reads #localeMap.\n readonly #localeMap: Record<Language, string> = {\n vi: 'vi-VN',\n en: 'en-US',\n ja: 'ja-JP',\n ko: 'ko-KR',\n zh: 'zh-CN',\n };\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n\n // WHY: static data, không cần signal. `storage` + `schema` thay cho `database` + `account_tree`\n // để đảm bảo render trên mọi version của Material Icons mặc định.\n readonly features = [\n { icon: 'storage', key: 'core.module.layout.home.feature.data', area: 'data' },\n { icon: 'insights', key: 'core.module.layout.home.feature.reports', area: 'report' },\n { icon: 'group', key: 'core.module.layout.home.feature.users', area: 'users' },\n { icon: 'schema', key: 'core.module.layout.home.feature.workflow', area: 'flow' },\n { icon: 'verified_user', key: 'core.module.layout.home.feature.audit', area: 'audit' },\n { icon: 'hub', key: 'core.module.layout.home.feature.integration', area: 'integ' },\n ] as const;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n\n #getTimezone() {\n const now = new Date();\n const timezoneOffset = now.getTimezoneOffset();\n const offsetHours = -timezoneOffset / 60;\n const sign = offsetHours >= 0 ? '+' : '';\n const simpleGmtString = `GMT${sign}${offsetHours}`;\n return simpleGmtString;\n }\n\n #getTodayInfo(date: Date) {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n // WHY: dùng locale theo ngôn ngữ hiện tại để định dạng số (dd/mm/yyyy vs mm/dd/yyyy ...)\n const locale = this.#localeMap[this.#i18n.language()] ?? 'vi-VN';\n const dateStr = date.toLocaleDateString(locale, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n const formatted = this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n return `${formatted} (${this.#getTimezone()})`;\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">\n {{ 'core.module.layout.greeting.hello' | translate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}\n </div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n\n <div class=\"wrapper\">\n <div class=\"bento\">\n <!-- Hero -->\n <div class=\"card hero-card\">\n <div class=\"hero-ring ring-3\"></div>\n <div class=\"hero-ring ring-2\"></div>\n <div class=\"hero-ring ring-1\"></div>\n <div class=\"hero-core\">\n <mat-icon class=\"hero-icon\">space_dashboard</mat-icon>\n </div>\n <div class=\"hero-decoration\">\n <span class=\"dot d1\"></span>\n <span class=\"dot d2\"></span>\n <span class=\"dot d3\"></span>\n </div>\n </div>\n\n <!-- Features -->\n @for (feature of features; track feature.key; let i = $index) {\n <div\n class=\"card feature-card\"\n [class.feature-wide]=\"feature.area === 'audit' || feature.area === 'integ'\"\n [style.gridArea]=\"feature.area\"\n [style.animation-delay.ms]=\"(i + 1) * 80\"\n >\n <div class=\"feature-accent\"></div>\n <div class=\"feature-content\">\n <div class=\"feature-icon-wrap\">\n <mat-icon class=\"feature-icon\">{{ feature.icon }}</mat-icon>\n </div>\n <span class=\"feature-label\">{{ feature.key | translate }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n</sd-page>\n","import { Inject, Injectable } from '@angular/core';\nimport { CanActivate, Router } from '@angular/router';\n\n// Giả sử bạn có một service để đọc config\nimport { ISdLayoutConfiguration, SD_LAYOUT_CONFIGURATION } from '../../../configurations';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HomeRedirectGuard implements CanActivate {\n constructor(\n private router: Router,\n @Inject(SD_LAYOUT_CONFIGURATION) private layoutConfiguration: ISdLayoutConfiguration\n ) {}\n\n async canActivate() {\n const homeUrl = this.layoutConfiguration?.homeUrl;\n if (homeUrl) {\n // Nếu có config homeUrl, tạo một UrlTree để redirect\n // Đây là cách redirect chính thống từ trong guard\n return this.router.createUrlTree([homeUrl]);\n }\n // Nếu không có homeUrl, cho phép kích hoạt route\n return true;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { HomePageComponent } from './components/home-page/home-page.component';\nimport { HomeRedirectGuard } from './guards/home-redirect.guard';\n\nconst routes: Routes = [\n {\n path: '',\n canActivate: [HomeRedirectGuard],\n component: HomePageComponent,\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule],\n})\nexport class HomeRoutingModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HomeRoutingModule } from './home.routing';\n\n@NgModule({\n declarations: [],\n imports: [CommonModule, HomeRoutingModule],\n})\nexport class HomeModule {}\n","import { Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { SdButton } from '@sdcorejs/angular/components';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrls: ['./root.component.scss'],\n imports: [SdButton, SdPageComponent, TranslatePipe],\n})\nexport class RootComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #route = inject(ActivatedRoute);\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #getTodayInfo(date: Date): string {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n const dateStr = date.toLocaleDateString('vi-VN', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n return this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n }\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n reload() {\n window.location.href = '';\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">{{ 'core.module.layout.greeting.hello' | translate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}</div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n\n <div class=\"h-full d-flex flex-column align-items-center\">\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\n <img alt=\"not-found\" class=\"sd-image-not-found\" />\n <span class=\"T16M mt-24\">{{ 'core.module.layout.not-found.title' | translate }}</span>\n <span class=\"T16R text-secondary mt-4\">\n {{ 'core.module.layout.not-found.message' | translate }}\n </span>\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.not-found.back' | translate\" prefixIcon=\"arrow_back\"> </sd-button>\n </div>\n </div>\n</sd-page>\n","import { Route } from '@angular/router';\nimport { RootComponent } from './pages/root/root.component';\n\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './not-found.routing';\n\n@NgModule({\n imports: [CommonModule, RouterModule.forChild(Routes)],\n exports: [],\n})\nexport class NotFoundModule {}\n","import { Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { SdButton } from '@sdcorejs/angular/components';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService, SdLayoutStorageService } from '../../../../services';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrls: ['./root.component.scss'],\n imports: [SdButton, SdPageComponent, TranslatePipe],\n})\nexport class RootComponent {\n // ==========================================\n // INJECT SERVICES (Modern Angular)\n // ==========================================\n readonly #route = inject(ActivatedRoute);\n readonly #layoutService = inject(SdLayoutService);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // SIGNALS (STATE)\n // ==========================================\n // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\n readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n userInfo = this.#layoutService.userInfo;\n // ==========================================\n // PRIVATE METHODS\n // ==========================================\n #getTodayInfo(date: Date): string {\n // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n const dateStr = date.toLocaleDateString('vi-VN', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n return this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n }\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n reload() {\n window.location.href = '';\n }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n <div class=\"d-flex flex-column\" headerLeft>\n <div class=\"font-weight-medium fs-20\">{{ 'core.module.layout.greeting.hello' | translate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}</div>\n <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n </div>\n <div class=\"h-full d-flex flex-column align-items-center\">\n <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\n <img alt=\"forbidden\" class=\"sd-image-forbidden\" />\n <span class=\"T16M mt-24\">{{ 'core.module.layout.forbidden.title' | translate }}</span>\n <span class=\"T14R text-secondary mt-4\"\n >{{ 'core.module.layout.forbidden.message' | translate }}</span\n >\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.forbidden.back-home' | translate\"> </sd-button>\n </div>\n </div>\n</sd-page>\n","import { Route } from '@angular/router';\nimport { RootComponent } from './pages/root/root.component';\n\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './forbidden.routing';\n\n@NgModule({\n imports: [CommonModule, RouterModule.forChild(Routes)],\n exports: [],\n})\nexport class ForbiddenModule {}\n","import { Route } from '@angular/router';\n\nexport const Routes: Route[] = [\n {\n path: '',\n pathMatch: 'full',\n redirectTo: 'not-found',\n },\n {\n path: 'home',\n loadChildren: () => import('./modules/home').then(m => m.HomeModule),\n },\n {\n path: 'not-found',\n loadChildren: () => import('./modules/not-found').then(m => m.NotFoundModule),\n },\n {\n path: 'forbidden',\n loadChildren: () => import('./modules/forbidden').then(m => m.ForbiddenModule),\n },\n];\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './layout.routing';\n@NgModule({\n declarations: [],\n imports: [RouterModule.forChild(Routes)],\n providers: [],\n})\nexport class SdLayoutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i3","LayoutUserComponent","i2","RootComponent","Routes"],"mappings":"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"}