@sdcorejs/angular 19.1.4 → 19.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/components/preview/src/preview-pdf/pdf-worker-inline.generated.d.ts +7 -0
- package/components/table/src/services/table-export/table-export.service.d.ts +3 -1
- package/components/table/src/table.component.d.ts +1 -1
- package/fesm2022/sdcorejs-angular-components-preview.mjs +31 -2
- package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-table.mjs +18 -3
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs +3 -4
- package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-date.mjs +122 -27
- package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-forms-models.mjs +54 -2
- package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-i18n.mjs +40 -0
- package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +367 -237
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
- package/forms/date/src/date-input.util.d.ts +18 -0
- package/forms/date/src/date.component.d.ts +8 -1
- package/forms/models/index.d.ts +1 -0
- package/forms/models/src/sd-strict-date-adapter.d.ts +26 -0
- package/i18n/src/en.d.ts +8 -0
- package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +6 -1
- package/modules/layout/components/shared/search-field/search-field.component.d.ts +9 -0
- package/modules/layout/components/shared/user-menu/user-menu.component.d.ts +26 -6
- package/modules/layout/components/sidebar-mobile-v1/components/user/user.component.d.ts +3 -11
- package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +1 -0
- package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +3 -9
- package/modules/layout/components/sidebar-v1/main.component.d.ts +1 -0
- package/modules/layout/configurations/layout.configuration.d.ts +42 -3
- package/modules/layout/index.d.ts +1 -0
- package/modules/layout/utils/index.d.ts +1 -0
- package/modules/layout/utils/tab-name.util.d.ts +8 -0
- package/package.json +13 -5
|
@@ -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/menu/menu.utils.ts","../../../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/responsive/responsive.service.ts","../../../projects/sdcorejs-angular/modules/layout/services/navigation-state/navigation-state.service.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/shared/menu-tree/menu-tree.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/menu-tree/menu-tree.component.html","../../../projects/sdcorejs-angular/modules/layout/components/shared/user-menu/user-menu.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/user-menu/user-menu.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v2/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v2/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v2/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v2/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v3/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v3/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v3/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v3/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 styleUrl: './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 { SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutRootMenu } from './menu.model';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\nexport function getMenuStableKey(menu: SdLayoutMenu | null | undefined, ancestors: string[] = []): string {\n if (!menu || typeof menu !== 'object') return '';\n if (typeof menu.id === 'string' && menu.id.trim()) return `id:${menu.id.trim()}`;\n if ('path' in menu && typeof menu.path === 'string' && menu.path.trim()) return `path:${menu.path.trim()}`;\n\n const title = typeof menu.title === 'string' ? menu.title.trim() : '';\n const segments = [...ancestors, title]\n .map(segment => StringUtilities.changeAliasLowerCase(segment).trim().replace(/\\s+/g, '-'))\n .filter(Boolean);\n return segments.length ? `group:${segments.join('/')}` : '';\n}\n\nexport function searchMenuLeaves(menus: SdLayoutMenu[], query: string): SdLayoutRootMenu[] {\n const leaves = flattenMenuLeaves(menus);\n const normalizedQuery = query?.trim();\n if (!normalizedQuery) return leaves;\n return leaves.filter(menu =>\n [menu.title, menu.tooltipTitle].some(value => value && StringUtilities.aliasIncludes(value, normalizedQuery))\n );\n}\n\nexport function selectPrimaryMenuGroups(menus: SdLayoutMenu[], requestedIds: string[] | undefined, maximum = 3): SdLayoutMenu[] {\n const limit = Number.isFinite(maximum) && maximum > 0 ? Math.min(3, Math.floor(maximum)) : 3;\n const byId = new Map(menus.filter(menu => typeof menu.id === 'string').map(menu => [menu.id!, menu]));\n const selected: SdLayoutMenu[] = [];\n const selectedKeys = new Set<string>();\n\n for (const id of requestedIds ?? []) {\n const menu = byId.get(id);\n const key = getMenuStableKey(menu);\n if (!menu || !key || selectedKeys.has(key)) continue;\n selected.push(menu);\n selectedKeys.add(key);\n if (selected.length === limit) return selected;\n }\n\n for (const menu of menus) {\n const key = getMenuStableKey(menu);\n if (!key || selectedKeys.has(key)) continue;\n selected.push(menu);\n selectedKeys.add(key);\n if (selected.length === limit) break;\n }\n return selected;\n}\n\nexport function resolveMenuKeys(menus: SdLayoutMenu[], keys: string[]): (SdLayoutRootMenu | SdLayoutChildrenMenu)[] {\n const menuByKey = new Map<string, SdLayoutMenu>();\n visitMenus(menus, [], (menu, ancestors) => {\n const key = getMenuStableKey(menu, ancestors);\n if (key && !menuByKey.has(key)) menuByKey.set(key, menu);\n });\n return [...new Set(keys)].map(key => menuByKey.get(key)).filter((menu): menu is SdLayoutMenu => !!menu);\n}\n\nexport function flattenMenuLeaves(menus: SdLayoutMenu[]): SdLayoutRootMenu[] {\n const leaves: SdLayoutRootMenu[] = [];\n visitMenus(menus, [], menu => {\n if ('path' in menu && typeof menu.path === 'string' && menu.path) leaves.push(menu);\n });\n return leaves;\n}\n\nfunction visitMenus(\n menus: SdLayoutMenu[] | undefined,\n ancestors: string[],\n visitor: (menu: SdLayoutMenu, ancestors: string[]) => void\n): void {\n for (const menu of menus ?? []) {\n if (!menu || typeof menu !== 'object') continue;\n visitor(menu, ancestors);\n if ('children' in menu && Array.isArray(menu.children)) {\n const title = typeof menu.title === 'string' && menu.title.trim() ? menu.title.trim() : getMenuStableKey(menu, ancestors);\n visitMenus(menu.children, title ? [...ancestors, title] : ancestors, visitor);\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { SdStorage, SdStorageService } from '@sdcorejs/angular/services';\nimport { SdLayoutChildrenMenu, SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdLayoutStorageService {\n readonly #sdStorageService = inject(SdStorageService);\n\n readonly isShowSidebar: SdStorage<boolean> = this.#sdStorageService.create('cb07c316-ed6d-4620-9e92-53dbef6aa983');\n readonly menuLockStatus: SdStorage<boolean> = this.#sdStorageService.create('2c2f4816-18b3-4ec3-8177-7b90bff036c3');\n readonly lastActiveMenuGroupId: SdStorage<string> = this.#sdStorageService.create('2e6961d0-3380-4a94-a6a1-38837560cd96');\n readonly pinnedMenuGroup: SdStorage<SdLayoutChildrenMenu> = this.#sdStorageService.create('e81da122-5dab-4250-b309-64197fb19d44');\n readonly pinnedMenuKeys: SdStorage<string[]> = this.#sdStorageService.create('4bdc7f80-9ff4-4fe0-908f-6c9f7fe4100a');\n readonly recentMenuKeys: SdStorage<string[]> = this.#sdStorageService.create('fb989dc1-f6e7-4b62-a611-861a8f214a51');\n readonly versionStates: SdStorage<Record<string, SdLayoutVersionState>> = this.#sdStorageService.create(\n 'ca8e4261-fbd4-4209-af88-2dbe278c1a1b'\n );\n\n readPinnedMenuKeys(menus: SdLayoutMenu[]): string[] {\n const storedKeys = this.pinnedMenuKeys.has() ? this.pinnedMenuKeys.get() : this.#getLegacyPinnedKeys();\n const validKeys = this.#resolveValidKeys(menus, storedKeys ?? []);\n if (!this.pinnedMenuKeys.has() || !this.#sameKeys(storedKeys ?? [], validKeys)) {\n this.pinnedMenuKeys.set(validKeys);\n }\n return validKeys;\n }\n\n writePinnedMenuKeys(keys: string[]): void {\n this.pinnedMenuKeys.set([...new Set(keys.filter(Boolean))]);\n }\n\n readRecentMenuKeys(menus: SdLayoutMenu[], maximum = 5): string[] {\n const storedKeys = this.recentMenuKeys.get() ?? [];\n const limit = Number.isFinite(maximum) && maximum > 0 ? Math.floor(maximum) : 5;\n const validKeys = this.#resolveValidKeys(menus, storedKeys).slice(0, limit);\n if (!this.#sameKeys(storedKeys, validKeys)) this.recentMenuKeys.set(validKeys);\n return validKeys;\n }\n\n writeRecentMenuKeys(keys: string[]): void {\n this.recentMenuKeys.set([...new Set(keys.filter(Boolean))]);\n }\n\n readVersionState(version: 1 | 2 | 3): SdLayoutVersionState {\n return this.versionStates.get()?.[String(version)] ?? {};\n }\n\n patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): SdLayoutVersionState {\n const states = this.versionStates.get() ?? {};\n const nextState = { ...(states[String(version)] ?? {}), ...patch };\n this.versionStates.set({ ...states, [String(version)]: nextState });\n return nextState;\n }\n\n #getLegacyPinnedKeys(): string[] {\n const legacyGroup = this.pinnedMenuGroup.get();\n if (!legacyGroup || !Array.isArray(legacyGroup.children)) return [];\n return legacyGroup.children.map(menu => getMenuStableKey(menu)).filter(Boolean);\n }\n\n #resolveValidKeys(menus: SdLayoutMenu[], keys: string[]): string[] {\n return resolveMenuKeys(menus, keys)\n .map(menu => getMenuStableKey(menu))\n .filter(Boolean);\n }\n\n #sameKeys(left: string[], right: string[]): boolean {\n return left.length === right.length && left.every((key, index) => key === right[index]);\n }\n}\n\nexport interface SdLayoutVersionState {\n activeGroupKey?: string;\n locked?: boolean;\n collapsed?: boolean;\n}\n","import { InjectionToken } from '@angular/core';\nimport { MaybeAsync } from '@sdcorejs/utils/models';\nexport interface ISdLayoutConfiguration {\n homeUrl?: string;\n mobileBreakpoint?: number;\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 const DEFAULT_LAYOUT_MOBILE_BREAKPOINT = 1024;\n\nexport interface SidebarConfigurationBase {\n brandColor?: string;\n brandLightColor?: string;\n logoUrl?: string;\n defaultTitle?: string;\n pin?: {\n enabled?: boolean;\n };\n}\n\nexport type ISdSidebarConfiguration = SidebarConfigurationV1 | SidebarConfigurationV2 | SidebarConfigurationV3;\n\nexport interface SidebarConfigurationV1 extends SidebarConfigurationBase {\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 interface SidebarConfigurationV2 extends SidebarConfigurationBase {\n version: 2;\n interaction?: 'click' | 'hover-lock';\n primaryMenuIds?: string[];\n}\n\nexport interface SidebarConfigurationV3 extends SidebarConfigurationBase {\n version: 3;\n defaultCollapsed?: boolean;\n recent?: {\n enabled?: boolean;\n maxItems?: number;\n };\n}\n\nexport interface ResolvedSidebarRecentConfiguration {\n enabled: boolean;\n maxItems: number;\n}\n\nexport function normalizeLayoutMobileBreakpoint(value: number | undefined): number {\n if (!Number.isFinite(value) || Number(value) <= 0) {\n return DEFAULT_LAYOUT_MOBILE_BREAKPOINT;\n }\n return Math.floor(Number(value));\n}\n\nexport function resolveSidebarV2Interaction(sidebar: SidebarConfigurationV2): 'click' | 'hover-lock' {\n return sidebar.interaction === 'hover-lock' ? 'hover-lock' : 'click';\n}\n\nexport function resolveSidebarV3Recent(sidebar: SidebarConfigurationV3): ResolvedSidebarRecentConfiguration {\n const configuredLimit = sidebar.recent?.maxItems;\n const maxItems = Number.isFinite(configuredLimit) && Number(configuredLimit) > 0 ? Math.floor(Number(configuredLimit)) : 5;\n return {\n enabled: sidebar.recent?.enabled ?? true,\n maxItems,\n };\n}\n\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV1): SidebarConfigurationV1;\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV2): SidebarConfigurationV2;\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV3): SidebarConfigurationV3;\nexport function normalizeSidebarConfiguration(sidebar: ISdSidebarConfiguration): ISdSidebarConfiguration {\n if (sidebar.version === 2) {\n return {\n ...sidebar,\n interaction: resolveSidebarV2Interaction(sidebar),\n primaryMenuIds: [...new Set((sidebar.primaryMenuIds ?? []).filter(id => typeof id === 'string' && id.trim()))].slice(0, 3),\n };\n }\n if (sidebar.version === 3) {\n return {\n ...sidebar,\n defaultCollapsed: sidebar.defaultCollapsed ?? false,\n recent: resolveSidebarV3Recent(sidebar),\n };\n }\n return sidebar;\n}\n\nexport const SD_LAYOUT_CONFIGURATION = new InjectionToken<ISdLayoutConfiguration>('sd.layout.configuration');\n","import { Injectable, inject } from '@angular/core';\nimport { SD_VIEWPORT, SdViewport, SdViewportService } from '@sdcorejs/angular/services/viewport';\nimport { normalizeLayoutMobileBreakpoint } from '../../configurations';\n\nexport type SdLayoutViewport = SdViewport;\nexport const SD_LAYOUT_VIEWPORT = SD_VIEWPORT;\n\n/** @deprecated Prefer `SdViewportService` from `@sdcorejs/angular/services/viewport`. */\n@Injectable({ providedIn: 'root' })\nexport class SdLayoutResponsiveService {\n readonly #viewport = inject(SdViewportService);\n readonly viewportWidth = this.#viewport.width;\n\n isMobile(breakpoint: number): boolean {\n return this.viewportWidth() < normalizeLayoutMobileBreakpoint(breakpoint);\n }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { ResolvedSidebarRecentConfiguration } from '../../configurations';\nimport { SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\nimport { SdLayoutStorageService, SdLayoutVersionState } from '../storage/storage.service';\n\n@Injectable({ providedIn: 'root' })\nexport class SdLayoutNavigationStateService {\n readonly #storage = inject(SdLayoutStorageService);\n readonly #menus = signal<SdLayoutMenu[]>([]);\n readonly pinnedKeys = signal<string[]>([]);\n readonly recentKeys = signal<string[]>([]);\n readonly pinnedMenus = computed(() => resolveMenuKeys(this.#menus(), this.pinnedKeys()));\n readonly recentMenus = computed(() => resolveMenuKeys(this.#menus(), this.recentKeys()));\n\n hydrate(menus: SdLayoutMenu[], recentMaximum = 5): void {\n this.#menus.set(menus);\n this.pinnedKeys.set(this.#storage.readPinnedMenuKeys(menus));\n this.recentKeys.set(this.#storage.readRecentMenuKeys(menus, recentMaximum));\n }\n\n togglePinned(menu: SdLayoutMenu): void {\n const key = getMenuStableKey(menu);\n if (!key) return;\n const nextKeys = this.pinnedKeys().includes(key)\n ? this.pinnedKeys().filter(currentKey => currentKey !== key)\n : [...this.pinnedKeys(), key];\n this.pinnedKeys.set(nextKeys);\n this.#storage.writePinnedMenuKeys(nextKeys);\n }\n\n recordRecent(menu: SdLayoutMenu, configuration: ResolvedSidebarRecentConfiguration): void {\n if (!configuration.enabled) return;\n const key = getMenuStableKey(menu);\n if (!key) return;\n const maximum = Number.isFinite(configuration.maxItems) && configuration.maxItems > 0 ? Math.floor(configuration.maxItems) : 5;\n const nextKeys = [key, ...this.recentKeys().filter(currentKey => currentKey !== key)].slice(0, maximum);\n this.recentKeys.set(nextKeys);\n this.#storage.writeRecentMenuKeys(nextKeys);\n }\n\n patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): void {\n this.#storage.patchVersionState(version, patch);\n }\n\n versionState(version: 1 | 2 | 3): SdLayoutVersionState {\n return this.#storage.readVersionState(version);\n }\n}\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, inject } 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 private permissionService = inject(SdPermissionService);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\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 (\n (typeof menu.permission === 'string' || Array.isArray(menu.permission)) &&\n this.permissionService.hasPermission(menu.permission, menu.permissionKey)\n ) {\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 explicitId = typeof menu.id === 'string' ? menu.id.trim() : '';\n if (explicitId) return explicitId;\n\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)[] = [\n 'title',\n 'path',\n 'permission',\n 'permissionKey',\n 'queryParams',\n 'icon',\n 'level',\n 'tooltipTitle',\n ];\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 { 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';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrl: './user.component.scss',\n imports: [SdIcon, MatMenuModule, MatButtonModule, 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 // 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","@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 <sd-icon style=\"color: #8c8c8c\" [name]=\"isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left'\"></sd-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 <sd-icon name=\"lock\"></sd-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, DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, 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 { 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 { 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, SdLayoutNavigationStateService, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sidebar',\n standalone: true,\n imports: [\n SdIcon,\n SdInput,\n FormsModule,\n CommonModule,\n RouterModule,\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 changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarComponent {\n // ==========================================\n // INJECT SERVICES (Thay thế Constructor rườm rà)\n // ==========================================\n #router = inject(Router);\n #layoutStorageService = inject(SdLayoutStorageService);\n #navigationState = inject(SdLayoutNavigationStateService);\n #menuFocusPipe = inject(MenuFocusPipe);\n #window = inject(DOCUMENT).defaultView;\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 isMobile = input(false);\n expandSideBar = output<void>();\n popupUserMenuClosed = output<void>();\n popupUserMenuOpened = output<void>();\n showSideBar = output<boolean | null>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n currentPath = signal<string>(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\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 = computed<SdLayoutChildrenMenu>(() => ({\n id: 'pinned-menu-group',\n title: 'Đã ghim',\n children: this.#navigationState.pinnedMenus(),\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 = 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 this.#navigationState.hydrate(currentMenus);\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 const currentPath = event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '';\n if (this.currentPath() !== currentPath) {\n this.currentPath.set(currentPath);\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 this.#navigationState.togglePinned(node);\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 this.#router.navigateByUrl('/layout/home');\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 this.#window?.open(path, '_blank', 'noopener');\n return;\n }\n this.#router.navigate([path.split('?')[0]], {\n queryParams,\n state: { switchTab: true },\n });\n\n if (this.isMobile()) {\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(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\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 =\n brandLightColorOpacity || 'color-mix(in srgb, var(--sd-primary-light, #d7e3ff) 60%, transparent)';\n if (!(menuGroupIcon instanceof HTMLImageElement)) {\n menuGroupIcon.style.color = this.sidebar()?.brandColor || 'var(--sd-primary, #005cbb)';\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 = 'var(--sd-text-secondary, #44474f)';\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 || 'var(--sd-primary, #005cbb)';\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 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]=\"isMobile() ? '100dvh' : '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 <sd-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color: isPinnedMenuGroupActive()\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text-secondary, #44474f)',\n backgroundColor: isPinnedMenuGroupActive()\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\"\n name=\"push_pin\"></sd-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:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\">\n <img width=\"24px\" height=\"24px\" [src]=\"nodeMenuGroup.iconUrl\" [alt]=\"nodeMenuGroup.title\" />\n </span>\n } @else {\n <sd-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text-secondary, #44474f)',\n backgroundColor:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\"\n [name]=\"nodeMenuGroup.icon || 'widgets'\"></sd-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\n size=\"sm\"\n [placeholder]=\"'core.module.layout.sidebar.search' | translate\"\n [autoId]=\"'layout-v1-menu-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"onFilterSearchText($event)\">\n <ng-template sdSuffixDef>\n @if (searchText()) {\n <sd-icon class=\"c-search-prefix-icon cancel\" (click)=\"onClearSearchText()\" name=\"cancel\"></sd-icon>\n } @else {\n <sd-icon class=\"c-search-prefix-icon search\" name=\"search\"></sd-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:\n (currentPath() | menuFocus: node) ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)' : '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:\n (currentPath() | menuFocus: node)\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text, #1a1b1f)',\n }\"\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\n\n @if (_sidebar?.pin?.enabled) {\n <sd-icon\n class=\"c-menu-node-description-icon-pin\"\n [style.opacity]=\"isPinnedNode(node) || isHoveredNode(node) ? '1' : null\"\n [style.color]=\"\n isPinnedNode(node) || isHoveredNode(node) ? sidebar().brandColor || 'var(--sd-primary, #005cbb)' : null\n \"\n (click)=\"onTogglePin($event, node)\"\n name=\"push_pin\"></sd-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 <sd-icon\n class=\"c-menu-node-description-icon-expand\"\n [name]=\"treeControl.isExpanded(node) ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-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]=\"isMobile()\"\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 { ChangeDetectionStrategy, Component, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\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 styleUrl: './main.component.scss',\n imports: [MatSidenavModule, CommonModule, SidebarComponent],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\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 isMobile = input(false);\n\n // ==========================================\n // STATE SIGNALS\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>(this.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.isMobile()) {\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.isMobile()) {\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.isMobile()) {\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 if (data) {\n sidenavComp.open();\n } else {\n sidenavComp.close();\n }\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]=\"isMobile() ? 'over' : 'side'\"\n [fixedInViewport]=\"isMobile()\">\n <sidebar\n [menus]=\"menus()\"\n [userInfo]=\"userInfo()\"\n [sidebar]=\"sidebar()\"\n [isMobile]=\"isMobile()\"\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>\n","import { Component, inject, input, output, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\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';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrl: './user.component.scss',\n imports: [SdIcon, MatMenuModule, MatButtonModule, 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","@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 <sd-icon class=\"m-expand-icon\" [class.m-expand-icon--open]=\"isExpanded()\" name=\"keyboard_arrow_down\"></sd-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 <sd-icon name=\"lock\"></sd-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 <sd-icon name=\"logout\"></sd-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 <sd-icon style=\"color: #8c8c8c\" [name]=\"isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left'\"></sd-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 <sd-icon name=\"lock\"></sd-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 { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\n\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-sidebar-mobile-overlay',\n standalone: true,\n imports: [SdIcon, CommonModule, RouterModule, LayoutUserComponent],\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 <sd-icon name=\"close\"></sd-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 <sd-icon class=\"m-group-icon\" [name]=\"group.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"m-group-title\">{{ group.title }}</span>\n </div>\n <sd-icon class=\"m-expand-icon\" [name]=\"expandedMobileGroups().has(group.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-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 <sd-icon class=\"m-item-icon\" [name]=\"child.icon || 'folder'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <sd-icon class=\"m-expand-icon\" [name]=\"expandedMobileGroups().has(child.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-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 <sd-icon class=\"m-item-icon\" [name]=\"subChild.icon || 'insert_drive_file'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ subChild.title }}</span>\n </div>\n <sd-icon class=\"m-nav-icon\" name=\"chevron_right\"></sd-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 <sd-icon class=\"m-item-icon\" [name]=\"child.icon || 'insert_drive_file'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <sd-icon class=\"m-nav-icon\" name=\"chevron_right\"></sd-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';\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';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sidebar-mobile-v1',\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n imports: [SdIcon, 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 <sd-icon name=\"menu\"></sd-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 { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutMenu, SdLayoutRootMenu, getMenuStableKey, searchMenuLeaves } from '../../../services';\n\ninterface SdLayoutMenuTreeNode {\n menu: SdLayoutMenu;\n key: string;\n title: string;\n depth: number;\n paddingLeft: number;\n isGroup: boolean;\n isActive: boolean;\n isPinned: boolean;\n}\n\n@Component({\n selector: 'sd-layout-menu-tree',\n standalone: true,\n imports: [SdIcon],\n templateUrl: './menu-tree.component.html',\n styleUrl: './menu-tree.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutMenuTreeComponent {\n menus = input<SdLayoutMenu[]>([]);\n query = input('');\n activePath = input('');\n pinnedKeys = input<string[]>([]);\n showPin = input(true);\n navigate = output<SdLayoutRootMenu>();\n togglePinned = output<SdLayoutMenu>();\n\n nodes = computed<SdLayoutMenuTreeNode[]>(() => {\n const pinnedKeys = new Set(this.pinnedKeys());\n const query = this.query().trim();\n const menus = query ? searchMenuLeaves(this.menus(), query) : this.menus();\n const nodes: SdLayoutMenuTreeNode[] = [];\n\n const append = (items: SdLayoutMenu[], depth: number, ancestors: string[]): void => {\n for (const menu of items) {\n const key = getMenuStableKey(menu, ancestors);\n if (!key) continue;\n const isGroup = 'children' in menu && !!menu.children?.length;\n const path = 'path' in menu ? menu.path : '';\n nodes.push({\n menu,\n key,\n title: menu.title ?? menu.tooltipTitle ?? '',\n depth,\n paddingLeft: 12 + depth * 16,\n isGroup,\n isActive: !!path && this.#pathMatches(this.activePath(), path),\n isPinned: pinnedKeys.has(key),\n });\n if (isGroup && 'children' in menu) append(menu.children ?? [], depth + 1, [...ancestors, menu.title ?? key]);\n }\n };\n\n append(menus, 0, []);\n return nodes;\n });\n\n onNavigate(menu: SdLayoutMenu): void {\n if ('path' in menu) this.navigate.emit(menu);\n }\n\n onTogglePinned(event: MouseEvent, menu: SdLayoutMenu): void {\n event.stopPropagation();\n this.togglePinned.emit(menu);\n }\n\n #pathMatches(currentPath: string, menuPath: string): boolean {\n const normalize = (path: string): string => (path.endsWith('/') ? path : `${path}/`);\n return currentPath === menuPath || normalize(currentPath).startsWith(normalize(menuPath));\n }\n}\n","<nav class=\"d-flex flex-column gap-4\" aria-label=\"Navigation menu\">\n @for (node of nodes(); track node.key) {\n @if (node.isGroup) {\n <div class=\"sd-layout-menu-tree__group d-flex align-items-center gap-8 T12M text-black400\" [style.padding-left.px]=\"node.paddingLeft\">\n <sd-icon [name]=\"node.menu.icon || 'folder'\"></sd-icon>\n <span class=\"text-ellipsis\">{{ node.title }}</span>\n </div>\n } @else {\n <div class=\"sd-layout-menu-tree__route d-flex align-items-center gap-4\">\n <button\n type=\"button\"\n class=\"sd-layout-menu-tree__route-button d-flex align-items-center gap-8 flex-1 text-left T14R\"\n data-menu-route\n [attr.data-menu-key]=\"node.key\"\n [attr.aria-current]=\"node.isActive ? 'page' : null\"\n [class.sd-layout-menu-tree__route-button--active]=\"node.isActive\"\n [style.padding-left.px]=\"node.paddingLeft\"\n (click)=\"onNavigate(node.menu)\">\n @if (node.menu.iconUrl) {\n <img class=\"sd-layout-menu-tree__icon-image\" [src]=\"node.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"node.menu.icon || 'chevron_right'\"></sd-icon>\n }\n <span class=\"text-ellipsis\">{{ node.title }}</span>\n </button>\n @if (showPin()) {\n <button\n type=\"button\"\n class=\"sd-layout-menu-tree__pin d-flex align-items-center justify-content-center\"\n [attr.data-pin-key]=\"node.key\"\n [attr.aria-label]=\"node.isPinned ? 'Unpin ' + node.title : 'Pin ' + node.title\"\n [attr.aria-pressed]=\"node.isPinned\"\n (click)=\"onTogglePinned($event, node.menu)\">\n <sd-icon [name]=\"node.isPinned ? 'push_pin' : 'keep'\"></sd-icon>\n </button>\n }\n </div>\n }\n } @empty {\n <div class=\"d-flex flex-column align-items-center justify-content-center gap-12 p-24 text-black400 T14R\">\n Không tìm thấy menu phù hợp\n </div>\n }\n</nav>\n","import { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdAvatar } from '@sdcorejs/angular/components';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../../../configurations';\n\n@Component({\n selector: 'sd-layout-user-menu',\n standalone: true,\n imports: [SdAvatar, SdIcon],\n templateUrl: './user-menu.component.html',\n styleUrl: './user-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutUserMenuComponent {\n readonly #configuration = inject(SD_LAYOUT_CONFIGURATION, { optional: true });\n readonly #destroyRef = inject(DestroyRef);\n readonly #document = inject(DOCUMENT);\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n private readonly menu = viewChild<ElementRef<HTMLElement>>('menu');\n\n userInfo = input.required<SdLayoutUserInfo>();\n signout = input<(() => void | Promise<void>) | undefined>();\n changePassword = input<(() => void | Promise<void>) | undefined>();\n compact = input(false);\n isOpen = signal(false);\n\n avatar = computed(() => {\n const user = this.userInfo();\n return user.avatar || user.fullName || user.username || user.email;\n });\n displayName = computed(() => this.userInfo().fullName || this.userInfo().username || this.userInfo().email || 'User');\n signoutAction = computed(() => this.signout() ?? this.#configuration?.signout);\n changePasswordAction = computed(() => this.changePassword() ?? this.#configuration?.changePassword);\n\n constructor() {\n effect(() => {\n if (!this.isOpen()) return;\n this.menu()?.nativeElement.querySelector<HTMLButtonElement>('[role=\"menuitem\"]')?.focus();\n });\n\n const onDocumentKeydown = (event: KeyboardEvent): void => {\n if (!this.isOpen() || event.key !== 'Escape') return;\n event.preventDefault();\n this.close();\n };\n const onDocumentPointerDown = (event: PointerEvent): void => {\n if (!this.isOpen()) return;\n const nodeConstructor = this.#document.defaultView?.Node;\n if (!nodeConstructor || !(event.target instanceof nodeConstructor) || this.#host.nativeElement.contains(event.target)) return;\n this.close(false);\n };\n\n this.#document.addEventListener('keydown', onDocumentKeydown);\n this.#document.addEventListener('pointerdown', onDocumentPointerDown);\n this.#destroyRef.onDestroy(() => {\n this.#document.removeEventListener('keydown', onDocumentKeydown);\n this.#document.removeEventListener('pointerdown', onDocumentPointerDown);\n });\n }\n\n open(): void {\n this.isOpen.set(true);\n }\n\n toggle(): void {\n if (this.isOpen()) this.close(false);\n else this.open();\n }\n\n close(restoreFocus = true): void {\n this.isOpen.set(false);\n if (restoreFocus) this.trigger()?.nativeElement.focus();\n }\n\n onMenuKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || !(event.currentTarget instanceof HTMLElement)) return;\n\n const actions = [...event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"menuitem\"]')];\n if (!actions.length) return;\n event.preventDefault();\n const currentIndex = actions.findIndex(action => action === this.#document.activeElement);\n const nextIndex =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? actions.length - 1\n : event.key === 'ArrowDown'\n ? (currentIndex + 1) % actions.length\n : (currentIndex - 1 + actions.length) % actions.length;\n actions[nextIndex].focus();\n }\n\n runChangePassword(): void {\n this.changePasswordAction()?.();\n this.close();\n }\n\n runSignout(): void {\n this.signoutAction()?.();\n this.close();\n }\n}\n","<div class=\"sd-layout-user-menu position-relative\">\n <button\n #trigger\n type=\"button\"\n data-user-trigger\n class=\"sd-layout-user-menu__trigger d-flex align-items-center gap-8 w-full text-left\"\n aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggle()\">\n <sd-avatar [src]=\"avatar()\" [size]=\"compact() ? 32 : 40\"></sd-avatar>\n @if (!compact()) {\n <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n </span>\n }\n <sd-icon [name]=\"isOpen() ? 'expand_less' : 'expand_more'\"></sd-icon>\n </button>\n\n @if (isOpen()) {\n <div\n #menu\n data-user-menu\n class=\"sd-layout-user-menu__popup d-flex flex-column gap-4 p-8 bg-white border border-black200 rounded-8 mat-elevation-z4\"\n role=\"menu\"\n tabindex=\"-1\"\n (keydown)=\"onMenuKeydown($event)\">\n <div class=\"d-flex flex-column gap-4 px-8 py-4\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n </div>\n @if (changePasswordAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"change-password\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runChangePassword()\">\n <sd-icon name=\"lock\"></sd-icon>\n Đổi mật khẩu\n </button>\n }\n @if (signoutAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"signout\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left text-error\"\n (click)=\"runSignout()\">\n <sd-icon name=\"logout\"></sd-icon>\n Đăng xuất\n </button>\n }\n </div>\n }\n</div>\n","import { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdInput } from '@sdcorejs/angular/forms';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV2, resolveSidebarV2Interaction } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, getMenuStableKey } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\ninterface SidebarV2RailItem {\n menu: SdLayoutMenu;\n key: string;\n title: string;\n}\n\n@Component({\n selector: 'sidebar-v2',\n standalone: true,\n imports: [SdIcon, SdInput, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarV2Component {\n readonly #router = inject(Router);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV2>();\n activeGroupKey = signal('');\n isFlyoutOpen = signal(false);\n isFlyoutLocked = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n\n interaction = computed(() => resolveSidebarV2Interaction(this.sidebar()));\n railItems = computed<SidebarV2RailItem[]>(() =>\n this.menus()\n .map(menu => ({ menu, key: getMenuStableKey(menu), title: menu.tooltipTitle || menu.title || 'Menu' }))\n .filter(item => !!item.key)\n );\n activeGroup = computed(() => this.railItems().find(item => item.key === this.activeGroupKey())?.menu);\n contextMenus = computed<SdLayoutMenu[]>(() => {\n const activeGroup = this.activeGroup();\n if (!activeGroup) return [];\n return 'children' in activeGroup && activeGroup.children?.length ? activeGroup.children : [activeGroup];\n });\n pinnedKeys = this.#navigationState.pinnedKeys;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n untracked(() => {\n this.#navigationState.hydrate(menus);\n const persistedState = this.#navigationState.versionState(2);\n if (persistedState.activeGroupKey && !this.activeGroupKey()) this.activeGroupKey.set(persistedState.activeGroupKey);\n });\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeFromNavigation();\n });\n }\n\n selectGroup(menu: SdLayoutMenu): void {\n const key = getMenuStableKey(menu);\n if (!key) return;\n\n if (this.interaction() === 'click') {\n if (this.activeGroupKey() === key && this.isFlyoutOpen()) {\n this.#closeFlyout();\n return;\n }\n this.#openGroup(key, false);\n return;\n }\n\n if (this.activeGroupKey() === key && this.isFlyoutLocked()) {\n this.#closeFlyout();\n return;\n }\n this.#openGroup(key, true);\n }\n\n previewGroup(menu: SdLayoutMenu): void {\n if (this.interaction() !== 'hover-lock' || this.isFlyoutLocked()) return;\n const key = getMenuStableKey(menu);\n if (key) this.#openGroup(key, false, false);\n }\n\n leaveFlyout(): void {\n if (this.interaction() === 'hover-lock' && !this.isFlyoutLocked()) this.#closeFlyout(false);\n }\n\n closeFromBackdrop(): void {\n this.#closeFlyout();\n }\n\n closeFromEscape(): void {\n this.#closeFlyout();\n }\n\n closeFromNavigation(): void {\n this.#closeFlyout();\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, { enabled: true, maxItems: 5 });\n if (menu.path.includes('http')) {\n this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n this.closeFromNavigation();\n return;\n }\n void this.#router.navigate([menu.path.split('?')[0]], {\n queryParams: menu.queryParams ?? {},\n state: { switchTab: true },\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #openGroup(key: string, locked: boolean, persist = true): void {\n this.activeGroupKey.set(key);\n this.isFlyoutOpen.set(true);\n this.isFlyoutLocked.set(locked);\n this.searchText.set('');\n if (persist) this.#navigationState.patchVersionState(2, { activeGroupKey: key, locked });\n }\n\n #closeFlyout(persist = true): void {\n this.isFlyoutOpen.set(false);\n this.isFlyoutLocked.set(false);\n this.searchText.set('');\n if (persist) this.#navigationState.patchVersionState(2, { locked: false });\n }\n}\n","<div class=\"sd-sidebar-v2\" (keydown.escape)=\"closeFromEscape()\">\n <aside class=\"sd-sidebar-v2__rail d-flex flex-column align-items-center gap-8 py-12 bg-white border-right border-black200\">\n <button type=\"button\" class=\"sd-sidebar-v2__brand d-flex align-items-center justify-content-center\" aria-label=\"Trang chủ\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-v2__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n </button>\n\n <nav class=\"d-flex flex-column align-items-center gap-4 flex-1\" aria-label=\"Nhóm menu\">\n @for (item of railItems(); track item.key) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v2__rail-action d-flex flex-column align-items-center justify-content-center gap-4\"\n [attr.data-v2-group-key]=\"item.key\"\n [attr.aria-label]=\"item.title\"\n [attr.aria-expanded]=\"activeGroupKey() === item.key && isFlyoutOpen()\"\n [class.sd-sidebar-v2__rail-action--active]=\"activeGroupKey() === item.key\"\n (click)=\"selectGroup(item.menu)\"\n (mouseenter)=\"previewGroup(item.menu)\"\n (focus)=\"previewGroup(item.menu)\">\n @if (item.menu.iconUrl) {\n <img class=\"sd-sidebar-v2__rail-icon\" [src]=\"item.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"item.menu.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"sd-sidebar-v2__rail-label text-ellipsis\">{{ item.title }}</span>\n </button>\n }\n </nav>\n\n <sd-layout-user-menu [userInfo]=\"userInfo()\" [compact]=\"true\"></sd-layout-user-menu>\n </aside>\n\n @if (isFlyoutOpen()) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v2__backdrop\"\n aria-label=\"Đóng menu\"\n (click)=\"closeFromBackdrop()\"\n (keydown.escape)=\"closeFromEscape()\"></button>\n <section\n class=\"sd-sidebar-v2__flyout d-flex flex-column bg-white border-right border-black200 mat-elevation-z4\"\n [attr.aria-label]=\"activeGroup()?.title || 'Menu'\"\n (mouseleave)=\"leaveFlyout()\"\n (keydown.escape)=\"closeFromEscape()\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T16M text-ellipsis\">{{ activeGroup()?.title || sidebar().defaultTitle || 'Menu' }}</span>\n @if (isFlyoutLocked()) {\n <sd-icon name=\"lock\"></sd-icon>\n }\n </header>\n <div class=\"p-12\">\n <sd-input\n size=\"sm\"\n placeholder=\"Tìm trong nhóm\"\n [autoId]=\"'layout-v2-context-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-input>\n </div>\n <div class=\"flex-1 overflow-auto px-8 pb-12\">\n <sd-layout-menu-tree\n [menus]=\"contextMenus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"onNavigate($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </div>\n </section>\n }\n\n <main class=\"sd-sidebar-v2__content\" data-v2-content data-content-offset=\"rail\">\n <ng-content></ng-content>\n </main>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdInput } from '@sdcorejs/angular/forms';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV2 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, getMenuStableKey, selectPrimaryMenuGroups } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'sidebar-mobile-v2',\n standalone: true,\n imports: [A11yModule, SdIcon, SdInput, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarMobileV2Component {\n readonly #router = inject(Router);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n #restoreFocusElement: HTMLElement | null = null;\n #previousBodyOverflow = '';\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV2>();\n primaryMenus = computed(() => selectPrimaryMenuGroups(this.menus(), this.sidebar().primaryMenuIds));\n overflowMenus = computed(() => {\n const primaryKeys = new Set(this.primaryMenus().map(menu => getMenuStableKey(menu)));\n return this.menus().filter(menu => !primaryKeys.has(getMenuStableKey(menu)));\n });\n isSheetOpen = signal(false);\n sheetGroupKey = signal('');\n sheetTitle = signal('');\n sheetMenus = signal<SdLayoutMenu[]>([]);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n pinnedKeys = this.#navigationState.pinnedKeys;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n untracked(() => this.#navigationState.hydrate(menus));\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeSheet(false);\n });\n this.#destroyRef.onDestroy(() => this.#releaseBodyScroll());\n }\n\n openMore(trigger?: EventTarget | null): void {\n this.#openSheet('more', 'Thêm', this.overflowMenus(), trigger);\n }\n\n activateMenu(menu: SdLayoutMenu, trigger?: EventTarget | null): void {\n if ('path' in menu) {\n this.#navigate(menu);\n return;\n }\n this.#openSheet(getMenuStableKey(menu), menu.title || 'Menu', menu.children ?? [], trigger);\n }\n\n closeSheet(restoreFocus = true): void {\n if (!this.isSheetOpen()) return;\n this.isSheetOpen.set(false);\n this.searchText.set('');\n this.#releaseBodyScroll();\n if (restoreFocus) this.#restoreFocusElement?.focus();\n this.#restoreFocusElement = null;\n }\n\n onSheetKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n this.closeSheet();\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if ('path' in menu) this.#navigate(menu);\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #openSheet(key: string, title: string, menus: SdLayoutMenu[], trigger?: EventTarget | null): void {\n this.sheetGroupKey.set(key);\n this.sheetTitle.set(title);\n this.sheetMenus.set(menus);\n this.searchText.set('');\n this.#restoreFocusElement =\n trigger instanceof HTMLElement ? trigger : this.#document.activeElement instanceof HTMLElement ? this.#document.activeElement : null;\n if (!this.isSheetOpen()) {\n this.#previousBodyOverflow = this.#document.body.style.overflow;\n this.#document.body.style.overflow = 'hidden';\n }\n this.isSheetOpen.set(true);\n }\n\n #navigate(menu: Extract<SdLayoutMenu, { path: string }>): void {\n this.#navigationState.recordRecent(menu, { enabled: true, maxItems: 5 });\n if (menu.path.includes('http')) {\n this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n this.closeSheet();\n return;\n }\n void this.#router\n .navigate([menu.path.split('?')[0]], { queryParams: menu.queryParams ?? {}, state: { switchTab: true } })\n .then(navigated => {\n if (navigated) this.closeSheet();\n });\n }\n\n #releaseBodyScroll(): void {\n this.#document.body.style.overflow = this.#previousBodyOverflow;\n }\n}\n","<div class=\"sd-sidebar-mobile-v2 d-flex flex-column\">\n <main class=\"sd-sidebar-mobile-v2__content flex-1 overflow-auto\">\n <ng-content></ng-content>\n </main>\n\n <nav class=\"sd-sidebar-mobile-v2__bar d-flex align-items-stretch bg-white border-top border-black200\" aria-label=\"Điều hướng chính\">\n @for (menu of primaryMenus(); track menu.id || menu.title) {\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__bar-action d-flex flex-column align-items-center justify-content-center gap-4 flex-1\"\n [attr.data-mobile-menu-key]=\"menu.id ? 'id:' + menu.id : null\"\n [attr.aria-label]=\"menu.tooltipTitle || menu.title || 'Menu'\"\n [attr.aria-expanded]=\"sheetGroupKey() === (menu.id ? 'id:' + menu.id : '') && isSheetOpen()\"\n (click)=\"activateMenu(menu, $event.currentTarget)\">\n @if (menu.iconUrl) {\n <img class=\"sd-sidebar-mobile-v2__icon\" [src]=\"menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"menu.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"sd-sidebar-mobile-v2__label text-ellipsis\">{{ menu.tooltipTitle || menu.title }}</span>\n </button>\n }\n @if (overflowMenus().length) {\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__bar-action d-flex flex-column align-items-center justify-content-center gap-4 flex-1\"\n aria-label=\"Thêm menu\"\n [attr.aria-expanded]=\"sheetGroupKey() === 'more' && isSheetOpen()\"\n (click)=\"openMore($event.currentTarget)\">\n <sd-icon name=\"more_horiz\"></sd-icon>\n <span class=\"sd-sidebar-mobile-v2__label\">Thêm</span>\n </button>\n }\n </nav>\n\n @if (isSheetOpen()) {\n <button type=\"button\" class=\"sd-sidebar-mobile-v2__backdrop\" aria-label=\"Đóng menu\" (click)=\"closeSheet()\"></button>\n <section\n data-v2-sheet\n class=\"sd-sidebar-mobile-v2__sheet d-flex flex-column bg-white rounded-top-16 mat-elevation-z8\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"sheetTitle()\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (keydown)=\"onSheetKeydown($event)\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T16M text-ellipsis\">{{ sheetTitle() }}</span>\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__close d-flex align-items-center justify-content-center\"\n aria-label=\"Đóng\"\n (click)=\"closeSheet()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </header>\n <div class=\"d-flex flex-column gap-12 p-12 overflow-auto\">\n <sd-layout-user-menu [userInfo]=\"userInfo()\"></sd-layout-user-menu>\n <sd-input\n size=\"sm\"\n placeholder=\"Tìm trong menu\"\n [autoId]=\"'layout-v2-mobile-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-input>\n <sd-layout-menu-tree\n [menus]=\"sheetMenus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"onNavigate($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </div>\n </section>\n }\n</div>\n","import { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdInput } from '@sdcorejs/angular/forms';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV3, resolveSidebarV3Recent } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutRootMenu, getMenuStableKey, searchMenuLeaves } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'sidebar-v3',\n standalone: true,\n imports: [SdIcon, SdInput, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarV3Component {\n readonly #router = inject(Router);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n #initialized = false;\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV3>();\n isCollapsed = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n searchResults = computed<SdLayoutRootMenu[]>(() => searchMenuLeaves(this.menus(), this.searchText()));\n recentConfiguration = computed(() => resolveSidebarV3Recent(this.sidebar()));\n pinnedKeys = this.#navigationState.pinnedKeys;\n pinnedMenus = this.#navigationState.pinnedMenus;\n recentMenus = this.#navigationState.recentMenus;\n collapsedItems = computed(() =>\n this.menus().map(menu => ({ menu, key: getMenuStableKey(menu), title: menu.tooltipTitle || menu.title || 'Menu' }))\n );\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n const sidebar = this.sidebar();\n const recentConfiguration = resolveSidebarV3Recent(sidebar);\n untracked(() => {\n this.#navigationState.hydrate(menus, recentConfiguration.maxItems);\n if (this.#initialized) return;\n const persistedCollapsed = this.#navigationState.versionState(3).collapsed;\n this.isCollapsed.set(typeof persistedCollapsed === 'boolean' ? persistedCollapsed : (sidebar.defaultCollapsed ?? false));\n this.#initialized = true;\n });\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n });\n }\n\n toggleCollapsed(): void {\n this.isCollapsed.update(collapsed => !collapsed);\n this.#navigationState.patchVersionState(3, { collapsed: this.isCollapsed() });\n }\n\n activateCollapsedMenu(menu: SdLayoutMenu): void {\n if ('path' in menu) this.navigateMenu(menu);\n else {\n this.isCollapsed.set(false);\n this.#navigationState.patchVersionState(3, { collapsed: false });\n }\n }\n\n navigateMenu(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, this.recentConfiguration());\n if (menu.path.includes('http')) {\n this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n return;\n }\n void this.#router.navigate([menu.path.split('?')[0]], {\n queryParams: menu.queryParams ?? {},\n state: { switchTab: true },\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n}\n","<div class=\"sd-sidebar-v3\" [class.sd-sidebar-v3--collapsed]=\"isCollapsed()\">\n <aside\n class=\"sd-sidebar-v3__drawer d-flex flex-column bg-white border-right border-black200\"\n data-v3-sidebar\n [attr.data-collapsed]=\"isCollapsed()\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 p-12 border-bottom border-black200\">\n <div class=\"d-flex align-items-center gap-8 overflow-hidden\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-v3__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n @if (!isCollapsed()) {\n <span class=\"T16M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n }\n </div>\n <button\n type=\"button\"\n class=\"sd-sidebar-v3__icon-action d-flex align-items-center justify-content-center\"\n [attr.aria-label]=\"isCollapsed() ? 'Mở rộng sidebar' : 'Thu gọn sidebar'\"\n [attr.aria-expanded]=\"!isCollapsed()\"\n (click)=\"toggleCollapsed()\">\n <sd-icon [name]=\"isCollapsed() ? 'chevron_right' : 'chevron_left'\"></sd-icon>\n </button>\n </header>\n\n @if (isCollapsed()) {\n <nav class=\"d-flex flex-column align-items-center gap-4 p-8 flex-1\" aria-label=\"Menu thu gọn\">\n @for (item of collapsedItems(); track item.key) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v3__collapsed-action d-flex align-items-center justify-content-center\"\n [attr.aria-label]=\"item.title\"\n (click)=\"activateCollapsedMenu(item.menu)\">\n @if (item.menu.iconUrl) {\n <img class=\"sd-sidebar-v3__logo\" [src]=\"item.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"item.menu.icon || 'widgets'\"></sd-icon>\n }\n </button>\n }\n </nav>\n } @else {\n <div class=\"p-12\">\n <sd-input\n size=\"sm\"\n placeholder=\"Tìm trong tất cả menu\"\n [autoId]=\"'layout-v3-global-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-input>\n </div>\n <div class=\"sd-sidebar-v3__navigation d-flex flex-column gap-16 flex-1 overflow-auto px-8 pb-12\">\n @if (pinnedMenus().length) {\n <section data-v3-pinned class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Đã ghim</h2>\n <sd-layout-menu-tree\n [menus]=\"pinnedMenus()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n @if (recentConfiguration().enabled && recentMenus().length) {\n <section data-v3-recent class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Gần đây</h2>\n <sd-layout-menu-tree [menus]=\"recentMenus()\" [activePath]=\"activePath()\" [showPin]=\"false\" (navigate)=\"navigateMenu($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n <section class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Tất cả menu</h2>\n <sd-layout-menu-tree\n [menus]=\"menus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n </div>\n }\n\n <div class=\"p-8 border-top border-black200\">\n <sd-layout-user-menu [userInfo]=\"userInfo()\" [compact]=\"isCollapsed()\"></sd-layout-user-menu>\n </div>\n </aside>\n\n <main class=\"sd-sidebar-v3__content\">\n <ng-content></ng-content>\n </main>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdInput } from '@sdcorejs/angular/forms';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV3, resolveSidebarV3Recent } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutRootMenu, searchMenuLeaves } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'sidebar-mobile-v3',\n standalone: true,\n imports: [A11yModule, SdIcon, SdInput, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarMobileV3Component {\n readonly #router = inject(Router);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n #restoreFocusElement: HTMLElement | null = null;\n #previousBodyOverflow = '';\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV3>();\n isDrawerOpen = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n searchResults = computed<SdLayoutRootMenu[]>(() => searchMenuLeaves(this.menus(), this.searchText()));\n recentConfiguration = computed(() => resolveSidebarV3Recent(this.sidebar()));\n pinnedKeys = this.#navigationState.pinnedKeys;\n pinnedMenus = this.#navigationState.pinnedMenus;\n recentMenus = this.#navigationState.recentMenus;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n const maximum = resolveSidebarV3Recent(this.sidebar()).maxItems;\n untracked(() => this.#navigationState.hydrate(menus, maximum));\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeFromNavigation();\n });\n this.#destroyRef.onDestroy(() => this.#releaseBodyScroll());\n }\n\n openDrawer(trigger?: EventTarget | null): void {\n this.#restoreFocusElement =\n trigger instanceof HTMLElement\n ? trigger\n : this.#document.activeElement instanceof HTMLElement\n ? this.#document.activeElement\n : (this.trigger()?.nativeElement ?? null);\n if (!this.isDrawerOpen()) {\n this.#previousBodyOverflow = this.#document.body.style.overflow;\n this.#document.body.style.overflow = 'hidden';\n }\n this.isDrawerOpen.set(true);\n }\n\n closeFromBackdrop(): void {\n this.#closeDrawer();\n }\n\n closeFromEscape(): void {\n this.#closeDrawer();\n }\n\n closeFromNavigation(): void {\n this.#closeDrawer();\n }\n\n onDrawerKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n this.closeFromEscape();\n }\n\n navigateMenu(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, this.recentConfiguration());\n if (menu.path.includes('http')) {\n this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n this.closeFromNavigation();\n return;\n }\n void this.#router\n .navigate([menu.path.split('?')[0]], { queryParams: menu.queryParams ?? {}, state: { switchTab: true } })\n .then(navigated => {\n if (navigated) this.closeFromNavigation();\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #closeDrawer(): void {\n if (!this.isDrawerOpen()) return;\n this.isDrawerOpen.set(false);\n this.searchText.set('');\n this.#releaseBodyScroll();\n (this.#restoreFocusElement ?? this.trigger()?.nativeElement)?.focus();\n this.#restoreFocusElement = null;\n }\n\n #releaseBodyScroll(): void {\n this.#document.body.style.overflow = this.#previousBodyOverflow;\n }\n}\n","<div class=\"sd-sidebar-mobile-v3 d-flex flex-column\">\n <header\n class=\"sd-sidebar-mobile-v3__topbar d-flex align-items-center justify-content-between gap-8 px-16 bg-white border-bottom border-black200\">\n <div class=\"d-flex align-items-center gap-8 overflow-hidden\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-mobile-v3__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n }\n <span class=\"T16M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n <button\n #trigger\n type=\"button\"\n data-v3-mobile-trigger\n class=\"sd-sidebar-mobile-v3__icon-action d-flex align-items-center justify-content-center\"\n aria-label=\"Mở menu\"\n [attr.aria-expanded]=\"isDrawerOpen()\"\n (click)=\"openDrawer($event.currentTarget)\">\n <sd-icon name=\"menu\"></sd-icon>\n </button>\n </header>\n\n <main class=\"flex-1 overflow-auto\">\n <ng-content></ng-content>\n </main>\n\n @if (isDrawerOpen()) {\n <button type=\"button\" class=\"sd-sidebar-mobile-v3__backdrop\" aria-label=\"Đóng menu\" (click)=\"closeFromBackdrop()\"></button>\n <aside\n class=\"sd-sidebar-mobile-v3__drawer d-flex flex-column bg-white mat-elevation-z8\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Menu chính\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (keydown)=\"onDrawerKeydown($event)\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T18M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v3__icon-action d-flex align-items-center justify-content-center\"\n aria-label=\"Đóng menu\"\n (click)=\"closeFromBackdrop()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </header>\n <div class=\"sd-sidebar-mobile-v3__navigation d-flex flex-column gap-16 flex-1 overflow-auto p-12\">\n <sd-layout-user-menu [userInfo]=\"userInfo()\"></sd-layout-user-menu>\n <div class=\"sd-sidebar-mobile-v3__search bg-white\">\n <sd-input\n size=\"sm\"\n placeholder=\"Tìm trong tất cả menu\"\n [autoId]=\"'layout-v3-mobile-global-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-input>\n </div>\n @if (pinnedMenus().length) {\n <section data-v3-mobile-pinned class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Đã ghim</h2>\n <sd-layout-menu-tree\n [menus]=\"pinnedMenus()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n @if (recentConfiguration().enabled && recentMenus().length) {\n <section data-v3-mobile-recent class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Gần đây</h2>\n <sd-layout-menu-tree [menus]=\"recentMenus()\" [activePath]=\"activePath()\" [showPin]=\"false\" (navigate)=\"navigateMenu($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n <section class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Tất cả menu</h2>\n <sd-layout-menu-tree\n [menus]=\"menus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n </div>\n </aside>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n// Import nội bộ trong module layout\nimport { SdLayoutMenu, SdLayoutResponsiveService, SdLayoutService } from '../../services';\nimport { MenuPipe } from '../../pipes';\nimport { SidebarV1Component } from '../sidebar-v1/main.component';\nimport { SidebarMobileV1Component } from '../sidebar-mobile-v1/main.component';\nimport { SidebarV2Component } from '../sidebar-v2/main.component';\nimport { SidebarMobileV2Component } from '../sidebar-mobile-v2/main.component';\nimport { SidebarV3Component } from '../sidebar-v3/main.component';\nimport { SidebarMobileV3Component } from '../sidebar-mobile-v3/main.component';\nimport {\n SD_LAYOUT_CONFIGURATION,\n SidebarConfigurationV1,\n SidebarConfigurationV2,\n SidebarConfigurationV3,\n normalizeLayoutMobileBreakpoint,\n} from '../../configurations';\n\n@Component({\n selector: 'sd-layout',\n templateUrl: './layout-main.component.html',\n styleUrl: './layout-main.component.scss',\n imports: [\n SidebarV1Component,\n SidebarMobileV1Component,\n SidebarV2Component,\n SidebarMobileV2Component,\n SidebarV3Component,\n SidebarMobileV3Component,\n NgTemplateOutlet,\n ],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutComponent {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #menuPipe = inject(MenuPipe);\n #layoutService = inject(SdLayoutService);\n #responsiveService = inject(SdLayoutResponsiveService);\n #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION, { optional: true });\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 sidebarV1 = computed<SidebarConfigurationV1 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 1 ? sidebar : undefined;\n });\n sidebarV2 = computed<SidebarConfigurationV2 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 2 ? sidebar : undefined;\n });\n sidebarV3 = computed<SidebarConfigurationV3 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 3 ? sidebar : undefined;\n });\n mobileBreakpoint = normalizeLayoutMobileBreakpoint(this.#layoutConfiguration?.mobileBreakpoint);\n isMobile = computed(() => this.#responsiveService.isMobile(this.mobileBreakpoint));\n}\n","<ng-template #projectedContent>\n <ng-content></ng-content>\n</ng-template>\n\n@let _userInfo = userInfo();\n@let _sidebarV1 = sidebarV1();\n@let _sidebarV2 = sidebarV2();\n@let _sidebarV3 = sidebarV3();\n\n@if (_userInfo && _sidebarV1) {\n @if (!isMobile()) {\n <sidebar-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\" [isMobile]=\"false\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-v1>\n } @else {\n <sidebar-mobile-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-mobile-v1>\n }\n}\n\n@if (_userInfo && _sidebarV3) {\n @if (!isMobile()) {\n <sidebar-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-v3>\n } @else {\n <sidebar-mobile-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-mobile-v3>\n }\n}\n\n@if (_userInfo && _sidebarV2) {\n @if (!isMobile()) {\n <sidebar-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-v2>\n } @else {\n <sidebar-mobile-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-mobile-v2>\n }\n}\n","import { Component, inject, signal } from '@angular/core';\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 } from '../../../../services';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n// End\n\n@Component({\n selector: 'app-home-page',\n imports: [SdIcon, SdPageComponent, TranslatePipe],\n templateUrl: './home-page.component.html',\n styleUrl: './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 {\n /* ignore */\n }\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 <sd-icon class=\"hero-icon\" name=\"space_dashboard\"></sd-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 <sd-icon class=\"feature-icon\" [name]=\"feature.icon\"></sd-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 private readonly router = inject(Router);\n private readonly layoutConfiguration: ISdLayoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\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 } from '../../../../services';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrl: './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 } from '../../../../services';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrl: './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":["LayoutUserComponent","i1","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/menu/menu.utils.ts","../../../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/responsive/responsive.service.ts","../../../projects/sdcorejs-angular/modules/layout/services/navigation-state/navigation-state.service.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/shared/user-menu/user-menu.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/user-menu/user-menu.component.html","../../../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/shared/menu-tree/menu-tree.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/menu-tree/menu-tree.component.html","../../../projects/sdcorejs-angular/modules/layout/components/shared/search-field/search-field.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/search-field/search-field.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v2/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v2/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v2/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v2/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v3/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v3/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v3/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v3/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/utils/tab-name.util.ts","../../../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 styleUrl: './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 { SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutRootMenu } from './menu.model';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\nexport function getMenuStableKey(menu: SdLayoutMenu | null | undefined, ancestors: string[] = []): string {\n if (!menu || typeof menu !== 'object') return '';\n if (typeof menu.id === 'string' && menu.id.trim()) return `id:${menu.id.trim()}`;\n if ('path' in menu && typeof menu.path === 'string' && menu.path.trim()) return `path:${menu.path.trim()}`;\n\n const title = typeof menu.title === 'string' ? menu.title.trim() : '';\n const segments = [...ancestors, title]\n .map(segment => StringUtilities.changeAliasLowerCase(segment).trim().replace(/\\s+/g, '-'))\n .filter(Boolean);\n return segments.length ? `group:${segments.join('/')}` : '';\n}\n\nexport function searchMenuLeaves(menus: SdLayoutMenu[], query: string): SdLayoutRootMenu[] {\n const leaves = flattenMenuLeaves(menus);\n const normalizedQuery = query?.trim();\n if (!normalizedQuery) return leaves;\n return leaves.filter(menu =>\n [menu.title, menu.tooltipTitle].some(value => value && StringUtilities.aliasIncludes(value, normalizedQuery))\n );\n}\n\nexport function selectPrimaryMenuGroups(menus: SdLayoutMenu[], requestedIds: string[] | undefined, maximum = 3): SdLayoutMenu[] {\n const limit = Number.isFinite(maximum) && maximum > 0 ? Math.min(3, Math.floor(maximum)) : 3;\n const byId = new Map(menus.filter(menu => typeof menu.id === 'string').map(menu => [menu.id!, menu]));\n const selected: SdLayoutMenu[] = [];\n const selectedKeys = new Set<string>();\n\n for (const id of requestedIds ?? []) {\n const menu = byId.get(id);\n const key = getMenuStableKey(menu);\n if (!menu || !key || selectedKeys.has(key)) continue;\n selected.push(menu);\n selectedKeys.add(key);\n if (selected.length === limit) return selected;\n }\n\n for (const menu of menus) {\n const key = getMenuStableKey(menu);\n if (!key || selectedKeys.has(key)) continue;\n selected.push(menu);\n selectedKeys.add(key);\n if (selected.length === limit) break;\n }\n return selected;\n}\n\nexport function resolveMenuKeys(menus: SdLayoutMenu[], keys: string[]): (SdLayoutRootMenu | SdLayoutChildrenMenu)[] {\n const menuByKey = new Map<string, SdLayoutMenu>();\n visitMenus(menus, [], (menu, ancestors) => {\n const key = getMenuStableKey(menu, ancestors);\n if (key && !menuByKey.has(key)) menuByKey.set(key, menu);\n });\n return [...new Set(keys)].map(key => menuByKey.get(key)).filter((menu): menu is SdLayoutMenu => !!menu);\n}\n\nexport function flattenMenuLeaves(menus: SdLayoutMenu[]): SdLayoutRootMenu[] {\n const leaves: SdLayoutRootMenu[] = [];\n visitMenus(menus, [], menu => {\n if ('path' in menu && typeof menu.path === 'string' && menu.path) leaves.push(menu);\n });\n return leaves;\n}\n\nfunction visitMenus(\n menus: SdLayoutMenu[] | undefined,\n ancestors: string[],\n visitor: (menu: SdLayoutMenu, ancestors: string[]) => void\n): void {\n for (const menu of menus ?? []) {\n if (!menu || typeof menu !== 'object') continue;\n visitor(menu, ancestors);\n if ('children' in menu && Array.isArray(menu.children)) {\n const title = typeof menu.title === 'string' && menu.title.trim() ? menu.title.trim() : getMenuStableKey(menu, ancestors);\n visitMenus(menu.children, title ? [...ancestors, title] : ancestors, visitor);\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { SdStorage, SdStorageService } from '@sdcorejs/angular/services';\nimport { SdLayoutChildrenMenu, SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdLayoutStorageService {\n readonly #sdStorageService = inject(SdStorageService);\n\n readonly isShowSidebar: SdStorage<boolean> = this.#sdStorageService.create('cb07c316-ed6d-4620-9e92-53dbef6aa983');\n readonly menuLockStatus: SdStorage<boolean> = this.#sdStorageService.create('2c2f4816-18b3-4ec3-8177-7b90bff036c3');\n readonly lastActiveMenuGroupId: SdStorage<string> = this.#sdStorageService.create('2e6961d0-3380-4a94-a6a1-38837560cd96');\n readonly pinnedMenuGroup: SdStorage<SdLayoutChildrenMenu> = this.#sdStorageService.create('e81da122-5dab-4250-b309-64197fb19d44');\n readonly pinnedMenuKeys: SdStorage<string[]> = this.#sdStorageService.create('4bdc7f80-9ff4-4fe0-908f-6c9f7fe4100a');\n readonly recentMenuKeys: SdStorage<string[]> = this.#sdStorageService.create('fb989dc1-f6e7-4b62-a611-861a8f214a51');\n readonly versionStates: SdStorage<Record<string, SdLayoutVersionState>> = this.#sdStorageService.create(\n 'ca8e4261-fbd4-4209-af88-2dbe278c1a1b'\n );\n\n readPinnedMenuKeys(menus: SdLayoutMenu[]): string[] {\n const storedKeys = this.pinnedMenuKeys.has() ? this.pinnedMenuKeys.get() : this.#getLegacyPinnedKeys();\n const validKeys = this.#resolveValidKeys(menus, storedKeys ?? []);\n if (!this.pinnedMenuKeys.has() || !this.#sameKeys(storedKeys ?? [], validKeys)) {\n this.pinnedMenuKeys.set(validKeys);\n }\n return validKeys;\n }\n\n writePinnedMenuKeys(keys: string[]): void {\n this.pinnedMenuKeys.set([...new Set(keys.filter(Boolean))]);\n }\n\n readRecentMenuKeys(menus: SdLayoutMenu[], maximum = 5): string[] {\n const storedKeys = this.recentMenuKeys.get() ?? [];\n const limit = Number.isFinite(maximum) && maximum > 0 ? Math.floor(maximum) : 5;\n const validKeys = this.#resolveValidKeys(menus, storedKeys).slice(0, limit);\n if (!this.#sameKeys(storedKeys, validKeys)) this.recentMenuKeys.set(validKeys);\n return validKeys;\n }\n\n writeRecentMenuKeys(keys: string[]): void {\n this.recentMenuKeys.set([...new Set(keys.filter(Boolean))]);\n }\n\n readVersionState(version: 1 | 2 | 3): SdLayoutVersionState {\n return this.versionStates.get()?.[String(version)] ?? {};\n }\n\n patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): SdLayoutVersionState {\n const states = this.versionStates.get() ?? {};\n const nextState = { ...(states[String(version)] ?? {}), ...patch };\n this.versionStates.set({ ...states, [String(version)]: nextState });\n return nextState;\n }\n\n #getLegacyPinnedKeys(): string[] {\n const legacyGroup = this.pinnedMenuGroup.get();\n if (!legacyGroup || !Array.isArray(legacyGroup.children)) return [];\n return legacyGroup.children.map(menu => getMenuStableKey(menu)).filter(Boolean);\n }\n\n #resolveValidKeys(menus: SdLayoutMenu[], keys: string[]): string[] {\n return resolveMenuKeys(menus, keys)\n .map(menu => getMenuStableKey(menu))\n .filter(Boolean);\n }\n\n #sameKeys(left: string[], right: string[]): boolean {\n return left.length === right.length && left.every((key, index) => key === right[index]);\n }\n}\n\nexport interface SdLayoutVersionState {\n activeGroupKey?: string;\n locked?: boolean;\n collapsed?: boolean;\n}\n","import { InjectionToken, Signal } from '@angular/core';\nimport { MaybeAsync } from '@sdcorejs/utils/models';\nimport { Observable } from 'rxjs';\n\n/** Consumer-owned account action invoked without arguments by the shared user menu. */\nexport type SdLayoutAccountAction = () => void | Promise<void>;\n\n/** Notification badge source and the action that opens the consumer's notification experience. */\nexport interface SdLayoutNotificationConfiguration {\n /**\n * Số lượng thông báo chưa đọc. Hỗ trợ giá trị tĩnh hoặc nguồn reactive dài hạn.\n */\n count: number | Signal<number> | Observable<number>;\n\n /**\n * Tác vụ do consumer xử lý khi người dùng chọn thông báo.\n */\n action: SdLayoutAccountAction;\n}\n\nexport interface ISdLayoutConfiguration {\n homeUrl?: string;\n mobileBreakpoint?: number;\n sidebar: ISdSidebarConfiguration | (() => MaybeAsync<ISdSidebarConfiguration>);\n userInfo: SdLayoutUserInfo | (() => MaybeAsync<SdLayoutUserInfo>);\n signout: SdLayoutAccountAction;\n changePassword?: SdLayoutAccountAction;\n\n /**\n * Tác vụ chỉnh sửa hồ sơ do consumer cung cấp.\n */\n updateProfile?: SdLayoutAccountAction;\n\n /**\n * Tác vụ mở thiết lập tài khoản do consumer cung cấp.\n */\n setting?: SdLayoutAccountAction;\n\n /**\n * Cấu hình số lượng và tác vụ thông báo của tài khoản.\n */\n notification?: SdLayoutNotificationConfiguration;\n}\n\n/** Optional role metadata rendered below the user's email when `text` is non-empty. */\nexport interface SdLayoutUserRole {\n text: string;\n /** Icon name resolved by `SdIcon`. */\n icon?: string;\n /** CSS color applied to the role metadata. */\n color?: string;\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 /**\n * Chức vụ hoặc vai trò hiển thị cùng thông tin người dùng.\n * Không render khi `text` rỗng.\n */\n role?: SdLayoutUserRole;\n}\n\nexport const DEFAULT_LAYOUT_MOBILE_BREAKPOINT = 1024;\n\nexport interface SidebarConfigurationBase {\n brandColor?: string;\n brandLightColor?: string;\n logoUrl?: string;\n defaultTitle?: string;\n pin?: {\n enabled?: boolean;\n };\n}\n\nexport type ISdSidebarConfiguration = SidebarConfigurationV1 | SidebarConfigurationV2 | SidebarConfigurationV3;\n\nexport interface SidebarConfigurationV1 extends SidebarConfigurationBase {\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 interface SidebarConfigurationV2 extends SidebarConfigurationBase {\n version: 2;\n interaction?: 'click' | 'hover-lock';\n primaryMenuIds?: string[];\n}\n\nexport interface SidebarConfigurationV3 extends SidebarConfigurationBase {\n version: 3;\n defaultCollapsed?: boolean;\n recent?: {\n enabled?: boolean;\n maxItems?: number;\n };\n}\n\nexport interface ResolvedSidebarRecentConfiguration {\n enabled: boolean;\n maxItems: number;\n}\n\nexport function normalizeLayoutMobileBreakpoint(value: number | undefined): number {\n if (!Number.isFinite(value) || Number(value) <= 0) {\n return DEFAULT_LAYOUT_MOBILE_BREAKPOINT;\n }\n return Math.floor(Number(value));\n}\n\nexport function resolveSidebarV2Interaction(sidebar: SidebarConfigurationV2): 'click' | 'hover-lock' {\n return sidebar.interaction === 'hover-lock' ? 'hover-lock' : 'click';\n}\n\nexport function resolveSidebarV3Recent(sidebar: SidebarConfigurationV3): ResolvedSidebarRecentConfiguration {\n const configuredLimit = sidebar.recent?.maxItems;\n const maxItems = Number.isFinite(configuredLimit) && Number(configuredLimit) > 0 ? Math.floor(Number(configuredLimit)) : 5;\n return {\n enabled: sidebar.recent?.enabled ?? true,\n maxItems,\n };\n}\n\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV1): SidebarConfigurationV1;\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV2): SidebarConfigurationV2;\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV3): SidebarConfigurationV3;\nexport function normalizeSidebarConfiguration(sidebar: ISdSidebarConfiguration): ISdSidebarConfiguration {\n if (sidebar.version === 2) {\n return {\n ...sidebar,\n interaction: resolveSidebarV2Interaction(sidebar),\n primaryMenuIds: [...new Set((sidebar.primaryMenuIds ?? []).filter(id => typeof id === 'string' && id.trim()))].slice(0, 3),\n };\n }\n if (sidebar.version === 3) {\n return {\n ...sidebar,\n defaultCollapsed: sidebar.defaultCollapsed ?? false,\n recent: resolveSidebarV3Recent(sidebar),\n };\n }\n return sidebar;\n}\n\nexport const SD_LAYOUT_CONFIGURATION = new InjectionToken<ISdLayoutConfiguration>('sd.layout.configuration');\n","import { Injectable, inject } from '@angular/core';\nimport { SD_VIEWPORT, SdViewport, SdViewportService } from '@sdcorejs/angular/services/viewport';\nimport { normalizeLayoutMobileBreakpoint } from '../../configurations';\n\nexport type SdLayoutViewport = SdViewport;\nexport const SD_LAYOUT_VIEWPORT = SD_VIEWPORT;\n\n/** @deprecated Prefer `SdViewportService` from `@sdcorejs/angular/services/viewport`. */\n@Injectable({ providedIn: 'root' })\nexport class SdLayoutResponsiveService {\n readonly #viewport = inject(SdViewportService);\n readonly viewportWidth = this.#viewport.width;\n\n isMobile(breakpoint: number): boolean {\n return this.viewportWidth() < normalizeLayoutMobileBreakpoint(breakpoint);\n }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { ResolvedSidebarRecentConfiguration } from '../../configurations';\nimport { SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\nimport { SdLayoutStorageService, SdLayoutVersionState } from '../storage/storage.service';\n\n@Injectable({ providedIn: 'root' })\nexport class SdLayoutNavigationStateService {\n readonly #storage = inject(SdLayoutStorageService);\n readonly #menus = signal<SdLayoutMenu[]>([]);\n readonly pinnedKeys = signal<string[]>([]);\n readonly recentKeys = signal<string[]>([]);\n readonly pinnedMenus = computed(() => resolveMenuKeys(this.#menus(), this.pinnedKeys()));\n readonly recentMenus = computed(() => resolveMenuKeys(this.#menus(), this.recentKeys()));\n\n hydrate(menus: SdLayoutMenu[], recentMaximum = 5): void {\n this.#menus.set(menus);\n this.pinnedKeys.set(this.#storage.readPinnedMenuKeys(menus));\n this.recentKeys.set(this.#storage.readRecentMenuKeys(menus, recentMaximum));\n }\n\n togglePinned(menu: SdLayoutMenu): void {\n const key = getMenuStableKey(menu);\n if (!key) return;\n const nextKeys = this.pinnedKeys().includes(key)\n ? this.pinnedKeys().filter(currentKey => currentKey !== key)\n : [...this.pinnedKeys(), key];\n this.pinnedKeys.set(nextKeys);\n this.#storage.writePinnedMenuKeys(nextKeys);\n }\n\n recordRecent(menu: SdLayoutMenu, configuration: ResolvedSidebarRecentConfiguration): void {\n if (!configuration.enabled) return;\n const key = getMenuStableKey(menu);\n if (!key) return;\n const maximum = Number.isFinite(configuration.maxItems) && configuration.maxItems > 0 ? Math.floor(configuration.maxItems) : 5;\n const nextKeys = [key, ...this.recentKeys().filter(currentKey => currentKey !== key)].slice(0, maximum);\n this.recentKeys.set(nextKeys);\n this.#storage.writeRecentMenuKeys(nextKeys);\n }\n\n patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): void {\n this.#storage.patchVersionState(version, patch);\n }\n\n versionState(version: 1 | 2 | 3): SdLayoutVersionState {\n return this.#storage.readVersionState(version);\n }\n}\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, inject } 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 private permissionService = inject(SdPermissionService);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\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 (\n (typeof menu.permission === 'string' || Array.isArray(menu.permission)) &&\n this.permissionService.hasPermission(menu.permission, menu.permissionKey)\n ) {\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 explicitId = typeof menu.id === 'string' ? menu.id.trim() : '';\n if (explicitId) return explicitId;\n\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)[] = [\n 'title',\n 'path',\n 'permission',\n 'permissionKey',\n 'queryParams',\n 'icon',\n 'level',\n 'tooltipTitle',\n ];\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 aliasKeyword = StringUtilities.changeAliasLowerCase(keyword);\n const aliasLowerCaseStr = StringUtilities.changeAliasLowerCase(value);\n\n // Ưu tiên highlight theo chuỗi con liền nhau (khớp trực tiếp với tiêu đề/route)\n const substringHighlight = this.#highlightSubstring(value, aliasLowerCaseStr, aliasKeyword, color);\n if (substringHighlight !== null) {\n return substringHighlight;\n }\n\n // Không có chuỗi con nào khớp -> thử highlight theo ký tự đầu (viết tắt), vd \"sp\" -> \"Sản phẩm\"\n return this.#highlightOrderedInitials(value, aliasLowerCaseStr, aliasKeyword, color) ?? value;\n }\n\n #highlightSubstring = (value: string, aliasLowerCaseStr: string, aliasKeyword: string, color: string): string | null => {\n const regex = new RegExp(aliasKeyword, 'gi'); //'gi' for case insensitive and can use 'g' if you want the search to be case sensitive.\n const strs: string[] = [];\n let previousOffset = 0;\n let hasMatch = false;\n aliasLowerCaseStr.replace(regex, (_, offset) => {\n hasMatch = true;\n strs.push(value.substring(previousOffset, offset));\n strs.push(`<mark style=\"background-color: ${color}\">${value.substring(offset, offset + aliasKeyword.length)}</mark>`);\n previousOffset = offset + aliasKeyword.length;\n return `<mark style=\"background-color: ${color}\">${value.substring(offset, offset + aliasKeyword.length)}</mark>`;\n });\n if (!hasMatch) {\n return null;\n }\n strs.push(value.substring(previousOffset, value.length));\n return strs.join('');\n };\n\n #highlightOrderedInitials = (value: string, aliasLowerCaseStr: string, aliasKeyword: string, color: string): string | null => {\n const wordRegex = /\\S+/g;\n const matchedPositions: number[] = [];\n let matchedCount = 0;\n let wordMatch: RegExpExecArray | null;\n while ((wordMatch = wordRegex.exec(aliasLowerCaseStr))) {\n if (matchedCount >= aliasKeyword.length) {\n break;\n }\n if (wordMatch[0][0] === aliasKeyword[matchedCount]) {\n matchedPositions.push(wordMatch.index);\n matchedCount++;\n }\n }\n if (matchedCount !== aliasKeyword.length) {\n return null;\n }\n\n let result = '';\n let cursor = 0;\n for (const position of matchedPositions) {\n result += value.substring(cursor, position);\n result += `<mark style=\"background-color: ${color}\">${value.charAt(position)}</mark>`;\n cursor = position + 1;\n }\n result += value.substring(cursor);\n return result;\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 { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n isSignal,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdAvatar } from '@sdcorejs/angular/components';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { isObservable } from 'rxjs';\nimport {\n SD_LAYOUT_CONFIGURATION,\n SdLayoutAccountAction,\n SdLayoutNotificationConfiguration,\n SdLayoutUserInfo,\n} from '../../../configurations';\n\n@Component({\n selector: 'sd-layout-user-menu',\n standalone: true,\n imports: [SdAvatar, SdIcon, TranslatePipe],\n templateUrl: './user-menu.component.html',\n styleUrl: './user-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutUserMenuComponent {\n readonly #configuration = inject(SD_LAYOUT_CONFIGURATION, { optional: true });\n readonly #destroyRef = inject(DestroyRef);\n readonly #document = inject(DOCUMENT);\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n private readonly menu = viewChild<ElementRef<HTMLElement>>('menu');\n\n userInfo = input.required<SdLayoutUserInfo>();\n signout = input<SdLayoutAccountAction | undefined>();\n changePassword = input<SdLayoutAccountAction | undefined>();\n updateProfile = input<SdLayoutAccountAction | undefined>();\n setting = input<SdLayoutAccountAction | undefined>();\n notification = input<SdLayoutNotificationConfiguration | undefined>();\n compact = input(false);\n presentation = input<'disclosure' | 'mobile' | 'mobile-inline'>('disclosure');\n opened = output<void>();\n closed = output<void>();\n isOpen = signal(false);\n readonly #observableNotificationCount = signal<number | undefined>(undefined);\n\n avatar = computed(() => {\n const user = this.userInfo();\n return user.avatar || user.fullName || user.username || user.email;\n });\n displayName = computed(() => this.userInfo().fullName || this.userInfo().username || this.userInfo().email || 'User');\n role = computed(() => {\n const role = this.userInfo().role;\n const text = role?.text?.trim();\n return text ? { ...role, text } : undefined;\n });\n signoutAction = computed(() => this.signout() ?? this.#configuration?.signout);\n changePasswordAction = computed(() => this.changePassword() ?? this.#configuration?.changePassword);\n updateProfileAction = computed(() => this.updateProfile() ?? this.#configuration?.updateProfile);\n settingAction = computed(() => this.setting() ?? this.#configuration?.setting);\n notificationConfiguration = computed(() => this.notification() ?? this.#configuration?.notification);\n notificationAction = computed(() => this.notificationConfiguration()?.action);\n notificationCount = computed(() => {\n const source = this.notificationConfiguration()?.count;\n const value = isSignal(source) ? source() : isObservable(source) ? this.#observableNotificationCount() : source;\n return this.#normalizeNotificationCount(value);\n });\n notificationBadge = computed(() => {\n const count = this.notificationCount();\n return count > 99 ? '99+' : count > 0 ? String(count) : undefined;\n });\n\n constructor() {\n // Observable sources may change with component inputs; effect cleanup guarantees one active subscription.\n effect(onCleanup => {\n const source = this.notificationConfiguration()?.count;\n this.#observableNotificationCount.set(undefined);\n if (!isObservable(source)) return;\n\n const subscription = source.subscribe(value => this.#observableNotificationCount.set(value));\n onCleanup(() => subscription.unsubscribe());\n });\n\n effect(() => {\n if (!this.isOpen()) return;\n this.menu()?.nativeElement.querySelector<HTMLButtonElement>('[role=\"menuitem\"]')?.focus();\n });\n\n const onDocumentKeydown = (event: KeyboardEvent): void => {\n if (!this.isOpen() || event.key !== 'Escape') return;\n event.preventDefault();\n this.close();\n };\n const onDocumentPointerDown = (event: PointerEvent): void => {\n if (!this.isOpen()) return;\n const nodeConstructor = this.#document.defaultView?.Node;\n if (!nodeConstructor || !(event.target instanceof nodeConstructor) || this.#host.nativeElement.contains(event.target)) return;\n this.close(false);\n };\n\n this.#document.addEventListener('keydown', onDocumentKeydown);\n this.#document.addEventListener('pointerdown', onDocumentPointerDown);\n this.#destroyRef.onDestroy(() => {\n this.#document.removeEventListener('keydown', onDocumentKeydown);\n this.#document.removeEventListener('pointerdown', onDocumentPointerDown);\n });\n }\n\n open(): void {\n if (this.isOpen()) return;\n this.isOpen.set(true);\n this.opened.emit();\n }\n\n toggle(): void {\n if (this.isOpen()) this.close(false);\n else this.open();\n }\n\n close(restoreFocus = true): void {\n const wasOpen = this.isOpen();\n this.isOpen.set(false);\n if (wasOpen) this.closed.emit();\n if (restoreFocus) this.trigger()?.nativeElement.focus();\n }\n\n onMenuKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close();\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || !(event.currentTarget instanceof HTMLElement)) return;\n\n const actions = [...event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"menuitem\"]')];\n if (!actions.length) return;\n event.preventDefault();\n const currentIndex = actions.findIndex(action => action === this.#document.activeElement);\n const nextIndex =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? actions.length - 1\n : event.key === 'ArrowDown'\n ? (currentIndex + 1) % actions.length\n : (currentIndex - 1 + actions.length) % actions.length;\n actions[nextIndex].focus();\n }\n\n runChangePassword(): void {\n this.#runAction(this.changePasswordAction());\n }\n\n runSignout(): void {\n this.#runAction(this.signoutAction());\n }\n\n runUpdateProfile(): void {\n this.#runAction(this.updateProfileAction());\n }\n\n runSetting(): void {\n this.#runAction(this.settingAction());\n }\n\n runNotification(): void {\n this.#runAction(this.notificationAction());\n }\n\n #runAction(action: SdLayoutAccountAction | undefined): void {\n action?.();\n this.close();\n }\n\n #normalizeNotificationCount(value: number | undefined): number {\n return Number.isFinite(value) && Number(value) > 0 ? Math.floor(Number(value)) : 0;\n }\n}\n","@let _presentation = presentation();\n@let _role = role();\n@let _notificationBadge = notificationBadge();\n<div class=\"sd-layout-user-menu position-relative\">\n @if (_presentation !== 'disclosure') {\n <div class=\"sd-layout-user-menu__mobile d-flex flex-column gap-8\">\n <div\n data-mobile-account-row\n class=\"sd-layout-user-menu__mobile-row sd-layout-user-menu__mobile--inline d-flex align-items-center gap-8\">\n <div data-user-summary class=\"sd-layout-user-menu__summary d-flex align-items-center gap-8 flex-1\">\n <sd-avatar [src]=\"avatar()\" [size]=\"40\"></sd-avatar>\n <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n @if (_role) {\n <span\n data-user-role\n class=\"sd-layout-user-menu__role d-flex align-items-center gap-4 T12R text-ellipsis\"\n [style.color]=\"_role.color\">\n @if (_role.icon) {\n <sd-icon [name]=\"_role.icon\"></sd-icon>\n }\n {{ _role.text }}\n </span>\n }\n </span>\n </div>\n @if (signoutAction()) {\n <button\n type=\"button\"\n data-user-action=\"signout\"\n class=\"sd-layout-user-menu__action sd-layout-user-menu__signout d-flex align-items-center gap-8 px-8 py-8 T14R text-left text-error\"\n (click)=\"runSignout()\">\n <sd-icon name=\"logout\"></sd-icon>\n {{ 'core.module.layout.user.logout' | translate }}\n </button>\n }\n </div>\n\n @if (updateProfileAction() || settingAction() || notificationAction() || changePasswordAction()) {\n <div data-mobile-account-actions class=\"sd-layout-user-menu__mobile-actions d-flex flex-column gap-4\">\n @if (updateProfileAction()) {\n <button\n type=\"button\"\n data-user-action=\"update-profile\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runUpdateProfile()\">\n <sd-icon name=\"edit\"></sd-icon>\n {{ 'core.module.layout.user.update-profile' | translate }}\n </button>\n }\n @if (settingAction()) {\n <button\n type=\"button\"\n data-user-action=\"setting\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runSetting()\">\n <sd-icon name=\"settings\"></sd-icon>\n {{ 'core.module.layout.user.setting' | translate }}\n </button>\n }\n @if (notificationAction()) {\n <button\n type=\"button\"\n data-user-action=\"notification\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runNotification()\">\n <sd-icon name=\"notifications\"></sd-icon>\n <span class=\"flex-1\">{{ 'core.module.layout.user.notification' | translate }}</span>\n @if (_notificationBadge) {\n <span data-notification-badge class=\"sd-layout-user-menu__badge\">{{ _notificationBadge }}</span>\n }\n </button>\n }\n @if (changePasswordAction()) {\n <button\n type=\"button\"\n data-user-action=\"change-password\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runChangePassword()\">\n <sd-icon name=\"lock\"></sd-icon>\n {{ 'core.module.layout.user.change-password' | translate }}\n </button>\n }\n </div>\n }\n </div>\n } @else {\n <button\n #trigger\n type=\"button\"\n data-user-trigger\n class=\"sd-layout-user-menu__trigger d-flex align-items-center text-left\"\n [class.sd-layout-user-menu__trigger--compact]=\"compact()\"\n [class.w-full]=\"!compact()\"\n [class.gap-8]=\"!compact()\"\n [class.w-56]=\"compact()\"\n [class.gap-0]=\"compact()\"\n aria-haspopup=\"menu\"\n [attr.aria-label]=\"compact() ? displayName() : null\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"toggle()\">\n <sd-avatar [src]=\"avatar()\" [size]=\"compact() ? 32 : 40\"></sd-avatar>\n @if (!compact()) {\n <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n </span>\n <sd-icon [name]=\"isOpen() ? 'expand_less' : 'expand_more'\"></sd-icon>\n }\n </button>\n\n @if (isOpen()) {\n <div\n #menu\n data-user-menu\n class=\"sd-layout-user-menu__popup d-flex flex-column gap-4 p-8 bg-white border border-black200 rounded-8 mat-elevation-z4\"\n role=\"menu\"\n tabindex=\"-1\"\n (keydown)=\"onMenuKeydown($event)\">\n <div data-user-identity class=\"sd-layout-user-menu__identity d-flex align-items-center gap-8 px-8 py-4\">\n <sd-avatar [src]=\"avatar()\" [size]=\"40\"></sd-avatar>\n <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n @if (userInfo().email) {\n <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n }\n @if (_role) {\n <span\n data-user-role\n class=\"sd-layout-user-menu__role d-flex align-items-center gap-4 T12R text-ellipsis\"\n [style.color]=\"_role.color\">\n @if (_role.icon) {\n <sd-icon [name]=\"_role.icon\"></sd-icon>\n }\n {{ _role.text }}\n </span>\n }\n </span>\n </div>\n @if (updateProfileAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"update-profile\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runUpdateProfile()\">\n <sd-icon name=\"edit\"></sd-icon>\n {{ 'core.module.layout.user.update-profile' | translate }}\n </button>\n }\n @if (settingAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"setting\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runSetting()\">\n <sd-icon name=\"settings\"></sd-icon>\n {{ 'core.module.layout.user.setting' | translate }}\n </button>\n }\n @if (notificationAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"notification\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runNotification()\">\n <sd-icon name=\"notifications\"></sd-icon>\n <span class=\"flex-1\">{{ 'core.module.layout.user.notification' | translate }}</span>\n @if (_notificationBadge) {\n <span data-notification-badge class=\"sd-layout-user-menu__badge\">{{ _notificationBadge }}</span>\n }\n </button>\n }\n @if (changePasswordAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"change-password\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n (click)=\"runChangePassword()\">\n <sd-icon name=\"lock\"></sd-icon>\n {{ 'core.module.layout.user.change-password' | translate }}\n </button>\n }\n @if (signoutAction()) {\n <button\n type=\"button\"\n role=\"menuitem\"\n data-user-action=\"signout\"\n class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left text-error\"\n (click)=\"runSignout()\">\n <sd-icon name=\"logout\"></sd-icon>\n {{ 'core.module.layout.user.logout' | translate }}\n </button>\n }\n </div>\n }\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo } from '../../../../configurations';\nimport { SdLayoutUserMenuComponent } from '../../../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrl: './user.component.scss',\n imports: [SdIcon, SdLayoutUserMenuComponent, TranslatePipe],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutUserComponent {\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 onMenuOpened(): void {\n this.menuOpened.emit();\n }\n\n onMenuClosed(): void {\n this.menuClosed.emit();\n }\n\n onToggleMenuLock(event: Event): void {\n this.toggleMenuLock.emit(event);\n }\n}\n","<div class=\"c-layout-user-wrapper\">\n <sd-layout-user-menu\n class=\"c-layout-user-avatar\"\n [userInfo]=\"userInfo()\"\n [compact]=\"true\"\n (opened)=\"onMenuOpened()\"\n (closed)=\"onMenuClosed()\"></sd-layout-user-menu>\n\n @if (!isMobileOrTablet()) {\n <button\n type=\"button\"\n class=\"c-layout-icon-toggle\"\n [attr.aria-label]=\"'core.module.layout.sidebar.toggle' | translate\"\n (click)=\"onToggleMenuLock($event)\">\n <sd-icon [name]=\"isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left'\"></sd-icon>\n </button>\n }\n</div>\n","import { NestedTreeControl } from '@angular/cdk/tree';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, 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 { 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 { 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, SdLayoutNavigationStateService, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sidebar',\n standalone: true,\n imports: [\n SdIcon,\n SdInput,\n FormsModule,\n CommonModule,\n RouterModule,\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 changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarComponent {\n // ==========================================\n // INJECT SERVICES (Thay thế Constructor rườm rà)\n // ==========================================\n #router = inject(Router);\n #layoutStorageService = inject(SdLayoutStorageService);\n #navigationState = inject(SdLayoutNavigationStateService);\n #menuFocusPipe = inject(MenuFocusPipe);\n #window = inject(DOCUMENT).defaultView;\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 isMobile = input(false);\n expandSideBar = output<void>();\n popupUserMenuClosed = output<void>();\n popupUserMenuOpened = output<void>();\n showSideBar = output<boolean | null>();\n\n // ==========================================\n // STATE SIGNALS\n // ==========================================\n isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n currentPath = signal<string>(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\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 = computed<SdLayoutChildrenMenu>(() => ({\n id: 'pinned-menu-group',\n title: 'Đã ghim',\n children: this.#navigationState.pinnedMenus(),\n }));\n\n // ==========================================\n // COMPUTED STATE\n // ==========================================\n totalMenuInMenusByGroup = computed(() => this.#getTotalMenus(this.menusByGroup()));\n logoUrl = computed(() => this.sidebar().logoUrl?.trim() || undefined);\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 = 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 this.#navigationState.hydrate(currentMenus);\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 const currentPath = event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '';\n if (this.currentPath() !== currentPath) {\n this.currentPath.set(currentPath);\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 this.#navigationState.togglePinned(node);\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 this.#router.navigateByUrl('/layout/home');\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 this.#window?.open(path, '_blank', 'noopener');\n return;\n }\n this.#router.navigate([path.split('?')[0]], {\n queryParams,\n state: { switchTab: true },\n });\n\n if (this.isMobile()) {\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(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\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 =\n brandLightColorOpacity || 'color-mix(in srgb, var(--sd-primary-light, #d7e3ff) 60%, transparent)';\n if (!(menuGroupIcon instanceof HTMLImageElement)) {\n menuGroupIcon.style.color = this.sidebar()?.brandColor || 'var(--sd-primary, #005cbb)';\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 = 'var(--sd-text-secondary, #44474f)';\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 || 'var(--sd-primary, #005cbb)';\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 // why: hỗ trợ search theo route (path) và search theo ký tự đầu (viết tắt) bên cạnh search theo tiêu đề\n const matchByRoutePath = 'path' in menu && !!menu.path && menu.path.toLowerCase().includes(aliasSearchText);\n const matchByInitials = this.#matchesTitleInitials(aliasTitle, aliasSearchText);\n\n if (aliasTitle.includes(aliasSearchText) || matchByRoutePath || matchByInitials) {\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 #matchesTitleInitials = (aliasTitle: string, aliasSearchText: string): boolean => {\n const initials = aliasTitle\n .split(' ')\n .filter(word => word)\n .map(word => word[0])\n .join('');\n return this.#isOrderedSubsequence(aliasSearchText, initials);\n };\n\n #isOrderedSubsequence = (needle: string, haystack: string): boolean => {\n let matchedCount = 0;\n for (const char of haystack) {\n if (char === needle[matchedCount]) {\n matchedCount++;\n }\n }\n return matchedCount === needle.length;\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 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.#countMenuNode(menu), 0);\n };\n\n #countMenuNode = (menu: SdLayoutMenu): number => {\n if (!('children' in menu) || !menu.children?.length) {\n return 1;\n }\n\n let count = 1;\n for (const child of menu.children) {\n count += this.#countMenuNode(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]=\"isMobile() ? '100dvh' : '100%'\">\n <div class=\"c-header\">\n <div class=\"c-logo\">\n <a href=\"javascript:;\" aria-label=\"Trang chủ\" (click)=\"openHomePage()\">\n @if (logoUrl(); as _logoUrl) {\n <img alt=\"\" [src]=\"_logoUrl\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n </a>\n </div>\n <div class=\"c-title-menu-group\" [class.d-none]=\"!isShowSidebar()\">\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 <sd-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color: isPinnedMenuGroupActive()\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text-secondary, #44474f)',\n backgroundColor: isPinnedMenuGroupActive()\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\"\n name=\"push_pin\"></sd-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:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\">\n <img width=\"24px\" height=\"24px\" [src]=\"nodeMenuGroup.iconUrl\" [alt]=\"nodeMenuGroup.title\" />\n </span>\n } @else {\n <sd-icon\n class=\"c-menu-group-icon\"\n [ngStyle]=\"{\n color:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text-secondary, #44474f)',\n backgroundColor:\n idMenuGroupActive() === nodeMenuGroup?.id\n ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n : 'transparent',\n }\"\n [name]=\"nodeMenuGroup.icon || 'widgets'\"></sd-icon>\n }\n </button>\n }\n </div>\n <div class=\"c-menu-tree\" [class.d-none]=\"!isShowSidebar()\" [attr.inert]=\"!isShowSidebar() ? '' : null\">\n @if (totalMenuInMenusByGroup() > 10) {\n <div style=\"padding: 0px 4px\" class=\"c-menu-tree-search\">\n <sd-input\n size=\"sm\"\n [placeholder]=\"'core.module.layout.sidebar.search' | translate\"\n [autoId]=\"'layout-v1-menu-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"onFilterSearchText($event)\">\n <ng-template sdSuffixDef>\n @if (searchText()) {\n <sd-icon class=\"c-search-prefix-icon cancel\" (click)=\"onClearSearchText()\" name=\"cancel\"></sd-icon>\n } @else {\n <sd-icon class=\"c-search-prefix-icon search\" name=\"search\"></sd-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:\n (currentPath() | menuFocus: node) ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)' : '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:\n (currentPath() | menuFocus: node)\n ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n : 'var(--sd-text, #1a1b1f)',\n }\"\n [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\n\n @if (_sidebar?.pin?.enabled) {\n <sd-icon\n class=\"c-menu-node-description-icon-pin\"\n [style.opacity]=\"isPinnedNode(node) || isHoveredNode(node) ? '1' : null\"\n [style.color]=\"\n isPinnedNode(node) || isHoveredNode(node) ? sidebar().brandColor || 'var(--sd-primary, #005cbb)' : null\n \"\n (click)=\"onTogglePin($event, node)\"\n name=\"push_pin\"></sd-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 <sd-icon\n class=\"c-menu-node-description-icon-expand\"\n [name]=\"treeControl.isExpanded(node) ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-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]=\"isMobile()\"\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 { ChangeDetectionStrategy, Component, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\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 styleUrl: './main.component.scss',\n imports: [MatSidenavModule, CommonModule, SidebarComponent],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\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 isMobile = input(false);\n\n // ==========================================\n // STATE SIGNALS\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>(this.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.isMobile()) {\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.isMobile()) {\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.isMobile()) {\n return;\n }\n this.#mouseLeave();\n };\n\n onSidenavOpenedChange = (opened: boolean): void => {\n if (this.isMobile()) {\n this.isShowSidebar.set(opened);\n }\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 // Desktop keeps the Material drawer mounted as a 60px rail; mobile still opens and closes the overlay.\n if (this.isMobile()) {\n const sidenavComp = this.sidenav();\n if (sidenavComp) {\n if (data) {\n sidenavComp.open();\n } else {\n sidenavComp.close();\n }\n }\n }\n }\n };\n}\n","<mat-sidenav-container class=\"c-layout-wrapper\">\n <mat-sidenav\n #sidenav\n [opened]=\"!isMobile() || isShowSidebar()\"\n (openedChange)=\"onSidenavOpenedChange($event)\"\n class=\"c-layout-sidebar\"\n [class.is-expanded]=\"isShowSidebar()\"\n (click)=\"openSidebar()\"\n (mouseleave)=\"onMouseleaveSideBar()\"\n [mode]=\"isMobile() ? 'over' : 'side'\"\n [fixedInViewport]=\"isMobile()\">\n <sidebar\n [menus]=\"menus()\"\n [userInfo]=\"userInfo()\"\n [sidebar]=\"sidebar()\"\n [isMobile]=\"isMobile()\"\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>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo } from '../../../../configurations';\nimport { SdLayoutUserMenuComponent } from '../../../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'lib-layout-user',\n templateUrl: './user.component.html',\n styleUrl: './user.component.scss',\n imports: [SdIcon, SdLayoutUserMenuComponent, TranslatePipe],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutUserComponent {\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 onMenuOpened(): void {\n this.menuOpened.emit();\n }\n\n onMenuClosed(): void {\n this.menuClosed.emit();\n }\n\n onToggleMenuLock(event: Event): void {\n this.toggleMenuLock.emit(event);\n }\n}\n","@if (isMobileOrTablet()) {\n <sd-layout-user-menu [userInfo]=\"userInfo()\" presentation=\"mobile\"></sd-layout-user-menu>\n} @else {\n <div class=\"c-layout-user-wrapper\">\n <sd-layout-user-menu\n class=\"c-layout-user-avatar\"\n [userInfo]=\"userInfo()\"\n [compact]=\"true\"\n (opened)=\"onMenuOpened()\"\n (closed)=\"onMenuClosed()\"></sd-layout-user-menu>\n\n <button\n type=\"button\"\n class=\"c-layout-icon-toggle\"\n [attr.aria-label]=\"'core.module.layout.sidebar.toggle' | translate\"\n (click)=\"onToggleMenuLock($event)\">\n <sd-icon [name]=\"isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left'\"></sd-icon>\n </button>\n </div>\n}\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 { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\n\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-sidebar-mobile-overlay',\n standalone: true,\n imports: [SdIcon, CommonModule, RouterModule, LayoutUserComponent],\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 <sd-icon name=\"close\"></sd-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 <sd-icon class=\"m-group-icon\" [name]=\"group.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"m-group-title\">{{ group.title }}</span>\n </div>\n <sd-icon class=\"m-expand-icon\" [name]=\"expandedMobileGroups().has(group.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-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 <sd-icon class=\"m-item-icon\" [name]=\"child.icon || 'folder'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <sd-icon class=\"m-expand-icon\" [name]=\"expandedMobileGroups().has(child.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-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 <sd-icon class=\"m-item-icon\" [name]=\"subChild.icon || 'insert_drive_file'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ subChild.title }}</span>\n </div>\n <sd-icon class=\"m-nav-icon\" name=\"chevron_right\"></sd-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 <sd-icon class=\"m-item-icon\" [name]=\"child.icon || 'insert_drive_file'\"></sd-icon>\n }\n <span class=\"m-item-title\">{{ child.title }}</span>\n </div>\n <sd-icon class=\"m-nav-icon\" name=\"chevron_right\"></sd-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';\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';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sidebar-mobile-v1',\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n imports: [SdIcon, 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 <sd-icon name=\"menu\"></sd-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 { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, input, output, signal } from '@angular/core';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutMenu, SdLayoutRootMenu, getMenuStableKey, searchMenuLeaves } from '../../../services';\n\ninterface SdLayoutMenuTreeNode {\n menu: SdLayoutMenu;\n key: string;\n title: string;\n depth: number;\n paddingLeft: number;\n isGroup: boolean;\n isActive: boolean;\n isPinned: boolean;\n isPinVisible: boolean;\n}\n\n@Component({\n selector: 'sd-layout-menu-tree',\n standalone: true,\n imports: [SdIcon],\n templateUrl: './menu-tree.component.html',\n styleUrl: './menu-tree.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutMenuTreeComponent {\n readonly #destroyRef = inject(DestroyRef);\n readonly #hoveredPinKey = signal<string | null>(null);\n #pinHoverTimerId: ReturnType<typeof setTimeout> | undefined;\n\n menus = input<SdLayoutMenu[]>([]);\n query = input('');\n activePath = input('');\n pinnedKeys = input<string[]>([]);\n showPin = input(true);\n pinVisibility = input<'hover' | 'always'>('hover');\n navigate = output<SdLayoutRootMenu>();\n togglePinned = output<SdLayoutMenu>();\n\n nodes = computed<SdLayoutMenuTreeNode[]>(() => {\n const pinnedKeys = new Set(this.pinnedKeys());\n const hoveredPinKey = this.#hoveredPinKey();\n const alwaysShowPin = this.pinVisibility() === 'always';\n const query = this.query().trim();\n const menus = query ? searchMenuLeaves(this.menus(), query) : this.menus();\n const nodes: SdLayoutMenuTreeNode[] = [];\n\n const append = (items: SdLayoutMenu[], depth: number, ancestors: string[]): void => {\n for (const menu of items) {\n const key = getMenuStableKey(menu, ancestors);\n if (!key) continue;\n const isGroup = 'children' in menu && !!menu.children?.length;\n const path = 'path' in menu ? menu.path : '';\n nodes.push({\n menu,\n key,\n title: menu.title ?? menu.tooltipTitle ?? '',\n depth,\n paddingLeft: 12 + depth * 16,\n isGroup,\n isActive: !!path && this.#pathMatches(this.activePath(), path),\n isPinned: pinnedKeys.has(key),\n isPinVisible: alwaysShowPin || pinnedKeys.has(key) || hoveredPinKey === key,\n });\n if (isGroup && 'children' in menu) append(menu.children ?? [], depth + 1, [...ancestors, menu.title ?? key]);\n }\n };\n\n append(menus, 0, []);\n return nodes;\n });\n\n constructor() {\n this.#destroyRef.onDestroy(() => this.#clearPinHoverTimer());\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if ('path' in menu) this.navigate.emit(menu);\n }\n\n onTogglePinned(event: MouseEvent, menu: SdLayoutMenu): void {\n event.stopPropagation();\n this.togglePinned.emit(menu);\n }\n\n onPinHoverStart(key: string): void {\n if (this.pinVisibility() === 'always') return;\n this.#clearPinHoverTimer();\n this.#pinHoverTimerId = setTimeout(() => {\n this.#hoveredPinKey.set(key);\n this.#pinHoverTimerId = undefined;\n }, 300);\n }\n\n onPinHoverEnd(key: string): void {\n this.#clearPinHoverTimer();\n if (this.#hoveredPinKey() === key) this.#hoveredPinKey.set(null);\n }\n\n #clearPinHoverTimer(): void {\n if (this.#pinHoverTimerId === undefined) return;\n clearTimeout(this.#pinHoverTimerId);\n this.#pinHoverTimerId = undefined;\n }\n\n #pathMatches(currentPath: string, menuPath: string): boolean {\n const normalize = (path: string): string => (path.endsWith('/') ? path : `${path}/`);\n return currentPath === menuPath || normalize(currentPath).startsWith(normalize(menuPath));\n }\n}\n","<nav class=\"d-flex flex-column gap-4\" aria-label=\"Navigation menu\">\n @for (node of nodes(); track node.key) {\n @if (node.isGroup) {\n <div class=\"sd-layout-menu-tree__group d-flex align-items-center gap-8 T12M text-black400\" [style.padding-left.px]=\"node.paddingLeft\">\n <sd-icon [name]=\"node.menu.icon || 'folder'\"></sd-icon>\n <span class=\"text-ellipsis\">{{ node.title }}</span>\n </div>\n } @else {\n <div\n class=\"sd-layout-menu-tree__route d-flex align-items-center gap-4\"\n (mouseenter)=\"onPinHoverStart(node.key)\"\n (mouseleave)=\"onPinHoverEnd(node.key)\">\n <button\n type=\"button\"\n class=\"sd-layout-menu-tree__route-button d-flex align-items-center gap-8 flex-1 text-left T14R\"\n data-menu-route\n [attr.data-menu-key]=\"node.key\"\n [attr.aria-current]=\"node.isActive ? 'page' : null\"\n [class.sd-layout-menu-tree__route-button--active]=\"node.isActive\"\n [style.padding-left.px]=\"node.paddingLeft\"\n (click)=\"onNavigate(node.menu)\">\n @if (node.menu.iconUrl) {\n <img class=\"sd-layout-menu-tree__icon-image\" [src]=\"node.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"node.menu.icon || 'chevron_right'\"></sd-icon>\n }\n <span class=\"text-ellipsis\">{{ node.title }}</span>\n </button>\n @if (showPin()) {\n <button\n type=\"button\"\n class=\"sd-layout-menu-tree__pin d-flex align-items-center justify-content-center\"\n [class.sd-layout-menu-tree__pin--visible]=\"node.isPinVisible\"\n [attr.data-pin-key]=\"node.key\"\n [attr.aria-label]=\"node.isPinned ? 'Unpin ' + node.title : 'Pin ' + node.title\"\n [attr.aria-pressed]=\"node.isPinned\"\n (click)=\"onTogglePinned($event, node.menu)\">\n <sd-icon name=\"push_pin\"></sd-icon>\n </button>\n }\n </div>\n }\n } @empty {\n <div class=\"d-flex flex-column align-items-center justify-content-center gap-12 p-24 text-black400 T14R\">\n Không tìm thấy menu phù hợp\n </div>\n }\n</nav>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SdInput } from '@sdcorejs/angular/forms';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-layout-search-field',\n standalone: true,\n imports: [SdIcon, SdInput],\n templateUrl: './search-field.component.html',\n styleUrl: './search-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutSearchFieldComponent {\n model = input('');\n placeholder = input.required<string>();\n autoId = input.required<string>();\n sdChange = output<string>();\n}\n","<div\n data-layout-search\n class=\"sd-layout-search-field sd-layout-search-field--soft-pill d-flex align-items-center gap-8\">\n <sd-icon class=\"sd-layout-search-field__icon\" name=\"search\"></sd-icon>\n <sd-input\n class=\"sd-layout-search-field__control\"\n size=\"sm\"\n hideInlineError\n [placeholder]=\"placeholder()\"\n [autoId]=\"autoId()\"\n [model]=\"model()\"\n (sdChange)=\"sdChange.emit($event)\">\n </sd-input>\n</div>\n","import { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV2, resolveSidebarV2Interaction } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, getMenuStableKey } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\ninterface SidebarV2RailItem {\n menu: SdLayoutMenu;\n key: string;\n title: string;\n}\n\n@Component({\n selector: 'sidebar-v2',\n standalone: true,\n imports: [SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarV2Component {\n readonly #router = inject(Router);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV2>();\n activeGroupKey = signal('');\n isFlyoutOpen = signal(false);\n isFlyoutLocked = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n\n interaction = computed(() => resolveSidebarV2Interaction(this.sidebar()));\n railItems = computed<SidebarV2RailItem[]>(() =>\n this.menus()\n .map(menu => ({ menu, key: getMenuStableKey(menu), title: menu.tooltipTitle || menu.title || 'Menu' }))\n .filter(item => !!item.key)\n );\n activeGroup = computed(() => this.railItems().find(item => item.key === this.activeGroupKey())?.menu);\n contextMenus = computed<SdLayoutMenu[]>(() => {\n const activeGroup = this.activeGroup();\n if (!activeGroup) return [];\n return 'children' in activeGroup && activeGroup.children?.length ? activeGroup.children : [activeGroup];\n });\n pinnedKeys = this.#navigationState.pinnedKeys;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n untracked(() => {\n this.#navigationState.hydrate(menus);\n const persistedState = this.#navigationState.versionState(2);\n if (persistedState.activeGroupKey && !this.activeGroupKey()) this.activeGroupKey.set(persistedState.activeGroupKey);\n });\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeFromNavigation();\n });\n }\n\n selectGroup(menu: SdLayoutMenu): void {\n const key = getMenuStableKey(menu);\n if (!key) return;\n\n if (this.interaction() === 'click') {\n if (this.activeGroupKey() === key && this.isFlyoutOpen()) {\n this.#closeFlyout();\n return;\n }\n this.#openGroup(key, false);\n return;\n }\n\n if (this.activeGroupKey() === key && this.isFlyoutLocked()) {\n this.#closeFlyout();\n return;\n }\n this.#openGroup(key, true);\n }\n\n previewGroup(menu: SdLayoutMenu): void {\n if (this.interaction() !== 'hover-lock' || this.isFlyoutLocked()) return;\n const key = getMenuStableKey(menu);\n if (key) this.#openGroup(key, false, false);\n }\n\n leaveFlyout(): void {\n if (this.interaction() === 'hover-lock' && !this.isFlyoutLocked()) this.#closeFlyout(false);\n }\n\n closeFromBackdrop(): void {\n this.#closeFlyout();\n }\n\n closeFromEscape(): void {\n this.#closeFlyout();\n }\n\n closeFromNavigation(): void {\n this.#closeFlyout();\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, { enabled: true, maxItems: 5 });\n if (menu.path.includes('http')) {\n this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n this.closeFromNavigation();\n return;\n }\n void this.#router.navigate([menu.path.split('?')[0]], {\n queryParams: menu.queryParams ?? {},\n state: { switchTab: true },\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #openGroup(key: string, locked: boolean, persist = true): void {\n this.activeGroupKey.set(key);\n this.isFlyoutOpen.set(true);\n this.isFlyoutLocked.set(locked);\n this.searchText.set('');\n if (persist) this.#navigationState.patchVersionState(2, { activeGroupKey: key, locked });\n }\n\n #closeFlyout(persist = true): void {\n this.isFlyoutOpen.set(false);\n this.isFlyoutLocked.set(false);\n this.searchText.set('');\n if (persist) this.#navigationState.patchVersionState(2, { locked: false });\n }\n}\n","<div class=\"sd-sidebar-v2\" (keydown.escape)=\"closeFromEscape()\">\n <aside class=\"sd-sidebar-v2__rail d-flex flex-column align-items-center gap-8 py-12 bg-white border-right border-black200\">\n <button type=\"button\" class=\"sd-sidebar-v2__brand d-flex align-items-center justify-content-center\" aria-label=\"Trang chủ\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-v2__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n </button>\n\n <nav class=\"d-flex flex-column align-items-center gap-4 flex-1\" aria-label=\"Nhóm menu\">\n @for (item of railItems(); track item.key) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v2__rail-action d-flex flex-column align-items-center justify-content-center gap-4\"\n [attr.data-v2-group-key]=\"item.key\"\n [attr.aria-label]=\"item.title\"\n [attr.aria-expanded]=\"activeGroupKey() === item.key && isFlyoutOpen()\"\n [class.sd-sidebar-v2__rail-action--active]=\"activeGroupKey() === item.key\"\n (click)=\"selectGroup(item.menu)\"\n (mouseenter)=\"previewGroup(item.menu)\"\n (focus)=\"previewGroup(item.menu)\">\n @if (item.menu.iconUrl) {\n <img class=\"sd-sidebar-v2__rail-icon\" [src]=\"item.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"item.menu.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"sd-sidebar-v2__rail-label text-ellipsis\">{{ item.title }}</span>\n </button>\n }\n </nav>\n\n <sd-layout-user-menu [userInfo]=\"userInfo()\" [compact]=\"true\"></sd-layout-user-menu>\n </aside>\n\n @if (isFlyoutOpen()) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v2__backdrop\"\n aria-label=\"Đóng menu\"\n (click)=\"closeFromBackdrop()\"\n (keydown.escape)=\"closeFromEscape()\"></button>\n <section\n class=\"sd-sidebar-v2__flyout d-flex flex-column bg-white border-right border-black200 mat-elevation-z4\"\n [attr.aria-label]=\"activeGroup()?.title || 'Menu'\"\n (mouseleave)=\"leaveFlyout()\"\n (keydown.escape)=\"closeFromEscape()\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T16M text-ellipsis\">{{ activeGroup()?.title || sidebar().defaultTitle || 'Menu' }}</span>\n @if (isFlyoutLocked()) {\n <sd-icon name=\"lock\"></sd-icon>\n }\n </header>\n <div class=\"p-12\">\n <sd-layout-search-field\n placeholder=\"Tìm trong nhóm\"\n [autoId]=\"'layout-v2-context-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n </div>\n <div class=\"flex-1 overflow-auto px-8 pb-12\">\n <sd-layout-menu-tree\n [menus]=\"contextMenus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"onNavigate($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </div>\n </section>\n }\n\n <main class=\"sd-sidebar-v2__content\" data-v2-content data-content-offset=\"rail\">\n <ng-content></ng-content>\n </main>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV2 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, getMenuStableKey, selectPrimaryMenuGroups } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'sidebar-mobile-v2',\n standalone: true,\n imports: [A11yModule, SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarMobileV2Component {\n readonly #router = inject(Router);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n #restoreFocusElement: HTMLElement | null = null;\n #previousBodyOverflow = '';\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV2>();\n primaryMenus = computed(() => selectPrimaryMenuGroups(this.menus(), this.sidebar().primaryMenuIds));\n overflowMenus = computed(() => {\n const primaryKeys = new Set(this.primaryMenus().map(menu => getMenuStableKey(menu)));\n return this.menus().filter(menu => !primaryKeys.has(getMenuStableKey(menu)));\n });\n isSheetOpen = signal(false);\n sheetGroupKey = signal('');\n sheetTitle = signal('');\n sheetMenus = signal<SdLayoutMenu[]>([]);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n pinnedKeys = this.#navigationState.pinnedKeys;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n untracked(() => this.#navigationState.hydrate(menus));\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeSheet(false);\n });\n this.#destroyRef.onDestroy(() => this.#releaseBodyScroll());\n }\n\n openMore(trigger?: EventTarget | null): void {\n this.#openSheet('more', 'Thêm', this.overflowMenus(), trigger);\n }\n\n activateMenu(menu: SdLayoutMenu, trigger?: EventTarget | null): void {\n if ('path' in menu) {\n this.#navigate(menu);\n return;\n }\n this.#openSheet(getMenuStableKey(menu), menu.title || 'Menu', menu.children ?? [], trigger);\n }\n\n closeSheet(restoreFocus = true): void {\n if (!this.isSheetOpen()) return;\n this.isSheetOpen.set(false);\n this.searchText.set('');\n this.#releaseBodyScroll();\n if (restoreFocus) this.#restoreFocusElement?.focus();\n this.#restoreFocusElement = null;\n }\n\n onSheetKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n this.closeSheet();\n }\n\n onNavigate(menu: SdLayoutMenu): void {\n if ('path' in menu) this.#navigate(menu);\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #openSheet(key: string, title: string, menus: SdLayoutMenu[], trigger?: EventTarget | null): void {\n this.sheetGroupKey.set(key);\n this.sheetTitle.set(title);\n this.sheetMenus.set(menus);\n this.searchText.set('');\n this.#restoreFocusElement =\n trigger instanceof HTMLElement ? trigger : this.#document.activeElement instanceof HTMLElement ? this.#document.activeElement : null;\n if (!this.isSheetOpen()) {\n this.#previousBodyOverflow = this.#document.body.style.overflow;\n this.#document.body.style.overflow = 'hidden';\n }\n this.isSheetOpen.set(true);\n }\n\n #navigate(menu: Extract<SdLayoutMenu, { path: string }>): void {\n this.#navigationState.recordRecent(menu, { enabled: true, maxItems: 5 });\n if (menu.path.includes('http')) {\n this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n this.closeSheet();\n return;\n }\n void this.#router\n .navigate([menu.path.split('?')[0]], { queryParams: menu.queryParams ?? {}, state: { switchTab: true } })\n .then(navigated => {\n if (navigated) this.closeSheet();\n });\n }\n\n #releaseBodyScroll(): void {\n this.#document.body.style.overflow = this.#previousBodyOverflow;\n }\n}\n","<div class=\"sd-sidebar-mobile-v2 d-flex flex-column\">\n <main class=\"sd-sidebar-mobile-v2__content flex-1 overflow-auto\">\n <ng-content></ng-content>\n </main>\n\n <nav class=\"sd-sidebar-mobile-v2__bar d-flex align-items-stretch bg-white border-top border-black200\" aria-label=\"Điều hướng chính\">\n @for (menu of primaryMenus(); track menu.id || menu.title) {\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__bar-action d-flex flex-column align-items-center justify-content-center gap-4 flex-1\"\n [attr.data-mobile-menu-key]=\"menu.id ? 'id:' + menu.id : null\"\n [attr.aria-label]=\"menu.tooltipTitle || menu.title || 'Menu'\"\n [attr.aria-expanded]=\"sheetGroupKey() === (menu.id ? 'id:' + menu.id : '') && isSheetOpen()\"\n (click)=\"activateMenu(menu, $event.currentTarget)\">\n @if (menu.iconUrl) {\n <img class=\"sd-sidebar-mobile-v2__icon\" [src]=\"menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"menu.icon || 'widgets'\"></sd-icon>\n }\n <span class=\"sd-sidebar-mobile-v2__label text-ellipsis\">{{ menu.tooltipTitle || menu.title }}</span>\n </button>\n }\n @if (overflowMenus().length) {\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__bar-action d-flex flex-column align-items-center justify-content-center gap-4 flex-1\"\n aria-label=\"Thêm menu\"\n [attr.aria-expanded]=\"sheetGroupKey() === 'more' && isSheetOpen()\"\n (click)=\"openMore($event.currentTarget)\">\n <sd-icon name=\"more_horiz\"></sd-icon>\n <span class=\"sd-sidebar-mobile-v2__label\">Thêm</span>\n </button>\n }\n </nav>\n\n @if (isSheetOpen()) {\n <button type=\"button\" class=\"sd-sidebar-mobile-v2__backdrop\" aria-label=\"Đóng menu\" (click)=\"closeSheet()\"></button>\n <section\n data-v2-sheet\n class=\"sd-sidebar-mobile-v2__sheet d-flex flex-column bg-white rounded-top-16 mat-elevation-z8\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"sheetTitle()\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (keydown)=\"onSheetKeydown($event)\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T16M text-ellipsis\">{{ sheetTitle() }}</span>\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v2__close d-flex align-items-center justify-content-center\"\n aria-label=\"Đóng\"\n (click)=\"closeSheet()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </header>\n <div class=\"d-flex flex-column gap-12 p-12 overflow-auto\">\n <sd-layout-user-menu presentation=\"mobile-inline\" [userInfo]=\"userInfo()\"></sd-layout-user-menu>\n <sd-layout-search-field\n placeholder=\"Tìm trong menu\"\n [autoId]=\"'layout-v2-mobile-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n <sd-layout-menu-tree\n [menus]=\"sheetMenus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n pinVisibility=\"always\"\n (navigate)=\"onNavigate($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </div>\n </section>\n }\n</div>\n","import { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV3, resolveSidebarV3Recent } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutRootMenu, getMenuStableKey, searchMenuLeaves } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'sidebar-v3',\n standalone: true,\n imports: [SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarV3Component {\n readonly #router = inject(Router);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n #initialized = false;\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV3>();\n isCollapsed = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n searchResults = computed<SdLayoutRootMenu[]>(() => searchMenuLeaves(this.menus(), this.searchText()));\n recentConfiguration = computed(() => resolveSidebarV3Recent(this.sidebar()));\n pinnedKeys = this.#navigationState.pinnedKeys;\n pinnedMenus = this.#navigationState.pinnedMenus;\n recentMenus = this.#navigationState.recentMenus;\n collapsedItems = computed(() =>\n this.menus().map(menu => ({ menu, key: getMenuStableKey(menu), title: menu.tooltipTitle || menu.title || 'Menu' }))\n );\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n const sidebar = this.sidebar();\n const recentConfiguration = resolveSidebarV3Recent(sidebar);\n untracked(() => {\n this.#navigationState.hydrate(menus, recentConfiguration.maxItems);\n if (this.#initialized) return;\n const persistedCollapsed = this.#navigationState.versionState(3).collapsed;\n this.isCollapsed.set(typeof persistedCollapsed === 'boolean' ? persistedCollapsed : (sidebar.defaultCollapsed ?? false));\n this.#initialized = true;\n });\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (event instanceof NavigationEnd) this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n });\n }\n\n toggleCollapsed(): void {\n this.isCollapsed.update(collapsed => !collapsed);\n this.#navigationState.patchVersionState(3, { collapsed: this.isCollapsed() });\n }\n\n activateCollapsedMenu(menu: SdLayoutMenu): void {\n if ('path' in menu) this.navigateMenu(menu);\n else {\n this.isCollapsed.set(false);\n this.#navigationState.patchVersionState(3, { collapsed: false });\n }\n }\n\n navigateMenu(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, this.recentConfiguration());\n if (menu.path.includes('http')) {\n this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n return;\n }\n void this.#router.navigate([menu.path.split('?')[0]], {\n queryParams: menu.queryParams ?? {},\n state: { switchTab: true },\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n}\n","<div class=\"sd-sidebar-v3\" [class.sd-sidebar-v3--collapsed]=\"isCollapsed()\">\n <aside\n class=\"sd-sidebar-v3__drawer d-flex flex-column bg-white border-right border-black200\"\n data-v3-sidebar\n [attr.data-collapsed]=\"isCollapsed()\">\n <header\n data-v3-header\n class=\"sd-sidebar-v3__header d-flex align-items-center gap-8 p-12 border-bottom border-black200\"\n [class.sd-sidebar-v3__header--collapsed]=\"isCollapsed()\"\n [class.justify-content-between]=\"!isCollapsed()\"\n [class.justify-content-center]=\"isCollapsed()\">\n @if (!isCollapsed()) {\n <div data-v3-brand class=\"d-flex align-items-center gap-8 overflow-hidden\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-v3__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n } @else {\n <sd-icon name=\"apps\"></sd-icon>\n }\n <span class=\"T16M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n }\n <button\n type=\"button\"\n class=\"sd-sidebar-v3__icon-action d-flex align-items-center justify-content-center\"\n [attr.aria-label]=\"isCollapsed() ? 'Mở rộng sidebar' : 'Thu gọn sidebar'\"\n [attr.aria-expanded]=\"!isCollapsed()\"\n (click)=\"toggleCollapsed()\">\n <sd-icon [name]=\"isCollapsed() ? 'chevron_right' : 'chevron_left'\"></sd-icon>\n </button>\n </header>\n\n @if (isCollapsed()) {\n <nav class=\"d-flex flex-column align-items-center gap-4 p-8 flex-1\" aria-label=\"Menu thu gọn\">\n @for (item of collapsedItems(); track item.key) {\n <button\n type=\"button\"\n class=\"sd-sidebar-v3__collapsed-action d-flex align-items-center justify-content-center\"\n [attr.aria-label]=\"item.title\"\n (click)=\"activateCollapsedMenu(item.menu)\">\n @if (item.menu.iconUrl) {\n <img class=\"sd-sidebar-v3__logo\" [src]=\"item.menu.iconUrl\" alt=\"\" />\n } @else {\n <sd-icon [name]=\"item.menu.icon || 'widgets'\"></sd-icon>\n }\n </button>\n }\n </nav>\n } @else {\n <div class=\"p-12\">\n <sd-layout-search-field\n placeholder=\"Tìm trong tất cả menu\"\n [autoId]=\"'layout-v3-global-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n </div>\n <div class=\"sd-sidebar-v3__navigation d-flex flex-column gap-16 flex-1 overflow-auto px-8 pb-12\">\n @if (pinnedMenus().length) {\n <section data-v3-pinned class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Đã ghim</h2>\n <sd-layout-menu-tree\n [menus]=\"pinnedMenus()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n @if (recentConfiguration().enabled && recentMenus().length) {\n <section data-v3-recent class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Gần đây</h2>\n <sd-layout-menu-tree [menus]=\"recentMenus()\" [activePath]=\"activePath()\" [showPin]=\"false\" (navigate)=\"navigateMenu($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n <section class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Tất cả menu</h2>\n <sd-layout-menu-tree\n [menus]=\"menus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n </div>\n }\n\n <div class=\"p-8 border-top border-black200\">\n <sd-layout-user-menu [userInfo]=\"userInfo()\" [compact]=\"isCollapsed()\"></sd-layout-user-menu>\n </div>\n </aside>\n\n <main class=\"sd-sidebar-v3__content\">\n <ng-content></ng-content>\n </main>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV3, resolveSidebarV3Recent } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutRootMenu, searchMenuLeaves } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n selector: 'sidebar-mobile-v3',\n standalone: true,\n imports: [A11yModule, SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarMobileV3Component {\n readonly #router = inject(Router);\n readonly #document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #navigationState = inject(SdLayoutNavigationStateService);\n private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n #restoreFocusElement: HTMLElement | null = null;\n #previousBodyOverflow = '';\n\n menus = input<SdLayoutMenu[]>([]);\n userInfo = input.required<SdLayoutUserInfo>();\n sidebar = input.required<SidebarConfigurationV3>();\n isDrawerOpen = signal(false);\n searchText = signal('');\n activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n searchResults = computed<SdLayoutRootMenu[]>(() => searchMenuLeaves(this.menus(), this.searchText()));\n recentConfiguration = computed(() => resolveSidebarV3Recent(this.sidebar()));\n pinnedKeys = this.#navigationState.pinnedKeys;\n pinnedMenus = this.#navigationState.pinnedMenus;\n recentMenus = this.#navigationState.recentMenus;\n\n constructor() {\n effect(() => {\n const menus = this.menus();\n const maximum = resolveSidebarV3Recent(this.sidebar()).maxItems;\n untracked(() => this.#navigationState.hydrate(menus, maximum));\n });\n this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n if (!(event instanceof NavigationEnd)) return;\n this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n this.closeFromNavigation();\n });\n this.#destroyRef.onDestroy(() => this.#releaseBodyScroll());\n }\n\n openDrawer(trigger?: EventTarget | null): void {\n this.#restoreFocusElement =\n trigger instanceof HTMLElement\n ? trigger\n : this.#document.activeElement instanceof HTMLElement\n ? this.#document.activeElement\n : (this.trigger()?.nativeElement ?? null);\n if (!this.isDrawerOpen()) {\n this.#previousBodyOverflow = this.#document.body.style.overflow;\n this.#document.body.style.overflow = 'hidden';\n }\n this.isDrawerOpen.set(true);\n }\n\n closeFromBackdrop(): void {\n this.#closeDrawer();\n }\n\n closeFromEscape(): void {\n this.#closeDrawer();\n }\n\n closeFromNavigation(): void {\n this.#closeDrawer();\n }\n\n onDrawerKeydown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n this.closeFromEscape();\n }\n\n navigateMenu(menu: SdLayoutMenu): void {\n if (!('path' in menu)) return;\n this.#navigationState.recordRecent(menu, this.recentConfiguration());\n if (menu.path.includes('http')) {\n this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n this.closeFromNavigation();\n return;\n }\n void this.#router\n .navigate([menu.path.split('?')[0]], { queryParams: menu.queryParams ?? {}, state: { switchTab: true } })\n .then(navigated => {\n if (navigated) this.closeFromNavigation();\n });\n }\n\n onTogglePinned(menu: SdLayoutMenu): void {\n this.#navigationState.togglePinned(menu);\n }\n\n #closeDrawer(): void {\n if (!this.isDrawerOpen()) return;\n this.isDrawerOpen.set(false);\n this.searchText.set('');\n this.#releaseBodyScroll();\n (this.#restoreFocusElement ?? this.trigger()?.nativeElement)?.focus();\n this.#restoreFocusElement = null;\n }\n\n #releaseBodyScroll(): void {\n this.#document.body.style.overflow = this.#previousBodyOverflow;\n }\n}\n","<div class=\"sd-sidebar-mobile-v3 d-flex flex-column\">\n <header\n class=\"sd-sidebar-mobile-v3__topbar d-flex align-items-center justify-content-between gap-8 px-16 bg-white border-bottom border-black200\">\n <div class=\"d-flex align-items-center gap-8 overflow-hidden\">\n @if (sidebar().logoUrl) {\n <img class=\"sd-sidebar-mobile-v3__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n }\n <span class=\"T16M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n </div>\n <button\n #trigger\n type=\"button\"\n data-v3-mobile-trigger\n class=\"sd-sidebar-mobile-v3__icon-action d-flex align-items-center justify-content-center\"\n aria-label=\"Mở menu\"\n [attr.aria-expanded]=\"isDrawerOpen()\"\n (click)=\"openDrawer($event.currentTarget)\">\n <sd-icon name=\"menu\"></sd-icon>\n </button>\n </header>\n\n <main class=\"flex-1 overflow-auto\">\n <ng-content></ng-content>\n </main>\n\n @if (isDrawerOpen()) {\n <button type=\"button\" class=\"sd-sidebar-mobile-v3__backdrop\" aria-label=\"Đóng menu\" (click)=\"closeFromBackdrop()\"></button>\n <aside\n class=\"sd-sidebar-mobile-v3__drawer d-flex flex-column bg-white mat-elevation-z8\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Menu chính\"\n cdkTrapFocus\n [cdkTrapFocusAutoCapture]=\"true\"\n (keydown)=\"onDrawerKeydown($event)\">\n <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n <span class=\"T18M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n <button\n type=\"button\"\n class=\"sd-sidebar-mobile-v3__icon-action d-flex align-items-center justify-content-center\"\n aria-label=\"Đóng menu\"\n (click)=\"closeFromBackdrop()\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n </header>\n <div class=\"sd-sidebar-mobile-v3__navigation d-flex flex-column gap-16 flex-1 overflow-auto p-12\">\n <sd-layout-user-menu presentation=\"mobile-inline\" [userInfo]=\"userInfo()\"></sd-layout-user-menu>\n <div class=\"sd-sidebar-mobile-v3__search bg-white\">\n <sd-layout-search-field\n placeholder=\"Tìm trong tất cả menu\"\n [autoId]=\"'layout-v3-mobile-global-search'\"\n [model]=\"searchText()\"\n (sdChange)=\"searchText.set($event)\">\n </sd-layout-search-field>\n </div>\n @if (pinnedMenus().length) {\n <section data-v3-mobile-pinned class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Đã ghim</h2>\n <sd-layout-menu-tree\n [menus]=\"pinnedMenus()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n pinVisibility=\"always\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n @if (recentConfiguration().enabled && recentMenus().length) {\n <section data-v3-mobile-recent class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Gần đây</h2>\n <sd-layout-menu-tree [menus]=\"recentMenus()\" [activePath]=\"activePath()\" [showPin]=\"false\" (navigate)=\"navigateMenu($event)\">\n </sd-layout-menu-tree>\n </section>\n }\n <section class=\"d-flex flex-column gap-4\">\n <h2 class=\"T12M text-black400 px-12 m-0\">Tất cả menu</h2>\n <sd-layout-menu-tree\n [menus]=\"menus()\"\n [query]=\"searchText()\"\n [activePath]=\"activePath()\"\n [pinnedKeys]=\"pinnedKeys()\"\n pinVisibility=\"always\"\n (navigate)=\"navigateMenu($event)\"\n (togglePinned)=\"onTogglePinned($event)\">\n </sd-layout-menu-tree>\n </section>\n </div>\n </aside>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n// Import nội bộ trong module layout\nimport { SdLayoutMenu, SdLayoutResponsiveService, SdLayoutService } from '../../services';\nimport { MenuPipe } from '../../pipes';\nimport { SidebarV1Component } from '../sidebar-v1/main.component';\nimport { SidebarMobileV1Component } from '../sidebar-mobile-v1/main.component';\nimport { SidebarV2Component } from '../sidebar-v2/main.component';\nimport { SidebarMobileV2Component } from '../sidebar-mobile-v2/main.component';\nimport { SidebarV3Component } from '../sidebar-v3/main.component';\nimport { SidebarMobileV3Component } from '../sidebar-mobile-v3/main.component';\nimport {\n SD_LAYOUT_CONFIGURATION,\n SidebarConfigurationV1,\n SidebarConfigurationV2,\n SidebarConfigurationV3,\n normalizeLayoutMobileBreakpoint,\n} from '../../configurations';\n\n@Component({\n selector: 'sd-layout',\n templateUrl: './layout-main.component.html',\n styleUrl: './layout-main.component.scss',\n imports: [\n SidebarV1Component,\n SidebarMobileV1Component,\n SidebarV2Component,\n SidebarMobileV2Component,\n SidebarV3Component,\n SidebarMobileV3Component,\n NgTemplateOutlet,\n ],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutComponent {\n // ==========================================\n // INJECT SERVICES\n // ==========================================\n #menuPipe = inject(MenuPipe);\n #layoutService = inject(SdLayoutService);\n #responsiveService = inject(SdLayoutResponsiveService);\n #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION, { optional: true });\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 sidebarV1 = computed<SidebarConfigurationV1 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 1 ? sidebar : undefined;\n });\n sidebarV2 = computed<SidebarConfigurationV2 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 2 ? sidebar : undefined;\n });\n sidebarV3 = computed<SidebarConfigurationV3 | undefined>(() => {\n const sidebar = this.sidebar();\n return sidebar?.version === 3 ? sidebar : undefined;\n });\n mobileBreakpoint = normalizeLayoutMobileBreakpoint(this.#layoutConfiguration?.mobileBreakpoint);\n isMobile = computed(() => this.#responsiveService.isMobile(this.mobileBreakpoint));\n}\n","<ng-template #projectedContent>\n <ng-content></ng-content>\n</ng-template>\n\n@let _userInfo = userInfo();\n@let _sidebarV1 = sidebarV1();\n@let _sidebarV2 = sidebarV2();\n@let _sidebarV3 = sidebarV3();\n\n@if (_userInfo && _sidebarV1) {\n @if (!isMobile()) {\n <sidebar-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\" [isMobile]=\"false\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-v1>\n } @else {\n <sidebar-mobile-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-mobile-v1>\n }\n}\n\n@if (_userInfo && _sidebarV3) {\n @if (!isMobile()) {\n <sidebar-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-v3>\n } @else {\n <sidebar-mobile-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-mobile-v3>\n }\n}\n\n@if (_userInfo && _sidebarV2) {\n @if (!isMobile()) {\n <sidebar-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-v2>\n } @else {\n <sidebar-mobile-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sidebar-mobile-v2>\n }\n}\n","import { I18N_MESSAGES, I18N_STORAGE_KEY } from '@sdcorejs/angular/i18n';\nimport { Language } from '@sdcorejs/angular/models';\n\n/**\n * Resolve a translated tab name for `@SdTabComponent`.\n *\n * WHY not I18nService: the decorator runs at module-evaluation time, before\n * Angular's DI exists, so the service cannot be injected. We read the language\n * the app persisted and look the key up in the static catalog instead.\n */\nexport function resolveTabName(key: string): string {\n const lang = ((): Language => {\n try {\n const stored = localStorage.getItem(I18N_STORAGE_KEY) as Language | null;\n if (stored) return stored;\n } catch {\n // localStorage can throw (private mode, SSR shim) — fall back below.\n }\n return 'vi';\n })();\n\n return I18N_MESSAGES[lang]?.[key] ?? I18N_MESSAGES.vi[key] ?? key;\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { SdTabComponent } from '@sdcorejs/angular/components';\nimport { 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 } from '../../../../services';\nimport { resolveTabName } from '../../../../utils';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n// End\n\n@Component({\n selector: 'app-home-page',\n imports: [SdIcon, SdPageComponent, TranslatePipe],\n templateUrl: './home-page.component.html',\n styleUrl: './home-page.component.scss',\n standalone: true,\n})\n@SdTabComponent({\n component: HomePageComponent,\n name: () => resolveTabName('core.module.layout.home.tab-name'),\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 <sd-icon class=\"hero-icon\" name=\"space_dashboard\"></sd-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 <sd-icon class=\"feature-icon\" [name]=\"feature.icon\"></sd-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 private readonly router = inject(Router);\n private readonly layoutConfiguration: ISdLayoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\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, SdTabComponent } 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 } from '../../../../services';\nimport { resolveTabName } from '../../../../utils';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrl: './root.component.scss',\n imports: [SdButton, SdPageComponent, TranslatePipe],\n})\n@SdTabComponent({\n component: RootComponent,\n name: () => resolveTabName('core.module.layout.not-found.tab-name'),\n icon: 'search_off',\n color: 'warning',\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, SdTabComponent } 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 } from '../../../../services';\nimport { resolveTabName } from '../../../../utils';\n// End\n\n@Component({\n templateUrl: './root.component.html',\n styleUrl: './root.component.scss',\n imports: [SdButton, SdPageComponent, TranslatePipe],\n})\n@SdTabComponent({\n component: RootComponent,\n name: () => resolveTabName('core.module.layout.forbidden.tab-name'),\n icon: 'block',\n color: 'error',\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":["LayoutUserComponent","i1","RootComponent","Routes"],"mappings":"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"}
|