@sdcorejs/angular 20.1.5 → 20.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/README.md +12 -4
  2. package/assets/scss/core/menu.scss +18 -0
  3. package/assets/scss/core/utilities/_misc.scss +15 -0
  4. package/assets/scss/sd-core.scss +1 -0
  5. package/components/anchor/index.d.ts +3 -1
  6. package/components/badge/index.d.ts +1 -0
  7. package/components/ckeditor-styles/index.d.ts +1 -1
  8. package/components/form-generic/index.d.ts +44 -33
  9. package/components/import-excel/index.d.ts +1 -0
  10. package/components/index.d.ts +6 -1
  11. package/components/mini-editor/index.d.ts +1 -1
  12. package/components/modal/index.d.ts +3 -2
  13. package/components/modal-resizable/index.d.ts +92 -0
  14. package/components/org-chart/index.d.ts +6 -0
  15. package/components/preview/index.d.ts +1 -0
  16. package/components/query-bar/index.d.ts +55 -17
  17. package/components/query-builder/index.d.ts +150 -98
  18. package/components/section/index.d.ts +3 -0
  19. package/components/tab-router/index.d.ts +19 -19
  20. package/components/table/index.d.ts +252 -110
  21. package/components/tree/index.d.ts +48 -30
  22. package/components/upload-file/index.d.ts +6 -3
  23. package/configurations/index.d.ts +1 -2
  24. package/fesm2022/sdcorejs-angular-components-anchor.mjs +37 -13
  25. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
  27. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-components-badge.mjs +15 -2
  29. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  31. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
  33. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
  35. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
  37. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
  39. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  40. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
  41. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
  43. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
  45. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
  47. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
  49. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
  51. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
  53. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-components-preview.mjs +58 -19
  55. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
  57. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
  59. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-components-section.mjs +16 -2
  61. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
  63. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
  65. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
  67. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
  69. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
  71. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-components-table.mjs +557 -255
  73. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
  75. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
  77. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-components.mjs +6 -1
  79. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  81. package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
  82. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  83. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
  84. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  85. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
  86. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  87. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
  88. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  89. package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
  90. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  91. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +234 -64
  92. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  93. package/fesm2022/sdcorejs-angular-forms-date.mjs +209 -42
  94. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  95. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +131 -27
  96. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  97. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +40 -16
  98. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
  99. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
  100. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  101. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
  102. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  103. package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
  104. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  105. package/fesm2022/sdcorejs-angular-forms-models.mjs +279 -6
  106. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  107. package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
  108. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  109. package/fesm2022/sdcorejs-angular-forms-select.mjs +136 -38
  110. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  111. package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
  112. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  113. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
  114. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  115. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
  116. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
  117. package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
  118. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
  119. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
  120. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
  121. package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
  122. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  123. package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
  124. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  125. package/fesm2022/sdcorejs-angular-i18n.mjs +510 -68
  126. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  127. package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
  128. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  129. package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
  130. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  131. package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
  132. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  133. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
  134. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  135. package/fesm2022/sdcorejs-angular-modules-layout.mjs +441 -135
  136. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  137. package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
  138. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  139. package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
  140. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  141. package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
  142. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  143. package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
  144. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  145. package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
  146. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  147. package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
  148. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  149. package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
  150. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  151. package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
  152. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  153. package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
  154. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  155. package/fesm2022/sdcorejs-angular-services.mjs +0 -1
  156. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
  158. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  159. package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
  160. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular.mjs +17 -10
  162. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  163. package/forms/autocomplete/index.d.ts +5 -2
  164. package/forms/chip-calendar/index.d.ts +10 -0
  165. package/forms/date/index.d.ts +21 -3
  166. package/forms/date-range/index.d.ts +14 -2
  167. package/forms/datetime/index.d.ts +13 -2
  168. package/forms/entity-picker/index.d.ts +9 -3
  169. package/forms/index.d.ts +22 -13
  170. package/forms/input/index.d.ts +3 -0
  171. package/forms/input-color/index.d.ts +4 -0
  172. package/forms/input-number/index.d.ts +3 -0
  173. package/forms/models/index.d.ts +146 -5
  174. package/forms/select/index.d.ts +27 -4
  175. package/forms/switch/index.d.ts +7 -1
  176. package/forms/textarea/index.d.ts +5 -3
  177. package/forms/time-range/index.d.ts +22 -1
  178. package/forms/tree-select/index.d.ts +36 -5
  179. package/i18n/index.d.ts +99 -16
  180. package/index.d.ts +11 -2
  181. package/interceptors/index.d.ts +13 -3
  182. package/modules/auth/index.d.ts +1 -1
  183. package/modules/keycloak/index.d.ts +1 -0
  184. package/modules/layout/index.d.ts +103 -28
  185. package/modules/permission/index.d.ts +66 -4
  186. package/package.json +40 -25
  187. package/pipes/index.d.ts +27 -5
  188. package/services/api/index.d.ts +21 -1
  189. package/services/cache/index.d.ts +11 -1
  190. package/services/index.d.ts +0 -1
  191. package/services/notify/index.d.ts +1 -1
  192. package/utilities/extensions/index.d.ts +83 -61
  193. package/utilities/models/index.d.ts +2 -76
  194. package/components/base/index.d.ts +0 -11
  195. package/components/document-builder/index.d.ts +0 -252
  196. package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
  197. package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
  198. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
  199. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
  200. package/fesm2022/sdcorejs-angular-models.mjs +0 -6
  201. package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
  202. package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
  203. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
  204. package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
  205. package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
  206. package/models/index.d.ts +0 -2
  207. package/services/docx/index.d.ts +0 -27
  208. package/services/license/index.d.ts +0 -12
@@ -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/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/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 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 { 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\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.#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 { 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","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 { InjectionToken, Injectable, inject } from '@angular/core';\nimport { SdStorage, SdStorageOption, SdStorageService } from '@sdcorejs/angular/services';\nimport { SdLayoutChildrenMenu, SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\n\n/**\n * Namespace áp cho toàn bộ state layout được persist — hằng chuỗi, hoặc hàm resolve lại mỗi lần đọc\n * (dùng cho danh tính chỉ biết được SAU khi đăng nhập, ví dụ id user hoặc tenant).\n */\nexport type SdLayoutStorageNamespace = string | (() => string | null | undefined);\n\n/**\n * Namespace do consumer cung cấp cho toàn bộ state layout được persist (thường là id user hoặc tenant).\n *\n * why: các key dưới đây là UUID CỐ ĐỊNH, không gắn với ai cả. Trên máy dùng chung, user A đăng xuất\n * rồi user B đăng nhập thì `pinnedMenuKeys` / `recentMenuKeys` / `lastActiveMenuGroupId` của A vẫn\n * còn nguyên trong localStorage và B nhìn thấy đúng những module A đã ghim và vừa truy cập. Cấp\n * namespace theo user/tenant sẽ tách hẳn không gian lưu trữ.\n *\n * ⚠️ `SdLayoutStorageService` là singleton `providedIn: 'root'`, thường được khởi tạo TRƯỚC khi biết\n * người dùng là ai. Vì vậy hãy cấp một **hàm** — nó được gọi lại ở mỗi lần truy cập handle, nên khi\n * danh tính đến (hoặc đổi) thì cả bảy handle tự dựng lại trên namespace mới:\n *\n * ```ts\n * providers: [\n * {\n * provide: SD_LAYOUT_STORAGE_NAMESPACE,\n * useFactory: () => {\n * const auth = inject(SdAuthService);\n * return () => auth.getAuthInfo?.()?.id;\n * },\n * },\n * ];\n * ```\n *\n * Đây là biện pháp bổ sung chứ không thay thế `SdLayoutStorageService.clear()` lúc signout.\n */\nexport const SD_LAYOUT_STORAGE_NAMESPACE = new InjectionToken<SdLayoutStorageNamespace>('sd.layout.storage.namespace');\n\ninterface SdLayoutStorageHandles {\n namespace: string | undefined;\n isShowSidebar: SdStorage<boolean>;\n menuLockStatus: SdStorage<boolean>;\n lastActiveMenuGroupId: SdStorage<string>;\n pinnedMenuGroup: SdStorage<SdLayoutChildrenMenu>;\n pinnedMenuKeys: SdStorage<string[]>;\n recentMenuKeys: SdStorage<string[]>;\n versionStates: SdStorage<Record<string, SdLayoutVersionState>>;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdLayoutStorageService {\n readonly #sdStorageService = inject(SdStorageService);\n readonly #namespaceSource = inject(SD_LAYOUT_STORAGE_NAMESPACE, { optional: true });\n #handles?: SdLayoutStorageHandles;\n\n // why: đọc namespace bằng field initializer là vô nghĩa — service là singleton `providedIn: 'root'`\n // nên nó chạy ở lần inject đầu tiên, thường TRƯỚC khi đăng nhập xong, và factory theo user trả về\n // `undefined` cho cả phiên; biện pháp \"pinned/recent của A không lộ sang B\" quảng cáo trong doc khi\n // đó không bao giờ có hiệu lực. Giải quyết bằng cách resolve LƯỜI ở mỗi lần truy cập handle: khi\n // danh tính đến (hoặc đổi user trong cùng phiên SPA) thì bảy handle được dựng lại trên namespace mới.\n get isShowSidebar(): SdStorage<boolean> {\n return this.#resolveHandles().isShowSidebar;\n }\n\n get menuLockStatus(): SdStorage<boolean> {\n return this.#resolveHandles().menuLockStatus;\n }\n\n get lastActiveMenuGroupId(): SdStorage<string> {\n return this.#resolveHandles().lastActiveMenuGroupId;\n }\n\n get pinnedMenuGroup(): SdStorage<SdLayoutChildrenMenu> {\n return this.#resolveHandles().pinnedMenuGroup;\n }\n\n get pinnedMenuKeys(): SdStorage<string[]> {\n return this.#resolveHandles().pinnedMenuKeys;\n }\n\n get recentMenuKeys(): SdStorage<string[]> {\n return this.#resolveHandles().recentMenuKeys;\n }\n\n get versionStates(): SdStorage<Record<string, SdLayoutVersionState>> {\n return this.#resolveHandles().versionStates;\n }\n\n /**\n * Xoá toàn bộ state layout đã persist.\n *\n * **Consumer PHẢI gọi hàm này trong luồng signout, TRƯỚC khi danh tính bị xoá.** Nếu không,\n * pinned/recent/last-active của user vừa đăng xuất sẽ còn lại trên trình duyệt và hiện ra cho người\n * đăng nhập kế tiếp — rò rỉ tên module nội bộ mà người đó có thể không có quyền thấy.\n *\n * why: khi đã cấu hình `SD_LAYOUT_STORAGE_NAMESPACE` theo user, namespace được resolve NGAY LÚC GỌI.\n * Gọi `clear()` sau khi auth info về `undefined` sẽ xoá nhầm partition không-namespace, còn dữ liệu\n * của user vừa thoát thì vẫn nguyên.\n */\n clear(): void {\n const handles = this.#resolveHandles();\n for (const handle of this.#allHandles(handles)) handle.remove();\n }\n\n // why: namespace rỗng/space phải quy về undefined, nếu không mỗi chuỗi rác lại tạo ra một không\n // gian lưu trữ khác và state của chính user đó biến mất sau khi reload.\n #resolveNamespace(): string | undefined {\n const source = this.#namespaceSource;\n const raw = typeof source === 'function' ? source() : source;\n return typeof raw === 'string' ? raw.trim() || undefined : undefined;\n }\n\n #resolveHandles(): SdLayoutStorageHandles {\n const namespace = this.#resolveNamespace();\n const current = this.#handles;\n if (current && current.namespace === namespace) return current;\n // why: handle cũ phải `destroy()` (KHÔNG phải `remove()`) — chỉ gỡ facade và complete subject,\n // dữ liệu của namespace trước vẫn nằm nguyên để user đó quay lại còn đọc được.\n if (current) for (const handle of this.#allHandles(current)) handle.destroy();\n const next = this.#createHandles(namespace);\n this.#handles = next;\n return next;\n }\n\n #createHandles(namespace: string | undefined): SdLayoutStorageHandles {\n // why: `{ namespace: undefined }` cho ra đúng identity như khi không truyền option (`SdStorageService`\n // không áp namespace mặc định nào), nên app không cấu hình namespace vẫn đọc được state đã persist\n // từ trước — không mất pinned/recent khi nâng cấp thư viện.\n const option: SdStorageOption = { namespace };\n return {\n namespace,\n isShowSidebar: this.#sdStorageService.create('cb07c316-ed6d-4620-9e92-53dbef6aa983', option),\n menuLockStatus: this.#sdStorageService.create('2c2f4816-18b3-4ec3-8177-7b90bff036c3', option),\n lastActiveMenuGroupId: this.#sdStorageService.create('2e6961d0-3380-4a94-a6a1-38837560cd96', option),\n pinnedMenuGroup: this.#sdStorageService.create('e81da122-5dab-4250-b309-64197fb19d44', option),\n pinnedMenuKeys: this.#sdStorageService.create('4bdc7f80-9ff4-4fe0-908f-6c9f7fe4100a', option),\n recentMenuKeys: this.#sdStorageService.create('fb989dc1-f6e7-4b62-a611-861a8f214a51', option),\n versionStates: this.#sdStorageService.create('ca8e4261-fbd4-4209-af88-2dbe278c1a1b', option),\n };\n }\n\n #allHandles(handles: SdLayoutStorageHandles): readonly Pick<SdStorage, 'remove' | 'destroy'>[] {\n return [\n handles.isShowSidebar,\n handles.menuLockStatus,\n handles.lastActiveMenuGroupId,\n handles.pinnedMenuGroup,\n handles.pinnedMenuKeys,\n handles.recentMenuKeys,\n handles.versionStates,\n ];\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 { InjectionToken, 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/**\n * Bật fallback demo của `SdLayoutService` khi KHÔNG provide `SD_LAYOUT_CONFIGURATION`.\n *\n * why: fallback cũ chạy ngầm sau mỗi `console.warn`, nên một app cấu hình thiếu vẫn ship được UI có\n * user \"demo@example.com\" đang đăng nhập cùng nút signout không làm gì — người dùng cuối tin là đã\n * đăng nhập thật. Giờ mặc định là throw; ai thực sự cần demo/playground phải khai báo ý định:\n *\n * ```ts\n * providers: [{ provide: SD_LAYOUT_DEMO_FALLBACK, useValue: true }]\n * ```\n *\n * Cờ nằm ở token riêng chứ không phải field của `ISdLayoutConfiguration`, vì nó phải đọc được ĐÚNG\n * lúc `SD_LAYOUT_CONFIGURATION` vắng mặt — khi đó không có object configuration nào để đọc field.\n */\nexport const SD_LAYOUT_DEMO_FALLBACK = new InjectionToken<boolean>('sd.layout.demo-fallback');\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 để service tự phát hiện consumer thiếu config và báo lỗi rõ ràng,\n // thay vì để Angular ném NullInjectorError khó đọc từ một component sâu trong cây.\n #layoutConfiguration = inject<ISdLayoutConfiguration | null>(SD_LAYOUT_CONFIGURATION, { optional: true });\n #demoFallback = inject(SD_LAYOUT_DEMO_FALLBACK, { optional: true }) ?? false;\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 /**\n * Route \"về trang chủ\" của consumer, lấy từ `ISdLayoutConfiguration.homeUrl`.\n * why: các trang lỗi (forbidden / not-found) cần một đích điều hướng thật thay vì reload chính nó.\n */\n readonly homeUrl = this.#layoutConfiguration?.homeUrl?.trim() || '/';\n\n constructor() {\n if (!this.#layoutConfiguration) {\n if (!this.#demoFallback) {\n // why: fail loudly. Im lặng degrade sang mock user là ship ra production một UI nói dối\n // rằng người dùng đã đăng nhập (email demo, signout no-op).\n throw new Error(\n // @i18n-ignore dev-facing error — không cần dịch\n '[SdLayoutService] SD_LAYOUT_CONFIGURATION chưa được provide. ' +\n // @i18n-ignore\n 'Provide token này (xem ISdLayoutConfiguration) để cấu hình user info / sidebar / signout. ' +\n // @i18n-ignore\n 'Nếu đang chạy demo/playground và CHỦ ĐỘNG muốn mock data, provide SD_LAYOUT_DEMO_FALLBACK = true.'\n );\n }\n\n // WHY: chỉ chạy khi consumer chủ động opt-in demo fallback.\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 qua SD_LAYOUT_DEMO_FALLBACK. ' +\n // @i18n-ignore\n 'Tuyệt đối không bật cờ này trên môi trường thật.'\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';\nimport { sdIsExternalHttpUrl, sdParseUrl } from '@sdcorejs/angular/utilities';\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 // why: code cũ là `const path = menu?.path?.includes('http') ? menu.path : menu.path` — hai\n // nhánh giống hệt nhau nên biến `path` không biến đổi gì, tức phần validate URL đã bị mất.\n // `path` chảy thẳng xuống `window.open()` / `routerLink` của sidebar, nên ở đây validate thật\n // và loại menu có scheme nguy hiểm (`javascript:`, `data:`, `vbscript:`…) — fail closed.\n // Không cần biến trung gian nữa: `path` đi kèm nguyên vẹn trong `{ ...menu }`.\n if (!menu.path || !this.#isSafeMenuPath(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 id: this.#getHashIdMenu(menu),\n };\n }\n\n if (typeof menu.permission === 'boolean' && menu.permission) {\n return {\n ...menu,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n if (typeof menu.permission === 'function' && menu.permission()) {\n return {\n ...menu,\n id: this.#getHashIdMenu(menu),\n };\n }\n\n return null;\n }\n\n // why: tới đây menu không có `children` và cũng KHÔNG có key `permission`. Nếu nó vẫn có `path`\n // thì đó là một menu lá điều hướng được, và việc gõ sai key (`permision`, `permissions`) sẽ\n // khiến item hiện với MỌI người — fail open. Chặn ở runtime (fail closed) thay vì siết type\n // `SdLayoutMenu`: menu thường được dựng động từ API/JSON rồi ép `as SdLayoutMenu[]`, nên siết\n // type không bắt được ca đó mà lại thành breaking change cho consumer đang build tĩnh.\n if ('path' in menu) {\n return null;\n }\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 /**\n * why: `sdParseUrl` không truyền base nên chỉ parse được URL TUYỆT ĐỐI. Không parse được ⇒ path\n * tương đối ⇒ route nội bộ của app, an toàn. Parse được thì scheme bắt buộc phải là `http(s)`;\n * mọi scheme khác bị loại vì `path` cuối cùng chảy vào `window.open()` của sidebar.\n */\n #isSafeMenuPath = (path: string): boolean => sdParseUrl(path) == null || sdIsExternalHttpUrl(path);\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 { SdTranslatePipe } 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, SdTranslatePipe],\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' | sdTranslate }}\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' | sdTranslate }}\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' | sdTranslate }}\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' | sdTranslate }}</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' | sdTranslate }}\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' | sdTranslate }}\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' | sdTranslate }}\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' | sdTranslate }}</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' | sdTranslate }}\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' | sdTranslate }}\n </button>\n }\n </div>\n }\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SdTranslatePipe } 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, SdTranslatePipe],\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' | sdTranslate\"\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 { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdSafeHtmlPipe } from '@sdcorejs/angular/pipes';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\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: 'sd-sidebar-v1-panel',\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 SdTranslatePipe,\n ],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarV1Panel {\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 #i18n = inject(I18nService);\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 // why: `title` của nhóm ghim là nhãn HIỂN THỊ (đổ vào `titleMenuGroup` trên header), không phải\n // id — phải dịch. Tính trong computed nên đổi ngôn ngữ là tiêu đề nhóm đổi theo.\n pinnedMenuGroup = computed<SdLayoutChildrenMenu>(() => ({\n id: 'pinned-menu-group',\n title: this.#i18n.t('core.module.layout.sidebar.pinned'),\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 // why: mục menu nay là role=\"button\" + tabindex=\"0\" nên Enter/Space phải điều hướng đúng như\n // click. Lọc theo target để phím bấm trên nút ghim lồng bên trong không kéo theo điều hướng.\n onMenuNodeKeydown = (event: KeyboardEvent, node: { path: string; queryParams: Params }): void => {\n if (event.target !== event.currentTarget) return;\n // why: chặn Space cuộn trang.\n event.preventDefault();\n this.navigate({ path: node.path, queryParams: node.queryParams ?? {} });\n };\n\n // why: nhánh có con nay là role=\"button\" + aria-expanded → Enter/Space phải gập/mở đúng như click.\n onToggleMenuNodeKeydown = (event: KeyboardEvent, menu: SdLayoutMenu): void => {\n if (event.target !== event.currentTarget) return;\n event.preventDefault();\n this.onToggleMenuNode(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 // why: `path.includes('http')` là substring test chứ không phải scheme test — chuỗi\n // `javascript:fetch(...)//http` lọt qua rồi chạy như script trong chính origin của app.\n // `sdIsExternalHttpUrl` parse URL thật, `sdOpenExternal` từ chối scheme lạ và luôn gắn\n // `noopener,noreferrer` (chặn reverse tabnabbing qua `window.opener`).\n if (sdIsExternalHttpUrl(path)) {\n sdOpenExternal(path);\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:;\" [attr.aria-label]=\"'core.module.layout.home.tab-name' | sdTranslate\" (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]=\"'core.module.layout.sidebar.pinned' | sdTranslate\"\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' | sdTranslate\"\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 <!-- why: role=button KHÔNG được bọc phần tử tương tác khác (nút ghim bên trong) —\n AT coi cả cụm là MỘT nút và nút ghim biến mất khỏi accessibility tree. Nay\n role=button + tabindex + Enter/Space + aria-current + (click) nằm CÙNG trên\n phần TIÊU ĐỀ, nút ghim là sibling độc lập; cả hai đều focus được. -->\n <div class=\"c-menu-node-description\" [class.d-none]=\"!isShowSidebar()\">\n <div\n class=\"c-menu-node-description-content\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-current]=\"(currentPath() | menuFocus: node) ? 'page' : null\"\n (click)=\"navigate(node)\"\n (keydown.enter)=\"onMenuNodeKeydown($event, node)\"\n (keydown.space)=\"onMenuNodeKeydown($event, node)\"\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 <!-- why: nút ghim trước đây là <sd-icon (click)> — custom element không nhận\n focus bàn phím và không có tên khả truy cập, nên không ghim được bằng phím.\n Đổi sang <button type=\"button\"> + aria-pressed, giống pattern đã dùng ở\n `shared/menu-tree`. -->\n @if (_sidebar?.pin?.enabled) {\n <button\n type=\"button\"\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 [attr.aria-pressed]=\"isPinnedNode(node)\"\n [attr.aria-label]=\"\n (isPinnedNode(node) ? 'core.module.layout.menu.unpin' : 'core.module.layout.menu.pin')\n | sdTranslate: { title: node.title }\n \"\n (click)=\"onTogglePin($event, node)\">\n <sd-icon name=\"push_pin\"></sd-icon>\n </button>\n }\n </div>\n </li>\n </mat-nested-tree-node>\n\n <!-- why: bỏ aria-hidden=\"true\" — nó ẩn TOÀN BỘ nhánh menu có con (tiêu đề nhóm lẫn\n mọi mục con bên trong) khỏi accessibility tree. -->\n <mat-nested-tree-node\n *matTreeNodeDef=\"let node; when: hasChild\"\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 <!-- why: nhánh có con là nút GẬP/MỞ thật nhưng trước đây chỉ có (click) và\n không khai trạng thái. Nay role=button + tabindex + aria-expanded +\n Enter/Space. -->\n <div\n [class.d-none]=\"!isShowSidebar()\"\n class=\"c-menu-node-description\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"treeControl.isExpanded(node)\"\n (click)=\"onToggleMenuNode(node)\"\n (keydown.enter)=\"onToggleMenuNodeKeydown($event, node)\"\n (keydown.space)=\"onToggleMenuNodeKeydown($event, 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 { SdSidebarV1Panel } from './components/sidebar/sidebar.component';\n\n@Component({\n selector: 'sd-sidebar-v1',\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n imports: [MatSidenavModule, CommonModule, SdSidebarV1Panel],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarV1 {\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 <sd-sidebar-v1-panel\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 </sd-sidebar-v1-panel>\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 { SdTranslatePipe } 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, SdTranslatePipe],\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' | sdTranslate\"\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, DOCUMENT } 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';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\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 SdSidebarMobileOverlay {\n #router = inject(Router);\n #destroyRef = inject(DestroyRef);\n #layoutStorageService = inject(SdLayoutStorageService);\n // why: các sidebar anh em đều lấy window qua DOCUMENT.defaultView; đọc global `window` trực tiếp\n // sẽ throw khi render phía server (SSR) vì global đó không tồn tại.\n #window = inject(DOCUMENT).defaultView;\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>(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\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 // why: giống sidebar v1 desktop — lấy path từ chính sự kiện router thay vì đọc global\n // `window.location`, để component chạy được cả khi không có global window (SSR).\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 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 // why: `path.includes('http')` là substring test chứ không phải scheme test —\n // `javascript:fetch(...)//http` lọt qua rồi chạy như script trong chính origin của app. Ngoài ra\n // `window.open(path)` cũ không truyền `noopener` nên tab mới giữ được `window.opener` và có thể\n // điều hướng ngược tab gốc (reverse tabnabbing). `sdOpenExternal` luôn gắn `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(path)) {\n sdOpenExternal(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 { SdSidebarMobileOverlay } from './components/sidebar/sidebar.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-sidebar-mobile-v1',\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n imports: [SdIcon, CommonModule, SdSidebarMobileOverlay],\n standalone: true,\n})\nexport class SdSidebarMobileV1 {\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 { I18nService } from '@sdcorejs/angular/i18n';\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 /** Accessible name of the pin toggle — already i18n-resolved with the menu title interpolated. */\n pinLabel: string;\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 #i18n = inject(I18nService);\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 const title = menu.title ?? menu.tooltipTitle ?? '';\n const isPinned = pinnedKeys.has(key);\n nodes.push({\n menu,\n key,\n title,\n depth,\n paddingLeft: 12 + depth * 16,\n isGroup,\n isActive: !!path && this.#pathMatches(this.activePath(), path),\n isPinned,\n isPinVisible: alwaysShowPin || isPinned || hoveredPinKey === key,\n // why: template cũ nối `'Pin ' + node.title` — chuỗi tiếng Anh cứng và ép trật tự\n // \"động từ trước tên\" của tiếng Anh lên mọi ngôn ngữ. Nội suy `{title}` để catalog tự\n // quyết định vị trí. Tính trong `nodes` computed nên tự cập nhật khi đổi ngôn ngữ.\n pinLabel: this.#i18n.t(isPinned ? 'core.module.layout.menu.unpin' : 'core.module.layout.menu.pin', { title }),\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.pinLabel\"\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 { 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 { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\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: 'sd-sidebar-v2',\n standalone: true,\n imports: [SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n // why: Escape-để-đóng-flyout gom về HOST. Trước đây handler nằm trên div bọc và trên <section>\n // flyout — cả hai đều không focusable nên chỉ chạy nhờ event nổi bọt từ con, đồng thời khai\n // interaction handler trên phần tử không nhận được focus. Host là tổ tiên của tất cả nên hành vi\n // giữ nguyên hệt như cũ.\n host: {\n '(keydown.escape)': 'closeFromEscape()',\n },\n})\nexport class SdSidebarV2 {\n readonly #router = inject(Router);\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 // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\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","<!-- why: `(keydown.escape)` được gom lên HOST của component (xem `host` trong main.component.ts).\n Trước đây nó nằm trên div bọc và trên <section> flyout — cả hai đều KHÔNG focusable nên chỉ\n \"chạy nhờ\" event nổi bọt từ con, đồng thời khiến markup khai báo interaction handler trên\n phần tử không nhận được focus. Host là tổ tiên của tất cả nên hành vi giữ nguyên. -->\n<div class=\"sd-sidebar-v2\">\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\" [attr.aria-label]=\"'core.module.layout.home.tab-name' | sdTranslate\">\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\" [attr.aria-label]=\"'core.module.layout.sidebar.menu-groups' | sdTranslate\">\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 [attr.aria-label]=\"'core.module.layout.sidebar.close-menu' | sdTranslate\"\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 role=\"region\"\n [attr.aria-label]=\"activeGroup()?.title || 'Menu'\"\n (mouseleave)=\"leaveFlyout()\">\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]=\"'core.module.layout.sidebar.search-in-group' | sdTranslate\"\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 { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\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: 'sd-sidebar-mobile-v2',\n standalone: true,\n imports: [A11yModule, SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarMobileV2 {\n readonly #router = inject(Router);\n readonly #i18n = inject(I18nService);\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', this.#i18n.t('core.module.layout.sidebar.more'), 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 // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\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\" [attr.aria-label]=\"'core.module.layout.sidebar.primary-nav' | sdTranslate\">\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 [attr.aria-label]=\"'core.module.layout.sidebar.more-menu' | sdTranslate\"\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\">{{ 'core.module.layout.sidebar.more' | sdTranslate }}</span>\n </button>\n }\n </nav>\n\n @if (isSheetOpen()) {\n <button type=\"button\" class=\"sd-sidebar-mobile-v2__backdrop\" [attr.aria-label]=\"'core.module.layout.sidebar.close-menu' | sdTranslate\" (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 [attr.aria-label]=\"'core.common.close' | sdTranslate\"\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]=\"'core.module.layout.sidebar.search-in-menu' | sdTranslate\"\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 { 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 { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\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';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Component({\n selector: 'sd-sidebar-v3',\n standalone: true,\n imports: [SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarV3 {\n readonly #router = inject(Router);\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 // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\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\">{{ 'core.module.layout.sidebar.pinned' | sdTranslate }}</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\">{{ 'core.module.layout.sidebar.recent' | sdTranslate }}</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\">{{ 'core.module.layout.sidebar.all-menu' | sdTranslate }}</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 { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\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';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Component({\n selector: 'sd-sidebar-mobile-v3',\n standalone: true,\n imports: [A11yModule, SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent, SdTranslatePipe],\n templateUrl: './main.component.html',\n styleUrl: './main.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdSidebarMobileV3 {\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 // why: `includes('http')` là substring test — `javascript:fetch(...)//http` lọt qua và chạy như\n // script trong origin của app. Parse URL thật rồi mới mở, kèm `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(menu.path)) {\n sdOpenExternal(menu.path);\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\">{{ 'core.module.layout.sidebar.pinned' | sdTranslate }}</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\">{{ 'core.module.layout.sidebar.recent' | sdTranslate }}</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\">{{ 'core.module.layout.sidebar.all-menu' | sdTranslate }}</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 { SdSidebarV1 } from '../sidebar-v1/main.component';\nimport { SdSidebarMobileV1 } from '../sidebar-mobile-v1/main.component';\nimport { SdSidebarV2 } from '../sidebar-v2/main.component';\nimport { SdSidebarMobileV2 } from '../sidebar-mobile-v2/main.component';\nimport { SdSidebarV3 } from '../sidebar-v3/main.component';\nimport { SdSidebarMobileV3 } 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: [SdSidebarV1, SdSidebarMobileV1, SdSidebarV2, SdSidebarMobileV2, SdSidebarV3, SdSidebarMobileV3, NgTemplateOutlet],\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 <sd-sidebar-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\" [isMobile]=\"false\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-v1>\n } @else {\n <sd-sidebar-mobile-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-mobile-v1>\n }\n}\n\n@if (_userInfo && _sidebarV3) {\n @if (!isMobile()) {\n <sd-sidebar-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-v3>\n } @else {\n <sd-sidebar-mobile-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-mobile-v3>\n }\n}\n\n@if (_userInfo && _sidebarV2) {\n @if (!isMobile()) {\n <sd-sidebar-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-v2>\n } @else {\n <sd-sidebar-mobile-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n </sd-sidebar-mobile-v2>\n }\n}\n","import { I18N_MESSAGES, I18N_STORAGE_KEY } from '@sdcorejs/angular/i18n';\nimport { Language } from '@sdcorejs/utils/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, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Language } from '@sdcorejs/utils/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, SdTranslatePipe],\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' | sdTranslate: { 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 | sdTranslate }}</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, Router } from '@angular/router';\nimport { SdButton, SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18nService, SdTranslatePipe } 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, SdTranslatePipe],\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 #router = inject(Router);\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 /**\n * why: `window.location.href = ''` vừa là global thô (throw khi SSR vì không có `window`), vừa chỉ\n * reload lại đúng trang lỗi này thay vì rời khỏi nó — trong khi nút mang nhãn \"Quay lại trang chủ\".\n * Điều hướng bằng Router tới `homeUrl` mà consumer đã khai trong SD_LAYOUT_CONFIGURATION.\n */\n reload(): void {\n void this.#router.navigateByUrl(this.#layoutService.homeUrl);\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' | sdTranslate: { 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' | sdTranslate }}</span>\n <span class=\"T16R text-secondary mt-4\">\n {{ 'core.module.layout.not-found.message' | sdTranslate }}\n </span>\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.not-found.back' | sdTranslate\" 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, Router } from '@angular/router';\nimport { SdButton, SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18nService, SdTranslatePipe } 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, SdTranslatePipe],\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 #router = inject(Router);\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 /**\n * why: `window.location.href = ''` vừa là global thô (throw khi SSR vì không có `window`), vừa chỉ\n * reload lại đúng trang lỗi này thay vì rời khỏi nó — trong khi nút mang nhãn \"Về trang chủ\".\n * Điều hướng bằng Router tới `homeUrl` mà consumer đã khai trong SD_LAYOUT_CONFIGURATION.\n */\n reload(): void {\n void this.#router.navigateByUrl(this.#layoutService.homeUrl);\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' | sdTranslate: { 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' | sdTranslate }}</span>\n <span class=\"T14R text-secondary mt-4\"\n >{{ 'core.module.layout.forbidden.message' | sdTranslate }}</span\n >\n <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.forbidden.back-home' | sdTranslate\"> </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';\nimport { SD_PERMISSION_PUBLIC } from '@sdcorejs/angular/modules/permission';\n\n// why: `SdPermissionGuard.canActivateChild` từ chối mọi route không khai báo `data.permission`. Ba\n// trang built-in dưới đây là hạ tầng của layout (home / 404 / 403), ai đăng nhập cũng phải vào được —\n// đặc biệt `forbidden`, vì `onForbiden` thường điều hướng chính vào nó: thiếu khai báo ở đây thì\n// trang 403 tự bị chặn và app rơi vào vòng lặp redirect. Nói tường minh bằng `SD_PERMISSION_PUBLIC`.\n// Route con `path: ''` trong từng module kế thừa `data` này (chiến lược `emptyOnly` mặc định).\nconst PUBLIC_ROUTE_DATA = { permission: SD_PERMISSION_PUBLIC } as const;\n\nexport const Routes: Route[] = [\n {\n path: '',\n pathMatch: 'full',\n redirectTo: 'not-found',\n },\n {\n path: 'home',\n data: PUBLIC_ROUTE_DATA,\n loadChildren: () => import('./modules/home').then(m => m.HomeModule),\n },\n {\n path: 'not-found',\n data: PUBLIC_ROUTE_DATA,\n loadChildren: () => import('./modules/not-found').then(m => m.NotFoundModule),\n },\n {\n path: 'forbidden',\n data: PUBLIC_ROUTE_DATA,\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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"}