@sd-angular/core 19.0.0-beta.10 → 19.0.0-beta.101

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 (813) hide show
  1. package/README.md +723 -64
  2. package/assets/images/coming-soon.svg +23 -0
  3. package/assets/images/data-empty.svg +21 -0
  4. package/assets/images/expired.svg +22 -0
  5. package/assets/images/file-error.svg +28 -0
  6. package/assets/images/filter-empty.svg +20 -0
  7. package/assets/images/filter-required.svg +21 -0
  8. package/assets/images/forbidden.svg +15 -0
  9. package/assets/images/image-error.svg +27 -0
  10. package/assets/images/maintenance.svg +23 -0
  11. package/assets/images/not-found.svg +20 -0
  12. package/assets/images/offline.svg +20 -0
  13. package/assets/images/submitted.svg +18 -0
  14. package/assets/images/success.svg +18 -0
  15. package/assets/images/unauthorized.svg +22 -0
  16. package/assets/images/unknown-error.svg +18 -0
  17. package/assets/scss/README.md +524 -0
  18. package/assets/scss/ckeditor5.scss +61 -4
  19. package/assets/scss/core/bootstrap.scss +0 -108
  20. package/assets/scss/core/form.scss +32 -6
  21. package/assets/scss/core/image.scss +35 -0
  22. package/assets/scss/core/utilities/_base.scss +333 -0
  23. package/assets/scss/core/utilities/_border.scss +22 -0
  24. package/assets/scss/core/utilities/_display.scss +10 -0
  25. package/assets/scss/core/utilities/_elevation.scss +80 -0
  26. package/assets/scss/core/utilities/_flexbox.scss +54 -0
  27. package/assets/scss/core/utilities/_gap.scss +9 -0
  28. package/assets/scss/core/utilities/_grid.scss +142 -0
  29. package/assets/scss/core/utilities/_index.scss +17 -0
  30. package/assets/scss/core/utilities/_misc.scss +20 -0
  31. package/assets/scss/core/utilities/_overflow.scss +9 -0
  32. package/assets/scss/core/utilities/_position.scss +8 -0
  33. package/assets/scss/core/utilities/_sizing.scss +28 -0
  34. package/assets/scss/core/utilities/_spacing.scss +31 -0
  35. package/assets/scss/core/utilities/_typography.scss +99 -0
  36. package/assets/scss/sd-core.scss +9 -5
  37. package/assets/scss/themes/material-theme.scss +82 -40
  38. package/components/anchor/index.d.ts +1 -1
  39. package/components/anchor/src/components/anchor/anchor.component.d.ts +22 -0
  40. package/components/anchor/src/components/anchor-item/anchor-item.component.d.ts +9 -11
  41. package/components/anchor/src/components/anchor-nav/anchor-nav.component.d.ts +21 -0
  42. package/components/anchor/src/components/index.d.ts +1 -1
  43. package/components/anchor/src/models/index.d.ts +1 -0
  44. package/components/anchor/src/models/sd-anchor.model.d.ts +7 -0
  45. package/components/autoid-inspector/index.d.ts +8 -0
  46. package/components/autoid-inspector/src/autoid-inspector.component.d.ts +55 -0
  47. package/components/autoid-inspector/src/models/autoid-element.model.d.ts +55 -0
  48. package/components/autoid-inspector/src/models/autoid-export-format.model.d.ts +6 -0
  49. package/components/autoid-inspector/src/models/autoid-inspector-config.model.d.ts +8 -0
  50. package/components/autoid-inspector/src/services/autoid-audit.service.d.ts +19 -0
  51. package/components/autoid-inspector/src/services/autoid-export.service.d.ts +21 -0
  52. package/components/autoid-inspector/src/services/autoid-highlight.service.d.ts +12 -0
  53. package/components/autoid-inspector/src/services/autoid-scanner.service.d.ts +23 -0
  54. package/components/avatar/index.d.ts +1 -0
  55. package/components/avatar/src/avatar.component.d.ts +19 -0
  56. package/components/badge/src/badge.component.d.ts +74 -20
  57. package/components/button/src/button.component.d.ts +30 -28
  58. package/components/chart/index.d.ts +4 -0
  59. package/components/chart/src/bar-chart.component.d.ts +18 -0
  60. package/components/chart/src/doughnut-chart.component.d.ts +16 -0
  61. package/components/chart/src/line-chart.component.d.ts +18 -0
  62. package/components/chart/src/pie-chart.component.d.ts +16 -0
  63. package/components/code-editor/index.d.ts +1 -0
  64. package/components/code-editor/src/code-editor.component.d.ts +25 -0
  65. package/components/document-builder/index.d.ts +1 -0
  66. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +4 -1
  67. package/components/document-builder/src/document-builder.component.d.ts +7 -52
  68. package/components/document-builder/src/document-builder.model.d.ts +21 -12
  69. package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +9 -0
  70. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +44 -0
  71. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +57 -0
  72. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +1 -0
  73. package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +4 -0
  74. package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +31 -0
  75. package/components/document-builder/src/plugins/index.d.ts +7 -2
  76. package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +2 -2
  77. package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +14 -0
  78. package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +15 -0
  79. package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +25 -0
  80. package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +29 -0
  81. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +35 -0
  82. package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +15 -0
  83. package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +15 -0
  84. package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +15 -0
  85. package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +15 -0
  86. package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +15 -0
  87. package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +15 -0
  88. package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +54 -0
  89. package/components/document-builder/src/plugins/paste-handler/filters/replacetabswithinprewithspaces.d.ts +24 -0
  90. package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +27 -0
  91. package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +16 -0
  92. package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +25 -0
  93. package/components/document-builder/src/plugins/paste-handler/index.d.ts +35 -0
  94. package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +31 -0
  95. package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +31 -0
  96. package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +29 -0
  97. package/components/document-builder/src/plugins/paste-handler/types.d.ts +30 -0
  98. package/components/document-builder/src/plugins/table-custom/index.d.ts +34 -0
  99. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +45 -0
  100. package/components/editor/index.d.ts +3 -0
  101. package/components/editor/src/configurations/editor.configuration.d.ts +12 -0
  102. package/components/editor/src/configurations/index.d.ts +1 -0
  103. package/components/editor/src/editor.component.d.ts +52 -0
  104. package/components/editor/src/models/editor.model.d.ts +10 -0
  105. package/components/editor/src/models/image-upload.plugin.model.d.ts +51 -0
  106. package/components/editor/src/models/index.d.ts +2 -0
  107. package/components/editor/src/plugins/image-upload/image-upload.plugin.d.ts +22 -0
  108. package/components/editor/src/plugins/image-upload/utils/batch.utils.d.ts +14 -0
  109. package/components/editor/src/plugins/image-upload/utils/index.d.ts +3 -0
  110. package/components/editor/src/plugins/image-upload/utils/style.utils.d.ts +3 -0
  111. package/components/editor/src/plugins/image-upload/utils/validate.utils.d.ts +4 -0
  112. package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-table/attribute-table.component.d.ts +6 -4
  113. package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-template/attribute-template.component.d.ts +4 -4
  114. package/components/{workflow → form-generic}/src/components/form-builder/components/configure-validation/configure-validation.component.d.ts +4 -4
  115. package/components/{workflow → form-generic}/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +1 -1
  116. package/components/form-generic/src/components/form-builder/components/group/attribute/group-attribute.component.d.ts +23 -0
  117. package/components/form-generic/src/components/form-builder/components/group/index.d.ts +1 -0
  118. package/components/{workflow → form-generic}/src/components/form-builder/components/index.d.ts +1 -0
  119. package/components/{workflow → form-generic}/src/components/form-builder/components/table/control/table-control.component.d.ts +3 -0
  120. package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +120 -0
  121. package/components/{workflow → form-generic}/src/components/form-render/form-render.component.d.ts +4 -4
  122. package/components/{workflow → form-generic}/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
  123. package/components/{workflow/src/configurations/workflow.configuration.d.ts → form-generic/src/configurations/form-generic.configuration.d.ts} +2 -2
  124. package/components/form-generic/src/configurations/index.d.ts +2 -0
  125. package/components/{workflow → form-generic}/src/models/form-generic-component.model.d.ts +27 -6
  126. package/components/{workflow → form-generic}/src/models/form-generic-expression.model.d.ts +1 -0
  127. package/components/{workflow → form-generic}/src/pipes/html.pipe.d.ts +4 -4
  128. package/components/{workflow → form-generic}/src/services/form-generic.service.d.ts +3 -3
  129. package/components/index.d.ts +10 -2
  130. package/components/mini-editor/index.d.ts +2 -0
  131. package/components/mini-editor/src/mini-editor.component.d.ts +91 -0
  132. package/components/mini-editor/src/mini-editor.model.d.ts +44 -0
  133. package/components/modal/index.d.ts +1 -1
  134. package/components/modal/src/modal.component.d.ts +29 -0
  135. package/components/operator/index.d.ts +1 -0
  136. package/components/operator/src/operator.component.d.ts +38 -0
  137. package/components/preview/index.d.ts +3 -0
  138. package/components/preview/src/preview-image/preview-image.component.d.ts +84 -24
  139. package/components/preview/src/preview-image/preview-image.types.d.ts +53 -0
  140. package/components/preview/src/preview-pdf/preview-pdf.component.d.ts +186 -0
  141. package/components/preview/src/preview-pdf/preview-pdf.types.d.ts +84 -0
  142. package/components/query-bar/index.d.ts +2 -0
  143. package/components/query-bar/src/inline-value-chip.component.d.ts +71 -0
  144. package/components/query-bar/src/query-bar.component.d.ts +180 -0
  145. package/components/query-bar/src/query-bar.model.d.ts +121 -0
  146. package/components/quick-action/src/quick-action.component.d.ts +5 -6
  147. package/components/section/index.d.ts +1 -0
  148. package/components/section/src/section-item/section-item.component.d.ts +7 -0
  149. package/components/section/src/section.component.d.ts +11 -12
  150. package/components/side-drawer/src/side-drawer.component.d.ts +17 -26
  151. package/components/splitter/index.d.ts +3 -0
  152. package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +24 -0
  153. package/components/splitter/src/splitter-panel/splitter-panel.component.d.ts +16 -0
  154. package/components/splitter/src/splitter-state.service.d.ts +26 -0
  155. package/components/splitter/src/splitter.component.d.ts +28 -0
  156. package/components/splitter/src/splitter.models.d.ts +23 -0
  157. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +4 -1
  158. package/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.d.ts +5 -6
  159. package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +6 -17
  160. package/components/table/index.d.ts +3 -0
  161. package/components/table/src/components/column-title/column-title.component.d.ts +10 -0
  162. package/components/table/src/components/command/desktop-command.component.d.ts +14 -0
  163. package/components/table/src/components/command/pipes/command.pipe.d.ts +30 -0
  164. package/components/table/src/components/command/pipes/filter.pipe.d.ts +35 -0
  165. package/components/table/src/components/config/config.component.d.ts +7 -14
  166. package/components/table/src/components/desktop-cell/desktop-cell.component.d.ts +19 -12
  167. package/components/table/src/components/desktop-cell/view/view.component.d.ts +24 -0
  168. package/components/table/src/components/filter/column-filter/column-filter.component.d.ts +32 -0
  169. package/components/table/src/components/filter/external-filter/external-filter.component.d.ts +27 -0
  170. package/components/table/src/components/filter/index.d.ts +3 -0
  171. package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts +42 -0
  172. package/components/table/src/components/index.d.ts +2 -2
  173. package/components/table/src/components/selector-action/action-filter.pipe.d.ts +11 -10
  174. package/components/table/src/components/selector-action/selector-action.component.d.ts +7 -6
  175. package/components/table/src/directives/index.d.ts +5 -0
  176. package/components/table/src/directives/sd-column-resize.directive.d.ts +13 -0
  177. package/components/table/src/directives/sd-table-cell-def.directive.d.ts +13 -6
  178. package/components/table/src/directives/sd-table-column-filter-def.directive.d.ts +16 -0
  179. package/components/table/src/directives/sd-table-expand-def.directive.d.ts +10 -5
  180. package/components/table/src/directives/sd-table-filter-def.directive.d.ts +6 -8
  181. package/components/table/src/directives/sd-table-footer-def.directive.d.ts +13 -6
  182. package/components/table/src/directives/sd-table-title-def.directive.d.ts +14 -0
  183. package/components/table/src/directives/sticky-shadow.directive.d.ts +17 -0
  184. package/components/table/src/models/index.d.ts +1 -0
  185. package/components/table/src/models/table-column.model.d.ts +49 -40
  186. package/components/table/src/models/table-command.model.d.ts +7 -3
  187. package/components/table/src/models/table-item.model.d.ts +15 -4
  188. package/components/table/src/models/table-option-config.model.d.ts +5 -0
  189. package/components/table/src/models/table-option-export.model.d.ts +3 -2
  190. package/components/table/src/models/table-option-selector.model.d.ts +65 -10
  191. package/components/table/src/models/table-option-style.model.d.ts +6 -1
  192. package/components/table/src/models/table-option-tree.model.d.ts +12 -0
  193. package/components/table/src/models/table-option.model.d.ts +136 -8
  194. package/components/table/src/pipes/index.d.ts +1 -0
  195. package/components/table/src/pipes/sd-tree.pipe.d.ts +9 -0
  196. package/components/table/src/services/column-width.util.d.ts +7 -0
  197. package/components/table/src/services/config.service.d.ts +5 -0
  198. package/components/table/src/services/index.d.ts +3 -0
  199. package/components/table/src/services/table-export/table-export.service.d.ts +26 -0
  200. package/components/table/src/services/table-filter/table-filter.model.d.ts +6 -5
  201. package/components/table/src/services/table-format/table-format.service.d.ts +16 -0
  202. package/components/table/src/services/tree/tree.util.d.ts +14 -0
  203. package/components/table/src/table.component.d.ts +58 -57
  204. package/components/upload-file/src/configurations/upload-file.configuration.d.ts +34 -1
  205. package/components/upload-file/src/services/upload-file.service.d.ts +0 -1
  206. package/components/upload-file/src/upload-file.component.d.ts +58 -54
  207. package/components/view/index.d.ts +1 -0
  208. package/components/view/src/view.component.d.ts +16 -0
  209. package/configurations/src/sd-core.configuration.d.ts +2 -0
  210. package/directives/index.d.ts +2 -0
  211. package/directives/src/sd-desktop.directive.d.ts +2 -4
  212. package/directives/src/sd-href.directive.d.ts +9 -0
  213. package/directives/src/sd-mobile.directive.d.ts +2 -4
  214. package/directives/src/sd-tooltip.directive.d.ts +26 -0
  215. package/fesm2022/sd-angular-core-components-anchor.mjs +139 -214
  216. package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
  217. package/fesm2022/sd-angular-core-components-autoid-inspector.mjs +723 -0
  218. package/fesm2022/sd-angular-core-components-autoid-inspector.mjs.map +1 -0
  219. package/fesm2022/sd-angular-core-components-avatar.mjs +103 -0
  220. package/fesm2022/sd-angular-core-components-avatar.mjs.map +1 -0
  221. package/fesm2022/sd-angular-core-components-badge.mjs +102 -93
  222. package/fesm2022/sd-angular-core-components-badge.mjs.map +1 -1
  223. package/fesm2022/sd-angular-core-components-base.mjs +3 -3
  224. package/fesm2022/sd-angular-core-components-button.mjs +72 -98
  225. package/fesm2022/sd-angular-core-components-button.mjs.map +1 -1
  226. package/fesm2022/sd-angular-core-components-chart.mjs +290 -0
  227. package/fesm2022/sd-angular-core-components-chart.mjs.map +1 -0
  228. package/fesm2022/sd-angular-core-components-code-editor.mjs +128 -0
  229. package/fesm2022/sd-angular-core-components-code-editor.mjs.map +1 -0
  230. package/fesm2022/sd-angular-core-components-document-builder.mjs +4048 -591
  231. package/fesm2022/sd-angular-core-components-document-builder.mjs.map +1 -1
  232. package/fesm2022/sd-angular-core-components-editor.mjs +1078 -0
  233. package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -0
  234. package/fesm2022/sd-angular-core-components-form-generic.mjs +6714 -0
  235. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -0
  236. package/fesm2022/sd-angular-core-components-history.mjs +9 -8
  237. package/fesm2022/sd-angular-core-components-history.mjs.map +1 -1
  238. package/fesm2022/sd-angular-core-components-import-excel.mjs +35 -33
  239. package/fesm2022/sd-angular-core-components-import-excel.mjs.map +1 -1
  240. package/fesm2022/sd-angular-core-components-mini-editor.mjs +332 -0
  241. package/fesm2022/sd-angular-core-components-mini-editor.mjs.map +1 -0
  242. package/fesm2022/sd-angular-core-components-modal.mjs +70 -93
  243. package/fesm2022/sd-angular-core-components-modal.mjs.map +1 -1
  244. package/fesm2022/sd-angular-core-components-operator.mjs +88 -0
  245. package/fesm2022/sd-angular-core-components-operator.mjs.map +1 -0
  246. package/fesm2022/sd-angular-core-components-preview.mjs +1963 -89
  247. package/fesm2022/sd-angular-core-components-preview.mjs.map +1 -1
  248. package/fesm2022/sd-angular-core-components-query-bar.mjs +998 -0
  249. package/fesm2022/sd-angular-core-components-query-bar.mjs.map +1 -0
  250. package/fesm2022/sd-angular-core-components-query-builder.mjs +3 -3
  251. package/fesm2022/sd-angular-core-components-quick-action.mjs +10 -21
  252. package/fesm2022/sd-angular-core-components-quick-action.mjs.map +1 -1
  253. package/fesm2022/sd-angular-core-components-section.mjs +42 -44
  254. package/fesm2022/sd-angular-core-components-section.mjs.map +1 -1
  255. package/fesm2022/sd-angular-core-components-side-drawer.mjs +91 -91
  256. package/fesm2022/sd-angular-core-components-side-drawer.mjs.map +1 -1
  257. package/fesm2022/sd-angular-core-components-splitter.mjs +646 -0
  258. package/fesm2022/sd-angular-core-components-splitter.mjs.map +1 -0
  259. package/fesm2022/sd-angular-core-components-tab-router.mjs +304 -288
  260. package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
  261. package/fesm2022/sd-angular-core-components-table.mjs +2419 -1706
  262. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  263. package/fesm2022/sd-angular-core-components-upload-file.mjs +422 -463
  264. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  265. package/fesm2022/sd-angular-core-components-view.mjs +45 -0
  266. package/fesm2022/sd-angular-core-components-view.mjs.map +1 -0
  267. package/fesm2022/sd-angular-core-components.mjs +10 -2
  268. package/fesm2022/sd-angular-core-components.mjs.map +1 -1
  269. package/fesm2022/sd-angular-core-configurations.mjs.map +1 -1
  270. package/fesm2022/sd-angular-core-directives.mjs +315 -54
  271. package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
  272. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +307 -368
  273. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  274. package/fesm2022/sd-angular-core-forms-checkbox.mjs +85 -93
  275. package/fesm2022/sd-angular-core-forms-checkbox.mjs.map +1 -1
  276. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs +231 -212
  277. package/fesm2022/sd-angular-core-forms-chip-calendar.mjs.map +1 -1
  278. package/fesm2022/sd-angular-core-forms-chip.mjs +234 -207
  279. package/fesm2022/sd-angular-core-forms-chip.mjs.map +1 -1
  280. package/fesm2022/sd-angular-core-forms-date-range.mjs +222 -258
  281. package/fesm2022/sd-angular-core-forms-date-range.mjs.map +1 -1
  282. package/fesm2022/sd-angular-core-forms-date.mjs +224 -287
  283. package/fesm2022/sd-angular-core-forms-date.mjs.map +1 -1
  284. package/fesm2022/sd-angular-core-forms-datetime.mjs +626 -321
  285. package/fesm2022/sd-angular-core-forms-datetime.mjs.map +1 -1
  286. package/fesm2022/sd-angular-core-forms-directives.mjs +26 -32
  287. package/fesm2022/sd-angular-core-forms-directives.mjs.map +1 -1
  288. package/fesm2022/sd-angular-core-forms-input-number.mjs +235 -343
  289. package/fesm2022/sd-angular-core-forms-input-number.mjs.map +1 -1
  290. package/fesm2022/sd-angular-core-forms-input.mjs +232 -302
  291. package/fesm2022/sd-angular-core-forms-input.mjs.map +1 -1
  292. package/fesm2022/sd-angular-core-forms-label.mjs +3 -3
  293. package/fesm2022/sd-angular-core-forms-models.mjs +77 -2
  294. package/fesm2022/sd-angular-core-forms-models.mjs.map +1 -1
  295. package/fesm2022/sd-angular-core-forms-radio.mjs +115 -183
  296. package/fesm2022/sd-angular-core-forms-radio.mjs.map +1 -1
  297. package/fesm2022/sd-angular-core-forms-select.mjs +420 -453
  298. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  299. package/fesm2022/sd-angular-core-forms-switch.mjs +82 -109
  300. package/fesm2022/sd-angular-core-forms-switch.mjs.map +1 -1
  301. package/fesm2022/sd-angular-core-forms-textarea.mjs +199 -231
  302. package/fesm2022/sd-angular-core-forms-textarea.mjs.map +1 -1
  303. package/fesm2022/sd-angular-core-forms.mjs +4 -4
  304. package/fesm2022/sd-angular-core-handlers.mjs +10 -9
  305. package/fesm2022/sd-angular-core-handlers.mjs.map +1 -1
  306. package/fesm2022/sd-angular-core-i18n.mjs +2547 -0
  307. package/fesm2022/sd-angular-core-i18n.mjs.map +1 -0
  308. package/fesm2022/sd-angular-core-interceptors.mjs +37 -10
  309. package/fesm2022/sd-angular-core-interceptors.mjs.map +1 -1
  310. package/fesm2022/sd-angular-core-models.mjs +6 -0
  311. package/fesm2022/sd-angular-core-models.mjs.map +1 -0
  312. package/fesm2022/sd-angular-core-modules-auth.mjs +9 -9
  313. package/fesm2022/sd-angular-core-modules-authom.mjs +360 -0
  314. package/fesm2022/sd-angular-core-modules-authom.mjs.map +1 -0
  315. package/fesm2022/sd-angular-core-modules-keycloak.mjs +127 -0
  316. package/fesm2022/sd-angular-core-modules-keycloak.mjs.map +1 -0
  317. package/fesm2022/sd-angular-core-modules-layout.mjs +957 -516
  318. package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
  319. package/fesm2022/sd-angular-core-modules-permission.mjs +166 -80
  320. package/fesm2022/sd-angular-core-modules-permission.mjs.map +1 -1
  321. package/fesm2022/sd-angular-core-modules.mjs +2 -1
  322. package/fesm2022/sd-angular-core-modules.mjs.map +1 -1
  323. package/fesm2022/sd-angular-core-pipes.mjs +17 -18
  324. package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
  325. package/fesm2022/sd-angular-core-services-api.mjs +31 -51
  326. package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
  327. package/fesm2022/sd-angular-core-services-cache.mjs +3 -3
  328. package/fesm2022/sd-angular-core-services-confirm.mjs +28 -24
  329. package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
  330. package/fesm2022/sd-angular-core-services-docx.mjs +300 -0
  331. package/fesm2022/sd-angular-core-services-docx.mjs.map +1 -0
  332. package/fesm2022/sd-angular-core-services-excel.mjs +33 -27
  333. package/fesm2022/sd-angular-core-services-excel.mjs.map +1 -1
  334. package/fesm2022/sd-angular-core-services-license.mjs +3 -3
  335. package/fesm2022/sd-angular-core-services-loading.mjs +3 -3
  336. package/fesm2022/sd-angular-core-services-notify.mjs +24 -24
  337. package/fesm2022/sd-angular-core-services-notify.mjs.map +1 -1
  338. package/fesm2022/sd-angular-core-services-storage.mjs +8 -3
  339. package/fesm2022/sd-angular-core-services-storage.mjs.map +1 -1
  340. package/fesm2022/sd-angular-core-services.mjs +1 -0
  341. package/fesm2022/sd-angular-core-services.mjs.map +1 -1
  342. package/fesm2022/sd-angular-core-utilities-data-state.mjs +38 -0
  343. package/fesm2022/sd-angular-core-utilities-data-state.mjs.map +1 -0
  344. package/fesm2022/sd-angular-core-utilities-extensions.mjs +89 -856
  345. package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
  346. package/fesm2022/sd-angular-core-utilities-models.mjs +41 -113
  347. package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
  348. package/fesm2022/sd-angular-core-utilities.mjs +1 -0
  349. package/fesm2022/sd-angular-core-utilities.mjs.map +1 -1
  350. package/fesm2022/sd-angular-core.mjs +0 -1
  351. package/fesm2022/sd-angular-core.mjs.map +1 -1
  352. package/forms/autocomplete/src/autocomplete.component.d.ts +62 -58
  353. package/forms/checkbox/src/checkbox.component.d.ts +18 -20
  354. package/forms/chip/src/chip.component.d.ts +45 -42
  355. package/forms/chip-calendar/src/chip-calendar.component.d.ts +47 -42
  356. package/forms/date/src/date.component.d.ts +57 -49
  357. package/forms/date-range/src/date-range.component.d.ts +42 -38
  358. package/forms/datetime/src/datetime.component.d.ts +69 -53
  359. package/forms/datetime/src/popup/sd-datetime-picker.component.d.ts +37 -0
  360. package/forms/datetime/src/popup/sd-time-spinner.component.d.ts +41 -0
  361. package/forms/directives/src/item-def.directive.d.ts +10 -5
  362. package/forms/directives/src/label-def.directive.d.ts +3 -2
  363. package/forms/directives/src/suffix-def.directive.d.ts +3 -2
  364. package/forms/directives/src/view-def.directive.d.ts +9 -9
  365. package/forms/input/src/input.component.d.ts +64 -59
  366. package/forms/input-number/src/input-number.component.d.ts +60 -57
  367. package/forms/models/index.d.ts +1 -0
  368. package/forms/models/src/form-control-state.d.ts +23 -0
  369. package/forms/models/src/sd-custom-validator.model.d.ts +13 -1
  370. package/forms/radio/src/radio.component.d.ts +31 -34
  371. package/forms/select/src/select.component.d.ts +78 -66
  372. package/forms/switch/src/switch.component.d.ts +20 -23
  373. package/forms/textarea/src/textarea.component.d.ts +49 -45
  374. package/i18n/index.d.ts +5 -0
  375. package/i18n/src/en.d.ts +442 -0
  376. package/i18n/src/i18n.messages.d.ts +2 -0
  377. package/i18n/src/i18n.pipe.d.ts +9 -0
  378. package/i18n/src/i18n.service.d.ts +14 -0
  379. package/i18n/src/i18n.token.d.ts +1 -0
  380. package/i18n/src/i18n.types.d.ts +31 -0
  381. package/i18n/src/ja.d.ts +2 -0
  382. package/i18n/src/ko.d.ts +2 -0
  383. package/i18n/src/vi.d.ts +2 -0
  384. package/i18n/src/zh.d.ts +2 -0
  385. package/interceptors/index.d.ts +1 -0
  386. package/interceptors/unauthorized/unauthorized.interceptor.d.ts +12 -0
  387. package/models/index.d.ts +1 -0
  388. package/models/src/language.model.d.ts +2 -0
  389. package/modules/authom/authom.configuration.d.ts +17 -0
  390. package/modules/authom/authom.interceptor.d.ts +3 -0
  391. package/modules/authom/authom.module.d.ts +16 -0
  392. package/modules/authom/authom.service.d.ts +32 -0
  393. package/modules/authom/index.d.ts +35 -0
  394. package/modules/index.d.ts +2 -1
  395. package/modules/keycloak/index.d.ts +4 -0
  396. package/modules/keycloak/keycloak.configuration.d.ts +11 -0
  397. package/modules/keycloak/keycloak.interceptor.d.ts +2 -0
  398. package/modules/keycloak/keycloak.module.d.ts +18 -0
  399. package/modules/keycloak/keycloak.service.d.ts +14 -0
  400. package/modules/layout/components/index.d.ts +2 -0
  401. package/modules/layout/components/layout-main/layout-main.component.d.ts +8 -12
  402. package/modules/layout/components/page/page.component.d.ts +5 -7
  403. package/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.d.ts +35 -0
  404. package/modules/layout/components/sidebar-mobile-v1/components/user/user.component.d.ts +24 -0
  405. package/modules/layout/components/sidebar-mobile-v1/main.component.d.ts +21 -0
  406. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +29 -29
  407. package/modules/layout/components/sidebar-v1/components/user/user.component.d.ts +11 -17
  408. package/modules/layout/components/sidebar-v1/main.component.d.ts +14 -14
  409. package/modules/layout/configurations/layout.configuration.d.ts +54 -3
  410. package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +3 -8
  411. package/modules/layout/modules/home/components/home-page/home-page.component.d.ts +27 -5
  412. package/modules/layout/modules/not-found/pages/root/root.component.d.ts +3 -8
  413. package/modules/layout/pipes/high-light-search.pipe.d.ts +1 -1
  414. package/modules/layout/services/index.d.ts +1 -0
  415. package/modules/layout/services/layout.service.d.ts +10 -0
  416. package/modules/layout/services/menu/menu.model.d.ts +4 -1
  417. package/modules/layout/services/storage/storage.service.d.ts +2 -3
  418. package/modules/permission/src/configurations/permission.configuration.d.ts +56 -2
  419. package/modules/permission/src/directives/permission.directive.d.ts +5 -8
  420. package/modules/permission/src/guards/permission.guard.d.ts +2 -1
  421. package/modules/permission/src/services/permission.service.d.ts +6 -9
  422. package/package.json +126 -77
  423. package/pipes/src/format-number.pipe.d.ts +1 -1
  424. package/public-api.d.ts +0 -1
  425. package/sd-angular-core-19.0.0-beta.101.tgz +0 -0
  426. package/services/api/src/api.model.d.ts +7 -1
  427. package/services/api/src/api.service.d.ts +3 -7
  428. package/services/api/src/interceptors/api.interceptor.d.ts +2 -4
  429. package/services/confirm/src/lib/confirm.service.d.ts +5 -0
  430. package/services/docx/index.d.ts +1 -0
  431. package/services/docx/src/lib/docx.model.d.ts +9 -0
  432. package/services/docx/src/lib/docx.service.d.ts +15 -0
  433. package/services/docx/src/lib/pandoc-core.d.ts +11 -0
  434. package/services/docx/src/public-api.d.ts +2 -0
  435. package/services/index.d.ts +1 -0
  436. package/services/notify/index.d.ts +1 -0
  437. package/services/notify/src/components/toast/toast.component.d.ts +3 -3
  438. package/services/notify/src/components/toast-container.component.d.ts +3 -4
  439. package/services/storage/src/storage.model.d.ts +1 -0
  440. package/utilities/data-state/index.d.ts +1 -0
  441. package/utilities/data-state/src/data-state.d.ts +11 -0
  442. package/utilities/extensions/src/array.extension.d.ts +1 -7
  443. package/utilities/extensions/src/color.extension.d.ts +5 -20
  444. package/utilities/extensions/src/date.extension.d.ts +1 -18
  445. package/utilities/extensions/src/number.extension.d.ts +1 -10
  446. package/utilities/extensions/src/string.extension.d.ts +33 -2
  447. package/utilities/extensions/src/utility.extension.d.ts +7 -0
  448. package/utilities/index.d.ts +1 -0
  449. package/utilities/models/index.d.ts +3 -0
  450. package/utilities/models/src/color.model.d.ts +4 -1
  451. package/utilities/models/src/empty.model.d.ts +3 -0
  452. package/utilities/models/src/filter.model.d.ts +12 -11
  453. package/utilities/models/src/icon.model.d.ts +2 -0
  454. package/utilities/models/src/maybe-async.model.d.ts +10 -4
  455. package/utilities/models/src/nested-key-of.model.d.ts +4 -0
  456. package/utilities/models/src/operator.model.d.ts +9 -4
  457. package/utilities/models/src/order.model.d.ts +4 -4
  458. package/utilities/models/src/paging.model.d.ts +8 -15
  459. package/utilities/models/src/pattern.model.d.ts +14 -1
  460. package/utilities/models/src/size.model.d.ts +4 -1
  461. package/utilities/models/src/unwrap-signal.model.d.ts +6 -0
  462. package/assets/img/1D UX System.zip +0 -0
  463. package/assets/img/Popup/Vector.png +0 -0
  464. package/assets/img/empty.png +0 -0
  465. package/assets/img/empty.svg +0 -27
  466. package/assets/img/file-types/eps/001-file.eps +0 -143
  467. package/assets/img/file-types/eps/002-file-1.eps +0 -136
  468. package/assets/img/file-types/eps/003-file-2.eps +0 -130
  469. package/assets/img/file-types/eps/004-file-3.eps +0 -127
  470. package/assets/img/file-types/eps/005-file-4.eps +0 -120
  471. package/assets/img/file-types/eps/006-file-5.eps +0 -133
  472. package/assets/img/file-types/eps/007-file-6.eps +0 -133
  473. package/assets/img/file-types/eps/008-file-7.eps +0 -144
  474. package/assets/img/file-types/eps/009-file-8.eps +0 -150
  475. package/assets/img/file-types/eps/010-file-9.eps +0 -155
  476. package/assets/img/file-types/eps/011-file-10.eps +0 -124
  477. package/assets/img/file-types/eps/012-file-11.eps +0 -147
  478. package/assets/img/file-types/eps/013-file-12.eps +0 -125
  479. package/assets/img/file-types/eps/014-file-13.eps +0 -129
  480. package/assets/img/file-types/eps/015-file-14.eps +0 -143
  481. package/assets/img/file-types/eps/016-file-15.eps +0 -130
  482. package/assets/img/file-types/eps/017-file-16.eps +0 -197
  483. package/assets/img/file-types/eps/018-file-17.eps +0 -146
  484. package/assets/img/file-types/eps/019-file-18.eps +0 -131
  485. package/assets/img/file-types/eps/020-file-19.eps +0 -137
  486. package/assets/img/file-types/eps/021-file-20.eps +0 -134
  487. package/assets/img/file-types/eps/022-file-21.eps +0 -130
  488. package/assets/img/file-types/eps/023-file-22.eps +0 -161
  489. package/assets/img/file-types/eps/024-file-23.eps +0 -144
  490. package/assets/img/file-types/eps/025-file-24.eps +0 -164
  491. package/assets/img/file-types/eps/026-file-25.eps +0 -135
  492. package/assets/img/file-types/eps/027-file-26.eps +0 -124
  493. package/assets/img/file-types/eps/028-file-27.eps +0 -120
  494. package/assets/img/file-types/eps/029-file-28.eps +0 -141
  495. package/assets/img/file-types/eps/030-file-29.eps +0 -130
  496. package/assets/img/file-types/eps/031-file-30.eps +0 -157
  497. package/assets/img/file-types/eps/032-file-31.eps +0 -139
  498. package/assets/img/file-types/eps/033-file-32.eps +0 -139
  499. package/assets/img/file-types/eps/034-file-33.eps +0 -189
  500. package/assets/img/file-types/eps/035-file-34.eps +0 -162
  501. package/assets/img/file-types/eps/036-file-35.eps +0 -142
  502. package/assets/img/file-types/eps/037-file-36.eps +0 -123
  503. package/assets/img/file-types/eps/038-file-37.eps +0 -127
  504. package/assets/img/file-types/eps/039-file-38.eps +0 -146
  505. package/assets/img/file-types/eps/040-file-39.eps +0 -126
  506. package/assets/img/file-types/eps/041-file-40.eps +0 -117
  507. package/assets/img/file-types/eps/042-file-41.eps +0 -156
  508. package/assets/img/file-types/eps/043-file-42.eps +0 -118
  509. package/assets/img/file-types/eps/044-file-43.eps +0 -172
  510. package/assets/img/file-types/eps/045-file-44.eps +0 -201
  511. package/assets/img/file-types/eps/046-file-45.eps +0 -94
  512. package/assets/img/file-types/eps/047-file-46.eps +0 -176
  513. package/assets/img/file-types/eps/048-file-47.eps +0 -238
  514. package/assets/img/file-types/eps/049-file-48.eps +0 -187
  515. package/assets/img/file-types/eps/050-file-49.eps +0 -137
  516. package/assets/img/file-types/license/license.pdf +0 -0
  517. package/assets/img/file-types/png/3ds.png +0 -0
  518. package/assets/img/file-types/png/ai.png +0 -0
  519. package/assets/img/file-types/png/asp.png +0 -0
  520. package/assets/img/file-types/png/avi.png +0 -0
  521. package/assets/img/file-types/png/bin.png +0 -0
  522. package/assets/img/file-types/png/com.png +0 -0
  523. package/assets/img/file-types/png/css.png +0 -0
  524. package/assets/img/file-types/png/csv.png +0 -0
  525. package/assets/img/file-types/png/dbf.png +0 -0
  526. package/assets/img/file-types/png/dll.png +0 -0
  527. package/assets/img/file-types/png/doc.png +0 -0
  528. package/assets/img/file-types/png/docx.png +0 -0
  529. package/assets/img/file-types/png/dwg.png +0 -0
  530. package/assets/img/file-types/png/eml.png +0 -0
  531. package/assets/img/file-types/png/eps.png +0 -0
  532. package/assets/img/file-types/png/exe.png +0 -0
  533. package/assets/img/file-types/png/file.png +0 -0
  534. package/assets/img/file-types/png/fla.png +0 -0
  535. package/assets/img/file-types/png/gif.png +0 -0
  536. package/assets/img/file-types/png/htm.png +0 -0
  537. package/assets/img/file-types/png/ico.png +0 -0
  538. package/assets/img/file-types/png/ini.png +0 -0
  539. package/assets/img/file-types/png/iso.png +0 -0
  540. package/assets/img/file-types/png/jar.png +0 -0
  541. package/assets/img/file-types/png/jpg.png +0 -0
  542. package/assets/img/file-types/png/js.png +0 -0
  543. package/assets/img/file-types/png/mkv.png +0 -0
  544. package/assets/img/file-types/png/mov.png +0 -0
  545. package/assets/img/file-types/png/mp3.png +0 -0
  546. package/assets/img/file-types/png/mp4.png +0 -0
  547. package/assets/img/file-types/png/nfo.png +0 -0
  548. package/assets/img/file-types/png/obj.png +0 -0
  549. package/assets/img/file-types/png/otf.png +0 -0
  550. package/assets/img/file-types/png/pdf.png +0 -0
  551. package/assets/img/file-types/png/pkg.png +0 -0
  552. package/assets/img/file-types/png/png.png +0 -0
  553. package/assets/img/file-types/png/ppt.png +0 -0
  554. package/assets/img/file-types/png/pptx.png +0 -0
  555. package/assets/img/file-types/png/psd.png +0 -0
  556. package/assets/img/file-types/png/rtf.png +0 -0
  557. package/assets/img/file-types/png/svg.png +0 -0
  558. package/assets/img/file-types/png/tiff.png +0 -0
  559. package/assets/img/file-types/png/ttf.png +0 -0
  560. package/assets/img/file-types/png/txt.png +0 -0
  561. package/assets/img/file-types/png/vcf.png +0 -0
  562. package/assets/img/file-types/png/wav.png +0 -0
  563. package/assets/img/file-types/png/wmv.png +0 -0
  564. package/assets/img/file-types/png/xls.png +0 -0
  565. package/assets/img/file-types/png/xlsx.png +0 -0
  566. package/assets/img/file-types/png/xml.png +0 -0
  567. package/assets/img/file-types/png/zip.png +0 -0
  568. package/assets/img/file-types/psd/001-file.psd +0 -0
  569. package/assets/img/file-types/psd/002-file-1.psd +0 -0
  570. package/assets/img/file-types/psd/003-file-2.psd +0 -0
  571. package/assets/img/file-types/psd/004-file-3.psd +0 -0
  572. package/assets/img/file-types/psd/005-file-4.psd +0 -0
  573. package/assets/img/file-types/psd/006-file-5.psd +0 -0
  574. package/assets/img/file-types/psd/007-file-6.psd +0 -0
  575. package/assets/img/file-types/psd/008-file-7.psd +0 -0
  576. package/assets/img/file-types/psd/009-file-8.psd +0 -0
  577. package/assets/img/file-types/psd/010-file-9.psd +0 -0
  578. package/assets/img/file-types/psd/011-file-10.psd +0 -0
  579. package/assets/img/file-types/psd/012-file-11.psd +0 -0
  580. package/assets/img/file-types/psd/013-file-12.psd +0 -0
  581. package/assets/img/file-types/psd/014-file-13.psd +0 -0
  582. package/assets/img/file-types/psd/015-file-14.psd +0 -0
  583. package/assets/img/file-types/psd/016-file-15.psd +0 -0
  584. package/assets/img/file-types/psd/017-file-16.psd +0 -0
  585. package/assets/img/file-types/psd/018-file-17.psd +0 -0
  586. package/assets/img/file-types/psd/019-file-18.psd +0 -0
  587. package/assets/img/file-types/psd/020-file-19.psd +0 -0
  588. package/assets/img/file-types/psd/021-file-20.psd +0 -0
  589. package/assets/img/file-types/psd/022-file-21.psd +0 -0
  590. package/assets/img/file-types/psd/023-file-22.psd +0 -0
  591. package/assets/img/file-types/psd/024-file-23.psd +0 -0
  592. package/assets/img/file-types/psd/025-file-24.psd +0 -0
  593. package/assets/img/file-types/psd/026-file-25.psd +0 -0
  594. package/assets/img/file-types/psd/027-file-26.psd +0 -0
  595. package/assets/img/file-types/psd/028-file-27.psd +0 -0
  596. package/assets/img/file-types/psd/029-file-28.psd +0 -0
  597. package/assets/img/file-types/psd/030-file-29.psd +0 -0
  598. package/assets/img/file-types/psd/031-file-30.psd +0 -0
  599. package/assets/img/file-types/psd/032-file-31.psd +0 -0
  600. package/assets/img/file-types/psd/033-file-32.psd +0 -0
  601. package/assets/img/file-types/psd/034-file-33.psd +0 -0
  602. package/assets/img/file-types/psd/035-file-34.psd +0 -0
  603. package/assets/img/file-types/psd/036-file-35.psd +0 -0
  604. package/assets/img/file-types/psd/037-file-36.psd +0 -0
  605. package/assets/img/file-types/psd/038-file-37.psd +0 -0
  606. package/assets/img/file-types/psd/039-file-38.psd +0 -0
  607. package/assets/img/file-types/psd/040-file-39.psd +0 -0
  608. package/assets/img/file-types/psd/041-file-40.psd +0 -0
  609. package/assets/img/file-types/psd/042-file-41.psd +0 -0
  610. package/assets/img/file-types/psd/043-file-42.psd +0 -0
  611. package/assets/img/file-types/psd/044-file-43.psd +0 -0
  612. package/assets/img/file-types/psd/045-file-44.psd +0 -0
  613. package/assets/img/file-types/psd/046-file-45.psd +0 -0
  614. package/assets/img/file-types/psd/047-file-46.psd +0 -0
  615. package/assets/img/file-types/psd/048-file-47.psd +0 -0
  616. package/assets/img/file-types/psd/049-file-48.psd +0 -0
  617. package/assets/img/file-types/psd/050-file-49.psd +0 -0
  618. package/assets/img/file-types/svg/001-file.svg +0 -1
  619. package/assets/img/file-types/svg/002-file-1.svg +0 -1
  620. package/assets/img/file-types/svg/003-file-2.svg +0 -1
  621. package/assets/img/file-types/svg/004-file-3.svg +0 -1
  622. package/assets/img/file-types/svg/005-file-4.svg +0 -1
  623. package/assets/img/file-types/svg/006-file-5.svg +0 -1
  624. package/assets/img/file-types/svg/007-file-6.svg +0 -1
  625. package/assets/img/file-types/svg/008-file-7.svg +0 -1
  626. package/assets/img/file-types/svg/009-file-8.svg +0 -1
  627. package/assets/img/file-types/svg/010-file-9.svg +0 -1
  628. package/assets/img/file-types/svg/011-file-10.svg +0 -1
  629. package/assets/img/file-types/svg/012-file-11.svg +0 -1
  630. package/assets/img/file-types/svg/013-file-12.svg +0 -1
  631. package/assets/img/file-types/svg/014-file-13.svg +0 -1
  632. package/assets/img/file-types/svg/015-file-14.svg +0 -1
  633. package/assets/img/file-types/svg/016-file-15.svg +0 -1
  634. package/assets/img/file-types/svg/017-file-16.svg +0 -1
  635. package/assets/img/file-types/svg/018-file-17.svg +0 -1
  636. package/assets/img/file-types/svg/019-file-18.svg +0 -1
  637. package/assets/img/file-types/svg/020-file-19.svg +0 -1
  638. package/assets/img/file-types/svg/021-file-20.svg +0 -1
  639. package/assets/img/file-types/svg/022-file-21.svg +0 -1
  640. package/assets/img/file-types/svg/023-file-22.svg +0 -1
  641. package/assets/img/file-types/svg/024-file-23.svg +0 -1
  642. package/assets/img/file-types/svg/025-file-24.svg +0 -1
  643. package/assets/img/file-types/svg/026-file-25.svg +0 -1
  644. package/assets/img/file-types/svg/027-file-26.svg +0 -1
  645. package/assets/img/file-types/svg/028-file-27.svg +0 -1
  646. package/assets/img/file-types/svg/029-file-28.svg +0 -1
  647. package/assets/img/file-types/svg/030-file-29.svg +0 -1
  648. package/assets/img/file-types/svg/031-file-30.svg +0 -1
  649. package/assets/img/file-types/svg/032-file-31.svg +0 -1
  650. package/assets/img/file-types/svg/033-file-32.svg +0 -1
  651. package/assets/img/file-types/svg/034-file-33.svg +0 -1
  652. package/assets/img/file-types/svg/035-file-34.svg +0 -1
  653. package/assets/img/file-types/svg/036-file-35.svg +0 -1
  654. package/assets/img/file-types/svg/037-file-36.svg +0 -1
  655. package/assets/img/file-types/svg/038-file-37.svg +0 -1
  656. package/assets/img/file-types/svg/039-file-38.svg +0 -1
  657. package/assets/img/file-types/svg/040-file-39.svg +0 -1
  658. package/assets/img/file-types/svg/041-file-40.svg +0 -1
  659. package/assets/img/file-types/svg/042-file-41.svg +0 -1
  660. package/assets/img/file-types/svg/043-file-42.svg +0 -1
  661. package/assets/img/file-types/svg/044-file-43.svg +0 -1
  662. package/assets/img/file-types/svg/045-file-44.svg +0 -1
  663. package/assets/img/file-types/svg/046-file-45.svg +0 -1
  664. package/assets/img/file-types/svg/047-file-46.svg +0 -1
  665. package/assets/img/file-types/svg/048-file-47.svg +0 -1
  666. package/assets/img/file-types/svg/049-file-48.svg +0 -1
  667. package/assets/img/file-types/svg/050-file-49.svg +0 -1
  668. package/assets/img/plus-search-zoom-white.png +0 -0
  669. package/assets/scss/core/cursor.scss +0 -3
  670. package/assets/scss/core/elevation.scss +0 -57
  671. package/assets/scss/core/print.scss +0 -47
  672. package/assets/scss/core/typography.scss +0 -121
  673. package/components/anchor/src/components/anchor-horizontal/anchor-list/anchor-list.component.d.ts +0 -16
  674. package/components/anchor/src/components/anchor-vertical/anchor-list/anchor-list.component.d.ts +0 -17
  675. package/components/anchor/src/components/main/main.component.d.ts +0 -24
  676. package/components/anchor/src/models/anchor.model.d.ts +0 -5
  677. package/components/anchor/src/services/anchor.service.d.ts +0 -12
  678. package/components/anchor/src/services/index.d.ts +0 -1
  679. package/components/anchor-v2/index.d.ts +0 -1
  680. package/components/anchor-v2/src/components/anchor-item-v2/anchor-item-v2.component.d.ts +0 -12
  681. package/components/anchor-v2/src/components/anchor-v2/anchor-v2.component.d.ts +0 -25
  682. package/components/anchor-v2/src/components/anchor-vertical-v2/anchor-vertical-list-v2.component.d.ts +0 -17
  683. package/components/anchor-v2/src/components/index.d.ts +0 -2
  684. package/components/anchor-v2/src/models/index.d.ts +0 -1
  685. package/components/anchor-v2/src/models/sd-anchor-v2.model.d.ts +0 -7
  686. package/components/document-builder/src/plugins/comment/comment.plugin.d.ts +0 -4
  687. package/components/document-builder/src/plugins/table-fit/table-fit.plugin.d.ts +0 -4
  688. package/components/modal/src/modal/modal.component.d.ts +0 -31
  689. package/components/table/src/components/column-filter/column-filter.component.d.ts +0 -40
  690. package/components/table/src/components/desktop-cell-view/desktop-cell-view.component.d.ts +0 -14
  691. package/components/table/src/components/desktop-command/desktop-command.component.d.ts +0 -15
  692. package/components/table/src/components/external-filter/external-filter.component.d.ts +0 -36
  693. package/components/table/src/pipes/command-disable.pipe.d.ts +0 -9
  694. package/components/table/src/pipes/command-filter.pipe.d.ts +0 -25
  695. package/components/table/src/pipes/command-title.pipe.d.ts +0 -9
  696. package/components/workflow/src/components/form-builder/form-builder.component.d.ts +0 -77
  697. package/components/workflow/src/configurations/index.d.ts +0 -1
  698. package/fesm2022/sd-angular-core-components-anchor-v2.mjs +0 -226
  699. package/fesm2022/sd-angular-core-components-anchor-v2.mjs.map +0 -1
  700. package/fesm2022/sd-angular-core-components-workflow.mjs +0 -6400
  701. package/fesm2022/sd-angular-core-components-workflow.mjs.map +0 -1
  702. package/fesm2022/sd-angular-core-guards-permission.mjs +0 -155
  703. package/fesm2022/sd-angular-core-guards-permission.mjs.map +0 -1
  704. package/fesm2022/sd-angular-core-guards.mjs +0 -6
  705. package/fesm2022/sd-angular-core-guards.mjs.map +0 -1
  706. package/fesm2022/sd-angular-core-modules-oidc.mjs +0 -127
  707. package/fesm2022/sd-angular-core-modules-oidc.mjs.map +0 -1
  708. package/fesm2022/sd-angular-core-services-firebase.mjs +0 -38
  709. package/fesm2022/sd-angular-core-services-firebase.mjs.map +0 -1
  710. package/guards/index.d.ts +0 -1
  711. package/guards/permission/index.d.ts +0 -4
  712. package/guards/permission/src/configurations/index.d.ts +0 -1
  713. package/guards/permission/src/configurations/permission.configuration.d.ts +0 -8
  714. package/guards/permission/src/directives/index.d.ts +0 -1
  715. package/guards/permission/src/directives/permission.directive.d.ts +0 -12
  716. package/guards/permission/src/guards/index.d.ts +0 -1
  717. package/guards/permission/src/guards/permission.guard.d.ts +0 -13
  718. package/guards/permission/src/services/index.d.ts +0 -1
  719. package/guards/permission/src/services/permission.service.d.ts +0 -15
  720. package/modules/oidc/dynamic-sts.loader.d.ts +0 -11
  721. package/modules/oidc/index.d.ts +0 -2
  722. package/modules/oidc/oidc.configuration.d.ts +0 -11
  723. package/modules/oidc/oidc.module.d.ts +0 -14
  724. package/sd-angular-core-19.0.0-beta.10.tgz +0 -0
  725. package/services/firebase/index.d.ts +0 -2
  726. package/services/firebase/src/firebase.model.d.ts +0 -8
  727. package/services/firebase/src/firebase.service.d.ts +0 -14
  728. /package/components/{anchor-v2 → anchor}/src/index.d.ts +0 -0
  729. /package/components/{workflow → form-generic}/index.d.ts +0 -0
  730. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-expression/attribute-expression.component.d.ts +0 -0
  731. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-input/attribute-input.component.d.ts +0 -0
  732. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-input-number/attribute-input-number.component.d.ts +0 -0
  733. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-parameter/attribute-parameter.component.d.ts +0 -0
  734. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-select/attribute-select.component.d.ts +0 -0
  735. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-selection/attribute-selection.component.d.ts +0 -0
  736. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-selection/components/build-queries/build-queries.component.d.ts +0 -0
  737. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-selection/components/build-variables/build-variables.component.d.ts +0 -0
  738. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-switch/attribute-switch.component.d.ts +0 -0
  739. /package/components/{workflow → form-generic}/src/components/form-builder/components/attribute-textarea/attribute-textarea.component.d.ts +0 -0
  740. /package/components/{workflow → form-generic}/src/components/form-builder/components/checkbox/attribute/checkbox-attribute.component.d.ts +0 -0
  741. /package/components/{workflow → form-generic}/src/components/form-builder/components/checkbox/control/checkbox-control.component.d.ts +0 -0
  742. /package/components/{workflow → form-generic}/src/components/form-builder/components/checkbox/index.d.ts +0 -0
  743. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-calendar/attribute/chip-calendar-attribute.component.d.ts +0 -0
  744. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-calendar/control/chip-calendar-control.component.d.ts +0 -0
  745. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-calendar/index.d.ts +0 -0
  746. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-string/attribute/chip-string-attribute.component.d.ts +0 -0
  747. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-string/control/chip-string-control.component.d.ts +0 -0
  748. /package/components/{workflow → form-generic}/src/components/form-builder/components/chip-string/index.d.ts +0 -0
  749. /package/components/{workflow → form-generic}/src/components/form-builder/components/datetime/attribute/datetime-attribute.component.d.ts +0 -0
  750. /package/components/{workflow → form-generic}/src/components/form-builder/components/datetime/control/datetime-control.component.d.ts +0 -0
  751. /package/components/{workflow → form-generic}/src/components/form-builder/components/datetime/index.d.ts +0 -0
  752. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/attribute/components/build-queries/build-queries.component.d.ts +0 -0
  753. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/attribute/html-attribute.component.d.ts +0 -0
  754. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/control/html-control.component.d.ts +0 -0
  755. /package/components/{workflow → form-generic}/src/components/form-builder/components/html/index.d.ts +0 -0
  756. /package/components/{workflow → form-generic}/src/components/form-builder/components/number/attribute/number-attribute.component.d.ts +0 -0
  757. /package/components/{workflow → form-generic}/src/components/form-builder/components/number/control/number-control.component.d.ts +0 -0
  758. /package/components/{workflow → form-generic}/src/components/form-builder/components/number/index.d.ts +0 -0
  759. /package/components/{workflow → form-generic}/src/components/form-builder/components/radio/attribute/radio-attribute.component.d.ts +0 -0
  760. /package/components/{workflow → form-generic}/src/components/form-builder/components/radio/control/radio-control.component.d.ts +0 -0
  761. /package/components/{workflow → form-generic}/src/components/form-builder/components/radio/index.d.ts +0 -0
  762. /package/components/{workflow → form-generic}/src/components/form-builder/components/select/attribute/select-attribute.component.d.ts +0 -0
  763. /package/components/{workflow → form-generic}/src/components/form-builder/components/select/control/select-control.component.d.ts +0 -0
  764. /package/components/{workflow → form-generic}/src/components/form-builder/components/select/index.d.ts +0 -0
  765. /package/components/{workflow → form-generic}/src/components/form-builder/components/table/attribute/table-attribute.component.d.ts +0 -0
  766. /package/components/{workflow → form-generic}/src/components/form-builder/components/table/index.d.ts +0 -0
  767. /package/components/{workflow → form-generic}/src/components/form-builder/components/textarea/attribute/textarea-attribute.component.d.ts +0 -0
  768. /package/components/{workflow → form-generic}/src/components/form-builder/components/textarea/control/textarea-control.component.d.ts +0 -0
  769. /package/components/{workflow → form-generic}/src/components/form-builder/components/textarea/index.d.ts +0 -0
  770. /package/components/{workflow → form-generic}/src/components/form-builder/components/textfield/attribute/textfield-attribute.component.d.ts +0 -0
  771. /package/components/{workflow → form-generic}/src/components/form-builder/components/textfield/control/textfield-control.component.d.ts +0 -0
  772. /package/components/{workflow → form-generic}/src/components/form-builder/components/textfield/index.d.ts +0 -0
  773. /package/components/{workflow → form-generic}/src/components/form-builder/components/upload/attribute/upload-attribute.component.d.ts +0 -0
  774. /package/components/{workflow → form-generic}/src/components/form-builder/components/upload/control/upload-control.component.d.ts +0 -0
  775. /package/components/{workflow → form-generic}/src/components/form-builder/components/upload/index.d.ts +0 -0
  776. /package/components/{workflow → form-generic}/src/components/form-builder/services/builder.service.d.ts +0 -0
  777. /package/components/{workflow → form-generic}/src/components/form-builder/services/index.d.ts +0 -0
  778. /package/components/{workflow → form-generic}/src/components/form-render/components/index.d.ts +0 -0
  779. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/chip-calendar/chip-calendar.component.d.ts +0 -0
  780. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/chip-string/chip-string.component.d.ts +0 -0
  781. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/datetime/datetime.component.d.ts +0 -0
  782. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/html/html.component.d.ts +0 -0
  783. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/index.d.ts +0 -0
  784. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/number/number.component.d.ts +0 -0
  785. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/radio/radio.component.d.ts +0 -0
  786. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/select/select.component.d.ts +0 -0
  787. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/table/table.component.d.ts +0 -0
  788. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/textarea/textarea.component.d.ts +0 -0
  789. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/textfield/textfield.component.d.ts +0 -0
  790. /package/components/{workflow → form-generic}/src/components/form-render/components/item/components/upload/upload.component.d.ts +0 -0
  791. /package/components/{workflow → form-generic}/src/components/form-render/components/item/item.component.d.ts +0 -0
  792. /package/components/{workflow → form-generic}/src/components/form-render/components/variable/variable.component.d.ts +0 -0
  793. /package/components/{workflow → form-generic}/src/components/index.d.ts +0 -0
  794. /package/components/{workflow → form-generic}/src/configurations/form.configuration.d.ts +0 -0
  795. /package/components/{workflow → form-generic}/src/models/form-generic-definition-html.model.d.ts +0 -0
  796. /package/components/{workflow → form-generic}/src/models/form-generic-definition-selection.model.d.ts +0 -0
  797. /package/components/{workflow → form-generic}/src/models/form-generic-definition-table.model.d.ts +0 -0
  798. /package/components/{workflow → form-generic}/src/models/form-generic-template.model.d.ts +0 -0
  799. /package/components/{workflow → form-generic}/src/models/form-generic-validation.model.d.ts +0 -0
  800. /package/components/{workflow → form-generic}/src/models/form-generic.model.d.ts +0 -0
  801. /package/components/{workflow → form-generic}/src/models/form-render/form-render-args.model.d.ts +0 -0
  802. /package/components/{workflow → form-generic}/src/models/form-render/form-render-entity.model.d.ts +0 -0
  803. /package/components/{workflow → form-generic}/src/models/form-render/index.d.ts +0 -0
  804. /package/components/{workflow → form-generic}/src/models/index.d.ts +0 -0
  805. /package/components/{workflow → form-generic}/src/pipes/component-viewed.pipe.d.ts +0 -0
  806. /package/components/{workflow → form-generic}/src/pipes/expression-feel.pipe.d.ts +0 -0
  807. /package/components/{workflow → form-generic}/src/pipes/expression-query.pipe.d.ts +0 -0
  808. /package/components/{workflow → form-generic}/src/pipes/expression-view.pipe.d.ts +0 -0
  809. /package/components/{workflow → form-generic}/src/pipes/hyperlink.pipe.d.ts +0 -0
  810. /package/components/{workflow → form-generic}/src/pipes/index.d.ts +0 -0
  811. /package/components/{workflow → form-generic}/src/pipes/when-expression.pipe.d.ts +0 -0
  812. /package/components/{workflow → form-generic}/src/services/form-render.service.d.ts +0 -0
  813. /package/components/{workflow → form-generic}/src/services/index.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sd-angular-core-components-query-bar.mjs","sources":["../../../projects/sd-angular/components/query-bar/src/query-bar.model.ts","../../../projects/sd-angular/components/query-bar/src/inline-value-chip.component.ts","../../../projects/sd-angular/components/query-bar/src/inline-value-chip.component.html","../../../projects/sd-angular/components/query-bar/src/query-bar.component.ts","../../../projects/sd-angular/components/query-bar/src/query-bar.component.html","../../../projects/sd-angular/components/query-bar/sd-angular-core-components-query-bar.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Signal } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { Filter, NestedKeyOf, Operator } from '@sd-angular/core/utilities/models';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Field definitions — discriminated union by `kind`, mirroring sd-table column\r\n// vocabulary. Each consumer declares its searchable fields via `SdQueryField`.\r\n// ---------------------------------------------------------------------------\r\n\r\nexport type SdQueryFieldKind =\r\n | 'string'\r\n | 'number'\r\n | 'boolean'\r\n | 'date'\r\n | 'datetime'\r\n | 'values'\r\n | 'lazy-values';\r\n\r\ninterface SdQueryFieldBase<T = any> {\r\n /** Dot-notation field path (matches `Filter.field`). */\r\n key: NestedKeyOf<T>;\r\n /** Human-readable label shown on chip + field picker. */\r\n label: string;\r\n /** Material icon name; falls back to `SD_QUERY_KIND_ICON[kind]` then `'tune'`. */\r\n icon?: string;\r\n /**\r\n * Controls the operator selector in the chip popover:\r\n * - omitted / `false` → **simple mode**: no operator dropdown; the chip always uses\r\n * `defaultOperator` (or the per-kind default). Use this for screens that don't need\r\n * operator choice.\r\n * - `true` → show the full operator set for the field's `kind`\r\n * (`SD_QUERY_OPERATORS_BY_KIND[kind]`).\r\n * - `Operator[]` → show exactly these operators.\r\n */\r\n operators?: boolean | Operator[];\r\n /**\r\n * Operator the chip starts with. Falls back to `SD_QUERY_DEFAULT_OPERATOR_BY_KIND[kind]`:\r\n * string→CONTAIN, number→EQUAL, values/lazy-values→IN, boolean→EQUAL, date/datetime→BETWEEN.\r\n */\r\n defaultOperator?: Operator;\r\n /** Field is offered in picker but not interactive (read-only badge in chip). */\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface SdQueryFieldString<T = any> extends SdQueryFieldBase<T> {\r\n kind: 'string';\r\n}\r\n\r\nexport interface SdQueryFieldNumber<T = any> extends SdQueryFieldBase<T> {\r\n kind: 'number';\r\n /** Bounds for the input control inside the chip popover. */\r\n min?: number;\r\n max?: number;\r\n /** Step for the number input. */\r\n step?: number;\r\n}\r\n\r\nexport interface SdQueryFieldBoolean<T = any> extends SdQueryFieldBase<T> {\r\n kind: 'boolean';\r\n /** Labels rendered for the true/false buttons. Default: \"Có\" / \"Không\". */\r\n trueLabel?: string;\r\n falseLabel?: string;\r\n}\r\n\r\nexport interface SdQueryFieldDate<T = any> extends SdQueryFieldBase<T> {\r\n kind: 'date' | 'datetime';\r\n /** Restrict the picker calendar to this range. */\r\n min?: Date | string;\r\n max?: Date | string;\r\n}\r\n\r\n/**\r\n * Statically-known options (sync array, signal, or one-shot promise).\r\n * Mirrors `SdTableColumnValues.option`.\r\n */\r\nexport interface SdQueryFieldValues<T = any, K = Record<string, any>> extends SdQueryFieldBase<T> {\r\n kind: 'values';\r\n option: {\r\n items: K[] | Signal<K[]> | (() => Promise<K[]>);\r\n valueField: NestedKeyOf<K>;\r\n displayField: NestedKeyOf<K>;\r\n };\r\n}\r\n\r\n/**\r\n * Server-backed options — searchable, paginated. Mirrors `SdTableColumnLazyValues.option`.\r\n * `search(req)` runs the live picker query; `views(values)` resolves chip-display labels for selected IDs.\r\n */\r\nexport interface SdQueryFieldLazyValues<T = any, K = Record<string, any>> extends SdQueryFieldBase<T> {\r\n kind: 'lazy-values';\r\n option: {\r\n search: (req: { search?: string; size?: number }) => Observable<K[]> | Promise<K[]>;\r\n views?: (values: any[]) => Promise<K[]>;\r\n valueField: NestedKeyOf<K>;\r\n displayField: NestedKeyOf<K>;\r\n };\r\n}\r\n\r\nexport type SdQueryField<T = any> =\r\n | SdQueryFieldString<T>\r\n | SdQueryFieldNumber<T>\r\n | SdQueryFieldBoolean<T>\r\n | SdQueryFieldDate<T>\r\n | SdQueryFieldValues<T>\r\n | SdQueryFieldLazyValues<T>;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Output model — `SdQuery` is the canonical payload emitted via `[(query)]`.\r\n// It composes the reusable `Filter[]` from utils plus query-bar-only metadata\r\n// (global logic, free-text search). Callers can also bind `[(filters)]` alone\r\n// when they don't need logic/search.\r\n// ---------------------------------------------------------------------------\r\n\r\nexport type SdQueryLogic = 'AND' | 'OR';\r\n\r\nexport interface SdQuery<T = any> {\r\n filters: Filter<T>[];\r\n /** Global connector between filters. Defaults to `'AND'`. */\r\n logic?: SdQueryLogic;\r\n /** Free-text search box (only present when `showSearch=true`). */\r\n search?: string;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Constants\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Full operator set per field kind — used when `operators: true`. */\r\nexport const SD_QUERY_OPERATORS_BY_KIND: Record<SdQueryFieldKind, Operator[]> = {\r\n string: ['CONTAIN', 'EQUAL', 'NOT_EQUAL', 'START_WITH', 'END_WITH', 'NULL', 'NOT_NULL'],\r\n number: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'GREATER_OR_EQUAL', 'LESS_THAN', 'LESS_OR_EQUAL', 'BETWEEN'],\r\n boolean: ['EQUAL'],\r\n date: ['EQUAL', 'BETWEEN', 'GREATER_THAN', 'LESS_THAN'],\r\n datetime: ['EQUAL', 'BETWEEN', 'GREATER_THAN', 'LESS_THAN'],\r\n values: ['IN', 'NOT_IN', 'NULL', 'NOT_NULL'],\r\n 'lazy-values': ['IN', 'NOT_IN', 'NULL', 'NOT_NULL'],\r\n};\r\n\r\n/** Default operator when a chip is created and `field.defaultOperator` is not set. */\r\nexport const SD_QUERY_DEFAULT_OPERATOR_BY_KIND: Record<SdQueryFieldKind, Operator> = {\r\n string: 'CONTAIN',\r\n number: 'EQUAL',\r\n boolean: 'EQUAL',\r\n date: 'BETWEEN',\r\n datetime: 'BETWEEN',\r\n values: 'IN',\r\n 'lazy-values': 'IN',\r\n};\r\n\r\n/** Vietnamese operator labels. Replace via i18n in the consuming template if needed. */\r\nexport const SD_QUERY_OPERATOR_LABEL: Record<Operator, string> = {\r\n EQUAL: 'là',\r\n NOT_EQUAL: 'không là',\r\n CONTAIN: 'chứa',\r\n NOT_CONTAIN: 'không chứa',\r\n START_WITH: 'bắt đầu bằng',\r\n NOT_START_WITH: 'không bắt đầu bằng',\r\n END_WITH: 'kết thúc bằng',\r\n NOT_END_WITH: 'không kết thúc bằng',\r\n IN: 'thuộc',\r\n NOT_IN: 'không thuộc',\r\n GREATER_THAN: '>',\r\n LESS_THAN: '<',\r\n GREATER_OR_EQUAL: '≥',\r\n LESS_OR_EQUAL: '≤',\r\n BETWEEN: 'trong khoảng',\r\n NULL: 'trống',\r\n NOT_NULL: 'có giá trị',\r\n};\r\n\r\n/** Icon fallback per field kind when `SdQueryField.icon` is not set. */\r\nexport const SD_QUERY_KIND_ICON: Record<SdQueryFieldKind, string> = {\r\n string: 'text_fields',\r\n number: 'tag',\r\n boolean: 'toggle_on',\r\n date: 'event',\r\n datetime: 'schedule',\r\n values: 'list',\r\n 'lazy-values': 'list',\r\n};\r\n\r\n/**\r\n * Resolves the icon shown on chips and in the field picker.\r\n * Priority: `field.icon` → `SD_QUERY_KIND_ICON[field.kind]` → `'tune'`.\r\n */\r\nexport function sdQueryFieldIcon(field: SdQueryField): string {\r\n return field.icon ?? SD_QUERY_KIND_ICON[field.kind] ?? 'tune';\r\n}\r\n\r\n/** Operators that carry no data — value section is hidden in chip popover. */\r\nexport const SD_QUERY_NO_DATA_OPERATORS: Operator[] = ['NULL', 'NOT_NULL'];\r\n\r\n/** Operators that carry an array payload — UI offers multi-select. */\r\nexport const SD_QUERY_MULTI_OPERATORS: Operator[] = ['IN', 'NOT_IN'];\r\n\r\n/** Picks the initial operator when a new chip is created for `field`. */\r\nexport function sdQueryDefaultOperator(field: SdQueryField): Operator {\r\n if (field.defaultOperator) return field.defaultOperator;\r\n return SD_QUERY_DEFAULT_OPERATOR_BY_KIND[field.kind];\r\n}\r\n\r\n/**\r\n * Operators offered in the chip popover for `field`:\r\n * - `operators === true` → full set for the kind\r\n * - `operators` is an array → that array (deduped against the kind set is the caller's job)\r\n * - otherwise (simple mode) → just the single default operator (no real choice)\r\n */\r\nexport function sdQueryAllowedOperators(field: SdQueryField): Operator[] {\r\n if (field.operators === true) return SD_QUERY_OPERATORS_BY_KIND[field.kind];\r\n if (Array.isArray(field.operators) && field.operators.length > 0) return field.operators;\r\n return [sdQueryDefaultOperator(field)];\r\n}\r\n\r\n/**\r\n * Whether the operator selector should be visible. Simple mode (operators omitted/false,\r\n * or an array with a single entry) hides the dropdown — the chip uses one fixed operator.\r\n */\r\nexport function sdQueryShowOperatorSelector(field: SdQueryField): boolean {\r\n return sdQueryAllowedOperators(field).length > 1;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n afterNextRender,\r\n computed,\r\n effect,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { SdOperator } from '@sd-angular/core/components/operator';\r\nimport { Operator } from '@sd-angular/core/utilities/models';\r\n\r\nimport {\r\n SD_QUERY_NO_DATA_OPERATORS,\r\n SdQueryField,\r\n sdQueryFieldIcon,\r\n} from './query-bar.model';\r\n\r\ntype Range = { from?: any; to?: any };\r\ntype ChipState = 'pending' | 'active' | 'focus' | 'error';\r\n\r\n/**\r\n * Seamless inline value chip for `string` / `number` fields (inline mode only).\r\n *\r\n * why: the pill itself IS the input — one border, no nested rectangle control. The\r\n * label + value + remove live in three flush segments inside a single pill envelope.\r\n * Mirrors refs/design_handoff_sd_query_bar \"Seamless string/number chip\" handoff.\r\n *\r\n * Commit model matches inline mode: edits write back via `(valueChange)` immediately\r\n * (host folds into `filters` without emitting); the bar's Search button stays the only\r\n * query trigger. Enter commits + blurs, Esc reverts + blurs, blur commits.\r\n */\r\n@Component({\r\n selector: 'sd-query-inline-value-chip',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, FormsModule, MatIconModule, SdOperator],\r\n templateUrl: './inline-value-chip.component.html',\r\n styleUrl: './inline-value-chip.component.scss',\r\n})\r\nexport class SdQueryInlineValueChip {\r\n /** Field this chip filters by — must be kind `string` or `number`. */\r\n readonly field = input.required<SdQueryField>();\r\n /** Active operator (drives BETWEEN dual-input + no-data hiding). */\r\n readonly operator = input<Operator>('CONTAIN');\r\n /** Current value: scalar for most operators, `{ from, to }` for BETWEEN. */\r\n readonly value = input<unknown>(null);\r\n readonly density = input<'compact' | 'comfortable'>('compact');\r\n /** Show the operator label as a small pill inside the label segment. */\r\n readonly showOperator = input(false);\r\n /** Prefix for the inner input's `data-autoid`. */\r\n readonly autoId = input<string | undefined>(undefined);\r\n /** Focus the first input on creation — used for the in-progress build chip. */\r\n readonly autofocus = input(false);\r\n\r\n /** Emitted on commit (Enter / blur) with the parsed next value. */\r\n readonly valueChange = output<unknown>();\r\n /** Emitted when the user clicks the × segment. */\r\n readonly remove = output<void>();\r\n\r\n private readonly firstInput = viewChild<ElementRef<HTMLInputElement>>('firstInput');\r\n\r\n readonly focused = signal(false);\r\n readonly hasError = signal(false);\r\n\r\n /** Editable drafts — single value, plus from/to for BETWEEN. Seeded from `value`. */\r\n readonly draft = signal('');\r\n readonly draftFrom = signal('');\r\n readonly draftTo = signal('');\r\n\r\n readonly isNumber = computed(() => this.field().kind === 'number');\r\n readonly isBetween = computed(() => this.operator() === 'BETWEEN');\r\n readonly isNoData = computed(() => SD_QUERY_NO_DATA_OPERATORS.includes(this.operator()));\r\n\r\n readonly icon = computed(() => sdQueryFieldIcon(this.field()));\r\n\r\n readonly ph = computed(() => (this.isNumber() ? 'giá trị' : 'nhập…'));\r\n readonly phFrom = computed(() => (this.isNumber() ? 'Từ' : 'từ…'));\r\n readonly phTo = computed(() => (this.isNumber() ? 'Đến' : 'đến…'));\r\n\r\n readonly hasValue = computed(() => {\r\n if (this.isNoData()) return true;\r\n const v = this.value();\r\n if (this.isBetween()) {\r\n const r = (v ?? {}) as Range;\r\n return (r.from != null && r.from !== '') || (r.to != null && r.to !== '');\r\n }\r\n return v != null && v !== '';\r\n });\r\n\r\n readonly state = computed<ChipState>(() => {\r\n if (this.hasError()) return 'error';\r\n if (this.focused()) return 'focus';\r\n return this.hasValue() ? 'active' : 'pending';\r\n });\r\n\r\n constructor() {\r\n // Reseed drafts whenever the bound value / operator / kind changes. While the user\r\n // types, none of those change (commit is on blur), so this never clobbers an edit.\r\n effect(() => {\r\n const v = this.value();\r\n if (this.isBetween()) {\r\n const r = (v ?? {}) as Range;\r\n this.draftFrom.set(this.#format(r.from));\r\n this.draftTo.set(this.#format(r.to));\r\n } else {\r\n this.draft.set(this.#format(v));\r\n }\r\n });\r\n\r\n // Build chip lands focused so the user types straight away (no rectangle, no extra click).\r\n afterNextRender(() => {\r\n if (this.autofocus()) this.firstInput()?.nativeElement.focus();\r\n });\r\n }\r\n\r\n /**\r\n * Width in chars — hugs the current value; falls back to the placeholder width only when\r\n * empty. why: using placeholder.length unconditionally left a long trailing gap before the\r\n * × for short values (e.g. a 1-digit number under the 'giá trị' placeholder).\r\n */\r\n sizeFor(text: string, placeholder: string): number {\r\n const base = text && text.length > 0 ? text.length : placeholder.length;\r\n return Math.max(base, 2);\r\n }\r\n\r\n /** Click anywhere in the pill (except × or an input) focuses the first input. */\r\n focusFromShell(ev: Event): void {\r\n const target = ev.target as HTMLElement;\r\n if (target.closest('.c-seamless__x') || target.closest('input')) return;\r\n this.firstInput()?.nativeElement.focus();\r\n }\r\n\r\n onFocus(): void {\r\n this.focused.set(true);\r\n }\r\n\r\n /** Commit a single-value field (string / number, non-BETWEEN). */\r\n commitSingle(): void {\r\n this.focused.set(false);\r\n const parsed = this.#parse(this.draft());\r\n if (!parsed.ok) {\r\n this.hasError.set(true);\r\n return;\r\n }\r\n this.hasError.set(false);\r\n this.valueChange.emit(parsed.value);\r\n }\r\n\r\n /** Commit a BETWEEN range — both ends parsed, emitted as `{ from, to }`. */\r\n commitRange(): void {\r\n this.focused.set(false);\r\n const from = this.#parse(this.draftFrom());\r\n const to = this.#parse(this.draftTo());\r\n if (!from.ok || !to.ok) {\r\n this.hasError.set(true);\r\n return;\r\n }\r\n this.hasError.set(false);\r\n this.valueChange.emit({ from: from.value, to: to.value });\r\n }\r\n\r\n /** Esc — revert drafts to the committed value and blur without emitting. */\r\n revertAndBlur(input: HTMLInputElement): void {\r\n const v = this.value();\r\n if (this.isBetween()) {\r\n const r = (v ?? {}) as Range;\r\n this.draftFrom.set(this.#format(r.from));\r\n this.draftTo.set(this.#format(r.to));\r\n } else {\r\n this.draft.set(this.#format(v));\r\n }\r\n this.hasError.set(false);\r\n this.focused.set(false);\r\n input.blur();\r\n }\r\n\r\n onRemove(ev: Event): void {\r\n ev.stopPropagation();\r\n this.remove.emit();\r\n }\r\n\r\n /** Format a stored value for display — number → vi-VN grouped digits. */\r\n #format(v: any): string {\r\n if (v == null || v === '') return '';\r\n if (this.isNumber()) {\r\n const n = typeof v === 'number' ? v : Number(String(v).replace(/\\./g, ''));\r\n return Number.isFinite(n) ? n.toLocaleString('vi-VN') : String(v);\r\n }\r\n return String(v);\r\n }\r\n\r\n /** Parse a draft back to a stored value. Number kind rejects non-numeric input. */\r\n #parse(s: string): { ok: boolean; value: any } {\r\n const t = (s ?? '').trim();\r\n if (t === '') return { ok: true, value: this.isNumber() ? null : '' };\r\n if (this.isNumber()) {\r\n // vi-VN groups thousands with '.', so strip dots + spaces, then require a plain\r\n // (optionally negative) integer — anything else (letters, stray symbols) is an error.\r\n const cleaned = t.replace(/[.\\s]/g, '');\r\n if (!/^-?\\d+$/.test(cleaned)) return { ok: false, value: t };\r\n const n = Number(cleaned);\r\n return Number.isFinite(n) ? { ok: true, value: n } : { ok: false, value: t };\r\n }\r\n return { ok: true, value: t };\r\n }\r\n}\r\n","<!--\r\n Seamless string/number chip — the pill IS the input. One border, three flush\r\n segments: label · input(s) · ×. State styling driven by [data-state].\r\n-->\r\n<span\r\n class=\"c-seamless\"\r\n [attr.data-state]=\"state()\"\r\n [class.c-seamless--compact]=\"density() === 'compact'\"\r\n [class.c-seamless--comfortable]=\"density() === 'comfortable'\"\r\n (click)=\"focusFromShell($event)\">\r\n\r\n <!-- Label segment: icon + field name (+ optional operator pill) -->\r\n <span class=\"c-seamless__label\">\r\n <mat-icon class=\"c-seamless__icon\" fontSet=\"material-icons-outlined\">{{ icon() }}</mat-icon>\r\n <span class=\"c-seamless__field\">{{ field().label }}</span>\r\n @if (showOperator() && !isNoData()) {\r\n <sd-operator class=\"c-seamless__op\" [operators]=\"[operator()]\" [model]=\"operator()\" [disabled]=\"true\" />\r\n } @else if (!isNoData()) {\r\n <span class=\"c-seamless__sep\">:</span>\r\n }\r\n </span>\r\n\r\n <!-- Input segment — transparent, borderless; hidden for NULL / NOT_NULL -->\r\n @if (!isNoData()) {\r\n <span class=\"c-seamless__input\">\r\n @if (isBetween()) {\r\n <input\r\n #firstInput\r\n type=\"text\"\r\n class=\"c-seamless__field-input\"\r\n [attr.data-autoid]=\"autoId() ? autoId() + '-from' : null\"\r\n [ngModel]=\"draftFrom()\"\r\n (ngModelChange)=\"draftFrom.set($event)\"\r\n [size]=\"sizeFor(draftFrom(), phFrom())\"\r\n [placeholder]=\"phFrom()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"commitRange()\"\r\n (keydown.enter)=\"$any($event.target).blur()\"\r\n (keydown.escape)=\"revertAndBlur($any($event.target))\" />\r\n <span class=\"c-seamless__dash\" aria-hidden=\"true\">—</span>\r\n <input\r\n type=\"text\"\r\n class=\"c-seamless__field-input\"\r\n [attr.data-autoid]=\"autoId() ? autoId() + '-to' : null\"\r\n [ngModel]=\"draftTo()\"\r\n (ngModelChange)=\"draftTo.set($event)\"\r\n [size]=\"sizeFor(draftTo(), phTo())\"\r\n [placeholder]=\"phTo()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"commitRange()\"\r\n (keydown.enter)=\"$any($event.target).blur()\"\r\n (keydown.escape)=\"revertAndBlur($any($event.target))\" />\r\n } @else {\r\n <input\r\n #firstInput\r\n type=\"text\"\r\n class=\"c-seamless__field-input\"\r\n [attr.data-autoid]=\"autoId() ?? null\"\r\n [ngModel]=\"draft()\"\r\n (ngModelChange)=\"draft.set($event)\"\r\n [size]=\"sizeFor(draft(), ph())\"\r\n [placeholder]=\"ph()\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"commitSingle()\"\r\n (keydown.enter)=\"$any($event.target).blur()\"\r\n (keydown.escape)=\"revertAndBlur($any($event.target))\" />\r\n }\r\n </span>\r\n }\r\n\r\n <!-- × segment -->\r\n <button type=\"button\" class=\"c-seamless__x\" aria-label=\"Remove filter\" (click)=\"onRemove($event)\">\r\n <mat-icon fontSet=\"material-icons-outlined\">close</mat-icon>\r\n </button>\r\n</span>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n afterNextRender,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n Injector,\r\n input,\r\n isSignal,\r\n model,\r\n output,\r\n signal,\r\n viewChild,\r\n viewChildren,\r\n} from '@angular/core';\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { firstValueFrom, isObservable } from 'rxjs';\r\nimport { SdSearch } from '@sd-angular/core/forms/models';\r\nimport { SdButton } from '@sd-angular/core/components/button';\r\nimport { SdOperator } from '@sd-angular/core/components/operator';\r\nimport { SdDate } from '@sd-angular/core/forms/date';\r\nimport { SdDatetime } from '@sd-angular/core/forms/datetime';\r\nimport { SdInput } from '@sd-angular/core/forms/input';\r\nimport { SdInputNumber } from '@sd-angular/core/forms/input-number';\r\nimport { SdSelect } from '@sd-angular/core/forms/select';\r\nimport { I18nService } from '@sd-angular/core/i18n';\r\nimport { Filter, Operator } from '@sd-angular/core/utilities/models';\r\n\r\nimport { SdQueryInlineValueChip } from './inline-value-chip.component';\r\nimport {\r\n SD_QUERY_MULTI_OPERATORS,\r\n SD_QUERY_NO_DATA_OPERATORS,\r\n SdQuery,\r\n SdQueryField,\r\n SdQueryLogic,\r\n sdQueryAllowedOperators,\r\n sdQueryDefaultOperator,\r\n sdQueryFieldIcon,\r\n sdQueryShowOperatorSelector,\r\n} from './query-bar.model';\r\n\r\ntype Density = 'compact' | 'comfortable';\r\ntype Range = { from?: string | number | null; to?: string | number | null };\r\n\r\n/** Shared empty array — stable reference so template bindings don't churn change detection. */\r\nconst EMPTY_ARRAY: any[] = [];\r\n\r\ninterface BuildingChip {\r\n field: SdQueryField;\r\n operator?: Operator;\r\n step: 'operator' | 'value';\r\n value?: unknown;\r\n}\r\n\r\n@Component({\r\n selector: 'sd-query-bar',\r\n templateUrl: './query-bar.component.html',\r\n styleUrls: ['./query-bar.component.scss', './query-bar.controls.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n MatTooltipModule,\r\n SdButton,\r\n SdOperator,\r\n SdSelect,\r\n SdInput,\r\n SdInputNumber,\r\n SdDate,\r\n SdDatetime,\r\n SdQueryInlineValueChip,\r\n ],\r\n})\r\nexport class SdQueryBar {\r\n readonly #i18n = inject(I18nService);\r\n readonly #injector = inject(Injector);\r\n readonly #host = inject(ElementRef);\r\n\r\n /** Focus the inline text/number value control once the build chip is in the value step. */\r\n #focusBuildValue(): void {\r\n afterNextRender(\r\n () => {\r\n const el = this.#host.nativeElement.querySelector(\r\n '.c-token-building input, .c-token-building textarea',\r\n ) as HTMLElement | null;\r\n el?.focus();\r\n },\r\n { injector: this.#injector },\r\n );\r\n }\r\n\r\n /** All chip menu triggers (one per chip button). Used to auto-open the popover after addFilter. */\r\n readonly chipTriggers = viewChildren<MatMenuTrigger>('chipTrigger');\r\n\r\n /** The build chip's operator dropdown — auto-opened when entering the operator step. */\r\n private readonly buildOperator = viewChild<SdOperator>('buildOperator');\r\n\r\n /** The build chip's value picker (bare sd-select / sd-date / sd-datetime) — auto-opened at the value step. */\r\n private readonly buildPicker = viewChild<SdSelect | SdDate | SdDatetime>('bPicker');\r\n\r\n /**\r\n * Land the user in the value editor after the build chip reaches the value step:\r\n * popover-kind controls auto-open their native picker; text/number just take focus.\r\n */\r\n #enterValueStep(field: SdQueryField): void {\r\n const k = field.kind;\r\n if (k === 'values' || k === 'lazy-values' || k === 'date' || k === 'datetime') {\r\n afterNextRender(() => this.buildPicker()?.open(), { injector: this.#injector });\r\n } else {\r\n this.#focusBuildValue();\r\n }\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Inputs — all accept null|undefined at boundary, transform to canonical shape\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Prefix for auto-generated `data-autoid` on inner controls (chips, operator/value editors, buttons). */\r\n readonly autoIdInput = input<string | undefined, string | null | undefined>(undefined, {\r\n alias: 'autoId',\r\n transform: (v): string | undefined => v ?? undefined,\r\n });\r\n\r\n /** Available fields the user can filter by. Required for the field picker. */\r\n readonly fields = input<SdQueryField[], SdQueryField[] | null | undefined>([], {\r\n transform: (v): SdQueryField[] => (Array.isArray(v) ? v : []),\r\n });\r\n\r\n /**\r\n * Active filter chips. Two-way bindable via `[(filters)]`.\r\n * Use this when you only need a flat `Filter[]` (no global logic / search box).\r\n */\r\n readonly filters = model<Filter[]>([]);\r\n\r\n /**\r\n * Global connector between filters. Two-way bindable via `[(logic)]`.\r\n * Only meaningful when `showLogicToggle=true` and there are ≥2 filters.\r\n */\r\n readonly logic = model<SdQueryLogic>('AND');\r\n\r\n /** Free-text search string. Two-way bindable via `[(search)]`. Only shown when `showSearch=true`. */\r\n readonly search = model<string>('');\r\n\r\n /**\r\n * Editing mode:\r\n * - `'popover'` (default) → compact chips; click a chip to edit operator + value in a\r\n * mat-menu popover, commit with \"Áp dụng\".\r\n * - `'inline'` → GitLab-style. Each filter's operator + value controls render directly\r\n * on the bar (no popup, no per-filter apply). Edits update `filters` live; the user\r\n * presses the search button (or Enter) once to fire `(apply)`.\r\n */\r\n readonly mode = input<'popover' | 'inline', 'popover' | 'inline' | null | undefined>('popover', {\r\n transform: (v): 'popover' | 'inline' => v || 'popover',\r\n });\r\n\r\n /** Density preset — chip / control height. */\r\n readonly density = input<Density, Density | null | undefined>('compact', {\r\n transform: (v): Density => v || 'compact',\r\n });\r\n\r\n /** Show free-text search input on the left. */\r\n readonly showSearch = input(false, { transform: booleanAttribute });\r\n\r\n /** Show saved-views dropdown on the right. */\r\n readonly showSavedViews = input(false, { transform: booleanAttribute });\r\n\r\n /** Show AND/OR segmented toggle (renders only when there are ≥2 filters). */\r\n readonly showLogicToggle = input(false, { transform: booleanAttribute });\r\n\r\n /** Show \"Clear all\" button when at least one filter is active. */\r\n readonly showClearAll = input(true, { transform: booleanAttribute });\r\n\r\n /** Render the operator label on the chip face (default: hidden — operator only visible in popover). */\r\n readonly showOperatorOnChip = input(false, { transform: booleanAttribute });\r\n\r\n // ---------------------------------------------------------------------------\r\n // Outputs\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Composite payload — emitted whenever filters / logic / search change. */\r\n readonly queryChange = output<SdQuery>();\r\n\r\n /** Fires when the user presses \"Áp dụng\" inside a chip popover — host should reload data. */\r\n readonly apply = output<SdQuery>();\r\n\r\n // ---------------------------------------------------------------------------\r\n // Derived state\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Map of `field.key` → `SdQueryField` for fast lookup from filters[]. */\r\n readonly fieldByKey = computed<Record<string, SdQueryField>>(() => {\r\n const map: Record<string, SdQueryField> = {};\r\n for (const f of this.fields()) map[f.key as string] = f;\r\n return map;\r\n });\r\n\r\n /** Field keys already chained on a chip — the picker greys these out. */\r\n readonly usedFieldKeys = computed<Set<string>>(() => {\r\n const set = new Set<string>();\r\n for (const f of this.filters()) {\r\n if ('field' in f && typeof f.field === 'string') set.add(f.field);\r\n }\r\n return set;\r\n });\r\n\r\n /** Render the global AND/OR connector text between chips when `logic === 'OR'`. */\r\n readonly showOrConnector = computed(\r\n () => this.showLogicToggle() && this.logic() === 'OR' && this.filters().length >= 2,\r\n );\r\n\r\n /** Search button is actionable only when there is something to apply. */\r\n readonly canSearch = computed(() => this.filters().length > 0 || this.search().trim().length > 0);\r\n\r\n // ---------------------------------------------------------------------------\r\n // Chip popover state — staging area (operator + value) for the open chip,\r\n // committed on \"Áp dụng\", discarded on close-without-apply.\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Index of the chip whose popover is open. Reset to null after Apply / close. */\r\n readonly editingIndex = signal<number | null>(null);\r\n /** Staged operator (uncommitted). */\r\n readonly editingOperator = signal<Operator>('EQUAL');\r\n /** Staged value (uncommitted) — type varies by kind. */\r\n readonly editingValue = signal<unknown>(null);\r\n /** Resolved option list for the currently editing values / lazy-values field. */\r\n readonly editingOptions = signal<any[]>([]);\r\n /** Loading state for async option fetch. */\r\n readonly editingOptionsLoading = signal(false);\r\n\r\n readonly editingField = computed<SdQueryField | null>(() => {\r\n const idx = this.editingIndex();\r\n if (idx === null) return null;\r\n const f = this.filters()[idx];\r\n if (!f || !('field' in f)) return null;\r\n return this.fieldByKey()[f.field as string] ?? null;\r\n });\r\n\r\n readonly editingAllowedOperators = computed<Operator[]>(() => {\r\n const field = this.editingField();\r\n return field ? sdQueryAllowedOperators(field) : [];\r\n });\r\n\r\n /** Show the operator dropdown only when the field exposes >1 operator (else simple mode). */\r\n readonly editingShowOperatorSelector = computed(() => {\r\n const field = this.editingField();\r\n return field ? sdQueryShowOperatorSelector(field) : false;\r\n });\r\n\r\n /** Multi-select is derived from the operator (IN / NOT_IN), not a field flag. */\r\n readonly editingIsMulti = computed(() => SD_QUERY_MULTI_OPERATORS.includes(this.editingOperator()));\r\n\r\n /** Compose a deterministic autoId for an inner control inside a chip's editor. */\r\n chipAutoId(role: string): string {\r\n const idx = this.editingIndex();\r\n const base = this.autoIdInput() ?? 'qb';\r\n return `${base}-chip${idx ?? 'x'}-${role}`;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Template helpers\r\n // ---------------------------------------------------------------------------\r\n\r\n readonly iconFor = sdQueryFieldIcon;\r\n\r\n /** Chip is \"active\" when it has a non-empty value OR a no-data operator (NULL/NOT_NULL). */\r\n isFilterActive(filter: Filter): boolean {\r\n if (SD_QUERY_NO_DATA_OPERATORS.includes(filter.operator as Operator)) return true;\r\n const data = (filter as any).data;\r\n if (data === null || data === undefined || data === '') return false;\r\n if (Array.isArray(data) && data.length === 0) return false;\r\n return true;\r\n }\r\n\r\n /** Rendered value text on a chip. */\r\n chipValueText(filter: Filter): string {\r\n if (SD_QUERY_NO_DATA_OPERATORS.includes(filter.operator as Operator)) return '';\r\n const data = (filter as any).data;\r\n if (data === null || data === undefined) return '';\r\n if (filter.operator === 'BETWEEN' && data && typeof data === 'object') {\r\n return `${data.from ?? ''} — ${data.to ?? ''}`;\r\n }\r\n if (Array.isArray(data)) {\r\n if (data.length === 0) return '';\r\n const head = this.#displayOne(filter, data[0]);\r\n return data.length > 1 ? `${head} +${data.length - 1}` : head;\r\n }\r\n return this.#displayOne(filter, data);\r\n }\r\n\r\n isNoDataOperator(op: Operator | string): boolean {\r\n return SD_QUERY_NO_DATA_OPERATORS.includes(op as Operator);\r\n }\r\n\r\n isMultiOperator(op: Operator | string): boolean {\r\n return SD_QUERY_MULTI_OPERATORS.includes(op as Operator);\r\n }\r\n\r\n /**\r\n * Stable `SdSearch` per lazy-values field key so `sd-select` owns search + chip-display\r\n * lookups. why: memoized via a computed map so `[items]=\"lazyItemsFor(field)\"` returns the\r\n * SAME reference each change-detection pass — a fresh function each time would make\r\n * sd-select wipe its option cache and refetch on every CD. Recomputes only when `fields` changes.\r\n * SEARCH -> field.option.search; VALUE -> field.option.views.\r\n */\r\n readonly #lazySearchByKey = computed<Record<string, SdSearch>>(() => {\r\n const map: Record<string, SdSearch> = {};\r\n for (const f of this.fields()) {\r\n if (f.kind !== 'lazy-values') continue;\r\n const opt = (f as any).option;\r\n map[f.key as string] = async (req): Promise<any[]> => {\r\n if (req.type === 'VALUE') {\r\n const values = Array.isArray(req.value) ? req.value : req.value == null ? [] : [req.value];\r\n return opt?.views ? await opt.views(values) : [];\r\n }\r\n const result = opt?.search?.({ search: req.searchText ?? '' });\r\n if (!result) return [];\r\n return isObservable(result) ? await firstValueFrom(result) : await result;\r\n };\r\n }\r\n return map;\r\n });\r\n\r\n lazyItemsFor(field: SdQueryField): SdSearch {\r\n return this.#lazySearchByKey()[field.key as string];\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Inline mode — per-field helpers + live mutators (no popover / no Apply gate)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** The single in-progress inline chip (not yet in `filters`). */\r\n readonly #building = signal<BuildingChip | null>(null);\r\n readonly building = this.#building.asReadonly();\r\n\r\n /** Index of the completed chip whose value is being inline-edited (inline mode). */\r\n readonly #editingValueIndex = signal<number | null>(null);\r\n readonly editingValueIndex = this.#editingValueIndex.asReadonly();\r\n\r\n /** True when chip `i` is in inline value-edit mode. */\r\n isEditingValue(i: number): boolean {\r\n return this.#editingValueIndex() === i;\r\n }\r\n\r\n allowedOperatorsFor(field: SdQueryField): Operator[] {\r\n return sdQueryAllowedOperators(field);\r\n }\r\n\r\n inlineAutoId(index: number, role: string): string {\r\n const base = this.autoIdInput() ?? 'qb';\r\n return `${base}-inline${index}-${role}`;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Inline mode — progressive token build flow (field → operator → value)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Append a completed chip to `filters` WITHOUT emitting (inline mode commits on Search). */\r\n #pushComplete(field: SdQueryField, operator: Operator, value: unknown): void {\r\n let data: unknown = value;\r\n if (SD_QUERY_NO_DATA_OPERATORS.includes(operator)) data = null;\r\n else if (operator === 'BETWEEN') {\r\n if (!data || typeof data !== 'object') data = { from: null, to: null };\r\n } else if (SD_QUERY_MULTI_OPERATORS.includes(operator)) {\r\n data = Array.isArray(data) ? data : value == null ? [] : [value];\r\n }\r\n const next = { field: field.key as any, operator, data } as Filter;\r\n this.filters.set([...this.filters(), next]);\r\n }\r\n\r\n /** Entry point from the field picker — start building a chip for `field`. */\r\n beginBuild(field: SdQueryField): void {\r\n this.#editingValueIndex.set(null);\r\n const allowed = sdQueryAllowedOperators(field);\r\n if (allowed.length > 1) {\r\n this.#building.set({ field, step: 'operator' });\r\n // why: auto-open the operator menu so the user can pick the condition without a\r\n // second click — the viewChild only resolves after the building chip renders.\r\n afterNextRender(() => this.buildOperator()?.open(), { injector: this.#injector });\r\n return;\r\n }\r\n const operator = allowed[0] ?? sdQueryDefaultOperator(field);\r\n if (SD_QUERY_NO_DATA_OPERATORS.includes(operator)) {\r\n this.#pushComplete(field, operator, null);\r\n this.#building.set(null);\r\n return;\r\n }\r\n this.#building.set({ field, operator, step: 'value' });\r\n this.#enterValueStep(field);\r\n }\r\n\r\n /** Operator chosen during build — finish (no-data) or advance to the value step. */\r\n pickBuildOperator(op: Operator): void {\r\n const b = this.#building();\r\n if (!b) return;\r\n if (SD_QUERY_NO_DATA_OPERATORS.includes(op)) {\r\n this.#pushComplete(b.field, op, null);\r\n this.#building.set(null);\r\n return;\r\n }\r\n this.#building.set({ ...b, operator: op, step: 'value' });\r\n this.#enterValueStep(b.field);\r\n }\r\n\r\n /** Value committed during build — push the completed chip, clear building. No emit. */\r\n commitBuildValue(value: unknown): void {\r\n const b = this.#building();\r\n if (!b || !b.operator) return;\r\n this.#pushComplete(b.field, b.operator, value);\r\n this.#building.set(null);\r\n }\r\n\r\n /**\r\n * Commit from the seamless build chip (string / number). An empty value (blur with no\r\n * input) cancels the build instead of pushing a blank chip.\r\n */\r\n onBuildSeamlessCommit(value: unknown): void {\r\n const empty =\r\n value == null ||\r\n value === '' ||\r\n (typeof value === 'object' &&\r\n (value as Range).from == null &&\r\n (value as Range).to == null);\r\n if (empty) {\r\n this.cancelBuild();\r\n return;\r\n }\r\n this.commitBuildValue(value);\r\n }\r\n\r\n /** Abandon the in-progress chip. */\r\n cancelBuild(): void {\r\n this.#building.set(null);\r\n }\r\n\r\n /** Latest value typed/selected during inline value edit (chip already in `filters`). */\r\n readonly #editDraft = signal<unknown>(null);\r\n\r\n /** Live-commit an inline edit for a completed chip (bare control path). */\r\n editValueFn(i: number): (v: unknown) => void {\r\n return (v: unknown) => this.updateFilter(i, { data: v } as Partial<Filter>);\r\n }\r\n\r\n /** Single-value commit from a completed chip in edit mode — write data + exit edit. */\r\n onChipSingleCommit(i: number, v: unknown): void {\r\n this.updateFilter(i, { data: v } as Partial<Filter>);\r\n this.#editingValueIndex.set(null);\r\n }\r\n\r\n /**\r\n * Multi-value chips exit edit when focus actually leaves the wrapper subtree.\r\n * why: focusout fires on every internal blur (option click, search input, …) — only\r\n * exit when the new focus target is NOT a descendant of the chip's value wrapper.\r\n */\r\n onChipValueFocusOut(i: number, ev: FocusEvent): void {\r\n const wrapper = ev.currentTarget as HTMLElement | null;\r\n const next = ev.relatedTarget as Node | null;\r\n // why: nếu event không có wrapper (ví dụ event được tạo thủ công, chưa dispatch),\r\n // không thể xác định focus có thoát khỏi subtree hay không → giữ nguyên edit mode.\r\n if (!wrapper) return;\r\n if (next && wrapper.contains(next)) return;\r\n if (this.#editingValueIndex() === i) this.#editingValueIndex.set(null);\r\n }\r\n\r\n /**\r\n * Cập nhật đầu `from` của BETWEEN cho 1 chip đã commit (inline edit).\r\n * why: dual picker BETWEEN trên chip hoàn tất cần ghi từng đầu vào filter mà không reset đầu kia.\r\n */\r\n setFilterRangeFrom(i: number, v: unknown): void {\r\n const cur = this.filters()[i] as { data?: unknown } | undefined;\r\n if (!cur) return;\r\n const curData = (cur.data && typeof cur.data === 'object') ? (cur.data as Record<string, unknown>) : {};\r\n this.updateFilter(i, { data: { ...curData, from: v } } as Partial<Filter>);\r\n }\r\n\r\n /**\r\n * Cập nhật đầu `to` của BETWEEN cho 1 chip đã commit (inline edit).\r\n */\r\n setFilterRangeTo(i: number, v: unknown): void {\r\n const cur = this.filters()[i] as { data?: unknown } | undefined;\r\n if (!cur) return;\r\n const curData = (cur.data && typeof cur.data === 'object') ? (cur.data as Record<string, unknown>) : {};\r\n this.updateFilter(i, { data: { ...curData, to: v } } as Partial<Filter>);\r\n }\r\n noop = (): void => undefined;\r\n\r\n setEditDraftFn(): (v: unknown) => void {\r\n return (v: unknown) => this.#editDraft.set(v);\r\n }\r\n commitEditDraftFn(i: number): () => void {\r\n return () => this.commitEditValue(i, this.#editDraft());\r\n }\r\n\r\n setBuildDraftFn(): (v: unknown) => void {\r\n return (v: unknown) => {\r\n const b = this.#building();\r\n if (b) this.#building.set({ ...b, value: v });\r\n };\r\n }\r\n\r\n /** Update the `from` end of the build chip's BETWEEN range without committing. */\r\n setBuildRangeFrom(v: unknown): void {\r\n const b = this.#building();\r\n if (!b) return;\r\n const cur = (b.value && typeof b.value === 'object') ? (b.value as any) : {};\r\n this.#building.set({ ...b, value: { ...cur, from: v } });\r\n }\r\n\r\n /**\r\n * Update the `to` end of the build chip's BETWEEN range. Once both ends are set, commit\r\n * the chip so the user does not need an extra blur / apply press.\r\n */\r\n setBuildRangeTo(v: unknown): void {\r\n const b = this.#building();\r\n if (!b) return;\r\n const cur = (b.value && typeof b.value === 'object') ? (b.value as any) : {};\r\n const next = { ...cur, to: v };\r\n this.#building.set({ ...b, value: next });\r\n if (next.from != null && next.to != null) this.commitBuildValue(next);\r\n }\r\n\r\n commitBuildDraftFn(): () => void {\r\n return () => {\r\n const b = this.#building();\r\n if (b) this.commitBuildValue(b.value);\r\n };\r\n }\r\n\r\n /** Start inline value edit on a completed chip (operator + field stay locked). */\r\n beginEditValue(i: number): void {\r\n if (i < 0 || i >= this.filters().length) return;\r\n this.#building.set(null);\r\n const filter = this.filters()[i];\r\n // why: seed the draft with the current value so Enter can finalize the existing text\r\n // if the user presses Enter without retyping.\r\n this.#editDraft.set((filter as any).data ?? null);\r\n this.#editingValueIndex.set(i);\r\n }\r\n\r\n /** Commit an inline value edit — change only `data`, no emit. */\r\n commitEditValue(i: number, value: unknown): void {\r\n this.updateFilter(i, { data: value } as Partial<Filter>);\r\n this.#editingValueIndex.set(i === this.#editingValueIndex() ? null : this.#editingValueIndex());\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Mutations\r\n // ---------------------------------------------------------------------------\r\n\r\n addFilter(field: SdQueryField): void {\r\n const operator = sdQueryDefaultOperator(field);\r\n const data = SD_QUERY_MULTI_OPERATORS.includes(operator) ? [] : null;\r\n const next: Filter = { field: field.key as any, operator, data } as Filter;\r\n const newIndex = this.filters().length;\r\n this.filters.set([...this.filters(), next]);\r\n // why: user added a field — open its edit popover immediately so they can pick\r\n // operator + value in one continuous flow (no second click required).\r\n afterNextRender(\r\n () => {\r\n const triggers = this.chipTriggers();\r\n const trigger = triggers[newIndex];\r\n if (trigger) trigger.openMenu();\r\n },\r\n { injector: this.#injector },\r\n );\r\n }\r\n\r\n /** Swap the field of an existing chip — reset operator + value to the new field's defaults. */\r\n changeFilterField(index: number, field: SdQueryField): void {\r\n const list = [...this.filters()];\r\n if (index < 0 || index >= list.length) return;\r\n const operator = sdQueryDefaultOperator(field);\r\n const data = SD_QUERY_MULTI_OPERATORS.includes(operator) ? [] : null;\r\n list[index] = { field: field.key as any, operator, data } as Filter;\r\n this.filters.set(list);\r\n // why: clicking an item in the nested fieldSwitchPicker closes both the picker AND\r\n // the parent chipPopover. Re-open the chip's popover on the next render so user can\r\n // continue picking operator + value without a second manual click.\r\n afterNextRender(\r\n () => {\r\n const trigger = this.chipTriggers()[index];\r\n if (trigger) trigger.openMenu();\r\n },\r\n { injector: this.#injector },\r\n );\r\n }\r\n\r\n updateFilter(index: number, patch: Partial<Filter>): void {\r\n const list = [...this.filters()];\r\n if (index < 0 || index >= list.length) return;\r\n list[index] = { ...list[index], ...patch } as Filter;\r\n this.filters.set(list);\r\n }\r\n\r\n removeFilter(index: number): void {\r\n const list = [...this.filters()];\r\n if (index < 0 || index >= list.length) return;\r\n // close the open popover (if it's this chip's) before the chip + its trigger vanish\r\n if (this.editingIndex() === index) {\r\n this.chipTriggers()[index]?.closeMenu();\r\n this.editingIndex.set(null);\r\n }\r\n if (this.#editingValueIndex() === index) this.#editingValueIndex.set(null);\r\n list.splice(index, 1);\r\n this.filters.set(list);\r\n }\r\n\r\n clearAll(): void {\r\n if (this.filters().length === 0) return;\r\n this.filters.set([]);\r\n this.editingIndex.set(null);\r\n }\r\n\r\n setLogic(value: SdQueryLogic): void {\r\n if (this.logic() === value) return;\r\n this.logic.set(value);\r\n }\r\n\r\n setSearch(value: string): void {\r\n if (this.search() === value) return;\r\n this.search.set(value);\r\n }\r\n\r\n triggerApply(): void {\r\n // why: single deferred trigger — fire both the change notification and the reload\r\n // signal once, from here only (mutations no longer emit).\r\n const q = this.#buildQuery();\r\n this.queryChange.emit(q);\r\n this.apply.emit(q);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Chip popover — stage edits, commit on close\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Called when a chip is clicked — copy current operator + value into the staging signals. */\r\n openChipPopover(index: number): void {\r\n const filter = this.filters()[index];\r\n if (!filter || !('field' in filter)) return;\r\n this.editingIndex.set(index);\r\n this.editingOperator.set(filter.operator as Operator);\r\n this.editingValue.set((filter as any).data ?? null);\r\n\r\n const field = this.fieldByKey()[filter.field as string];\r\n if (field?.kind === 'values') {\r\n this.#loadValuesOptions(field);\r\n } else if (field?.kind === 'lazy-values') {\r\n this.#loadLazyOptions(field);\r\n } else {\r\n this.editingOptions.set([]);\r\n this.editingOptionsLoading.set(false);\r\n }\r\n }\r\n\r\n /** Called on operator <select> change in the popover. */\r\n onEditingOperatorChange(next: Operator): void {\r\n const prev = this.editingOperator();\r\n this.editingOperator.set(next);\r\n\r\n // Reset / reshape staged value when operator family changes\r\n if (SD_QUERY_NO_DATA_OPERATORS.includes(next)) {\r\n this.editingValue.set(null);\r\n return;\r\n }\r\n if (next === 'BETWEEN') {\r\n // Convert single → range\r\n const v = this.editingValue();\r\n if (v && typeof v === 'object' && 'from' in (v as any)) return;\r\n this.editingValue.set({ from: null, to: null } as Range);\r\n return;\r\n }\r\n const goingToMulti = SD_QUERY_MULTI_OPERATORS.includes(next);\r\n const wasMulti = SD_QUERY_MULTI_OPERATORS.includes(prev as Operator);\r\n if (goingToMulti && !wasMulti) {\r\n const v = this.editingValue();\r\n this.editingValue.set(v == null ? [] : [v]);\r\n } else if (!goingToMulti && wasMulti) {\r\n const v = this.editingValue();\r\n this.editingValue.set(Array.isArray(v) && v.length > 0 ? v[0] : null);\r\n }\r\n }\r\n\r\n /** Two-way bind for primitive value control. */\r\n onEditingValueInput(value: unknown): void {\r\n this.editingValue.set(value);\r\n }\r\n\r\n /** BETWEEN range mutators. */\r\n onEditingRangeFrom(value: string | number | null): void {\r\n const v = (this.editingValue() as Range) ?? {};\r\n this.editingValue.set({ ...v, from: value });\r\n }\r\n\r\n onEditingRangeTo(value: string | number | null): void {\r\n const v = (this.editingValue() as Range) ?? {};\r\n this.editingValue.set({ ...v, to: value });\r\n }\r\n\r\n /** Toggle a value inside the staged multi-select array. */\r\n toggleEditingMultiValue(value: unknown): void {\r\n const arr = Array.isArray(this.editingValue()) ? [...(this.editingValue() as unknown[])] : [];\r\n const idx = arr.indexOf(value);\r\n if (idx >= 0) arr.splice(idx, 1);\r\n else arr.push(value);\r\n this.editingValue.set(arr);\r\n }\r\n\r\n isEditingMultiSelected(value: unknown): boolean {\r\n const v = this.editingValue();\r\n return Array.isArray(v) && v.includes(value);\r\n }\r\n\r\n\r\n /**\r\n * Commit the staged operator + value into the chip when the popover closes.\r\n * why: nút Áp dụng đã bị bỏ — đóng popover (out-focus) tự động áp dụng phần\r\n * chỉnh sửa đang staging. Không emit: nút Search toàn cục vẫn là trigger query duy nhất.\r\n */\r\n commitChipEditOnClose(): void {\r\n const idx = this.editingIndex();\r\n if (idx === null) return;\r\n const next: Filter = {\r\n field: (this.filters()[idx] as any).field,\r\n operator: this.editingOperator(),\r\n data: this.editingValue(),\r\n } as Filter;\r\n const list = [...this.filters()];\r\n list[idx] = next;\r\n this.filters.set(list);\r\n this.editingIndex.set(null);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Internals\r\n // ---------------------------------------------------------------------------\r\n\r\n #buildQuery(): SdQuery {\r\n return {\r\n filters: this.filters(),\r\n logic: this.logic(),\r\n ...(this.showSearch() ? { search: this.search() } : {}),\r\n };\r\n }\r\n\r\n #displayOne(filter: Filter, raw: any): string {\r\n const fieldKey = 'field' in filter ? (filter.field as string) : '';\r\n const field = this.fieldByKey()[fieldKey];\r\n if (!field) return String(raw);\r\n if (field.kind === 'boolean') {\r\n const trueLabel = (field as any).trueLabel ?? 'Có';\r\n const falseLabel = (field as any).falseLabel ?? 'Không';\r\n return raw ? trueLabel : falseLabel;\r\n }\r\n if (field.kind === 'values' || field.kind === 'lazy-values') {\r\n const opt = (field as any).option;\r\n const items = this.#resolveSyncItems(opt?.items) ?? this.editingOptions();\r\n const match = items.find((i: any) => i?.[opt.valueField] === raw);\r\n if (match) return String(match[opt.displayField]);\r\n const cached = this.editingOptions().find((i: any) => i?.[opt.valueField] === raw);\r\n return cached ? String(cached[opt.displayField]) : String(raw);\r\n }\r\n return String(raw);\r\n }\r\n\r\n #resolveSyncItems(items: any): any[] | null {\r\n if (Array.isArray(items)) return items;\r\n if (isSignal(items)) return (items as any)();\r\n return null;\r\n }\r\n\r\n #loadValuesOptions(field: SdQueryField): void {\r\n const opt = (field as any).option;\r\n const items = opt?.items;\r\n if (Array.isArray(items)) {\r\n this.editingOptions.set(items);\r\n this.editingOptionsLoading.set(false);\r\n return;\r\n }\r\n if (isSignal(items)) {\r\n this.editingOptions.set((items as any)());\r\n this.editingOptionsLoading.set(false);\r\n return;\r\n }\r\n if (typeof items === 'function') {\r\n this.editingOptionsLoading.set(true);\r\n Promise.resolve(items())\r\n .then((arr: any[]) => this.editingOptions.set(arr ?? []))\r\n .finally(() => this.editingOptionsLoading.set(false));\r\n }\r\n }\r\n\r\n #loadLazyOptions(field: SdQueryField, search = ''): void {\r\n const opt = (field as any).option;\r\n if (!opt?.search) return;\r\n this.editingOptionsLoading.set(true);\r\n const result = opt.search({ search });\r\n if (isObservable(result)) {\r\n (result as any).subscribe({\r\n next: (arr: any[]) => this.editingOptions.set(arr ?? []),\r\n complete: () => this.editingOptionsLoading.set(false),\r\n error: () => this.editingOptionsLoading.set(false),\r\n });\r\n } else {\r\n Promise.resolve(result)\r\n .then((arr: any[]) => this.editingOptions.set(arr ?? []))\r\n .finally(() => this.editingOptionsLoading.set(false));\r\n }\r\n }\r\n}\r\n","<!--\r\n sd-query-bar — unified filter chip row (Jira/Linear/Notion style).\r\n Visual spec: refs/design_handoff_sd_query_bar/README.md\r\n TODO(next-iter): replace inline placeholders for field-picker + chip-popover\r\n with extracted sub-components driven by CDK overlay.\r\n-->\r\n@let _filters = filters();\r\n@let _fields = fields();\r\n@let _logic = logic();\r\n@let _density = density();\r\n@let _showOr = showOrConnector();\r\n@let _used = usedFieldKeys();\r\n\r\n<div\r\n class=\"c-query-bar\"\r\n [class.c-density-compact]=\"_density === 'compact'\"\r\n [class.c-density-comfortable]=\"_density === 'comfortable'\">\r\n\r\n <!-- Main region — search + filters + add-filter. Wraps internally; the right\r\n action toolbar stays anchored and does NOT flow with this. -->\r\n <div class=\"c-query-bar__main\">\r\n\r\n <!-- Free-text search (left, optional) -->\r\n @if (showSearch()) {\r\n <div class=\"c-search\">\r\n <mat-icon class=\"c-search-icon\" fontSet=\"material-icons-outlined\">search</mat-icon>\r\n <input\r\n class=\"c-search-input\"\r\n type=\"text\"\r\n [ngModel]=\"search()\"\r\n (ngModelChange)=\"setSearch($event)\"\r\n (keydown.enter)=\"triggerApply()\"\r\n placeholder=\"Tìm kiếm...\" />\r\n </div>\r\n <span class=\"c-divider\" aria-hidden=\"true\"></span>\r\n }\r\n\r\n <!-- Field switcher (used by chipPopover header) — declared first so chipPopover's\r\n nested ng-template can resolve the template ref. -->\r\n <mat-menu #fieldSwitchPicker=\"matMenu\" xPosition=\"after\" yPosition=\"below\" class=\"c-field-picker-menu\">\r\n <ng-template matMenuContent let-currentIndex=\"currentIndex\">\r\n @let _currentFilter = filters()[currentIndex];\r\n @let _currentKey = $any(_currentFilter)?.field;\r\n @for (field of _fields; track $index) {\r\n @let _isCurrent = field.key === _currentKey;\r\n <button\r\n type=\"button\"\r\n mat-menu-item\r\n [disabled]=\"_isCurrent || field.disabled\"\r\n (click)=\"changeFilterField(currentIndex, field)\">\r\n <mat-icon fontSet=\"material-icons-outlined\" class=\"c-field-item-icon\">\r\n {{ iconFor(field) }}\r\n </mat-icon>\r\n <span class=\"c-field-item-label\">{{ field.label }}</span>\r\n <span class=\"c-field-item-kind\">{{ field.kind }}</span>\r\n @if (_isCurrent) {\r\n <mat-icon class=\"c-field-item-check\" fontSet=\"material-icons-outlined\">check</mat-icon>\r\n }\r\n </button>\r\n }\r\n </ng-template>\r\n </mat-menu>\r\n\r\n <!-- Chip popover — declared BEFORE chips so @for can resolve the forward template ref -->\r\n <mat-menu #chipPopover=\"matMenu\" class=\"c-chip-popover\" xPosition=\"after\" yPosition=\"below\">\r\n <ng-template matMenuContent let-index=\"index\">\r\n @let _editField = editingField();\r\n @let _editOp = editingOperator();\r\n @let _editVal = editingValue();\r\n @let _options = editingOptions();\r\n @let _loading = editingOptionsLoading();\r\n\r\n @if (_editField) {\r\n <div class=\"c-pop-header\" (click)=\"$event.stopPropagation()\">\r\n <mat-icon fontSet=\"material-icons-outlined\">{{ iconFor(_editField) }}</mat-icon>\r\n <!-- Click field name → open nested picker to swap field on this chip. -->\r\n <button\r\n type=\"button\"\r\n class=\"c-pop-header-field\"\r\n [matMenuTriggerFor]=\"fieldSwitchPicker\"\r\n [matMenuTriggerData]=\"{ currentIndex: index }\"\r\n matTooltip=\"Đổi field\">\r\n <span>{{ _editField.label }}</span>\r\n <mat-icon fontSet=\"material-icons-outlined\">unfold_more</mat-icon>\r\n </button>\r\n <!-- why: operator moved into the header (right-aligned) to compact the popover.\r\n Always shown — when the field has ≤1 operator it renders disabled so the\r\n user still sees which operator the filter uses. -->\r\n <sd-operator\r\n class=\"c-pop-header-operator\"\r\n [autoId]=\"chipAutoId('operator')\"\r\n [operators]=\"editingAllowedOperators()\"\r\n [model]=\"_editOp\"\r\n [disabled]=\"!editingShowOperatorSelector()\"\r\n (modelChange)=\"onEditingOperatorChange($any($event))\" />\r\n </div>\r\n\r\n <div class=\"c-pop-body\" (click)=\"$event.stopPropagation()\">\r\n <!-- Value — per-kind sd-* control, skipped for NULL / NOT_NULL. Placeholder\r\n makes the field self-explanatory now that section labels are gone. -->\r\n @if (!isNoDataOperator(_editOp)) {\r\n @if (_editOp === 'BETWEEN') {\r\n @if (_editField.kind === 'date') {\r\n <div class=\"c-pop-between\">\r\n <sd-date size=\"sm\"\r\n [autoId]=\"chipAutoId('value-from')\"\r\n placeholder=\"Từ\"\r\n [model]=\"$any(_editVal)?.from\"\r\n (sdChange)=\"onEditingRangeFrom($event)\">\r\n </sd-date>\r\n <sd-date size=\"sm\"\r\n [autoId]=\"chipAutoId('value-to')\"\r\n placeholder=\"Đến\"\r\n [model]=\"$any(_editVal)?.to\"\r\n (sdChange)=\"onEditingRangeTo($event)\">\r\n </sd-date>\r\n </div>\r\n } @else if (_editField.kind === 'datetime') {\r\n <div class=\"c-pop-between\">\r\n <sd-datetime size=\"sm\"\r\n [autoId]=\"chipAutoId('value-from')\"\r\n placeholder=\"Từ\"\r\n [model]=\"$any(_editVal)?.from\"\r\n (sdChange)=\"onEditingRangeFrom($event)\">\r\n </sd-datetime>\r\n <sd-datetime size=\"sm\"\r\n [autoId]=\"chipAutoId('value-to')\"\r\n placeholder=\"Đến\"\r\n [model]=\"$any(_editVal)?.to\"\r\n (sdChange)=\"onEditingRangeTo($event)\">\r\n </sd-datetime>\r\n </div>\r\n } @else {\r\n <div class=\"c-pop-between\">\r\n <sd-input-number size=\"sm\"\r\n [autoId]=\"chipAutoId('value-from')\"\r\n placeholder=\"Từ\"\r\n [model]=\"$any(_editVal)?.from\"\r\n (sdChange)=\"onEditingRangeFrom($event)\">\r\n </sd-input-number>\r\n <sd-input-number size=\"sm\"\r\n [autoId]=\"chipAutoId('value-to')\"\r\n placeholder=\"Đến\"\r\n [model]=\"$any(_editVal)?.to\"\r\n (sdChange)=\"onEditingRangeTo($event)\">\r\n </sd-input-number>\r\n </div>\r\n }\r\n } @else if (_editField.kind === 'boolean') {\r\n <div class=\"c-pop-boolean\">\r\n <sd-button\r\n [autoId]=\"chipAutoId('value-true')\"\r\n [type]=\"_editVal === true ? 'fill' : 'outline'\"\r\n color=\"primary\"\r\n [title]=\"$any(_editField).trueLabel || 'Có'\"\r\n (click)=\"onEditingValueInput(true)\">\r\n </sd-button>\r\n <sd-button\r\n [autoId]=\"chipAutoId('value-false')\"\r\n [type]=\"_editVal === false ? 'fill' : 'outline'\"\r\n color=\"primary\"\r\n [title]=\"$any(_editField).falseLabel || 'Không'\"\r\n (click)=\"onEditingValueInput(false)\">\r\n </sd-button>\r\n </div>\r\n } @else if (_editField.kind === 'values' || _editField.kind === 'lazy-values') {\r\n @let _opt = $any(_editField).option;\r\n <sd-select size=\"sm\"\r\n [autoId]=\"chipAutoId('value')\"\r\n placeholder=\"Chọn giá trị\"\r\n [items]=\"_options\"\r\n [valueField]=\"_opt.valueField\"\r\n [displayField]=\"_opt.displayField\"\r\n [multiple]=\"editingIsMulti()\"\r\n [model]=\"$any(_editVal)\"\r\n (sdChange)=\"onEditingValueInput($event)\">\r\n </sd-select>\r\n @if (_loading) {\r\n <div class=\"c-pop-values-loading\">Đang tải...</div>\r\n }\r\n } @else if (_editField.kind === 'date') {\r\n <sd-date size=\"sm\"\r\n [autoId]=\"chipAutoId('value')\"\r\n placeholder=\"Chọn giá trị\"\r\n [model]=\"$any(_editVal)\"\r\n (sdChange)=\"onEditingValueInput($event)\">\r\n </sd-date>\r\n } @else if (_editField.kind === 'datetime') {\r\n <sd-datetime size=\"sm\"\r\n [autoId]=\"chipAutoId('value')\"\r\n placeholder=\"Chọn giá trị\"\r\n [model]=\"$any(_editVal)\"\r\n (sdChange)=\"onEditingValueInput($event)\">\r\n </sd-datetime>\r\n } @else if (_editField.kind === 'number') {\r\n <sd-input-number size=\"sm\"\r\n [autoId]=\"chipAutoId('value')\"\r\n placeholder=\"Nhập giá trị\"\r\n [model]=\"$any(_editVal)\"\r\n (sdChange)=\"onEditingValueInput($event)\">\r\n </sd-input-number>\r\n } @else {\r\n <sd-input size=\"sm\"\r\n [autoId]=\"chipAutoId('value')\"\r\n placeholder=\"Nhập giá trị\"\r\n [model]=\"$any(_editVal)\"\r\n (sdChange)=\"onEditingValueInput($event)\">\r\n </sd-input>\r\n }\r\n }\r\n </div>\r\n }\r\n </ng-template>\r\n </mat-menu>\r\n\r\n @if (mode() === 'inline') {\r\n <!-- ===== INLINE MODE (GitLab-style token builder) ===== -->\r\n\r\n <!-- Reusable value editor. ctx: field, data, isMulti, change (stash fn), enter (finalize fn), autoId\r\n why: text/number commit on Enter, so the typed value is stashed via `change` then finalized\r\n by `enter`; selection-style controls (select/date/boolean) stash + finalize in one action. -->\r\n <ng-template #valueEditor let-field=\"field\" let-data=\"data\" let-isMulti=\"isMulti\" let-change=\"change\" let-enter=\"enter\" let-autoId=\"autoId\">\r\n @if (field.kind === 'boolean') {\r\n <sd-button [autoId]=\"autoId + '-true'\" [type]=\"data === true ? 'fill' : 'outline'\" color=\"primary\" [title]=\"$any(field).trueLabel || 'Có'\" (click)=\"change(true); enter()\"></sd-button>\r\n <sd-button [autoId]=\"autoId + '-false'\" [type]=\"data === false ? 'fill' : 'outline'\" color=\"primary\" [title]=\"$any(field).falseLabel || 'Không'\" (click)=\"change(false); enter()\"></sd-button>\r\n } @else if (field.kind === 'values') {\r\n @let _opt = $any(field).option;\r\n <sd-select bare size=\"sm\" minWidthPanel=\"220px\" [autoId]=\"autoId\" [items]=\"$any(_opt.items)\" [valueField]=\"_opt.valueField\" [displayField]=\"_opt.displayField\" [multiple]=\"isMulti\" [model]=\"data\" (sdChange)=\"change($event); enter()\"></sd-select>\r\n } @else if (field.kind === 'lazy-values') {\r\n @let _lopt = $any(field).option;\r\n <sd-select bare size=\"sm\" minWidthPanel=\"220px\" [autoId]=\"autoId\" [items]=\"lazyItemsFor(field)\" [valueField]=\"_lopt.valueField\" [displayField]=\"_lopt.displayField\" [multiple]=\"isMulti\" [model]=\"data\" (sdChange)=\"change($event); enter()\"></sd-select>\r\n } @else if (field.kind === 'date') {\r\n <sd-date bare size=\"sm\" [autoId]=\"autoId\" [model]=\"data\" (sdChange)=\"change($event); enter()\"></sd-date>\r\n } @else if (field.kind === 'datetime') {\r\n <sd-datetime bare size=\"sm\" [autoId]=\"autoId\" [model]=\"data\" (sdChange)=\"change($event); enter()\"></sd-datetime>\r\n } @else if (field.kind === 'number') {\r\n <sd-input-number size=\"sm\" [autoId]=\"autoId\" [model]=\"data\" (sdChange)=\"change($event)\" (keyupEnter)=\"enter()\"></sd-input-number>\r\n } @else {\r\n <sd-input size=\"sm\" [autoId]=\"autoId\" [model]=\"data\" (sdChange)=\"change($event)\" (keyupEnter)=\"enter()\"></sd-input>\r\n }\r\n </ng-template>\r\n\r\n <!-- Completed chips -->\r\n @for (filter of _filters; track $index; let i = $index) {\r\n @if (_showOr && i > 0) {\r\n <span class=\"c-or-connector\" aria-hidden=\"true\">OR</span>\r\n }\r\n @let _field = fieldByKey()[$any(filter).field];\r\n @if (_field) {\r\n @let _op = $any(filter.operator);\r\n @let _data = $any(filter).data;\r\n @if (_field.kind === 'string' || _field.kind === 'number') {\r\n <!-- Seamless chip — the pill is the input (string / number). -->\r\n <sd-query-inline-value-chip\r\n [field]=\"_field\"\r\n [operator]=\"_op\"\r\n [value]=\"_data\"\r\n [density]=\"_density\"\r\n [showOperator]=\"showOperatorOnChip()\"\r\n [autoId]=\"inlineAutoId(i, 'value')\"\r\n (valueChange)=\"updateFilter(i, { data: $event })\"\r\n (remove)=\"removeFilter(i)\" />\r\n } @else {\r\n <div class=\"c-token\" [class.c-token-editing]=\"isEditingValue(i)\">\r\n <mat-icon class=\"c-token-icon\" fontSet=\"material-icons-outlined\">{{ iconFor(_field) }}</mat-icon>\r\n <span class=\"c-token-field\">{{ _field.label }}</span>\r\n @if (!isNoDataOperator(_op) && showOperatorOnChip()) {\r\n <sd-operator class=\"c-token-op\" [operators]=\"[_op]\" [model]=\"_op\" [disabled]=\"true\" />\r\n } @else if (!isNoDataOperator(_op)) {\r\n <span class=\"c-token-sep\">:</span>\r\n }\r\n @if (!isNoDataOperator(_op)) {\r\n @if (_field.kind === 'boolean') {\r\n @if (isEditingValue(i)) {\r\n <span class=\"c-token-value c-token-value-edit\">\r\n <ng-container *ngTemplateOutlet=\"valueEditor; context: { field: _field, data: _data, isMulti: isMultiOperator(_op), change: setEditDraftFn(), enter: commitEditDraftFn(i), autoId: inlineAutoId(i, 'value') }\"></ng-container>\r\n </span>\r\n } @else {\r\n <button type=\"button\" class=\"c-token-value\" (click)=\"beginEditValue(i)\">{{ chipValueText(filter) }}</button>\r\n }\r\n } @else if ((_field.kind === 'date' || _field.kind === 'datetime') && _op === 'BETWEEN') {\r\n <!-- why: chip BETWEEN date/datetime đã commit -> render 2 picker inline cho phép sửa từng đầu -->\r\n <span class=\"c-token-value c-token-value-edit\">\r\n @if (_field.kind === 'date') {\r\n <sd-date bare size=\"sm\" placeholder=\"Từ\"\r\n [autoId]=\"inlineAutoId(i, 'value-from')\"\r\n [model]=\"$any(_data)?.from\"\r\n (sdChange)=\"setFilterRangeFrom(i, $any($event))\"></sd-date>\r\n <span class=\"c-token-dash\" aria-hidden=\"true\">—</span>\r\n <sd-date bare size=\"sm\" placeholder=\"Đến\"\r\n [autoId]=\"inlineAutoId(i, 'value-to')\"\r\n [model]=\"$any(_data)?.to\"\r\n (sdChange)=\"setFilterRangeTo(i, $any($event))\"></sd-date>\r\n } @else {\r\n <sd-datetime bare size=\"sm\" placeholder=\"Từ\"\r\n [autoId]=\"inlineAutoId(i, 'value-from')\"\r\n [model]=\"$any(_data)?.from\"\r\n (sdChange)=\"setFilterRangeFrom(i, $any($event))\"></sd-datetime>\r\n <span class=\"c-token-dash\" aria-hidden=\"true\">—</span>\r\n <sd-datetime bare size=\"sm\" placeholder=\"Đến\"\r\n [autoId]=\"inlineAutoId(i, 'value-to')\"\r\n [model]=\"$any(_data)?.to\"\r\n (sdChange)=\"setFilterRangeTo(i, $any($event))\"></sd-datetime>\r\n }\r\n </span>\r\n } @else if (_field.kind === 'values' || _field.kind === 'lazy-values') {\r\n @let _opt = $any(_field).option;\r\n <span\r\n class=\"c-token-value c-token-value-edit\"\r\n (click)=\"beginEditValue(i)\"\r\n (focusout)=\"onChipValueFocusOut(i, $event)\">\r\n <sd-select bare size=\"sm\" minWidthPanel=\"220px\"\r\n [autoId]=\"inlineAutoId(i, 'value')\"\r\n [items]=\"_field.kind === 'lazy-values' ? lazyItemsFor(_field) : $any(_opt.items)\"\r\n [valueField]=\"_opt.valueField\"\r\n [displayField]=\"_opt.displayField\"\r\n [multiple]=\"isMultiOperator(_op)\"\r\n [viewed]=\"!isEditingValue(i)\"\r\n [model]=\"_data\"\r\n (sdChange)=\"isMultiOperator(_op) ? editValueFn(i)($event) : onChipSingleCommit(i, $event)\"></sd-select>\r\n </span>\r\n } @else if (_field.kind === 'date') {\r\n <span\r\n class=\"c-token-value c-token-value-edit\"\r\n (click)=\"beginEditValue(i)\"\r\n (focusout)=\"onChipValueFocusOut(i, $event)\">\r\n <sd-date bare size=\"sm\"\r\n [autoId]=\"inlineAutoId(i, 'value')\"\r\n [viewed]=\"!isEditingValue(i)\"\r\n [model]=\"_data\"\r\n (sdChange)=\"onChipSingleCommit(i, $any($event))\"></sd-date>\r\n </span>\r\n } @else if (_field.kind === 'datetime') {\r\n <span\r\n class=\"c-token-value c-token-value-edit\"\r\n (click)=\"beginEditValue(i)\"\r\n (focusout)=\"onChipValueFocusOut(i, $event)\">\r\n <sd-datetime bare size=\"sm\"\r\n [autoId]=\"inlineAutoId(i, 'value')\"\r\n [viewed]=\"!isEditingValue(i)\"\r\n [model]=\"_data\"\r\n (sdChange)=\"onChipSingleCommit(i, $any($event))\"></sd-datetime>\r\n </span>\r\n } @else {\r\n <!-- Fallback (number / other) — keep the shared editor outlet path. -->\r\n <span class=\"c-token-value c-token-value-edit\">\r\n <ng-container *ngTemplateOutlet=\"valueEditor; context: { field: _field, data: _data, isMulti: isMultiOperator(_op), change: editValueFn(i), enter: noop, autoId: inlineAutoId(i, 'value') }\"></ng-container>\r\n </span>\r\n }\r\n }\r\n <button type=\"button\" class=\"c-token-remove\" aria-label=\"Remove filter\" (click)=\"removeFilter(i)\">\r\n <mat-icon fontSet=\"material-icons-outlined\">close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n }\r\n }\r\n\r\n <!-- Building chip (in-progress) -->\r\n @if (building(); as _b) {\r\n @if (_b.step === 'value' && (_b.field.kind === 'string' || _b.field.kind === 'number')) {\r\n <!-- Seamless build chip — type straight in, no rectangle. Enter/blur commits. -->\r\n <sd-query-inline-value-chip\r\n [field]=\"_b.field\"\r\n [operator]=\"$any(_b.operator)\"\r\n [value]=\"_b.value ?? null\"\r\n [density]=\"_density\"\r\n [showOperator]=\"showOperatorOnChip()\"\r\n [autoId]=\"'qb-build-value'\"\r\n [autofocus]=\"true\"\r\n (valueChange)=\"onBuildSeamlessCommit($event)\"\r\n (remove)=\"cancelBuild()\" />\r\n } @else {\r\n <div class=\"c-token c-token-building\">\r\n <span class=\"c-token-field\">{{ _b.field.label }}</span>\r\n @if (_b.step === 'operator') {\r\n <sd-operator #buildOperator class=\"c-token-op\" [operators]=\"allowedOperatorsFor(_b.field)\" [model]=\"_b.operator\" (modelChange)=\"pickBuildOperator($any($event))\" />\r\n } @else {\r\n <sd-operator class=\"c-token-op\" [operators]=\"[$any(_b.operator)]\" [model]=\"$any(_b.operator)\" [disabled]=\"true\" />\r\n <!-- why: build value step renders the bare picker with a #bPicker ref so the\r\n build flow can auto-open its native panel; sd-select needs minWidthPanel so the\r\n narrow bare trigger still opens a readable panel. boolean keeps the editor outlet. -->\r\n @if (_b.field.kind === 'values' || _b.field.kind === 'lazy-values') {\r\n @let _bopt = $any(_b.field).option;\r\n <span class=\"c-token-value c-token-value-edit\">\r\n <sd-select #bPicker bare size=\"sm\" minWidthPanel=\"220px\" autoId=\"qb-build-value\"\r\n [items]=\"_b.field.kind === 'lazy-values' ? lazyItemsFor(_b.field) : $any(_bopt.items)\"\r\n [valueField]=\"_bopt.valueField\" [displayField]=\"_bopt.displayField\"\r\n [multiple]=\"isMultiOperator($any(_b.operator))\" [model]=\"$any(_b.value)\"\r\n (sdChange)=\"commitBuildValue($event)\"></sd-select>\r\n </span>\r\n } @else if (_b.field.kind === 'date') {\r\n <span class=\"c-token-value c-token-value-edit\">\r\n <!-- why: BETWEEN cần 2 picker (Từ / Đến); #bPicker đặt trên picker Từ để auto-open giữ hành vi cũ -->\r\n @if (_b.operator === 'BETWEEN') {\r\n <sd-date #bPicker bare size=\"sm\" autoId=\"qb-build-value-from\" placeholder=\"Từ\"\r\n [model]=\"$any(_b.value)?.from\" (sdChange)=\"setBuildRangeFrom($event)\"></sd-date>\r\n <span class=\"c-token-dash\" aria-hidden=\"true\">—</span>\r\n <sd-date bare size=\"sm\" autoId=\"qb-build-value-to\" placeholder=\"Đến\"\r\n [model]=\"$any(_b.value)?.to\" (sdChange)=\"setBuildRangeTo($event)\"></sd-date>\r\n } @else {\r\n <sd-date #bPicker bare size=\"sm\" autoId=\"qb-build-value\" [model]=\"$any(_b.value)\" (sdChange)=\"commitBuildValue($event)\"></sd-date>\r\n }\r\n </span>\r\n } @else if (_b.field.kind === 'datetime') {\r\n <span class=\"c-token-value c-token-value-edit\">\r\n <!-- why: BETWEEN cần 2 picker (Từ / Đến); #bPicker đặt trên picker Từ để auto-open giữ hành vi cũ -->\r\n @if (_b.operator === 'BETWEEN') {\r\n <sd-datetime #bPicker bare size=\"sm\" autoId=\"qb-build-value-from\" placeholder=\"Từ\"\r\n [model]=\"$any(_b.value)?.from\" (sdChange)=\"setBuildRangeFrom($event)\"></sd-datetime>\r\n <span class=\"c-token-dash\" aria-hidden=\"true\">—</span>\r\n <sd-datetime bare size=\"sm\" autoId=\"qb-build-value-to\" placeholder=\"Đến\"\r\n [model]=\"$any(_b.value)?.to\" (sdChange)=\"setBuildRangeTo($event)\"></sd-datetime>\r\n } @else {\r\n <sd-datetime #bPicker bare size=\"sm\" autoId=\"qb-build-value\" [model]=\"$any(_b.value)\" (sdChange)=\"commitBuildValue($event)\"></sd-datetime>\r\n }\r\n </span>\r\n } @else {\r\n <span class=\"c-token-value c-token-value-edit\">\r\n <ng-container *ngTemplateOutlet=\"valueEditor; context: { field: _b.field, data: _b.value ?? null, isMulti: isMultiOperator($any(_b.operator)), change: setBuildDraftFn(), enter: commitBuildDraftFn(), autoId: 'qb-build-value' }\"></ng-container>\r\n </span>\r\n }\r\n }\r\n <button type=\"button\" class=\"c-token-remove\" aria-label=\"Cancel\" (click)=\"cancelBuild()\">\r\n <mat-icon fontSet=\"material-icons-outlined\">close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n }\r\n\r\n <!-- Add filter -->\r\n <button\r\n type=\"button\"\r\n class=\"c-add-filter\"\r\n [matMenuTriggerFor]=\"fieldPicker\"\r\n [disabled]=\"_fields.length === 0 || _used.size >= _fields.length\"\r\n [matTooltip]=\"_fields.length === 0 ? 'Chưa cấu hình fields' : 'Thêm filter'\">\r\n <mat-icon fontSet=\"material-icons-outlined\">add</mat-icon>\r\n </button>\r\n } @else {\r\n <!-- ===== POPOVER MODE (default) — compact chips edited via mat-menu ===== -->\r\n @for (filter of _filters; track $index; let i = $index) {\r\n @if (_showOr && i > 0) {\r\n <span class=\"c-or-connector\" aria-hidden=\"true\">OR</span>\r\n }\r\n @let _field = fieldByKey()[$any(filter).field];\r\n @let _active = isFilterActive(filter);\r\n <!-- why: div[role=button] (not <button>) so the operator can render as a nested\r\n <sd-operator> — matching inline chips. A button cannot legally contain a button. -->\r\n <div\r\n #chipTrigger=\"matMenuTrigger\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n class=\"c-chip\"\r\n [class.c-chip-active]=\"_active\"\r\n [class.c-chip-inactive]=\"!_active\"\r\n [attr.data-field]=\"$any(filter).field\"\r\n [matTooltip]=\"_field?.label || $any(filter).field\"\r\n [matMenuTriggerFor]=\"chipPopover\"\r\n [matMenuTriggerData]=\"{ index: i }\"\r\n (menuOpened)=\"openChipPopover(i)\"\r\n (menuClosed)=\"commitChipEditOnClose()\"\r\n (keydown.enter)=\"chipTrigger.openMenu()\"\r\n (keydown.space)=\"$event.preventDefault(); chipTrigger.openMenu()\">\r\n <mat-icon class=\"c-chip-icon\" fontSet=\"material-icons-outlined\">\r\n {{ _field ? iconFor(_field) : 'tune' }}\r\n </mat-icon>\r\n <span class=\"c-chip-label\">{{ _field?.label || $any(filter).field }}</span>\r\n\r\n @if (showOperatorOnChip() && _active) {\r\n <sd-operator class=\"c-chip-operator\" [operators]=\"[$any(filter.operator)]\" [model]=\"$any(filter.operator)\" [disabled]=\"true\" />\r\n } @else if (_active) {\r\n <span class=\"c-chip-sep\">:</span>\r\n }\r\n\r\n @if (_active) {\r\n <span class=\"c-chip-value\">{{ chipValueText(filter) }}</span>\r\n }\r\n\r\n <mat-icon class=\"c-chip-chevron\" fontSet=\"material-icons-outlined\">arrow_drop_down</mat-icon>\r\n\r\n @if (_active) {\r\n <span\r\n role=\"button\"\r\n tabindex=\"0\"\r\n class=\"c-chip-remove\"\r\n aria-label=\"Remove filter\"\r\n (click)=\"$event.stopPropagation(); removeFilter(i)\"\r\n (keydown.enter)=\"$event.stopPropagation(); removeFilter(i)\">\r\n <mat-icon fontSet=\"material-icons-outlined\">close</mat-icon>\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Add filter trigger -->\r\n <button\r\n type=\"button\"\r\n class=\"c-add-filter\"\r\n [matMenuTriggerFor]=\"fieldPicker\"\r\n [disabled]=\"_fields.length === 0 || _used.size >= _fields.length\"\r\n [matTooltip]=\"_fields.length === 0 ? 'Chưa cấu hình fields' : 'Thêm filter'\">\r\n <mat-icon fontSet=\"material-icons-outlined\">add</mat-icon>\r\n </button>\r\n }\r\n\r\n </div><!-- /.c-query-bar__main -->\r\n\r\n <!-- Field picker — list available fields, fade ones already in use -->\r\n <mat-menu #fieldPicker=\"matMenu\" xPosition=\"after\" yPosition=\"below\" class=\"c-field-picker-menu\">\r\n @for (field of _fields; track $index) {\r\n @let _isUsed = _used.has($any(field.key));\r\n <button\r\n type=\"button\"\r\n mat-menu-item\r\n [disabled]=\"_isUsed || field.disabled\"\r\n (click)=\"mode() === 'inline' ? beginBuild(field) : addFilter(field)\">\r\n <mat-icon fontSet=\"material-icons-outlined\" class=\"c-field-item-icon\">\r\n {{ iconFor(field) }}\r\n </mat-icon>\r\n <span class=\"c-field-item-label\">{{ field.label }}</span>\r\n <span class=\"c-field-item-kind\">{{ field.kind }}</span>\r\n @if (_isUsed) {\r\n <mat-icon class=\"c-field-item-check\" fontSet=\"material-icons-outlined\">check</mat-icon>\r\n }\r\n </button>\r\n } @empty {\r\n <div class=\"c-field-empty\">Chưa có field nào được cấu hình.</div>\r\n }\r\n </mat-menu>\r\n\r\n <!-- Vertical separator between the wrapping filter area (left) and the pinned toolbar. -->\r\n <span class=\"c-bar-divider\" aria-hidden=\"true\"></span>\r\n\r\n <!-- Action toolbar — pinned top-right; never drifts with the filter rows. -->\r\n <div class=\"c-query-bar__actions\">\r\n <!-- AND / OR toggle -->\r\n @if (showLogicToggle() && _filters.length >= 2) {\r\n <div class=\"c-logic-toggle\" role=\"group\" aria-label=\"Logic operator\">\r\n <button\r\n type=\"button\"\r\n class=\"c-logic-segment\"\r\n [class.c-logic-active]=\"_logic === 'AND'\"\r\n (click)=\"setLogic('AND')\">\r\n AND\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"c-logic-segment\"\r\n [class.c-logic-active]=\"_logic === 'OR'\"\r\n (click)=\"setLogic('OR')\">\r\n OR\r\n </button>\r\n </div>\r\n }\r\n\r\n <!-- Saved views (placeholder — wire in next iteration) -->\r\n @if (showSavedViews()) {\r\n <button type=\"button\" class=\"c-saved-views\" disabled matTooltip=\"Saved views\">\r\n <mat-icon fontSet=\"material-icons-outlined\">bookmark_border</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- Clear all — compact icon + tooltip -->\r\n @if (showClearAll() && _filters.length > 0) {\r\n <button\r\n type=\"button\"\r\n class=\"c-clear-all\"\r\n [matTooltip]=\"'Xóa tất cả (' + _filters.length + ')'\"\r\n (click)=\"clearAll()\">\r\n <mat-icon fontSet=\"material-icons-outlined\">delete_sweep</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- Search — the single deferred trigger for both modes. why: far-right placement\r\n mirrors the conventional \"submit at the end of the toolbar\" reading order. -->\r\n <button\r\n type=\"button\"\r\n class=\"c-search-trigger\"\r\n [disabled]=\"!canSearch()\"\r\n matTooltip=\"Tìm kiếm\"\r\n (click)=\"triggerApply()\">\r\n <mat-icon fontSet=\"material-icons-outlined\">search</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3"],"mappings":"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"}
@@ -60,10 +60,10 @@ class SdQueryBuilder {
60
60
  removeItem(parentGroup, index) {
61
61
  parentGroup.rules.splice(index, 1);
62
62
  }
63
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdQueryBuilder, deps: [], target: i0.ɵɵFactoryTarget.Component });
64
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: SdQueryBuilder, isStandalone: true, selector: "sd-query-builder", inputs: { group: "group" }, outputs: { groupChange: "groupChange" }, host: { listeners: { "document:click": "closeAll()" } }, ngImport: i0, template: "<div class=\"qb-container\">\r\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: group, isRoot: true }\"></ng-container>\r\n</div>\r\n\r\n<ng-template #groupTemplate let-group let-isRoot=\"isRoot\" let-parent=\"parent\" let-index=\"index\">\r\n <div class=\"qb-group\">\r\n \r\n <div class=\"qb-header\" [class.is-open]=\"group.isOpen\">\r\n <div class=\"qb-condition-switch\">\r\n <button type=\"button\" \r\n [class.active]=\"group.condition === 'AND'\" \r\n (click)=\"toggleCondition(group, 'AND')\">AND</button>\r\n <button type=\"button\" \r\n [class.active]=\"group.condition === 'OR'\" \r\n (click)=\"toggleCondition(group, 'OR')\">OR</button>\r\n </div>\r\n\r\n <div class=\"qb-actions\">\r\n <button type=\"button\" class=\"btn-icon btn-add\" (click)=\"toggleDropdown(group, $event)\">+</button>\r\n \r\n <div class=\"qb-dropdown\" *ngIf=\"group.isOpen\" (click)=\"$event.stopPropagation()\" aria-hidden=\"true\">\r\n <button (click)=\"addGroup(group)\">+ Add Group</button>\r\n <button (click)=\"addRule(group)\">+ Add Condition</button>\r\n </div>\r\n\r\n <button *ngIf=\"!isRoot\" type=\"button\" class=\"btn-icon btn-remove\" (click)=\"removeItem(parent, index)\">\u2715</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"qb-body\">\r\n <div class=\"qb-list\">\r\n <div *ngFor=\"let item of group.rules; let i = index\" \r\n class=\"qb-treenode\"\r\n [class.is-group]=\"isGroup(item)\"\r\n [class.is-rule]=\"!isGroup(item)\">\r\n \r\n <ng-container *ngIf=\"!isGroup(item)\">\r\n <div class=\"qb-rule-card\">\r\n <div class=\"form-row\">\r\n <input class=\"form-input field-input\" [(ngModel)]=\"item.field\" placeholder=\"Select Field\">\r\n <ng-container *ngIf=\"item.field\">\r\n <div class=\"divider\"></div>\r\n <select class=\"form-input\" [(ngModel)]=\"item.operator\">\r\n <option value=\"Equal\">Equal</option>\r\n <option value=\"Not Equal\">Not Equal</option>\r\n </select>\r\n <div class=\"divider\"></div>\r\n <input class=\"form-input\" [(ngModel)]=\"item.value\" placeholder=\"Value\">\r\n </ng-container>\r\n <button type=\"button\" class=\"btn-icon btn-remove-rule\" (click)=\"removeItem(group, i)\">\u2715</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"isGroup(item)\">\r\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: item, isRoot: false, parent: group, index: i }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</ng-template>", styles: [":host{display:block;font-family:Segoe UI,Roboto,sans-serif;font-size:14px;color:#333}.qb-container{padding:20px;background:#fff}.qb-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;position:relative;z-index:1}.qb-header.is-open{z-index:1000}.qb-condition-switch{display:inline-flex;border-radius:4px;overflow:hidden;background:#fff;border:1px solid #e0e0e0;height:32px}.qb-condition-switch button{border:none;background:transparent;padding:0 16px;font-weight:600;font-size:13px;cursor:pointer;color:#666;height:100%}.qb-condition-switch button.active{background:#6246a8;color:#fff}.qb-condition-switch button:hover:not(.active){background:#f5f5f5}.qb-actions{position:relative;display:flex;gap:4px}.qb-body{padding-left:28px}.qb-list{position:relative}.qb-treenode{position:relative;padding-left:24px;margin-bottom:12px}.qb-treenode:before{content:\"\";position:absolute;left:0;top:-12px;bottom:0;width:1px;border-left:1px dashed #c4c4c4}.qb-treenode:after{content:\"\";position:absolute;left:0;width:24px;height:1px;border-top:1px dashed #c4c4c4}.qb-treenode:first-child:before{top:-14px;height:calc(100% + 14px)}.qb-treenode.is-group:after{top:16px}.qb-treenode.is-group:last-child:before{height:auto;bottom:auto;top:-14px;height:30px}.qb-treenode.is-rule:after{top:26px}.qb-treenode.is-rule:last-child:before{height:auto;bottom:auto;top:-14px;height:40px}.qb-rule-card{background:#fafafa;border:1px solid #e0e0e0;border-radius:4px;padding:10px 12px;transition:.2s}.qb-rule-card:hover{border-color:#ccc}.form-row{display:flex;align-items:center;gap:12px;height:32px}.form-input{border:none;background:transparent;font-size:14px;color:#333;outline:none;height:100%}.form-input::placeholder{color:#aaa}.divider{width:1px;height:20px;background:#ddd}.btn-icon{background:transparent;border:none;cursor:pointer;font-size:18px;color:#666;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px}.btn-icon:hover{background:#f0f0f0;color:#6246a8}.btn-remove{color:#999}.btn-remove:hover{color:#d32f2f;background:#ffebee}.btn-remove-rule{margin-left:auto;color:#999}.btn-remove-rule:hover{color:#d32f2f;background:none}.qb-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e0e0e0;box-shadow:0 4px 12px #00000026;border-radius:4px;min-width:160px;z-index:100}.qb-dropdown button{display:block;width:100%;text-align:left;background:none;border:none;padding:10px 14px;cursor:pointer;font-size:13px;color:#333}.qb-dropdown button:hover{background:#f3f0fa;color:#6246a8}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
63
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdQueryBuilder, deps: [], target: i0.ɵɵFactoryTarget.Component });
64
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.21", type: SdQueryBuilder, isStandalone: true, selector: "sd-query-builder", inputs: { group: "group" }, outputs: { groupChange: "groupChange" }, host: { listeners: { "document:click": "closeAll()" } }, ngImport: i0, template: "<div class=\"qb-container\">\r\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: group, isRoot: true }\"></ng-container>\r\n</div>\r\n\r\n<ng-template #groupTemplate let-group let-isRoot=\"isRoot\" let-parent=\"parent\" let-index=\"index\">\r\n <div class=\"qb-group\">\r\n \r\n <div class=\"qb-header\" [class.is-open]=\"group.isOpen\">\r\n <div class=\"qb-condition-switch\">\r\n <button type=\"button\" \r\n [class.active]=\"group.condition === 'AND'\" \r\n (click)=\"toggleCondition(group, 'AND')\">AND</button>\r\n <button type=\"button\" \r\n [class.active]=\"group.condition === 'OR'\" \r\n (click)=\"toggleCondition(group, 'OR')\">OR</button>\r\n </div>\r\n\r\n <div class=\"qb-actions\">\r\n <button type=\"button\" class=\"btn-icon btn-add\" (click)=\"toggleDropdown(group, $event)\">+</button>\r\n \r\n <div class=\"qb-dropdown\" *ngIf=\"group.isOpen\" (click)=\"$event.stopPropagation()\" aria-hidden=\"true\">\r\n <button (click)=\"addGroup(group)\">+ Add Group</button>\r\n <button (click)=\"addRule(group)\">+ Add Condition</button>\r\n </div>\r\n\r\n <button *ngIf=\"!isRoot\" type=\"button\" class=\"btn-icon btn-remove\" (click)=\"removeItem(parent, index)\">\u2715</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"qb-body\">\r\n <div class=\"qb-list\">\r\n <div *ngFor=\"let item of group.rules; let i = index\" \r\n class=\"qb-treenode\"\r\n [class.is-group]=\"isGroup(item)\"\r\n [class.is-rule]=\"!isGroup(item)\">\r\n \r\n <ng-container *ngIf=\"!isGroup(item)\">\r\n <div class=\"qb-rule-card\">\r\n <div class=\"form-row\">\r\n <input class=\"form-input field-input\" [(ngModel)]=\"item.field\" placeholder=\"Select Field\">\r\n <ng-container *ngIf=\"item.field\">\r\n <div class=\"divider\"></div>\r\n <select class=\"form-input\" [(ngModel)]=\"item.operator\">\r\n <option value=\"Equal\">Equal</option>\r\n <option value=\"Not Equal\">Not Equal</option>\r\n </select>\r\n <div class=\"divider\"></div>\r\n <input class=\"form-input\" [(ngModel)]=\"item.value\" placeholder=\"Value\">\r\n </ng-container>\r\n <button type=\"button\" class=\"btn-icon btn-remove-rule\" (click)=\"removeItem(group, i)\">\u2715</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"isGroup(item)\">\r\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: item, isRoot: false, parent: group, index: i }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</ng-template>", styles: [":host{display:block;font-family:Segoe UI,Roboto,sans-serif;font-size:14px;color:#333}.qb-container{padding:20px;background:#fff}.qb-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;position:relative;z-index:1}.qb-header.is-open{z-index:1000}.qb-condition-switch{display:inline-flex;border-radius:4px;overflow:hidden;background:#fff;border:1px solid #e0e0e0;height:32px}.qb-condition-switch button{border:none;background:transparent;padding:0 16px;font-weight:600;font-size:13px;cursor:pointer;color:#666;height:100%}.qb-condition-switch button.active{background:#6246a8;color:#fff}.qb-condition-switch button:hover:not(.active){background:#f5f5f5}.qb-actions{position:relative;display:flex;gap:4px}.qb-body{padding-left:28px}.qb-list{position:relative}.qb-treenode{position:relative;padding-left:24px;margin-bottom:12px}.qb-treenode:before{content:\"\";position:absolute;left:0;top:-12px;bottom:0;width:1px;border-left:1px dashed #c4c4c4}.qb-treenode:after{content:\"\";position:absolute;left:0;width:24px;height:1px;border-top:1px dashed #c4c4c4}.qb-treenode:first-child:before{top:-14px;height:calc(100% + 14px)}.qb-treenode.is-group:after{top:16px}.qb-treenode.is-group:last-child:before{height:auto;bottom:auto;top:-14px;height:30px}.qb-treenode.is-rule:after{top:26px}.qb-treenode.is-rule:last-child:before{height:auto;bottom:auto;top:-14px;height:40px}.qb-rule-card{background:#fafafa;border:1px solid #e0e0e0;border-radius:4px;padding:10px 12px;transition:.2s}.qb-rule-card:hover{border-color:#ccc}.form-row{display:flex;align-items:center;gap:12px;height:32px}.form-input{border:none;background:transparent;font-size:14px;color:#333;outline:none;height:100%}.form-input::placeholder{color:#aaa}.divider{width:1px;height:20px;background:#ddd}.btn-icon{background:transparent;border:none;cursor:pointer;font-size:18px;color:#666;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px}.btn-icon:hover{background:#f0f0f0;color:#6246a8}.btn-remove{color:#999}.btn-remove:hover{color:#d32f2f;background:#ffebee}.btn-remove-rule{margin-left:auto;color:#999}.btn-remove-rule:hover{color:#d32f2f;background:none}.qb-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e0e0e0;box-shadow:0 4px 12px #00000026;border-radius:4px;min-width:160px;z-index:100}.qb-dropdown button{display:block;width:100%;text-align:left;background:none;border:none;padding:10px 14px;cursor:pointer;font-size:13px;color:#333}.qb-dropdown button:hover{background:#f3f0fa;color:#6246a8}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
65
65
  }
66
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdQueryBuilder, decorators: [{
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdQueryBuilder, decorators: [{
67
67
  type: Component,
68
68
  args: [{ selector: 'sd-query-builder', standalone: true, imports: [CommonModule, FormsModule], template: "<div class=\"qb-container\">\r\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: group, isRoot: true }\"></ng-container>\r\n</div>\r\n\r\n<ng-template #groupTemplate let-group let-isRoot=\"isRoot\" let-parent=\"parent\" let-index=\"index\">\r\n <div class=\"qb-group\">\r\n \r\n <div class=\"qb-header\" [class.is-open]=\"group.isOpen\">\r\n <div class=\"qb-condition-switch\">\r\n <button type=\"button\" \r\n [class.active]=\"group.condition === 'AND'\" \r\n (click)=\"toggleCondition(group, 'AND')\">AND</button>\r\n <button type=\"button\" \r\n [class.active]=\"group.condition === 'OR'\" \r\n (click)=\"toggleCondition(group, 'OR')\">OR</button>\r\n </div>\r\n\r\n <div class=\"qb-actions\">\r\n <button type=\"button\" class=\"btn-icon btn-add\" (click)=\"toggleDropdown(group, $event)\">+</button>\r\n \r\n <div class=\"qb-dropdown\" *ngIf=\"group.isOpen\" (click)=\"$event.stopPropagation()\" aria-hidden=\"true\">\r\n <button (click)=\"addGroup(group)\">+ Add Group</button>\r\n <button (click)=\"addRule(group)\">+ Add Condition</button>\r\n </div>\r\n\r\n <button *ngIf=\"!isRoot\" type=\"button\" class=\"btn-icon btn-remove\" (click)=\"removeItem(parent, index)\">\u2715</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"qb-body\">\r\n <div class=\"qb-list\">\r\n <div *ngFor=\"let item of group.rules; let i = index\" \r\n class=\"qb-treenode\"\r\n [class.is-group]=\"isGroup(item)\"\r\n [class.is-rule]=\"!isGroup(item)\">\r\n \r\n <ng-container *ngIf=\"!isGroup(item)\">\r\n <div class=\"qb-rule-card\">\r\n <div class=\"form-row\">\r\n <input class=\"form-input field-input\" [(ngModel)]=\"item.field\" placeholder=\"Select Field\">\r\n <ng-container *ngIf=\"item.field\">\r\n <div class=\"divider\"></div>\r\n <select class=\"form-input\" [(ngModel)]=\"item.operator\">\r\n <option value=\"Equal\">Equal</option>\r\n <option value=\"Not Equal\">Not Equal</option>\r\n </select>\r\n <div class=\"divider\"></div>\r\n <input class=\"form-input\" [(ngModel)]=\"item.value\" placeholder=\"Value\">\r\n </ng-container>\r\n <button type=\"button\" class=\"btn-icon btn-remove-rule\" (click)=\"removeItem(group, i)\">\u2715</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"isGroup(item)\">\r\n <ng-container *ngTemplateOutlet=\"groupTemplate; context: { $implicit: item, isRoot: false, parent: group, index: i }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</ng-template>", styles: [":host{display:block;font-family:Segoe UI,Roboto,sans-serif;font-size:14px;color:#333}.qb-container{padding:20px;background:#fff}.qb-header{display:flex;align-items:center;gap:8px;margin-bottom:12px;position:relative;z-index:1}.qb-header.is-open{z-index:1000}.qb-condition-switch{display:inline-flex;border-radius:4px;overflow:hidden;background:#fff;border:1px solid #e0e0e0;height:32px}.qb-condition-switch button{border:none;background:transparent;padding:0 16px;font-weight:600;font-size:13px;cursor:pointer;color:#666;height:100%}.qb-condition-switch button.active{background:#6246a8;color:#fff}.qb-condition-switch button:hover:not(.active){background:#f5f5f5}.qb-actions{position:relative;display:flex;gap:4px}.qb-body{padding-left:28px}.qb-list{position:relative}.qb-treenode{position:relative;padding-left:24px;margin-bottom:12px}.qb-treenode:before{content:\"\";position:absolute;left:0;top:-12px;bottom:0;width:1px;border-left:1px dashed #c4c4c4}.qb-treenode:after{content:\"\";position:absolute;left:0;width:24px;height:1px;border-top:1px dashed #c4c4c4}.qb-treenode:first-child:before{top:-14px;height:calc(100% + 14px)}.qb-treenode.is-group:after{top:16px}.qb-treenode.is-group:last-child:before{height:auto;bottom:auto;top:-14px;height:30px}.qb-treenode.is-rule:after{top:26px}.qb-treenode.is-rule:last-child:before{height:auto;bottom:auto;top:-14px;height:40px}.qb-rule-card{background:#fafafa;border:1px solid #e0e0e0;border-radius:4px;padding:10px 12px;transition:.2s}.qb-rule-card:hover{border-color:#ccc}.form-row{display:flex;align-items:center;gap:12px;height:32px}.form-input{border:none;background:transparent;font-size:14px;color:#333;outline:none;height:100%}.form-input::placeholder{color:#aaa}.divider{width:1px;height:20px;background:#ddd}.btn-icon{background:transparent;border:none;cursor:pointer;font-size:18px;color:#666;width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:4px}.btn-icon:hover{background:#f0f0f0;color:#6246a8}.btn-remove{color:#999}.btn-remove:hover{color:#d32f2f;background:#ffebee}.btn-remove-rule{margin-left:auto;color:#999}.btn-remove-rule:hover{color:#d32f2f;background:none}.qb-dropdown{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e0e0e0;box-shadow:0 4px 12px #00000026;border-radius:4px;min-width:160px;z-index:100}.qb-dropdown button{display:block;width:100%;text-align:left;background:none;border:none;padding:10px 14px;cursor:pointer;font-size:13px;color:#333}.qb-dropdown button:hover{background:#f3f0fa;color:#6246a8}\n"] }]
69
69
  }], propDecorators: { group: [{
@@ -1,29 +1,18 @@
1
- import { CommonModule } from '@angular/common';
2
1
  import * as i0 from '@angular/core';
3
- import { Input, Component } from '@angular/core';
2
+ import { input, booleanAttribute, ChangeDetectionStrategy, Component } from '@angular/core';
4
3
 
5
4
  class SdQuickAction {
6
- isOpened = false;
7
- set _isOpened(isOpened) {
8
- this.isOpened = !!isOpened;
9
- }
10
- constructor() { }
11
- open = () => {
12
- this.isOpened = true;
13
- };
14
- close = () => {
15
- this.isOpened = false;
16
- };
17
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdQuickAction, deps: [], target: i0.ɵɵFactoryTarget.Component });
18
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: SdQuickAction, isStandalone: true, selector: "sd-quick-action", inputs: { _isOpened: ["isOpened", "_isOpened"] }, ngImport: i0, template: "<div class=\"c-quick-action d-flex align-items-center\" [class.active]=\"isOpened\">\n <div class=\"mr-16 text-grey\">\n <ng-content select=\"[sdMessage]\"></ng-content>\n </div>\n <ng-content select=\"[sdAction]\"></ng-content>\n</div>\n", styles: [".c-quick-action{box-shadow:0 .4px .8px #0000001a,0 3px 6px #0003;border-radius:4px;position:fixed;min-width:400px;width:max-content;background-color:#fff;bottom:90px;left:0;right:0;margin:auto;visibility:hidden;opacity:0;pointer-events:none;transition:all .2s ease-in-out;transform:translate3d(0,100%,0);z-index:99}.c-quick-action.active{transform:translateZ(0);opacity:1;visibility:visible;pointer-events:all}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
5
+ /**
6
+ * Toggle visibility of the floating toolbar. Bare attribute = true.
7
+ */
8
+ opened = input(false, { transform: booleanAttribute });
9
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdQuickAction, deps: [], target: i0.ɵɵFactoryTarget.Component });
10
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.21", type: SdQuickAction, isStandalone: true, selector: "sd-quick-action", inputs: { opened: { classPropertyName: "opened", publicName: "opened", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"c-quick-action d-flex align-items-center\" [class.active]=\"opened()\">\n <div class=\"c-quick-action-message T14R\">\n <ng-content select=\"[sdMessage]\"></ng-content>\n </div>\n <div class=\"c-quick-action-action\">\n <ng-content select=\"[sdAction]\"></ng-content>\n </div>\n</div>\n", styles: [".c-quick-action{box-shadow:0 .4px .8px #0000001a,0 3px 6px #0003;border-radius:8px;position:fixed;width:max-content;max-width:min(90vw,720px);background-color:#fff;bottom:90px;left:0;right:0;margin:auto;visibility:hidden;opacity:0;pointer-events:none;transition:transform .2s ease-in-out,opacity .2s ease-in-out,visibility .2s ease-in-out;transform:translate3d(0,100%,0);z-index:99;gap:16px}.c-quick-action.active{transform:translateZ(0);opacity:1;visibility:visible;pointer-events:all}.c-quick-action-message{flex:1 1 auto;min-width:0}.c-quick-action-action{flex:0 0 auto;display:flex;align-items:center}.c-quick-action:has(.c-quick-action-action:empty){gap:0;padding-right:16px}.c-quick-action-action:empty{display:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
19
11
  }
20
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdQuickAction, decorators: [{
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdQuickAction, decorators: [{
21
13
  type: Component,
22
- args: [{ selector: 'sd-quick-action', standalone: true, imports: [CommonModule], template: "<div class=\"c-quick-action d-flex align-items-center\" [class.active]=\"isOpened\">\n <div class=\"mr-16 text-grey\">\n <ng-content select=\"[sdMessage]\"></ng-content>\n </div>\n <ng-content select=\"[sdAction]\"></ng-content>\n</div>\n", styles: [".c-quick-action{box-shadow:0 .4px .8px #0000001a,0 3px 6px #0003;border-radius:4px;position:fixed;min-width:400px;width:max-content;background-color:#fff;bottom:90px;left:0;right:0;margin:auto;visibility:hidden;opacity:0;pointer-events:none;transition:all .2s ease-in-out;transform:translate3d(0,100%,0);z-index:99}.c-quick-action.active{transform:translateZ(0);opacity:1;visibility:visible;pointer-events:all}\n"] }]
23
- }], ctorParameters: () => [], propDecorators: { _isOpened: [{
24
- type: Input,
25
- args: ['isOpened']
26
- }] } });
14
+ args: [{ selector: 'sd-quick-action', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"c-quick-action d-flex align-items-center\" [class.active]=\"opened()\">\n <div class=\"c-quick-action-message T14R\">\n <ng-content select=\"[sdMessage]\"></ng-content>\n </div>\n <div class=\"c-quick-action-action\">\n <ng-content select=\"[sdAction]\"></ng-content>\n </div>\n</div>\n", styles: [".c-quick-action{box-shadow:0 .4px .8px #0000001a,0 3px 6px #0003;border-radius:8px;position:fixed;width:max-content;max-width:min(90vw,720px);background-color:#fff;bottom:90px;left:0;right:0;margin:auto;visibility:hidden;opacity:0;pointer-events:none;transition:transform .2s ease-in-out,opacity .2s ease-in-out,visibility .2s ease-in-out;transform:translate3d(0,100%,0);z-index:99;gap:16px}.c-quick-action.active{transform:translateZ(0);opacity:1;visibility:visible;pointer-events:all}.c-quick-action-message{flex:1 1 auto;min-width:0}.c-quick-action-action{flex:0 0 auto;display:flex;align-items:center}.c-quick-action:has(.c-quick-action-action:empty){gap:0;padding-right:16px}.c-quick-action-action:empty{display:none}\n"] }]
15
+ }] });
27
16
 
28
17
  /**
29
18
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"sd-angular-core-components-quick-action.mjs","sources":["../../../projects/sd-angular/components/quick-action/src/quick-action.component.ts","../../../projects/sd-angular/components/quick-action/src/quick-action.component.html","../../../projects/sd-angular/components/quick-action/sd-angular-core-components-quick-action.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'sd-quick-action',\n templateUrl: './quick-action.component.html',\n styleUrls: ['./quick-action.component.scss'],\n standalone: true,\n imports: [CommonModule],\n})\nexport class SdQuickAction {\n isOpened = false;\n @Input('isOpened') set _isOpened(isOpened: '' | boolean | undefined | null) {\n this.isOpened = !!isOpened;\n }\n constructor() {}\n open = () => {\n this.isOpened = true;\n };\n\n close = () => {\n this.isOpened = false;\n };\n}\n","<div class=\"c-quick-action d-flex align-items-center\" [class.active]=\"isOpened\">\n <div class=\"mr-16 text-grey\">\n <ng-content select=\"[sdMessage]\"></ng-content>\n </div>\n <ng-content select=\"[sdAction]\"></ng-content>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAUa,aAAa,CAAA;IACxB,QAAQ,GAAG,KAAK;IAChB,IAAuB,SAAS,CAAC,QAAyC,EAAA;AACxE,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ;IAC5B;AACA,IAAA,WAAA,GAAA,EAAe;IACf,IAAI,GAAG,MAAK;AACV,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACtB,IAAA,CAAC;IAED,KAAK,GAAG,MAAK;AACX,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACvB,IAAA,CAAC;wGAZU,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,CAAA,UAAA,EAAA,WAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECV1B,sPAMA,EAAA,MAAA,EAAA,CAAA,8ZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEY,YAAY,EAAA,CAAA,EAAA,CAAA;;4FAEX,aAAa,EAAA,UAAA,EAAA,CAAA;kBAPzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EAGf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,sPAAA,EAAA,MAAA,EAAA,CAAA,8ZAAA,CAAA,EAAA;wDAIA,SAAS,EAAA,CAAA;sBAA/B,KAAK;uBAAC,UAAU;;;AEZnB;;AAEG;;;;"}
1
+ {"version":3,"file":"sd-angular-core-components-quick-action.mjs","sources":["../../../projects/sd-angular/components/quick-action/src/quick-action.component.ts","../../../projects/sd-angular/components/quick-action/src/quick-action.component.html","../../../projects/sd-angular/components/quick-action/sd-angular-core-components-quick-action.ts"],"sourcesContent":["import { booleanAttribute, ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n@Component({\n selector: 'sd-quick-action',\n templateUrl: './quick-action.component.html',\n styleUrls: ['./quick-action.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdQuickAction {\n /**\n * Toggle visibility of the floating toolbar. Bare attribute = true.\n */\n readonly opened = input(false, { transform: booleanAttribute });\n}\n","<div class=\"c-quick-action d-flex align-items-center\" [class.active]=\"opened()\">\n <div class=\"c-quick-action-message T14R\">\n <ng-content select=\"[sdMessage]\"></ng-content>\n </div>\n <div class=\"c-quick-action-action\">\n <ng-content select=\"[sdAction]\"></ng-content>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;MASa,aAAa,CAAA;AACxB;;AAEG;IACM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;wGAJpD,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,kNCT1B,uTAQA,EAAA,MAAA,EAAA,CAAA,stBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FDCa,aAAa,EAAA,UAAA,EAAA,CAAA;kBAPzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EAGf,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,uTAAA,EAAA,MAAA,EAAA,CAAA,stBAAA,CAAA,EAAA;;;AEPjD;;AAEG;;;;"}