@sd-angular/core 19.0.0-beta.91 → 19.0.0-beta.93

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 (150) hide show
  1. package/components/badge/src/badge.component.d.ts +0 -3
  2. package/components/form-generic/index.d.ts +4 -0
  3. package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +3 -3
  4. package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +3 -3
  5. package/components/{workflow → form-generic}/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +3 -3
  6. package/components/{workflow → form-generic}/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +1 -1
  7. package/components/{workflow → form-generic}/src/components/form-render/form-render.component.d.ts +3 -3
  8. package/components/{workflow → form-generic}/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
  9. package/components/form-generic/src/configurations/form-generic.configuration.d.ts +6 -0
  10. package/components/form-generic/src/configurations/index.d.ts +2 -0
  11. package/components/{workflow → form-generic}/src/services/form-generic.service.d.ts +3 -3
  12. package/components/index.d.ts +1 -0
  13. package/components/splitter/index.d.ts +3 -0
  14. package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +24 -0
  15. package/components/splitter/src/splitter-panel/splitter-panel.component.d.ts +16 -0
  16. package/components/splitter/src/splitter-state.service.d.ts +26 -0
  17. package/components/splitter/src/splitter.component.d.ts +15 -0
  18. package/components/splitter/src/splitter.models.d.ts +23 -0
  19. package/components/table/src/directives/index.d.ts +1 -0
  20. package/components/table/src/directives/sd-column-resize.directive.d.ts +13 -0
  21. package/components/table/src/models/table-option-config.model.d.ts +2 -0
  22. package/components/table/src/services/column-width.util.d.ts +7 -0
  23. package/components/table/src/services/config.service.d.ts +5 -0
  24. package/components/table/src/table.component.d.ts +1 -0
  25. package/components/workflow/index.d.ts +2 -4
  26. package/components/workflow/src/configurations/workflow.configuration.d.ts +9 -5
  27. package/fesm2022/sd-angular-core-components-anchor.mjs +4 -4
  28. package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
  29. package/fesm2022/sd-angular-core-components-badge.mjs +0 -1
  30. package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
  31. package/fesm2022/sd-angular-core-components-form-generic.mjs +6397 -0
  32. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -0
  33. package/fesm2022/sd-angular-core-components-splitter.mjs +476 -0
  34. package/fesm2022/sd-angular-core-components-splitter.mjs.map +1 -0
  35. package/fesm2022/sd-angular-core-components-tab-router.mjs +4 -4
  36. package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
  37. package/fesm2022/sd-angular-core-components-table.mjs +187 -5
  38. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  39. package/fesm2022/sd-angular-core-components-upload-file.mjs +2 -2
  40. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  41. package/fesm2022/sd-angular-core-components-workflow.mjs +7 -6387
  42. package/fesm2022/sd-angular-core-components-workflow.mjs.map +1 -1
  43. package/fesm2022/sd-angular-core-components.mjs +1 -0
  44. package/fesm2022/sd-angular-core-components.mjs.map +1 -1
  45. package/fesm2022/sd-angular-core-forms-switch.mjs +2 -6
  46. package/fesm2022/sd-angular-core-forms-switch.mjs.map +1 -1
  47. package/fesm2022/sd-angular-core-services-storage.mjs +5 -0
  48. package/fesm2022/sd-angular-core-services-storage.mjs.map +1 -1
  49. package/fesm2022/sd-angular-core-utilities-extensions.mjs +9 -5
  50. package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
  51. package/fesm2022/sd-angular-core-utilities-models.mjs +12 -0
  52. package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
  53. package/forms/switch/src/switch.component.d.ts +3 -4
  54. package/package.json +62 -54
  55. package/sd-angular-core-19.0.0-beta.93.tgz +0 -0
  56. package/services/storage/src/storage.model.d.ts +1 -0
  57. package/utilities/extensions/src/string.extension.d.ts +2 -0
  58. package/utilities/models/src/pattern.model.d.ts +1 -1
  59. package/utilities/models/src/size.model.d.ts +1 -1
  60. package/sd-angular-core-19.0.0-beta.91.tgz +0 -0
  61. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +0 -0
  62. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +0 -0
  63. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +0 -0
  64. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +0 -0
  65. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +0 -0
  66. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +0 -0
  67. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +0 -0
  68. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +0 -0
  69. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +0 -0
  70. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +0 -0
  71. /package/components/{workflow → form-generic}/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +0 -0
  72. /package/components/{workflow → form-generic}/src/components/form-builder/components/checkbox/control/checkbox-control.component.d.ts +0 -0
  73. /package/components/{workflow → form-generic}/src/components/form-builder/components/checkbox/index.d.ts +0 -0
  74. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +0 -0
  75. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +0 -0
  76. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-calendar/index.d.ts +0 -0
  77. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +0 -0
  78. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +0 -0
  79. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-string/index.d.ts +0 -0
  80. /package/components/{workflow → form-generic}/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +0 -0
  81. /package/components/{workflow → form-generic}/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +0 -0
  82. /package/components/{workflow → form-generic}/src/components/form-builder/components/datetime/index.d.ts +0 -0
  83. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +0 -0
  84. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +0 -0
  85. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/control/html-control.component.d.ts +0 -0
  86. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/index.d.ts +0 -0
  87. /package/components/{workflow → form-generic}/src/components/form-builder/components/index.d.ts +0 -0
  88. /package/components/{workflow → form-generic}/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +0 -0
  89. /package/components/{workflow → form-generic}/src/components/form-builder/components/number/control/number-control.component.d.ts +0 -0
  90. /package/components/{workflow → form-generic}/src/components/form-builder/components/number/index.d.ts +0 -0
  91. /package/components/{workflow → form-generic}/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +0 -0
  92. /package/components/{workflow → form-generic}/src/components/form-builder/components/radio/control/radio-control.component.d.ts +0 -0
  93. /package/components/{workflow → form-generic}/src/components/form-builder/components/radio/index.d.ts +0 -0
  94. /package/components/{workflow → form-generic}/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +0 -0
  95. /package/components/{workflow → form-generic}/src/components/form-builder/components/select/control/select-control.component.d.ts +0 -0
  96. /package/components/{workflow → form-generic}/src/components/form-builder/components/select/index.d.ts +0 -0
  97. /package/components/{workflow → form-generic}/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +0 -0
  98. /package/components/{workflow → form-generic}/src/components/form-builder/components/table/control/table-control.component.d.ts +0 -0
  99. /package/components/{workflow → form-generic}/src/components/form-builder/components/table/index.d.ts +0 -0
  100. /package/components/{workflow → form-generic}/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +0 -0
  101. /package/components/{workflow → form-generic}/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +0 -0
  102. /package/components/{workflow → form-generic}/src/components/form-builder/components/textarea/index.d.ts +0 -0
  103. /package/components/{workflow → form-generic}/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +0 -0
  104. /package/components/{workflow → form-generic}/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +0 -0
  105. /package/components/{workflow → form-generic}/src/components/form-builder/components/textfield/index.d.ts +0 -0
  106. /package/components/{workflow → form-generic}/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +0 -0
  107. /package/components/{workflow → form-generic}/src/components/form-builder/components/upload/control/upload-control.component.d.ts +0 -0
  108. /package/components/{workflow → form-generic}/src/components/form-builder/components/upload/index.d.ts +0 -0
  109. /package/components/{workflow → form-generic}/src/components/form-builder/form-builder.component.d.ts +0 -0
  110. /package/components/{workflow → form-generic}/src/components/form-builder/services/builder.service.d.ts +0 -0
  111. /package/components/{workflow → form-generic}/src/components/form-builder/services/index.d.ts +0 -0
  112. /package/components/{workflow → form-generic}/src/components/form-render/components/index.d.ts +0 -0
  113. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +0 -0
  114. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +0 -0
  115. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +0 -0
  116. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/html/html.component.d.ts +0 -0
  117. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/index.d.ts +0 -0
  118. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/number/number.component.d.ts +0 -0
  119. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/radio/radio.component.d.ts +0 -0
  120. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/select/select.component.d.ts +0 -0
  121. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/table/table.component.d.ts +0 -0
  122. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +0 -0
  123. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +0 -0
  124. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/upload/upload.component.d.ts +0 -0
  125. /package/components/{workflow → form-generic}/src/components/form-render/components/item/item.component.d.ts +0 -0
  126. /package/components/{workflow → form-generic}/src/components/form-render/components/variable/variable.component.d.ts +0 -0
  127. /package/components/{workflow → form-generic}/src/components/index.d.ts +0 -0
  128. /package/components/{workflow → form-generic}/src/configurations/form.configuration.d.ts +0 -0
  129. /package/components/{workflow → form-generic}/src/models/form-generic-component.model.d.ts +0 -0
  130. /package/components/{workflow → form-generic}/src/models/form-generic-definition-html.model.d.ts +0 -0
  131. /package/components/{workflow → form-generic}/src/models/form-generic-definition-selection.model.d.ts +0 -0
  132. /package/components/{workflow → form-generic}/src/models/form-generic-definition-table.model.d.ts +0 -0
  133. /package/components/{workflow → form-generic}/src/models/form-generic-expression.model.d.ts +0 -0
  134. /package/components/{workflow → form-generic}/src/models/form-generic-template.model.d.ts +0 -0
  135. /package/components/{workflow → form-generic}/src/models/form-generic-validation.model.d.ts +0 -0
  136. /package/components/{workflow → form-generic}/src/models/form-generic.model.d.ts +0 -0
  137. /package/components/{workflow → form-generic}/src/models/form-render/form-render-args.model.d.ts +0 -0
  138. /package/components/{workflow → form-generic}/src/models/form-render/form-render-entity.model.d.ts +0 -0
  139. /package/components/{workflow → form-generic}/src/models/form-render/index.d.ts +0 -0
  140. /package/components/{workflow → form-generic}/src/models/index.d.ts +0 -0
  141. /package/components/{workflow → form-generic}/src/pipes/component-viewed.pipe.d.ts +0 -0
  142. /package/components/{workflow → form-generic}/src/pipes/expression-feel.pipe.d.ts +0 -0
  143. /package/components/{workflow → form-generic}/src/pipes/expression-query.pipe.d.ts +0 -0
  144. /package/components/{workflow → form-generic}/src/pipes/expression-view.pipe.d.ts +0 -0
  145. /package/components/{workflow → form-generic}/src/pipes/html.pipe.d.ts +0 -0
  146. /package/components/{workflow → form-generic}/src/pipes/hyperlink.pipe.d.ts +0 -0
  147. /package/components/{workflow → form-generic}/src/pipes/index.d.ts +0 -0
  148. /package/components/{workflow → form-generic}/src/pipes/when-expression.pipe.d.ts +0 -0
  149. /package/components/{workflow → form-generic}/src/services/form-render.service.d.ts +0 -0
  150. /package/components/{workflow → form-generic}/src/services/index.d.ts +0 -0
@@ -277,11 +277,11 @@ class SdTabRouterNavComponent {
277
277
  moveItemInArray(this.tabs(), event.previousIndex, event.currentIndex);
278
278
  };
279
279
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTabRouterNavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
280
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdTabRouterNavComponent, isStandalone: true, selector: "sd-tab-router-nav", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "tabRouterNav", first: true, predicate: ["tabRouterNav"], descendants: true, isSignal: true }], ngImport: i0, template: "<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", styles: [".tab-router__nav{background:#f9f9f9;overflow:hidden}.tab-router__nav--compact::ng-deep .tab-router__name{display:none}.tab-router__nav--compact::ng-deep .tab-router__icon{margin:0!important}.tab-router__nav--compact::ng-deep .tab-router__item--active{min-width:240px}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__icon{margin-right:8px!important}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__name{display:-webkit-box}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: SdTabRouterItemComponent, selector: "sd-tab-router-item", inputs: ["tab"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
280
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdTabRouterNavComponent, isStandalone: true, selector: "sd-tab-router-nav", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "tabRouterNav", first: true, predicate: ["tabRouterNav"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\r\n #tabRouterNav\r\n cdkDropList\r\n cdkDropListLockAxis=\"x\"\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n class=\"tab-router__nav tab-router__nav--{{ mode }} d-flex align-items-center flex-nowrap\"\r\n [class.d-none]=\"tabs().length > 1\">\r\n @for (tab of tabs(); track tab.key) {\r\n <sd-tab-router-item [tab]=\"tab\" cdkDrag [cdkDragBoundary]=\"elementRef.nativeElement\"></sd-tab-router-item>\r\n }\r\n</div>\r\n", styles: [".tab-router__nav{background:#f9f9f9;overflow:hidden}.tab-router__nav--compact::ng-deep .tab-router__name{display:none}.tab-router__nav--compact::ng-deep .tab-router__icon{margin:0!important}.tab-router__nav--compact::ng-deep .tab-router__item--active{min-width:240px}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__icon{margin-right:8px!important}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__name{display:-webkit-box}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: SdTabRouterItemComponent, selector: "sd-tab-router-item", inputs: ["tab"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
281
281
  }
282
282
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTabRouterNavComponent, decorators: [{
283
283
  type: Component,
284
- args: [{ selector: 'sd-tab-router-nav', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, DragDropModule, SdTabRouterItemComponent], template: "<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", styles: [".tab-router__nav{background:#f9f9f9;overflow:hidden}.tab-router__nav--compact::ng-deep .tab-router__name{display:none}.tab-router__nav--compact::ng-deep .tab-router__icon{margin:0!important}.tab-router__nav--compact::ng-deep .tab-router__item--active{min-width:240px}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__icon{margin-right:8px!important}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__name{display:-webkit-box}\n"] }]
284
+ args: [{ selector: 'sd-tab-router-nav', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, DragDropModule, SdTabRouterItemComponent], template: "<div\r\n #tabRouterNav\r\n cdkDropList\r\n cdkDropListLockAxis=\"x\"\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n class=\"tab-router__nav tab-router__nav--{{ mode }} d-flex align-items-center flex-nowrap\"\r\n [class.d-none]=\"tabs().length > 1\">\r\n @for (tab of tabs(); track tab.key) {\r\n <sd-tab-router-item [tab]=\"tab\" cdkDrag [cdkDragBoundary]=\"elementRef.nativeElement\"></sd-tab-router-item>\r\n }\r\n</div>\r\n", styles: [".tab-router__nav{background:#f9f9f9;overflow:hidden}.tab-router__nav--compact::ng-deep .tab-router__name{display:none}.tab-router__nav--compact::ng-deep .tab-router__icon{margin:0!important}.tab-router__nav--compact::ng-deep .tab-router__item--active{min-width:240px}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__icon{margin-right:8px!important}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__name{display:-webkit-box}\n"] }]
285
285
  }], propDecorators: { onResize: [{
286
286
  type: HostListener,
287
287
  args: ['window:resize']
@@ -514,11 +514,11 @@ class SdTabRouterOutletComponent {
514
514
  return null;
515
515
  };
516
516
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTabRouterOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
517
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdTabRouterOutletComponent, isStandalone: true, selector: "sd-tab-router-outlet", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "tabRouterNav", first: true, predicate: ["tabRouterNav"], descendants: true, isSignal: true }], ngImport: i0, template: "@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}", styles: [":host{display:flex;flex-direction:column;width:100%;min-height:0;height:100vh}:host ::ng-deep .sd-loading{max-width:100%;max-height:100%}.tab-router__list{flex:1;min-height:0}.tab-router__disabled-outlet{flex:1;width:100%;min-height:0;overflow:auto}.tab-router__pane{display:none;position:relative;height:100%;width:100%}.tab-router__pane.active{display:block}.tab-router__content{position:absolute;inset:0;overflow:auto;height:100%;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: SdTabRouterNavComponent, selector: "sd-tab-router-nav", inputs: ["tabs"] }] });
517
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdTabRouterOutletComponent, isStandalone: true, selector: "sd-tab-router-outlet", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "tabRouterNav", first: true, predicate: ["tabRouterNav"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (disabled()) {\r\n <div class=\"tab-router__disabled-outlet\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n} @else {\r\n <sd-tab-router-nav [tabs]=\"tabs()\" #tabRouterNav></sd-tab-router-nav>\r\n <div class=\"tab-router__list\">\r\n @for (tab of tabs(); track tab.key) {\r\n <div class=\"tab-router__pane\" [class.active]=\"tab.isActive\" [id]=\"tab.key\">\r\n <div class=\"tab-router__content\">\r\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div class=\"tab-router__empty\">\r\n </div>\r\n }\r\n </div>\r\n}", styles: [":host{display:flex;flex-direction:column;width:100%;min-height:0;height:100vh}:host ::ng-deep .sd-loading{max-width:100%;max-height:100%}.tab-router__list{flex:1;min-height:0}.tab-router__disabled-outlet{flex:1;width:100%;min-height:0;overflow:auto}.tab-router__pane{display:none;position:relative;height:100%;width:100%}.tab-router__pane.active{display:block}.tab-router__content{position:absolute;inset:0;overflow:auto;height:100%;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: SdTabRouterNavComponent, selector: "sd-tab-router-nav", inputs: ["tabs"] }] });
518
518
  }
519
519
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTabRouterOutletComponent, decorators: [{
520
520
  type: Component,
521
- args: [{ selector: 'sd-tab-router-outlet', standalone: true, imports: [CommonModule, MatIconModule, MatTooltipModule, RouterOutlet, SdTabRouterNavComponent], template: "@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}", styles: [":host{display:flex;flex-direction:column;width:100%;min-height:0;height:100vh}:host ::ng-deep .sd-loading{max-width:100%;max-height:100%}.tab-router__list{flex:1;min-height:0}.tab-router__disabled-outlet{flex:1;width:100%;min-height:0;overflow:auto}.tab-router__pane{display:none;position:relative;height:100%;width:100%}.tab-router__pane.active{display:block}.tab-router__content{position:absolute;inset:0;overflow:auto;height:100%;width:100%}\n"] }]
521
+ args: [{ selector: 'sd-tab-router-outlet', standalone: true, imports: [CommonModule, MatIconModule, MatTooltipModule, RouterOutlet, SdTabRouterNavComponent], template: "@if (disabled()) {\r\n <div class=\"tab-router__disabled-outlet\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n} @else {\r\n <sd-tab-router-nav [tabs]=\"tabs()\" #tabRouterNav></sd-tab-router-nav>\r\n <div class=\"tab-router__list\">\r\n @for (tab of tabs(); track tab.key) {\r\n <div class=\"tab-router__pane\" [class.active]=\"tab.isActive\" [id]=\"tab.key\">\r\n <div class=\"tab-router__content\">\r\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div class=\"tab-router__empty\">\r\n </div>\r\n }\r\n </div>\r\n}", styles: [":host{display:flex;flex-direction:column;width:100%;min-height:0;height:100vh}:host ::ng-deep .sd-loading{max-width:100%;max-height:100%}.tab-router__list{flex:1;min-height:0}.tab-router__disabled-outlet{flex:1;width:100%;min-height:0;overflow:auto}.tab-router__pane{display:none;position:relative;height:100%;width:100%}.tab-router__pane.active{display:block}.tab-router__content{position:absolute;inset:0;overflow:auto;height:100%;width:100%}\n"] }]
522
522
  }], ctorParameters: () => [] });
523
523
  // Custom Injector cho từng tab: override ActivatedRoute thành route của TAB ĐÓ
524
524
  // (không phải route hiện tại của router). Nếu không override, mọi tab sẽ inject ActivatedRoute
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-components-tab-router.mjs","sources":["../../../projects/sd-angular/components/tab-router/src/events/tab-router.event.ts","../../../projects/sd-angular/components/tab-router/src/services/tab-router.service.ts","../../../projects/sd-angular/components/tab-router/src/services/tab-decorator.service.ts","../../../projects/sd-angular/components/tab-router/src/pipes/tab-info.pipe.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.html","../../../projects/sd-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.html","../../../projects/sd-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.html","../../../projects/sd-angular/components/tab-router/src/decorators/tab.decorator.ts","../../../projects/sd-angular/components/tab-router/sd-angular-core-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';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SdTabAction } from '../actions/tab-router.action';\r\nimport { SdTabComponentBuilder } from '../decorators/tab.decorator';\r\nimport { SdTabBase, SdTabEvent } from '../events/tab-router.event';\r\nimport { SdTab } from '../models/tab-router.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdTabRouterService {\r\n events = new BehaviorSubject<SdTabEvent>(new SdTabBase(undefined));\r\n actions = new BehaviorSubject<SdTabAction | undefined>(undefined);\r\n builders = new BehaviorSubject<SdTabComponentBuilder[]>([]);\r\n currentTabChanges = new BehaviorSubject<SdTab | undefined>(undefined);\r\n newTabs = new BehaviorSubject<SdTab | undefined>(undefined);\r\n updateTabs = new BehaviorSubject<SdTab | undefined>(undefined);\r\n #currentTab: SdTab | undefined = undefined;\r\n #componentBuilders: SdTabComponentBuilder[] = [];\r\n constructor() {}\r\n\r\n addBuilder = (builder: SdTabComponentBuilder) => {\r\n if (!this.#componentBuilders.some(e => e.component === builder.component)) {\r\n this.#componentBuilders.push(builder);\r\n this.builders.next(this.#componentBuilders);\r\n }\r\n };\r\n\r\n get currentTab() {\r\n return this.#currentTab;\r\n }\r\n\r\n get currentKey() {\r\n return this.#currentTab?.key || null;\r\n }\r\n\r\n // select = (tabOrKey: string | SdTab): void => {\r\n // const tab = this.#tabs.find(e => {\r\n // if (typeof (tabOrKey) === 'string') {\r\n // return e.key === tabOrKey;\r\n // }\r\n // return e.key === tabOrKey?.key;\r\n // });\r\n // if (tab) {\r\n // this.#currentTab = tab;\r\n // }\r\n // }\r\n\r\n // add = (tab: SdTab): void => {\r\n // if (!tab.key) {\r\n // this.notifyService.notify.warning('Tab key is required');\r\n // }\r\n // if (!tab.component) {\r\n // this.notifyService.notify.warning('Tab component is required');\r\n // }\r\n // const existedTab = this.#tabs.find(e => e.key === tab.key);\r\n // if (!existedTab) {\r\n // this.#tabs.push(tab);\r\n // this.select(tab);\r\n // } else {\r\n // this.select(existedTab);\r\n // }\r\n // }\r\n\r\n // remove = (tabOrKey: string | SdTab): void => {\r\n // this.#tabs = this.#tabs.filter(e => {\r\n // if (typeof (tabOrKey) === 'string') {\r\n // return e.key !== tabOrKey;\r\n // }\r\n // return e.key !== tabOrKey?.key;\r\n // });\r\n // }\r\n\r\n setCurrentTab = (tab: SdTab): void => {\r\n this.#currentTab = tab;\r\n this.currentTabChanges.next(tab);\r\n };\r\n\r\n pushEvent = (tab: SdTab, Event: Type<SdTabEvent>) => {\r\n this.events.next(new Event(tab));\r\n };\r\n\r\n setOptions = () => {};\r\n\r\n close = (tab?: SdTab) => {\r\n tab = tab || this.#currentTab;\r\n if (tab) {\r\n this.actions.next({\r\n type: 'close',\r\n tab,\r\n });\r\n }\r\n };\r\n\r\n // Gọi hàm này để thực hiện update tab\r\n updateTab = (tab: SdTab) => {};\r\n}\r\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';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, startWith } from 'rxjs/operators';\r\n\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { SdBadge } from '@sd-angular/core/components/badge';\r\nimport { SdTab, SdTabInfo } from '../../models';\r\nimport { SdTabRouterService } from '../../services/tab-router.service';\r\nimport { Router } from '@angular/router';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SdTabInfoPipe } from '../../pipes/tab-info.pipe';\r\n\r\n@Component({\r\n selector: 'sd-tab-router-item',\r\n templateUrl: './tab-router-item.component.html',\r\n styleUrls: ['./tab-router-item.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, SdBadge, SdTabInfoPipe],\r\n})\r\nexport class SdTabRouterItemComponent implements OnInit, OnDestroy {\r\n @Input({ required: true }) tab!: SdTab;\r\n\r\n #subsctiption: Subscription = new Subscription();\r\n tabInfo?: SdTabInfo;\r\n constructor(\r\n private cdRef: ChangeDetectorRef,\r\n private tabRouterService: SdTabRouterService,\r\n private router: Router\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.#subsctiption.add(\r\n this.tabRouterService.events.pipe(debounceTime(100)).subscribe(() => {\r\n this.cdRef.markForCheck();\r\n })\r\n );\r\n\r\n this.#subsctiption.add(\r\n this.tab.tabInfoChanges.pipe(startWith(null)).subscribe(tabInfo => {\r\n if (tabInfo) {\r\n this.tabInfo = tabInfo;\r\n this.cdRef.markForCheck();\r\n }\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.#subsctiption.unsubscribe();\r\n }\r\n\r\n onTabClick = (event: Event) => {\r\n event.preventDefault();\r\n this.router.navigate([this.tab.url], {\r\n queryParams: this.tab.queryParams,\r\n state: { switchTab: true },\r\n });\r\n };\r\n\r\n close = (event: Event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.#closeTab();\r\n };\r\n\r\n onMousedown = (event: MouseEvent) => {\r\n if (event.button === 1) {\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n onMouseup = (event: MouseEvent) => {\r\n if (event.button === 1) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.#closeTab();\r\n }\r\n };\r\n\r\n #closeTab = async () => {\r\n if (this.tab?.beforeClose) {\r\n //\r\n if (this.tab?.beforeClose()) {\r\n const result = this.tab?.beforeClose();\r\n if (typeof result === 'boolean') {\r\n if (result) {\r\n this.tabRouterService.close(this.tab);\r\n }\r\n } else {\r\n if (await result) {\r\n this.tabRouterService.close(this.tab);\r\n }\r\n }\r\n }\r\n } else {\r\n this.tabRouterService.close(this.tab);\r\n }\r\n };\r\n}\r\n","<a\r\n [href]=\"[tab.url]\"\r\n class=\"tab-router__item d-flex align-items-center gap-8\"\r\n [class.tab-router__item--active]=\"tab.isActive\"\r\n (click)=\"onTabClick($event)\"\r\n (mousedown)=\"onMousedown($event)\"\r\n (mouseup)=\"onMouseup($event)\">\r\n @let info = tabInfo | sdTabInfo: tab;\r\n @if (info) {\r\n <sd-badge\r\n style=\"overflow: hidden;white-space: nowrap;\"\r\n [icon]=\"info.icon\"\r\n [title]=\"info.icon\"\r\n [tooltip]=\"info.tooltip || info.name\"\r\n [title]=\"info.name\"\r\n [color]=\"info.color\"\r\n (click)=\"onTabClick($event)\"></sd-badge>\r\n <button\r\n aria-hidden=\"true\"\r\n class=\"tab-router__close d-flex align-items-center justify-content-center ml-auto p-0\"\r\n (click)=\"close($event)\"\r\n (mousedown)=\"$event.stopPropagation()\">\r\n <mat-icon aria-hidden=\"true\" fontIcon=\"close\"></mat-icon>\r\n </button>\r\n }\r\n</a>\r\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 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 RouterEvent,\n RoutesRecognized,\n} from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Subject, Subscription, isObservable, lastValueFrom } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\n\nimport { SdNotifyService } from '@sd-angular/core/services/notify';\nimport { SdUtilities } from '@sd-angular/core/utilities';\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 #activatedRoute = inject(ActivatedRoute);\n #injector = inject(Injector);\n #tabRouterService = inject(SdTabRouterService);\n #sdNotifyService = inject(SdNotifyService);\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\n constructor() {\n this.#subscription.add(\n this.#router.events\n .pipe(\n // Một số event của Angular bọc trong wrapper có .routerEvent → unwrap về RouterEvent gốc.\n map((event: any) => (event instanceof RouterEvent ? event : event.routerEvent)),\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 instanceof RoutesRecognized || event instanceof NavigationEnd)\n )\n .subscribe(async (event: any) => {\n if (this.disabled()) {\n this.#pendingNavigationState = {};\n return;\n }\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 activatedRoute.snapshot và routerState.root MỚI nhất\n // (chứa route component đã được activate, cả lazy lẫn standalone routes).\n const route = this.#getActivatedRouteSnapshot(this.#activatedRoute.snapshot);\n this.#rootRoute = this.#router.routerState.root;\n await this.#activeRoute(event.urlAfterRedirects || event.url, route, this.#pendingNavigationState);\n this.#pendingNavigationState = {};\n })\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\n ngOnDestroy(): void {\n this.#subscription.unsubscribe();\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 = SdUtilities.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 const activatedRoute = this.#getActivatedRoute(this.#rootRoute!, component);\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('Bạn đã mở quá nhiều tab.');\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 tìm ActivatedRoute (không phải snapshot) trong tree theo component class.\n // Cần ActivatedRoute thật vì SdOutletInjector sẽ inject nó vào component qua DI.\n #getActivatedRoute = (activatedRoute: ActivatedRoute, component: any): ActivatedRoute | null => {\n if (activatedRoute.component === component) return activatedRoute;\n for (const child of activatedRoute.children) {\n const result = this.#getActivatedRoute(child, component);\n if (result) return result;\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';\r\nimport { SdColor } from '@sd-angular/core/utilities/models';\r\nimport { filter, take } from 'rxjs/operators';\r\nimport { SdTabDecoratorService } from '../services/tab-decorator.service';\r\n\r\nexport interface SdTabComponentArgs {\r\n url?: string;\r\n params?: any;\r\n queryParams?: any;\r\n data?: Record<string, any>;\r\n}\r\n\r\nexport declare interface SdTabComponentBuilder {\r\n component: Type<any>;\r\n name: string | ((args: SdTabComponentArgs) => string);\r\n icon?: string | ((args: SdTabComponentArgs) => string);\r\n tooltip?: string | ((args: SdTabComponentArgs) => string);\r\n color?: SdColor | ((args: SdTabComponentArgs) => SdColor);\r\n}\r\n\r\nexport function SdTabComponent<T>(builder: SdTabComponentBuilder) {\r\n return (constructor: T) => {\r\n SdTabDecoratorService.tabRouterService\r\n .pipe(\r\n filter(service => service !== undefined && service !== null),\r\n take(1)\r\n )\r\n .subscribe(service => {\r\n service.addBuilder(builder);\r\n });\r\n };\r\n}\r\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":"sd-angular-core-components-tab-router.mjs","sources":["../../../projects/sd-angular/components/tab-router/src/events/tab-router.event.ts","../../../projects/sd-angular/components/tab-router/src/services/tab-router.service.ts","../../../projects/sd-angular/components/tab-router/src/services/tab-decorator.service.ts","../../../projects/sd-angular/components/tab-router/src/pipes/tab-info.pipe.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-item/tab-router-item.component.html","../../../projects/sd-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.html","../../../projects/sd-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.ts","../../../projects/sd-angular/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.html","../../../projects/sd-angular/components/tab-router/src/decorators/tab.decorator.ts","../../../projects/sd-angular/components/tab-router/sd-angular-core-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';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SdTabAction } from '../actions/tab-router.action';\r\nimport { SdTabComponentBuilder } from '../decorators/tab.decorator';\r\nimport { SdTabBase, SdTabEvent } from '../events/tab-router.event';\r\nimport { SdTab } from '../models/tab-router.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SdTabRouterService {\r\n events = new BehaviorSubject<SdTabEvent>(new SdTabBase(undefined));\r\n actions = new BehaviorSubject<SdTabAction | undefined>(undefined);\r\n builders = new BehaviorSubject<SdTabComponentBuilder[]>([]);\r\n currentTabChanges = new BehaviorSubject<SdTab | undefined>(undefined);\r\n newTabs = new BehaviorSubject<SdTab | undefined>(undefined);\r\n updateTabs = new BehaviorSubject<SdTab | undefined>(undefined);\r\n #currentTab: SdTab | undefined = undefined;\r\n #componentBuilders: SdTabComponentBuilder[] = [];\r\n constructor() {}\r\n\r\n addBuilder = (builder: SdTabComponentBuilder) => {\r\n if (!this.#componentBuilders.some(e => e.component === builder.component)) {\r\n this.#componentBuilders.push(builder);\r\n this.builders.next(this.#componentBuilders);\r\n }\r\n };\r\n\r\n get currentTab() {\r\n return this.#currentTab;\r\n }\r\n\r\n get currentKey() {\r\n return this.#currentTab?.key || null;\r\n }\r\n\r\n // select = (tabOrKey: string | SdTab): void => {\r\n // const tab = this.#tabs.find(e => {\r\n // if (typeof (tabOrKey) === 'string') {\r\n // return e.key === tabOrKey;\r\n // }\r\n // return e.key === tabOrKey?.key;\r\n // });\r\n // if (tab) {\r\n // this.#currentTab = tab;\r\n // }\r\n // }\r\n\r\n // add = (tab: SdTab): void => {\r\n // if (!tab.key) {\r\n // this.notifyService.notify.warning('Tab key is required');\r\n // }\r\n // if (!tab.component) {\r\n // this.notifyService.notify.warning('Tab component is required');\r\n // }\r\n // const existedTab = this.#tabs.find(e => e.key === tab.key);\r\n // if (!existedTab) {\r\n // this.#tabs.push(tab);\r\n // this.select(tab);\r\n // } else {\r\n // this.select(existedTab);\r\n // }\r\n // }\r\n\r\n // remove = (tabOrKey: string | SdTab): void => {\r\n // this.#tabs = this.#tabs.filter(e => {\r\n // if (typeof (tabOrKey) === 'string') {\r\n // return e.key !== tabOrKey;\r\n // }\r\n // return e.key !== tabOrKey?.key;\r\n // });\r\n // }\r\n\r\n setCurrentTab = (tab: SdTab): void => {\r\n this.#currentTab = tab;\r\n this.currentTabChanges.next(tab);\r\n };\r\n\r\n pushEvent = (tab: SdTab, Event: Type<SdTabEvent>) => {\r\n this.events.next(new Event(tab));\r\n };\r\n\r\n setOptions = () => {};\r\n\r\n close = (tab?: SdTab) => {\r\n tab = tab || this.#currentTab;\r\n if (tab) {\r\n this.actions.next({\r\n type: 'close',\r\n tab,\r\n });\r\n }\r\n };\r\n\r\n // Gọi hàm này để thực hiện update tab\r\n updateTab = (tab: SdTab) => {};\r\n}\r\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';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, startWith } from 'rxjs/operators';\r\n\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { SdBadge } from '@sd-angular/core/components/badge';\r\nimport { SdTab, SdTabInfo } from '../../models';\r\nimport { SdTabRouterService } from '../../services/tab-router.service';\r\nimport { Router } from '@angular/router';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SdTabInfoPipe } from '../../pipes/tab-info.pipe';\r\n\r\n@Component({\r\n selector: 'sd-tab-router-item',\r\n templateUrl: './tab-router-item.component.html',\r\n styleUrls: ['./tab-router-item.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, SdBadge, SdTabInfoPipe],\r\n})\r\nexport class SdTabRouterItemComponent implements OnInit, OnDestroy {\r\n @Input({ required: true }) tab!: SdTab;\r\n\r\n #subsctiption: Subscription = new Subscription();\r\n tabInfo?: SdTabInfo;\r\n constructor(\r\n private cdRef: ChangeDetectorRef,\r\n private tabRouterService: SdTabRouterService,\r\n private router: Router\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.#subsctiption.add(\r\n this.tabRouterService.events.pipe(debounceTime(100)).subscribe(() => {\r\n this.cdRef.markForCheck();\r\n })\r\n );\r\n\r\n this.#subsctiption.add(\r\n this.tab.tabInfoChanges.pipe(startWith(null)).subscribe(tabInfo => {\r\n if (tabInfo) {\r\n this.tabInfo = tabInfo;\r\n this.cdRef.markForCheck();\r\n }\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.#subsctiption.unsubscribe();\r\n }\r\n\r\n onTabClick = (event: Event) => {\r\n event.preventDefault();\r\n this.router.navigate([this.tab.url], {\r\n queryParams: this.tab.queryParams,\r\n state: { switchTab: true },\r\n });\r\n };\r\n\r\n close = (event: Event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.#closeTab();\r\n };\r\n\r\n onMousedown = (event: MouseEvent) => {\r\n if (event.button === 1) {\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n onMouseup = (event: MouseEvent) => {\r\n if (event.button === 1) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.#closeTab();\r\n }\r\n };\r\n\r\n #closeTab = async () => {\r\n if (this.tab?.beforeClose) {\r\n //\r\n if (this.tab?.beforeClose()) {\r\n const result = this.tab?.beforeClose();\r\n if (typeof result === 'boolean') {\r\n if (result) {\r\n this.tabRouterService.close(this.tab);\r\n }\r\n } else {\r\n if (await result) {\r\n this.tabRouterService.close(this.tab);\r\n }\r\n }\r\n }\r\n } else {\r\n this.tabRouterService.close(this.tab);\r\n }\r\n };\r\n}\r\n","<a\r\n [href]=\"[tab.url]\"\r\n class=\"tab-router__item d-flex align-items-center gap-8\"\r\n [class.tab-router__item--active]=\"tab.isActive\"\r\n (click)=\"onTabClick($event)\"\r\n (mousedown)=\"onMousedown($event)\"\r\n (mouseup)=\"onMouseup($event)\">\r\n @let info = tabInfo | sdTabInfo: tab;\r\n @if (info) {\r\n <sd-badge\r\n style=\"overflow: hidden;white-space: nowrap;\"\r\n [icon]=\"info.icon\"\r\n [title]=\"info.icon\"\r\n [tooltip]=\"info.tooltip || info.name\"\r\n [title]=\"info.name\"\r\n [color]=\"info.color\"\r\n (click)=\"onTabClick($event)\"></sd-badge>\r\n <button\r\n aria-hidden=\"true\"\r\n class=\"tab-router__close d-flex align-items-center justify-content-center ml-auto p-0\"\r\n (click)=\"close($event)\"\r\n (mousedown)=\"$event.stopPropagation()\">\r\n <mat-icon aria-hidden=\"true\" fontIcon=\"close\"></mat-icon>\r\n </button>\r\n }\r\n</a>\r\n","import { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n input,\r\n viewChild,\r\n} from '@angular/core';\r\n\r\nimport { SdTab } from '../../models/tab-router.model';\r\nimport { SdTabRouterItemComponent } from '../tab-router-item/tab-router-item.component';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'sd-tab-router-nav',\r\n templateUrl: './tab-router-nav.component.html',\r\n styleUrls: ['./tab-router-nav.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, DragDropModule, SdTabRouterItemComponent],\r\n})\r\nexport class SdTabRouterNavComponent {\r\n tabRouterNav = viewChild<ElementRef>('tabRouterNav');\r\n\r\n tabs = input<SdTab[]>([]);\r\n mode: 'default' | 'compact' = 'default';\r\n cdRef = inject(ChangeDetectorRef);\r\n elementRef = inject<ElementRef<any>>(ElementRef);\r\n\r\n @HostListener('window:resize')\r\n onResize(): void {\r\n this.checkUI();\r\n }\r\n\r\n checkUI = () => {\r\n const width = this.tabRouterNav()?.nativeElement.clientWidth ?? 0;\r\n const tabs = this.tabs();\r\n if (tabs.length === 0) {\r\n this.mode = 'default';\r\n this.cdRef.markForCheck();\r\n return;\r\n }\r\n\r\n const nameWidth = (width - tabs.length * 68) / tabs.length;\r\n if (nameWidth <= 20) {\r\n this.mode = 'compact';\r\n } else {\r\n this.mode = 'default';\r\n }\r\n this.cdRef.markForCheck();\r\n };\r\n\r\n onDrop = (event: CdkDragDrop<SdTab[]>) => {\r\n moveItemInArray(this.tabs(), event.previousIndex, event.currentIndex);\r\n };\r\n}\r\n","<div\r\n #tabRouterNav\r\n cdkDropList\r\n cdkDropListLockAxis=\"x\"\r\n cdkDropListOrientation=\"horizontal\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n class=\"tab-router__nav tab-router__nav--{{ mode }} d-flex align-items-center flex-nowrap\"\r\n [class.d-none]=\"tabs().length > 1\">\r\n @for (tab of tabs(); track tab.key) {\r\n <sd-tab-router-item [tab]=\"tab\" cdkDrag [cdkDragBoundary]=\"elementRef.nativeElement\"></sd-tab-router-item>\r\n }\r\n</div>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n booleanAttribute,\r\n Component,\r\n Injector,\r\n OnDestroy,\r\n Type,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n createNgModule,\r\n NgModuleFactory,\r\n} from '@angular/core';\r\nimport {\r\n ActivatedRoute,\r\n ActivatedRouteSnapshot,\r\n NavigationEnd,\r\n Router,\r\n RouterOutlet,\r\n RouterEvent,\r\n RoutesRecognized,\r\n} from '@angular/router';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { Subject, Subscription, isObservable, lastValueFrom } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\nimport { SdNotifyService } from '@sd-angular/core/services/notify';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\nimport { SdTabActivated, SdTabDeactivated } from '../../events/tab-router.event';\r\nimport { SdTabAction } from '../../actions/tab-router.action';\r\nimport { SdTab } from '../../models';\r\nimport { SdTabDecoratorService } from '../../services/tab-decorator.service';\r\nimport { SdTabRouterService } from '../../services/tab-router.service';\r\nimport { SdTabRouterNavComponent } from '../tab-router-nav/tab-router-nav.component';\r\n\r\n// eslint-disable-next-line @angular-eslint/no-unused-standalone-imports\r\n@Component({\r\n selector: 'sd-tab-router-outlet',\r\n templateUrl: './tab-router-outlet.component.html',\r\n styleUrls: ['./tab-router-outlet.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, MatTooltipModule, RouterOutlet, SdTabRouterNavComponent],\r\n})\r\nexport class SdTabRouterOutletComponent implements OnDestroy {\r\n disabled = input(false, { transform: booleanAttribute });\r\n\r\n tabRouterNav = viewChild<SdTabRouterNavComponent>('tabRouterNav');\r\n\r\n tabs = signal<SdTab[]>([]);\r\n\r\n #router = inject(Router);\r\n #activatedRoute = inject(ActivatedRoute);\r\n #injector = inject(Injector);\r\n #tabRouterService = inject(SdTabRouterService);\r\n #sdNotifyService = inject(SdNotifyService);\r\n // Inject để đảm bảo SdTabDecoratorService được khởi tạo (nó register BehaviorSubject\r\n // tĩnh để @SdTab decorator có thể truy cập SdTabRouterService). Không dùng trực tiếp ở đây.\r\n #tabDecoratorService = inject(SdTabDecoratorService);\r\n\r\n #rootRoute?: ActivatedRoute;\r\n #subscription = new Subscription();\r\n\r\n // State của navigation hiện tại (replaceTab, switchTab, ...) được capture ở RoutesRecognized\r\n // và dùng lại ở NavigationEnd. Lý do: tại NavigationEnd, getCurrentNavigation() đã trả về null,\r\n // còn lastSuccessfulNavigation và window.history.state không đáng tin cậy với mọi case.\r\n #pendingNavigationState: Record<string, any> = {};\r\n\r\n constructor() {\r\n this.#subscription.add(\r\n this.#router.events\r\n .pipe(\r\n // Một số event của Angular bọc trong wrapper có .routerEvent → unwrap về RouterEvent gốc.\r\n map((event: any) => (event instanceof RouterEvent ? event : event.routerEvent)),\r\n // Hybrid: cần CẢ HAI event vì mỗi event chứa data khác nhau ở thời điểm khác nhau.\r\n // - RoutesRecognized: navigation đang in-flight → getCurrentNavigation().extras.state đọc được\r\n // - NavigationEnd: navigation hoàn tất → routerState.root đã update với route mới (cần cho lazy routes)\r\n filter(event => event instanceof RoutesRecognized || event instanceof NavigationEnd)\r\n )\r\n .subscribe(async (event: any) => {\r\n if (this.disabled()) {\r\n this.#pendingNavigationState = {};\r\n return;\r\n }\r\n\r\n if (event instanceof RoutesRecognized) {\r\n // Capture state ngay lúc nav còn in-flight. Đây là điểm duy nhất chắc chắn\r\n // getCurrentNavigation() trả về Navigation object với extras.state nguyên vẹn.\r\n this.#pendingNavigationState = this.#router.getCurrentNavigation()?.extras?.state ?? {};\r\n return;\r\n }\r\n // NavigationEnd: dùng activatedRoute.snapshot và routerState.root MỚI nhất\r\n // (chứa route component đã được activate, cả lazy lẫn standalone routes).\r\n const route = this.#getActivatedRouteSnapshot(this.#activatedRoute.snapshot);\r\n this.#rootRoute = this.#router.routerState.root;\r\n await this.#activeRoute(event.urlAfterRedirects || event.url, route, this.#pendingNavigationState);\r\n this.#pendingNavigationState = {};\r\n })\r\n );\r\n\r\n this.#subscription.add(\r\n this.#tabRouterService.actions.subscribe((event: SdTabAction | undefined) => {\r\n if (this.disabled()) return;\r\n\r\n if (event?.type === 'close') {\r\n this.#closeTab(event.tab);\r\n }\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n tabTrackBy = (index: number, tab: SdTab) => tab.key;\r\n\r\n #closeTab = (tab: SdTab) => {\r\n if (this.disabled()) return;\r\n\r\n const currentTabs = this.tabs();\r\n const { isActive, key: activeKey } = tab;\r\n\r\n if (isActive) {\r\n const activeIndex = currentTabs.findIndex(({ key }) => key === activeKey);\r\n const nextTab = currentTabs[activeIndex + 1] || currentTabs[activeIndex - 1];\r\n\r\n this.tabs.set(currentTabs.filter(({ key }) => key !== activeKey));\r\n\r\n if (nextTab) {\r\n this.#router.navigate([nextTab.url], {\r\n queryParams: { ...(nextTab.queryParams || {}) },\r\n state: { switchTab: true },\r\n });\r\n } else {\r\n this.#router.navigateByUrl('/', { state: { switchTab: true } });\r\n }\r\n } else {\r\n this.tabs.set(currentTabs.filter(({ key }) => key !== tab.key));\r\n this.tabRouterNav()?.checkUI();\r\n }\r\n };\r\n\r\n #activeRoute = async (\r\n fullUrl: string,\r\n route: ActivatedRouteSnapshot | null,\r\n state: Record<string, any> = {}\r\n ) => {\r\n if (this.disabled()) return;\r\n if (!route?.component) return;\r\n\r\n const component = route.component as Type<any>;\r\n const queryParams = { ...(route.queryParams || {}) };\r\n const params = { ...(route.params || {}) };\r\n const data = { ...(route.data || {}) };\r\n const [url] = fullUrl.split('?');\r\n // Tab identity = hash(url + queryParams). Cùng key = cùng tab, không tạo lại.\r\n const key = SdUtilities.hash({ url, queryParams });\r\n\r\n let existedIndex = -1;\r\n let activatedIndex = -1;\r\n\r\n const currentTabs = this.tabs();\r\n\r\n // QUAN TRỌNG: scan READ-ONLY, KHÔNG mutate tab.isActive trong loop này.\r\n //\r\n // Lý do: NavigationEnd có thể fire nhiều lần cho 1 user-action (do nested outlets,\r\n // redirect, hoặc Angular internal). Vì #activeRoute là async (await getBestInjector),\r\n // 2 invocations có thể chạy concurrent và interleave với nhau.\r\n //\r\n // Nếu mutate tab.isActive = false ở đây, call thứ 2 sẽ thấy isActive đã bị call 1\r\n // set false rồi → không tìm thấy active tab → activatedIndex stay -1 → splice bỏ qua\r\n // → tab cũ không bị remove → xuất hiện duplicate tabs.\r\n //\r\n // Cách fix: chỉ ĐỌC isActive, sau đó dùng .map() ở dưới để tạo tab objects mới qua spread.\r\n for (let i = 0; i < currentTabs.length; i++) {\r\n const tab = currentTabs[i];\r\n if (tab.key === key) {\r\n existedIndex = i;\r\n } else if (tab.isActive) {\r\n activatedIndex = i;\r\n this.#tabRouterService.pushEvent(tab, SdTabDeactivated);\r\n }\r\n }\r\n\r\n const replaceTab = state['replaceTab'];\r\n\r\n // Resolve injector phù hợp với route. Cần xử lý 3 trường hợp:\r\n // - Standalone route (Angular đã set _injector trên routeConfig sau khi activate)\r\n // - NgModule lazy load (cần createNgModule từ class)\r\n // - Fallback: root injector\r\n const getBestInjector = async (snapshot: ActivatedRouteSnapshot): Promise<Injector> => {\r\n // Standalone route: Angular tự lưu environment injector trên routeConfig._injector\r\n const routeInjector = (snapshot as any)._resolvedGui || (snapshot as any).routeConfig?._injector;\r\n if (routeInjector) return routeInjector;\r\n\r\n // NgModule lazy: phải gọi lại loadChildren() để lấy module class rồi createNgModule\r\n const loadChildren = snapshot.parent?.routeConfig?.loadChildren;\r\n if (typeof loadChildren === 'function') {\r\n let loaded: any = await loadChildren();\r\n\r\n if (isObservable(loaded)) {\r\n loaded = await lastValueFrom(loaded);\r\n }\r\n\r\n // ES module có thể export default\r\n if (loaded && typeof loaded === 'object' && 'default' in loaded) {\r\n loaded = loaded.default;\r\n }\r\n\r\n // Angular cũ: NgModuleFactory\r\n if (loaded instanceof NgModuleFactory) {\r\n return loaded.create(this.#injector).injector;\r\n }\r\n\r\n // Angular mới: NgModule class. Bọc try/catch vì createNgModule throw nếu không phải NgModule.\r\n if (typeof loaded === 'function' && !Array.isArray(loaded)) {\r\n try {\r\n return createNgModule(loaded, this.#injector).injector;\r\n } catch {\r\n return this.#injector;\r\n }\r\n }\r\n }\r\n return this.#injector;\r\n };\r\n\r\n const finalInjector = await getBestInjector(route);\r\n const activatedRoute = this.#getActivatedRoute(this.#rootRoute!, component);\r\n\r\n const newTab: SdTab = {\r\n key,\r\n component,\r\n injector: new SdOutletInjector(activatedRoute, finalInjector),\r\n isActive: true,\r\n url,\r\n params,\r\n queryParams,\r\n data,\r\n tabInfoChanges: new Subject(),\r\n };\r\n\r\n // Tạo updatedTabs qua spread thay vì mutate (xem lý do ở for loop phía trên).\r\n // Với tab có isActive không đổi: giữ nguyên reference (tránh trigger ngComponentOutlet\r\n // re-evaluate không cần thiết). Với tab cần đổi isActive: tạo object mới qua spread,\r\n // các nested fields (component, injector) vẫn giữ same reference nên component không bị recreate.\r\n let updatedTabs = currentTabs.map(tab => {\r\n if (tab.key === key) return tab.isActive ? tab : { ...tab, isActive: true };\r\n return tab.isActive ? { ...tab, isActive: false } : tab;\r\n });\r\n\r\n // replaceTab: thay vì mở tab mới song song, xoá tab đang active rồi mở tab mới ở cuối.\r\n // Use case: từ tab \"chi tiết\" bấm \"chỉnh sửa\" với replaceTab → tab chi tiết bị xoá,\r\n // tab chỉnh sửa thay thế (giữ số tab không tăng).\r\n if (replaceTab && activatedIndex >= 0) {\r\n updatedTabs = updatedTabs.filter((_, i) => i !== activatedIndex);\r\n }\r\n\r\n if (existedIndex >= 0) {\r\n // Tab đã tồn tại (cùng url + queryParams) → CHỈ activate, KHÔNG thay tab object.\r\n // Lý do: thay tab object = đổi reference của tab.injector → ngComponentOutlet recreate\r\n // component → tab bị \"reload\" mỗi khi click lại hoặc navigate cùng URL.\r\n //\r\n // splice phía trên có thể đã shift index nếu activatedIndex < existedIndex.\r\n const idx = replaceTab && activatedIndex >= 0 && activatedIndex < existedIndex\r\n ? existedIndex - 1\r\n : existedIndex;\r\n this.#tabRouterService.setCurrentTab(updatedTabs[idx]);\r\n this.#tabRouterService.pushEvent(updatedTabs[idx], SdTabActivated);\r\n this.tabs.set(updatedTabs);\r\n } else {\r\n // Tab chưa tồn tại → thêm mới ở cuối.\r\n this.#tabRouterService.setCurrentTab(newTab);\r\n this.tabs.set([...updatedTabs, newTab]);\r\n\r\n if (this.tabs().length > 30) {\r\n this.#sdNotifyService.warning('Bạn đã mở quá nhiều tab.');\r\n }\r\n }\r\n\r\n this.tabRouterNav()?.checkUI();\r\n };\r\n\r\n // Lần xuống deepest firstChild để lấy snapshot của route lá (route thực sự render component).\r\n #getActivatedRouteSnapshot = (snapshot: ActivatedRouteSnapshot): ActivatedRouteSnapshot | null => {\r\n let node = snapshot;\r\n while (node.firstChild) node = node.firstChild;\r\n return node;\r\n };\r\n\r\n // DFS tìm ActivatedRoute (không phải snapshot) trong tree theo component class.\r\n // Cần ActivatedRoute thật vì SdOutletInjector sẽ inject nó vào component qua DI.\r\n #getActivatedRoute = (activatedRoute: ActivatedRoute, component: any): ActivatedRoute | null => {\r\n if (activatedRoute.component === component) return activatedRoute;\r\n for (const child of activatedRoute.children) {\r\n const result = this.#getActivatedRoute(child, component);\r\n if (result) return result;\r\n }\r\n return null;\r\n };\r\n}\r\n\r\n// Custom Injector cho từng tab: override ActivatedRoute thành route của TAB ĐÓ\r\n// (không phải route hiện tại của router). Nếu không override, mọi tab sẽ inject ActivatedRoute\r\n// của route đang active → component cũ trong tab inactive nhận data sai khi user navigate.\r\nclass SdOutletInjector implements Injector {\r\n constructor(\r\n private route: ActivatedRoute | null,\r\n private parentInjector: Injector\r\n ) {}\r\n\r\n get(token: any, notFoundValue?: any): any {\r\n if (token === ActivatedRoute) {\r\n return this.route || notFoundValue;\r\n }\r\n return this.parentInjector.get(token, notFoundValue);\r\n }\r\n}\r\n","@if (disabled()) {\r\n <div class=\"tab-router__disabled-outlet\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n} @else {\r\n <sd-tab-router-nav [tabs]=\"tabs()\" #tabRouterNav></sd-tab-router-nav>\r\n <div class=\"tab-router__list\">\r\n @for (tab of tabs(); track tab.key) {\r\n <div class=\"tab-router__pane\" [class.active]=\"tab.isActive\" [id]=\"tab.key\">\r\n <div class=\"tab-router__content\">\r\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\r\n </div>\r\n </div>\r\n } @empty {\r\n <div class=\"tab-router__empty\">\r\n </div>\r\n }\r\n </div>\r\n}","import { Type } from '@angular/core';\r\nimport { SdColor } from '@sd-angular/core/utilities/models';\r\nimport { filter, take } from 'rxjs/operators';\r\nimport { SdTabDecoratorService } from '../services/tab-decorator.service';\r\n\r\nexport interface SdTabComponentArgs {\r\n url?: string;\r\n params?: any;\r\n queryParams?: any;\r\n data?: Record<string, any>;\r\n}\r\n\r\nexport declare interface SdTabComponentBuilder {\r\n component: Type<any>;\r\n name: string | ((args: SdTabComponentArgs) => string);\r\n icon?: string | ((args: SdTabComponentArgs) => string);\r\n tooltip?: string | ((args: SdTabComponentArgs) => string);\r\n color?: SdColor | ((args: SdTabComponentArgs) => SdColor);\r\n}\r\n\r\nexport function SdTabComponent<T>(builder: SdTabComponentBuilder) {\r\n return (constructor: T) => {\r\n SdTabDecoratorService.tabRouterService\r\n .pipe(\r\n filter(service => service !== undefined && service !== null),\r\n take(1)\r\n )\r\n .subscribe(service => {\r\n service.addBuilder(builder);\r\n });\r\n };\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.SdTabRouterService","i1"],"mappings":"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"}