@sdcorejs/angular 19.1.6 → 19.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/README.md +10 -0
  2. package/assets/scss/core/menu.scss +18 -0
  3. package/assets/scss/core/utilities/_misc.scss +15 -0
  4. package/assets/scss/sd-core.scss +1 -0
  5. package/components/anchor/src/components/anchor/anchor.component.d.ts +3 -1
  6. package/components/badge/src/badge.component.d.ts +1 -0
  7. package/components/ckeditor-styles/src/ckeditor-styles.component.d.ts +1 -1
  8. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +2 -1
  9. package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +3 -1
  10. package/components/form-generic/src/components/form-render/components/item/components/checkbox/checkbox.component.d.ts +34 -0
  11. package/components/form-generic/src/components/form-render/components/item/components/index.d.ts +1 -0
  12. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +6 -1
  13. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
  14. package/components/form-generic/src/configurations/form.configuration.d.ts +1 -1
  15. package/components/form-generic/src/models/form-generic-component.model.d.ts +8 -8
  16. package/components/form-generic/src/models/form-generic-definition-selection.model.d.ts +5 -5
  17. package/components/form-generic/src/models/form-generic-expression.model.d.ts +12 -12
  18. package/components/form-generic/src/models/index.d.ts +1 -0
  19. package/components/form-generic/src/services/form-generic.service.d.ts +2 -2
  20. package/components/import-excel/src/import-excel.component.d.ts +1 -0
  21. package/components/index.d.ts +6 -1
  22. package/components/mini-editor/src/mini-editor.model.d.ts +1 -1
  23. package/components/modal/src/modal.component.d.ts +3 -2
  24. package/components/modal-resizable/src/modal-resizable.component.d.ts +92 -0
  25. package/components/modal-resizable/src/modal-resizable.registry.d.ts +22 -0
  26. package/components/org-chart/src/org-chart.component.d.ts +6 -0
  27. package/components/preview/src/preview-image/preview-image.component.d.ts +1 -0
  28. package/components/query-bar/src/components/actions-bar/actions-bar.component.d.ts +6 -2
  29. package/components/query-bar/src/components/build-chip/build-chip.component.d.ts +4 -1
  30. package/components/query-bar/src/components/chip-popover/chip-popover.component.d.ts +8 -0
  31. package/components/query-bar/src/components/field-picker/field-picker.component.d.ts +2 -0
  32. package/components/query-bar/src/components/inline-chip/inline-chip.component.d.ts +2 -0
  33. package/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.d.ts +3 -3
  34. package/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.d.ts +9 -4
  35. package/components/query-bar/src/query-bar.component.d.ts +32 -5
  36. package/components/query-bar/src/query-bar.model.d.ts +15 -12
  37. package/components/query-builder/src/query-builder.component.d.ts +76 -39
  38. package/components/query-builder/src/query-builder.model.d.ts +59 -52
  39. package/components/query-builder/src/query-builder.serializer.d.ts +15 -6
  40. package/components/section/src/section.component.d.ts +3 -0
  41. package/components/side-drawer/src/body-scroll-lock.service.d.ts +10 -0
  42. package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +1 -0
  43. package/components/tab-router/index.d.ts +2 -1
  44. package/components/tab-router/src/actions/tab-router.action.d.ts +2 -2
  45. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +2 -2
  46. package/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.d.ts +3 -3
  47. package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +3 -3
  48. package/components/tab-router/src/decorators/tab.decorator.d.ts +13 -1
  49. package/components/tab-router/src/events/tab-router.event.d.ts +3 -3
  50. package/components/tab-router/src/models/tab-router.model.d.ts +2 -2
  51. package/components/tab-router/src/pipes/tab-info.pipe.d.ts +2 -2
  52. package/components/tab-router/src/services/tab-router.service.d.ts +9 -9
  53. package/components/table/index.d.ts +1 -0
  54. package/components/table/src/components/config/config.component.d.ts +6 -1
  55. package/components/table/src/components/desktop-cell/view/view.component.d.ts +1 -0
  56. package/components/table/src/components/filter/external-filter/external-filter.component.d.ts +1 -1
  57. package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts +1 -1
  58. package/components/table/src/components/selector-action/action-filter.pipe.d.ts +8 -1
  59. package/components/table/src/components/selector-action/selector-action.component.d.ts +2 -0
  60. package/components/table/src/directives/index.d.ts +1 -0
  61. package/components/table/src/directives/sd-table-command-header-def.directive.d.ts +24 -0
  62. package/components/table/src/models/table-column.model.d.ts +30 -13
  63. package/components/table/src/models/table-item.model.d.ts +30 -1
  64. package/components/table/src/models/table-option-selector.model.d.ts +5 -4
  65. package/components/table/src/models/table-option.model.d.ts +12 -0
  66. package/components/table/src/pipes/sd-group.pipe.d.ts +6 -2
  67. package/components/table/src/services/table-filter/table-filter.model.d.ts +15 -15
  68. package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
  69. package/components/table/src/services/table-format/table-format.service.d.ts +1 -1
  70. package/components/table/src/services/table-selection/selection-action.util.d.ts +24 -0
  71. package/components/table/src/services/table-selection/table-selection.util.d.ts +31 -0
  72. package/components/table/src/services/tree/tree.util.d.ts +3 -2
  73. package/components/table/src/table.component.d.ts +51 -5
  74. package/components/tree/src/tree-item-def.directive.d.ts +1 -1
  75. package/components/tree/src/tree.component.d.ts +16 -4
  76. package/components/tree/src/tree.model.d.ts +31 -25
  77. package/components/upload-file/src/configurations/upload-file.configuration.d.ts +2 -2
  78. package/components/upload-file/src/upload-file.component.d.ts +4 -1
  79. package/configurations/src/sd-core.configuration.d.ts +1 -2
  80. package/fesm2022/sdcorejs-angular-components-anchor.mjs +36 -12
  81. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  82. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
  83. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-components-badge.mjs +15 -2
  85. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  87. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
  89. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
  91. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
  93. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
  95. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
  97. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
  99. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  100. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
  101. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
  103. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
  105. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
  107. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
  109. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-components-preview.mjs +27 -17
  111. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
  113. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
  115. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-components-section.mjs +16 -2
  117. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
  119. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
  121. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
  123. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
  125. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
  127. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  128. package/fesm2022/sdcorejs-angular-components-table.mjs +541 -254
  129. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  130. package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
  131. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  132. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
  133. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  134. package/fesm2022/sdcorejs-angular-components.mjs +6 -1
  135. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  136. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  137. package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
  138. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  139. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
  140. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  141. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
  142. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  143. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
  144. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  145. package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
  146. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  147. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +231 -60
  148. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  149. package/fesm2022/sdcorejs-angular-forms-date.mjs +95 -23
  150. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  151. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +130 -26
  152. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  153. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +39 -15
  154. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
  155. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
  156. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
  158. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  159. package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
  160. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular-forms-models.mjs +227 -6
  162. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  163. package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
  164. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  165. package/fesm2022/sdcorejs-angular-forms-select.mjs +135 -37
  166. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  167. package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
  168. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  169. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
  170. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  171. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
  172. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
  173. package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
  174. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
  175. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
  176. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
  177. package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
  178. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  179. package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
  180. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  181. package/fesm2022/sdcorejs-angular-i18n.mjs +490 -68
  182. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  183. package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
  184. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  185. package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
  186. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  187. package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
  188. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  189. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
  190. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  191. package/fesm2022/sdcorejs-angular-modules-layout.mjs +332 -111
  192. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  193. package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
  194. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  195. package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
  196. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  197. package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
  198. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  199. package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
  200. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  201. package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
  202. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  203. package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
  204. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  205. package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
  206. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  207. package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
  208. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  209. package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
  210. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  211. package/fesm2022/sdcorejs-angular-services.mjs +0 -1
  212. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  213. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
  214. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  215. package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
  216. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  217. package/fesm2022/sdcorejs-angular.mjs +17 -10
  218. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  219. package/forms/autocomplete/src/autocomplete.component.d.ts +5 -2
  220. package/forms/chip-calendar/src/chip-calendar.component.d.ts +10 -0
  221. package/forms/date/src/date.component.d.ts +13 -2
  222. package/forms/date-range/src/date-range.component.d.ts +13 -2
  223. package/forms/datetime/src/datetime.component.d.ts +13 -2
  224. package/forms/entity-picker/src/entity-picker.component.d.ts +9 -3
  225. package/forms/input/src/input.component.d.ts +3 -0
  226. package/forms/input-color/src/input-color.component.d.ts +4 -0
  227. package/forms/input-number/src/input-number.component.d.ts +3 -0
  228. package/forms/models/index.d.ts +3 -0
  229. package/forms/models/src/sd-form-control-connector.d.ts +12 -0
  230. package/forms/models/src/sd-model-facing-control.d.ts +43 -0
  231. package/forms/models/src/sd-search.model.d.ts +1 -1
  232. package/forms/models/src/sd-selection-data.model.d.ts +1 -1
  233. package/forms/models/src/sd-temporal-transform.d.ts +31 -0
  234. package/forms/models/src/sd-timer-scope.d.ts +29 -0
  235. package/forms/select/src/select.component.d.ts +27 -4
  236. package/forms/src/forms.module.d.ts +22 -13
  237. package/forms/switch/src/switch.component.d.ts +5 -0
  238. package/forms/textarea/src/textarea.component.d.ts +5 -3
  239. package/forms/time-range/src/time-range.component.d.ts +22 -1
  240. package/forms/tree-select/src/tree-select.component.d.ts +36 -5
  241. package/i18n/src/en.d.ts +90 -10
  242. package/i18n/src/i18n.messages.d.ts +1 -1
  243. package/i18n/src/i18n.pipe.d.ts +3 -3
  244. package/i18n/src/i18n.service.d.ts +2 -1
  245. package/i18n/src/i18n.types.d.ts +0 -3
  246. package/interceptors/no-internet/no-internet.interceptor.d.ts +11 -1
  247. package/modules/auth/services/auth.model.d.ts +1 -1
  248. package/modules/keycloak/keycloak.service.d.ts +1 -0
  249. package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +2 -0
  250. package/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.d.ts +3 -3
  251. package/modules/layout/components/sidebar-mobile-v1/main.component.d.ts +3 -3
  252. package/modules/layout/components/sidebar-mobile-v2/main.component.d.ts +3 -3
  253. package/modules/layout/components/sidebar-mobile-v3/main.component.d.ts +3 -3
  254. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +8 -3
  255. package/modules/layout/components/sidebar-v1/main.component.d.ts +3 -3
  256. package/modules/layout/components/sidebar-v2/main.component.d.ts +3 -3
  257. package/modules/layout/components/sidebar-v3/main.component.d.ts +3 -3
  258. package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +5 -0
  259. package/modules/layout/modules/not-found/pages/root/root.component.d.ts +5 -0
  260. package/modules/layout/services/layout.service.d.ts +21 -0
  261. package/modules/layout/services/storage/storage.service.d.ts +52 -7
  262. package/modules/permission/src/configurations/permission.configuration.d.ts +11 -0
  263. package/modules/permission/src/directives/permission.directive.d.ts +2 -1
  264. package/modules/permission/src/services/permission.service.d.ts +52 -1
  265. package/package.json +40 -33
  266. package/pipes/src/safe-html.pipe.d.ts +26 -4
  267. package/pipes/src/time-different.pipe.d.ts +1 -0
  268. package/public-api.d.ts +11 -10
  269. package/services/api/src/api-host.d.ts +15 -0
  270. package/services/api/src/api.model.d.ts +14 -0
  271. package/services/api/src/api.module.d.ts +6 -0
  272. package/services/cache/src/cache.model.d.ts +10 -0
  273. package/services/index.d.ts +0 -1
  274. package/services/notify/index.d.ts +1 -1
  275. package/utilities/extensions/index.d.ts +1 -5
  276. package/utilities/extensions/src/url-safety.d.ts +72 -0
  277. package/utilities/extensions/src/utility.extension.d.ts +9 -5
  278. package/utilities/models/index.d.ts +0 -10
  279. package/components/base/index.d.ts +0 -1
  280. package/components/base/src/base-secure.component.d.ts +0 -8
  281. package/components/document-builder/index.d.ts +0 -4
  282. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +0 -15
  283. package/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.d.ts +0 -4
  284. package/components/document-builder/src/components/index.d.ts +0 -1
  285. package/components/document-builder/src/document-builder.component.d.ts +0 -53
  286. package/components/document-builder/src/document-builder.config.d.ts +0 -21
  287. package/components/document-builder/src/document-builder.model.d.ts +0 -41
  288. package/components/document-builder/src/document-builder.utils.d.ts +0 -10
  289. package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +0 -9
  290. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +0 -44
  291. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +0 -57
  292. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +0 -5
  293. package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +0 -4
  294. package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +0 -31
  295. package/components/document-builder/src/plugins/image-upload/image-upload.plugin.d.ts +0 -5
  296. package/components/document-builder/src/plugins/index.d.ts +0 -11
  297. package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +0 -24
  298. package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +0 -14
  299. package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +0 -15
  300. package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +0 -25
  301. package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +0 -29
  302. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +0 -35
  303. package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +0 -15
  304. package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +0 -15
  305. package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +0 -15
  306. package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +0 -15
  307. package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +0 -15
  308. package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +0 -15
  309. package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +0 -54
  310. package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +0 -27
  311. package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +0 -16
  312. package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +0 -25
  313. package/components/document-builder/src/plugins/paste-handler/index.d.ts +0 -35
  314. package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +0 -31
  315. package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +0 -31
  316. package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +0 -29
  317. package/components/document-builder/src/plugins/paste-handler/types.d.ts +0 -30
  318. package/components/document-builder/src/plugins/table-custom/index.d.ts +0 -34
  319. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +0 -51
  320. package/components/table/src/pipes/selection-visible-select-all.pipe.d.ts +0 -9
  321. package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
  322. package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
  323. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
  324. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
  325. package/fesm2022/sdcorejs-angular-models.mjs +0 -6
  326. package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
  327. package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
  328. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
  329. package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
  330. package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
  331. package/models/index.d.ts +0 -1
  332. package/models/src/language.model.d.ts +0 -2
  333. package/services/docx/index.d.ts +0 -1
  334. package/services/docx/src/lib/docx.model.d.ts +0 -9
  335. package/services/docx/src/lib/docx.service.d.ts +0 -14
  336. package/services/docx/src/lib/pandoc-core.d.ts +0 -11
  337. package/services/docx/src/public-api.d.ts +0 -2
  338. package/services/license/index.d.ts +0 -1
  339. package/services/license/src/license.service.d.ts +0 -9
  340. package/utilities/extensions/src/array.extension.d.ts +0 -1
  341. package/utilities/extensions/src/color.extension.d.ts +0 -5
  342. package/utilities/extensions/src/date.extension.d.ts +0 -1
  343. package/utilities/extensions/src/number.extension.d.ts +0 -1
  344. package/utilities/extensions/src/string.extension.d.ts +0 -50
  345. package/utilities/models/src/color.model.d.ts +0 -4
  346. package/utilities/models/src/empty.model.d.ts +0 -4
  347. package/utilities/models/src/filter.model.d.ts +0 -12
  348. package/utilities/models/src/maybe-async.model.d.ts +0 -10
  349. package/utilities/models/src/nested-key-of.model.d.ts +0 -4
  350. package/utilities/models/src/operator.model.d.ts +0 -13
  351. package/utilities/models/src/order.model.d.ts +0 -4
  352. package/utilities/models/src/paging.model.d.ts +0 -8
  353. package/utilities/models/src/pattern.model.d.ts +0 -21
  354. package/utilities/models/src/size.model.d.ts +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-directives.mjs","sources":["../../../projects/sdcorejs-angular/directives/src/sd-scroll.directive.ts","../../../projects/sdcorejs-angular/directives/src/sd-desktop.directive.ts","../../../projects/sdcorejs-angular/directives/src/sd-mobile.directive.ts","../../../projects/sdcorejs-angular/directives/src/sd-hover-copy.directive.ts","../../../projects/sdcorejs-angular/directives/src/sd-href.directive.ts","../../../projects/sdcorejs-angular/directives/src/sd-tooltip.directive.ts","../../../projects/sdcorejs-angular/directives/sdcorejs-angular-directives.ts"],"sourcesContent":["import { Directive, ElementRef, HostListener, OnInit, Renderer2, inject } from '@angular/core';\n\n@Directive({\n selector: '[sdScroll]',\n standalone: true,\n})\nexport class SdScrollDirective implements OnInit {\n private elementRef = inject(ElementRef);\n private renderer = inject(Renderer2);\n\n #overflowX: 'hidden' | 'auto' | 'overlay' = 'hidden';\n #overflowY: 'hidden' | 'auto' | 'overlay' = 'auto';\n @HostListener('mouseover')\n onMouseOver() {\n this.#overflowX = 'auto';\n // this.#overflowY = 'auto';\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\n // this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-y', this.#overflowY);\n }\n\n @HostListener('mouseout')\n onMouseOut() {\n this.#overflowX = 'hidden';\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\n }\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n constructor() {}\n\n ngOnInit(): void {\n this.renderer.setStyle(this.elementRef.nativeElement, '-webkit-transform', 'translate3d(0, 0, 0)');\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-y', this.#overflowY);\n }\n\n scrollTop = () => {\n setTimeout(() => {\n if (this.elementRef?.nativeElement) {\n this.elementRef.nativeElement.scrollTop = 0;\n }\n }, 1);\n };\n}\n","import { Directive, TemplateRef, ViewContainerRef, inject } from '@angular/core';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\n\n@Directive({\n selector: '[sdDesktop]',\n standalone: true,\n})\nexport class SdDesktopDirective {\n readonly #templateRef: TemplateRef<Record<string, never>> = inject(TemplateRef);\n readonly #viewContainerRef = inject(ViewContainerRef);\n\n constructor() {\n if (!BrowserUtilities.isMobile()) {\n this.#viewContainerRef.createEmbeddedView(this.#templateRef);\n }\n }\n}\n","import { Directive, TemplateRef, ViewContainerRef, inject } from '@angular/core';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\n\n@Directive({\n selector: '[sdMobile]',\n standalone: true,\n})\nexport class SdMobileDirective {\n readonly #templateRef: TemplateRef<Record<string, never>> = inject(TemplateRef);\n readonly #viewContainerRef = inject(ViewContainerRef);\n\n constructor() {\n if (BrowserUtilities.isMobile()) {\n this.#viewContainerRef.createEmbeddedView(this.#templateRef);\n }\n }\n}\n","import { Directive, ElementRef, inject, Renderer2, HostListener, OnInit, OnChanges, SimpleChanges, input } from '@angular/core';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\n@Directive({\n selector: '[sdHoverCopy]',\n})\nexport class SdHoverCopyDirective implements OnInit, OnChanges {\n private el = inject(ElementRef);\n private renderer = inject(Renderer2);\n\n readonly copyText = input.required<string>({ alias: 'sdHoverCopy' });\n readonly sdHoverCopyDisabled = input(false);\n\n readonly #i18n = inject(I18nService);\n\n #copyButton: HTMLElement | null = null;\n #tooltip!: HTMLElement;\n get #defaultTooltip(): string {\n return this.#i18n.t('core.directive.hover-copy.tooltip');\n }\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\n\n // https://onemount.atlassian.net/browse/SM-2287\n // Hiện tại khi sdHoverCopyDisabled = true, directive chỉ dùng opacity: 0 và pointerEvents: 'none' để ẩn nút, nhưng điều này không hoàn toàn ngăn chặn được việc click trong một số trường hợp.\n // Giải pháp: Remove khỏi DOM nếu column không được enable\n ngOnInit(): void {\n if (!this.sdHoverCopyDisabled()) {\n this.#createAndAppendCopyButton();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['sdHoverCopyDisabled']) {\n if (!this.sdHoverCopyDisabled()) {\n // Enable - create and show button if not exists\n if (!this.#copyButton) {\n this.#createAndAppendCopyButton();\n }\n } else {\n // Disable - remove button from DOM\n this.#removeCopyButton();\n }\n }\n }\n\n #createAndAppendCopyButton(): void {\n const parent = this.el.nativeElement;\n this.renderer.setStyle(parent, 'position', 'relative');\n\n // Create button\n this.#copyButton = this.renderer.createElement('button');\n this.renderer.setStyle(this.#copyButton, 'position', 'absolute');\n this.renderer.setStyle(this.#copyButton, 'top', '50%');\n this.renderer.setStyle(this.#copyButton, 'transform', 'translateY(-50%)');\n this.renderer.setStyle(this.#copyButton, 'right', '4px');\n this.renderer.setStyle(this.#copyButton, 'display', 'none');\n this.renderer.setStyle(this.#copyButton, 'z-index', '10');\n this.renderer.setStyle(this.#copyButton, 'background', 'transparent');\n this.renderer.setStyle(this.#copyButton, 'border', 'none');\n this.renderer.setStyle(this.#copyButton, 'cursor', 'pointer');\n this.renderer.setStyle(this.#copyButton, 'padding', '1px');\n this.renderer.setStyle(this.#copyButton, 'border-radius', '3px');\n this.renderer.setStyle(this.#copyButton, 'padding', '5px');\n this.renderer.setStyle(this.#copyButton, 'line-height', '1');\n this.renderer.setStyle(this.#copyButton, 'background-color', 'var(--sd-surface-muted)');\n\n // Add inline SVG icon\n const svg = this.renderer.createElement('svg', 'svg');\n this.renderer.addClass(svg, 'text-secondary');\n this.renderer.setAttribute(svg, 'width', '14');\n this.renderer.setAttribute(svg, 'height', '14');\n this.renderer.setAttribute(svg, 'viewBox', '0 0 24 24');\n this.renderer.setAttribute(svg, 'fill', 'none');\n this.renderer.setAttribute(svg, 'xmlns', 'http://www.w3.org/2000/svg');\n\n const path = this.renderer.createElement('path', 'svg');\n this.renderer.setAttribute(\n path,\n 'd',\n 'M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM20 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H20C21.1 23 22 22.1 22 21V7C22 5.9 21.1 5 20 5ZM20 21H8V7H20V21Z'\n );\n this.renderer.setAttribute(path, 'fill', 'currentColor');\n this.renderer.appendChild(svg, path);\n this.renderer.appendChild(this.#copyButton, svg);\n\n // Tooltip\n this.#tooltip = this.renderer.createElement('span');\n this.renderer.setProperty(this.#tooltip, 'innerText', this.#defaultTooltip);\n this.renderer.setStyle(this.#tooltip, 'position', 'absolute');\n this.renderer.setStyle(this.#tooltip, 'bottom', '100%');\n this.renderer.setStyle(this.#tooltip, 'left', '50%');\n this.renderer.setStyle(this.#tooltip, 'transform', 'translateX(-50%)');\n this.renderer.setStyle(this.#tooltip, 'marginBottom', '4px');\n this.renderer.setStyle(this.#tooltip, 'background', '#333');\n this.renderer.setStyle(this.#tooltip, 'color', '#fff');\n this.renderer.setStyle(this.#tooltip, 'padding', '2px 6px');\n this.renderer.setStyle(this.#tooltip, 'borderRadius', '4px');\n this.renderer.setStyle(this.#tooltip, 'fontSize', '12px');\n this.renderer.setStyle(this.#tooltip, 'whiteSpace', 'nowrap');\n this.renderer.setStyle(this.#tooltip, 'opacity', '0');\n this.renderer.setStyle(this.#tooltip, 'transition', 'opacity 0.2s');\n this.renderer.setStyle(this.#tooltip, 'pointerEvents', 'none');\n this.renderer.setStyle(this.#tooltip, 'userSelect', 'none');\n\n this.renderer.appendChild(this.#copyButton, this.#tooltip);\n this.renderer.appendChild(parent, this.#copyButton);\n\n // Listen click\n this.renderer.listen(this.#copyButton, 'click', () => {\n const copyText = this.copyText();\n if (copyText && !this.sdHoverCopyDisabled()) {\n BrowserUtilities.copyToClipboard(String(copyText));\n this.#showTooltip('Copied');\n setTimeout(() => this.#hideTooltip(), 1000);\n }\n });\n }\n\n #removeCopyButton(): void {\n if (this.#copyButton) {\n this.renderer.removeChild(this.el.nativeElement, this.#copyButton);\n this.#copyButton = null;\n }\n }\n\n #showTooltip(message: string) {\n this.renderer.setProperty(this.#tooltip, 'innerText', message);\n this.renderer.setStyle(this.#tooltip, 'opacity', '1');\n }\n\n #hideTooltip() {\n this.renderer.setProperty(this.#tooltip, 'innerText', this.#defaultTooltip);\n this.renderer.setStyle(this.#tooltip, 'opacity', '0');\n }\n\n @HostListener('mouseenter')\n onMouseEnter() {\n if (!this.sdHoverCopyDisabled() && this.#copyButton) {\n this.renderer.setStyle(this.#copyButton, 'display', 'block');\n }\n }\n\n @HostListener('mouseleave')\n onMouseLeave() {\n if (this.#copyButton) {\n this.renderer.setStyle(this.#copyButton, 'display', 'none');\n this.#hideTooltip();\n }\n }\n}\n","import { Directive, HostBinding, HostListener, inject, input } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Directive({\n selector: 'a[sdHref]',\n standalone: true,\n})\nexport class SdHrefDirective {\n readonly #router = inject(Router);\n // Nhận vào url đã được xử lý (từ Pipe của bạn)\n readonly url = input.required<string>({ alias: 'sdHref' });\n // Tự động bind giá trị url vào thuộc tính href của thẻ <a>\n @HostBinding('attr.href') get href() {\n return this.url() || 'javascript:;';\n }\n\n @HostListener('click', ['$event'])\n onClick(event: Event) {\n const url = this.url();\n if (!url) return;\n if (url.startsWith('http')) {\n // Nếu là link ngoài -> Mở tab mới và ngăn chặn hành vi mặc định của thẻ a (để không chuyển trang hiện tại)\n window.open(url, '_blank');\n event.preventDefault();\n } else {\n // Nếu là link nội bộ -> Ngăn chặn full-page reload, dùng Angular Router để điều hướng\n event.preventDefault();\n const [path, queryString] = url.split('?');\n // Bạn có thể dùng hàm SdUtilities.parseQueryParams của bạn ở đây,\n // hoặc dùng cách native URLSearchParams như sau:\n const params = new URLSearchParams(queryString || '');\n const queryParams: Record<string, string> = {};\n params.forEach((value, key) => (queryParams[key] = value));\n this.#router.navigate([path], { queryParams });\n }\n }\n}\n","import {\n Directive,\n ElementRef,\n HostListener,\n TemplateRef,\n ViewContainerRef,\n inject,\n input,\n DestroyRef,\n ComponentRef,\n Component,\n ChangeDetectorRef,\n computed,\n} from '@angular/core';\nimport { Overlay, OverlayRef, ConnectionPositionPair } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet } from '@angular/common';\n\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\n// Component dùng để instance cho overlay\n@Component({\n selector: 'sd-tooltip-container',\n standalone: true,\n imports: [NgTemplateOutlet],\n template: `\n <div class=\"c-sd-tooltip-container\" [style.background-color]=\"color()\">\n @if (isTemplate()) {\n <ng-container [ngTemplateOutlet]=\"templateContent()\"></ng-container>\n } @else {\n <span class=\"c-sd-tooltip-text\">{{ textContent() }}</span>\n }\n </div>\n `,\n styles: [\n `\n .c-sd-tooltip-container {\n padding: 6px 8px;\n border-radius: 4px;\n color: white;\n font-size: 12px;\n font-family: Roboto, 'Helvetica Neue', sans-serif;\n box-shadow:\n 0 2px 4px -1px #0003,\n 0 4px 5px #00000024,\n 0 1px 10px #0000001f;\n max-width: 250px;\n word-wrap: break-word;\n pointer-events: auto;\n user-select: text;\n }\n `,\n ],\n host: {\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n})\nclass SdTooltipComponent {\n private cdr = inject(ChangeDetectorRef);\n\n content = input.required<string | TemplateRef<any>>();\n color = input<string>('#616161');\n\n isTemplate = computed(() => this.content() instanceof TemplateRef);\n templateContent = computed(() => (this.isTemplate() ? (this.content() as TemplateRef<any>) : null));\n textContent = computed(() => (!this.isTemplate() ? (this.content() as string) : ''));\n onMouseEnterCb?: () => void;\n onMouseLeaveCb?: () => void;\n\n onMouseEnter() {\n this.onMouseEnterCb?.();\n }\n\n onMouseLeave() {\n this.onMouseLeaveCb?.();\n }\n\n triggerChangeDetection() {\n this.cdr.detectChanges();\n }\n}\n// End\n\n// Directive\n@Directive({\n selector: '[sdTooltip]',\n standalone: true,\n})\nexport class SdTooltipDirective {\n content = input.required<string | TemplateRef<any>>({ alias: 'sdTooltip' });\n sdTooltipPosition = input<TooltipPosition>('bottom');\n sdTooltipDelay = input<number>(100);\n sdTooltipColor = input<string>('#616161');\n\n private static activeTooltip: SdTooltipDirective | null = null;\n\n private readonly elementRef = inject(ElementRef);\n private readonly overlay = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n\n private overlayRef: OverlayRef | null = null;\n private tooltipComponentRef: ComponentRef<SdTooltipComponent> | null = null;\n private tooltipInstance: SdTooltipComponent | null = null;\n\n private showTimeout: ReturnType<typeof setTimeout> | undefined;\n private hideTimeout: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.#cleanup();\n });\n }\n\n @HostListener('mouseenter')\n onMouseEnter() {\n if (SdTooltipDirective.activeTooltip && SdTooltipDirective.activeTooltip !== this) {\n SdTooltipDirective.activeTooltip.forceHide();\n }\n SdTooltipDirective.activeTooltip = this;\n\n this.#clearTimeouts();\n this.showTimeout = setTimeout(() => {\n this.#show();\n }, this.sdTooltipDelay());\n }\n\n @HostListener('mouseleave')\n onMouseLeave() {\n this.#clearTimeouts();\n this.hideTimeout = setTimeout(() => {\n this.#hide();\n }, 300);\n }\n\n forceHide = (): void => {\n this.#clearTimeouts();\n this.#hide();\n };\n\n #show = (): void => {\n const currentContent = this.content();\n\n if (!currentContent) return;\n\n if (!this.overlayRef) {\n this.#createOverlay();\n }\n\n if (this.overlayRef && !this.overlayRef.hasAttached()) {\n const portal = new ComponentPortal(SdTooltipComponent, this.viewContainerRef);\n this.tooltipComponentRef = this.overlayRef.attach(portal);\n this.tooltipInstance = this.tooltipComponentRef.instance;\n\n this.#setupTooltipInstance();\n }\n\n if (this.tooltipComponentRef && this.tooltipInstance) {\n this.tooltipComponentRef.setInput('content', currentContent);\n this.tooltipComponentRef.setInput('color', this.sdTooltipColor());\n this.tooltipInstance.triggerChangeDetection();\n }\n };\n\n #hide = (): void => {\n if (this.tooltipInstance && this.overlayRef?.hasAttached()) {\n this.overlayRef.detach();\n this.tooltipInstance = null;\n this.tooltipComponentRef = null;\n }\n };\n\n #createOverlay = (): void => {\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions(this.#getPositions())\n .withViewportMargin(8)\n .withPush(false);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.close(),\n panelClass: 'c-sd-tooltip-panel',\n });\n };\n\n #setupTooltipInstance = (): void => {\n if (!this.tooltipInstance) return;\n\n this.tooltipInstance.onMouseEnterCb = () => {\n clearTimeout(this.hideTimeout);\n };\n\n this.tooltipInstance.onMouseLeaveCb = () => {\n this.hideTimeout = setTimeout(() => {\n this.#hide();\n }, 200);\n };\n };\n\n #clearTimeouts = (): void => {\n clearTimeout(this.showTimeout);\n clearTimeout(this.hideTimeout);\n };\n\n #cleanup = (): void => {\n this.#clearTimeouts();\n\n if (SdTooltipDirective.activeTooltip === this) {\n SdTooltipDirective.activeTooltip = null;\n }\n\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n\n // Xóa mọi tham chiếu\n this.tooltipInstance = null;\n this.tooltipComponentRef = null;\n };\n\n #getPositions = (): ConnectionPositionPair[] => {\n const offset = 8;\n const topPos: ConnectionPositionPair = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset };\n const bottomPos: ConnectionPositionPair = {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: offset,\n };\n const leftPos: ConnectionPositionPair = { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset };\n const rightPos: ConnectionPositionPair = { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset };\n\n switch (this.sdTooltipPosition()) {\n case 'top':\n return [topPos, bottomPos, rightPos, leftPos];\n case 'bottom':\n return [bottomPos, topPos, rightPos, leftPos];\n case 'left':\n return [leftPos, rightPos, topPos, bottomPos];\n case 'right':\n return [rightPos, leftPos, topPos, bottomPos];\n default:\n return [bottomPos, topPos];\n }\n };\n}\n// End\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;MAMa,iBAAiB,CAAA;AACpB,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;IAEpC,UAAU,GAAkC,QAAQ;IACpD,UAAU,GAAkC,MAAM;IAElD,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,UAAU,GAAG,MAAM;;AAExB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC;;IAEtF;IAGA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC;IACtF;AAIA,IAAA,WAAA,GAAA,EAAe;IAEf,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,mBAAmB,EAAE,sBAAsB,CAAC;AAClG,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC;AACpF,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC;IACtF;IAEA,SAAS,GAAG,MAAK;QACf,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE;gBAClC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,GAAG,CAAC;YAC7C;QACF,CAAC,EAAE,CAAC,CAAC;AACP,IAAA,CAAC;wGApCU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,cAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJ7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;wDAQC,WAAW,EAAA,CAAA;sBADV,YAAY;uBAAC,WAAW;gBASzB,UAAU,EAAA,CAAA;sBADT,YAAY;uBAAC,UAAU;;;MCbb,kBAAkB,CAAA;AACpB,IAAA,YAAY,GAAuC,MAAM,CAAC,WAAW,CAAC;AACtE,IAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAErD,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,EAAE;YAChC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC;QAC9D;IACF;wGARW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCCY,iBAAiB,CAAA;AACnB,IAAA,YAAY,GAAuC,MAAM,CAAC,WAAW,CAAC;AACtE,IAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAErD,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,gBAAgB,CAAC,QAAQ,EAAE,EAAE;YAC/B,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC;QAC9D;IACF;wGARW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJ7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;MCCY,oBAAoB,CAAA;AACvB,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;IAE3B,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAS,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AAC3D,IAAA,mBAAmB,GAAG,KAAK,CAAC,KAAK,CAAC;AAElC,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;IAEpC,WAAW,GAAuB,IAAI;AACtC,IAAA,QAAQ;AACR,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mCAAmC,CAAC;IAC1D;AAKA,IAAA,WAAA,GAAA,EAAe;;;;IAKf,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;YAC/B,IAAI,CAAC,0BAA0B,EAAE;QACnC;IACF;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,qBAAqB,CAAC,EAAE;AAClC,YAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;;AAE/B,gBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;oBACrB,IAAI,CAAC,0BAA0B,EAAE;gBACnC;YACF;iBAAO;;gBAEL,IAAI,CAAC,iBAAiB,EAAE;YAC1B;QACF;IACF;IAEA,0BAA0B,GAAA;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;QACpC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC;;QAGtD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AACxD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC;AAChE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC;AACtD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,kBAAkB,CAAC;AACzE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC;AACxD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;AAC3D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC;AACzD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,CAAC;AACrE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC;AAC1D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC;AAC7D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC;AAC1D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,KAAK,CAAC;AAChE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC;AAC1D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC;AAC5D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,EAAE,yBAAyB,CAAC;;AAGvF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;QAC7C,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,4BAA4B,CAAC;AAEtE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,YAAY,CACxB,IAAI,EACJ,GAAG,EACH,mJAAmJ,CACpJ;QACD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;;QAGhD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AACnD,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC;AAC3E,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;AAC7D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;AACvD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC;AACpD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,kBAAkB,CAAC;AACtE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC;AAC5D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC;AAC3D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC;AACtD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;AAC3D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,CAAC;AAC5D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC;AACzD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;AAC7D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC;AACrD,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC;AACnE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC;AAC9D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC;AAE3D,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC;;AAGnD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,MAAK;AACnD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;YAChC,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE;gBAC3C,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAClD,gBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;gBAC3B,UAAU,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC;YAC7C;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC;AAClE,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACzB;IACF;AAEA,IAAA,YAAY,CAAC,OAAe,EAAA;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;AAC9D,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC;IACvD;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC;AAC3E,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC;IACvD;IAGA,YAAY,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE;AACnD,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC;QAC9D;IACF;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC;YAC3D,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;wGAlJW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AAC1B,iBAAA;wDAuIC,YAAY,EAAA,CAAA;sBADX,YAAY;uBAAC,YAAY;gBAQ1B,YAAY,EAAA,CAAA;sBADX,YAAY;uBAAC,YAAY;;;MC5If,eAAe,CAAA;AACjB,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;;IAExB,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;;AAE1D,IAAA,IAA8B,IAAI,GAAA;AAChC,QAAA,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,cAAc;IACrC;AAGA,IAAA,OAAO,CAAC,KAAY,EAAA;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;;AAE1B,YAAA,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;YAC1B,KAAK,CAAC,cAAc,EAAE;QACxB;aAAO;;YAEL,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;;;YAG1C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,WAAW,IAAI,EAAE,CAAC;YACrD,MAAM,WAAW,GAA2B,EAAE;AAC9C,YAAA,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC;QAChD;IACF;wGA5BW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,WAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACrB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;8BAM+B,IAAI,EAAA,CAAA;sBAAjC,WAAW;uBAAC,WAAW;gBAKxB,OAAO,EAAA,CAAA;sBADN,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;;;ACInC;AACA,MAqCM,kBAAkB,CAAA;AACd,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEvC,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA6B;AACrD,IAAA,KAAK,GAAG,KAAK,CAAS,SAAS,CAAC;AAEhC,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,YAAY,WAAW,CAAC;IAClE,eAAe,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,UAAU,EAAE,GAAI,IAAI,CAAC,OAAO,EAAuB,GAAG,IAAI,CAAC,CAAC;IACnG,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,GAAI,IAAI,CAAC,OAAO,EAAa,GAAG,EAAE,CAAC,CAAC;AACpF,IAAA,cAAc;AACd,IAAA,cAAc;IAEd,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,cAAc,IAAI;IACzB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,cAAc,IAAI;IACzB;IAEA,sBAAsB,GAAA;AACpB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;wGAtBI,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAjCZ;;;;;;;;AAQT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,iTAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EATS,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAkCtB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBArCvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,cACpB,IAAI,EAAA,OAAA,EACP,CAAC,gBAAgB,CAAC,EAAA,QAAA,EACjB;;;;;;;;GAQT,EAAA,IAAA,EAoBK;AACJ,wBAAA,cAAc,EAAE,gBAAgB;AAChC,wBAAA,cAAc,EAAE,gBAAgB;AACjC,qBAAA,EAAA,MAAA,EAAA,CAAA,iTAAA,CAAA,EAAA;;AA0BH;AAEA;MAKa,kBAAkB,CAAA;IAC7B,OAAO,GAAG,KAAK,CAAC,QAAQ,CAA4B,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;AAC3E,IAAA,iBAAiB,GAAG,KAAK,CAAkB,QAAQ,CAAC;AACpD,IAAA,cAAc,GAAG,KAAK,CAAS,GAAG,CAAC;AACnC,IAAA,cAAc,GAAG,KAAK,CAAS,SAAS,CAAC;AAEjC,IAAA,OAAO,aAAa,GAA8B,IAAI;AAE7C,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;AACzB,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAExC,UAAU,GAAsB,IAAI;IACpC,mBAAmB,GAA4C,IAAI;IACnE,eAAe,GAA8B,IAAI;AAEjD,IAAA,WAAW;AACX,IAAA,WAAW;AAEnB,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,CAAC;IACJ;IAGA,YAAY,GAAA;QACV,IAAI,EAAkB,CAAC,aAAa,IAAI,EAAkB,CAAC,aAAa,KAAK,IAAI,EAAE;AACjF,YAAA,EAAkB,CAAC,aAAa,CAAC,SAAS,EAAE;QAC9C;AACA,QAAA,EAAkB,CAAC,aAAa,GAAG,IAAI;QAEvC,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,MAAK;YACjC,IAAI,CAAC,KAAK,EAAE;AACd,QAAA,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;IAC3B;IAGA,YAAY,GAAA;QACV,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,MAAK;YACjC,IAAI,CAAC,KAAK,EAAE;QACd,CAAC,EAAE,GAAG,CAAC;IACT;IAEA,SAAS,GAAG,MAAW;QACrB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,KAAK,EAAE;AACd,IAAA,CAAC;IAED,KAAK,GAAG,MAAW;AACjB,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE;AAErC,QAAA,IAAI,CAAC,cAAc;YAAE;AAErB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,cAAc,EAAE;QACvB;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE;YACrD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC;YAC7E,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;YACzD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ;YAExD,IAAI,CAAC,qBAAqB,EAAE;QAC9B;QAEA,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,eAAe,EAAE;YACpD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;AAC5D,YAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;AACjE,YAAA,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE;QAC/C;AACF,IAAA,CAAC;IAED,KAAK,GAAG,MAAW;QACjB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE;AAC1D,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;QACjC;AACF,IAAA,CAAC;IAED,cAAc,GAAG,MAAW;AAC1B,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC3B,aAAA,QAAQ;AACR,aAAA,mBAAmB,CAAC,IAAI,CAAC,UAAU;AACnC,aAAA,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE;aAClC,kBAAkB,CAAC,CAAC;aACpB,QAAQ,CAAC,KAAK,CAAC;QAElB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACpC,gBAAgB;YAChB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE;AACrD,YAAA,UAAU,EAAE,oBAAoB;AACjC,SAAA,CAAC;AACJ,IAAA,CAAC;IAED,qBAAqB,GAAG,MAAW;QACjC,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE;AAE3B,QAAA,IAAI,CAAC,eAAe,CAAC,cAAc,GAAG,MAAK;AACzC,YAAA,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;AAChC,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,eAAe,CAAC,cAAc,GAAG,MAAK;AACzC,YAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,MAAK;gBACjC,IAAI,CAAC,KAAK,EAAE;YACd,CAAC,EAAE,GAAG,CAAC;AACT,QAAA,CAAC;AACH,IAAA,CAAC;IAED,cAAc,GAAG,MAAW;AAC1B,QAAA,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;AAC9B,QAAA,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;AAChC,IAAA,CAAC;IAED,QAAQ,GAAG,MAAW;QACpB,IAAI,CAAC,cAAc,EAAE;AAErB,QAAA,IAAI,EAAkB,CAAC,aAAa,KAAK,IAAI,EAAE;AAC7C,YAAA,EAAkB,CAAC,aAAa,GAAG,IAAI;QACzC;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACxB;;AAGA,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AACjC,IAAA,CAAC;IAED,aAAa,GAAG,MAA+B;QAC7C,MAAM,MAAM,GAAG,CAAC;QAChB,MAAM,MAAM,GAA2B,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE;AACtI,QAAA,MAAM,SAAS,GAA2B;AACxC,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,OAAO,EAAE,MAAM;SAChB;QACD,MAAM,OAAO,GAA2B,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE;QACtI,MAAM,QAAQ,GAA2B,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;AAEtI,QAAA,QAAQ,IAAI,CAAC,iBAAiB,EAAE;AAC9B,YAAA,KAAK,KAAK;gBACR,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC/C,YAAA,KAAK,QAAQ;gBACX,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC/C,YAAA,KAAK,MAAM;gBACT,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC;AAC/C,YAAA,KAAK,OAAO;gBACV,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC;AAC/C,YAAA;AACE,gBAAA,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;;AAEhC,IAAA,CAAC;wGAhKU,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;;4FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;wDA4BC,YAAY,EAAA,CAAA;sBADX,YAAY;uBAAC,YAAY;gBAc1B,YAAY,EAAA,CAAA;sBADX,YAAY;uBAAC,YAAY;;;AChI5B;;AAEG;;;;"}
1
+ {"version":3,"file":"sdcorejs-angular-directives.mjs","sources":["../../../projects/sdcorejs-angular/directives/src/sd-scroll.directive.ts","../../../projects/sdcorejs-angular/directives/src/sd-desktop.directive.ts","../../../projects/sdcorejs-angular/directives/src/sd-mobile.directive.ts","../../../projects/sdcorejs-angular/directives/src/sd-hover-copy.directive.ts","../../../projects/sdcorejs-angular/directives/src/sd-href.directive.ts","../../../projects/sdcorejs-angular/directives/src/sd-tooltip.directive.ts","../../../projects/sdcorejs-angular/directives/sdcorejs-angular-directives.ts"],"sourcesContent":["import { Directive, ElementRef, HostListener, OnInit, Renderer2, inject } from '@angular/core';\n\n@Directive({\n selector: '[sdScroll]',\n standalone: true,\n})\nexport class SdScrollDirective implements OnInit {\n private elementRef = inject(ElementRef);\n private renderer = inject(Renderer2);\n\n #overflowX: 'hidden' | 'auto' | 'overlay' = 'hidden';\n #overflowY: 'hidden' | 'auto' | 'overlay' = 'auto';\n @HostListener('mouseover')\n onMouseOver() {\n this.#overflowX = 'auto';\n // this.#overflowY = 'auto';\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\n // this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-y', this.#overflowY);\n }\n\n @HostListener('mouseout')\n onMouseOut() {\n this.#overflowX = 'hidden';\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\n }\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n constructor() {}\n\n ngOnInit(): void {\n this.renderer.setStyle(this.elementRef.nativeElement, '-webkit-transform', 'translate3d(0, 0, 0)');\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-x', this.#overflowX);\n this.renderer.setStyle(this.elementRef.nativeElement, 'overflow-y', this.#overflowY);\n }\n\n scrollTop = () => {\n setTimeout(() => {\n if (this.elementRef?.nativeElement) {\n this.elementRef.nativeElement.scrollTop = 0;\n }\n }, 1);\n };\n}\n","import { Directive, TemplateRef, ViewContainerRef, inject } from '@angular/core';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\n\n@Directive({\n selector: '[sdDesktop]',\n standalone: true,\n})\nexport class SdDesktopDirective {\n readonly #templateRef: TemplateRef<Record<string, never>> = inject(TemplateRef);\n readonly #viewContainerRef = inject(ViewContainerRef);\n\n constructor() {\n if (!BrowserUtilities.isMobile()) {\n this.#viewContainerRef.createEmbeddedView(this.#templateRef);\n }\n }\n}\n","import { Directive, TemplateRef, ViewContainerRef, inject } from '@angular/core';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\n\n@Directive({\n selector: '[sdMobile]',\n standalone: true,\n})\nexport class SdMobileDirective {\n readonly #templateRef: TemplateRef<Record<string, never>> = inject(TemplateRef);\n readonly #viewContainerRef = inject(ViewContainerRef);\n\n constructor() {\n if (BrowserUtilities.isMobile()) {\n this.#viewContainerRef.createEmbeddedView(this.#templateRef);\n }\n }\n}\n","import { DestroyRef, Directive, ElementRef, inject, Renderer2, HostListener, OnInit, OnChanges, SimpleChanges, input } from '@angular/core';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\n@Directive({\n selector: '[sdHoverCopy]',\n})\nexport class SdHoverCopyDirective implements OnInit, OnChanges {\n private el = inject(ElementRef);\n private renderer = inject(Renderer2);\n\n readonly copyText = input.required<string>({ alias: 'sdHoverCopy' });\n readonly sdHoverCopyDisabled = input(false);\n\n readonly #i18n = inject(I18nService);\n readonly #destroyRef = inject(DestroyRef);\n\n #copyButton: HTMLElement | null = null;\n #tooltip!: HTMLElement;\n #hideTooltipTimer: ReturnType<typeof setTimeout> | null = null;\n get #defaultTooltip(): string {\n return this.#i18n.t('core.directive.hover-copy.tooltip');\n }\n // why: tooltip mặc định đã đi qua I18nService từ trước, riêng phản hồi sau khi copy vẫn cứng\n // 'Copied' — cùng một tooltip mà hai ngôn ngữ. Đọc lúc hiển thị để bám ngôn ngữ hiện tại.\n get #copiedTooltip(): string {\n return this.#i18n.t('core.directive.hover-copy.copied');\n }\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {\n // why: timeout 1s ẩn tooltip trước đây không được lưu lại cũng không huỷ, mà directive lại\n // không có teardown nào. Host bị destroy trong vòng 1s đó thì callback vẫn chạy và ghi style\n // lên node đã tháo khỏi DOM (timer sống lâu hơn view).\n this.#destroyRef.onDestroy(() => this.#clearHideTooltipTimer());\n }\n\n // https://onemount.atlassian.net/browse/SM-2287\n // Hiện tại khi sdHoverCopyDisabled = true, directive chỉ dùng opacity: 0 và pointerEvents: 'none' để ẩn nút, nhưng điều này không hoàn toàn ngăn chặn được việc click trong một số trường hợp.\n // Giải pháp: Remove khỏi DOM nếu column không được enable\n ngOnInit(): void {\n if (!this.sdHoverCopyDisabled()) {\n this.#createAndAppendCopyButton();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['sdHoverCopyDisabled']) {\n if (!this.sdHoverCopyDisabled()) {\n // Enable - create and show button if not exists\n if (!this.#copyButton) {\n this.#createAndAppendCopyButton();\n }\n } else {\n // Disable - remove button from DOM\n this.#removeCopyButton();\n }\n }\n }\n\n #createAndAppendCopyButton(): void {\n const parent = this.el.nativeElement;\n this.renderer.setStyle(parent, 'position', 'relative');\n\n // Create button\n this.#copyButton = this.renderer.createElement('button');\n this.renderer.setStyle(this.#copyButton, 'position', 'absolute');\n this.renderer.setStyle(this.#copyButton, 'top', '50%');\n this.renderer.setStyle(this.#copyButton, 'transform', 'translateY(-50%)');\n this.renderer.setStyle(this.#copyButton, 'right', '4px');\n this.renderer.setStyle(this.#copyButton, 'display', 'none');\n this.renderer.setStyle(this.#copyButton, 'z-index', '10');\n this.renderer.setStyle(this.#copyButton, 'background', 'transparent');\n this.renderer.setStyle(this.#copyButton, 'border', 'none');\n this.renderer.setStyle(this.#copyButton, 'cursor', 'pointer');\n this.renderer.setStyle(this.#copyButton, 'padding', '1px');\n this.renderer.setStyle(this.#copyButton, 'border-radius', '3px');\n this.renderer.setStyle(this.#copyButton, 'padding', '5px');\n this.renderer.setStyle(this.#copyButton, 'line-height', '1');\n this.renderer.setStyle(this.#copyButton, 'background-color', 'var(--sd-surface-muted)');\n\n // Add inline SVG icon\n const svg = this.renderer.createElement('svg', 'svg');\n this.renderer.addClass(svg, 'text-secondary');\n this.renderer.setAttribute(svg, 'width', '14');\n this.renderer.setAttribute(svg, 'height', '14');\n this.renderer.setAttribute(svg, 'viewBox', '0 0 24 24');\n this.renderer.setAttribute(svg, 'fill', 'none');\n this.renderer.setAttribute(svg, 'xmlns', 'http://www.w3.org/2000/svg');\n\n const path = this.renderer.createElement('path', 'svg');\n this.renderer.setAttribute(\n path,\n 'd',\n 'M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM20 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H20C21.1 23 22 22.1 22 21V7C22 5.9 21.1 5 20 5ZM20 21H8V7H20V21Z'\n );\n this.renderer.setAttribute(path, 'fill', 'currentColor');\n this.renderer.appendChild(svg, path);\n this.renderer.appendChild(this.#copyButton, svg);\n\n // Tooltip\n this.#tooltip = this.renderer.createElement('span');\n this.renderer.setProperty(this.#tooltip, 'innerText', this.#defaultTooltip);\n this.renderer.setStyle(this.#tooltip, 'position', 'absolute');\n this.renderer.setStyle(this.#tooltip, 'bottom', '100%');\n this.renderer.setStyle(this.#tooltip, 'left', '50%');\n this.renderer.setStyle(this.#tooltip, 'transform', 'translateX(-50%)');\n this.renderer.setStyle(this.#tooltip, 'marginBottom', '4px');\n this.renderer.setStyle(this.#tooltip, 'background', '#333');\n this.renderer.setStyle(this.#tooltip, 'color', '#fff');\n this.renderer.setStyle(this.#tooltip, 'padding', '2px 6px');\n this.renderer.setStyle(this.#tooltip, 'borderRadius', '4px');\n this.renderer.setStyle(this.#tooltip, 'fontSize', '12px');\n this.renderer.setStyle(this.#tooltip, 'whiteSpace', 'nowrap');\n this.renderer.setStyle(this.#tooltip, 'opacity', '0');\n this.renderer.setStyle(this.#tooltip, 'transition', 'opacity 0.2s');\n this.renderer.setStyle(this.#tooltip, 'pointerEvents', 'none');\n this.renderer.setStyle(this.#tooltip, 'userSelect', 'none');\n\n this.renderer.appendChild(this.#copyButton, this.#tooltip);\n this.renderer.appendChild(parent, this.#copyButton);\n\n // Listen click\n this.renderer.listen(this.#copyButton, 'click', () => {\n const copyText = this.copyText();\n if (copyText && !this.sdHoverCopyDisabled()) {\n BrowserUtilities.copyToClipboard(String(copyText));\n this.#showTooltip(this.#copiedTooltip);\n this.#clearHideTooltipTimer();\n this.#hideTooltipTimer = setTimeout(() => {\n this.#hideTooltipTimer = null;\n this.#hideTooltip();\n }, 1000);\n }\n });\n }\n\n #clearHideTooltipTimer(): void {\n if (this.#hideTooltipTimer === null) return;\n clearTimeout(this.#hideTooltipTimer);\n this.#hideTooltipTimer = null;\n }\n\n #removeCopyButton(): void {\n // why: tooltip nằm trong button — bỏ button mà để timer chạy tiếp là ghi style lên node đã gỡ.\n this.#clearHideTooltipTimer();\n if (this.#copyButton) {\n this.renderer.removeChild(this.el.nativeElement, this.#copyButton);\n this.#copyButton = null;\n }\n }\n\n #showTooltip(message: string) {\n this.renderer.setProperty(this.#tooltip, 'innerText', message);\n this.renderer.setStyle(this.#tooltip, 'opacity', '1');\n }\n\n #hideTooltip() {\n this.renderer.setProperty(this.#tooltip, 'innerText', this.#defaultTooltip);\n this.renderer.setStyle(this.#tooltip, 'opacity', '0');\n }\n\n @HostListener('mouseenter')\n onMouseEnter() {\n if (!this.sdHoverCopyDisabled() && this.#copyButton) {\n this.renderer.setStyle(this.#copyButton, 'display', 'block');\n }\n }\n\n @HostListener('mouseleave')\n onMouseLeave() {\n if (this.#copyButton) {\n this.renderer.setStyle(this.#copyButton, 'display', 'none');\n this.#hideTooltip();\n }\n }\n}\n","import { Directive, HostBinding, HostListener, inject, input } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { sdIsExternalHttpUrl, sdOpenExternal } from '@sdcorejs/angular/utilities';\n\n@Directive({\n selector: 'a[sdHref]',\n standalone: true,\n})\nexport class SdHrefDirective {\n readonly #router = inject(Router);\n // Nhận vào url đã được xử lý (từ Pipe của bạn)\n readonly url = input.required<string>({ alias: 'sdHref' });\n // Tự động bind giá trị url vào thuộc tính href của thẻ <a>\n // why: fallback cũ là `'javascript:;'` — Angular URL sanitizer chặn giá trị này và log cảnh báo\n // \"sanitizing unsafe URL value\" mỗi lần render. Nhưng bỏ hẳn attribute (`null`) cũng sai: một\n // `<a>` KHÔNG có `href` thì không Tab tới được và không kích hoạt được bằng Enter, trong khi\n // click handler vẫn gắn — chỉ chuột dùng được. `'#'` giữ nguyên ngữ nghĩa link (focusable +\n // Enter) mà sanitizer không đụng tới; `onClick` chặn hành vi mặc định nên không nhảy fragment.\n @HostBinding('attr.href') get href(): string {\n return this.url() || '#';\n }\n\n @HostListener('click', ['$event'])\n onClick(event: Event) {\n const url = this.url();\n if (!url) {\n // why: href fallback là `'#'`. Không chặn thì trình duyệt nhảy tới fragment rỗng và ghi thêm\n // một entry vào history mỗi lần bấm.\n event.preventDefault();\n return;\n }\n // why: điều kiện cũ `url.startsWith('http')` nhận cả `'httpfoo'`, và `window.open(url, '_blank')`\n // thiếu `noopener` nên trang mở ra giữ được `window.opener` (reverse tabnabbing).\n // `sdOpenExternal` chỉ mở khi parse ra scheme http:/https: và luôn truyền `noopener,noreferrer`.\n if (sdIsExternalHttpUrl(url)) {\n // Nếu là link ngoài -> Mở tab mới và ngăn chặn hành vi mặc định của thẻ a (để không chuyển trang hiện tại)\n sdOpenExternal(url);\n event.preventDefault();\n } else {\n // Nếu là link nội bộ -> Ngăn chặn full-page reload, dùng Angular Router để điều hướng\n event.preventDefault();\n const [path, queryString] = url.split('?');\n // Bạn có thể dùng hàm SdUtilities.parseQueryParams của bạn ở đây,\n // hoặc dùng cách native URLSearchParams như sau:\n const params = new URLSearchParams(queryString || '');\n const queryParams: Record<string, string> = {};\n params.forEach((value, key) => (queryParams[key] = value));\n this.#router.navigate([path], { queryParams });\n }\n }\n}\n","import {\n Directive,\n ElementRef,\n HostListener,\n TemplateRef,\n ViewContainerRef,\n inject,\n input,\n DestroyRef,\n ComponentRef,\n Component,\n ChangeDetectorRef,\n computed,\n} from '@angular/core';\nimport { Overlay, OverlayRef, ConnectionPositionPair } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet } from '@angular/common';\n\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\n// Component dùng để instance cho overlay\n@Component({\n selector: 'sd-tooltip-container',\n standalone: true,\n imports: [NgTemplateOutlet],\n template: `\n <div class=\"c-sd-tooltip-container\" [style.background-color]=\"color()\">\n @if (isTemplate()) {\n <ng-container [ngTemplateOutlet]=\"templateContent()\"></ng-container>\n } @else {\n <span class=\"c-sd-tooltip-text\">{{ textContent() }}</span>\n }\n </div>\n `,\n styles: [\n `\n .c-sd-tooltip-container {\n padding: 6px 8px;\n border-radius: 4px;\n color: white;\n font-size: 12px;\n font-family: Roboto, 'Helvetica Neue', sans-serif;\n box-shadow:\n 0 2px 4px -1px #0003,\n 0 4px 5px #00000024,\n 0 1px 10px #0000001f;\n max-width: 250px;\n word-wrap: break-word;\n pointer-events: auto;\n user-select: text;\n }\n `,\n ],\n host: {\n '(mouseenter)': 'onMouseEnter()',\n '(mouseleave)': 'onMouseLeave()',\n },\n})\nclass SdTooltipComponent {\n private cdr = inject(ChangeDetectorRef);\n\n content = input.required<string | TemplateRef<any>>();\n color = input<string>('#616161');\n\n isTemplate = computed(() => this.content() instanceof TemplateRef);\n templateContent = computed(() => (this.isTemplate() ? (this.content() as TemplateRef<any>) : null));\n textContent = computed(() => (!this.isTemplate() ? (this.content() as string) : ''));\n onMouseEnterCb?: () => void;\n onMouseLeaveCb?: () => void;\n\n onMouseEnter() {\n this.onMouseEnterCb?.();\n }\n\n onMouseLeave() {\n this.onMouseLeaveCb?.();\n }\n\n triggerChangeDetection() {\n this.cdr.detectChanges();\n }\n}\n// End\n\n// Directive\n@Directive({\n selector: '[sdTooltip]',\n standalone: true,\n})\nexport class SdTooltipDirective {\n content = input.required<string | TemplateRef<any>>({ alias: 'sdTooltip' });\n sdTooltipPosition = input<TooltipPosition>('bottom');\n sdTooltipDelay = input<number>(100);\n sdTooltipColor = input<string>('#616161');\n\n private static activeTooltip: SdTooltipDirective | null = null;\n\n private readonly elementRef = inject(ElementRef);\n private readonly overlay = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n\n private overlayRef: OverlayRef | null = null;\n private tooltipComponentRef: ComponentRef<SdTooltipComponent> | null = null;\n private tooltipInstance: SdTooltipComponent | null = null;\n\n private showTimeout: ReturnType<typeof setTimeout> | undefined;\n private hideTimeout: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.#cleanup();\n });\n }\n\n @HostListener('mouseenter')\n onMouseEnter() {\n if (SdTooltipDirective.activeTooltip && SdTooltipDirective.activeTooltip !== this) {\n SdTooltipDirective.activeTooltip.forceHide();\n }\n SdTooltipDirective.activeTooltip = this;\n\n this.#clearTimeouts();\n this.showTimeout = setTimeout(() => {\n this.#show();\n }, this.sdTooltipDelay());\n }\n\n @HostListener('mouseleave')\n onMouseLeave() {\n this.#clearTimeouts();\n this.hideTimeout = setTimeout(() => {\n this.#hide();\n }, 300);\n }\n\n forceHide = (): void => {\n this.#clearTimeouts();\n this.#hide();\n };\n\n #show = (): void => {\n const currentContent = this.content();\n\n if (!currentContent) return;\n\n if (!this.overlayRef) {\n this.#createOverlay();\n }\n\n if (this.overlayRef && !this.overlayRef.hasAttached()) {\n const portal = new ComponentPortal(SdTooltipComponent, this.viewContainerRef);\n this.tooltipComponentRef = this.overlayRef.attach(portal);\n this.tooltipInstance = this.tooltipComponentRef.instance;\n\n this.#setupTooltipInstance();\n }\n\n if (this.tooltipComponentRef && this.tooltipInstance) {\n this.tooltipComponentRef.setInput('content', currentContent);\n this.tooltipComponentRef.setInput('color', this.sdTooltipColor());\n this.tooltipInstance.triggerChangeDetection();\n }\n };\n\n #hide = (): void => {\n if (this.tooltipInstance && this.overlayRef?.hasAttached()) {\n this.overlayRef.detach();\n this.tooltipInstance = null;\n this.tooltipComponentRef = null;\n }\n };\n\n #createOverlay = (): void => {\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions(this.#getPositions())\n .withViewportMargin(8)\n .withPush(false);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.close(),\n panelClass: 'c-sd-tooltip-panel',\n });\n };\n\n #setupTooltipInstance = (): void => {\n if (!this.tooltipInstance) return;\n\n this.tooltipInstance.onMouseEnterCb = () => {\n clearTimeout(this.hideTimeout);\n };\n\n this.tooltipInstance.onMouseLeaveCb = () => {\n this.hideTimeout = setTimeout(() => {\n this.#hide();\n }, 200);\n };\n };\n\n #clearTimeouts = (): void => {\n clearTimeout(this.showTimeout);\n clearTimeout(this.hideTimeout);\n };\n\n #cleanup = (): void => {\n this.#clearTimeouts();\n\n if (SdTooltipDirective.activeTooltip === this) {\n SdTooltipDirective.activeTooltip = null;\n }\n\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n\n // Xóa mọi tham chiếu\n this.tooltipInstance = null;\n this.tooltipComponentRef = null;\n };\n\n #getPositions = (): ConnectionPositionPair[] => {\n const offset = 8;\n const topPos: ConnectionPositionPair = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -offset };\n const bottomPos: ConnectionPositionPair = {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: offset,\n };\n const leftPos: ConnectionPositionPair = { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -offset };\n const rightPos: ConnectionPositionPair = { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: offset };\n\n switch (this.sdTooltipPosition()) {\n case 'top':\n return [topPos, bottomPos, rightPos, leftPos];\n case 'bottom':\n return [bottomPos, topPos, rightPos, leftPos];\n case 'left':\n return [leftPos, rightPos, topPos, bottomPos];\n case 'right':\n return [rightPos, leftPos, topPos, bottomPos];\n default:\n return [bottomPos, topPos];\n }\n };\n}\n// End\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import * as i0 from '@angular/core';
4
4
  import { viewChild, contentChild, inject, ChangeDetectorRef, input, computed, booleanAttribute, model, output, EventEmitter, signal, effect, untracked, Output, ChangeDetectionStrategy, Component } from '@angular/core';
5
5
  import { toObservable } from '@angular/core/rxjs-interop';
6
6
  import * as i2 from '@angular/forms';
7
- import { NgForm, FormGroup, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
7
+ import { NgForm, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
8
8
  import * as i5 from '@angular/material/autocomplete';
9
9
  import { MatAutocompleteTrigger, MatAutocompleteModule } from '@angular/material/autocomplete';
10
10
  import { MatFormFieldModule } from '@angular/material/form-field';
@@ -17,11 +17,10 @@ import { MatTooltipModule } from '@angular/material/tooltip';
17
17
  import { SdView } from '@sdcorejs/angular/components/view';
18
18
  import { SdItemDefDefDirective, SdViewDefDirective } from '@sdcorejs/angular/forms/directives';
19
19
  import { SdLabel } from '@sdcorejs/angular/forms/label';
20
- import { SD_FORM_CONFIGURATION, sdFormControlState, sdViewedTransform, sdViewedInline, SdFormControl, ɵsdFormControlConnector as _sdFormControlConnector, HandleSdCustomValidator, SdInlineErrorValidator } from '@sdcorejs/angular/forms/models';
20
+ import { SD_FORM_CONFIGURATION, ɵsdTimerScope as _sdTimerScope, sdFormControlState, sdViewedTransform, sdViewedInline, SdFormControl, ɵsdFormControlConnector as _sdFormControlConnector, HandleSdCustomValidator, SdInlineErrorValidator } from '@sdcorejs/angular/forms/models';
21
21
  import { I18nService } from '@sdcorejs/angular/i18n';
22
22
  import { sdIsEmpty, sdSerializeDataValue } from '@sdcorejs/angular/utilities/data-state';
23
- import { ArrayUtilities } from '@sdcorejs/angular/utilities/extensions';
24
- import { Utilities } from '@sdcorejs/utils/fns';
23
+ import { Utilities, ArrayUtilities } from '@sdcorejs/utils/fns';
25
24
  import { Subscription, combineLatest, timer, of, defer, from } from 'rxjs';
26
25
  import { tap, map, startWith, debounce, switchMap, catchError } from 'rxjs/operators';
27
26
  import { SdIcon } from '@sdcorejs/angular/modules/icon';
@@ -38,6 +37,9 @@ class SdAutocompleteErrotStateMatcher {
38
37
  }
39
38
  class SdAutocomplete {
40
39
  id = `I${Utilities.generateUuid()}`;
40
+ /** why: id ổn định của <mat-error> để control trỏ `aria-describedby` sang — thông báo lỗi
41
+ * phải đọc được từ chính control, không chỉ hiện ra màn hình. */
42
+ errorId = `${this.id}-error`;
41
43
  // ==========================================
42
44
  // 1. SIGNAL QUERIES
43
45
  // ==========================================
@@ -53,6 +55,9 @@ class SdAutocomplete {
53
55
  ref = inject(ChangeDetectorRef);
54
56
  formConfig = inject(SD_FORM_CONFIGURATION, { optional: true });
55
57
  #i18n = inject(I18nService);
58
+ // why: focus() (và open() gọi lại nó) hoãn 100ms rồi mới openPanel(). Không giữ handle thì
59
+ // panel overlay có thể mở SAU khi control đã destroy và không còn ai đóng nó.
60
+ #timers = _sdTimerScope();
56
61
  // ==========================================
57
62
  // 3. SIGNAL INPUTS & MODEL
58
63
  // ==========================================
@@ -155,10 +160,21 @@ class SdAutocomplete {
155
160
  isTyping = signal(false);
156
161
  inputControl = new SdFormControl();
157
162
  formControl = new SdFormControl();
163
+ // why: validator đi qua connector (addValidators/removeValidators — additive) thay vì
164
+ // setValidators()/setAsyncValidators() như trước. `formControl` là public API, consumer hoàn toàn
165
+ // có thể tự gắn validator lên nó; setValidators THAY THẾ cả danh sách nên xoá sạch validator của
166
+ // consumer mỗi lần required/[validator]/inlineError đổi. Connector chỉ thêm/gỡ đúng phần component
167
+ // sở hữu, phần còn lại của danh sách giữ nguyên.
158
168
  #formConnector = _sdFormControlConnector({
159
169
  form: this.form,
160
170
  name: this.name,
161
171
  control: computed(() => this.formControl),
172
+ required: this.required,
173
+ validators: computed(() => (this.inlineError() ? [SdInlineErrorValidator] : null)),
174
+ asyncValidators: computed(() => {
175
+ const custom = this.validator();
176
+ return custom ? [HandleSdCustomValidator(custom)] : null;
177
+ }),
162
178
  });
163
179
  matcher = new SdAutocompleteErrotStateMatcher(this.formControl);
164
180
  #cache = {};
@@ -207,12 +223,6 @@ class SdAutocomplete {
207
223
  this.formControl.enable({ emitEvent: false });
208
224
  }
209
225
  });
210
- effect(() => {
211
- const req = this.required();
212
- const val = this.validator();
213
- const inl = this.inlineError();
214
- untracked(() => this.#updateValidator(req, val, inl));
215
- });
216
226
  }
217
227
  ngOnInit() {
218
228
  this.#subscription.add(this.formControl.valueChanges.subscribe(val => {
@@ -401,7 +411,8 @@ class SdAutocomplete {
401
411
  };
402
412
  focus = () => {
403
413
  this.isFocused = true;
404
- setTimeout(() => {
414
+ // why: vẫn 100ms như cũ — chỉ scope handle theo DestroyRef.
415
+ this.#timers.schedule(() => {
405
416
  this.autocompleteTrigger()?.openPanel();
406
417
  this.inputRef()?.nativeElement?.focus();
407
418
  }, 100);
@@ -416,8 +427,18 @@ class SdAutocomplete {
416
427
  $event?.stopPropagation();
417
428
  this.filteredItems.set([]);
418
429
  this.inputControl?.setValue('');
419
- if (this.valueModel()) {
420
- this.formControl.setValue(null, { emitEvent: false });
430
+ // why: guard bằng `!= null && !== ''` chứ KHÔNG dùng truthiness. Giá trị `0` là hợp lệ —
431
+ // load path (selected$) đã coi `val === 0` là có giá trị — nên `if (this.valueModel())`
432
+ // im lặng từ chối xoá đúng những item có value = 0 (hoặc false).
433
+ const current = this.valueModel();
434
+ if (current != null && current !== '') {
435
+ // why: KHÔNG dùng { emitEvent: false } khi reset formControl. formControl mang async
436
+ // [validator] (HandleSdCustomValidator). Chặn event thì lúc async resolve, setErrors cũng im →
437
+ // #state (sdFormControlState) không tick → errorMessage không recompute → message lỗi không
438
+ // hiện/không clear sau khi xoá. Đúng lỗi mà comment ở onSelect nói là đã fix. Subscriber
439
+ // formControl.valueChanges set valueModel có guard `!==`, và clear() set lại cùng giá trị
440
+ // (no-op) → không lặp.
441
+ this.formControl.setValue(null);
421
442
  this.valueModel.set(null);
422
443
  this.sdChange.emit(null);
423
444
  this.sdSelection.emit({ values: [null], selectedItems: [], value: null, selectedItem: null });
@@ -429,23 +450,13 @@ class SdAutocomplete {
429
450
  this.sdAdd.emit();
430
451
  };
431
452
  reValidate = () => {
432
- this.inputControl.updateValueAndValidity({ emitEvent: true });
433
- };
434
- #updateValidator = (req, val, inl) => {
435
- const validators = [];
436
- const asyncValidators = [];
437
- if (req)
438
- validators.push(Validators.required);
439
- if (val)
440
- asyncValidators.push(HandleSdCustomValidator(val));
441
- if (inl)
442
- validators.push(SdInlineErrorValidator);
443
- this.formControl.setValidators(validators.length ? validators : null);
444
- this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);
445
- this.formControl.updateValueAndValidity({ emitEvent: false });
453
+ // why: mọi validator (required / [validator] / inlineError) được cài trên formControl —
454
+ // inputControl chỉ giữ text search và KHÔNG có validator nào. Gọi trên inputControl là no-op,
455
+ // tức API public reValidate() trước đây không validate gì cả.
456
+ this.formControl.updateValueAndValidity({ emitEvent: true });
446
457
  };
447
458
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAutocomplete, deps: [], target: i0.ɵɵFactoryTarget.Component });
448
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdAutocomplete, isStandalone: true, selector: "sd-autocomplete", inputs: { autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, helperText: { classPropertyName: "helperText", publicName: "helperText", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, displayField: { classPropertyName: "displayField", publicName: "displayField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: false, transformFunction: null }, cacheChecksum: { classPropertyName: "cacheChecksum", publicName: "cacheChecksum", isSignal: true, isRequired: false, transformFunction: null }, hyperlink: { classPropertyName: "hyperlink", publicName: "hyperlink", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, hideInlineError: { classPropertyName: "hideInlineError", publicName: "hideInlineError", isSignal: true, isRequired: false, transformFunction: null }, addable: { classPropertyName: "addable", publicName: "addable", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, viewed: { classPropertyName: "viewed", publicName: "viewed", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, validator: { classPropertyName: "validator", publicName: "validator", isSignal: true, isRequired: false, transformFunction: null }, inlineError: { classPropertyName: "inlineError", publicName: "inlineError", isSignal: true, isRequired: false, transformFunction: null }, appearanceInput: { classPropertyName: "appearanceInput", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange", sdChange: "sdChange", sdSelection: "sdSelection", sdAdd: "sdAdd" }, host: { properties: { "class.sd-has-label": "!!label()", "class.sd-viewed": "isViewed() || isInline()", "class.sd-bare": "isInline()" } }, queries: [{ propertyName: "sdLabelTemplate", first: true, predicate: ["sdLabel"], descendants: true, isSignal: true }, { propertyName: "sdValueTemplate", first: true, predicate: ["sdValue"], descendants: true, isSignal: true }, { propertyName: "itemDef", first: true, predicate: SdItemDefDefDirective, descendants: true, isSignal: true }, { propertyName: "sdViewDef", first: true, predicate: SdViewDefDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true, isSignal: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true, isSignal: true }], ngImport: i0, template: "@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _required = required();\n@let _displayField = displayField();\n@let _disabledField = disabledField();\n@let iDefTpl = itemDef()?.templateRef;\n@let _loading = loading();\n@let nVal = $any(normalizedValue());\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = nVal !== undefined && nVal !== null && nVal !== '';\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"nVal\"\n [display]=\"display()\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline \u2014 sd-view l\u00E0 \"m\u1EB7t\" + trigger; autocomplete editor render \u1EA9n (.sd-inline-editor) ch\u1EC9 \u0111\u1EC3 m\u1EDF panel. -->\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"nVal\"\n [display]=\"display()\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </span>\n }\n\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.sd-inline-editor]=\"_isInline\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [floatLabel]=\"nVal ? 'always' : 'auto'\"\n [appearance]=\"_appearance || 'outline'\">\n @if (_appearance && _label) {\n <mat-label class=\"sd-form-field-label\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\n }\n </mat-label>\n }\n\n <input\n [id]=\"id\"\n [formControl]=\"inputControl\"\n [placeholder]=\"controlPlaceHolder() || ''\"\n [class.c-selected]=\"nVal\"\n [matAutocomplete]=\"auto\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n matInput\n [autocomplete]=\"id\"\n autocorrect=\"off\"\n [errorStateMatcher]=\"matcher\"\n [required]=\"_required\"\n #input\n #autocompleteTrigger=\"matAutocompleteTrigger\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-loading]=\"dataLoading()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n aria-hidden=\"true\" />\n\n @if (!_loading && nVal && !inputControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn\" matSuffix (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n } @else if (_loading) {\n <mat-spinner [diameter]=\"20\" matSuffix></mat-spinner>\n } @else {\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" matSuffix name=\"search\"></sd-icon>\n }\n\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option.value)\" class=\"sd-autocomplete-panel\">\n @let _filteredItems = filteredItems();\n\n @if (_filteredItems?.length) {\n @for (item of _filteredItems; track $index) {\n <mat-option\n [value]=\"item\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"_displayField ? getNestedValue(item, _displayField) : item\"\n [disabled]=\"_disabledField ? getNestedValue(item, _disabledField) : false\">\n @if (iDefTpl) {\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\n } @else {\n {{ _displayField ? getNestedValue(item, _displayField) : item }}\n }\n </mat-option>\n }\n } @else if (!_filteredItems?.length && inputControl.value && !isTyping() && !_loading) {}\n\n @if (addable() && sdAdd.observed) {\n <mat-option class=\"sd__option--add\" (keyup.Space)=\"$event.stopPropagation()\" disabled=\"true\">\n <div (click)=\"onAdd($event)\">\n <sd-icon class=\"mr-1\" name=\"add\"></sd-icon>\n {{ 'New item' }}\n </div>\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n </mat-form-field>\n </div>\n}\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-primary-contrast{color:var(--sd-primary-contrast)!important}.bg-primary-contrast{background:var(--sd-primary-contrast)!important}.border-primary-contrast{border-color:var(--sd-primary-contrast)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-secondary-contrast{color:var(--sd-secondary-contrast)!important}.bg-secondary-contrast{background:var(--sd-secondary-contrast)!important}.border-secondary-contrast{border-color:var(--sd-secondary-contrast)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-info-contrast{color:var(--sd-info-contrast)!important}.bg-info-contrast{background:var(--sd-info-contrast)!important}.border-info-contrast{border-color:var(--sd-info-contrast)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-success-contrast{color:var(--sd-success-contrast)!important}.bg-success-contrast{background:var(--sd-success-contrast)!important}.border-success-contrast{border-color:var(--sd-success-contrast)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-warning-contrast{color:var(--sd-warning-contrast)!important}.bg-warning-contrast{background:var(--sd-warning-contrast)!important}.border-warning-contrast{border-color:var(--sd-warning-contrast)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-error-contrast{color:var(--sd-error-contrast)!important}.bg-error-contrast{background:var(--sd-error-contrast)!important}.border-error-contrast{border-color:var(--sd-error-contrast)!important}.text-surface{color:var(--sd-surface)!important}.bg-surface{background:var(--sd-surface)!important}.border-surface{border-color:var(--sd-surface)!important}.text-surface-muted{color:var(--sd-surface-muted)!important}.bg-surface-muted{background:var(--sd-surface-muted)!important}.border-surface-muted{border-color:var(--sd-surface-muted)!important}.text-text{color:var(--sd-text)!important}.bg-text{background:var(--sd-text)!important}.border-text{border-color:var(--sd-text)!important}.text-text-secondary{color:var(--sd-text-secondary)!important}.bg-text-secondary{background:var(--sd-text-secondary)!important}.border-text-secondary{border-color:var(--sd-text-secondary)!important}.text-text-muted{color:var(--sd-text-muted)!important}.bg-text-muted{background:var(--sd-text-muted)!important}.border-text-muted{border-color:var(--sd-text-muted)!important}.text-border{color:var(--sd-border)!important}.bg-border{background:var(--sd-border)!important}.border-border{border-color:var(--sd-border)!important}.text-border-strong{color:var(--sd-border-strong)!important}.bg-border-strong{background:var(--sd-border-strong)!important}.border-border-strong{border-color:var(--sd-border-strong)!important}.text-disabled-bg{color:var(--sd-disabled-bg)!important}.bg-disabled-bg{background:var(--sd-disabled-bg)!important}.border-disabled-bg{border-color:var(--sd-disabled-bg)!important}.text-disabled-text{color:var(--sd-disabled-text)!important}.bg-disabled-text{background:var(--sd-disabled-text)!important}.border-disabled-text{border-color:var(--sd-disabled-text)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.text-secondary{color:var(--sd-text-secondary)!important}.text-muted{color:var(--sd-text-muted)!important}.text-body{color:var(--sd-text)!important}.bg-muted{background:var(--sd-surface-muted)!important}:host(.sd-bare){position:relative}.sd-inline-view{cursor:pointer;display:inline-flex;align-items:center;width:100%;padding:1px 6px;border-radius:4px;background-color:#0000000a;transition:background-color .15s ease}.sd-inline-view:hover{background-color:#00000014}.sd-inline-view .sd-inline-clear{display:none;align-items:center;margin-left:4px;padding:0;border:0;background:transparent;cursor:pointer;line-height:0;color:var(--sd-text-secondary, #6b7280);transition:color .15s ease}.sd-inline-view .sd-inline-clear sd-icon{font-size:16px;width:16px;height:16px}.sd-inline-view .sd-inline-clear:hover{color:var(--sd-error, #b32626)}.sd-inline-view:hover .sd-inline-clear{display:inline-flex}.sd-inline-editor{position:absolute;inset:0;opacity:0;pointer-events:none}.sd-inline-editor ::ng-deep *{pointer-events:none!important}:host{display:block}:host(.sd-has-label){padding-top:4px}:host(.sd-viewed){padding-top:0}:host ::ng-deep .mat-mdc-form-field.mat-form-field-appearance-outline.mat-form-field-disabled .mat-mdc-text-field-wrapper{background:var(--sd-surface-muted)}:host ::ng-deep .mat-mdc-form-field input.c-selected::placeholder{color:#000;opacity:1}:host ::ng-deep .mat-mdc-form-field input.c-selected:-ms-input-placeholder{color:#000}:host ::ng-deep .mat-mdc-form-field input.c-selected::-ms-input-placeholder{color:#000}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected::placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected:-ms-input-placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected::-ms-input-placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field .mat-mdc-placeholder-required{color:var(--sd-error)}:host ::ng-deep .mat-mdc-form-field:hover .icon-copy{opacity:1}:host ::ng-deep .mat-mdc-form-field .icon-copy{cursor:pointer;width:.9em;height:.9em;fill:#00000080;transition:opacity .2s linear;opacity:0}::ng-deep .sd-autocomplete-panel .mat-mdc-option{min-height:36px!important;padding:8px 12px!important}::ng-deep .sd-autocomplete-panel .mdc-list-item__primary-text{font-size:14px!important;line-height:normal}::ng-deep .sd-autocomplete-panel .mat-pseudo-checkbox{transform:scale(.7);margin-right:8px!important}::ng-deep .sd-autocomplete-panel .mat-pseudo-checkbox-minimal{transform:scale(.7);transform-origin:center right}.sd__option--add{position:sticky;bottom:0;background-color:#fff;z-index:10;color:#000000de;cursor:pointer!important}.c-loading-icon{position:absolute;right:5px;top:5px}\n"], dependencies: [{ kind: "component", type: SdIcon, selector: "sd-icon", inputs: ["name", "fontIcon", "color", "set", "fontSet", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i5.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i5.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "component", type: SdView, selector: "sd-view", inputs: ["label", "value", "display", "hyperlink", "labelTemplate", "valueTemplate", "selectedItems"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
459
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdAutocomplete, isStandalone: true, selector: "sd-autocomplete", inputs: { autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, helperText: { classPropertyName: "helperText", publicName: "helperText", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, displayField: { classPropertyName: "displayField", publicName: "displayField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: false, transformFunction: null }, cacheChecksum: { classPropertyName: "cacheChecksum", publicName: "cacheChecksum", isSignal: true, isRequired: false, transformFunction: null }, hyperlink: { classPropertyName: "hyperlink", publicName: "hyperlink", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, hideInlineError: { classPropertyName: "hideInlineError", publicName: "hideInlineError", isSignal: true, isRequired: false, transformFunction: null }, addable: { classPropertyName: "addable", publicName: "addable", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, viewed: { classPropertyName: "viewed", publicName: "viewed", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, validator: { classPropertyName: "validator", publicName: "validator", isSignal: true, isRequired: false, transformFunction: null }, inlineError: { classPropertyName: "inlineError", publicName: "inlineError", isSignal: true, isRequired: false, transformFunction: null }, appearanceInput: { classPropertyName: "appearanceInput", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange", sdChange: "sdChange", sdSelection: "sdSelection", sdAdd: "sdAdd" }, host: { properties: { "class.sd-has-label": "!!label()", "class.sd-viewed": "isViewed() || isInline()", "class.sd-bare": "isInline()" } }, queries: [{ propertyName: "sdLabelTemplate", first: true, predicate: ["sdLabel"], descendants: true, isSignal: true }, { propertyName: "sdValueTemplate", first: true, predicate: ["sdValue"], descendants: true, isSignal: true }, { propertyName: "itemDef", first: true, predicate: SdItemDefDefDirective, descendants: true, isSignal: true }, { propertyName: "sdViewDef", first: true, predicate: SdViewDefDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "inputRef", first: true, predicate: ["input"], descendants: true, isSignal: true }, { propertyName: "autocompleteTrigger", first: true, predicate: MatAutocompleteTrigger, descendants: true, isSignal: true }], ngImport: i0, template: "@let _label = label();\r\n@let _appearance = appearance();\r\n@let _hideInlineError = hideInlineError();\r\n@let _errorMessage = errorMessage();\r\n@let _helperText = helperText();\r\n@let _required = required();\r\n@let _displayField = displayField();\r\n@let _disabledField = disabledField();\r\n@let iDefTpl = itemDef()?.templateRef;\r\n@let _loading = loading();\r\n@let nVal = $any(normalizedValue());\r\n@let _isInline = isInline();\r\n@let _bare = _isInline;\r\n@let _hasValue = nVal !== undefined && nVal !== null && nVal !== '';\r\n<!-- why: m\u1ED9t c\u1ED5ng gate duy nh\u1EA5t cho <mat-error>, aria-invalid v\u00E0 aria-describedby. -->\r\n@let _errorVisible = !!_errorMessage && formControl.touched;\r\n@let _showInlineError = !_hideInlineError && _errorVisible;\r\n\r\n@if (isViewed()) {\r\n <sd-view\r\n [label]=\"_label\"\r\n [labelTemplate]=\"sdLabelTemplate()\"\r\n [value]=\"nVal\"\r\n [display]=\"display()\"\r\n [hyperlink]=\"hyperlink()\"\r\n [valueTemplate]=\"viewTemplate()\">\r\n </sd-view>\r\n} @else {\r\n @if (_isInline) {\r\n <!-- why: inline \u2014 sd-view l\u00E0 \"m\u1EB7t\" + trigger; autocomplete editor render \u1EA9n (.sd-inline-editor) ch\u1EC9 \u0111\u1EC3 m\u1EDF panel. -->\r\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\r\n <sd-view\r\n [label]=\"_label\"\r\n [labelTemplate]=\"sdLabelTemplate()\"\r\n [value]=\"nVal\"\r\n [display]=\"display()\"\r\n [hyperlink]=\"hyperlink()\"\r\n [valueTemplate]=\"viewTemplate()\">\r\n </sd-view>\r\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\r\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\r\n <sd-icon name=\"close\"></sd-icon>\r\n </button>\r\n }\r\n </span>\r\n }\r\n\r\n @if (!_appearance) {\r\n <ng-content select=\"[sdLabel]\">\r\n @if (_label) {\r\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\r\n }\r\n </ng-content>\r\n }\r\n\r\n <!-- why: div ch\u1EC9 l\u00E0 h\u1ED9p layout. aria-hidden=\"true\" c\u0169 \u1EA9n C\u1EA2 c\u00E2y con \u2014 label, <input>,\r\n <mat-error>, n\u00FAt clear v\u00E0 c\u1EA3 panel g\u1EE3i \u00FD \u2014 kh\u1ECFi accessibility tree. role=\"presentation\"\r\n ch\u1EC9 v\u00F4 hi\u1EC7u ho\u00E1 ch\u00EDnh div, KH\u00D4NG lan xu\u1ED1ng con; (click) l\u00E0 ti\u1EC7n \u00EDch chu\u1ED9t m\u00E0 b\u00E0n ph\u00EDm \u0111\u00E3\r\n c\u00F3 qua Tab v\u00E0o <input>. -->\r\n <div\r\n class=\"d-flex align-items-center\"\r\n role=\"presentation\"\r\n [class.sd-inline-editor]=\"_isInline\"\r\n [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n (click)=\"onClick()\">\r\n <mat-form-field\r\n [class.sd-md]=\"size() === 'md'\"\r\n [class.sd-sm]=\"size() === 'sm'\"\r\n [class.hide-inline-error]=\"_hideInlineError\"\r\n [floatLabel]=\"nVal ? 'always' : 'auto'\"\r\n [appearance]=\"_appearance || 'outline'\">\r\n @if (_appearance && _label) {\r\n <mat-label class=\"sd-form-field-label\">\r\n <span>{{ _label }}</span>\r\n @if (_helperText) {\r\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\r\n }\r\n </mat-label>\r\n }\r\n\r\n <!-- why: B\u1ECE aria-hidden tr\u00EAn ch\u00EDnh <input> \u2014 \u00F4 Tab t\u1EDBi v\u00E0 g\u00F5 \u0111\u01B0\u1EE3c, aria-hidden ch\u1EC9 khi\u1EBFn\r\n screen reader \u0111\u1ECDc ra kho\u1EA3ng l\u1EB7ng. -->\r\n <input\r\n [id]=\"id\"\r\n [formControl]=\"inputControl\"\r\n [placeholder]=\"controlPlaceHolder() || ''\"\r\n [class.c-selected]=\"nVal\"\r\n [matAutocomplete]=\"auto\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n matInput\r\n [autocomplete]=\"id\"\r\n autocorrect=\"off\"\r\n [errorStateMatcher]=\"matcher\"\r\n [required]=\"_required\"\r\n #input\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n [attr.data-autoId]=\"autoId()\"\r\n [attr.data-disabled]=\"dataDisabled()\"\r\n [attr.data-invalid]=\"dataInvalid()\"\r\n [attr.data-empty]=\"dataEmpty()\"\r\n [attr.data-value]=\"dataValue()\"\r\n [attr.data-loading]=\"dataLoading()\"\r\n [attr.data-required]=\"dataRequired()\"\r\n [attr.data-error-message]=\"dataErrorMessage()\"\r\n [attr.aria-invalid]=\"_errorVisible ? 'true' : null\"\r\n [attr.aria-describedby]=\"_errorMessage ? errorId : null\" />\r\n\r\n @if (!_loading && nVal && !inputControl.disabled && !_bare) {\r\n <button type=\"button\" class=\"sd-clear-btn\" matSuffix (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\r\n <sd-icon name=\"close\"></sd-icon>\r\n </button>\r\n } @else if (_loading) {\r\n <mat-spinner [diameter]=\"20\" matSuffix></mat-spinner>\r\n } @else {\r\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" matSuffix name=\"search\"></sd-icon>\r\n }\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option.value)\" class=\"sd-autocomplete-panel\">\r\n @let _filteredItems = filteredItems();\r\n\r\n @if (_filteredItems?.length) {\r\n @for (item of _filteredItems; track $index) {\r\n <mat-option\r\n [value]=\"item\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"_displayField ? getNestedValue(item, _displayField) : item\"\r\n [disabled]=\"_disabledField ? getNestedValue(item, _disabledField) : false\">\r\n @if (iDefTpl) {\r\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\r\n } @else {\r\n {{ _displayField ? getNestedValue(item, _displayField) : item }}\r\n }\r\n </mat-option>\r\n }\r\n } @else if (!_filteredItems?.length && inputControl.value && !isTyping() && !_loading) {}\r\n\r\n @if (addable() && sdAdd.observed) {\r\n <mat-option class=\"sd__option--add\" (keyup.Space)=\"$event.stopPropagation()\" disabled=\"true\">\r\n <!-- why: tr\u01B0\u1EDBc l\u00E0 <div (click)> \u2014 kh\u00F4ng Tab t\u1EDBi \u0111\u01B0\u1EE3c, kh\u00F4ng c\u00F3 role, v\u00E0 ch\u1EC9 \"im l\u1EB7ng\"\r\n v\u1EDBi lint v\u00EC c\u1EA3 c\u1EE5m n\u1EB1m trong c\u00E2y aria-hidden. <button type=\"button\"> l\u1EA5y s\u1EB5n\r\n Enter/Space + role button, kh\u00F4ng ph\u1EA3i b\u1ECBa tabindex/keydown th\u1EE7 c\u00F4ng. -->\r\n <button type=\"button\" class=\"sd__option--add-btn\" (click)=\"onAdd($event)\">\r\n <sd-icon class=\"mr-1\" name=\"add\" aria-hidden=\"true\"></sd-icon>\r\n {{ 'New item' }}\r\n </button>\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n\r\n @if (_hideInlineError && _errorVisible) {\r\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\r\n @if (_hideInlineError && _errorVisible) {\r\n <span class=\"sd-visually-hidden\" [id]=\"errorId\" matSuffix>{{ _errorMessage }}</span>\r\r\n }\r\n\r\n @if (_showInlineError) {\r\n <mat-error [id]=\"errorId\">{{ _errorMessage }}</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n}\r\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-primary-contrast{color:var(--sd-primary-contrast)!important}.bg-primary-contrast{background:var(--sd-primary-contrast)!important}.border-primary-contrast{border-color:var(--sd-primary-contrast)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-secondary-contrast{color:var(--sd-secondary-contrast)!important}.bg-secondary-contrast{background:var(--sd-secondary-contrast)!important}.border-secondary-contrast{border-color:var(--sd-secondary-contrast)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-info-contrast{color:var(--sd-info-contrast)!important}.bg-info-contrast{background:var(--sd-info-contrast)!important}.border-info-contrast{border-color:var(--sd-info-contrast)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-success-contrast{color:var(--sd-success-contrast)!important}.bg-success-contrast{background:var(--sd-success-contrast)!important}.border-success-contrast{border-color:var(--sd-success-contrast)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-warning-contrast{color:var(--sd-warning-contrast)!important}.bg-warning-contrast{background:var(--sd-warning-contrast)!important}.border-warning-contrast{border-color:var(--sd-warning-contrast)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-error-contrast{color:var(--sd-error-contrast)!important}.bg-error-contrast{background:var(--sd-error-contrast)!important}.border-error-contrast{border-color:var(--sd-error-contrast)!important}.text-surface{color:var(--sd-surface)!important}.bg-surface{background:var(--sd-surface)!important}.border-surface{border-color:var(--sd-surface)!important}.text-surface-muted{color:var(--sd-surface-muted)!important}.bg-surface-muted{background:var(--sd-surface-muted)!important}.border-surface-muted{border-color:var(--sd-surface-muted)!important}.text-text{color:var(--sd-text)!important}.bg-text{background:var(--sd-text)!important}.border-text{border-color:var(--sd-text)!important}.text-text-secondary{color:var(--sd-text-secondary)!important}.bg-text-secondary{background:var(--sd-text-secondary)!important}.border-text-secondary{border-color:var(--sd-text-secondary)!important}.text-text-muted{color:var(--sd-text-muted)!important}.bg-text-muted{background:var(--sd-text-muted)!important}.border-text-muted{border-color:var(--sd-text-muted)!important}.text-border{color:var(--sd-border)!important}.bg-border{background:var(--sd-border)!important}.border-border{border-color:var(--sd-border)!important}.text-border-strong{color:var(--sd-border-strong)!important}.bg-border-strong{background:var(--sd-border-strong)!important}.border-border-strong{border-color:var(--sd-border-strong)!important}.text-disabled-bg{color:var(--sd-disabled-bg)!important}.bg-disabled-bg{background:var(--sd-disabled-bg)!important}.border-disabled-bg{border-color:var(--sd-disabled-bg)!important}.text-disabled-text{color:var(--sd-disabled-text)!important}.bg-disabled-text{background:var(--sd-disabled-text)!important}.border-disabled-text{border-color:var(--sd-disabled-text)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.text-secondary{color:var(--sd-text-secondary)!important}.text-muted{color:var(--sd-text-muted)!important}.text-body{color:var(--sd-text)!important}.bg-muted{background:var(--sd-surface-muted)!important}:host(.sd-bare){position:relative}.sd-inline-view{cursor:pointer;display:inline-flex;align-items:center;width:100%;padding:1px 6px;border-radius:4px;background-color:#0000000a;transition:background-color .15s ease}.sd-inline-view:hover{background-color:#00000014}.sd-inline-view .sd-inline-clear{display:none;align-items:center;margin-left:4px;padding:0;border:0;background:transparent;cursor:pointer;line-height:0;color:var(--sd-text-secondary, #6b7280);transition:color .15s ease}.sd-inline-view .sd-inline-clear sd-icon{font-size:16px;width:16px;height:16px}.sd-inline-view .sd-inline-clear:hover{color:var(--sd-error, #b32626)}.sd-inline-view:hover .sd-inline-clear{display:inline-flex}.sd-inline-editor{position:absolute;inset:0;opacity:0;pointer-events:none}.sd-inline-editor ::ng-deep *{pointer-events:none!important}:host{display:block}:host(.sd-has-label){padding-top:4px}:host(.sd-viewed){padding-top:0}:host ::ng-deep .mat-mdc-form-field.mat-form-field-appearance-outline.mat-form-field-disabled .mat-mdc-text-field-wrapper{background:var(--sd-surface-muted)}:host ::ng-deep .mat-mdc-form-field input.c-selected::placeholder{color:#000;opacity:1}:host ::ng-deep .mat-mdc-form-field input.c-selected:-ms-input-placeholder{color:#000}:host ::ng-deep .mat-mdc-form-field input.c-selected::-ms-input-placeholder{color:#000}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected::placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected:-ms-input-placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected::-ms-input-placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field .mat-mdc-placeholder-required{color:var(--sd-error)}:host ::ng-deep .mat-mdc-form-field:hover .icon-copy{opacity:1}:host ::ng-deep .mat-mdc-form-field .icon-copy{cursor:pointer;width:.9em;height:.9em;fill:#00000080;transition:opacity .2s linear;opacity:0}::ng-deep .sd-autocomplete-panel .mat-mdc-option{min-height:36px!important;padding:8px 12px!important}::ng-deep .sd-autocomplete-panel .mdc-list-item__primary-text{font-size:14px!important;line-height:normal}::ng-deep .sd-autocomplete-panel .mat-pseudo-checkbox{transform:scale(.7);margin-right:8px!important}::ng-deep .sd-autocomplete-panel .mat-pseudo-checkbox-minimal{transform:scale(.7);transform-origin:center right}.sd__option--add{position:sticky;bottom:0;background-color:#fff;z-index:10;color:#000000de;cursor:pointer!important}.sd__option--add-btn{display:flex;align-items:center;width:100%;border:0;padding:0;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer}.c-loading-icon{position:absolute;right:5px;top:5px}\n"], dependencies: [{ kind: "component", type: SdIcon, selector: "sd-icon", inputs: ["name", "fontIcon", "color", "set", "fontSet", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i5.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i5.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "component", type: SdView, selector: "sd-view", inputs: ["label", "value", "display", "hyperlink", "labelTemplate", "valueTemplate", "selectedItems"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
449
460
  }
450
461
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdAutocomplete, decorators: [{
451
462
  type: Component,
@@ -461,7 +472,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
461
472
  MatProgressSpinnerModule,
462
473
  SdLabel,
463
474
  SdView,
464
- ], template: "@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _required = required();\n@let _displayField = displayField();\n@let _disabledField = disabledField();\n@let iDefTpl = itemDef()?.templateRef;\n@let _loading = loading();\n@let nVal = $any(normalizedValue());\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = nVal !== undefined && nVal !== null && nVal !== '';\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"nVal\"\n [display]=\"display()\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline \u2014 sd-view l\u00E0 \"m\u1EB7t\" + trigger; autocomplete editor render \u1EA9n (.sd-inline-editor) ch\u1EC9 \u0111\u1EC3 m\u1EDF panel. -->\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"nVal\"\n [display]=\"display()\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\">\n </sd-view>\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n }\n </span>\n }\n\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\"\n [class.sd-inline-editor]=\"_isInline\"\n [class.c-focused]=\"isFocused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n aria-hidden=\"true\">\n <mat-form-field\n [class.sd-md]=\"size() === 'md'\"\n [class.sd-sm]=\"size() === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [floatLabel]=\"nVal ? 'always' : 'auto'\"\n [appearance]=\"_appearance || 'outline'\">\n @if (_appearance && _label) {\n <mat-label class=\"sd-form-field-label\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\n }\n </mat-label>\n }\n\n <input\n [id]=\"id\"\n [formControl]=\"inputControl\"\n [placeholder]=\"controlPlaceHolder() || ''\"\n [class.c-selected]=\"nVal\"\n [matAutocomplete]=\"auto\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n matInput\n [autocomplete]=\"id\"\n autocorrect=\"off\"\n [errorStateMatcher]=\"matcher\"\n [required]=\"_required\"\n #input\n #autocompleteTrigger=\"matAutocompleteTrigger\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-loading]=\"dataLoading()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n aria-hidden=\"true\" />\n\n @if (!_loading && nVal && !inputControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn\" matSuffix (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\n <sd-icon name=\"close\"></sd-icon>\n </button>\n } @else if (_loading) {\n <mat-spinner [diameter]=\"20\" matSuffix></mat-spinner>\n } @else {\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" matSuffix name=\"search\"></sd-icon>\n }\n\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option.value)\" class=\"sd-autocomplete-panel\">\n @let _filteredItems = filteredItems();\n\n @if (_filteredItems?.length) {\n @for (item of _filteredItems; track $index) {\n <mat-option\n [value]=\"item\"\n matTooltipPosition=\"above\"\n [matTooltip]=\"_displayField ? getNestedValue(item, _displayField) : item\"\n [disabled]=\"_disabledField ? getNestedValue(item, _disabledField) : false\">\n @if (iDefTpl) {\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\n } @else {\n {{ _displayField ? getNestedValue(item, _displayField) : item }}\n }\n </mat-option>\n }\n } @else if (!_filteredItems?.length && inputControl.value && !isTyping() && !_loading) {}\n\n @if (addable() && sdAdd.observed) {\n <mat-option class=\"sd__option--add\" (keyup.Space)=\"$event.stopPropagation()\" disabled=\"true\">\n <div (click)=\"onAdd($event)\">\n <sd-icon class=\"mr-1\" name=\"add\"></sd-icon>\n {{ 'New item' }}\n </div>\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n </mat-form-field>\n </div>\n}\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-primary-contrast{color:var(--sd-primary-contrast)!important}.bg-primary-contrast{background:var(--sd-primary-contrast)!important}.border-primary-contrast{border-color:var(--sd-primary-contrast)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-secondary-contrast{color:var(--sd-secondary-contrast)!important}.bg-secondary-contrast{background:var(--sd-secondary-contrast)!important}.border-secondary-contrast{border-color:var(--sd-secondary-contrast)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-info-contrast{color:var(--sd-info-contrast)!important}.bg-info-contrast{background:var(--sd-info-contrast)!important}.border-info-contrast{border-color:var(--sd-info-contrast)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-success-contrast{color:var(--sd-success-contrast)!important}.bg-success-contrast{background:var(--sd-success-contrast)!important}.border-success-contrast{border-color:var(--sd-success-contrast)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-warning-contrast{color:var(--sd-warning-contrast)!important}.bg-warning-contrast{background:var(--sd-warning-contrast)!important}.border-warning-contrast{border-color:var(--sd-warning-contrast)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-error-contrast{color:var(--sd-error-contrast)!important}.bg-error-contrast{background:var(--sd-error-contrast)!important}.border-error-contrast{border-color:var(--sd-error-contrast)!important}.text-surface{color:var(--sd-surface)!important}.bg-surface{background:var(--sd-surface)!important}.border-surface{border-color:var(--sd-surface)!important}.text-surface-muted{color:var(--sd-surface-muted)!important}.bg-surface-muted{background:var(--sd-surface-muted)!important}.border-surface-muted{border-color:var(--sd-surface-muted)!important}.text-text{color:var(--sd-text)!important}.bg-text{background:var(--sd-text)!important}.border-text{border-color:var(--sd-text)!important}.text-text-secondary{color:var(--sd-text-secondary)!important}.bg-text-secondary{background:var(--sd-text-secondary)!important}.border-text-secondary{border-color:var(--sd-text-secondary)!important}.text-text-muted{color:var(--sd-text-muted)!important}.bg-text-muted{background:var(--sd-text-muted)!important}.border-text-muted{border-color:var(--sd-text-muted)!important}.text-border{color:var(--sd-border)!important}.bg-border{background:var(--sd-border)!important}.border-border{border-color:var(--sd-border)!important}.text-border-strong{color:var(--sd-border-strong)!important}.bg-border-strong{background:var(--sd-border-strong)!important}.border-border-strong{border-color:var(--sd-border-strong)!important}.text-disabled-bg{color:var(--sd-disabled-bg)!important}.bg-disabled-bg{background:var(--sd-disabled-bg)!important}.border-disabled-bg{border-color:var(--sd-disabled-bg)!important}.text-disabled-text{color:var(--sd-disabled-text)!important}.bg-disabled-text{background:var(--sd-disabled-text)!important}.border-disabled-text{border-color:var(--sd-disabled-text)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.text-secondary{color:var(--sd-text-secondary)!important}.text-muted{color:var(--sd-text-muted)!important}.text-body{color:var(--sd-text)!important}.bg-muted{background:var(--sd-surface-muted)!important}:host(.sd-bare){position:relative}.sd-inline-view{cursor:pointer;display:inline-flex;align-items:center;width:100%;padding:1px 6px;border-radius:4px;background-color:#0000000a;transition:background-color .15s ease}.sd-inline-view:hover{background-color:#00000014}.sd-inline-view .sd-inline-clear{display:none;align-items:center;margin-left:4px;padding:0;border:0;background:transparent;cursor:pointer;line-height:0;color:var(--sd-text-secondary, #6b7280);transition:color .15s ease}.sd-inline-view .sd-inline-clear sd-icon{font-size:16px;width:16px;height:16px}.sd-inline-view .sd-inline-clear:hover{color:var(--sd-error, #b32626)}.sd-inline-view:hover .sd-inline-clear{display:inline-flex}.sd-inline-editor{position:absolute;inset:0;opacity:0;pointer-events:none}.sd-inline-editor ::ng-deep *{pointer-events:none!important}:host{display:block}:host(.sd-has-label){padding-top:4px}:host(.sd-viewed){padding-top:0}:host ::ng-deep .mat-mdc-form-field.mat-form-field-appearance-outline.mat-form-field-disabled .mat-mdc-text-field-wrapper{background:var(--sd-surface-muted)}:host ::ng-deep .mat-mdc-form-field input.c-selected::placeholder{color:#000;opacity:1}:host ::ng-deep .mat-mdc-form-field input.c-selected:-ms-input-placeholder{color:#000}:host ::ng-deep .mat-mdc-form-field input.c-selected::-ms-input-placeholder{color:#000}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected::placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected:-ms-input-placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected::-ms-input-placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field .mat-mdc-placeholder-required{color:var(--sd-error)}:host ::ng-deep .mat-mdc-form-field:hover .icon-copy{opacity:1}:host ::ng-deep .mat-mdc-form-field .icon-copy{cursor:pointer;width:.9em;height:.9em;fill:#00000080;transition:opacity .2s linear;opacity:0}::ng-deep .sd-autocomplete-panel .mat-mdc-option{min-height:36px!important;padding:8px 12px!important}::ng-deep .sd-autocomplete-panel .mdc-list-item__primary-text{font-size:14px!important;line-height:normal}::ng-deep .sd-autocomplete-panel .mat-pseudo-checkbox{transform:scale(.7);margin-right:8px!important}::ng-deep .sd-autocomplete-panel .mat-pseudo-checkbox-minimal{transform:scale(.7);transform-origin:center right}.sd__option--add{position:sticky;bottom:0;background-color:#fff;z-index:10;color:#000000de;cursor:pointer!important}.c-loading-icon{position:absolute;right:5px;top:5px}\n"] }]
475
+ ], template: "@let _label = label();\r\n@let _appearance = appearance();\r\n@let _hideInlineError = hideInlineError();\r\n@let _errorMessage = errorMessage();\r\n@let _helperText = helperText();\r\n@let _required = required();\r\n@let _displayField = displayField();\r\n@let _disabledField = disabledField();\r\n@let iDefTpl = itemDef()?.templateRef;\r\n@let _loading = loading();\r\n@let nVal = $any(normalizedValue());\r\n@let _isInline = isInline();\r\n@let _bare = _isInline;\r\n@let _hasValue = nVal !== undefined && nVal !== null && nVal !== '';\r\n<!-- why: m\u1ED9t c\u1ED5ng gate duy nh\u1EA5t cho <mat-error>, aria-invalid v\u00E0 aria-describedby. -->\r\n@let _errorVisible = !!_errorMessage && formControl.touched;\r\n@let _showInlineError = !_hideInlineError && _errorVisible;\r\n\r\n@if (isViewed()) {\r\n <sd-view\r\n [label]=\"_label\"\r\n [labelTemplate]=\"sdLabelTemplate()\"\r\n [value]=\"nVal\"\r\n [display]=\"display()\"\r\n [hyperlink]=\"hyperlink()\"\r\n [valueTemplate]=\"viewTemplate()\">\r\n </sd-view>\r\n} @else {\r\n @if (_isInline) {\r\n <!-- why: inline \u2014 sd-view l\u00E0 \"m\u1EB7t\" + trigger; autocomplete editor render \u1EA9n (.sd-inline-editor) ch\u1EC9 \u0111\u1EC3 m\u1EDF panel. -->\r\n <span class=\"sd-inline-view\" role=\"button\" tabindex=\"0\" (click)=\"enterInlineEdit()\" (keydown.enter)=\"enterInlineEdit()\">\r\n <sd-view\r\n [label]=\"_label\"\r\n [labelTemplate]=\"sdLabelTemplate()\"\r\n [value]=\"nVal\"\r\n [display]=\"display()\"\r\n [hyperlink]=\"hyperlink()\"\r\n [valueTemplate]=\"viewTemplate()\">\r\n </sd-view>\r\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\r\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\r\n <sd-icon name=\"close\"></sd-icon>\r\n </button>\r\n }\r\n </span>\r\n }\r\n\r\n @if (!_appearance) {\r\n <ng-content select=\"[sdLabel]\">\r\n @if (_label) {\r\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\r\n }\r\n </ng-content>\r\n }\r\n\r\n <!-- why: div ch\u1EC9 l\u00E0 h\u1ED9p layout. aria-hidden=\"true\" c\u0169 \u1EA9n C\u1EA2 c\u00E2y con \u2014 label, <input>,\r\n <mat-error>, n\u00FAt clear v\u00E0 c\u1EA3 panel g\u1EE3i \u00FD \u2014 kh\u1ECFi accessibility tree. role=\"presentation\"\r\n ch\u1EC9 v\u00F4 hi\u1EC7u ho\u00E1 ch\u00EDnh div, KH\u00D4NG lan xu\u1ED1ng con; (click) l\u00E0 ti\u1EC7n \u00EDch chu\u1ED9t m\u00E0 b\u00E0n ph\u00EDm \u0111\u00E3\r\n c\u00F3 qua Tab v\u00E0o <input>. -->\r\n <div\r\n class=\"d-flex align-items-center\"\r\n role=\"presentation\"\r\n [class.sd-inline-editor]=\"_isInline\"\r\n [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n (click)=\"onClick()\">\r\n <mat-form-field\r\n [class.sd-md]=\"size() === 'md'\"\r\n [class.sd-sm]=\"size() === 'sm'\"\r\n [class.hide-inline-error]=\"_hideInlineError\"\r\n [floatLabel]=\"nVal ? 'always' : 'auto'\"\r\n [appearance]=\"_appearance || 'outline'\">\r\n @if (_appearance && _label) {\r\n <mat-label class=\"sd-form-field-label\">\r\n <span>{{ _label }}</span>\r\n @if (_helperText) {\r\n <sd-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\" name=\"info\"></sd-icon>\r\n }\r\n </mat-label>\r\n }\r\n\r\n <!-- why: B\u1ECE aria-hidden tr\u00EAn ch\u00EDnh <input> \u2014 \u00F4 Tab t\u1EDBi v\u00E0 g\u00F5 \u0111\u01B0\u1EE3c, aria-hidden ch\u1EC9 khi\u1EBFn\r\n screen reader \u0111\u1ECDc ra kho\u1EA3ng l\u1EB7ng. -->\r\n <input\r\n [id]=\"id\"\r\n [formControl]=\"inputControl\"\r\n [placeholder]=\"controlPlaceHolder() || ''\"\r\n [class.c-selected]=\"nVal\"\r\n [matAutocomplete]=\"auto\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n matInput\r\n [autocomplete]=\"id\"\r\n autocorrect=\"off\"\r\n [errorStateMatcher]=\"matcher\"\r\n [required]=\"_required\"\r\n #input\r\n #autocompleteTrigger=\"matAutocompleteTrigger\"\r\n [attr.data-autoId]=\"autoId()\"\r\n [attr.data-disabled]=\"dataDisabled()\"\r\n [attr.data-invalid]=\"dataInvalid()\"\r\n [attr.data-empty]=\"dataEmpty()\"\r\n [attr.data-value]=\"dataValue()\"\r\n [attr.data-loading]=\"dataLoading()\"\r\n [attr.data-required]=\"dataRequired()\"\r\n [attr.data-error-message]=\"dataErrorMessage()\"\r\n [attr.aria-invalid]=\"_errorVisible ? 'true' : null\"\r\n [attr.aria-describedby]=\"_errorMessage ? errorId : null\" />\r\n\r\n @if (!_loading && nVal && !inputControl.disabled && !_bare) {\r\n <button type=\"button\" class=\"sd-clear-btn\" matSuffix (click)=\"clear($event)\" title=\"X\u00F3a\" aria-label=\"X\u00F3a\">\r\n <sd-icon name=\"close\"></sd-icon>\r\n </button>\r\n } @else if (_loading) {\r\n <mat-spinner [diameter]=\"20\" matSuffix></mat-spinner>\r\n } @else {\r\n <sd-icon class=\"cursor-pointer sd-suffix-icon\" matSuffix name=\"search\"></sd-icon>\r\n }\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onSelect($event.option.value)\" class=\"sd-autocomplete-panel\">\r\n @let _filteredItems = filteredItems();\r\n\r\n @if (_filteredItems?.length) {\r\n @for (item of _filteredItems; track $index) {\r\n <mat-option\r\n [value]=\"item\"\r\n matTooltipPosition=\"above\"\r\n [matTooltip]=\"_displayField ? getNestedValue(item, _displayField) : item\"\r\n [disabled]=\"_disabledField ? getNestedValue(item, _disabledField) : false\">\r\n @if (iDefTpl) {\r\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\r\n } @else {\r\n {{ _displayField ? getNestedValue(item, _displayField) : item }}\r\n }\r\n </mat-option>\r\n }\r\n } @else if (!_filteredItems?.length && inputControl.value && !isTyping() && !_loading) {}\r\n\r\n @if (addable() && sdAdd.observed) {\r\n <mat-option class=\"sd__option--add\" (keyup.Space)=\"$event.stopPropagation()\" disabled=\"true\">\r\n <!-- why: tr\u01B0\u1EDBc l\u00E0 <div (click)> \u2014 kh\u00F4ng Tab t\u1EDBi \u0111\u01B0\u1EE3c, kh\u00F4ng c\u00F3 role, v\u00E0 ch\u1EC9 \"im l\u1EB7ng\"\r\n v\u1EDBi lint v\u00EC c\u1EA3 c\u1EE5m n\u1EB1m trong c\u00E2y aria-hidden. <button type=\"button\"> l\u1EA5y s\u1EB5n\r\n Enter/Space + role button, kh\u00F4ng ph\u1EA3i b\u1ECBa tabindex/keydown th\u1EE7 c\u00F4ng. -->\r\n <button type=\"button\" class=\"sd__option--add-btn\" (click)=\"onAdd($event)\">\r\n <sd-icon class=\"mr-1\" name=\"add\" aria-hidden=\"true\"></sd-icon>\r\n {{ 'New item' }}\r\n </button>\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n\r\n @if (_hideInlineError && _errorVisible) {\r\n <sd-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\" name=\"error\"></sd-icon>\n }\r\n @if (_hideInlineError && _errorVisible) {\r\n <span class=\"sd-visually-hidden\" [id]=\"errorId\" matSuffix>{{ _errorMessage }}</span>\r\r\n }\r\n\r\n @if (_showInlineError) {\r\n <mat-error [id]=\"errorId\">{{ _errorMessage }}</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n}\r\n", styles: [".text-primary{color:var(--sd-primary)!important}.bg-primary{background:var(--sd-primary)!important}.border-primary{border-color:var(--sd-primary)!important}.text-primary-light{color:var(--sd-primary-light)!important}.bg-primary-light{background:var(--sd-primary-light)!important}.border-primary-light{border-color:var(--sd-primary-light)!important}.text-primary-dark{color:var(--sd-primary-dark)!important}.bg-primary-dark{background:var(--sd-primary-dark)!important}.border-primary-dark{border-color:var(--sd-primary-dark)!important}.text-primary-contrast{color:var(--sd-primary-contrast)!important}.bg-primary-contrast{background:var(--sd-primary-contrast)!important}.border-primary-contrast{border-color:var(--sd-primary-contrast)!important}.text-secondary{color:var(--sd-secondary)!important}.bg-secondary{background:var(--sd-secondary)!important}.border-secondary{border-color:var(--sd-secondary)!important}.text-secondary-light{color:var(--sd-secondary-light)!important}.bg-secondary-light{background:var(--sd-secondary-light)!important}.border-secondary-light{border-color:var(--sd-secondary-light)!important}.text-secondary-dark{color:var(--sd-secondary-dark)!important}.bg-secondary-dark{background:var(--sd-secondary-dark)!important}.border-secondary-dark{border-color:var(--sd-secondary-dark)!important}.text-secondary-contrast{color:var(--sd-secondary-contrast)!important}.bg-secondary-contrast{background:var(--sd-secondary-contrast)!important}.border-secondary-contrast{border-color:var(--sd-secondary-contrast)!important}.text-info{color:var(--sd-info)!important}.bg-info{background:var(--sd-info)!important}.border-info{border-color:var(--sd-info)!important}.text-info-light{color:var(--sd-info-light)!important}.bg-info-light{background:var(--sd-info-light)!important}.border-info-light{border-color:var(--sd-info-light)!important}.text-info-dark{color:var(--sd-info-dark)!important}.bg-info-dark{background:var(--sd-info-dark)!important}.border-info-dark{border-color:var(--sd-info-dark)!important}.text-info-contrast{color:var(--sd-info-contrast)!important}.bg-info-contrast{background:var(--sd-info-contrast)!important}.border-info-contrast{border-color:var(--sd-info-contrast)!important}.text-success{color:var(--sd-success)!important}.bg-success{background:var(--sd-success)!important}.border-success{border-color:var(--sd-success)!important}.text-success-light{color:var(--sd-success-light)!important}.bg-success-light{background:var(--sd-success-light)!important}.border-success-light{border-color:var(--sd-success-light)!important}.text-success-dark{color:var(--sd-success-dark)!important}.bg-success-dark{background:var(--sd-success-dark)!important}.border-success-dark{border-color:var(--sd-success-dark)!important}.text-success-contrast{color:var(--sd-success-contrast)!important}.bg-success-contrast{background:var(--sd-success-contrast)!important}.border-success-contrast{border-color:var(--sd-success-contrast)!important}.text-warning{color:var(--sd-warning)!important}.bg-warning{background:var(--sd-warning)!important}.border-warning{border-color:var(--sd-warning)!important}.text-warning-light{color:var(--sd-warning-light)!important}.bg-warning-light{background:var(--sd-warning-light)!important}.border-warning-light{border-color:var(--sd-warning-light)!important}.text-warning-dark{color:var(--sd-warning-dark)!important}.bg-warning-dark{background:var(--sd-warning-dark)!important}.border-warning-dark{border-color:var(--sd-warning-dark)!important}.text-warning-contrast{color:var(--sd-warning-contrast)!important}.bg-warning-contrast{background:var(--sd-warning-contrast)!important}.border-warning-contrast{border-color:var(--sd-warning-contrast)!important}.text-error{color:var(--sd-error)!important}.bg-error{background:var(--sd-error)!important}.border-error{border-color:var(--sd-error)!important}.text-error-light{color:var(--sd-error-light)!important}.bg-error-light{background:var(--sd-error-light)!important}.border-error-light{border-color:var(--sd-error-light)!important}.text-error-dark{color:var(--sd-error-dark)!important}.bg-error-dark{background:var(--sd-error-dark)!important}.border-error-dark{border-color:var(--sd-error-dark)!important}.text-error-contrast{color:var(--sd-error-contrast)!important}.bg-error-contrast{background:var(--sd-error-contrast)!important}.border-error-contrast{border-color:var(--sd-error-contrast)!important}.text-surface{color:var(--sd-surface)!important}.bg-surface{background:var(--sd-surface)!important}.border-surface{border-color:var(--sd-surface)!important}.text-surface-muted{color:var(--sd-surface-muted)!important}.bg-surface-muted{background:var(--sd-surface-muted)!important}.border-surface-muted{border-color:var(--sd-surface-muted)!important}.text-text{color:var(--sd-text)!important}.bg-text{background:var(--sd-text)!important}.border-text{border-color:var(--sd-text)!important}.text-text-secondary{color:var(--sd-text-secondary)!important}.bg-text-secondary{background:var(--sd-text-secondary)!important}.border-text-secondary{border-color:var(--sd-text-secondary)!important}.text-text-muted{color:var(--sd-text-muted)!important}.bg-text-muted{background:var(--sd-text-muted)!important}.border-text-muted{border-color:var(--sd-text-muted)!important}.text-border{color:var(--sd-border)!important}.bg-border{background:var(--sd-border)!important}.border-border{border-color:var(--sd-border)!important}.text-border-strong{color:var(--sd-border-strong)!important}.bg-border-strong{background:var(--sd-border-strong)!important}.border-border-strong{border-color:var(--sd-border-strong)!important}.text-disabled-bg{color:var(--sd-disabled-bg)!important}.bg-disabled-bg{background:var(--sd-disabled-bg)!important}.border-disabled-bg{border-color:var(--sd-disabled-bg)!important}.text-disabled-text{color:var(--sd-disabled-text)!important}.bg-disabled-text{background:var(--sd-disabled-text)!important}.border-disabled-text{border-color:var(--sd-disabled-text)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.border-white{border-color:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.border-black{border-color:#000!important}.text-secondary{color:var(--sd-text-secondary)!important}.text-muted{color:var(--sd-text-muted)!important}.text-body{color:var(--sd-text)!important}.bg-muted{background:var(--sd-surface-muted)!important}:host(.sd-bare){position:relative}.sd-inline-view{cursor:pointer;display:inline-flex;align-items:center;width:100%;padding:1px 6px;border-radius:4px;background-color:#0000000a;transition:background-color .15s ease}.sd-inline-view:hover{background-color:#00000014}.sd-inline-view .sd-inline-clear{display:none;align-items:center;margin-left:4px;padding:0;border:0;background:transparent;cursor:pointer;line-height:0;color:var(--sd-text-secondary, #6b7280);transition:color .15s ease}.sd-inline-view .sd-inline-clear sd-icon{font-size:16px;width:16px;height:16px}.sd-inline-view .sd-inline-clear:hover{color:var(--sd-error, #b32626)}.sd-inline-view:hover .sd-inline-clear{display:inline-flex}.sd-inline-editor{position:absolute;inset:0;opacity:0;pointer-events:none}.sd-inline-editor ::ng-deep *{pointer-events:none!important}:host{display:block}:host(.sd-has-label){padding-top:4px}:host(.sd-viewed){padding-top:0}:host ::ng-deep .mat-mdc-form-field.mat-form-field-appearance-outline.mat-form-field-disabled .mat-mdc-text-field-wrapper{background:var(--sd-surface-muted)}:host ::ng-deep .mat-mdc-form-field input.c-selected::placeholder{color:#000;opacity:1}:host ::ng-deep .mat-mdc-form-field input.c-selected:-ms-input-placeholder{color:#000}:host ::ng-deep .mat-mdc-form-field input.c-selected::-ms-input-placeholder{color:#000}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected::placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected:-ms-input-placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field input.mat-mdc-input-element:disabled.c-selected::-ms-input-placeholder{color:var(--sd-disabled-text)!important}:host ::ng-deep .mat-mdc-form-field .mat-mdc-placeholder-required{color:var(--sd-error)}:host ::ng-deep .mat-mdc-form-field:hover .icon-copy{opacity:1}:host ::ng-deep .mat-mdc-form-field .icon-copy{cursor:pointer;width:.9em;height:.9em;fill:#00000080;transition:opacity .2s linear;opacity:0}::ng-deep .sd-autocomplete-panel .mat-mdc-option{min-height:36px!important;padding:8px 12px!important}::ng-deep .sd-autocomplete-panel .mdc-list-item__primary-text{font-size:14px!important;line-height:normal}::ng-deep .sd-autocomplete-panel .mat-pseudo-checkbox{transform:scale(.7);margin-right:8px!important}::ng-deep .sd-autocomplete-panel .mat-pseudo-checkbox-minimal{transform:scale(.7);transform-origin:center right}.sd__option--add{position:sticky;bottom:0;background-color:#fff;z-index:10;color:#000000de;cursor:pointer!important}.sd__option--add-btn{display:flex;align-items:center;width:100%;border:0;padding:0;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer}.c-loading-icon{position:absolute;right:5px;top:5px}\n"] }]
465
476
  }], ctorParameters: () => [], propDecorators: { sdAdd: [{
466
477
  type: Output
467
478
  }] } });