@sdcorejs/angular 19.0.9 → 19.0.10

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 (223) hide show
  1. package/README.md +270 -140
  2. package/assets/scss/core/utilities/_grid.scss +25 -19
  3. package/components/anchor/src/models/sd-anchor.model.d.ts +1 -1
  4. package/components/document-builder/src/document-builder.component.d.ts +2 -2
  5. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +1 -1
  6. package/components/editor/src/plugins/image-upload/utils/batch.utils.d.ts +3 -3
  7. package/components/form-generic/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +10 -6
  8. package/components/form-generic/src/components/form-builder/components/attribute-expression/form-expression-query-adapter.d.ts +6 -0
  9. package/components/form-generic/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +2 -2
  10. package/components/form-generic/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +2 -2
  11. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +2 -2
  12. package/components/form-generic/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +2 -2
  13. package/components/form-generic/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +2 -4
  14. package/components/form-generic/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +2 -4
  15. package/components/form-generic/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +2 -2
  16. package/components/form-generic/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +2 -2
  17. package/components/form-generic/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +2 -2
  18. package/components/form-generic/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +2 -2
  19. package/components/form-generic/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +2 -2
  20. package/components/form-generic/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +6 -7
  21. package/components/form-generic/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +2 -2
  22. package/components/form-generic/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +2 -2
  23. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +2 -2
  24. package/components/form-generic/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +2 -2
  25. package/components/form-generic/src/components/form-builder/components/html/control/html-control.component.d.ts +2 -2
  26. package/components/form-generic/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +2 -2
  27. package/components/form-generic/src/components/form-builder/components/number/control/number-control.component.d.ts +2 -2
  28. package/components/form-generic/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +2 -2
  29. package/components/form-generic/src/components/form-builder/components/radio/control/radio-control.component.d.ts +2 -2
  30. package/components/form-generic/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +2 -2
  31. package/components/form-generic/src/components/form-builder/components/select/control/select-control.component.d.ts +2 -2
  32. package/components/form-generic/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +2 -2
  33. package/components/form-generic/src/components/form-builder/components/table/control/table-control.component.d.ts +2 -2
  34. package/components/form-generic/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +2 -2
  35. package/components/form-generic/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +2 -2
  36. package/components/form-generic/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +2 -2
  37. package/components/form-generic/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +2 -2
  38. package/components/form-generic/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +2 -2
  39. package/components/form-generic/src/components/form-builder/components/upload/control/upload-control.component.d.ts +2 -2
  40. package/components/form-generic/src/components/form-builder/form-builder-layout.d.ts +22 -0
  41. package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +24 -5
  42. package/components/form-generic/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +2 -2
  43. package/components/form-generic/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +2 -2
  44. package/components/form-generic/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +2 -2
  45. package/components/form-generic/src/components/form-render/components/item/components/html/html.component.d.ts +2 -2
  46. package/components/form-generic/src/components/form-render/components/item/components/number/number.component.d.ts +2 -2
  47. package/components/form-generic/src/components/form-render/components/item/components/radio/radio.component.d.ts +2 -2
  48. package/components/form-generic/src/components/form-render/components/item/components/select/select.component.d.ts +2 -2
  49. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +2 -2
  50. package/components/form-generic/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +2 -2
  51. package/components/form-generic/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +2 -2
  52. package/components/form-generic/src/components/form-render/components/item/components/upload/upload.component.d.ts +2 -2
  53. package/components/form-generic/src/components/form-render/components/variable/variable.component.d.ts +2 -2
  54. package/components/form-generic/src/components/form-render/form-render.component.d.ts +4 -6
  55. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +2 -2
  56. package/components/form-generic/src/configurations/form.configuration.d.ts +1 -1
  57. package/components/form-generic/src/models/form-generic-component.model.d.ts +2 -2
  58. package/components/form-generic/src/services/form-generic.service.d.ts +1 -3
  59. package/components/import-excel/src/import-excel.model.d.ts +2 -2
  60. package/components/mini-editor/src/mini-editor.component.d.ts +4 -4
  61. package/components/modal/src/modal.component.d.ts +1 -1
  62. package/components/query-builder/src/query-builder.model.d.ts +4 -4
  63. package/components/splitter/src/splitter-state.service.d.ts +1 -1
  64. package/components/tab-router/src/models/tab-router.model.d.ts +2 -1
  65. package/components/tab-router/src/services/tab-router.service.d.ts +0 -1
  66. package/components/table/src/components/command/desktop-command.component.d.ts +8 -7
  67. package/components/table/src/components/command/pipes/command.pipe.d.ts +1 -12
  68. package/components/table/src/components/command/pipes/filter.pipe.d.ts +1 -8
  69. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +1 -0
  70. package/components/table/src/models/table-column.model.d.ts +3 -2
  71. package/components/table/src/pipes/selection-disabled.pipe.d.ts +1 -1
  72. package/components/table/src/services/config.service.d.ts +4 -5
  73. package/components/view/src/view.component.d.ts +1 -1
  74. package/configurations/src/sd-core.configuration.d.ts +2 -2
  75. package/fesm2022/sdcorejs-angular-components-anchor.mjs +15 -18
  76. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  77. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-components-avatar.mjs.map +1 -1
  79. package/fesm2022/sdcorejs-angular-components-badge.mjs +0 -1
  80. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  81. package/fesm2022/sdcorejs-angular-components-button.mjs +6 -7
  82. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  83. package/fesm2022/sdcorejs-angular-components-chart.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  85. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +1 -1
  86. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  87. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +17 -26
  88. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  89. package/fesm2022/sdcorejs-angular-components-editor.mjs +7 -2
  90. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  91. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +711 -426
  92. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  93. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +35 -18
  94. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  95. package/fesm2022/sdcorejs-angular-components-inform.mjs +0 -1
  96. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  97. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  99. package/fesm2022/sdcorejs-angular-components-modal.mjs +25 -14
  100. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  101. package/fesm2022/sdcorejs-angular-components-operator.mjs +1 -1
  102. package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -1
  103. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-components-preview.mjs +33 -29
  105. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +15 -28
  107. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +2 -3
  109. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-components-quick-action.mjs.map +1 -1
  111. package/fesm2022/sdcorejs-angular-components-section.mjs +0 -1
  112. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  113. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +3 -3
  114. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  115. package/fesm2022/sdcorejs-angular-components-splitter.mjs +4 -4
  116. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  117. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +31 -31
  119. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  121. package/fesm2022/sdcorejs-angular-components-table.mjs +60 -78
  122. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  123. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +6 -6
  125. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-components-view.mjs +3 -9
  127. package/fesm2022/sdcorejs-angular-components-view.mjs.map +1 -1
  128. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  129. package/fesm2022/sdcorejs-angular-directives.mjs +2 -7
  130. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  131. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +0 -3
  132. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  133. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  134. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +2 -2
  135. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  136. package/fesm2022/sdcorejs-angular-forms-chip.mjs +2 -2
  137. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  138. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +1 -3
  139. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  140. package/fesm2022/sdcorejs-angular-forms-date.mjs +2 -4
  141. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  142. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +2 -6
  143. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  144. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +3 -3
  145. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  146. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +1 -1
  147. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  148. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  149. package/fesm2022/sdcorejs-angular-forms-label.mjs +0 -1
  150. package/fesm2022/sdcorejs-angular-forms-label.mjs.map +1 -1
  151. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  152. package/fesm2022/sdcorejs-angular-forms-radio.mjs +12 -2
  153. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  154. package/fesm2022/sdcorejs-angular-forms-select.mjs +45 -14
  155. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  156. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +2 -2
  158. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  159. package/fesm2022/sdcorejs-angular-handlers.mjs +3 -6
  160. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular-i18n.mjs +11 -7
  162. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  163. package/fesm2022/sdcorejs-angular-interceptors.mjs +0 -2
  164. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  165. package/fesm2022/sdcorejs-angular-modules-auth.mjs +14 -38
  166. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  167. package/fesm2022/sdcorejs-angular-modules-authom.mjs +14 -14
  168. package/fesm2022/sdcorejs-angular-modules-authom.mjs.map +1 -1
  169. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +22 -11
  170. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  171. package/fesm2022/sdcorejs-angular-modules-layout.mjs +30 -27
  172. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  173. package/fesm2022/sdcorejs-angular-modules-permission.mjs +5 -12
  174. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  175. package/fesm2022/sdcorejs-angular-pipes.mjs +71 -17
  176. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  177. package/fesm2022/sdcorejs-angular-services-api.mjs +0 -2
  178. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  179. package/fesm2022/sdcorejs-angular-services-cache.mjs +5 -11
  180. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  181. package/fesm2022/sdcorejs-angular-services-confirm.mjs +16 -21
  182. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  183. package/fesm2022/sdcorejs-angular-services-docx.mjs +2 -8
  184. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  185. package/fesm2022/sdcorejs-angular-services-excel.mjs +2 -2
  186. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  187. package/fesm2022/sdcorejs-angular-services-license.mjs +5 -12
  188. package/fesm2022/sdcorejs-angular-services-license.mjs.map +1 -1
  189. package/fesm2022/sdcorejs-angular-services-notify.mjs +70 -87
  190. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  191. package/fesm2022/sdcorejs-angular-services-storage.mjs +6 -15
  192. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  193. package/fesm2022/sdcorejs-angular-utilities-data-state.mjs.map +1 -1
  194. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +47 -5
  195. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  196. package/fesm2022/sdcorejs-angular-utilities-models.mjs +18 -3
  197. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  198. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  199. package/forms/chip/src/chip.component.d.ts +2 -2
  200. package/forms/chip-calendar/src/chip-calendar.component.d.ts +2 -2
  201. package/forms/input-color/src/input-color.component.d.ts +2 -1
  202. package/forms/select/src/select-footer-action.directive.d.ts +5 -1
  203. package/forms/select/src/select.component.d.ts +4 -0
  204. package/modules/auth/guards/auth.guard.d.ts +2 -4
  205. package/modules/auth/guards/portal.guard.d.ts +2 -4
  206. package/modules/auth/services/auth.service.d.ts +3 -4
  207. package/modules/layout/modules/home/guards/home-redirect.guard.d.ts +3 -5
  208. package/modules/permission/src/configurations/permission.configuration.d.ts +3 -3
  209. package/modules/permission/src/guards/permission.guard.d.ts +2 -5
  210. package/package.json +2 -2
  211. package/pipes/index.d.ts +3 -0
  212. package/pipes/src/format-date.pipe.d.ts +8 -0
  213. package/pipes/src/format-datetime.pipe.d.ts +8 -0
  214. package/pipes/src/format-number.pipe.d.ts +1 -3
  215. package/pipes/src/view.pipe.d.ts +7 -0
  216. package/services/confirm/src/lib/components/dialog-confirm/dialog-confirm.component.d.ts +3 -3
  217. package/services/license/src/license.service.d.ts +2 -3
  218. package/services/notify/src/components/toast/toast.component.d.ts +9 -13
  219. package/services/notify/src/notify.service.d.ts +4 -5
  220. package/services/storage/src/storage.service.d.ts +3 -4
  221. package/utilities/extensions/index.d.ts +1 -0
  222. package/utilities/extensions/src/object.extension.d.ts +8 -0
  223. package/components/document-builder/src/plugins/paste-handler/filters/replacetabswithinprewithspaces.d.ts +0 -24
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, Pipe, Input, ChangeDetectionStrategy, Component, viewChild, input, inject, ChangeDetectorRef, ElementRef, HostListener, booleanAttribute, signal, Injector, afterNextRender, NgModuleFactory, createNgModule } from '@angular/core';
2
+ import { InjectionToken, Injectable, Pipe, Input, ChangeDetectionStrategy, Component, viewChild, input, inject, ChangeDetectorRef, ElementRef, HostListener, booleanAttribute, signal, Injector, afterNextRender, NgModuleFactory, createNgModule } from '@angular/core';
3
3
  import * as i2 from '@angular/router';
4
4
  import { Router, RoutesRecognized, NavigationEnd, RouterOutlet, ActivatedRoute } from '@angular/router';
5
5
  import * as i1$1 from '@angular/common';
@@ -30,6 +30,8 @@ class SdTabActivated extends SdTabBase {
30
30
  class SdTabDeactivated extends SdTabBase {
31
31
  }
32
32
 
33
+ const SD_TAB = new InjectionToken('SD_TAB');
34
+
33
35
  class SdTabRouterService {
34
36
  events = new BehaviorSubject(new SdTabBase(undefined));
35
37
  actions = new BehaviorSubject(undefined);
@@ -39,7 +41,6 @@ class SdTabRouterService {
39
41
  updateTabs = new BehaviorSubject(undefined);
40
42
  #currentTab = undefined;
41
43
  #componentBuilders = [];
42
- constructor() { }
43
44
  addBuilder = (builder) => {
44
45
  if (!this.#componentBuilders.some(e => e.component === builder.component)) {
45
46
  this.#componentBuilders.push(builder);
@@ -113,7 +114,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
113
114
  args: [{
114
115
  providedIn: 'root',
115
116
  }]
116
- }], ctorParameters: () => [] });
117
+ }] });
117
118
 
118
119
  class SdTabDecoratorService {
119
120
  static tabRouterService = new BehaviorSubject(undefined);
@@ -216,26 +217,8 @@ class SdTabRouterItemComponent {
216
217
  this.#closeTab();
217
218
  }
218
219
  };
219
- #closeTab = async () => {
220
- if (this.tab?.beforeClose) {
221
- //
222
- if (this.tab?.beforeClose()) {
223
- const result = this.tab?.beforeClose();
224
- if (typeof result === 'boolean') {
225
- if (result) {
226
- this.tabRouterService.close(this.tab);
227
- }
228
- }
229
- else {
230
- if (await result) {
231
- this.tabRouterService.close(this.tab);
232
- }
233
- }
234
- }
235
- }
236
- else {
237
- this.tabRouterService.close(this.tab);
238
- }
220
+ #closeTab = () => {
221
+ this.tabRouterService.close(this.tab);
239
222
  };
240
223
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTabRouterItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: SdTabRouterService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
241
224
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdTabRouterItemComponent, isStandalone: true, selector: "sd-tab-router-item", inputs: { tab: "tab" }, ngImport: i0, template: "<a\n [href]=\"[tab.url]\"\n class=\"tab-router__item d-flex align-items-center gap-8\"\n [class.tab-router__item--active]=\"tab.isActive\"\n (click)=\"onTabClick($event)\"\n (mousedown)=\"onMousedown($event)\"\n (mouseup)=\"onMouseup($event)\">\n @let info = tabInfo | sdTabInfo: tab;\n @if (info) {\n <sd-badge\n style=\"overflow: hidden;white-space: nowrap;\"\n [icon]=\"info.icon\"\n [title]=\"info.icon\"\n [tooltip]=\"info.tooltip || info.name\"\n [title]=\"info.name\"\n [color]=\"info.color\"\n (click)=\"onTabClick($event)\"></sd-badge>\n <button\n aria-hidden=\"true\"\n class=\"tab-router__close d-flex align-items-center justify-content-center ml-auto p-0\"\n (click)=\"close($event)\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon aria-hidden=\"true\" fontIcon=\"close\"></mat-icon>\n </button>\n }\n</a>\n", styles: [":host{display:block;overflow:hidden;position:relative;flex:1 1 64px;max-width:240px}:host:after{content:\"\";position:absolute;right:0;top:0;bottom:0;height:16px;width:1px;background:#dde0e5;margin:auto}:host:last-child:after{content:none}:host::ng-deep .tab-router__item sd-badge .c-badge-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:184px}.flex-1{flex:1}.tab-router__icon{background-color:#5c6bc0;width:16px;height:16px;line-height:16px;text-align:center;font-size:10px;color:#fff;border-radius:2px;text-transform:uppercase}.tab-router__icon .mat-icon{height:10px;width:10px;font-size:10px}.tab-router__close{color:#757575;outline:none;border:0;background:none;border-radius:50%;height:16px;width:16px}.tab-router__close:hover{background-color:#0000001f}.tab-router__close .mat-icon{font-size:12px;height:12px;width:12px}.tab-router__item{background:#f2f3f4;padding:8px;color:inherit;text-decoration:none;font-size:12px;line-height:16px;overflow:hidden}.tab-router__item:hover{background-color:#fff}.tab-router__name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tab-router__item--active{border-radius:8px 8px 0 0;background-color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: SdBadge, selector: "sd-badge", inputs: ["type", "color", "primary", "secondary", "success", "info", "warning", "error", "fontSet", "title", "description", "tooltip", "icon", "size"], outputs: ["click"] }, { kind: "pipe", type: SdTabInfoPipe, name: "sdTabInfo" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -288,8 +271,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
288
271
  args: ['window:resize']
289
272
  }] } });
290
273
 
291
- /* eslint-disable @typescript-eslint/no-explicit-any */
292
- // eslint-disable-next-line @angular-eslint/no-unused-standalone-imports
293
274
  class SdTabRouterOutletComponent {
294
275
  disabled = input(false, { transform: booleanAttribute });
295
276
  tabRouterNav = viewChild('tabRouterNav');
@@ -392,9 +373,21 @@ class SdTabRouterOutletComponent {
392
373
  });
393
374
  };
394
375
  tabTrackBy = (index, tab) => tab.key;
395
- #closeTab = (tab) => {
376
+ #closeTab = async (tab) => {
396
377
  if (this.disabled())
397
378
  return;
379
+ if (tab.beforeClose) {
380
+ let canClose;
381
+ try {
382
+ const result = tab.beforeClose();
383
+ canClose = typeof result === 'boolean' ? result : await result;
384
+ }
385
+ catch {
386
+ canClose = true;
387
+ }
388
+ if (!canClose)
389
+ return;
390
+ }
398
391
  const currentTabs = this.tabs();
399
392
  const { isActive, key: activeKey } = tab;
400
393
  if (isActive) {
@@ -493,10 +486,11 @@ class SdTabRouterOutletComponent {
493
486
  // Refresh root sau await: lazy route tree có thể hoàn tất trong lúc resolve injector.
494
487
  this.#rootRoute = this.#router.routerState.root;
495
488
  const activatedRoute = this.#findActivatedRouteForSnapshot(this.#rootRoute, route);
489
+ const sdInjector = new SdOutletInjector(activatedRoute, finalInjector);
496
490
  const newTab = {
497
491
  key,
498
492
  component,
499
- injector: new SdOutletInjector(activatedRoute, finalInjector),
493
+ injector: sdInjector,
500
494
  isActive: true,
501
495
  url,
502
496
  params,
@@ -504,6 +498,7 @@ class SdTabRouterOutletComponent {
504
498
  data,
505
499
  tabInfoChanges: new Subject(),
506
500
  };
501
+ sdInjector.setTab(newTab);
507
502
  // Tạo updatedTabs qua spread thay vì mutate (xem lý do ở for loop phía trên).
508
503
  // Với tab có isActive không đổi: giữ nguyên reference (tránh trigger ngComponentOutlet
509
504
  // re-evaluate không cần thiết). Với tab cần đổi isActive: tạo object mới qua spread,
@@ -525,9 +520,7 @@ class SdTabRouterOutletComponent {
525
520
  // component → tab bị "reload" mỗi khi click lại hoặc navigate cùng URL.
526
521
  //
527
522
  // splice phía trên có thể đã shift index nếu activatedIndex < existedIndex.
528
- const idx = replaceTab && activatedIndex >= 0 && activatedIndex < existedIndex
529
- ? existedIndex - 1
530
- : existedIndex;
523
+ const idx = replaceTab && activatedIndex >= 0 && activatedIndex < existedIndex ? existedIndex - 1 : existedIndex;
531
524
  this.#tabRouterService.setCurrentTab(updatedTabs[idx]);
532
525
  this.#tabRouterService.pushEvent(updatedTabs[idx], SdTabActivated);
533
526
  this.tabs.set(updatedTabs);
@@ -575,14 +568,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
575
568
  class SdOutletInjector {
576
569
  route;
577
570
  parentInjector;
571
+ #tab;
578
572
  constructor(route, parentInjector) {
579
573
  this.route = route;
580
574
  this.parentInjector = parentInjector;
581
575
  }
576
+ setTab(tab) {
577
+ this.#tab = tab;
578
+ }
582
579
  get(token, notFoundValue) {
583
580
  if (token === ActivatedRoute) {
584
581
  return this.route || notFoundValue;
585
582
  }
583
+ if (token === SD_TAB) {
584
+ return this.#tab ?? notFoundValue;
585
+ }
586
586
  return this.parentInjector.get(token, notFoundValue);
587
587
  }
588
588
  }
@@ -601,5 +601,5 @@ function SdTabComponent(builder) {
601
601
  * Generated bundle index. Do not edit.
602
602
  */
603
603
 
604
- export { SdTabComponent, SdTabRouterOutletComponent, SdTabRouterService };
604
+ export { SD_TAB, SdTabComponent, SdTabRouterOutletComponent, SdTabRouterService };
605
605
  //# sourceMappingURL=sdcorejs-angular-components-tab-router.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-components-tab-router.mjs","sources":["../../../projects/sdcorejs-angular/components/tab-router/src/events/tab-router.event.ts","../../../projects/sdcorejs-angular/components/tab-router/src/services/tab-router.service.ts","../../../projects/sdcorejs-angular/components/tab-router/src/services/tab-decorator.service.ts","../../../projects/sdcorejs-angular/components/tab-router/src/pipes/tab-info.pipe.ts","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.ts","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.html","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.ts","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.html","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.ts","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.html","../../../projects/sdcorejs-angular/components/tab-router/src/decorators/tab.decorator.ts","../../../projects/sdcorejs-angular/components/tab-router/sdcorejs-angular-components-tab-router.ts"],"sourcesContent":["import { SdTab } from '../models/tab-router.model';\n\nexport class SdTabBase {\n #tab: SdTab | undefined;\n\n constructor(tab: SdTab | undefined) {\n this.#tab = tab;\n }\n\n get tab(): SdTab | undefined {\n return this.#tab;\n }\n}\n\nexport class SdTabActivated extends SdTabBase {}\n\nexport class SdTabDeactivated extends SdTabBase {}\n\nexport declare type SdTabEvent = SdTabActivated | SdTabDeactivated;\n","import { Injectable, Type } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SdTabAction } from '../actions/tab-router.action';\nimport { SdTabComponentBuilder } from '../decorators/tab.decorator';\nimport { SdTabBase, SdTabEvent } from '../events/tab-router.event';\nimport { SdTab } from '../models/tab-router.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdTabRouterService {\n events = new BehaviorSubject<SdTabEvent>(new SdTabBase(undefined));\n actions = new BehaviorSubject<SdTabAction | undefined>(undefined);\n builders = new BehaviorSubject<SdTabComponentBuilder[]>([]);\n currentTabChanges = new BehaviorSubject<SdTab | undefined>(undefined);\n newTabs = new BehaviorSubject<SdTab | undefined>(undefined);\n updateTabs = new BehaviorSubject<SdTab | undefined>(undefined);\n #currentTab: SdTab | undefined = undefined;\n #componentBuilders: SdTabComponentBuilder[] = [];\n constructor() {}\n\n addBuilder = (builder: SdTabComponentBuilder) => {\n if (!this.#componentBuilders.some(e => e.component === builder.component)) {\n this.#componentBuilders.push(builder);\n this.builders.next(this.#componentBuilders);\n }\n };\n\n get currentTab() {\n return this.#currentTab;\n }\n\n get currentKey() {\n return this.#currentTab?.key || null;\n }\n\n // select = (tabOrKey: string | SdTab): void => {\n // const tab = this.#tabs.find(e => {\n // if (typeof (tabOrKey) === 'string') {\n // return e.key === tabOrKey;\n // }\n // return e.key === tabOrKey?.key;\n // });\n // if (tab) {\n // this.#currentTab = tab;\n // }\n // }\n\n // add = (tab: SdTab): void => {\n // if (!tab.key) {\n // this.notifyService.notify.warning('Tab key is required');\n // }\n // if (!tab.component) {\n // this.notifyService.notify.warning('Tab component is required');\n // }\n // const existedTab = this.#tabs.find(e => e.key === tab.key);\n // if (!existedTab) {\n // this.#tabs.push(tab);\n // this.select(tab);\n // } else {\n // this.select(existedTab);\n // }\n // }\n\n // remove = (tabOrKey: string | SdTab): void => {\n // this.#tabs = this.#tabs.filter(e => {\n // if (typeof (tabOrKey) === 'string') {\n // return e.key !== tabOrKey;\n // }\n // return e.key !== tabOrKey?.key;\n // });\n // }\n\n setCurrentTab = (tab: SdTab): void => {\n this.#currentTab = tab;\n this.currentTabChanges.next(tab);\n };\n\n pushEvent = (tab: SdTab, Event: Type<SdTabEvent>) => {\n this.events.next(new Event(tab));\n };\n\n setOptions = () => {};\n\n close = (tab?: SdTab) => {\n tab = tab || this.#currentTab;\n if (tab) {\n this.actions.next({\n type: 'close',\n tab,\n });\n }\n };\n\n // Gọi hàm này để thực hiện update tab\n updateTab = (tab: SdTab) => {};\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SdTabRouterService } from './tab-router.service';\n@Injectable({\n providedIn: 'root',\n})\nexport class SdTabDecoratorService {\n static tabRouterService = new BehaviorSubject<SdTabRouterService | undefined>(undefined);\n constructor(tabRouterService: SdTabRouterService) {\n SdTabDecoratorService.tabRouterService.next(tabRouterService);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SdTab, SdTabInfo } from '../models/tab-router.model';\nimport { SdTabRouterService } from '../services/tab-router.service';\n@Pipe({\n name: 'sdTabInfo',\n standalone: true,\n})\nexport class SdTabInfoPipe implements PipeTransform {\n constructor(private tabRouterService: SdTabRouterService) {}\n transform(tabInfo: SdTabInfo | undefined | null, tab: SdTab): SdTabInfo {\n if (tabInfo) {\n return tabInfo;\n }\n const builders = this.tabRouterService.builders.getValue();\n const builder = builders.find(e => e.component === tab.component);\n if (builder) {\n const { url, params, queryParams, data } = tab;\n return {\n name: typeof builder.name === 'function' ? builder.name({ url, params, queryParams, data }) : builder.name,\n icon: typeof builder.icon === 'function' ? builder.icon({ url, params, queryParams }) : builder.icon,\n tooltip: typeof builder.tooltip === 'function' ? builder.tooltip({ url, params, queryParams }) : builder.tooltip,\n color: typeof builder.color === 'function' ? builder.color({ url, params, queryParams }) : builder.color,\n };\n }\n return {\n name: tab.url,\n icon: undefined,\n };\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { debounceTime, startWith } from 'rxjs/operators';\n\nimport { MatIconModule } from '@angular/material/icon';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { SdTab, SdTabInfo } from '../../models';\nimport { SdTabRouterService } from '../../services/tab-router.service';\nimport { Router } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { SdTabInfoPipe } from '../../pipes/tab-info.pipe';\n\n@Component({\n selector: 'sd-tab-router-item',\n templateUrl: './tab-router-item.component.html',\n styleUrls: ['./tab-router-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, MatIconModule, SdBadge, SdTabInfoPipe],\n})\nexport class SdTabRouterItemComponent implements OnInit, OnDestroy {\n @Input({ required: true }) tab!: SdTab;\n\n #subsctiption: Subscription = new Subscription();\n tabInfo?: SdTabInfo;\n constructor(\n private cdRef: ChangeDetectorRef,\n private tabRouterService: SdTabRouterService,\n private router: Router\n ) {}\n\n ngOnInit(): void {\n this.#subsctiption.add(\n this.tabRouterService.events.pipe(debounceTime(100)).subscribe(() => {\n this.cdRef.markForCheck();\n })\n );\n\n this.#subsctiption.add(\n this.tab.tabInfoChanges.pipe(startWith(null)).subscribe(tabInfo => {\n if (tabInfo) {\n this.tabInfo = tabInfo;\n this.cdRef.markForCheck();\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n this.#subsctiption.unsubscribe();\n }\n\n onTabClick = (event: Event) => {\n event.preventDefault();\n this.router.navigate([this.tab.url], {\n queryParams: this.tab.queryParams,\n state: { switchTab: true },\n });\n };\n\n close = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.#closeTab();\n };\n\n onMousedown = (event: MouseEvent) => {\n if (event.button === 1) {\n event.preventDefault();\n }\n };\n\n onMouseup = (event: MouseEvent) => {\n if (event.button === 1) {\n event.preventDefault();\n event.stopPropagation();\n this.#closeTab();\n }\n };\n\n #closeTab = async () => {\n if (this.tab?.beforeClose) {\n //\n if (this.tab?.beforeClose()) {\n const result = this.tab?.beforeClose();\n if (typeof result === 'boolean') {\n if (result) {\n this.tabRouterService.close(this.tab);\n }\n } else {\n if (await result) {\n this.tabRouterService.close(this.tab);\n }\n }\n }\n } else {\n this.tabRouterService.close(this.tab);\n }\n };\n}\n","<a\n [href]=\"[tab.url]\"\n class=\"tab-router__item d-flex align-items-center gap-8\"\n [class.tab-router__item--active]=\"tab.isActive\"\n (click)=\"onTabClick($event)\"\n (mousedown)=\"onMousedown($event)\"\n (mouseup)=\"onMouseup($event)\">\n @let info = tabInfo | sdTabInfo: tab;\n @if (info) {\n <sd-badge\n style=\"overflow: hidden;white-space: nowrap;\"\n [icon]=\"info.icon\"\n [title]=\"info.icon\"\n [tooltip]=\"info.tooltip || info.name\"\n [title]=\"info.name\"\n [color]=\"info.color\"\n (click)=\"onTabClick($event)\"></sd-badge>\n <button\n aria-hidden=\"true\"\n class=\"tab-router__close d-flex align-items-center justify-content-center ml-auto p-0\"\n (click)=\"close($event)\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon aria-hidden=\"true\" fontIcon=\"close\"></mat-icon>\n </button>\n }\n</a>\n","import { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostListener,\n inject,\n input,\n viewChild,\n} from '@angular/core';\n\nimport { SdTab } from '../../models/tab-router.model';\nimport { SdTabRouterItemComponent } from '../tab-router-item/tab-router-item.component';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'sd-tab-router-nav',\n templateUrl: './tab-router-nav.component.html',\n styleUrls: ['./tab-router-nav.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, DragDropModule, SdTabRouterItemComponent],\n})\nexport class SdTabRouterNavComponent {\n tabRouterNav = viewChild<ElementRef>('tabRouterNav');\n\n tabs = input<SdTab[]>([]);\n mode: 'default' | 'compact' = 'default';\n cdRef = inject(ChangeDetectorRef);\n elementRef = inject<ElementRef<any>>(ElementRef);\n\n @HostListener('window:resize')\n onResize(): void {\n this.checkUI();\n }\n\n checkUI = () => {\n const width = this.tabRouterNav()?.nativeElement.clientWidth ?? 0;\n const tabs = this.tabs();\n if (tabs.length === 0) {\n this.mode = 'default';\n this.cdRef.markForCheck();\n return;\n }\n\n const nameWidth = (width - tabs.length * 68) / tabs.length;\n if (nameWidth <= 20) {\n this.mode = 'compact';\n } else {\n this.mode = 'default';\n }\n this.cdRef.markForCheck();\n };\n\n onDrop = (event: CdkDragDrop<SdTab[]>) => {\n moveItemInArray(this.tabs(), event.previousIndex, event.currentIndex);\n };\n}\n","<div\n #tabRouterNav\n cdkDropList\n cdkDropListLockAxis=\"x\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onDrop($event)\"\n class=\"tab-router__nav tab-router__nav--{{ mode }} d-flex align-items-center flex-nowrap\"\n [class.d-none]=\"tabs().length > 1\">\n @for (tab of tabs(); track tab.key) {\n <sd-tab-router-item [tab]=\"tab\" cdkDrag [cdkDragBoundary]=\"elementRef.nativeElement\"></sd-tab-router-item>\n }\n</div>\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n afterNextRender,\n booleanAttribute,\n Component,\n Injector,\n OnDestroy,\n Type,\n inject,\n input,\n signal,\n viewChild,\n createNgModule,\n NgModuleFactory,\n} from '@angular/core';\nimport {\n ActivatedRoute,\n ActivatedRouteSnapshot,\n NavigationEnd,\n Router,\n RouterOutlet,\n RoutesRecognized,\n} from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { from, Subject, Subscription, isObservable, lastValueFrom } from 'rxjs';\nimport { concatMap, filter } from 'rxjs/operators';\n\nimport { SdNotifyService } from '@sdcorejs/angular/services/notify';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdTabActivated, SdTabDeactivated } from '../../events/tab-router.event';\nimport { SdTabAction } from '../../actions/tab-router.action';\nimport { SdTab } from '../../models';\nimport { SdTabDecoratorService } from '../../services/tab-decorator.service';\nimport { SdTabRouterService } from '../../services/tab-router.service';\nimport { SdTabRouterNavComponent } from '../tab-router-nav/tab-router-nav.component';\n\n// eslint-disable-next-line @angular-eslint/no-unused-standalone-imports\n@Component({\n selector: 'sd-tab-router-outlet',\n templateUrl: './tab-router-outlet.component.html',\n styleUrls: ['./tab-router-outlet.component.scss'],\n standalone: true,\n imports: [CommonModule, MatIconModule, MatTooltipModule, RouterOutlet, SdTabRouterNavComponent],\n})\nexport class SdTabRouterOutletComponent implements OnDestroy {\n disabled = input(false, { transform: booleanAttribute });\n\n tabRouterNav = viewChild<SdTabRouterNavComponent>('tabRouterNav');\n\n tabs = signal<SdTab[]>([]);\n\n #router = inject(Router);\n #injector = inject(Injector);\n #tabRouterService = inject(SdTabRouterService);\n #sdNotifyService = inject(SdNotifyService);\n readonly #i18n = inject(I18nService);\n // Inject để đảm bảo SdTabDecoratorService được khởi tạo (nó register BehaviorSubject\n // tĩnh để @SdTab decorator có thể truy cập SdTabRouterService). Không dùng trực tiếp ở đây.\n #tabDecoratorService = inject(SdTabDecoratorService);\n\n #rootRoute?: ActivatedRoute;\n #subscription = new Subscription();\n\n // State của navigation hiện tại (replaceTab, switchTab, ...) được capture ở RoutesRecognized\n // và dùng lại ở NavigationEnd. Lý do: tại NavigationEnd, getCurrentNavigation() đã trả về null,\n // còn lastSuccessfulNavigation và window.history.state không đáng tin cậy với mọi case.\n #pendingNavigationState: Record<string, any> = {};\n // Serialize mọi #activeRoute (router events + initial sync) để tránh race tạo duplicate tab.\n #activationQueue: Promise<void> = Promise.resolve();\n\n constructor() {\n this.#subscription.add(\n this.#router.events\n .pipe(\n // KHÔNG unwrap event.routerEvent (vd Scroll wrap NavigationEnd):\n // Angular emit NavigationEnd RAW trước, RouterScroller emit Scroll(NavigationEnd) sau.\n // Nếu unwrap thêm Scroll → handler fire 2 lần cho 1 nav → race condition tạo duplicate tabs.\n // Hybrid: cần CẢ HAI event vì mỗi event chứa data khác nhau ở thời điểm khác nhau.\n // - RoutesRecognized: navigation đang in-flight → getCurrentNavigation().extras.state đọc được\n // - NavigationEnd: navigation hoàn tất → routerState.root đã update với route mới (cần cho lazy routes)\n filter((event): event is RoutesRecognized | NavigationEnd =>\n event instanceof RoutesRecognized || event instanceof NavigationEnd),\n // Serialize: #handleEvent async (await getBestInjector). 2 nav liên tiếp\n // không await xen kẽ → tránh race đọc this.tabs() = [] khi tab đầu chưa kịp set.\n concatMap(event => from(this.#handleEvent(event)))\n )\n .subscribe()\n );\n\n this.#subscription.add(\n this.#tabRouterService.actions.subscribe((event: SdTabAction | undefined) => {\n if (this.disabled()) return;\n\n if (event?.type === 'close') {\n this.#closeTab(event.tab);\n }\n })\n );\n\n // Initial navigation có thể hoàn tất trước khi outlet subscribe router.events\n // (blocking init hoặc outlet mount muộn). Catch-up sau first render.\n afterNextRender(() => {\n void this.#syncCurrentRoute();\n });\n }\n\n ngOnDestroy(): void {\n this.#subscription.unsubscribe();\n }\n\n #scheduleActivation = (task: () => Promise<void>): Promise<void> => {\n const run = this.#activationQueue.then(task);\n this.#activationQueue = run.catch(() => undefined);\n return run;\n };\n\n #handleEvent = async (event: RoutesRecognized | NavigationEnd): Promise<void> => {\n if (this.disabled()) {\n this.#pendingNavigationState = {};\n return;\n }\n if (event instanceof RoutesRecognized) {\n // Capture state ngay lúc nav còn in-flight. Đây là điểm duy nhất chắc chắn\n // getCurrentNavigation() trả về Navigation object với extras.state nguyên vẹn.\n this.#pendingNavigationState = this.#router.getCurrentNavigation()?.extras?.state ?? {};\n return;\n }\n // NavigationEnd: dùng routerState.snapshot.root (canonical state tại NavigationEnd),\n // KHÔNG dùng injected ActivatedRoute.snapshot — có thể chưa sync trên initial load.\n const navigationState = this.#pendingNavigationState;\n this.#pendingNavigationState = {};\n await this.#scheduleActivation(async () => {\n const route = this.#getActivatedRouteSnapshot(this.#router.routerState.snapshot.root);\n this.#rootRoute = this.#router.routerState.root;\n await this.#activeRoute(event.urlAfterRedirects || event.url, route, navigationState);\n });\n };\n\n // Bù initial navigation nếu NavigationEnd đã fire trước khi outlet subscribe.\n #syncCurrentRoute = (): Promise<void> => {\n if (this.disabled() || !this.#router.navigated) {\n return Promise.resolve();\n }\n\n const route = this.#getActivatedRouteSnapshot(this.#router.routerState.snapshot.root);\n if (!route?.component) {\n return Promise.resolve();\n }\n\n const [urlPath] = this.#router.url.split('?');\n const key = Utilities.hash({\n url: urlPath,\n queryParams: { ...(route.queryParams || {}) },\n });\n\n if (this.tabs().some(tab => tab.key === key)) {\n return Promise.resolve();\n }\n\n return this.#scheduleActivation(async () => {\n if (this.tabs().some(tab => tab.key === key)) {\n return;\n }\n this.#rootRoute = this.#router.routerState.root;\n await this.#activeRoute(this.#router.url, route, {});\n });\n };\n\n tabTrackBy = (index: number, tab: SdTab) => tab.key;\n\n #closeTab = (tab: SdTab) => {\n if (this.disabled()) return;\n\n const currentTabs = this.tabs();\n const { isActive, key: activeKey } = tab;\n\n if (isActive) {\n const activeIndex = currentTabs.findIndex(({ key }) => key === activeKey);\n const nextTab = currentTabs[activeIndex + 1] || currentTabs[activeIndex - 1];\n\n this.tabs.set(currentTabs.filter(({ key }) => key !== activeKey));\n\n if (nextTab) {\n this.#router.navigate([nextTab.url], {\n queryParams: { ...(nextTab.queryParams || {}) },\n state: { switchTab: true },\n });\n } else {\n this.#router.navigateByUrl('/', { state: { switchTab: true } });\n }\n } else {\n this.tabs.set(currentTabs.filter(({ key }) => key !== tab.key));\n this.tabRouterNav()?.checkUI();\n }\n };\n\n #activeRoute = async (\n fullUrl: string,\n route: ActivatedRouteSnapshot | null,\n state: Record<string, any> = {}\n ) => {\n if (this.disabled()) return;\n if (!route?.component) return;\n\n const component = route.component as Type<any>;\n const queryParams = { ...(route.queryParams || {}) };\n const params = { ...(route.params || {}) };\n const data = { ...(route.data || {}) };\n const [url] = fullUrl.split('?');\n // Tab identity = hash(url + queryParams). Cùng key = cùng tab, không tạo lại.\n const key = Utilities.hash({ url, queryParams });\n\n let existedIndex = -1;\n let activatedIndex = -1;\n\n const currentTabs = this.tabs();\n\n // QUAN TRỌNG: scan READ-ONLY, KHÔNG mutate tab.isActive trong loop này.\n //\n // Lý do: NavigationEnd có thể fire nhiều lần cho 1 user-action (do nested outlets,\n // redirect, hoặc Angular internal). Vì #activeRoute là async (await getBestInjector),\n // 2 invocations có thể chạy concurrent và interleave với nhau.\n //\n // Nếu mutate tab.isActive = false ở đây, call thứ 2 sẽ thấy isActive đã bị call 1\n // set false rồi → không tìm thấy active tab → activatedIndex stay -1 → splice bỏ qua\n // → tab cũ không bị remove → xuất hiện duplicate tabs.\n //\n // Cách fix: chỉ ĐỌC isActive, sau đó dùng .map() ở dưới để tạo tab objects mới qua spread.\n for (let i = 0; i < currentTabs.length; i++) {\n const tab = currentTabs[i];\n if (tab.key === key) {\n existedIndex = i;\n } else if (tab.isActive) {\n activatedIndex = i;\n this.#tabRouterService.pushEvent(tab, SdTabDeactivated);\n }\n }\n\n const replaceTab = state['replaceTab'];\n\n // Resolve injector phù hợp với route. Cần xử lý 3 trường hợp:\n // - Standalone route (Angular đã set _injector trên routeConfig sau khi activate)\n // - NgModule lazy load (cần createNgModule từ class)\n // - Fallback: root injector\n const getBestInjector = async (snapshot: ActivatedRouteSnapshot): Promise<Injector> => {\n // Standalone route: Angular tự lưu environment injector trên routeConfig._injector\n const routeInjector = (snapshot as any)._resolvedGui || (snapshot as any).routeConfig?._injector;\n if (routeInjector) return routeInjector;\n\n // NgModule lazy: phải gọi lại loadChildren() để lấy module class rồi createNgModule\n const loadChildren = snapshot.parent?.routeConfig?.loadChildren;\n if (typeof loadChildren === 'function') {\n let loaded: any = await loadChildren();\n\n if (isObservable(loaded)) {\n loaded = await lastValueFrom(loaded);\n }\n\n // ES module có thể export default\n if (loaded && typeof loaded === 'object' && 'default' in loaded) {\n loaded = loaded.default;\n }\n\n // Angular cũ: NgModuleFactory\n if (loaded instanceof NgModuleFactory) {\n return loaded.create(this.#injector).injector;\n }\n\n // Angular mới: NgModule class. Bọc try/catch vì createNgModule throw nếu không phải NgModule.\n if (typeof loaded === 'function' && !Array.isArray(loaded)) {\n try {\n return createNgModule(loaded, this.#injector).injector;\n } catch {\n return this.#injector;\n }\n }\n }\n return this.#injector;\n };\n\n const finalInjector = await getBestInjector(route);\n // Refresh root sau await: lazy route tree có thể hoàn tất trong lúc resolve injector.\n this.#rootRoute = this.#router.routerState.root;\n const activatedRoute = this.#findActivatedRouteForSnapshot(this.#rootRoute, route);\n\n const newTab: SdTab = {\n key,\n component,\n injector: new SdOutletInjector(activatedRoute, finalInjector),\n isActive: true,\n url,\n params,\n queryParams,\n data,\n tabInfoChanges: new Subject(),\n };\n\n // Tạo updatedTabs qua spread thay vì mutate (xem lý do ở for loop phía trên).\n // Với tab có isActive không đổi: giữ nguyên reference (tránh trigger ngComponentOutlet\n // re-evaluate không cần thiết). Với tab cần đổi isActive: tạo object mới qua spread,\n // các nested fields (component, injector) vẫn giữ same reference nên component không bị recreate.\n let updatedTabs = currentTabs.map(tab => {\n if (tab.key === key) return tab.isActive ? tab : { ...tab, isActive: true };\n return tab.isActive ? { ...tab, isActive: false } : tab;\n });\n\n // replaceTab: thay vì mở tab mới song song, xoá tab đang active rồi mở tab mới ở cuối.\n // Use case: từ tab \"chi tiết\" bấm \"chỉnh sửa\" với replaceTab → tab chi tiết bị xoá,\n // tab chỉnh sửa thay thế (giữ số tab không tăng).\n if (replaceTab && activatedIndex >= 0) {\n updatedTabs = updatedTabs.filter((_, i) => i !== activatedIndex);\n }\n\n if (existedIndex >= 0) {\n // Tab đã tồn tại (cùng url + queryParams) → CHỈ activate, KHÔNG thay tab object.\n // Lý do: thay tab object = đổi reference của tab.injector → ngComponentOutlet recreate\n // component → tab bị \"reload\" mỗi khi click lại hoặc navigate cùng URL.\n //\n // splice phía trên có thể đã shift index nếu activatedIndex < existedIndex.\n const idx = replaceTab && activatedIndex >= 0 && activatedIndex < existedIndex\n ? existedIndex - 1\n : existedIndex;\n this.#tabRouterService.setCurrentTab(updatedTabs[idx]);\n this.#tabRouterService.pushEvent(updatedTabs[idx], SdTabActivated);\n this.tabs.set(updatedTabs);\n } else {\n // Tab chưa tồn tại → thêm mới ở cuối.\n this.#tabRouterService.setCurrentTab(newTab);\n this.tabs.set([...updatedTabs, newTab]);\n\n if (this.tabs().length > 30) {\n this.#sdNotifyService.warning(this.#i18n.t('core.component.tab-router.too-many-tabs'));\n }\n }\n\n this.tabRouterNav()?.checkUI();\n };\n\n // Lần xuống deepest firstChild để lấy snapshot của route lá (route thực sự render component).\n #getActivatedRouteSnapshot = (snapshot: ActivatedRouteSnapshot): ActivatedRouteSnapshot | null => {\n let node = snapshot;\n while (node.firstChild) node = node.firstChild;\n return node;\n };\n\n // DFS match leaf snapshot → ActivatedRoute instance (ổn định hơn so với so sánh component class).\n #findActivatedRouteForSnapshot = (\n activatedRoute: ActivatedRoute,\n targetSnapshot: ActivatedRouteSnapshot,\n ): ActivatedRoute | null => {\n if (activatedRoute.snapshot === targetSnapshot) {\n return activatedRoute;\n }\n for (const child of activatedRoute.children) {\n const result = this.#findActivatedRouteForSnapshot(child, targetSnapshot);\n if (result) {\n return result;\n }\n }\n return null;\n };\n}\n\n// Custom Injector cho từng tab: override ActivatedRoute thành route của TAB ĐÓ\n// (không phải route hiện tại của router). Nếu không override, mọi tab sẽ inject ActivatedRoute\n// của route đang active → component cũ trong tab inactive nhận data sai khi user navigate.\nclass SdOutletInjector implements Injector {\n constructor(\n private route: ActivatedRoute | null,\n private parentInjector: Injector\n ) {}\n\n get(token: any, notFoundValue?: any): any {\n if (token === ActivatedRoute) {\n return this.route || notFoundValue;\n }\n return this.parentInjector.get(token, notFoundValue);\n }\n}\n","@if (disabled()) {\n <div class=\"tab-router__disabled-outlet\">\n <router-outlet></router-outlet>\n </div>\n} @else {\n <sd-tab-router-nav [tabs]=\"tabs()\" #tabRouterNav></sd-tab-router-nav>\n <div class=\"tab-router__list\">\n @for (tab of tabs(); track tab.key) {\n <div class=\"tab-router__pane\" [class.active]=\"tab.isActive\" [id]=\"tab.key\">\n <div class=\"tab-router__content\">\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\n </div>\n </div>\n } @empty {\n <div class=\"tab-router__empty\">\n </div>\n }\n </div>\n}","import { Type } from '@angular/core';\nimport { Color } from '@sdcorejs/utils/models';\nimport { filter, take } from 'rxjs/operators';\nimport { SdTabDecoratorService } from '../services/tab-decorator.service';\n\nexport interface SdTabComponentArgs {\n url?: string;\n params?: any;\n queryParams?: any;\n data?: Record<string, any>;\n}\n\nexport declare interface SdTabComponentBuilder {\n component: Type<any>;\n name: string | ((args: SdTabComponentArgs) => string);\n icon?: string | ((args: SdTabComponentArgs) => string);\n tooltip?: string | ((args: SdTabComponentArgs) => string);\n color?: Color | ((args: SdTabComponentArgs) => Color);\n}\n\nexport function SdTabComponent<T>(builder: SdTabComponentBuilder) {\n return (constructor: T) => {\n SdTabDecoratorService.tabRouterService\n .pipe(\n filter(service => service !== undefined && service !== null),\n take(1)\n )\n .subscribe(service => {\n service.addBuilder(builder);\n });\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.SdTabRouterService","i1"],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-components-tab-router.mjs","sources":["../../../projects/sdcorejs-angular/components/tab-router/src/events/tab-router.event.ts","../../../projects/sdcorejs-angular/components/tab-router/src/models/tab-router.model.ts","../../../projects/sdcorejs-angular/components/tab-router/src/services/tab-router.service.ts","../../../projects/sdcorejs-angular/components/tab-router/src/services/tab-decorator.service.ts","../../../projects/sdcorejs-angular/components/tab-router/src/pipes/tab-info.pipe.ts","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.ts","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.html","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.ts","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.html","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.ts","../../../projects/sdcorejs-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.html","../../../projects/sdcorejs-angular/components/tab-router/src/decorators/tab.decorator.ts","../../../projects/sdcorejs-angular/components/tab-router/sdcorejs-angular-components-tab-router.ts"],"sourcesContent":["import { SdTab } from '../models/tab-router.model';\n\nexport class SdTabBase {\n #tab: SdTab | undefined;\n\n constructor(tab: SdTab | undefined) {\n this.#tab = tab;\n }\n\n get tab(): SdTab | undefined {\n return this.#tab;\n }\n}\n\nexport class SdTabActivated extends SdTabBase {}\n\nexport class SdTabDeactivated extends SdTabBase {}\n\nexport declare type SdTabEvent = SdTabActivated | SdTabDeactivated;\n","import { InjectionToken, Type } from '@angular/core';\nimport { Color } from '@sdcorejs/utils/models';\nimport { Subject } from 'rxjs';\n\nexport interface SdTabInfo {\n name: string;\n icon?: string;\n tooltip?: string;\n color?: Color;\n}\n\nexport interface SdTab {\n component: Type<any>;\n injector?: any;\n key: string;\n isActive: boolean;\n url: string;\n params?: Record<string, string | number>;\n queryParams?: Record<string, string | number>;\n data?: Record<string, any>;\n tabInfoChanges: Subject<SdTabInfo>;\n beforeClose?: () => boolean | Promise<boolean>; // Return true thì mới được close\n}\n\nexport const SD_TAB = new InjectionToken<SdTab>('SD_TAB');\n","import { Injectable, Type } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SdTabAction } from '../actions/tab-router.action';\nimport { SdTabComponentBuilder } from '../decorators/tab.decorator';\nimport { SdTabBase, SdTabEvent } from '../events/tab-router.event';\nimport { SdTab } from '../models/tab-router.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdTabRouterService {\n events = new BehaviorSubject<SdTabEvent>(new SdTabBase(undefined));\n actions = new BehaviorSubject<SdTabAction | undefined>(undefined);\n builders = new BehaviorSubject<SdTabComponentBuilder[]>([]);\n currentTabChanges = new BehaviorSubject<SdTab | undefined>(undefined);\n newTabs = new BehaviorSubject<SdTab | undefined>(undefined);\n updateTabs = new BehaviorSubject<SdTab | undefined>(undefined);\n #currentTab: SdTab | undefined = undefined;\n #componentBuilders: SdTabComponentBuilder[] = [];\n\n addBuilder = (builder: SdTabComponentBuilder) => {\n if (!this.#componentBuilders.some(e => e.component === builder.component)) {\n this.#componentBuilders.push(builder);\n this.builders.next(this.#componentBuilders);\n }\n };\n\n get currentTab() {\n return this.#currentTab;\n }\n\n get currentKey() {\n return this.#currentTab?.key || null;\n }\n\n // select = (tabOrKey: string | SdTab): void => {\n // const tab = this.#tabs.find(e => {\n // if (typeof (tabOrKey) === 'string') {\n // return e.key === tabOrKey;\n // }\n // return e.key === tabOrKey?.key;\n // });\n // if (tab) {\n // this.#currentTab = tab;\n // }\n // }\n\n // add = (tab: SdTab): void => {\n // if (!tab.key) {\n // this.notifyService.notify.warning('Tab key is required');\n // }\n // if (!tab.component) {\n // this.notifyService.notify.warning('Tab component is required');\n // }\n // const existedTab = this.#tabs.find(e => e.key === tab.key);\n // if (!existedTab) {\n // this.#tabs.push(tab);\n // this.select(tab);\n // } else {\n // this.select(existedTab);\n // }\n // }\n\n // remove = (tabOrKey: string | SdTab): void => {\n // this.#tabs = this.#tabs.filter(e => {\n // if (typeof (tabOrKey) === 'string') {\n // return e.key !== tabOrKey;\n // }\n // return e.key !== tabOrKey?.key;\n // });\n // }\n\n setCurrentTab = (tab: SdTab): void => {\n this.#currentTab = tab;\n this.currentTabChanges.next(tab);\n };\n\n pushEvent = (tab: SdTab, Event: Type<SdTabEvent>) => {\n this.events.next(new Event(tab));\n };\n\n setOptions = () => {};\n\n close = (tab?: SdTab) => {\n tab = tab || this.#currentTab;\n if (tab) {\n this.actions.next({\n type: 'close',\n tab,\n });\n }\n };\n\n // Gọi hàm này để thực hiện update tab\n updateTab = (tab: SdTab) => {};\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SdTabRouterService } from './tab-router.service';\n@Injectable({\n providedIn: 'root',\n})\nexport class SdTabDecoratorService {\n static tabRouterService = new BehaviorSubject<SdTabRouterService | undefined>(undefined);\n constructor(tabRouterService: SdTabRouterService) {\n SdTabDecoratorService.tabRouterService.next(tabRouterService);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SdTab, SdTabInfo } from '../models/tab-router.model';\nimport { SdTabRouterService } from '../services/tab-router.service';\n@Pipe({\n name: 'sdTabInfo',\n standalone: true,\n})\nexport class SdTabInfoPipe implements PipeTransform {\n constructor(private tabRouterService: SdTabRouterService) {}\n transform(tabInfo: SdTabInfo | undefined | null, tab: SdTab): SdTabInfo {\n if (tabInfo) {\n return tabInfo;\n }\n const builders = this.tabRouterService.builders.getValue();\n const builder = builders.find(e => e.component === tab.component);\n if (builder) {\n const { url, params, queryParams, data } = tab;\n return {\n name: typeof builder.name === 'function' ? builder.name({ url, params, queryParams, data }) : builder.name,\n icon: typeof builder.icon === 'function' ? builder.icon({ url, params, queryParams }) : builder.icon,\n tooltip: typeof builder.tooltip === 'function' ? builder.tooltip({ url, params, queryParams }) : builder.tooltip,\n color: typeof builder.color === 'function' ? builder.color({ url, params, queryParams }) : builder.color,\n };\n }\n return {\n name: tab.url,\n icon: undefined,\n };\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { debounceTime, startWith } from 'rxjs/operators';\n\nimport { MatIconModule } from '@angular/material/icon';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { SdTab, SdTabInfo } from '../../models';\nimport { SdTabRouterService } from '../../services/tab-router.service';\nimport { Router } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { SdTabInfoPipe } from '../../pipes/tab-info.pipe';\n\n@Component({\n selector: 'sd-tab-router-item',\n templateUrl: './tab-router-item.component.html',\n styleUrl: './tab-router-item.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, MatIconModule, SdBadge, SdTabInfoPipe],\n})\nexport class SdTabRouterItemComponent implements OnInit, OnDestroy {\n @Input({ required: true }) tab!: SdTab;\n\n #subsctiption: Subscription = new Subscription();\n tabInfo?: SdTabInfo;\n constructor(\n private cdRef: ChangeDetectorRef,\n private tabRouterService: SdTabRouterService,\n private router: Router\n ) {}\n\n ngOnInit(): void {\n this.#subsctiption.add(\n this.tabRouterService.events.pipe(debounceTime(100)).subscribe(() => {\n this.cdRef.markForCheck();\n })\n );\n\n this.#subsctiption.add(\n this.tab.tabInfoChanges.pipe(startWith(null)).subscribe(tabInfo => {\n if (tabInfo) {\n this.tabInfo = tabInfo;\n this.cdRef.markForCheck();\n }\n })\n );\n }\n\n ngOnDestroy(): void {\n this.#subsctiption.unsubscribe();\n }\n\n onTabClick = (event: Event) => {\n event.preventDefault();\n this.router.navigate([this.tab.url], {\n queryParams: this.tab.queryParams,\n state: { switchTab: true },\n });\n };\n\n close = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n this.#closeTab();\n };\n\n onMousedown = (event: MouseEvent) => {\n if (event.button === 1) {\n event.preventDefault();\n }\n };\n\n onMouseup = (event: MouseEvent) => {\n if (event.button === 1) {\n event.preventDefault();\n event.stopPropagation();\n this.#closeTab();\n }\n };\n\n #closeTab = () => {\n this.tabRouterService.close(this.tab);\n };\n}\n","<a\n [href]=\"[tab.url]\"\n class=\"tab-router__item d-flex align-items-center gap-8\"\n [class.tab-router__item--active]=\"tab.isActive\"\n (click)=\"onTabClick($event)\"\n (mousedown)=\"onMousedown($event)\"\n (mouseup)=\"onMouseup($event)\">\n @let info = tabInfo | sdTabInfo: tab;\n @if (info) {\n <sd-badge\n style=\"overflow: hidden;white-space: nowrap;\"\n [icon]=\"info.icon\"\n [title]=\"info.icon\"\n [tooltip]=\"info.tooltip || info.name\"\n [title]=\"info.name\"\n [color]=\"info.color\"\n (click)=\"onTabClick($event)\"></sd-badge>\n <button\n aria-hidden=\"true\"\n class=\"tab-router__close d-flex align-items-center justify-content-center ml-auto p-0\"\n (click)=\"close($event)\"\n (mousedown)=\"$event.stopPropagation()\">\n <mat-icon aria-hidden=\"true\" fontIcon=\"close\"></mat-icon>\n </button>\n }\n</a>\n","import { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener, inject, input, viewChild } from '@angular/core';\n\nimport { SdTab } from '../../models/tab-router.model';\nimport { SdTabRouterItemComponent } from '../tab-router-item/tab-router-item.component';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'sd-tab-router-nav',\n templateUrl: './tab-router-nav.component.html',\n styleUrl: './tab-router-nav.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, DragDropModule, SdTabRouterItemComponent],\n})\nexport class SdTabRouterNavComponent {\n tabRouterNav = viewChild<ElementRef>('tabRouterNav');\n\n tabs = input<SdTab[]>([]);\n mode: 'default' | 'compact' = 'default';\n cdRef = inject(ChangeDetectorRef);\n elementRef = inject<ElementRef<any>>(ElementRef);\n\n @HostListener('window:resize')\n onResize(): void {\n this.checkUI();\n }\n\n checkUI = () => {\n const width = this.tabRouterNav()?.nativeElement.clientWidth ?? 0;\n const tabs = this.tabs();\n if (tabs.length === 0) {\n this.mode = 'default';\n this.cdRef.markForCheck();\n return;\n }\n\n const nameWidth = (width - tabs.length * 68) / tabs.length;\n if (nameWidth <= 20) {\n this.mode = 'compact';\n } else {\n this.mode = 'default';\n }\n this.cdRef.markForCheck();\n };\n\n onDrop = (event: CdkDragDrop<SdTab[]>) => {\n moveItemInArray(this.tabs(), event.previousIndex, event.currentIndex);\n };\n}\n","<div\n #tabRouterNav\n cdkDropList\n cdkDropListLockAxis=\"x\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onDrop($event)\"\n class=\"tab-router__nav tab-router__nav--{{ mode }} d-flex align-items-center flex-nowrap\"\n [class.d-none]=\"tabs().length > 1\">\n @for (tab of tabs(); track tab.key) {\n <sd-tab-router-item [tab]=\"tab\" cdkDrag [cdkDragBoundary]=\"elementRef.nativeElement\"></sd-tab-router-item>\n }\n</div>\n","import {\n afterNextRender,\n booleanAttribute,\n Component,\n Injector,\n OnDestroy,\n Type,\n inject,\n input,\n signal,\n viewChild,\n createNgModule,\n NgModuleFactory,\n} from '@angular/core';\nimport { ActivatedRoute, ActivatedRouteSnapshot, NavigationEnd, Router, RouterOutlet, RoutesRecognized } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { from, Subject, Subscription, isObservable, lastValueFrom } from 'rxjs';\nimport { concatMap, filter } from 'rxjs/operators';\n\nimport { SdNotifyService } from '@sdcorejs/angular/services/notify';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdTabActivated, SdTabDeactivated } from '../../events/tab-router.event';\nimport { SdTabAction } from '../../actions/tab-router.action';\nimport { SdTab, SD_TAB } from '../../models';\nimport { SdTabDecoratorService } from '../../services/tab-decorator.service';\nimport { SdTabRouterService } from '../../services/tab-router.service';\nimport { SdTabRouterNavComponent } from '../tab-router-nav/tab-router-nav.component';\n\n@Component({\n selector: 'sd-tab-router-outlet',\n templateUrl: './tab-router-outlet.component.html',\n styleUrl: './tab-router-outlet.component.scss',\n standalone: true,\n imports: [CommonModule, MatIconModule, MatTooltipModule, RouterOutlet, SdTabRouterNavComponent],\n})\nexport class SdTabRouterOutletComponent implements OnDestroy {\n disabled = input(false, { transform: booleanAttribute });\n\n tabRouterNav = viewChild<SdTabRouterNavComponent>('tabRouterNav');\n\n tabs = signal<SdTab[]>([]);\n\n #router = inject(Router);\n #injector = inject(Injector);\n #tabRouterService = inject(SdTabRouterService);\n #sdNotifyService = inject(SdNotifyService);\n readonly #i18n = inject(I18nService);\n // Inject để đảm bảo SdTabDecoratorService được khởi tạo (nó register BehaviorSubject\n // tĩnh để @SdTab decorator có thể truy cập SdTabRouterService). Không dùng trực tiếp ở đây.\n #tabDecoratorService = inject(SdTabDecoratorService);\n\n #rootRoute?: ActivatedRoute;\n #subscription = new Subscription();\n\n // State của navigation hiện tại (replaceTab, switchTab, ...) được capture ở RoutesRecognized\n // và dùng lại ở NavigationEnd. Lý do: tại NavigationEnd, getCurrentNavigation() đã trả về null,\n // còn lastSuccessfulNavigation và window.history.state không đáng tin cậy với mọi case.\n #pendingNavigationState: Record<string, any> = {};\n // Serialize mọi #activeRoute (router events + initial sync) để tránh race tạo duplicate tab.\n #activationQueue: Promise<void> = Promise.resolve();\n\n constructor() {\n this.#subscription.add(\n this.#router.events\n .pipe(\n // KHÔNG unwrap event.routerEvent (vd Scroll wrap NavigationEnd):\n // Angular emit NavigationEnd RAW trước, RouterScroller emit Scroll(NavigationEnd) sau.\n // Nếu unwrap thêm Scroll → handler fire 2 lần cho 1 nav → race condition tạo duplicate tabs.\n // Hybrid: cần CẢ HAI event vì mỗi event chứa data khác nhau ở thời điểm khác nhau.\n // - RoutesRecognized: navigation đang in-flight → getCurrentNavigation().extras.state đọc được\n // - NavigationEnd: navigation hoàn tất → routerState.root đã update với route mới (cần cho lazy routes)\n filter((event): event is RoutesRecognized | NavigationEnd => event instanceof RoutesRecognized || event instanceof NavigationEnd),\n // Serialize: #handleEvent async (await getBestInjector). 2 nav liên tiếp\n // không await xen kẽ → tránh race đọc this.tabs() = [] khi tab đầu chưa kịp set.\n concatMap(event => from(this.#handleEvent(event)))\n )\n .subscribe()\n );\n\n this.#subscription.add(\n this.#tabRouterService.actions.subscribe((event: SdTabAction | undefined) => {\n if (this.disabled()) return;\n\n if (event?.type === 'close') {\n this.#closeTab(event.tab);\n }\n })\n );\n\n // Initial navigation có thể hoàn tất trước khi outlet subscribe router.events\n // (blocking init hoặc outlet mount muộn). Catch-up sau first render.\n afterNextRender(() => {\n void this.#syncCurrentRoute();\n });\n }\n\n ngOnDestroy(): void {\n this.#subscription.unsubscribe();\n }\n\n #scheduleActivation = (task: () => Promise<void>): Promise<void> => {\n const run = this.#activationQueue.then(task);\n this.#activationQueue = run.catch(() => undefined);\n return run;\n };\n\n #handleEvent = async (event: RoutesRecognized | NavigationEnd): Promise<void> => {\n if (this.disabled()) {\n this.#pendingNavigationState = {};\n return;\n }\n if (event instanceof RoutesRecognized) {\n // Capture state ngay lúc nav còn in-flight. Đây là điểm duy nhất chắc chắn\n // getCurrentNavigation() trả về Navigation object với extras.state nguyên vẹn.\n this.#pendingNavigationState = this.#router.getCurrentNavigation()?.extras?.state ?? {};\n return;\n }\n // NavigationEnd: dùng routerState.snapshot.root (canonical state tại NavigationEnd),\n // KHÔNG dùng injected ActivatedRoute.snapshot — có thể chưa sync trên initial load.\n const navigationState = this.#pendingNavigationState;\n this.#pendingNavigationState = {};\n await this.#scheduleActivation(async () => {\n const route = this.#getActivatedRouteSnapshot(this.#router.routerState.snapshot.root);\n this.#rootRoute = this.#router.routerState.root;\n await this.#activeRoute(event.urlAfterRedirects || event.url, route, navigationState);\n });\n };\n\n // Bù initial navigation nếu NavigationEnd đã fire trước khi outlet subscribe.\n #syncCurrentRoute = (): Promise<void> => {\n if (this.disabled() || !this.#router.navigated) {\n return Promise.resolve();\n }\n\n const route = this.#getActivatedRouteSnapshot(this.#router.routerState.snapshot.root);\n if (!route?.component) {\n return Promise.resolve();\n }\n\n const [urlPath] = this.#router.url.split('?');\n const key = Utilities.hash({\n url: urlPath,\n queryParams: { ...(route.queryParams || {}) },\n });\n\n if (this.tabs().some(tab => tab.key === key)) {\n return Promise.resolve();\n }\n\n return this.#scheduleActivation(async () => {\n if (this.tabs().some(tab => tab.key === key)) {\n return;\n }\n this.#rootRoute = this.#router.routerState.root;\n await this.#activeRoute(this.#router.url, route, {});\n });\n };\n\n tabTrackBy = (index: number, tab: SdTab) => tab.key;\n\n #closeTab = async (tab: SdTab): Promise<void> => {\n if (this.disabled()) return;\n\n if (tab.beforeClose) {\n let canClose: boolean;\n try {\n const result = tab.beforeClose();\n canClose = typeof result === 'boolean' ? result : await result;\n } catch {\n canClose = true;\n }\n if (!canClose) return;\n }\n\n const currentTabs = this.tabs();\n const { isActive, key: activeKey } = tab;\n\n if (isActive) {\n const activeIndex = currentTabs.findIndex(({ key }) => key === activeKey);\n const nextTab = currentTabs[activeIndex + 1] || currentTabs[activeIndex - 1];\n\n this.tabs.set(currentTabs.filter(({ key }) => key !== activeKey));\n\n if (nextTab) {\n this.#router.navigate([nextTab.url], {\n queryParams: { ...(nextTab.queryParams || {}) },\n state: { switchTab: true },\n });\n } else {\n this.#router.navigateByUrl('/', { state: { switchTab: true } });\n }\n } else {\n this.tabs.set(currentTabs.filter(({ key }) => key !== tab.key));\n this.tabRouterNav()?.checkUI();\n }\n };\n\n #activeRoute = async (fullUrl: string, route: ActivatedRouteSnapshot | null, state: Record<string, any> = {}) => {\n if (this.disabled()) return;\n if (!route?.component) return;\n\n const component = route.component as Type<any>;\n const queryParams = { ...(route.queryParams || {}) };\n const params = { ...(route.params || {}) };\n const data = { ...(route.data || {}) };\n const [url] = fullUrl.split('?');\n // Tab identity = hash(url + queryParams). Cùng key = cùng tab, không tạo lại.\n const key = Utilities.hash({ url, queryParams });\n\n let existedIndex = -1;\n let activatedIndex = -1;\n\n const currentTabs = this.tabs();\n\n // QUAN TRỌNG: scan READ-ONLY, KHÔNG mutate tab.isActive trong loop này.\n //\n // Lý do: NavigationEnd có thể fire nhiều lần cho 1 user-action (do nested outlets,\n // redirect, hoặc Angular internal). Vì #activeRoute là async (await getBestInjector),\n // 2 invocations có thể chạy concurrent và interleave với nhau.\n //\n // Nếu mutate tab.isActive = false ở đây, call thứ 2 sẽ thấy isActive đã bị call 1\n // set false rồi → không tìm thấy active tab → activatedIndex stay -1 → splice bỏ qua\n // → tab cũ không bị remove → xuất hiện duplicate tabs.\n //\n // Cách fix: chỉ ĐỌC isActive, sau đó dùng .map() ở dưới để tạo tab objects mới qua spread.\n for (let i = 0; i < currentTabs.length; i++) {\n const tab = currentTabs[i];\n if (tab.key === key) {\n existedIndex = i;\n } else if (tab.isActive) {\n activatedIndex = i;\n this.#tabRouterService.pushEvent(tab, SdTabDeactivated);\n }\n }\n\n const replaceTab = state['replaceTab'];\n\n // Resolve injector phù hợp với route. Cần xử lý 3 trường hợp:\n // - Standalone route (Angular đã set _injector trên routeConfig sau khi activate)\n // - NgModule lazy load (cần createNgModule từ class)\n // - Fallback: root injector\n const getBestInjector = async (snapshot: ActivatedRouteSnapshot): Promise<Injector> => {\n // Standalone route: Angular tự lưu environment injector trên routeConfig._injector\n const routeInjector = (snapshot as any)._resolvedGui || (snapshot as any).routeConfig?._injector;\n if (routeInjector) return routeInjector;\n\n // NgModule lazy: phải gọi lại loadChildren() để lấy module class rồi createNgModule\n const loadChildren = snapshot.parent?.routeConfig?.loadChildren;\n if (typeof loadChildren === 'function') {\n let loaded: any = await loadChildren();\n\n if (isObservable(loaded)) {\n loaded = await lastValueFrom(loaded);\n }\n\n // ES module có thể export default\n if (loaded && typeof loaded === 'object' && 'default' in loaded) {\n loaded = loaded.default;\n }\n\n // Angular cũ: NgModuleFactory\n if (loaded instanceof NgModuleFactory) {\n return loaded.create(this.#injector).injector;\n }\n\n // Angular mới: NgModule class. Bọc try/catch vì createNgModule throw nếu không phải NgModule.\n if (typeof loaded === 'function' && !Array.isArray(loaded)) {\n try {\n return createNgModule(loaded, this.#injector).injector;\n } catch {\n return this.#injector;\n }\n }\n }\n return this.#injector;\n };\n\n const finalInjector = await getBestInjector(route);\n // Refresh root sau await: lazy route tree có thể hoàn tất trong lúc resolve injector.\n this.#rootRoute = this.#router.routerState.root;\n const activatedRoute = this.#findActivatedRouteForSnapshot(this.#rootRoute, route);\n\n const sdInjector = new SdOutletInjector(activatedRoute, finalInjector);\n const newTab: SdTab = {\n key,\n component,\n injector: sdInjector,\n isActive: true,\n url,\n params,\n queryParams,\n data,\n tabInfoChanges: new Subject(),\n };\n sdInjector.setTab(newTab);\n\n // Tạo updatedTabs qua spread thay vì mutate (xem lý do ở for loop phía trên).\n // Với tab có isActive không đổi: giữ nguyên reference (tránh trigger ngComponentOutlet\n // re-evaluate không cần thiết). Với tab cần đổi isActive: tạo object mới qua spread,\n // các nested fields (component, injector) vẫn giữ same reference nên component không bị recreate.\n let updatedTabs = currentTabs.map(tab => {\n if (tab.key === key) return tab.isActive ? tab : { ...tab, isActive: true };\n return tab.isActive ? { ...tab, isActive: false } : tab;\n });\n\n // replaceTab: thay vì mở tab mới song song, xoá tab đang active rồi mở tab mới ở cuối.\n // Use case: từ tab \"chi tiết\" bấm \"chỉnh sửa\" với replaceTab → tab chi tiết bị xoá,\n // tab chỉnh sửa thay thế (giữ số tab không tăng).\n if (replaceTab && activatedIndex >= 0) {\n updatedTabs = updatedTabs.filter((_, i) => i !== activatedIndex);\n }\n\n if (existedIndex >= 0) {\n // Tab đã tồn tại (cùng url + queryParams) → CHỈ activate, KHÔNG thay tab object.\n // Lý do: thay tab object = đổi reference của tab.injector → ngComponentOutlet recreate\n // component → tab bị \"reload\" mỗi khi click lại hoặc navigate cùng URL.\n //\n // splice phía trên có thể đã shift index nếu activatedIndex < existedIndex.\n const idx = replaceTab && activatedIndex >= 0 && activatedIndex < existedIndex ? existedIndex - 1 : existedIndex;\n this.#tabRouterService.setCurrentTab(updatedTabs[idx]);\n this.#tabRouterService.pushEvent(updatedTabs[idx], SdTabActivated);\n this.tabs.set(updatedTabs);\n } else {\n // Tab chưa tồn tại → thêm mới ở cuối.\n this.#tabRouterService.setCurrentTab(newTab);\n this.tabs.set([...updatedTabs, newTab]);\n\n if (this.tabs().length > 30) {\n this.#sdNotifyService.warning(this.#i18n.t('core.component.tab-router.too-many-tabs'));\n }\n }\n\n this.tabRouterNav()?.checkUI();\n };\n\n // Lần xuống deepest firstChild để lấy snapshot của route lá (route thực sự render component).\n #getActivatedRouteSnapshot = (snapshot: ActivatedRouteSnapshot): ActivatedRouteSnapshot | null => {\n let node = snapshot;\n while (node.firstChild) node = node.firstChild;\n return node;\n };\n\n // DFS match leaf snapshot → ActivatedRoute instance (ổn định hơn so với so sánh component class).\n #findActivatedRouteForSnapshot = (activatedRoute: ActivatedRoute, targetSnapshot: ActivatedRouteSnapshot): ActivatedRoute | null => {\n if (activatedRoute.snapshot === targetSnapshot) {\n return activatedRoute;\n }\n for (const child of activatedRoute.children) {\n const result = this.#findActivatedRouteForSnapshot(child, targetSnapshot);\n if (result) {\n return result;\n }\n }\n return null;\n };\n}\n\n// Custom Injector cho từng tab: override ActivatedRoute thành route của TAB ĐÓ\n// (không phải route hiện tại của router). Nếu không override, mọi tab sẽ inject ActivatedRoute\n// của route đang active → component cũ trong tab inactive nhận data sai khi user navigate.\nclass SdOutletInjector implements Injector {\n #tab?: SdTab;\n\n constructor(\n private route: ActivatedRoute | null,\n private parentInjector: Injector\n ) {}\n\n setTab(tab: SdTab): void {\n this.#tab = tab;\n }\n\n get(token: any, notFoundValue?: any): any {\n if (token === ActivatedRoute) {\n return this.route || notFoundValue;\n }\n if (token === SD_TAB) {\n return this.#tab ?? notFoundValue;\n }\n return this.parentInjector.get(token, notFoundValue);\n }\n}\n","@if (disabled()) {\n <div class=\"tab-router__disabled-outlet\">\n <router-outlet></router-outlet>\n </div>\n} @else {\n <sd-tab-router-nav [tabs]=\"tabs()\" #tabRouterNav></sd-tab-router-nav>\n <div class=\"tab-router__list\">\n @for (tab of tabs(); track tab.key) {\n <div class=\"tab-router__pane\" [class.active]=\"tab.isActive\" [id]=\"tab.key\">\n <div class=\"tab-router__content\">\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\n </div>\n </div>\n } @empty {\n <div class=\"tab-router__empty\">\n </div>\n }\n </div>\n}","import { Type } from '@angular/core';\nimport { Color } from '@sdcorejs/utils/models';\nimport { filter, take } from 'rxjs/operators';\nimport { SdTabDecoratorService } from '../services/tab-decorator.service';\n\nexport interface SdTabComponentArgs {\n url?: string;\n params?: any;\n queryParams?: any;\n data?: Record<string, any>;\n}\n\nexport declare interface SdTabComponentBuilder {\n component: Type<any>;\n name: string | ((args: SdTabComponentArgs) => string);\n icon?: string | ((args: SdTabComponentArgs) => string);\n tooltip?: string | ((args: SdTabComponentArgs) => string);\n color?: Color | ((args: SdTabComponentArgs) => Color);\n}\n\nexport function SdTabComponent<T>(builder: SdTabComponentBuilder) {\n return (constructor: T) => {\n SdTabDecoratorService.tabRouterService\n .pipe(\n filter(service => service !== undefined && service !== null),\n take(1)\n )\n .subscribe(service => {\n service.addBuilder(builder);\n });\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.SdTabRouterService","i1"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-components-tab.mjs","sources":["../../../projects/sdcorejs-angular/components/tab/src/tab.component.ts","../../../projects/sdcorejs-angular/components/tab/src/tab-group.component.ts","../../../projects/sdcorejs-angular/components/tab/src/tab-group.component.html","../../../projects/sdcorejs-angular/components/tab/sdcorejs-angular-components-tab.ts"],"sourcesContent":["import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n TemplateRef,\n viewChild,\n} from '@angular/core';\n\n@Component({\n selector: 'sd-tab',\n standalone: true,\n template: `<ng-template #body><ng-content></ng-content></ng-template>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdTab {\n label = input.required<string>();\n icon = input<string | null | undefined>(undefined);\n badge = input<string | number | null | undefined>(undefined);\n disabled = input(false, { transform: booleanAttribute });\n closable = input(false, { transform: booleanAttribute });\n\n close = output<void>();\n\n // why: viewChild on `#body` template captures projected content so the parent\n // <sd-tab-group> can render it lazily via matTabContent + ngTemplateOutlet.\n // If we projected raw ng-content into <mat-tab> directly, mat-tab would render\n // eagerly and lose the lazy-load behavior.\n bodyTpl = viewChild.required<TemplateRef<unknown>>('body');\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChildren,\n effect,\n HostBinding,\n input,\n model,\n output,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabGroup, MatTabsModule } from '@angular/material/tabs';\nimport { Color } from '@sdcorejs/utils/models';\nimport { SdTab } from './tab.component';\n\nexport interface SdTabClosedEvent {\n index: number;\n tab: SdTab;\n}\n\n@Component({\n selector: 'sd-tab-group',\n standalone: true,\n imports: [MatTabsModule, MatIconModule, NgTemplateOutlet],\n templateUrl: './tab-group.component.html',\n styleUrls: ['./tab-group.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdTabGroup {\n tabs = contentChildren(SdTab);\n\n selectedIndex = model<number>(0);\n // why: visual style preset. 'line' = Material default (underline ink-bar);\n // 'pills' = rounded pill, active filled (good for nested tab groups + filter bars);\n // 'segmented' = single bordered container, iOS-style.\n variant = input<'line' | 'pills' | 'segmented'>('line');\n // why: drives the active/indicator color via Core CSS vars (--sd-<color>, --sd-<color>-light).\n // Same palette consumers use on <sd-badge>, <sd-button>, etc — keeps theming consistent.\n color = input<Color>('primary');\n headerPosition = input<'above' | 'below'>('above');\n alignTabs = input<'start' | 'center' | 'end'>('start');\n // why: mat-tab-group defaults stretchTabs=true, which makes labels fill the row\n // and overrides alignTabs. Expose this so consumers can opt out and let alignTabs take effect.\n stretchTabs = input(true, { transform: booleanAttribute });\n animationDuration = input<string>('500ms');\n disableRipple = input(false, { transform: booleanAttribute });\n dynamicHeight = input(false, { transform: booleanAttribute });\n autoId = input<string | undefined>(undefined);\n\n tabClosed = output<SdTabClosedEvent>();\n\n protected matTabGroup = viewChild(MatTabGroup);\n\n @HostBinding('attr.data-autoId') get autoIdAttr(): string | null {\n return this.autoId() ?? null;\n }\n\n @HostBinding('class.sd-tab-group--pills') get isPills(): boolean {\n return this.variant() === 'pills';\n }\n @HostBinding('class.sd-tab-group--segmented') get isSegmented(): boolean {\n return this.variant() === 'segmented';\n }\n\n // why: bind Core color CSS vars onto the host so the existing --sd-tab-* CSS vars\n // pick up the chosen color. Fallback hex matches the values in autoid-inspector\n // for environments where the global Core SCSS isn't loaded (e.g. lib-only tests).\n @HostBinding('style.--sd-tab-indicator-color') get cssIndicator(): string {\n return `var(--sd-${this.color()})`;\n }\n @HostBinding('style.--sd-tab-label-active-color') get cssActive(): string {\n return `var(--sd-${this.color()})`;\n }\n @HostBinding('style.--sd-tab-badge-bg') get cssBadgeBg(): string {\n return `var(--sd-${this.color()}-light)`;\n }\n @HostBinding('style.--sd-tab-badge-color') get cssBadgeColor(): string {\n return `var(--sd-${this.color()})`;\n }\n\n constructor() {\n // why: when the active tab is removed (e.g. parent splices the tabs array),\n // selectedIndex may point past the end. Clamp it back to the last valid index\n // so MatTabGroup doesn't render with a stale selection.\n effect(() => {\n const len = this.tabs().length;\n const cur = untracked(() => this.selectedIndex());\n if (len > 0 && cur >= len) {\n this.selectedIndex.set(Math.max(0, len - 1));\n }\n });\n }\n\n selectTab(index: number): void {\n const len = this.tabs().length;\n if (len === 0) {\n this.selectedIndex.set(0);\n return;\n }\n this.selectedIndex.set(Math.max(0, Math.min(index, len - 1)));\n }\n\n realignInkBar(): void {\n this.matTabGroup()?.realignInkBar();\n }\n\n protected onClose(tab: SdTab, index: number, event: MouseEvent): void {\n event.stopPropagation();\n if (tab.disabled()) return;\n tab.close.emit();\n this.tabClosed.emit({ index, tab });\n }\n}\n","<mat-tab-group\n class=\"sd-tab-group\"\n [(selectedIndex)]=\"selectedIndex\"\n [headerPosition]=\"headerPosition()\"\n [mat-align-tabs]=\"alignTabs()\"\n [mat-stretch-tabs]=\"stretchTabs()\"\n [animationDuration]=\"animationDuration()\"\n [disableRipple]=\"disableRipple()\"\n [dynamicHeight]=\"dynamicHeight()\">\n @for (tab of tabs(); track tab; let i = $index) {\n <mat-tab [disabled]=\"tab.disabled()\">\n <ng-template mat-tab-label>\n <span class=\"sd-tab__label\">\n @if (tab.icon(); as ic) {\n <mat-icon class=\"sd-tab__icon\">{{ ic }}</mat-icon>\n }\n <span class=\"sd-tab__text\">{{ tab.label() }}</span>\n @let _badge = tab.badge();\n @if (_badge !== null && _badge !== undefined) {\n <span class=\"sd-tab__badge\">{{ _badge }}</span>\n }\n @if (tab.closable()) {\n <mat-icon\n class=\"sd-tab__close\"\n role=\"button\"\n aria-label=\"Close tab\"\n (click)=\"onClose(tab, i, $event)\">\n close\n </mat-icon>\n }\n </span>\n </ng-template>\n\n <ng-template matTabContent>\n <ng-container [ngTemplateOutlet]=\"tab.bodyTpl()\"></ng-container>\n </ng-template>\n </mat-tab>\n }\n</mat-tab-group>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-components-tab.mjs","sources":["../../../projects/sdcorejs-angular/components/tab/src/tab.component.ts","../../../projects/sdcorejs-angular/components/tab/src/tab-group.component.ts","../../../projects/sdcorejs-angular/components/tab/src/tab-group.component.html","../../../projects/sdcorejs-angular/components/tab/sdcorejs-angular-components-tab.ts"],"sourcesContent":["import { booleanAttribute, ChangeDetectionStrategy, Component, input, output, TemplateRef, viewChild } from '@angular/core';\n\n@Component({\n selector: 'sd-tab',\n standalone: true,\n template: `<ng-template #body><ng-content></ng-content></ng-template>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdTab {\n label = input.required<string>();\n icon = input<string | null | undefined>(undefined);\n badge = input<string | number | null | undefined>(undefined);\n disabled = input(false, { transform: booleanAttribute });\n closable = input(false, { transform: booleanAttribute });\n\n close = output<void>();\n\n // why: viewChild on `#body` template captures projected content so the parent\n // <sd-tab-group> can render it lazily via matTabContent + ngTemplateOutlet.\n // If we projected raw ng-content into <mat-tab> directly, mat-tab would render\n // eagerly and lose the lazy-load behavior.\n bodyTpl = viewChild.required<TemplateRef<unknown>>('body');\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n contentChildren,\n effect,\n HostBinding,\n input,\n model,\n output,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabGroup, MatTabsModule } from '@angular/material/tabs';\nimport { Color } from '@sdcorejs/utils/models';\nimport { SdTab } from './tab.component';\n\nexport interface SdTabClosedEvent {\n index: number;\n tab: SdTab;\n}\n\n@Component({\n selector: 'sd-tab-group',\n standalone: true,\n imports: [MatTabsModule, MatIconModule, NgTemplateOutlet],\n templateUrl: './tab-group.component.html',\n styleUrl: './tab-group.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdTabGroup {\n tabs = contentChildren(SdTab);\n\n selectedIndex = model<number>(0);\n // why: visual style preset. 'line' = Material default (underline ink-bar);\n // 'pills' = rounded pill, active filled (good for nested tab groups + filter bars);\n // 'segmented' = single bordered container, iOS-style.\n variant = input<'line' | 'pills' | 'segmented'>('line');\n // why: drives the active/indicator color via Core CSS vars (--sd-<color>, --sd-<color>-light).\n // Same palette consumers use on <sd-badge>, <sd-button>, etc — keeps theming consistent.\n color = input<Color>('primary');\n headerPosition = input<'above' | 'below'>('above');\n alignTabs = input<'start' | 'center' | 'end'>('start');\n // why: mat-tab-group defaults stretchTabs=true, which makes labels fill the row\n // and overrides alignTabs. Expose this so consumers can opt out and let alignTabs take effect.\n stretchTabs = input(true, { transform: booleanAttribute });\n animationDuration = input<string>('500ms');\n disableRipple = input(false, { transform: booleanAttribute });\n dynamicHeight = input(false, { transform: booleanAttribute });\n autoId = input<string | undefined>(undefined);\n\n tabClosed = output<SdTabClosedEvent>();\n\n protected matTabGroup = viewChild(MatTabGroup);\n\n @HostBinding('attr.data-autoId') get autoIdAttr(): string | null {\n return this.autoId() ?? null;\n }\n\n @HostBinding('class.sd-tab-group--pills') get isPills(): boolean {\n return this.variant() === 'pills';\n }\n @HostBinding('class.sd-tab-group--segmented') get isSegmented(): boolean {\n return this.variant() === 'segmented';\n }\n\n // why: bind Core color CSS vars onto the host so the existing --sd-tab-* CSS vars\n // pick up the chosen color. Fallback hex matches the values in autoid-inspector\n // for environments where the global Core SCSS isn't loaded (e.g. lib-only tests).\n @HostBinding('style.--sd-tab-indicator-color') get cssIndicator(): string {\n return `var(--sd-${this.color()})`;\n }\n @HostBinding('style.--sd-tab-label-active-color') get cssActive(): string {\n return `var(--sd-${this.color()})`;\n }\n @HostBinding('style.--sd-tab-badge-bg') get cssBadgeBg(): string {\n return `var(--sd-${this.color()}-light)`;\n }\n @HostBinding('style.--sd-tab-badge-color') get cssBadgeColor(): string {\n return `var(--sd-${this.color()})`;\n }\n\n constructor() {\n // why: when the active tab is removed (e.g. parent splices the tabs array),\n // selectedIndex may point past the end. Clamp it back to the last valid index\n // so MatTabGroup doesn't render with a stale selection.\n effect(() => {\n const len = this.tabs().length;\n const cur = untracked(() => this.selectedIndex());\n if (len > 0 && cur >= len) {\n this.selectedIndex.set(Math.max(0, len - 1));\n }\n });\n }\n\n selectTab(index: number): void {\n const len = this.tabs().length;\n if (len === 0) {\n this.selectedIndex.set(0);\n return;\n }\n this.selectedIndex.set(Math.max(0, Math.min(index, len - 1)));\n }\n\n realignInkBar(): void {\n this.matTabGroup()?.realignInkBar();\n }\n\n protected onClose(tab: SdTab, index: number, event: MouseEvent): void {\n event.stopPropagation();\n if (tab.disabled()) return;\n tab.close.emit();\n this.tabClosed.emit({ index, tab });\n }\n}\n","<mat-tab-group\n class=\"sd-tab-group\"\n [(selectedIndex)]=\"selectedIndex\"\n [headerPosition]=\"headerPosition()\"\n [mat-align-tabs]=\"alignTabs()\"\n [mat-stretch-tabs]=\"stretchTabs()\"\n [animationDuration]=\"animationDuration()\"\n [disableRipple]=\"disableRipple()\"\n [dynamicHeight]=\"dynamicHeight()\">\n @for (tab of tabs(); track tab; let i = $index) {\n <mat-tab [disabled]=\"tab.disabled()\">\n <ng-template mat-tab-label>\n <span class=\"sd-tab__label\">\n @if (tab.icon(); as ic) {\n <mat-icon class=\"sd-tab__icon\">{{ ic }}</mat-icon>\n }\n <span class=\"sd-tab__text\">{{ tab.label() }}</span>\n @let _badge = tab.badge();\n @if (_badge !== null && _badge !== undefined) {\n <span class=\"sd-tab__badge\">{{ _badge }}</span>\n }\n @if (tab.closable()) {\n <mat-icon\n class=\"sd-tab__close\"\n role=\"button\"\n aria-label=\"Close tab\"\n (click)=\"onClose(tab, i, $event)\">\n close\n </mat-icon>\n }\n </span>\n </ng-template>\n\n <ng-template matTabContent>\n <ng-container [ngTemplateOutlet]=\"tab.bodyTpl()\"></ng-container>\n </ng-template>\n </mat-tab>\n }\n</mat-tab-group>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}