quang 19.0.27 → 20.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +0 -1
  2. package/auth/README.md +10 -0
  3. package/auth/index.d.ts +195 -9
  4. package/auth/mobile/index.d.ts +5 -1
  5. package/components/autocomplete/index.d.ts +46 -1
  6. package/components/checkbox/index.d.ts +15 -1
  7. package/components/date/index.d.ts +89 -1
  8. package/components/input/index.d.ts +19 -1
  9. package/components/paginator/index.d.ts +68 -5
  10. package/components/select/index.d.ts +32 -1
  11. package/components/shared/index.d.ts +112 -4
  12. package/components/table/index.d.ts +70 -1
  13. package/components/wysiwyg/index.d.ts +51 -1
  14. package/device/index.d.ts +14 -1
  15. package/fesm2022/quang-auth.mjs +18 -18
  16. package/fesm2022/quang-auth.mjs.map +1 -1
  17. package/fesm2022/quang-components-autocomplete.mjs +7 -7
  18. package/fesm2022/quang-components-autocomplete.mjs.map +1 -1
  19. package/fesm2022/quang-components-checkbox.mjs +6 -6
  20. package/fesm2022/quang-components-checkbox.mjs.map +1 -1
  21. package/fesm2022/quang-components-date.mjs +5 -5
  22. package/fesm2022/quang-components-date.mjs.map +1 -1
  23. package/fesm2022/quang-components-input.mjs +6 -6
  24. package/fesm2022/quang-components-input.mjs.map +1 -1
  25. package/fesm2022/quang-components-paginator.mjs +15 -15
  26. package/fesm2022/quang-components-paginator.mjs.map +1 -1
  27. package/fesm2022/quang-components-select.mjs +6 -6
  28. package/fesm2022/quang-components-select.mjs.map +1 -1
  29. package/fesm2022/quang-components-shared.mjs +6 -6
  30. package/fesm2022/quang-components-shared.mjs.map +1 -1
  31. package/fesm2022/quang-components-table.mjs +3 -3
  32. package/fesm2022/quang-components-table.mjs.map +1 -1
  33. package/fesm2022/quang-components-wysiwyg.mjs +6 -6
  34. package/fesm2022/quang-components-wysiwyg.mjs.map +1 -1
  35. package/fesm2022/quang-device.mjs +3 -3
  36. package/fesm2022/quang-device.mjs.map +1 -1
  37. package/fesm2022/quang-loader.mjs +7 -8
  38. package/fesm2022/quang-loader.mjs.map +1 -1
  39. package/fesm2022/quang-overlay-modal.mjs +3 -3
  40. package/fesm2022/quang-overlay-modal.mjs.map +1 -1
  41. package/fesm2022/quang-overlay-popover.mjs +8 -8
  42. package/fesm2022/quang-overlay-popover.mjs.map +1 -1
  43. package/fesm2022/quang-overlay-shared.mjs +10 -11
  44. package/fesm2022/quang-overlay-shared.mjs.map +1 -1
  45. package/fesm2022/quang-overlay-toast.mjs +8 -8
  46. package/fesm2022/quang-overlay-toast.mjs.map +1 -1
  47. package/fesm2022/quang-overlay-tooltip.mjs +6 -6
  48. package/fesm2022/quang-overlay-tooltip.mjs.map +1 -1
  49. package/fesm2022/quang-translation.mjs +6 -6
  50. package/fesm2022/quang-translation.mjs.map +1 -1
  51. package/forms/index.d.ts +51 -2
  52. package/index.d.ts +13 -9
  53. package/loader/index.d.ts +69 -4
  54. package/overlay/modal/index.d.ts +34 -1
  55. package/overlay/popover/index.d.ts +25 -1
  56. package/overlay/shared/index.d.ts +116 -3
  57. package/overlay/toast/index.d.ts +45 -2
  58. package/overlay/tooltip/index.d.ts +23 -2
  59. package/package.json +31 -31
  60. package/shared/index.d.ts +16 -1
  61. package/translation/index.d.ts +62 -4
  62. package/auth/auth-providers.d.ts +0 -39
  63. package/auth/auth.service.d.ts +0 -52
  64. package/auth/directives/has-at-least-one-role.directive.d.ts +0 -26
  65. package/auth/directives/has-every-role.directive.d.ts +0 -26
  66. package/auth/directives/is-authenticated.directive.d.ts +0 -14
  67. package/auth/directives/is-not-authenticated.directive.d.ts +0 -14
  68. package/auth/guards/index.d.ts +0 -2
  69. package/auth/guards/is-allowed.guard.d.ts +0 -2
  70. package/auth/guards/is-authenticated.guard.d.ts +0 -2
  71. package/auth/logout-on-error.interceptor.d.ts +0 -9
  72. package/auth/mobile/mobile-auth-feature.d.ts +0 -2
  73. package/auth/token-storage/index.d.ts +0 -3
  74. package/auth/token-storage/local-storage-feature.d.ts +0 -2
  75. package/auth/token-storage/memory-storage-feature.d.ts +0 -12
  76. package/auth/token-storage/session-storage-feature.d.ts +0 -2
  77. package/components/autocomplete/autocomplete.component.d.ts +0 -43
  78. package/components/checkbox/checkbox.component.d.ts +0 -11
  79. package/components/date/date.component.d.ts +0 -85
  80. package/components/input/input.component.d.ts +0 -15
  81. package/components/paginator/paginator-language.service.d.ts +0 -10
  82. package/components/paginator/paginator.component.d.ts +0 -30
  83. package/components/paginator/paginator.module.d.ts +0 -7
  84. package/components/paginator/paginator.service.d.ts +0 -6
  85. package/components/paginator/paginatorIntl.d.ts +0 -12
  86. package/components/select/select.component.d.ts +0 -29
  87. package/components/shared/ErrorData.d.ts +0 -4
  88. package/components/shared/makeId.d.ts +0 -1
  89. package/components/shared/option-list/option-list.component.d.ts +0 -53
  90. package/components/shared/quang-base-component.directive.d.ts +0 -50
  91. package/components/table/table.component.d.ts +0 -66
  92. package/components/wysiwyg/wysiwyg.component.d.ts +0 -46
  93. package/device/resize-observable.service.d.ts +0 -11
  94. package/forms/form-group-model.d.ts +0 -18
  95. package/forms/validators.d.ts +0 -43
  96. package/loader/loader-providers.d.ts +0 -23
  97. package/loader/loader.component.d.ts +0 -23
  98. package/loader/loader.interceptor.d.ts +0 -10
  99. package/loader/loader.service.d.ts +0 -9
  100. package/overlay/modal/modal.component.d.ts +0 -29
  101. package/overlay/popover/popover.component.d.ts +0 -13
  102. package/overlay/popover/popover.directive.d.ts +0 -11
  103. package/overlay/shared/CustomViewportRuler.d.ts +0 -63
  104. package/overlay/shared/quang-base-overlay.component.d.ts +0 -9
  105. package/overlay/shared/quang-base-overlay.directive.d.ts +0 -44
  106. package/overlay/toast/toast.component.d.ts +0 -13
  107. package/overlay/toast/toast.service.d.ts +0 -27
  108. package/overlay/tooltip/tooltip.component.d.ts +0 -11
  109. package/overlay/tooltip/tooltip.directive.d.ts +0 -11
  110. package/shared/intercept-utils.d.ts +0 -13
  111. package/translation/translation-loader.service.d.ts +0 -10
  112. package/translation/translation-providers.d.ts +0 -28
  113. package/translation/translation.service.d.ts +0 -15
  114. package/translation/translations.tokens.d.ts +0 -5
@@ -128,10 +128,10 @@ class QuangBaseComponent {
128
128
  ngAfterViewInit() {
129
129
  this.setupFormControl();
130
130
  }
131
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QuangBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
132
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.14", type: QuangBaseComponent, isStandalone: true, inputs: { componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, isReadonly: { classPropertyName: "isReadonly", publicName: "isReadonly", isSignal: true, isRequired: false, transformFunction: null }, componentTabIndex: { classPropertyName: "componentTabIndex", publicName: "componentTabIndex", isSignal: true, isRequired: false, transformFunction: null }, componentClass: { classPropertyName: "componentClass", publicName: "componentClass", isSignal: true, isRequired: false, transformFunction: null }, componentLabel: { classPropertyName: "componentLabel", publicName: "componentLabel", isSignal: true, isRequired: false, transformFunction: null }, componentPlaceholder: { classPropertyName: "componentPlaceholder", publicName: "componentPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, errorMap: { classPropertyName: "errorMap", publicName: "errorMap", isSignal: true, isRequired: false, transformFunction: null }, successMessage: { classPropertyName: "successMessage", publicName: "successMessage", isSignal: true, isRequired: false, transformFunction: null }, helpMessage: { classPropertyName: "helpMessage", publicName: "helpMessage", isSignal: true, isRequired: false, transformFunction: null }, formControl: { classPropertyName: "formControl", publicName: "formControl", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { componentBlur: "componentBlur" }, ngImport: i0 }); }
131
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: QuangBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
132
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.0.0", type: QuangBaseComponent, isStandalone: true, inputs: { componentId: { classPropertyName: "componentId", publicName: "componentId", isSignal: true, isRequired: false, transformFunction: null }, isReadonly: { classPropertyName: "isReadonly", publicName: "isReadonly", isSignal: true, isRequired: false, transformFunction: null }, componentTabIndex: { classPropertyName: "componentTabIndex", publicName: "componentTabIndex", isSignal: true, isRequired: false, transformFunction: null }, componentClass: { classPropertyName: "componentClass", publicName: "componentClass", isSignal: true, isRequired: false, transformFunction: null }, componentLabel: { classPropertyName: "componentLabel", publicName: "componentLabel", isSignal: true, isRequired: false, transformFunction: null }, componentPlaceholder: { classPropertyName: "componentPlaceholder", publicName: "componentPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, errorMap: { classPropertyName: "errorMap", publicName: "errorMap", isSignal: true, isRequired: false, transformFunction: null }, successMessage: { classPropertyName: "successMessage", publicName: "successMessage", isSignal: true, isRequired: false, transformFunction: null }, helpMessage: { classPropertyName: "helpMessage", publicName: "helpMessage", isSignal: true, isRequired: false, transformFunction: null }, formControl: { classPropertyName: "formControl", publicName: "formControl", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { componentBlur: "componentBlur" }, ngImport: i0 }); }
133
133
  }
134
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QuangBaseComponent, decorators: [{
134
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: QuangBaseComponent, decorators: [{
135
135
  type: Directive
136
136
  }], ctorParameters: () => [] });
137
137
 
@@ -401,10 +401,10 @@ class QuangOptionListComponent {
401
401
  this.elementTop.set(topValue);
402
402
  this.elementBottom.set(bottomValue);
403
403
  }
404
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QuangOptionListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
405
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: QuangOptionListComponent, isStandalone: true, selector: "quang-option-list", inputs: { selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, optionListMaxHeight: { classPropertyName: "optionListMaxHeight", publicName: "optionListMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, selectOptions: { classPropertyName: "selectOptions", publicName: "selectOptions", isSignal: true, isRequired: false, transformFunction: null }, selectButtonRef: { classPropertyName: "selectButtonRef", publicName: "selectButtonRef", isSignal: true, isRequired: true, transformFunction: null }, _value: { classPropertyName: "_value", publicName: "_value", isSignal: true, isRequired: false, transformFunction: null }, _isDisabled: { classPropertyName: "_isDisabled", publicName: "_isDisabled", isSignal: true, isRequired: false, transformFunction: null }, componentClass: { classPropertyName: "componentClass", publicName: "componentClass", isSignal: true, isRequired: false, transformFunction: null }, componentLabel: { classPropertyName: "componentLabel", publicName: "componentLabel", isSignal: true, isRequired: false, transformFunction: null }, componentTabIndex: { classPropertyName: "componentTabIndex", publicName: "componentTabIndex", isSignal: true, isRequired: false, transformFunction: null }, translateValue: { classPropertyName: "translateValue", publicName: "translateValue", isSignal: true, isRequired: false, transformFunction: null }, nullOption: { classPropertyName: "nullOption", publicName: "nullOption", isSignal: true, isRequired: false, transformFunction: null }, scrollBehaviorOnOpen: { classPropertyName: "scrollBehaviorOnOpen", publicName: "scrollBehaviorOnOpen", isSignal: true, isRequired: false, transformFunction: null }, parentType: { classPropertyName: "parentType", publicName: "parentType", isSignal: true, isRequired: true, transformFunction: null }, parentID: { classPropertyName: "parentID", publicName: "parentID", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changedHandler: "changedHandler", blurHandler: "blurHandler" }, host: { listeners: { "window:scroll": "changePosition()" } }, viewQueries: [{ propertyName: "optionListContainer", first: true, predicate: ["optionListContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n [ngStyle]=\"{\n 'max-height': optionListMaxHeight(),\n '--option-list-width': elementWidth(),\n '--option-list-top': elementTop(),\n '--option-list-bottom': elementBottom(),\n }\"\n (blur)=\"onBlurHandler($event)\"\n #optionListContainer\n class=\"option-list\"\n id=\"optionList\"\n tabindex=\"1\"\n>\n <ul>\n @for (item of selectOptionsList(); track i; let i = $index; let last = $last) {\n <li\n [class.m-0]=\"last\"\n [class.selected]=\"selectionMode() === 'single' ? getSelected(item) : null\"\n [id]=\"'item-' + i\"\n (mousedown)=\"$event.stopImmediatePropagation(); onSelectItem(item)\"\n class=\"item\"\n >\n <input\n [checked]=\"getSelected(item)\"\n [class.d-none]=\"selectionMode() === 'single' || !item?.value\"\n [disabled]=\"true\"\n [id]=\"i + '-' + item.value + '-checkbox'\"\n [name]=\"i + '-' + item.value + '-checkbox'\"\n [ngClass]=\"componentClass()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"getSelected(item)\"\n (blur)=\"onBlurHandler($event)\"\n #inputCheckbox\n class=\"form-check-input opacity-100\"\n type=\"checkbox\"\n />\n <label\n [class.ms-3]=\"selectionMode() === 'multiple' && item?.value\"\n [for]=\"i + '-' + item.value + '-checkbox'\"\n class=\"form-check-label checkbox-label w-100 opacity-100\"\n >\n {{ translateValue() ? (item.label | transloco) : item.label }}\n </label>\n </li>\n }\n </ul>\n</div>\n", styles: [":host{display:block;z-index:999}.option-list{--option-list-width: 100%;--option-list-top: 10px;--option-list-bottom: unset;border:1px solid var(--bs-border-color);border-top:0;border-radius:var(--bs-border-radius);overflow:auto;position:fixed;width:var(--option-list-width);top:var(--option-list-top);bottom:var(--option-list-bottom);z-index:999}.option-list ul{margin:0;padding:0}.option-list .selected{background-color:var(--bs-body-bg);filter:brightness(95%)}.option-list.option-list-top{border-top:1px solid var(--bs-border-color);border-bottom:0}.option-list:focus-visible{outline:none}.item{display:flex;background-color:var(--bs-body-bg);z-index:1;padding:0 .5rem;min-height:2.5rem}.item label{padding:.5rem 0}.item:hover{cursor:pointer;background-color:var(--bs-body-bg);filter:brightness(95%)}.item *:hover{cursor:pointer}.item .form-check-input{align-self:center}.item .form-check-input:focus{border-color:var(--bs-border-color);box-shadow:unset}.item .form-check-input:checked{background-color:var(--bs-primary);border-color:var(--bs-border-color)}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
404
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: QuangOptionListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
405
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.0", type: QuangOptionListComponent, isStandalone: true, selector: "quang-option-list", inputs: { selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, optionListMaxHeight: { classPropertyName: "optionListMaxHeight", publicName: "optionListMaxHeight", isSignal: true, isRequired: false, transformFunction: null }, selectOptions: { classPropertyName: "selectOptions", publicName: "selectOptions", isSignal: true, isRequired: false, transformFunction: null }, selectButtonRef: { classPropertyName: "selectButtonRef", publicName: "selectButtonRef", isSignal: true, isRequired: true, transformFunction: null }, _value: { classPropertyName: "_value", publicName: "_value", isSignal: true, isRequired: false, transformFunction: null }, _isDisabled: { classPropertyName: "_isDisabled", publicName: "_isDisabled", isSignal: true, isRequired: false, transformFunction: null }, componentClass: { classPropertyName: "componentClass", publicName: "componentClass", isSignal: true, isRequired: false, transformFunction: null }, componentLabel: { classPropertyName: "componentLabel", publicName: "componentLabel", isSignal: true, isRequired: false, transformFunction: null }, componentTabIndex: { classPropertyName: "componentTabIndex", publicName: "componentTabIndex", isSignal: true, isRequired: false, transformFunction: null }, translateValue: { classPropertyName: "translateValue", publicName: "translateValue", isSignal: true, isRequired: false, transformFunction: null }, nullOption: { classPropertyName: "nullOption", publicName: "nullOption", isSignal: true, isRequired: false, transformFunction: null }, scrollBehaviorOnOpen: { classPropertyName: "scrollBehaviorOnOpen", publicName: "scrollBehaviorOnOpen", isSignal: true, isRequired: false, transformFunction: null }, parentType: { classPropertyName: "parentType", publicName: "parentType", isSignal: true, isRequired: true, transformFunction: null }, parentID: { classPropertyName: "parentID", publicName: "parentID", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changedHandler: "changedHandler", blurHandler: "blurHandler" }, host: { listeners: { "window:scroll": "changePosition()" } }, viewQueries: [{ propertyName: "optionListContainer", first: true, predicate: ["optionListContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n [ngStyle]=\"{\n 'max-height': optionListMaxHeight(),\n '--option-list-width': elementWidth(),\n '--option-list-top': elementTop(),\n '--option-list-bottom': elementBottom(),\n }\"\n (blur)=\"onBlurHandler($event)\"\n #optionListContainer\n class=\"option-list\"\n id=\"optionList\"\n tabindex=\"1\"\n>\n <ul>\n @for (item of selectOptionsList(); track i; let i = $index; let last = $last) {\n <li\n [class.m-0]=\"last\"\n [class.selected]=\"selectionMode() === 'single' ? getSelected(item) : null\"\n [id]=\"'item-' + i\"\n (mousedown)=\"$event.stopImmediatePropagation(); onSelectItem(item)\"\n class=\"item\"\n >\n <input\n [checked]=\"getSelected(item)\"\n [class.d-none]=\"selectionMode() === 'single' || !item?.value\"\n [disabled]=\"true\"\n [id]=\"i + '-' + item.value + '-checkbox'\"\n [name]=\"i + '-' + item.value + '-checkbox'\"\n [ngClass]=\"componentClass()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"getSelected(item)\"\n (blur)=\"onBlurHandler($event)\"\n #inputCheckbox\n class=\"form-check-input opacity-100\"\n type=\"checkbox\"\n />\n <label\n [class.ms-3]=\"selectionMode() === 'multiple' && item?.value\"\n [for]=\"i + '-' + item.value + '-checkbox'\"\n class=\"form-check-label checkbox-label w-100 opacity-100\"\n >\n {{ translateValue() ? (item.label | transloco) : item.label }}\n </label>\n </li>\n }\n </ul>\n</div>\n", styles: [":host{display:block;z-index:999}.option-list{--option-list-width: 100%;--option-list-top: 10px;--option-list-bottom: unset;border:1px solid var(--bs-border-color);border-top:0;border-radius:var(--bs-border-radius);overflow:auto;position:fixed;width:var(--option-list-width);top:var(--option-list-top);bottom:var(--option-list-bottom);z-index:999}.option-list ul{margin:0;padding:0}.option-list .selected{background-color:var(--bs-body-bg);filter:brightness(95%)}.option-list.option-list-top{border-top:1px solid var(--bs-border-color);border-bottom:0}.option-list:focus-visible{outline:none}.item{display:flex;background-color:var(--bs-body-bg);z-index:1;padding:0 .5rem;min-height:2.5rem}.item label{padding:.5rem 0}.item:hover{cursor:pointer;background-color:var(--bs-body-bg);filter:brightness(95%)}.item *:hover{cursor:pointer}.item .form-check-input{align-self:center}.item .form-check-input:focus{border-color:var(--bs-border-color);box-shadow:unset}.item .form-check-input:checked{background-color:var(--bs-primary);border-color:var(--bs-border-color)}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
406
406
  }
407
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QuangOptionListComponent, decorators: [{
407
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: QuangOptionListComponent, decorators: [{
408
408
  type: Component,
409
409
  args: [{ selector: 'quang-option-list', imports: [NgStyle, NgClass, TranslocoPipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [ngStyle]=\"{\n 'max-height': optionListMaxHeight(),\n '--option-list-width': elementWidth(),\n '--option-list-top': elementTop(),\n '--option-list-bottom': elementBottom(),\n }\"\n (blur)=\"onBlurHandler($event)\"\n #optionListContainer\n class=\"option-list\"\n id=\"optionList\"\n tabindex=\"1\"\n>\n <ul>\n @for (item of selectOptionsList(); track i; let i = $index; let last = $last) {\n <li\n [class.m-0]=\"last\"\n [class.selected]=\"selectionMode() === 'single' ? getSelected(item) : null\"\n [id]=\"'item-' + i\"\n (mousedown)=\"$event.stopImmediatePropagation(); onSelectItem(item)\"\n class=\"item\"\n >\n <input\n [checked]=\"getSelected(item)\"\n [class.d-none]=\"selectionMode() === 'single' || !item?.value\"\n [disabled]=\"true\"\n [id]=\"i + '-' + item.value + '-checkbox'\"\n [name]=\"i + '-' + item.value + '-checkbox'\"\n [ngClass]=\"componentClass()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"getSelected(item)\"\n (blur)=\"onBlurHandler($event)\"\n #inputCheckbox\n class=\"form-check-input opacity-100\"\n type=\"checkbox\"\n />\n <label\n [class.ms-3]=\"selectionMode() === 'multiple' && item?.value\"\n [for]=\"i + '-' + item.value + '-checkbox'\"\n class=\"form-check-label checkbox-label w-100 opacity-100\"\n >\n {{ translateValue() ? (item.label | transloco) : item.label }}\n </label>\n </li>\n }\n </ul>\n</div>\n", styles: [":host{display:block;z-index:999}.option-list{--option-list-width: 100%;--option-list-top: 10px;--option-list-bottom: unset;border:1px solid var(--bs-border-color);border-top:0;border-radius:var(--bs-border-radius);overflow:auto;position:fixed;width:var(--option-list-width);top:var(--option-list-top);bottom:var(--option-list-bottom);z-index:999}.option-list ul{margin:0;padding:0}.option-list .selected{background-color:var(--bs-body-bg);filter:brightness(95%)}.option-list.option-list-top{border-top:1px solid var(--bs-border-color);border-bottom:0}.option-list:focus-visible{outline:none}.item{display:flex;background-color:var(--bs-body-bg);z-index:1;padding:0 .5rem;min-height:2.5rem}.item label{padding:.5rem 0}.item:hover{cursor:pointer;background-color:var(--bs-body-bg);filter:brightness(95%)}.item *:hover{cursor:pointer}.item .form-check-input{align-self:center}.item .form-check-input:focus{border-color:var(--bs-border-color);box-shadow:unset}.item .form-check-input:checked{background-color:var(--bs-primary);border-color:var(--bs-border-color)}\n"] }]
410
410
  }], propDecorators: { changePosition: [{
@@ -1 +1 @@
1
- {"version":3,"file":"quang-components-shared.mjs","sources":["../../../projects/quang/components/shared/makeId.ts","../../../projects/quang/components/shared/quang-base-component.directive.ts","../../../projects/quang/components/shared/option-list/option-list.component.ts","../../../projects/quang/components/shared/option-list/option-list.component.html","../../../projects/quang/components/shared/quang-components-shared.ts"],"sourcesContent":["export const makeId = (length: number) => {\n let result = ''\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n const charactersLength = characters.length\n for (let i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength))\n }\n return result\n}\n","import { AfterViewInit, DestroyRef, Directive, Injector, computed, inject, input, output, signal } from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\nimport { ControlValueAccessor, FormControl, NgControl, Validators } from '@angular/forms'\n\nimport { Subscription } from 'rxjs'\n\nimport { ErrorData } from './ErrorData'\nimport { makeId } from './makeId'\n\n@Directive()\nexport abstract class QuangBaseComponent<T = any> implements ControlValueAccessor, AfterViewInit {\n componentId = input<string>(makeId(10))\n\n isReadonly = input<boolean>(false)\n\n isReadonly$ = toObservable(this.isReadonly)\n\n componentTabIndex = input<number>(0)\n\n componentClass = input<string | string[]>('')\n\n componentLabel = input<string>('')\n\n componentPlaceholder = input<string>('')\n\n errorMap = input<ErrorData[]>([])\n\n _errorMessagesByKey = computed(\n () => new Map((this.errorMap() ?? []).map((errorData) => [errorData.error, errorData.message]))\n )\n\n successMessage = input<string>('')\n\n helpMessage = input<string>('')\n\n formControl = input<FormControl>()\n\n componentBlur = output<void>()\n\n _value = signal<T | null>(null)\n\n _isRequired = signal<boolean>(false)\n\n _isDisabled = signal<boolean>(false)\n\n _isTouched = signal<boolean>(false)\n\n _isValid = signal<boolean>(false)\n\n _showSuccess = computed(() => this.successMessage() && this._isValid() && this._isTouched() && !this._isDisabled())\n\n _showErrors = computed(\n () => this.errorMap()?.length > 0 && !this._isValid() && this._isTouched() && !this._isDisabled()\n )\n\n _currentErrorMessage = signal<string>('')\n\n _currentErrorMessageExtraData = signal<Record<string, any>>({})\n\n _ngControl = signal<NgControl | null>(null)\n\n _injector = signal<Injector>(inject(Injector))\n\n _statusChange$?: Subscription\n\n getIsRequiredControl = computed(\n () => !!(this._ngControl()?.control as any)?._rawValidators?.find((x: any) => x.name === 'required')\n )\n\n onChange?: (value: T) => void\n\n onTouched?: () => void\n\n destroyRef = inject(DestroyRef)\n\n constructor() {\n toObservable(this.formControl)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((form) => {\n if (form) {\n this.setupFormControl()\n }\n })\n }\n\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn\n }\n\n writeValue(val: T): void {\n this._value.set(val)\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = () => {\n this._isTouched.set(true)\n fn()\n }\n }\n\n onChangedEventHandler($event: Event) {\n const inputElement = $event.target as HTMLInputElement\n this.onChangedHandler(inputElement.value as T)\n }\n\n onChangedHandler(value: T) {\n this._value.set(value)\n if (this.onChange) {\n this.onChange(value)\n }\n\n if (this.onTouched) {\n this.onTouched()\n }\n }\n\n onBlurHandler() {\n if (this.onTouched) {\n this.onTouched()\n }\n this.componentBlur.emit()\n }\n\n setupFormControl() {\n if (this._statusChange$) {\n this._statusChange$.unsubscribe()\n this._statusChange$ = undefined\n }\n\n this._ngControl.set(this._injector().get(NgControl))\n this._statusChange$ = this._ngControl()\n ?.control?.statusChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.checkFormErrors()\n })\n\n this._isTouched.set(this._ngControl()?.touched ?? false)\n this._isDisabled.set(this.isReadonly() || this._ngControl()?.disabled || false)\n this.checkFormErrors()\n }\n\n onChangeIsReadonly = this.isReadonly$.pipe(takeUntilDestroyed()).subscribe((isReadonly: boolean) => {\n this._isDisabled.set(isReadonly || this._ngControl()?.disabled || false)\n })\n\n setDisabledState(isDisabled: boolean) {\n this._isDisabled.set(isDisabled)\n }\n\n checkFormErrors() {\n const control = this._ngControl()?.control\n this._isValid.set(control?.valid ?? false)\n this._isTouched.set(!control?.pristine)\n\n const validationErrors = control?.errors\n\n this._isRequired.set(validationErrors?.[Validators.required.name])\n\n let errorName = ''\n let errorMessage = ''\n let errorData = true\n\n for (const [validationErrorName, validationErrorData] of Object.entries(validationErrors ?? {})) {\n const relatedErrorMessage = this._errorMessagesByKey().get(validationErrorName)\n if (relatedErrorMessage) {\n errorName = validationErrorName\n errorMessage = relatedErrorMessage\n errorData = validationErrorData\n }\n }\n\n this._currentErrorMessage.set(errorMessage)\n this._currentErrorMessageExtraData.set({ [errorName]: errorData })\n }\n\n ngAfterViewInit(): void {\n this.setupFormControl()\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NgClass, NgStyle } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport { QUANG_LOGGING_BEHAVIOR } from 'quang'\nimport { Subscription, fromEvent } from 'rxjs'\n\nexport interface SelectOption {\n label: string\n value: string | number | null\n}\n\nexport enum OptionListParentType {\n SELECT = 'select',\n AUTOCOMPLETE = 'autocomplete',\n}\n\n@Component({\n selector: 'quang-option-list',\n imports: [NgStyle, NgClass, TranslocoPipe],\n templateUrl: './option-list.component.html',\n styleUrl: './option-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class QuangOptionListComponent {\n logLevel = inject(QUANG_LOGGING_BEHAVIOR, { optional: true })\n\n selectionMode = input<'single' | 'multiple'>('single')\n\n optionListMaxHeight = input<string>('201px')\n\n selectOptions = input<SelectOption[]>([])\n\n selectButtonRef = input.required<HTMLButtonElement | HTMLInputElement>()\n\n _value = input<any>()\n\n _isDisabled = input<boolean>()\n\n componentClass = input<string | string[]>('')\n\n componentLabel = input<string>('')\n\n componentTabIndex = input<number>(0)\n\n translateValue = input<boolean>(false)\n\n nullOption = input<boolean>(true)\n\n elementWidth = signal<string>('0px')\n\n elementTop = signal<string>('0px')\n\n elementBottom = signal<string>('0px')\n\n scrollBehaviorOnOpen = input<ScrollBehavior>('smooth')\n\n changedHandler = output<any>()\n\n blurHandler = output<any>()\n\n optionListContainer = viewChild<ElementRef<HTMLDivElement>>('optionListContainer')\n\n destroyRef = inject(DestroyRef)\n\n parentType = input.required<OptionListParentType>()\n\n parentID = input<string>('')\n\n searchString = signal<string>('')\n\n searchResetTimer: ReturnType<typeof setTimeout> | null = null\n\n selectButtonRef$ = toObservable(this.selectButtonRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.getOptionListWidth()\n this.getOptionListTop()\n this.getScrollParent(this.selectButtonRef())?.addEventListener('scroll', () => {\n this.getOptionListWidth()\n this.getOptionListTop()\n })\n })\n\n selectOptionsList = computed(() => {\n if (this.nullOption() && this.selectionMode() === 'single') {\n return [\n {\n label: '',\n value: null,\n },\n ...this.selectOptions(),\n ]\n }\n return [...this.selectOptions()]\n })\n\n onKeyDown: Subscription | null = null\n\n selectedElementIndex = computed<number>(\n () => this.selectOptionsList()?.findIndex((x) => x?.value === this._value()) ?? 0\n )\n\n optionList$ = effect(() => {\n const optionListContainer = this.optionListContainer()\n if (optionListContainer && this.parentType() === OptionListParentType.SELECT) {\n optionListContainer?.nativeElement.focus()\n const optionListContainerNativeElement = optionListContainer?.nativeElement\n if (optionListContainerNativeElement) {\n const ul = optionListContainerNativeElement?.children[0] as HTMLUListElement\n const listItem = ul?.children.item(this.selectedElementIndex()) as HTMLLIElement | undefined\n if (listItem) {\n setTimeout(() => {\n listItem.scrollIntoView({ behavior: this.scrollBehaviorOnOpen() })\n }, 0)\n }\n }\n }\n const ul = optionListContainer?.nativeElement?.children[0] as HTMLUListElement | undefined\n const listItems = (ul?.children ?? []) as HTMLLIElement[]\n let currentIndex = this.selectedElementIndex()\n listItems?.[currentIndex]?.classList.add('selected')\n\n if (this.onKeyDown) {\n this.onKeyDown.unsubscribe()\n }\n\n this.onKeyDown = fromEvent(document, 'keydown', {\n capture: true,\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n switch ((event as KeyboardEvent).key) {\n case 'ArrowDown': {\n if (this.parentType() === OptionListParentType.AUTOCOMPLETE) optionListContainer?.nativeElement.focus()\n if (currentIndex !== this.selectedElementIndex()) listItems[currentIndex]?.classList.remove('selected')\n if (currentIndex === listItems.length - 1) {\n currentIndex = listItems.length - 1\n } else {\n currentIndex += 1\n }\n if (currentIndex === 0) {\n event.preventDefault()\n optionListContainer?.nativeElement?.scroll(0, 0)\n }\n const optionListBottom = optionListContainer?.nativeElement?.getBoundingClientRect()?.bottom ?? 0\n const itemListHeight = optionListContainer?.nativeElement?.children?.[0]?.children\n ?.item(currentIndex)\n ?.getBoundingClientRect()?.height\n const itemListBottom = optionListContainer?.nativeElement?.children?.[0]?.children\n ?.item(currentIndex)\n ?.getBoundingClientRect()?.bottom\n if (optionListBottom > (itemListBottom ?? 0) + (itemListHeight ?? 0)) event.preventDefault()\n\n listItems[currentIndex]?.classList.add('selected')\n if (\n (optionListContainer?.nativeElement?.scrollTop ?? 0) >=\n (optionListContainer?.nativeElement?.scrollHeight ?? 0) -\n (optionListContainer?.nativeElement?.offsetHeight ?? 0)\n ) {\n event.preventDefault()\n }\n break\n }\n case 'ArrowUp': {\n if (this.parentType() === OptionListParentType.AUTOCOMPLETE) optionListContainer?.nativeElement.focus()\n if (currentIndex !== this.selectedElementIndex()) listItems[currentIndex]?.classList.remove('selected')\n if (currentIndex !== 0) currentIndex -= 1\n const optionListTop = optionListContainer?.nativeElement?.getBoundingClientRect()?.top ?? 0\n const itemListHeight = optionListContainer?.nativeElement?.children?.[0]?.children\n ?.item(currentIndex)\n ?.getBoundingClientRect()?.height\n const itemListTop = optionListContainer?.nativeElement?.children?.[0]?.children\n ?.item(currentIndex)\n ?.getBoundingClientRect()?.top\n if (optionListTop < (itemListTop ?? 0) - (itemListHeight ?? 0)) event.preventDefault()\n listItems[currentIndex]?.classList.add('selected')\n if (!optionListContainer?.nativeElement?.scrollTop) {\n event.preventDefault()\n }\n break\n }\n case 'Enter': {\n this.onSelectItem(this.selectOptionsList()[currentIndex])\n break\n }\n default: {\n if (\n ((event as KeyboardEvent)?.key?.length === 1 || (event as KeyboardEvent)?.key === 'Backspace') &&\n this.parentType() === OptionListParentType.AUTOCOMPLETE &&\n document.activeElement?.id === optionListContainer?.nativeElement?.id\n ) {\n currentIndex = 0\n document.getElementById(this.parentID())?.focus()\n document.getElementById(this.parentID())?.click()\n } else if (\n (event as KeyboardEvent)?.key?.length === 1 &&\n this.parentType() === OptionListParentType.SELECT\n ) {\n const key = (event as KeyboardEvent).key\n currentIndex = this.handleSearch(key, listItems, currentIndex)\n event.preventDefault()\n }\n break\n }\n }\n })\n })\n\n handleSearch(key: string, listItems: HTMLLIElement[], currentIndex: number): number {\n if (this.searchResetTimer) {\n clearTimeout(this.searchResetTimer)\n }\n\n this.searchString.update((current) => current + key)\n\n this.searchResetTimer = setTimeout(() => {\n this.searchString.set('')\n this.searchResetTimer = null\n }, 500)\n\n const searchStr = this.searchString().toLowerCase()\n const matchIndex = this.selectOptionsList().findIndex((option) => option.label.toLowerCase().includes(searchStr))\n\n if (matchIndex !== -1 && matchIndex !== currentIndex) {\n listItems[currentIndex]?.classList.remove('selected')\n listItems[matchIndex]?.classList.add('selected')\n listItems[matchIndex]?.scrollIntoView({ behavior: this.scrollBehaviorOnOpen() })\n return matchIndex\n }\n\n return currentIndex\n }\n\n @HostListener('window:scroll') changePosition() {\n this.getOptionListWidth()\n this.getOptionListTop()\n }\n\n isScrollable(ele: Element): boolean {\n if (!ele) return false\n\n let result = false\n\n try {\n const hasScrollableContent = ele.scrollHeight > ele.clientHeight\n\n const overflowYStyle = window.getComputedStyle(ele).overflowY\n const isOverflowHidden = overflowYStyle.includes('hidden')\n\n result = hasScrollableContent && !isOverflowHidden\n } catch (_error) {\n if (this.logLevel === 'verbose') console.error('captured error isScrollable', _error)\n }\n\n return result\n }\n\n getScrollParent(node: unknown): Element {\n if (!node || node === document.body || !(node instanceof Element)) return document.body\n return this.isScrollable(node) ? node : this.getScrollParent(node.parentNode)\n }\n\n onSelectItem(item: SelectOption | null): void {\n if (this.selectionMode() === 'single') {\n this.changedHandler.emit(item?.value ?? null)\n } else {\n let targetValue = this._value()\n if (!Array.isArray(targetValue) && targetValue) {\n targetValue = [targetValue]\n }\n const values: string[] | number[] | null = targetValue as string[] | number[] | null\n if (values) {\n if (values.some((x) => x === item?.value)) {\n this.changedHandler.emit(values.filter((x) => x !== item?.value) as string[] | number[])\n } else if (item) {\n this.changedHandler.emit([...values, item.value] as string[] | number[])\n } else {\n this.changedHandler.emit([...values] as string[] | number[])\n }\n } else if (item?.value) {\n this.changedHandler.emit([item.value] as string[] | number[])\n } else {\n this.changedHandler.emit(null)\n }\n }\n }\n\n getSelected(item: SelectOption): boolean {\n if (this.selectionMode() === 'single' || !Array.isArray(this._value())) {\n return this._value() === item.value\n }\n return this._value()?.some((x: number | string | null) => x === item?.value)\n }\n\n onBlurHandler(e: Event): void {\n this.blurHandler.emit(e)\n }\n\n getOptionListWidth() {\n this.elementWidth.set(`${this.selectButtonRef()?.offsetWidth}px`)\n }\n\n getOptionListTop() {\n const nativeElement = this.optionListContainer()?.nativeElement\n const diff =\n window.innerHeight -\n (nativeElement?.getBoundingClientRect()?.height ?? 0) -\n (this.selectButtonRef()?.getBoundingClientRect()?.top ?? 0) -\n (this.selectButtonRef()?.getBoundingClientRect()?.height ?? 0)\n let topValue = 'unset'\n let bottomValue = 'unset'\n const isTop = diff >= 0\n if (isTop) {\n topValue = `${(this.selectButtonRef()?.getBoundingClientRect()?.top ?? 0) + (this.selectButtonRef()?.offsetHeight ?? 0)}px`\n } else {\n bottomValue = `${window.innerHeight - (this.selectButtonRef()?.getBoundingClientRect()?.bottom ?? 0) + (this.selectButtonRef()?.getBoundingClientRect()?.height ?? 0)}px`\n }\n nativeElement?.classList.toggle('option-list-top', !isTop)\n this.elementTop.set(topValue)\n this.elementBottom.set(bottomValue)\n }\n}\n","<div\n [ngStyle]=\"{\n 'max-height': optionListMaxHeight(),\n '--option-list-width': elementWidth(),\n '--option-list-top': elementTop(),\n '--option-list-bottom': elementBottom(),\n }\"\n (blur)=\"onBlurHandler($event)\"\n #optionListContainer\n class=\"option-list\"\n id=\"optionList\"\n tabindex=\"1\"\n>\n <ul>\n @for (item of selectOptionsList(); track i; let i = $index; let last = $last) {\n <li\n [class.m-0]=\"last\"\n [class.selected]=\"selectionMode() === 'single' ? getSelected(item) : null\"\n [id]=\"'item-' + i\"\n (mousedown)=\"$event.stopImmediatePropagation(); onSelectItem(item)\"\n class=\"item\"\n >\n <input\n [checked]=\"getSelected(item)\"\n [class.d-none]=\"selectionMode() === 'single' || !item?.value\"\n [disabled]=\"true\"\n [id]=\"i + '-' + item.value + '-checkbox'\"\n [name]=\"i + '-' + item.value + '-checkbox'\"\n [ngClass]=\"componentClass()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"getSelected(item)\"\n (blur)=\"onBlurHandler($event)\"\n #inputCheckbox\n class=\"form-check-input opacity-100\"\n type=\"checkbox\"\n />\n <label\n [class.ms-3]=\"selectionMode() === 'multiple' && item?.value\"\n [for]=\"i + '-' + item.value + '-checkbox'\"\n class=\"form-check-label checkbox-label w-100 opacity-100\"\n >\n {{ translateValue() ? (item.label | transloco) : item.label }}\n </label>\n </li>\n }\n </ul>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quang-components-shared.mjs","sources":["../../../projects/quang/components/shared/makeId.ts","../../../projects/quang/components/shared/quang-base-component.directive.ts","../../../projects/quang/components/shared/option-list/option-list.component.ts","../../../projects/quang/components/shared/option-list/option-list.component.html","../../../projects/quang/components/shared/quang-components-shared.ts"],"sourcesContent":["export const makeId = (length: number) => {\n let result = ''\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n const charactersLength = characters.length\n for (let i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength))\n }\n return result\n}\n","import { AfterViewInit, DestroyRef, Directive, Injector, computed, inject, input, output, signal } from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\nimport { ControlValueAccessor, FormControl, NgControl, Validators } from '@angular/forms'\n\nimport { Subscription } from 'rxjs'\n\nimport { ErrorData } from './ErrorData'\nimport { makeId } from './makeId'\n\n@Directive()\nexport abstract class QuangBaseComponent<T = any> implements ControlValueAccessor, AfterViewInit {\n componentId = input<string>(makeId(10))\n\n isReadonly = input<boolean>(false)\n\n isReadonly$ = toObservable(this.isReadonly)\n\n componentTabIndex = input<number>(0)\n\n componentClass = input<string | string[]>('')\n\n componentLabel = input<string>('')\n\n componentPlaceholder = input<string>('')\n\n errorMap = input<ErrorData[]>([])\n\n _errorMessagesByKey = computed(\n () => new Map((this.errorMap() ?? []).map((errorData) => [errorData.error, errorData.message]))\n )\n\n successMessage = input<string>('')\n\n helpMessage = input<string>('')\n\n formControl = input<FormControl>()\n\n componentBlur = output<void>()\n\n _value = signal<T | null>(null)\n\n _isRequired = signal<boolean>(false)\n\n _isDisabled = signal<boolean>(false)\n\n _isTouched = signal<boolean>(false)\n\n _isValid = signal<boolean>(false)\n\n _showSuccess = computed(() => this.successMessage() && this._isValid() && this._isTouched() && !this._isDisabled())\n\n _showErrors = computed(\n () => this.errorMap()?.length > 0 && !this._isValid() && this._isTouched() && !this._isDisabled()\n )\n\n _currentErrorMessage = signal<string>('')\n\n _currentErrorMessageExtraData = signal<Record<string, any>>({})\n\n _ngControl = signal<NgControl | null>(null)\n\n _injector = signal<Injector>(inject(Injector))\n\n _statusChange$?: Subscription\n\n getIsRequiredControl = computed(\n () => !!(this._ngControl()?.control as any)?._rawValidators?.find((x: any) => x.name === 'required')\n )\n\n onChange?: (value: T) => void\n\n onTouched?: () => void\n\n destroyRef = inject(DestroyRef)\n\n constructor() {\n toObservable(this.formControl)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((form) => {\n if (form) {\n this.setupFormControl()\n }\n })\n }\n\n registerOnChange(fn: (value: T) => void): void {\n this.onChange = fn\n }\n\n writeValue(val: T): void {\n this._value.set(val)\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = () => {\n this._isTouched.set(true)\n fn()\n }\n }\n\n onChangedEventHandler($event: Event) {\n const inputElement = $event.target as HTMLInputElement\n this.onChangedHandler(inputElement.value as T)\n }\n\n onChangedHandler(value: T) {\n this._value.set(value)\n if (this.onChange) {\n this.onChange(value)\n }\n\n if (this.onTouched) {\n this.onTouched()\n }\n }\n\n onBlurHandler() {\n if (this.onTouched) {\n this.onTouched()\n }\n this.componentBlur.emit()\n }\n\n setupFormControl() {\n if (this._statusChange$) {\n this._statusChange$.unsubscribe()\n this._statusChange$ = undefined\n }\n\n this._ngControl.set(this._injector().get(NgControl))\n this._statusChange$ = this._ngControl()\n ?.control?.statusChanges.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.checkFormErrors()\n })\n\n this._isTouched.set(this._ngControl()?.touched ?? false)\n this._isDisabled.set(this.isReadonly() || this._ngControl()?.disabled || false)\n this.checkFormErrors()\n }\n\n onChangeIsReadonly = this.isReadonly$.pipe(takeUntilDestroyed()).subscribe((isReadonly: boolean) => {\n this._isDisabled.set(isReadonly || this._ngControl()?.disabled || false)\n })\n\n setDisabledState(isDisabled: boolean) {\n this._isDisabled.set(isDisabled)\n }\n\n checkFormErrors() {\n const control = this._ngControl()?.control\n this._isValid.set(control?.valid ?? false)\n this._isTouched.set(!control?.pristine)\n\n const validationErrors = control?.errors\n\n this._isRequired.set(validationErrors?.[Validators.required.name])\n\n let errorName = ''\n let errorMessage = ''\n let errorData = true\n\n for (const [validationErrorName, validationErrorData] of Object.entries(validationErrors ?? {})) {\n const relatedErrorMessage = this._errorMessagesByKey().get(validationErrorName)\n if (relatedErrorMessage) {\n errorName = validationErrorName\n errorMessage = relatedErrorMessage\n errorData = validationErrorData\n }\n }\n\n this._currentErrorMessage.set(errorMessage)\n this._currentErrorMessageExtraData.set({ [errorName]: errorData })\n }\n\n ngAfterViewInit(): void {\n this.setupFormControl()\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NgClass, NgStyle } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport { QUANG_LOGGING_BEHAVIOR } from 'quang'\nimport { Subscription, fromEvent } from 'rxjs'\n\nexport interface SelectOption {\n label: string\n value: string | number | null\n}\n\nexport enum OptionListParentType {\n SELECT = 'select',\n AUTOCOMPLETE = 'autocomplete',\n}\n\n@Component({\n selector: 'quang-option-list',\n imports: [NgStyle, NgClass, TranslocoPipe],\n templateUrl: './option-list.component.html',\n styleUrl: './option-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class QuangOptionListComponent {\n logLevel = inject(QUANG_LOGGING_BEHAVIOR, { optional: true })\n\n selectionMode = input<'single' | 'multiple'>('single')\n\n optionListMaxHeight = input<string>('201px')\n\n selectOptions = input<SelectOption[]>([])\n\n selectButtonRef = input.required<HTMLButtonElement | HTMLInputElement>()\n\n _value = input<any>()\n\n _isDisabled = input<boolean>()\n\n componentClass = input<string | string[]>('')\n\n componentLabel = input<string>('')\n\n componentTabIndex = input<number>(0)\n\n translateValue = input<boolean>(false)\n\n nullOption = input<boolean>(true)\n\n elementWidth = signal<string>('0px')\n\n elementTop = signal<string>('0px')\n\n elementBottom = signal<string>('0px')\n\n scrollBehaviorOnOpen = input<ScrollBehavior>('smooth')\n\n changedHandler = output<any>()\n\n blurHandler = output<any>()\n\n optionListContainer = viewChild<ElementRef<HTMLDivElement>>('optionListContainer')\n\n destroyRef = inject(DestroyRef)\n\n parentType = input.required<OptionListParentType>()\n\n parentID = input<string>('')\n\n searchString = signal<string>('')\n\n searchResetTimer: ReturnType<typeof setTimeout> | null = null\n\n selectButtonRef$ = toObservable(this.selectButtonRef)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.getOptionListWidth()\n this.getOptionListTop()\n this.getScrollParent(this.selectButtonRef())?.addEventListener('scroll', () => {\n this.getOptionListWidth()\n this.getOptionListTop()\n })\n })\n\n selectOptionsList = computed(() => {\n if (this.nullOption() && this.selectionMode() === 'single') {\n return [\n {\n label: '',\n value: null,\n },\n ...this.selectOptions(),\n ]\n }\n return [...this.selectOptions()]\n })\n\n onKeyDown: Subscription | null = null\n\n selectedElementIndex = computed<number>(\n () => this.selectOptionsList()?.findIndex((x) => x?.value === this._value()) ?? 0\n )\n\n optionList$ = effect(() => {\n const optionListContainer = this.optionListContainer()\n if (optionListContainer && this.parentType() === OptionListParentType.SELECT) {\n optionListContainer?.nativeElement.focus()\n const optionListContainerNativeElement = optionListContainer?.nativeElement\n if (optionListContainerNativeElement) {\n const ul = optionListContainerNativeElement?.children[0] as HTMLUListElement\n const listItem = ul?.children.item(this.selectedElementIndex()) as HTMLLIElement | undefined\n if (listItem) {\n setTimeout(() => {\n listItem.scrollIntoView({ behavior: this.scrollBehaviorOnOpen() })\n }, 0)\n }\n }\n }\n const ul = optionListContainer?.nativeElement?.children[0] as HTMLUListElement | undefined\n const listItems = (ul?.children ?? []) as HTMLLIElement[]\n let currentIndex = this.selectedElementIndex()\n listItems?.[currentIndex]?.classList.add('selected')\n\n if (this.onKeyDown) {\n this.onKeyDown.unsubscribe()\n }\n\n this.onKeyDown = fromEvent(document, 'keydown', {\n capture: true,\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n switch ((event as KeyboardEvent).key) {\n case 'ArrowDown': {\n if (this.parentType() === OptionListParentType.AUTOCOMPLETE) optionListContainer?.nativeElement.focus()\n if (currentIndex !== this.selectedElementIndex()) listItems[currentIndex]?.classList.remove('selected')\n if (currentIndex === listItems.length - 1) {\n currentIndex = listItems.length - 1\n } else {\n currentIndex += 1\n }\n if (currentIndex === 0) {\n event.preventDefault()\n optionListContainer?.nativeElement?.scroll(0, 0)\n }\n const optionListBottom = optionListContainer?.nativeElement?.getBoundingClientRect()?.bottom ?? 0\n const itemListHeight = optionListContainer?.nativeElement?.children?.[0]?.children\n ?.item(currentIndex)\n ?.getBoundingClientRect()?.height\n const itemListBottom = optionListContainer?.nativeElement?.children?.[0]?.children\n ?.item(currentIndex)\n ?.getBoundingClientRect()?.bottom\n if (optionListBottom > (itemListBottom ?? 0) + (itemListHeight ?? 0)) event.preventDefault()\n\n listItems[currentIndex]?.classList.add('selected')\n if (\n (optionListContainer?.nativeElement?.scrollTop ?? 0) >=\n (optionListContainer?.nativeElement?.scrollHeight ?? 0) -\n (optionListContainer?.nativeElement?.offsetHeight ?? 0)\n ) {\n event.preventDefault()\n }\n break\n }\n case 'ArrowUp': {\n if (this.parentType() === OptionListParentType.AUTOCOMPLETE) optionListContainer?.nativeElement.focus()\n if (currentIndex !== this.selectedElementIndex()) listItems[currentIndex]?.classList.remove('selected')\n if (currentIndex !== 0) currentIndex -= 1\n const optionListTop = optionListContainer?.nativeElement?.getBoundingClientRect()?.top ?? 0\n const itemListHeight = optionListContainer?.nativeElement?.children?.[0]?.children\n ?.item(currentIndex)\n ?.getBoundingClientRect()?.height\n const itemListTop = optionListContainer?.nativeElement?.children?.[0]?.children\n ?.item(currentIndex)\n ?.getBoundingClientRect()?.top\n if (optionListTop < (itemListTop ?? 0) - (itemListHeight ?? 0)) event.preventDefault()\n listItems[currentIndex]?.classList.add('selected')\n if (!optionListContainer?.nativeElement?.scrollTop) {\n event.preventDefault()\n }\n break\n }\n case 'Enter': {\n this.onSelectItem(this.selectOptionsList()[currentIndex])\n break\n }\n default: {\n if (\n ((event as KeyboardEvent)?.key?.length === 1 || (event as KeyboardEvent)?.key === 'Backspace') &&\n this.parentType() === OptionListParentType.AUTOCOMPLETE &&\n document.activeElement?.id === optionListContainer?.nativeElement?.id\n ) {\n currentIndex = 0\n document.getElementById(this.parentID())?.focus()\n document.getElementById(this.parentID())?.click()\n } else if (\n (event as KeyboardEvent)?.key?.length === 1 &&\n this.parentType() === OptionListParentType.SELECT\n ) {\n const key = (event as KeyboardEvent).key\n currentIndex = this.handleSearch(key, listItems, currentIndex)\n event.preventDefault()\n }\n break\n }\n }\n })\n })\n\n handleSearch(key: string, listItems: HTMLLIElement[], currentIndex: number): number {\n if (this.searchResetTimer) {\n clearTimeout(this.searchResetTimer)\n }\n\n this.searchString.update((current) => current + key)\n\n this.searchResetTimer = setTimeout(() => {\n this.searchString.set('')\n this.searchResetTimer = null\n }, 500)\n\n const searchStr = this.searchString().toLowerCase()\n const matchIndex = this.selectOptionsList().findIndex((option) => option.label.toLowerCase().includes(searchStr))\n\n if (matchIndex !== -1 && matchIndex !== currentIndex) {\n listItems[currentIndex]?.classList.remove('selected')\n listItems[matchIndex]?.classList.add('selected')\n listItems[matchIndex]?.scrollIntoView({ behavior: this.scrollBehaviorOnOpen() })\n return matchIndex\n }\n\n return currentIndex\n }\n\n @HostListener('window:scroll') changePosition() {\n this.getOptionListWidth()\n this.getOptionListTop()\n }\n\n isScrollable(ele: Element): boolean {\n if (!ele) return false\n\n let result = false\n\n try {\n const hasScrollableContent = ele.scrollHeight > ele.clientHeight\n\n const overflowYStyle = window.getComputedStyle(ele).overflowY\n const isOverflowHidden = overflowYStyle.includes('hidden')\n\n result = hasScrollableContent && !isOverflowHidden\n } catch (_error) {\n if (this.logLevel === 'verbose') console.error('captured error isScrollable', _error)\n }\n\n return result\n }\n\n getScrollParent(node: unknown): Element {\n if (!node || node === document.body || !(node instanceof Element)) return document.body\n return this.isScrollable(node) ? node : this.getScrollParent(node.parentNode)\n }\n\n onSelectItem(item: SelectOption | null): void {\n if (this.selectionMode() === 'single') {\n this.changedHandler.emit(item?.value ?? null)\n } else {\n let targetValue = this._value()\n if (!Array.isArray(targetValue) && targetValue) {\n targetValue = [targetValue]\n }\n const values: string[] | number[] | null = targetValue as string[] | number[] | null\n if (values) {\n if (values.some((x) => x === item?.value)) {\n this.changedHandler.emit(values.filter((x) => x !== item?.value) as string[] | number[])\n } else if (item) {\n this.changedHandler.emit([...values, item.value] as string[] | number[])\n } else {\n this.changedHandler.emit([...values] as string[] | number[])\n }\n } else if (item?.value) {\n this.changedHandler.emit([item.value] as string[] | number[])\n } else {\n this.changedHandler.emit(null)\n }\n }\n }\n\n getSelected(item: SelectOption): boolean {\n if (this.selectionMode() === 'single' || !Array.isArray(this._value())) {\n return this._value() === item.value\n }\n return this._value()?.some((x: number | string | null) => x === item?.value)\n }\n\n onBlurHandler(e: Event): void {\n this.blurHandler.emit(e)\n }\n\n getOptionListWidth() {\n this.elementWidth.set(`${this.selectButtonRef()?.offsetWidth}px`)\n }\n\n getOptionListTop() {\n const nativeElement = this.optionListContainer()?.nativeElement\n const diff =\n window.innerHeight -\n (nativeElement?.getBoundingClientRect()?.height ?? 0) -\n (this.selectButtonRef()?.getBoundingClientRect()?.top ?? 0) -\n (this.selectButtonRef()?.getBoundingClientRect()?.height ?? 0)\n let topValue = 'unset'\n let bottomValue = 'unset'\n const isTop = diff >= 0\n if (isTop) {\n topValue = `${(this.selectButtonRef()?.getBoundingClientRect()?.top ?? 0) + (this.selectButtonRef()?.offsetHeight ?? 0)}px`\n } else {\n bottomValue = `${window.innerHeight - (this.selectButtonRef()?.getBoundingClientRect()?.bottom ?? 0) + (this.selectButtonRef()?.getBoundingClientRect()?.height ?? 0)}px`\n }\n nativeElement?.classList.toggle('option-list-top', !isTop)\n this.elementTop.set(topValue)\n this.elementBottom.set(bottomValue)\n }\n}\n","<div\n [ngStyle]=\"{\n 'max-height': optionListMaxHeight(),\n '--option-list-width': elementWidth(),\n '--option-list-top': elementTop(),\n '--option-list-bottom': elementBottom(),\n }\"\n (blur)=\"onBlurHandler($event)\"\n #optionListContainer\n class=\"option-list\"\n id=\"optionList\"\n tabindex=\"1\"\n>\n <ul>\n @for (item of selectOptionsList(); track i; let i = $index; let last = $last) {\n <li\n [class.m-0]=\"last\"\n [class.selected]=\"selectionMode() === 'single' ? getSelected(item) : null\"\n [id]=\"'item-' + i\"\n (mousedown)=\"$event.stopImmediatePropagation(); onSelectItem(item)\"\n class=\"item\"\n >\n <input\n [checked]=\"getSelected(item)\"\n [class.d-none]=\"selectionMode() === 'single' || !item?.value\"\n [disabled]=\"true\"\n [id]=\"i + '-' + item.value + '-checkbox'\"\n [name]=\"i + '-' + item.value + '-checkbox'\"\n [ngClass]=\"componentClass()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"getSelected(item)\"\n (blur)=\"onBlurHandler($event)\"\n #inputCheckbox\n class=\"form-check-input opacity-100\"\n type=\"checkbox\"\n />\n <label\n [class.ms-3]=\"selectionMode() === 'multiple' && item?.value\"\n [for]=\"i + '-' + item.value + '-checkbox'\"\n class=\"form-check-label checkbox-label w-100 opacity-100\"\n >\n {{ translateValue() ? (item.label | transloco) : item.label }}\n </label>\n </li>\n }\n </ul>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -146,10 +146,10 @@ class QuangTableComponent {
146
146
  this._tableConfigurations.set({ ...this._tableConfigurations(), headers: tableHeaders });
147
147
  this.sortChanged.emit([sort]); // it's an array to handle multisort in the future
148
148
  }
149
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QuangTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
150
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: QuangTableComponent, isStandalone: true, selector: "quang-table", inputs: { clickableRow: { classPropertyName: "clickableRow", publicName: "clickableRow", isSignal: true, isRequired: false, transformFunction: null }, selectedRows: { classPropertyName: "selectedRows", publicName: "selectedRows", isSignal: true, isRequired: false, transformFunction: null }, stickyTable: { classPropertyName: "stickyTable", publicName: "stickyTable", isSignal: true, isRequired: false, transformFunction: null }, noResultsText: { classPropertyName: "noResultsText", publicName: "noResultsText", isSignal: true, isRequired: false, transformFunction: null }, tableConfigurations: { classPropertyName: "tableConfigurations", publicName: "tableConfigurations", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectedRow: "selectedRow", sortChanged: "sortChanged" }, viewQueries: [{ propertyName: "_tableHeader", first: true, predicate: ["tableHeader"], descendants: true, isSignal: true }, { propertyName: "_tableHeaderElement", first: true, predicate: ["tableHeader"], descendants: true, isSignal: true }, { propertyName: "_fakeTableHeader", first: true, predicate: ["fakeTableHeader"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n [class.sticky-table]=\"stickyTable()\"\n class=\"table-responsive\"\n>\n @if (_tableConfigurations().rows.length) {\n <div\n (scroll)=\"tableContainer.scrollLeft = tableHeaderContainer.scrollLeft\"\n #tableHeaderContainer\n class=\"table-header-container\"\n id=\"tableHeaderContainer\"\n >\n <table\n #tableHeader\n id=\"tableHeader\"\n >\n <thead>\n <tr>\n @for (header of _tableConfigurations().headers; track $index) {\n <th\n [class.sort-btn]=\"header?.sort\"\n (click)=\"header?.sort ? onSortColumn(header.sort!) : null\"\n class=\"align-bottom\"\n >\n <div\n [ngClass]=\"header?.css\"\n class=\"align-self-end d-flex gap-1\"\n >\n {{ !header.renderer ? (header.text | transloco) : null }}\n <ng-container\n [ngTemplateOutlet]=\"header?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: header.payload,\n }\"\n ></ng-container>\n @if (header.sort?.key) {\n <div class=\"d-flex justify-content-between\">\n <ng-container\n [ngTemplateOutlet]=\"orderBtns\"\n [ngTemplateOutletContext]=\"{ $implicit: header.sort }\"\n ></ng-container>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n </table>\n </div>\n <div\n (scroll)=\"tableHeaderContainer.scrollLeft = tableContainer.scrollLeft\"\n #tableContainer\n class=\"table-container\"\n >\n <table\n class=\"table\"\n id=\"table-content\"\n >\n <thead\n #fakeTableHeader\n class=\"fake-table-header\"\n id=\"fakeTableHeader\"\n >\n <tr>\n @for (header of _tableConfigurations().headers; track $index) {\n <th\n [class.sort-btn]=\"header?.sort\"\n (click)=\"header?.sort ? onSortColumn(header.sort!) : null\"\n class=\"align-bottom\"\n >\n <div\n [ngClass]=\"header?.css\"\n class=\"align-self-end d-flex gap-1\"\n >\n {{ !header.renderer ? (header.text | transloco) : null }}\n <ng-container\n [ngTemplateOutlet]=\"header?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: header.payload,\n }\"\n ></ng-container>\n @if (header.sort?.key) {\n <div class=\"d-flex justify-content-between\">\n <ng-container\n [ngTemplateOutlet]=\"orderBtns\"\n [ngTemplateOutletContext]=\"{ $implicit: header.sort }\"\n ></ng-container>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of _tableConfigurations().rows; track $index) {\n <tr\n [class.hover-table]=\"clickableRow()\"\n [class.selectedRow]=\"row?.rowId ? isSelected(row.rowId!) : null\"\n [ngClass]=\"row.css\"\n (click)=\"clickableRow() ? onClickRow(row) : null\"\n >\n @for (cell of row.cellData; track $index) {\n <td\n [attr.colspan]=\"cell?.fullWidth ? _tableConfigurations().headers.length : undefined\"\n [ngClass]=\"cell.css!\"\n >\n {{ !cell.renderer ? cell.text : null }}\n <ng-container\n [ngTemplateOutlet]=\"cell?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.payload,\n }\"\n ></ng-container>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n @if (!_tableConfigurations().rows.length) {\n <h6 class=\"text-center mt-3\">\n {{ noResultsText() | transloco }}\n </h6>\n }\n</div>\n\n<ng-template\n #orderBtns\n let-order\n>\n <div\n [class.sort-asc]=\"order.sort === SortTable.ASC\"\n [class.sort-default]=\"order.sort === SortTable.DEFAULT\"\n [class.sort-desc]=\"order.sort === SortTable.DESC\"\n class=\"sort-arrows\"\n >\n <svg\n class=\"arrow-up\"\n fill=\"currentColor\"\n height=\"10\"\n stroke=\"currentColor\"\n viewBox=\"279.5 -600.5 401 201\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"m280-400 200-200 200 200H280Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <svg\n class=\"arrow-down\"\n fill=\"currentColor\"\n height=\"10\"\n stroke=\"currentColor\"\n viewBox=\"279.5 -560.5 401 201\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M480-360 280-560h400L480-360Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n </div>\n</ng-template>\n", styles: [":host{display:block;--table-header-container-top: 0;--table-header-bg: var(--bs-body-bg);--table-header-border-color: var(--bs-border-color);--table-header-border-width: 4px;--table-row-hover-brightness: 90%;--table-row-selected-brightness: 95%}.table-responsive{overflow:initial}.table-responsive .fake-table-header{height:0;overflow:hidden;line-height:0;visibility:collapse}.table-responsive .fake-table-header th{padding-top:0!important;padding-bottom:0!important;margin-top:0!important;margin-bottom:0!important;background-color:var(--table-header-bg);border:unset}.table-responsive .table-header-container{overflow-x:hidden;z-index:1}.table-responsive .table-container{overflow-x:auto}.table-responsive table{width:100%;font-size:16px;overflow-y:auto;margin-bottom:unset}.table-responsive table thead{text-transform:uppercase}.table-responsive table thead th{padding:1rem .5rem;z-index:999;background-color:var(--table-header-bg);box-shadow:inset 0 calc(var(--table-header-border-width) * -1) 0 0 var(--table-header-border-color)}.table-responsive table tbody tr:first-child td{border-top:0}.table-responsive table tbody tr.hover-table:hover{cursor:pointer;filter:brightness(var(--table-row-hover-brightness))}.table-responsive table tbody tr.selectedRow{filter:brightness(var(--table-row-selected-brightness))}.table-responsive table tbody tr td{padding:1rem .5rem;font-weight:300;vertical-align:middle}.table-responsive table tbody tr:last-child{border-bottom:transparent}.table-responsive.sticky-table{position:relative}.table-responsive.sticky-table .table-header-container{position:sticky;top:var(--table-header-container-top, 0)}.sort-arrows{display:flex;flex-direction:column;justify-content:center}.sort-default{opacity:30%}.sort-asc .arrow-up{opacity:100%}.sort-asc .arrow-down,.sort-desc .arrow-up{display:none}.sort-desc .arrow-down{opacity:100%}.sort-btn:hover{cursor:pointer}\n"], dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
149
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: QuangTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
150
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.0", type: QuangTableComponent, isStandalone: true, selector: "quang-table", inputs: { clickableRow: { classPropertyName: "clickableRow", publicName: "clickableRow", isSignal: true, isRequired: false, transformFunction: null }, selectedRows: { classPropertyName: "selectedRows", publicName: "selectedRows", isSignal: true, isRequired: false, transformFunction: null }, stickyTable: { classPropertyName: "stickyTable", publicName: "stickyTable", isSignal: true, isRequired: false, transformFunction: null }, noResultsText: { classPropertyName: "noResultsText", publicName: "noResultsText", isSignal: true, isRequired: false, transformFunction: null }, tableConfigurations: { classPropertyName: "tableConfigurations", publicName: "tableConfigurations", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectedRow: "selectedRow", sortChanged: "sortChanged" }, viewQueries: [{ propertyName: "_tableHeader", first: true, predicate: ["tableHeader"], descendants: true, isSignal: true }, { propertyName: "_tableHeaderElement", first: true, predicate: ["tableHeader"], descendants: true, isSignal: true }, { propertyName: "_fakeTableHeader", first: true, predicate: ["fakeTableHeader"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n [class.sticky-table]=\"stickyTable()\"\n class=\"table-responsive\"\n>\n @if (_tableConfigurations().rows.length) {\n <div\n (scroll)=\"tableContainer.scrollLeft = tableHeaderContainer.scrollLeft\"\n #tableHeaderContainer\n class=\"table-header-container\"\n id=\"tableHeaderContainer\"\n >\n <table\n #tableHeader\n id=\"tableHeader\"\n >\n <thead>\n <tr>\n @for (header of _tableConfigurations().headers; track $index) {\n <th\n [class.sort-btn]=\"header?.sort\"\n (click)=\"header?.sort ? onSortColumn(header.sort!) : null\"\n class=\"align-bottom\"\n >\n <div\n [ngClass]=\"header?.css\"\n class=\"align-self-end d-flex gap-1\"\n >\n {{ !header.renderer ? (header.text | transloco) : null }}\n <ng-container\n [ngTemplateOutlet]=\"header?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: header.payload,\n }\"\n ></ng-container>\n @if (header.sort?.key) {\n <div class=\"d-flex justify-content-between\">\n <ng-container\n [ngTemplateOutlet]=\"orderBtns\"\n [ngTemplateOutletContext]=\"{ $implicit: header.sort }\"\n ></ng-container>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n </table>\n </div>\n <div\n (scroll)=\"tableHeaderContainer.scrollLeft = tableContainer.scrollLeft\"\n #tableContainer\n class=\"table-container\"\n >\n <table\n class=\"table\"\n id=\"table-content\"\n >\n <thead\n #fakeTableHeader\n class=\"fake-table-header\"\n id=\"fakeTableHeader\"\n >\n <tr>\n @for (header of _tableConfigurations().headers; track $index) {\n <th\n [class.sort-btn]=\"header?.sort\"\n (click)=\"header?.sort ? onSortColumn(header.sort!) : null\"\n class=\"align-bottom\"\n >\n <div\n [ngClass]=\"header?.css\"\n class=\"align-self-end d-flex gap-1\"\n >\n {{ !header.renderer ? (header.text | transloco) : null }}\n <ng-container\n [ngTemplateOutlet]=\"header?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: header.payload,\n }\"\n ></ng-container>\n @if (header.sort?.key) {\n <div class=\"d-flex justify-content-between\">\n <ng-container\n [ngTemplateOutlet]=\"orderBtns\"\n [ngTemplateOutletContext]=\"{ $implicit: header.sort }\"\n ></ng-container>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of _tableConfigurations().rows; track $index) {\n <tr\n [class.hover-table]=\"clickableRow()\"\n [class.selectedRow]=\"row?.rowId ? isSelected(row.rowId!) : null\"\n [ngClass]=\"row.css\"\n (click)=\"clickableRow() ? onClickRow(row) : null\"\n >\n @for (cell of row.cellData; track $index) {\n <td\n [attr.colspan]=\"cell?.fullWidth ? _tableConfigurations().headers.length : undefined\"\n [ngClass]=\"cell.css!\"\n >\n {{ !cell.renderer ? cell.text : null }}\n <ng-container\n [ngTemplateOutlet]=\"cell?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.payload,\n }\"\n ></ng-container>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n @if (!_tableConfigurations().rows.length) {\n <h6 class=\"text-center mt-3\">\n {{ noResultsText() | transloco }}\n </h6>\n }\n</div>\n\n<ng-template\n #orderBtns\n let-order\n>\n <div\n [class.sort-asc]=\"order.sort === SortTable.ASC\"\n [class.sort-default]=\"order.sort === SortTable.DEFAULT\"\n [class.sort-desc]=\"order.sort === SortTable.DESC\"\n class=\"sort-arrows\"\n >\n <svg\n class=\"arrow-up\"\n fill=\"currentColor\"\n height=\"10\"\n stroke=\"currentColor\"\n viewBox=\"279.5 -600.5 401 201\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"m280-400 200-200 200 200H280Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <svg\n class=\"arrow-down\"\n fill=\"currentColor\"\n height=\"10\"\n stroke=\"currentColor\"\n viewBox=\"279.5 -560.5 401 201\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M480-360 280-560h400L480-360Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n </div>\n</ng-template>\n", styles: [":host{display:block;--table-header-container-top: 0;--table-header-bg: var(--bs-body-bg);--table-header-border-color: var(--bs-border-color);--table-header-border-width: 4px;--table-row-hover-brightness: 90%;--table-row-selected-brightness: 95%}.table-responsive{overflow:initial}.table-responsive .fake-table-header{height:0;overflow:hidden;line-height:0;visibility:collapse}.table-responsive .fake-table-header th{padding-top:0!important;padding-bottom:0!important;margin-top:0!important;margin-bottom:0!important;background-color:var(--table-header-bg);border:unset}.table-responsive .table-header-container{overflow-x:hidden;z-index:1}.table-responsive .table-container{overflow-x:auto}.table-responsive table{width:100%;font-size:16px;overflow-y:auto;margin-bottom:unset}.table-responsive table thead{text-transform:uppercase}.table-responsive table thead th{padding:1rem .5rem;z-index:999;background-color:var(--table-header-bg);box-shadow:inset 0 calc(var(--table-header-border-width) * -1) 0 0 var(--table-header-border-color)}.table-responsive table tbody tr:first-child td{border-top:0}.table-responsive table tbody tr.hover-table:hover{cursor:pointer;filter:brightness(var(--table-row-hover-brightness))}.table-responsive table tbody tr.selectedRow{filter:brightness(var(--table-row-selected-brightness))}.table-responsive table tbody tr td{padding:1rem .5rem;font-weight:300;vertical-align:middle}.table-responsive table tbody tr:last-child{border-bottom:transparent}.table-responsive.sticky-table{position:relative}.table-responsive.sticky-table .table-header-container{position:sticky;top:var(--table-header-container-top, 0)}.sort-arrows{display:flex;flex-direction:column;justify-content:center}.sort-default{opacity:30%}.sort-asc .arrow-up{opacity:100%}.sort-asc .arrow-down,.sort-desc .arrow-up{display:none}.sort-desc .arrow-down{opacity:100%}.sort-btn:hover{cursor:pointer}\n"], dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
151
151
  }
152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QuangTableComponent, decorators: [{
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: QuangTableComponent, decorators: [{
153
153
  type: Component,
154
154
  args: [{ selector: 'quang-table', imports: [TranslocoPipe, NgClass, NgTemplateOutlet], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [class.sticky-table]=\"stickyTable()\"\n class=\"table-responsive\"\n>\n @if (_tableConfigurations().rows.length) {\n <div\n (scroll)=\"tableContainer.scrollLeft = tableHeaderContainer.scrollLeft\"\n #tableHeaderContainer\n class=\"table-header-container\"\n id=\"tableHeaderContainer\"\n >\n <table\n #tableHeader\n id=\"tableHeader\"\n >\n <thead>\n <tr>\n @for (header of _tableConfigurations().headers; track $index) {\n <th\n [class.sort-btn]=\"header?.sort\"\n (click)=\"header?.sort ? onSortColumn(header.sort!) : null\"\n class=\"align-bottom\"\n >\n <div\n [ngClass]=\"header?.css\"\n class=\"align-self-end d-flex gap-1\"\n >\n {{ !header.renderer ? (header.text | transloco) : null }}\n <ng-container\n [ngTemplateOutlet]=\"header?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: header.payload,\n }\"\n ></ng-container>\n @if (header.sort?.key) {\n <div class=\"d-flex justify-content-between\">\n <ng-container\n [ngTemplateOutlet]=\"orderBtns\"\n [ngTemplateOutletContext]=\"{ $implicit: header.sort }\"\n ></ng-container>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n </table>\n </div>\n <div\n (scroll)=\"tableHeaderContainer.scrollLeft = tableContainer.scrollLeft\"\n #tableContainer\n class=\"table-container\"\n >\n <table\n class=\"table\"\n id=\"table-content\"\n >\n <thead\n #fakeTableHeader\n class=\"fake-table-header\"\n id=\"fakeTableHeader\"\n >\n <tr>\n @for (header of _tableConfigurations().headers; track $index) {\n <th\n [class.sort-btn]=\"header?.sort\"\n (click)=\"header?.sort ? onSortColumn(header.sort!) : null\"\n class=\"align-bottom\"\n >\n <div\n [ngClass]=\"header?.css\"\n class=\"align-self-end d-flex gap-1\"\n >\n {{ !header.renderer ? (header.text | transloco) : null }}\n <ng-container\n [ngTemplateOutlet]=\"header?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: header.payload,\n }\"\n ></ng-container>\n @if (header.sort?.key) {\n <div class=\"d-flex justify-content-between\">\n <ng-container\n [ngTemplateOutlet]=\"orderBtns\"\n [ngTemplateOutletContext]=\"{ $implicit: header.sort }\"\n ></ng-container>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of _tableConfigurations().rows; track $index) {\n <tr\n [class.hover-table]=\"clickableRow()\"\n [class.selectedRow]=\"row?.rowId ? isSelected(row.rowId!) : null\"\n [ngClass]=\"row.css\"\n (click)=\"clickableRow() ? onClickRow(row) : null\"\n >\n @for (cell of row.cellData; track $index) {\n <td\n [attr.colspan]=\"cell?.fullWidth ? _tableConfigurations().headers.length : undefined\"\n [ngClass]=\"cell.css!\"\n >\n {{ !cell.renderer ? cell.text : null }}\n <ng-container\n [ngTemplateOutlet]=\"cell?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.payload,\n }\"\n ></ng-container>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n @if (!_tableConfigurations().rows.length) {\n <h6 class=\"text-center mt-3\">\n {{ noResultsText() | transloco }}\n </h6>\n }\n</div>\n\n<ng-template\n #orderBtns\n let-order\n>\n <div\n [class.sort-asc]=\"order.sort === SortTable.ASC\"\n [class.sort-default]=\"order.sort === SortTable.DEFAULT\"\n [class.sort-desc]=\"order.sort === SortTable.DESC\"\n class=\"sort-arrows\"\n >\n <svg\n class=\"arrow-up\"\n fill=\"currentColor\"\n height=\"10\"\n stroke=\"currentColor\"\n viewBox=\"279.5 -600.5 401 201\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"m280-400 200-200 200 200H280Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <svg\n class=\"arrow-down\"\n fill=\"currentColor\"\n height=\"10\"\n stroke=\"currentColor\"\n viewBox=\"279.5 -560.5 401 201\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M480-360 280-560h400L480-360Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n </div>\n</ng-template>\n", styles: [":host{display:block;--table-header-container-top: 0;--table-header-bg: var(--bs-body-bg);--table-header-border-color: var(--bs-border-color);--table-header-border-width: 4px;--table-row-hover-brightness: 90%;--table-row-selected-brightness: 95%}.table-responsive{overflow:initial}.table-responsive .fake-table-header{height:0;overflow:hidden;line-height:0;visibility:collapse}.table-responsive .fake-table-header th{padding-top:0!important;padding-bottom:0!important;margin-top:0!important;margin-bottom:0!important;background-color:var(--table-header-bg);border:unset}.table-responsive .table-header-container{overflow-x:hidden;z-index:1}.table-responsive .table-container{overflow-x:auto}.table-responsive table{width:100%;font-size:16px;overflow-y:auto;margin-bottom:unset}.table-responsive table thead{text-transform:uppercase}.table-responsive table thead th{padding:1rem .5rem;z-index:999;background-color:var(--table-header-bg);box-shadow:inset 0 calc(var(--table-header-border-width) * -1) 0 0 var(--table-header-border-color)}.table-responsive table tbody tr:first-child td{border-top:0}.table-responsive table tbody tr.hover-table:hover{cursor:pointer;filter:brightness(var(--table-row-hover-brightness))}.table-responsive table tbody tr.selectedRow{filter:brightness(var(--table-row-selected-brightness))}.table-responsive table tbody tr td{padding:1rem .5rem;font-weight:300;vertical-align:middle}.table-responsive table tbody tr:last-child{border-bottom:transparent}.table-responsive.sticky-table{position:relative}.table-responsive.sticky-table .table-header-container{position:sticky;top:var(--table-header-container-top, 0)}.sort-arrows{display:flex;flex-direction:column;justify-content:center}.sort-default{opacity:30%}.sort-asc .arrow-up{opacity:100%}.sort-asc .arrow-down,.sort-desc .arrow-up{display:none}.sort-desc .arrow-down{opacity:100%}.sort-btn:hover{cursor:pointer}\n"] }]
155
155
  }] });
@@ -1 +1 @@
1
- {"version":3,"file":"quang-components-table.mjs","sources":["../../../projects/quang/components/table/table.component.ts","../../../projects/quang/components/table/table.component.html","../../../projects/quang/components/table/quang-components-table.ts"],"sourcesContent":["import { NgClass, NgTemplateOutlet } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport { ResizeObservableService } from 'quang/device'\nimport { Subscription } from 'rxjs'\n\nexport interface TableHeader {\n text?: string\n sort?: SortCol\n css?: string[]\n renderer?: TemplateRef<any>\n payload?: any\n}\n\nexport interface TableConfiguration<T> {\n headers: TableHeader[]\n rows: TableRow<T>[]\n}\n\nexport interface TableCell {\n renderer?: TemplateRef<any>\n payload?: any\n text?: string\n css?: string[]\n fullWidth?: boolean\n}\n\nexport interface TableRow<T> {\n payload?: T\n rowId?: string | number\n css?: string[]\n cellData: TableCell[]\n}\n\nexport enum SortTable {\n DEFAULT = 'DEFAULT',\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport interface SortCol {\n key: string\n sort: SortTable\n}\n\n@Component({\n selector: 'quang-table',\n templateUrl: './table.component.html',\n styleUrl: './table.component.scss',\n imports: [TranslocoPipe, NgClass, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Table component for displaying data in a tabular format.\n *\n * It supports customizable column cells template and sorting rows by column headers.\n *\n * @usageNotes\n * The component must be configured using the {@link TableConfiguration} object\n */\nexport class QuangTableComponent<T> {\n clickableRow = input<boolean>(false)\n\n selectedRows = input<string[] | number[]>()\n\n stickyTable = input<boolean>(true)\n\n selectedRow = output<TableRow<T>>()\n\n sortChanged = output<SortCol[]>()\n\n public SortTable = SortTable\n\n destroyRef = inject(DestroyRef)\n\n _resizeObservableService = inject(ResizeObservableService)\n\n _tableHeader = viewChild<ElementRef>('tableHeader')\n\n _tableHeaderElement = viewChild<Element>('tableHeader')\n\n noResultsText = input<string>('quangTable.noResults')\n\n _tableHeaderEffect = effect(() => {\n if (this._tableHeader()) {\n this.fixTableHeaderWidth()\n }\n })\n\n _tableHeaderElementEffect = effect(() => {\n if (this._tableHeaderElement()) {\n this.fixTableHeaderWidth()\n }\n })\n\n _fakeTableHeader = viewChild<ElementRef>('fakeTableHeader')\n\n _fakeTableHeaderEffect = effect(() => {\n if (this._fakeTableHeader()) {\n this.fixTableHeaderWidth()\n }\n })\n\n tableConfigurations = input.required<TableConfiguration<T>>()\n\n _tableConfigurations = signal<TableConfiguration<T>>({\n headers: [],\n rows: [],\n })\n\n tableConfigurations$ = toObservable(this.tableConfigurations)\n .pipe(takeUntilDestroyed())\n .subscribe((data) => {\n const headers: TableHeader[] = []\n const rows: TableRow<T>[] = []\n for (const header of data.headers) {\n headers.push({ ...header })\n }\n for (const row of data.rows) {\n rows.push({ ...row })\n }\n this._tableConfigurations.set({\n headers,\n rows,\n })\n })\n\n effectTableConfigurations = effect(() => {\n if (this._tableConfigurations()) {\n this.fixTableHeaderWidth()\n }\n })\n\n hiddenColumnsObservable?: Subscription = undefined\n\n onClickRow(row: TableRow<T>): void {\n if (this.clickableRow()) {\n this.selectedRow.emit(row)\n }\n }\n\n isSelected(rowId: string | number): boolean {\n return !!this.selectedRows()?.some((x) => x === rowId)\n }\n\n lastWidth = -1\n\n fixTableHeaderWidth() {\n setTimeout(() => {\n const stickyColumns = this._tableHeader()?.nativeElement?.querySelectorAll('th')\n\n // Copy the column widths from our hidden Primary table header to our Sticky Table header.\n const hiddenColumns = this._fakeTableHeader()?.nativeElement?.querySelectorAll('th')\n\n if (stickyColumns?.length > 0 && hiddenColumns?.length > 0) {\n if (this.hiddenColumnsObservable) {\n this.hiddenColumnsObservable.unsubscribe()\n }\n this.hiddenColumnsObservable = this._resizeObservableService\n .widthResizeObservable(hiddenColumns[0])\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((data) => {\n if (data !== this.lastWidth) {\n this.lastWidth = data\n this.fixTableHeaderWidth()\n }\n })\n for (let i = 0; i < hiddenColumns?.length; i++) {\n const th = hiddenColumns[i]\n // Since the Sticky Table header is expected to be an exact copy of the Primary Table, we know their indices will be the same.\n stickyColumns[i].style.minWidth = `${th.offsetWidth}px`\n stickyColumns[i].style.maxWidth = `${th.offsetWidth}px`\n }\n }\n })\n }\n\n onSortColumn(sort: SortCol): void {\n const tableHeaders: TableHeader[] = []\n for (const header of this._tableConfigurations().headers) {\n tableHeaders.push({\n ...header,\n })\n }\n tableHeaders.forEach((header) => {\n if (!header.sort?.key) return\n\n if (header.sort?.key === sort.key) {\n switch (sort.sort) {\n case SortTable.ASC:\n header.sort.sort = SortTable.DESC\n break\n case SortTable.DESC:\n header.sort.sort = SortTable.DEFAULT\n break\n case SortTable.DEFAULT:\n default:\n header.sort.sort = SortTable.ASC\n break\n }\n } else {\n header.sort = {\n ...header.sort,\n sort: SortTable.DEFAULT,\n }\n }\n })\n this._tableConfigurations.set({ ...this._tableConfigurations(), headers: tableHeaders })\n this.sortChanged.emit([sort]) // it's an array to handle multisort in the future\n }\n}\n","<div\n [class.sticky-table]=\"stickyTable()\"\n class=\"table-responsive\"\n>\n @if (_tableConfigurations().rows.length) {\n <div\n (scroll)=\"tableContainer.scrollLeft = tableHeaderContainer.scrollLeft\"\n #tableHeaderContainer\n class=\"table-header-container\"\n id=\"tableHeaderContainer\"\n >\n <table\n #tableHeader\n id=\"tableHeader\"\n >\n <thead>\n <tr>\n @for (header of _tableConfigurations().headers; track $index) {\n <th\n [class.sort-btn]=\"header?.sort\"\n (click)=\"header?.sort ? onSortColumn(header.sort!) : null\"\n class=\"align-bottom\"\n >\n <div\n [ngClass]=\"header?.css\"\n class=\"align-self-end d-flex gap-1\"\n >\n {{ !header.renderer ? (header.text | transloco) : null }}\n <ng-container\n [ngTemplateOutlet]=\"header?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: header.payload,\n }\"\n ></ng-container>\n @if (header.sort?.key) {\n <div class=\"d-flex justify-content-between\">\n <ng-container\n [ngTemplateOutlet]=\"orderBtns\"\n [ngTemplateOutletContext]=\"{ $implicit: header.sort }\"\n ></ng-container>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n </table>\n </div>\n <div\n (scroll)=\"tableHeaderContainer.scrollLeft = tableContainer.scrollLeft\"\n #tableContainer\n class=\"table-container\"\n >\n <table\n class=\"table\"\n id=\"table-content\"\n >\n <thead\n #fakeTableHeader\n class=\"fake-table-header\"\n id=\"fakeTableHeader\"\n >\n <tr>\n @for (header of _tableConfigurations().headers; track $index) {\n <th\n [class.sort-btn]=\"header?.sort\"\n (click)=\"header?.sort ? onSortColumn(header.sort!) : null\"\n class=\"align-bottom\"\n >\n <div\n [ngClass]=\"header?.css\"\n class=\"align-self-end d-flex gap-1\"\n >\n {{ !header.renderer ? (header.text | transloco) : null }}\n <ng-container\n [ngTemplateOutlet]=\"header?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: header.payload,\n }\"\n ></ng-container>\n @if (header.sort?.key) {\n <div class=\"d-flex justify-content-between\">\n <ng-container\n [ngTemplateOutlet]=\"orderBtns\"\n [ngTemplateOutletContext]=\"{ $implicit: header.sort }\"\n ></ng-container>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of _tableConfigurations().rows; track $index) {\n <tr\n [class.hover-table]=\"clickableRow()\"\n [class.selectedRow]=\"row?.rowId ? isSelected(row.rowId!) : null\"\n [ngClass]=\"row.css\"\n (click)=\"clickableRow() ? onClickRow(row) : null\"\n >\n @for (cell of row.cellData; track $index) {\n <td\n [attr.colspan]=\"cell?.fullWidth ? _tableConfigurations().headers.length : undefined\"\n [ngClass]=\"cell.css!\"\n >\n {{ !cell.renderer ? cell.text : null }}\n <ng-container\n [ngTemplateOutlet]=\"cell?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.payload,\n }\"\n ></ng-container>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n @if (!_tableConfigurations().rows.length) {\n <h6 class=\"text-center mt-3\">\n {{ noResultsText() | transloco }}\n </h6>\n }\n</div>\n\n<ng-template\n #orderBtns\n let-order\n>\n <div\n [class.sort-asc]=\"order.sort === SortTable.ASC\"\n [class.sort-default]=\"order.sort === SortTable.DEFAULT\"\n [class.sort-desc]=\"order.sort === SortTable.DESC\"\n class=\"sort-arrows\"\n >\n <svg\n class=\"arrow-up\"\n fill=\"currentColor\"\n height=\"10\"\n stroke=\"currentColor\"\n viewBox=\"279.5 -600.5 401 201\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"m280-400 200-200 200 200H280Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <svg\n class=\"arrow-down\"\n fill=\"currentColor\"\n height=\"10\"\n stroke=\"currentColor\"\n viewBox=\"279.5 -560.5 401 201\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M480-360 280-560h400L480-360Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quang-components-table.mjs","sources":["../../../projects/quang/components/table/table.component.ts","../../../projects/quang/components/table/table.component.html","../../../projects/quang/components/table/quang-components-table.ts"],"sourcesContent":["import { NgClass, NgTemplateOutlet } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core'\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop'\n\nimport { TranslocoPipe } from '@jsverse/transloco'\nimport { ResizeObservableService } from 'quang/device'\nimport { Subscription } from 'rxjs'\n\nexport interface TableHeader {\n text?: string\n sort?: SortCol\n css?: string[]\n renderer?: TemplateRef<any>\n payload?: any\n}\n\nexport interface TableConfiguration<T> {\n headers: TableHeader[]\n rows: TableRow<T>[]\n}\n\nexport interface TableCell {\n renderer?: TemplateRef<any>\n payload?: any\n text?: string\n css?: string[]\n fullWidth?: boolean\n}\n\nexport interface TableRow<T> {\n payload?: T\n rowId?: string | number\n css?: string[]\n cellData: TableCell[]\n}\n\nexport enum SortTable {\n DEFAULT = 'DEFAULT',\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport interface SortCol {\n key: string\n sort: SortTable\n}\n\n@Component({\n selector: 'quang-table',\n templateUrl: './table.component.html',\n styleUrl: './table.component.scss',\n imports: [TranslocoPipe, NgClass, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * Table component for displaying data in a tabular format.\n *\n * It supports customizable column cells template and sorting rows by column headers.\n *\n * @usageNotes\n * The component must be configured using the {@link TableConfiguration} object\n */\nexport class QuangTableComponent<T> {\n clickableRow = input<boolean>(false)\n\n selectedRows = input<string[] | number[]>()\n\n stickyTable = input<boolean>(true)\n\n selectedRow = output<TableRow<T>>()\n\n sortChanged = output<SortCol[]>()\n\n public SortTable = SortTable\n\n destroyRef = inject(DestroyRef)\n\n _resizeObservableService = inject(ResizeObservableService)\n\n _tableHeader = viewChild<ElementRef>('tableHeader')\n\n _tableHeaderElement = viewChild<Element>('tableHeader')\n\n noResultsText = input<string>('quangTable.noResults')\n\n _tableHeaderEffect = effect(() => {\n if (this._tableHeader()) {\n this.fixTableHeaderWidth()\n }\n })\n\n _tableHeaderElementEffect = effect(() => {\n if (this._tableHeaderElement()) {\n this.fixTableHeaderWidth()\n }\n })\n\n _fakeTableHeader = viewChild<ElementRef>('fakeTableHeader')\n\n _fakeTableHeaderEffect = effect(() => {\n if (this._fakeTableHeader()) {\n this.fixTableHeaderWidth()\n }\n })\n\n tableConfigurations = input.required<TableConfiguration<T>>()\n\n _tableConfigurations = signal<TableConfiguration<T>>({\n headers: [],\n rows: [],\n })\n\n tableConfigurations$ = toObservable(this.tableConfigurations)\n .pipe(takeUntilDestroyed())\n .subscribe((data) => {\n const headers: TableHeader[] = []\n const rows: TableRow<T>[] = []\n for (const header of data.headers) {\n headers.push({ ...header })\n }\n for (const row of data.rows) {\n rows.push({ ...row })\n }\n this._tableConfigurations.set({\n headers,\n rows,\n })\n })\n\n effectTableConfigurations = effect(() => {\n if (this._tableConfigurations()) {\n this.fixTableHeaderWidth()\n }\n })\n\n hiddenColumnsObservable?: Subscription = undefined\n\n onClickRow(row: TableRow<T>): void {\n if (this.clickableRow()) {\n this.selectedRow.emit(row)\n }\n }\n\n isSelected(rowId: string | number): boolean {\n return !!this.selectedRows()?.some((x) => x === rowId)\n }\n\n lastWidth = -1\n\n fixTableHeaderWidth() {\n setTimeout(() => {\n const stickyColumns = this._tableHeader()?.nativeElement?.querySelectorAll('th')\n\n // Copy the column widths from our hidden Primary table header to our Sticky Table header.\n const hiddenColumns = this._fakeTableHeader()?.nativeElement?.querySelectorAll('th')\n\n if (stickyColumns?.length > 0 && hiddenColumns?.length > 0) {\n if (this.hiddenColumnsObservable) {\n this.hiddenColumnsObservable.unsubscribe()\n }\n this.hiddenColumnsObservable = this._resizeObservableService\n .widthResizeObservable(hiddenColumns[0])\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((data) => {\n if (data !== this.lastWidth) {\n this.lastWidth = data\n this.fixTableHeaderWidth()\n }\n })\n for (let i = 0; i < hiddenColumns?.length; i++) {\n const th = hiddenColumns[i]\n // Since the Sticky Table header is expected to be an exact copy of the Primary Table, we know their indices will be the same.\n stickyColumns[i].style.minWidth = `${th.offsetWidth}px`\n stickyColumns[i].style.maxWidth = `${th.offsetWidth}px`\n }\n }\n })\n }\n\n onSortColumn(sort: SortCol): void {\n const tableHeaders: TableHeader[] = []\n for (const header of this._tableConfigurations().headers) {\n tableHeaders.push({\n ...header,\n })\n }\n tableHeaders.forEach((header) => {\n if (!header.sort?.key) return\n\n if (header.sort?.key === sort.key) {\n switch (sort.sort) {\n case SortTable.ASC:\n header.sort.sort = SortTable.DESC\n break\n case SortTable.DESC:\n header.sort.sort = SortTable.DEFAULT\n break\n case SortTable.DEFAULT:\n default:\n header.sort.sort = SortTable.ASC\n break\n }\n } else {\n header.sort = {\n ...header.sort,\n sort: SortTable.DEFAULT,\n }\n }\n })\n this._tableConfigurations.set({ ...this._tableConfigurations(), headers: tableHeaders })\n this.sortChanged.emit([sort]) // it's an array to handle multisort in the future\n }\n}\n","<div\n [class.sticky-table]=\"stickyTable()\"\n class=\"table-responsive\"\n>\n @if (_tableConfigurations().rows.length) {\n <div\n (scroll)=\"tableContainer.scrollLeft = tableHeaderContainer.scrollLeft\"\n #tableHeaderContainer\n class=\"table-header-container\"\n id=\"tableHeaderContainer\"\n >\n <table\n #tableHeader\n id=\"tableHeader\"\n >\n <thead>\n <tr>\n @for (header of _tableConfigurations().headers; track $index) {\n <th\n [class.sort-btn]=\"header?.sort\"\n (click)=\"header?.sort ? onSortColumn(header.sort!) : null\"\n class=\"align-bottom\"\n >\n <div\n [ngClass]=\"header?.css\"\n class=\"align-self-end d-flex gap-1\"\n >\n {{ !header.renderer ? (header.text | transloco) : null }}\n <ng-container\n [ngTemplateOutlet]=\"header?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: header.payload,\n }\"\n ></ng-container>\n @if (header.sort?.key) {\n <div class=\"d-flex justify-content-between\">\n <ng-container\n [ngTemplateOutlet]=\"orderBtns\"\n [ngTemplateOutletContext]=\"{ $implicit: header.sort }\"\n ></ng-container>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n </table>\n </div>\n <div\n (scroll)=\"tableHeaderContainer.scrollLeft = tableContainer.scrollLeft\"\n #tableContainer\n class=\"table-container\"\n >\n <table\n class=\"table\"\n id=\"table-content\"\n >\n <thead\n #fakeTableHeader\n class=\"fake-table-header\"\n id=\"fakeTableHeader\"\n >\n <tr>\n @for (header of _tableConfigurations().headers; track $index) {\n <th\n [class.sort-btn]=\"header?.sort\"\n (click)=\"header?.sort ? onSortColumn(header.sort!) : null\"\n class=\"align-bottom\"\n >\n <div\n [ngClass]=\"header?.css\"\n class=\"align-self-end d-flex gap-1\"\n >\n {{ !header.renderer ? (header.text | transloco) : null }}\n <ng-container\n [ngTemplateOutlet]=\"header?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: header.payload,\n }\"\n ></ng-container>\n @if (header.sort?.key) {\n <div class=\"d-flex justify-content-between\">\n <ng-container\n [ngTemplateOutlet]=\"orderBtns\"\n [ngTemplateOutletContext]=\"{ $implicit: header.sort }\"\n ></ng-container>\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of _tableConfigurations().rows; track $index) {\n <tr\n [class.hover-table]=\"clickableRow()\"\n [class.selectedRow]=\"row?.rowId ? isSelected(row.rowId!) : null\"\n [ngClass]=\"row.css\"\n (click)=\"clickableRow() ? onClickRow(row) : null\"\n >\n @for (cell of row.cellData; track $index) {\n <td\n [attr.colspan]=\"cell?.fullWidth ? _tableConfigurations().headers.length : undefined\"\n [ngClass]=\"cell.css!\"\n >\n {{ !cell.renderer ? cell.text : null }}\n <ng-container\n [ngTemplateOutlet]=\"cell?.renderer ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.payload,\n }\"\n ></ng-container>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n @if (!_tableConfigurations().rows.length) {\n <h6 class=\"text-center mt-3\">\n {{ noResultsText() | transloco }}\n </h6>\n }\n</div>\n\n<ng-template\n #orderBtns\n let-order\n>\n <div\n [class.sort-asc]=\"order.sort === SortTable.ASC\"\n [class.sort-default]=\"order.sort === SortTable.DEFAULT\"\n [class.sort-desc]=\"order.sort === SortTable.DESC\"\n class=\"sort-arrows\"\n >\n <svg\n class=\"arrow-up\"\n fill=\"currentColor\"\n height=\"10\"\n stroke=\"currentColor\"\n viewBox=\"279.5 -600.5 401 201\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"m280-400 200-200 200 200H280Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n <svg\n class=\"arrow-down\"\n fill=\"currentColor\"\n height=\"10\"\n stroke=\"currentColor\"\n viewBox=\"279.5 -560.5 401 201\"\n width=\"10\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M480-360 280-560h400L480-360Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n ></path>\n </svg>\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;IAgDY;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,SAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EAJW,SAAS,KAAT,SAAS,GAIpB,EAAA,CAAA,CAAA;AAcD;;;;;;;AAOG;MACU,mBAAmB,CAAA;AAfhC,IAAA,WAAA,GAAA;AAgBE,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAU,KAAK,CAAC;QAEpC,IAAY,CAAA,YAAA,GAAG,KAAK,EAAuB;AAE3C,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAU,IAAI,CAAC;QAElC,IAAW,CAAA,WAAA,GAAG,MAAM,EAAe;QAEnC,IAAW,CAAA,WAAA,GAAG,MAAM,EAAa;QAE1B,IAAS,CAAA,SAAA,GAAG,SAAS;AAE5B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAE/B,QAAA,IAAA,CAAA,wBAAwB,GAAG,MAAM,CAAC,uBAAuB,CAAC;AAE1D,QAAA,IAAA,CAAA,YAAY,GAAG,SAAS,CAAa,aAAa,CAAC;AAEnD,QAAA,IAAA,CAAA,mBAAmB,GAAG,SAAS,CAAU,aAAa,CAAC;AAEvD,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAS,sBAAsB,CAAC;AAErD,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,MAAK;AAC/B,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;gBACvB,IAAI,CAAC,mBAAmB,EAAE;;AAE9B,SAAC,CAAC;AAEF,QAAA,IAAA,CAAA,yBAAyB,GAAG,MAAM,CAAC,MAAK;AACtC,YAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE;gBAC9B,IAAI,CAAC,mBAAmB,EAAE;;AAE9B,SAAC,CAAC;AAEF,QAAA,IAAA,CAAA,gBAAgB,GAAG,SAAS,CAAa,iBAAiB,CAAC;AAE3D,QAAA,IAAA,CAAA,sBAAsB,GAAG,MAAM,CAAC,MAAK;AACnC,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;gBAC3B,IAAI,CAAC,mBAAmB,EAAE;;AAE9B,SAAC,CAAC;AAEF,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,QAAQ,EAAyB;QAE7D,IAAoB,CAAA,oBAAA,GAAG,MAAM,CAAwB;AACnD,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,EAAE,EAAE;AACT,SAAA,CAAC;AAEF,QAAA,IAAA,CAAA,oBAAoB,GAAG,YAAY,CAAC,IAAI,CAAC,mBAAmB;aACzD,IAAI,CAAC,kBAAkB,EAAE;AACzB,aAAA,SAAS,CAAC,CAAC,IAAI,KAAI;YAClB,MAAM,OAAO,GAAkB,EAAE;YACjC,MAAM,IAAI,GAAkB,EAAE;AAC9B,YAAA,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE;gBACjC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;;AAE7B,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;;AAEvB,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;gBAC5B,OAAO;gBACP,IAAI;AACL,aAAA,CAAC;AACJ,SAAC,CAAC;AAEJ,QAAA,IAAA,CAAA,yBAAyB,GAAG,MAAM,CAAC,MAAK;AACtC,YAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;gBAC/B,IAAI,CAAC,mBAAmB,EAAE;;AAE9B,SAAC,CAAC;QAEF,IAAuB,CAAA,uBAAA,GAAkB,SAAS;QAYlD,IAAS,CAAA,SAAA,GAAG,CAAC,CAAC;AAiEf;AA3EC,IAAA,UAAU,CAAC,GAAgB,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;;;AAI9B,IAAA,UAAU,CAAC,KAAsB,EAAA;AAC/B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;;IAKxD,mBAAmB,GAAA;QACjB,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,gBAAgB,CAAC,IAAI,CAAC;;AAGhF,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,gBAAgB,CAAC,IAAI,CAAC;AAEpF,YAAA,IAAI,aAAa,EAAE,MAAM,GAAG,CAAC,IAAI,aAAa,EAAE,MAAM,GAAG,CAAC,EAAE;AAC1D,gBAAA,IAAI,IAAI,CAAC,uBAAuB,EAAE;AAChC,oBAAA,IAAI,CAAC,uBAAuB,CAAC,WAAW,EAAE;;AAE5C,gBAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACjC,qBAAA,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC;AACtC,qBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,qBAAA,SAAS,CAAC,CAAC,IAAI,KAAI;AAClB,oBAAA,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,EAAE;AAC3B,wBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;wBACrB,IAAI,CAAC,mBAAmB,EAAE;;AAE9B,iBAAC,CAAC;AACJ,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9C,oBAAA,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC;;AAE3B,oBAAA,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAG,EAAA,EAAE,CAAC,WAAW,IAAI;AACvD,oBAAA,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAG,EAAA,EAAE,CAAC,WAAW,IAAI;;;AAG7D,SAAC,CAAC;;AAGJ,IAAA,YAAY,CAAC,IAAa,EAAA;QACxB,MAAM,YAAY,GAAkB,EAAE;QACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC,OAAO,EAAE;YACxD,YAAY,CAAC,IAAI,CAAC;AAChB,gBAAA,GAAG,MAAM;AACV,aAAA,CAAC;;AAEJ,QAAA,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AAC9B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG;gBAAE;YAEvB,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE;AACjC,gBAAA,QAAQ,IAAI,CAAC,IAAI;oBACf,KAAK,SAAS,CAAC,GAAG;wBAChB,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI;wBACjC;oBACF,KAAK,SAAS,CAAC,IAAI;wBACjB,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO;wBACpC;oBACF,KAAK,SAAS,CAAC,OAAO;AACtB,oBAAA;wBACE,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG;wBAChC;;;iBAEC;gBACL,MAAM,CAAC,IAAI,GAAG;oBACZ,GAAG,MAAM,CAAC,IAAI;oBACd,IAAI,EAAE,SAAS,CAAC,OAAO;iBACxB;;AAEL,SAAC,CAAC;AACF,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QACxF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;;8GApJpB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,qtCC1EhC,u7KA2KA,EAAA,MAAA,EAAA,CAAA,y2DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,ED5GY,aAAa,EAAE,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,oFAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAWvC,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAf/B,SAAS;+BACE,aAAa,EAAA,OAAA,EAGd,CAAC,aAAa,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAA,eAAA,EAClC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,u7KAAA,EAAA,MAAA,EAAA,CAAA,y2DAAA,CAAA,EAAA;;;AEhEjD;;AAEG;;;;"}
@@ -1,4 +1,4 @@
1
- import { NgIf, NgClass } from '@angular/common';
1
+ import { NgClass } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
3
  import { viewChild, input, signal, inject, ChangeDetectorRef, effect, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
4
4
  import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -201,16 +201,16 @@ class QuangWysiwygComponent extends QuangBaseComponent {
201
201
  }
202
202
  return buttonList;
203
203
  }
204
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QuangWysiwygComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
205
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.14", type: QuangWysiwygComponent, isStandalone: true, selector: "quang-wysiwyg", inputs: { minHeight: { classPropertyName: "minHeight", publicName: "minHeight", isSignal: true, isRequired: false, transformFunction: null }, font: { classPropertyName: "font", publicName: "font", isSignal: true, isRequired: false, transformFunction: null }, fontSize: { classPropertyName: "fontSize", publicName: "fontSize", isSignal: true, isRequired: false, transformFunction: null }, formatBlock: { classPropertyName: "formatBlock", publicName: "formatBlock", isSignal: true, isRequired: false, transformFunction: null }, paragraphStyle: { classPropertyName: "paragraphStyle", publicName: "paragraphStyle", isSignal: true, isRequired: false, transformFunction: null }, blockquote: { classPropertyName: "blockquote", publicName: "blockquote", isSignal: true, isRequired: false, transformFunction: null }, bold: { classPropertyName: "bold", publicName: "bold", isSignal: true, isRequired: false, transformFunction: null }, underline: { classPropertyName: "underline", publicName: "underline", isSignal: true, isRequired: false, transformFunction: null }, italic: { classPropertyName: "italic", publicName: "italic", isSignal: true, isRequired: false, transformFunction: null }, strike: { classPropertyName: "strike", publicName: "strike", isSignal: true, isRequired: false, transformFunction: null }, fontColor: { classPropertyName: "fontColor", publicName: "fontColor", isSignal: true, isRequired: false, transformFunction: null }, highlightColor: { classPropertyName: "highlightColor", publicName: "highlightColor", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: "textStyle", publicName: "textStyle", isSignal: true, isRequired: false, transformFunction: null }, removeFormat: { classPropertyName: "removeFormat", publicName: "removeFormat", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, list: { classPropertyName: "list", publicName: "list", isSignal: true, isRequired: false, transformFunction: null }, table: { classPropertyName: "table", publicName: "table", isSignal: true, isRequired: false, transformFunction: null }, link: { classPropertyName: "link", publicName: "link", isSignal: true, isRequired: false, transformFunction: null }, image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: false, transformFunction: null }, fullScreen: { classPropertyName: "fullScreen", publicName: "fullScreen", isSignal: true, isRequired: false, transformFunction: null }, showBlocks: { classPropertyName: "showBlocks", publicName: "showBlocks", isSignal: true, isRequired: false, transformFunction: null }, onImageUploadError: { classPropertyName: "onImageUploadError", publicName: "onImageUploadError", isSignal: true, isRequired: false, transformFunction: null }, onFileDrop: { classPropertyName: "onFileDrop", publicName: "onFileDrop", isSignal: true, isRequired: false, transformFunction: null }, wysiwygOptions: { classPropertyName: "wysiwygOptions", publicName: "wysiwygOptions", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
204
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: QuangWysiwygComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
205
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.0", type: QuangWysiwygComponent, isStandalone: true, selector: "quang-wysiwyg", inputs: { minHeight: { classPropertyName: "minHeight", publicName: "minHeight", isSignal: true, isRequired: false, transformFunction: null }, font: { classPropertyName: "font", publicName: "font", isSignal: true, isRequired: false, transformFunction: null }, fontSize: { classPropertyName: "fontSize", publicName: "fontSize", isSignal: true, isRequired: false, transformFunction: null }, formatBlock: { classPropertyName: "formatBlock", publicName: "formatBlock", isSignal: true, isRequired: false, transformFunction: null }, paragraphStyle: { classPropertyName: "paragraphStyle", publicName: "paragraphStyle", isSignal: true, isRequired: false, transformFunction: null }, blockquote: { classPropertyName: "blockquote", publicName: "blockquote", isSignal: true, isRequired: false, transformFunction: null }, bold: { classPropertyName: "bold", publicName: "bold", isSignal: true, isRequired: false, transformFunction: null }, underline: { classPropertyName: "underline", publicName: "underline", isSignal: true, isRequired: false, transformFunction: null }, italic: { classPropertyName: "italic", publicName: "italic", isSignal: true, isRequired: false, transformFunction: null }, strike: { classPropertyName: "strike", publicName: "strike", isSignal: true, isRequired: false, transformFunction: null }, fontColor: { classPropertyName: "fontColor", publicName: "fontColor", isSignal: true, isRequired: false, transformFunction: null }, highlightColor: { classPropertyName: "highlightColor", publicName: "highlightColor", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: "textStyle", publicName: "textStyle", isSignal: true, isRequired: false, transformFunction: null }, removeFormat: { classPropertyName: "removeFormat", publicName: "removeFormat", isSignal: true, isRequired: false, transformFunction: null }, align: { classPropertyName: "align", publicName: "align", isSignal: true, isRequired: false, transformFunction: null }, list: { classPropertyName: "list", publicName: "list", isSignal: true, isRequired: false, transformFunction: null }, table: { classPropertyName: "table", publicName: "table", isSignal: true, isRequired: false, transformFunction: null }, link: { classPropertyName: "link", publicName: "link", isSignal: true, isRequired: false, transformFunction: null }, image: { classPropertyName: "image", publicName: "image", isSignal: true, isRequired: false, transformFunction: null }, fullScreen: { classPropertyName: "fullScreen", publicName: "fullScreen", isSignal: true, isRequired: false, transformFunction: null }, showBlocks: { classPropertyName: "showBlocks", publicName: "showBlocks", isSignal: true, isRequired: false, transformFunction: null }, onImageUploadError: { classPropertyName: "onImageUploadError", publicName: "onImageUploadError", isSignal: true, isRequired: false, transformFunction: null }, onFileDrop: { classPropertyName: "onFileDrop", publicName: "onFileDrop", isSignal: true, isRequired: false, transformFunction: null }, wysiwygOptions: { classPropertyName: "wysiwygOptions", publicName: "wysiwygOptions", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
206
206
  {
207
207
  provide: NG_VALUE_ACCESSOR,
208
208
  useExisting: forwardRef(() => QuangWysiwygComponent),
209
209
  multi: true,
210
210
  },
211
- ], viewQueries: [{ propertyName: "_inputForWysiwyg", first: true, predicate: ["inputForWysiwyg"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"mb-3\">\n <label\n [htmlFor]=\"componentId()\"\n *ngIf=\"componentLabel()\"\n class=\"form-label\"\n >\n {{ componentLabel() | transloco }}\n <span [hidden]=\"!_isRequired()\">*</span>\n </label>\n <div\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-wysiwyg-container is-invalid\"\n >\n <textarea\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"_value()\"\n #inputForWysiwyg\n class=\"form-control\"\n ></textarea>\n </div>\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n *ngIf=\"helpMessage()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n</div>\n", styles: [":host{display:block}::ng-deep .se-toolbar{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important;z-index:unset!important}::ng-deep .se-wrapper-inner{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .se-btn{color:var(--bs-body-color)!important}::ng-deep .se-btn:enabled.active{color:var(--bs-primary)!important}::ng-deep .se-btn:hover{background-color:var(--bs-secondary-bg)!important}::ng-deep .se-resizing-bar{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .se-navigation{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .sun-editor input{display:none}::ng-deep .sun-editor .se-container{border-radius:var(--bs-border-radius)}::ng-deep .se-wrapper{z-index:unset!important}::ng-deep .se-wrapper textarea:disabled+.se-wrapper-wysiwyg{background-color:var(--bs-secondary-bg)}::ng-deep .se-wrapper .se-wrapper-inner{border-top:1px solid var(--bs-border-color)}::ng-deep .is-invalid .sun-editor .se-container .se-toolbar{border-bottom:1px solid var(--bs-danger)}::ng-deep .is-invalid .sun-editor .se-container .se-wrapper .se-wrapper-inner{--bs-form-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");border:1px solid var(--bs-danger);padding-right:3rem;background-position:right .75rem center,center right 2.25rem;background-size:1.5rem,calc(.75em + .375rem) calc(.75em + .375rem);background-image:var(--bs-form-bg-icon);background-repeat:no-repeat}::ng-deep .is-valid .sun-editor .se-container .se-toolbar{border-bottom:1px solid var(--bs-success)}::ng-deep .is-valid .sun-editor .se-container .se-wrapper .se-wrapper-inner{--bs-form-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");border:1px solid var(--bs-success);padding-right:3rem;background-position:right .75rem center,center right 2.25rem;background-size:1.5rem,calc(.75em + .375rem) calc(.75em + .375rem);background-image:var(--bs-form-bg-icon);background-repeat:no-repeat}\n"], dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
211
+ ], viewQueries: [{ propertyName: "_inputForWysiwyg", first: true, predicate: ["inputForWysiwyg"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label\"\n >\n {{ componentLabel() | transloco }}\n <span [hidden]=\"!_isRequired()\">*</span>\n </label>\n }\n <div\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-wysiwyg-container is-invalid\"\n >\n <textarea\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"_value()\"\n #inputForWysiwyg\n class=\"form-control\"\n ></textarea>\n </div>\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n", styles: [":host{display:block}::ng-deep .se-toolbar{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important;z-index:unset!important}::ng-deep .se-wrapper-inner{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .se-btn{color:var(--bs-body-color)!important}::ng-deep .se-btn:enabled.active{color:var(--bs-primary)!important}::ng-deep .se-btn:hover{background-color:var(--bs-secondary-bg)!important}::ng-deep .se-resizing-bar{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .se-navigation{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .sun-editor input{display:none}::ng-deep .sun-editor .se-container{border-radius:var(--bs-border-radius)}::ng-deep .se-wrapper{z-index:unset!important}::ng-deep .se-wrapper textarea:disabled+.se-wrapper-wysiwyg{background-color:var(--bs-secondary-bg)}::ng-deep .se-wrapper .se-wrapper-inner{border-top:1px solid var(--bs-border-color)}::ng-deep .is-invalid .sun-editor .se-container .se-toolbar{border-bottom:1px solid var(--bs-danger)}::ng-deep .is-invalid .sun-editor .se-container .se-wrapper .se-wrapper-inner{--bs-form-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");border:1px solid var(--bs-danger);padding-right:3rem;background-position:right .75rem center,center right 2.25rem;background-size:1.5rem,calc(.75em + .375rem) calc(.75em + .375rem);background-image:var(--bs-form-bg-icon);background-repeat:no-repeat}::ng-deep .is-valid .sun-editor .se-container .se-toolbar{border-bottom:1px solid var(--bs-success)}::ng-deep .is-valid .sun-editor .se-container .se-wrapper .se-wrapper-inner{--bs-form-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");border:1px solid var(--bs-success);padding-right:3rem;background-position:right .75rem center,center right 2.25rem;background-size:1.5rem,calc(.75em + .375rem) calc(.75em + .375rem);background-image:var(--bs-form-bg-icon);background-repeat:no-repeat}\n"], dependencies: [{ kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
212
212
  }
213
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: QuangWysiwygComponent, decorators: [{
213
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.0", ngImport: i0, type: QuangWysiwygComponent, decorators: [{
214
214
  type: Component,
215
215
  args: [{ selector: 'quang-wysiwyg', providers: [
216
216
  {
@@ -218,7 +218,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
218
218
  useExisting: forwardRef(() => QuangWysiwygComponent),
219
219
  multi: true,
220
220
  },
221
- ], imports: [TranslocoPipe, NgIf, NgClass], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-3\">\n <label\n [htmlFor]=\"componentId()\"\n *ngIf=\"componentLabel()\"\n class=\"form-label\"\n >\n {{ componentLabel() | transloco }}\n <span [hidden]=\"!_isRequired()\">*</span>\n </label>\n <div\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-wysiwyg-container is-invalid\"\n >\n <textarea\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"_value()\"\n #inputForWysiwyg\n class=\"form-control\"\n ></textarea>\n </div>\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n *ngIf=\"helpMessage()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n</div>\n", styles: [":host{display:block}::ng-deep .se-toolbar{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important;z-index:unset!important}::ng-deep .se-wrapper-inner{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .se-btn{color:var(--bs-body-color)!important}::ng-deep .se-btn:enabled.active{color:var(--bs-primary)!important}::ng-deep .se-btn:hover{background-color:var(--bs-secondary-bg)!important}::ng-deep .se-resizing-bar{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .se-navigation{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .sun-editor input{display:none}::ng-deep .sun-editor .se-container{border-radius:var(--bs-border-radius)}::ng-deep .se-wrapper{z-index:unset!important}::ng-deep .se-wrapper textarea:disabled+.se-wrapper-wysiwyg{background-color:var(--bs-secondary-bg)}::ng-deep .se-wrapper .se-wrapper-inner{border-top:1px solid var(--bs-border-color)}::ng-deep .is-invalid .sun-editor .se-container .se-toolbar{border-bottom:1px solid var(--bs-danger)}::ng-deep .is-invalid .sun-editor .se-container .se-wrapper .se-wrapper-inner{--bs-form-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");border:1px solid var(--bs-danger);padding-right:3rem;background-position:right .75rem center,center right 2.25rem;background-size:1.5rem,calc(.75em + .375rem) calc(.75em + .375rem);background-image:var(--bs-form-bg-icon);background-repeat:no-repeat}::ng-deep .is-valid .sun-editor .se-container .se-toolbar{border-bottom:1px solid var(--bs-success)}::ng-deep .is-valid .sun-editor .se-container .se-wrapper .se-wrapper-inner{--bs-form-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");border:1px solid var(--bs-success);padding-right:3rem;background-position:right .75rem center,center right 2.25rem;background-size:1.5rem,calc(.75em + .375rem) calc(.75em + .375rem);background-image:var(--bs-form-bg-icon);background-repeat:no-repeat}\n"] }]
221
+ ], imports: [TranslocoPipe, NgClass], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-3\">\n @if (componentLabel()) {\n <label\n [htmlFor]=\"componentId()\"\n class=\"form-label\"\n >\n {{ componentLabel() | transloco }}\n <span [hidden]=\"!_isRequired()\">*</span>\n </label>\n }\n <div\n [class.is-invalid]=\"_showErrors()\"\n [class.is-valid]=\"_showSuccess()\"\n class=\"input-wysiwyg-container is-invalid\"\n >\n <textarea\n [disabled]=\"_isDisabled()\"\n [id]=\"componentId()\"\n [ngClass]=\"componentClass()\"\n [placeholder]=\"componentPlaceholder() | transloco\"\n [readOnly]=\"isReadonly()\"\n [tabIndex]=\"componentTabIndex()\"\n [value]=\"_value()\"\n #inputForWysiwyg\n class=\"form-control\"\n ></textarea>\n </div>\n <div class=\"valid-feedback\">\n {{ successMessage() | transloco }}\n </div>\n <div class=\"invalid-feedback\">\n {{ _currentErrorMessage() | transloco: _currentErrorMessageExtraData() }}\n </div>\n @if (helpMessage()) {\n <small\n [hidden]=\"_showSuccess() || _showErrors()\"\n aria-live=\"assertive\"\n class=\"form-text text-muted\"\n >\n {{ helpMessage() | transloco }}\n </small>\n }\n</div>\n", styles: [":host{display:block}::ng-deep .se-toolbar{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important;z-index:unset!important}::ng-deep .se-wrapper-inner{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .se-btn{color:var(--bs-body-color)!important}::ng-deep .se-btn:enabled.active{color:var(--bs-primary)!important}::ng-deep .se-btn:hover{background-color:var(--bs-secondary-bg)!important}::ng-deep .se-resizing-bar{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .se-navigation{color:var(--bs-body-color)!important;background-color:var(--bs-body-bg)!important}::ng-deep .sun-editor input{display:none}::ng-deep .sun-editor .se-container{border-radius:var(--bs-border-radius)}::ng-deep .se-wrapper{z-index:unset!important}::ng-deep .se-wrapper textarea:disabled+.se-wrapper-wysiwyg{background-color:var(--bs-secondary-bg)}::ng-deep .se-wrapper .se-wrapper-inner{border-top:1px solid var(--bs-border-color)}::ng-deep .is-invalid .sun-editor .se-container .se-toolbar{border-bottom:1px solid var(--bs-danger)}::ng-deep .is-invalid .sun-editor .se-container .se-wrapper .se-wrapper-inner{--bs-form-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");border:1px solid var(--bs-danger);padding-right:3rem;background-position:right .75rem center,center right 2.25rem;background-size:1.5rem,calc(.75em + .375rem) calc(.75em + .375rem);background-image:var(--bs-form-bg-icon);background-repeat:no-repeat}::ng-deep .is-valid .sun-editor .se-container .se-toolbar{border-bottom:1px solid var(--bs-success)}::ng-deep .is-valid .sun-editor .se-container .se-wrapper .se-wrapper-inner{--bs-form-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");border:1px solid var(--bs-success);padding-right:3rem;background-position:right .75rem center,center right 2.25rem;background-size:1.5rem,calc(.75em + .375rem) calc(.75em + .375rem);background-image:var(--bs-form-bg-icon);background-repeat:no-repeat}\n"] }]
222
222
  }] });
223
223
 
224
224
  /**