@sdcorejs/angular 19.1.6 → 19.2.1

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 (374) hide show
  1. package/README.md +10 -0
  2. package/assets/scss/core/menu.scss +18 -0
  3. package/assets/scss/core/utilities/_misc.scss +15 -0
  4. package/assets/scss/sd-core.scss +1 -0
  5. package/components/anchor/src/components/anchor/anchor.component.d.ts +3 -1
  6. package/components/api-contract-builder/index.d.ts +8 -0
  7. package/components/api-contract-builder/src/api-contract-builder.component.d.ts +123 -0
  8. package/components/api-contract-builder/src/api-contract.configuration.d.ts +41 -0
  9. package/components/api-contract-builder/src/api-contract.expression.d.ts +43 -0
  10. package/components/api-contract-builder/src/api-contract.model.d.ts +167 -0
  11. package/components/api-contract-builder/src/api-contract.samples.d.ts +25 -0
  12. package/components/api-contract-builder/src/api-contract.schema.d.ts +126 -0
  13. package/components/api-contract-builder/src/api-contract.serializer.d.ts +17 -0
  14. package/components/api-contract-builder/src/api-contract.validation.d.ts +12 -0
  15. package/components/api-contract-builder/src/components/api-contract-diagnostic-list.component.d.ts +18 -0
  16. package/components/api-contract-builder/src/components/api-contract-node-drawer.component.d.ts +130 -0
  17. package/components/api-contract-builder/src/components/api-contract-node-editor.component.d.ts +35 -0
  18. package/components/api-contract-builder/src/components/api-contract-node-summary.component.d.ts +41 -0
  19. package/components/api-contract-builder/src/components/api-contract-record-editor.component.d.ts +36 -0
  20. package/components/api-contract-builder/src/components/api-contract-source-editor.component.d.ts +86 -0
  21. package/components/api-contract-builder/src/components/api-contract-suggestion.model.d.ts +17 -0
  22. package/components/badge/src/badge.component.d.ts +2 -0
  23. package/components/ckeditor-styles/src/ckeditor-styles.component.d.ts +1 -1
  24. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +2 -1
  25. package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +3 -1
  26. package/components/form-generic/src/components/form-render/components/item/components/checkbox/checkbox.component.d.ts +34 -0
  27. package/components/form-generic/src/components/form-render/components/item/components/index.d.ts +1 -0
  28. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +6 -1
  29. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
  30. package/components/form-generic/src/configurations/form.configuration.d.ts +1 -1
  31. package/components/form-generic/src/models/form-generic-component.model.d.ts +8 -8
  32. package/components/form-generic/src/models/form-generic-definition-selection.model.d.ts +5 -5
  33. package/components/form-generic/src/models/form-generic-expression.model.d.ts +12 -12
  34. package/components/form-generic/src/models/index.d.ts +1 -0
  35. package/components/form-generic/src/services/form-generic.service.d.ts +2 -2
  36. package/components/import-excel/src/import-excel.component.d.ts +1 -0
  37. package/components/index.d.ts +7 -1
  38. package/components/mini-editor/src/mini-editor.model.d.ts +1 -1
  39. package/components/modal/src/modal.component.d.ts +3 -2
  40. package/components/modal-resizable/src/modal-resizable.component.d.ts +92 -0
  41. package/components/modal-resizable/src/modal-resizable.registry.d.ts +22 -0
  42. package/components/org-chart/src/org-chart.component.d.ts +6 -0
  43. package/components/preview/src/preview-image/preview-image.component.d.ts +1 -0
  44. package/components/query-bar/src/components/actions-bar/actions-bar.component.d.ts +6 -2
  45. package/components/query-bar/src/components/build-chip/build-chip.component.d.ts +4 -1
  46. package/components/query-bar/src/components/chip-popover/chip-popover.component.d.ts +8 -0
  47. package/components/query-bar/src/components/field-picker/field-picker.component.d.ts +2 -0
  48. package/components/query-bar/src/components/inline-chip/inline-chip.component.d.ts +2 -0
  49. package/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.d.ts +3 -3
  50. package/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.d.ts +9 -4
  51. package/components/query-bar/src/query-bar.component.d.ts +32 -5
  52. package/components/query-bar/src/query-bar.model.d.ts +15 -12
  53. package/components/query-builder/src/query-builder.component.d.ts +76 -39
  54. package/components/query-builder/src/query-builder.model.d.ts +59 -52
  55. package/components/query-builder/src/query-builder.serializer.d.ts +15 -6
  56. package/components/section/src/section.component.d.ts +5 -0
  57. package/components/side-drawer/src/body-scroll-lock.service.d.ts +10 -0
  58. package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +1 -0
  59. package/components/tab-router/index.d.ts +2 -1
  60. package/components/tab-router/src/actions/tab-router.action.d.ts +2 -2
  61. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +2 -2
  62. package/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.d.ts +3 -3
  63. package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +3 -3
  64. package/components/tab-router/src/decorators/tab.decorator.d.ts +13 -1
  65. package/components/tab-router/src/events/tab-router.event.d.ts +3 -3
  66. package/components/tab-router/src/models/tab-router.model.d.ts +2 -2
  67. package/components/tab-router/src/pipes/tab-info.pipe.d.ts +2 -2
  68. package/components/tab-router/src/services/tab-router.service.d.ts +9 -9
  69. package/components/table/index.d.ts +1 -0
  70. package/components/table/src/components/config/config.component.d.ts +6 -1
  71. package/components/table/src/components/desktop-cell/view/view.component.d.ts +1 -0
  72. package/components/table/src/components/filter/external-filter/external-filter.component.d.ts +1 -1
  73. package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts +1 -1
  74. package/components/table/src/components/selector-action/action-filter.pipe.d.ts +8 -1
  75. package/components/table/src/components/selector-action/selector-action.component.d.ts +2 -0
  76. package/components/table/src/directives/index.d.ts +1 -0
  77. package/components/table/src/directives/sd-table-command-header-def.directive.d.ts +24 -0
  78. package/components/table/src/models/table-column.model.d.ts +30 -13
  79. package/components/table/src/models/table-item.model.d.ts +30 -1
  80. package/components/table/src/models/table-option-selector.model.d.ts +5 -4
  81. package/components/table/src/models/table-option.model.d.ts +12 -0
  82. package/components/table/src/pipes/sd-group.pipe.d.ts +6 -2
  83. package/components/table/src/services/table-filter/table-filter.model.d.ts +15 -15
  84. package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
  85. package/components/table/src/services/table-format/table-format.service.d.ts +1 -1
  86. package/components/table/src/services/table-selection/selection-action.util.d.ts +24 -0
  87. package/components/table/src/services/table-selection/table-selection.util.d.ts +31 -0
  88. package/components/table/src/services/tree/tree.util.d.ts +3 -2
  89. package/components/table/src/table.component.d.ts +51 -5
  90. package/components/tree/src/tree-item-def.directive.d.ts +1 -1
  91. package/components/tree/src/tree.component.d.ts +16 -4
  92. package/components/tree/src/tree.model.d.ts +31 -25
  93. package/components/upload-file/src/configurations/upload-file.configuration.d.ts +2 -2
  94. package/components/upload-file/src/upload-file.component.d.ts +4 -1
  95. package/configurations/src/sd-core.configuration.d.ts +1 -2
  96. package/fesm2022/sdcorejs-angular-components-anchor.mjs +36 -12
  97. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-components-api-contract-builder.mjs +3411 -0
  99. package/fesm2022/sdcorejs-angular-components-api-contract-builder.mjs.map +1 -0
  100. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
  101. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-components-badge.mjs +27 -2
  103. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  105. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
  107. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
  109. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
  111. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
  113. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
  115. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
  117. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
  119. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
  121. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
  123. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
  125. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-components-operator.mjs +2 -2
  127. package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -1
  128. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
  129. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  130. package/fesm2022/sdcorejs-angular-components-preview.mjs +27 -17
  131. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  132. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
  133. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  134. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
  135. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  136. package/fesm2022/sdcorejs-angular-components-section.mjs +33 -2
  137. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  138. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
  139. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  140. package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
  141. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  142. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
  143. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  144. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
  145. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  146. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
  147. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  148. package/fesm2022/sdcorejs-angular-components-table.mjs +555 -267
  149. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  150. package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
  151. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  152. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
  153. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  154. package/fesm2022/sdcorejs-angular-components.mjs +7 -1
  155. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  156. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
  158. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  159. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
  160. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
  162. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  163. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
  164. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  165. package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
  166. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  167. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +231 -60
  168. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  169. package/fesm2022/sdcorejs-angular-forms-date.mjs +95 -23
  170. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  171. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +130 -26
  172. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  173. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +39 -15
  174. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
  175. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
  176. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  177. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
  178. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  179. package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
  180. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  181. package/fesm2022/sdcorejs-angular-forms-models.mjs +227 -6
  182. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  183. package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
  184. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  185. package/fesm2022/sdcorejs-angular-forms-select.mjs +135 -37
  186. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  187. package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
  188. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  189. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
  190. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  191. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
  192. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
  193. package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
  194. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
  195. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
  196. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
  197. package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
  198. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  199. package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
  200. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  201. package/fesm2022/sdcorejs-angular-i18n.mjs +895 -68
  202. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  203. package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
  204. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  205. package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
  206. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  207. package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
  208. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  209. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
  210. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  211. package/fesm2022/sdcorejs-angular-modules-layout.mjs +342 -111
  212. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  213. package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
  214. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  215. package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
  216. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  217. package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
  218. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  219. package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
  220. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  221. package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
  222. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  223. package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
  224. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  225. package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
  226. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  227. package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
  228. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  229. package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
  230. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  231. package/fesm2022/sdcorejs-angular-services.mjs +0 -1
  232. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  233. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
  234. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  235. package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
  236. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  237. package/fesm2022/sdcorejs-angular.mjs +17 -10
  238. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  239. package/forms/autocomplete/src/autocomplete.component.d.ts +5 -2
  240. package/forms/chip-calendar/src/chip-calendar.component.d.ts +10 -0
  241. package/forms/date/src/date.component.d.ts +13 -2
  242. package/forms/date-range/src/date-range.component.d.ts +13 -2
  243. package/forms/datetime/src/datetime.component.d.ts +13 -2
  244. package/forms/entity-picker/src/entity-picker.component.d.ts +9 -3
  245. package/forms/input/src/input.component.d.ts +3 -0
  246. package/forms/input-color/src/input-color.component.d.ts +4 -0
  247. package/forms/input-number/src/input-number.component.d.ts +3 -0
  248. package/forms/models/index.d.ts +3 -0
  249. package/forms/models/src/sd-form-control-connector.d.ts +12 -0
  250. package/forms/models/src/sd-model-facing-control.d.ts +43 -0
  251. package/forms/models/src/sd-search.model.d.ts +1 -1
  252. package/forms/models/src/sd-selection-data.model.d.ts +1 -1
  253. package/forms/models/src/sd-temporal-transform.d.ts +31 -0
  254. package/forms/models/src/sd-timer-scope.d.ts +29 -0
  255. package/forms/select/src/select.component.d.ts +27 -4
  256. package/forms/src/forms.module.d.ts +22 -13
  257. package/forms/switch/src/switch.component.d.ts +5 -0
  258. package/forms/textarea/src/textarea.component.d.ts +5 -3
  259. package/forms/time-range/src/time-range.component.d.ts +22 -1
  260. package/forms/tree-select/src/tree-select.component.d.ts +36 -5
  261. package/i18n/src/en.d.ts +170 -10
  262. package/i18n/src/i18n.messages.d.ts +1 -1
  263. package/i18n/src/i18n.pipe.d.ts +3 -3
  264. package/i18n/src/i18n.service.d.ts +2 -1
  265. package/i18n/src/i18n.types.d.ts +0 -3
  266. package/interceptors/no-internet/no-internet.interceptor.d.ts +11 -1
  267. package/modules/auth/services/auth.model.d.ts +1 -1
  268. package/modules/keycloak/keycloak.service.d.ts +1 -0
  269. package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +2 -0
  270. package/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.d.ts +3 -3
  271. package/modules/layout/components/sidebar-mobile-v1/main.component.d.ts +3 -3
  272. package/modules/layout/components/sidebar-mobile-v2/main.component.d.ts +3 -3
  273. package/modules/layout/components/sidebar-mobile-v3/main.component.d.ts +3 -3
  274. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +16 -3
  275. package/modules/layout/components/sidebar-v1/main.component.d.ts +3 -3
  276. package/modules/layout/components/sidebar-v2/main.component.d.ts +3 -3
  277. package/modules/layout/components/sidebar-v3/main.component.d.ts +3 -3
  278. package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +5 -0
  279. package/modules/layout/modules/not-found/pages/root/root.component.d.ts +5 -0
  280. package/modules/layout/services/layout.service.d.ts +21 -0
  281. package/modules/layout/services/storage/storage.service.d.ts +52 -7
  282. package/modules/permission/src/configurations/permission.configuration.d.ts +11 -0
  283. package/modules/permission/src/directives/permission.directive.d.ts +2 -1
  284. package/modules/permission/src/services/permission.service.d.ts +52 -1
  285. package/package.json +40 -29
  286. package/pipes/src/safe-html.pipe.d.ts +26 -4
  287. package/pipes/src/time-different.pipe.d.ts +1 -0
  288. package/public-api.d.ts +11 -10
  289. package/services/api/src/api-host.d.ts +15 -0
  290. package/services/api/src/api.model.d.ts +14 -0
  291. package/services/api/src/api.module.d.ts +6 -0
  292. package/services/cache/src/cache.model.d.ts +10 -0
  293. package/services/index.d.ts +0 -1
  294. package/services/notify/index.d.ts +1 -1
  295. package/utilities/extensions/index.d.ts +1 -5
  296. package/utilities/extensions/src/url-safety.d.ts +72 -0
  297. package/utilities/extensions/src/utility.extension.d.ts +9 -5
  298. package/utilities/models/index.d.ts +0 -10
  299. package/components/base/index.d.ts +0 -1
  300. package/components/base/src/base-secure.component.d.ts +0 -8
  301. package/components/document-builder/index.d.ts +0 -4
  302. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +0 -15
  303. package/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.d.ts +0 -4
  304. package/components/document-builder/src/components/index.d.ts +0 -1
  305. package/components/document-builder/src/document-builder.component.d.ts +0 -53
  306. package/components/document-builder/src/document-builder.config.d.ts +0 -21
  307. package/components/document-builder/src/document-builder.model.d.ts +0 -41
  308. package/components/document-builder/src/document-builder.utils.d.ts +0 -10
  309. package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +0 -9
  310. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +0 -44
  311. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +0 -57
  312. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +0 -5
  313. package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +0 -4
  314. package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +0 -31
  315. package/components/document-builder/src/plugins/image-upload/image-upload.plugin.d.ts +0 -5
  316. package/components/document-builder/src/plugins/index.d.ts +0 -11
  317. package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +0 -24
  318. package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +0 -14
  319. package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +0 -15
  320. package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +0 -25
  321. package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +0 -29
  322. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +0 -35
  323. package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +0 -15
  324. package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +0 -15
  325. package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +0 -15
  326. package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +0 -15
  327. package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +0 -15
  328. package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +0 -15
  329. package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +0 -54
  330. package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +0 -27
  331. package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +0 -16
  332. package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +0 -25
  333. package/components/document-builder/src/plugins/paste-handler/index.d.ts +0 -35
  334. package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +0 -31
  335. package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +0 -31
  336. package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +0 -29
  337. package/components/document-builder/src/plugins/paste-handler/types.d.ts +0 -30
  338. package/components/document-builder/src/plugins/table-custom/index.d.ts +0 -34
  339. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +0 -51
  340. package/components/table/src/pipes/selection-visible-select-all.pipe.d.ts +0 -9
  341. package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
  342. package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
  343. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
  344. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
  345. package/fesm2022/sdcorejs-angular-models.mjs +0 -6
  346. package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
  347. package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
  348. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
  349. package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
  350. package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
  351. package/models/index.d.ts +0 -1
  352. package/models/src/language.model.d.ts +0 -2
  353. package/services/docx/index.d.ts +0 -1
  354. package/services/docx/src/lib/docx.model.d.ts +0 -9
  355. package/services/docx/src/lib/docx.service.d.ts +0 -14
  356. package/services/docx/src/lib/pandoc-core.d.ts +0 -11
  357. package/services/docx/src/public-api.d.ts +0 -2
  358. package/services/license/index.d.ts +0 -1
  359. package/services/license/src/license.service.d.ts +0 -9
  360. package/utilities/extensions/src/array.extension.d.ts +0 -1
  361. package/utilities/extensions/src/color.extension.d.ts +0 -5
  362. package/utilities/extensions/src/date.extension.d.ts +0 -1
  363. package/utilities/extensions/src/number.extension.d.ts +0 -1
  364. package/utilities/extensions/src/string.extension.d.ts +0 -50
  365. package/utilities/models/src/color.model.d.ts +0 -4
  366. package/utilities/models/src/empty.model.d.ts +0 -4
  367. package/utilities/models/src/filter.model.d.ts +0 -12
  368. package/utilities/models/src/maybe-async.model.d.ts +0 -10
  369. package/utilities/models/src/nested-key-of.model.d.ts +0 -4
  370. package/utilities/models/src/operator.model.d.ts +0 -13
  371. package/utilities/models/src/order.model.d.ts +0 -4
  372. package/utilities/models/src/paging.model.d.ts +0 -8
  373. package/utilities/models/src/pattern.model.d.ts +0 -21
  374. package/utilities/models/src/size.model.d.ts +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-components-query-builder.mjs","sources":["../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.model.ts","../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.serializer.ts","../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.component.ts","../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.component.html","../../../projects/sdcorejs-angular/components/query-builder/sdcorejs-angular-components-query-builder.ts"],"sourcesContent":["import { DateRelative, Filter, Operator } from '@sdcorejs/utils/models';\nimport { FilterUtilities } from '@sdcorejs/utils/fns';\n\n// ---------------------------------------------------------------------------\n// Field metadata — the public config a consumer declares so the builder knows\n// each filterable field's type (→ which operators make sense) and how to render\n// its value editor + view-mode label. Self-contained: query-builder does NOT\n// reuse query-bar's SdQueryField; it only borrows `Operator`/`Filter` from utils.\n// ---------------------------------------------------------------------------\n\n/** Field kinds the builder understands. Drives the operator set + value editor. */\nexport type SdQueryBuilderFieldType = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'values';\n\n/** One option for a `values`-type field (enum / lookup). */\nexport interface SdQueryBuilderFieldOption {\n /** Stored value (sent inside the `Filter`). */\n value: any;\n /** Human-readable label shown in the select + view-mode string. */\n display: string;\n}\n\n/**\n * One filterable field. `key` matches `Filter.field` (dot-notation allowed);\n * `label` is what the view-mode raw string renders (field token = label).\n */\nexport interface SdQueryBuilderField {\n /** Dot-notation field path — written to `Filter.field`. */\n key: string;\n /** Human label — shown in the field picker AND as the view-mode field token. */\n label: string;\n /** Field type — picks the default operator set + value editor control. */\n type: SdQueryBuilderFieldType;\n /** Material icon shown before the label in the field picker; falls back to `QB_TYPE_ICON[type]` then `'tune'`. */\n icon?: string;\n /** Override the allowed operator set (otherwise `QB_OPERATORS_BY_TYPE[type]`). */\n operators?: Operator[];\n /** Override the starting operator (otherwise `QB_DEFAULT_OPERATOR_BY_TYPE[type]`). */\n defaultOperator?: Operator;\n /** Options for `type: 'values'` — the select list + display-label lookup. */\n values?: SdQueryBuilderFieldOption[];\n /** Label for the `true` branch of a boolean field (default `'Có'`). */\n trueLabel?: string;\n /** Label for the `false` branch of a boolean field (default `'Không'`). */\n falseLabel?: string;\n /** Lower bound for number / date value editors. */\n min?: number | string;\n /** Upper bound for number / date value editors. */\n max?: number | string;\n /** Optional domain guard for field-to-field comparison candidates. */\n compareGroup?: string;\n /** Set false to hide this field from field-to-field comparison. */\n allowFieldCompare?: boolean;\n}\n\nexport interface SdQueryBuilderOption {\n autoId?: string;\n fields: SdQueryBuilderField[];\n mode?: 'edit' | 'view';\n comparisonMode?: QbComparisonMode;\n disabled?: boolean;\n value?: Filter | null;\n filters?: Filter[];\n rootLogic?: 'AND' | 'OR';\n onValueChange?: (value: Filter | null) => void;\n onFiltersChange?: (filters: Filter[]) => void;\n onRootLogicChange?: (logic: 'AND' | 'OR') => void;\n}\n\n// ---------------------------------------------------------------------------\n// Internal tree — carries UI state (stable `id` for @for + dropdown `open`).\n// NEVER emitted; mapped to/from the public `Filter` by the serializer.\n// ---------------------------------------------------------------------------\n\nexport type QbNode = QbGroup | QbRule;\n\n/** Component-level capability for right-hand operands. */\nexport type QbComparisonMode = 'value-only' | 'value-or-field';\n\n/** Per-rule right-hand operand source. */\nexport type QbValueSource = 'literal' | 'field';\n\n/** A logical group of nodes joined by AND / OR. Maps to `FilterAndOr`. */\nexport interface QbGroup {\n id: string;\n kind: 'group';\n logic: 'AND' | 'OR';\n children: QbNode[];\n /** UI-only: whether this group's \"+\" dropdown is open. */\n open?: boolean;\n}\n\n/** A single `field operator value` condition. Maps to a leaf `Filter`. */\nexport interface QbRule {\n id: string;\n kind: 'rule';\n field?: string;\n operator?: Operator;\n /** Single value, `{ from, to }` for BETWEEN, or an array for IN / NOT_IN. */\n value?: any;\n /** Internal UI state: literal input or a same-type field reference. */\n valueSource?: QbValueSource;\n /** Right-hand field key when `valueSource` is `'field'`. */\n compareField?: string;\n}\n\n/** Type guard — narrows a `QbNode` to a `QbGroup`. */\nexport function isQbGroup(node: QbNode): node is QbGroup {\n return node.kind === 'group';\n}\n\n// ---------------------------------------------------------------------------\n// View-mode tokens — the serializer turns a `Filter` into a token stream so the\n// template can wrap each piece in a highlight `<span>` (operator / value / etc).\n// ---------------------------------------------------------------------------\n\nexport type QbTokenKind = 'field' | 'op' | 'value' | 'logic' | 'paren' | 'plain';\n\n/** One piece of the rendered raw query string, tagged for highlight styling. */\nexport interface QbToken {\n text: string;\n kind: QbTokenKind;\n}\n\n// ---------------------------------------------------------------------------\n// Operator vocabulary per field type. Mirrors query-bar's\n// SD_QUERY_OPERATORS_BY_TYPE so the two components stay consistent, but is kept\n// local so query-builder has no dependency on the query-bar package.\n// ---------------------------------------------------------------------------\n\n/** Allowed operators per field type — used when `field.operators` is not set. */\nexport const QB_OPERATORS_BY_TYPE: Record<SdQueryBuilderFieldType, Operator[]> = {\n string: ['CONTAIN', 'NOT_CONTAIN', 'EQUAL', 'NOT_EQUAL', 'START_WITH', 'END_WITH', 'NULL', 'NOT_NULL'],\n number: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'GREATER_OR_EQUAL', 'LESS_THAN', 'LESS_OR_EQUAL', 'BETWEEN', 'NULL', 'NOT_NULL'],\n boolean: ['EQUAL', 'NOT_EQUAL'],\n date: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'LESS_THAN', 'BETWEEN', 'NULL', 'NOT_NULL'],\n datetime: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'LESS_THAN', 'BETWEEN', 'NULL', 'NOT_NULL'],\n values: ['IN', 'NOT_IN', 'EQUAL', 'NOT_EQUAL', 'NULL', 'NOT_NULL'],\n};\n\n/** Default operator when a rule is first created for a field. */\nexport const QB_DEFAULT_OPERATOR_BY_TYPE: Record<SdQueryBuilderFieldType, Operator> = {\n string: 'CONTAIN',\n number: 'EQUAL',\n boolean: 'EQUAL',\n date: 'BETWEEN',\n datetime: 'BETWEEN',\n values: 'IN',\n};\n\n/** Operators with no value payload — the value editor is hidden for these. */\nexport const QB_NO_DATA_OPERATORS: Operator[] = ['NULL', 'NOT_NULL'];\n\n/** Operators whose value is an array — the value editor offers multi-select. */\nexport const QB_MULTI_OPERATORS: Operator[] = ['IN', 'NOT_IN'];\n\n/** Operators allowed for `field` — explicit override wins, else the per-type set. */\nexport function qbAllowedOperators(field: SdQueryBuilderField | undefined): Operator[] {\n if (!field) return [];\n if (field.operators?.length) return field.operators;\n return QB_OPERATORS_BY_TYPE[field.type] ?? [];\n}\n\n/** Starting operator for a new rule on `field` — falls back to the per-type default. */\nexport function qbDefaultOperator(field: SdQueryBuilderField | undefined): Operator | undefined {\n if (!field) return undefined;\n const allowed = qbAllowedOperators(field);\n if (field.defaultOperator && allowed.includes(field.defaultOperator)) return field.defaultOperator;\n const byType = QB_DEFAULT_OPERATOR_BY_TYPE[field.type];\n return allowed.includes(byType) ? byType : allowed[0];\n}\n\n/** True when `op` is NULL / NOT_NULL (no value editor). */\nexport function qbIsNoDataOperator(op: Operator | undefined): boolean {\n return !!op && QB_NO_DATA_OPERATORS.includes(op);\n}\n\n/** True when `op` is IN / NOT_IN (array value). */\nexport function qbIsMultiOperator(op: Operator | undefined): boolean {\n return !!op && QB_MULTI_OPERATORS.includes(op);\n}\n\n/** True when the operator accepts one right-hand operand, including a field reference. */\nexport function qbSupportsFieldCompareOperator(op: Operator | undefined): boolean {\n return !!op && !qbIsNoDataOperator(op) && !qbIsMultiOperator(op) && op !== 'BETWEEN';\n}\n\n/**\n * Icon fallback per field type when `SdQueryBuilderField.icon` is not set.\n * Mirrors query-bar's `SD_QUERY_TYPE_ICON` so the two components read consistently,\n * but kept local so query-builder has no dependency on the query-bar package.\n */\nexport const QB_TYPE_ICON: Record<SdQueryBuilderFieldType, string> = {\n string: 'text_fields',\n number: 'tag',\n boolean: 'toggle_on',\n date: 'event',\n datetime: 'schedule',\n values: 'list',\n};\n\n/**\n * Icon shown before a field in the field picker / selected trigger.\n * Priority: `field.icon` → `QB_TYPE_ICON[field.type]` → `'tune'` (default, like query-bar).\n */\nexport function qbFieldIcon(field: SdQueryBuilderField | undefined): string {\n if (!field) return 'tune';\n return field.icon ?? QB_TYPE_ICON[field.type] ?? 'tune';\n}\n\n// ---------------------------------------------------------------------------\n// Node factories — monotonic counter for stable, render-safe ids (no Math.random\n// / Date.now so SSR + tests stay deterministic).\n// ---------------------------------------------------------------------------\n\nlet qbSeq = 0;\n\n/** Next stable node id with the given prefix. */\nexport function qbId(prefix = 'qb'): string {\n return `${prefix}-${++qbSeq}`;\n}\n\n/** Build a fresh rule node (optionally pre-filled). */\nexport function qbNewRule(field?: string, operator?: Operator, value?: any, valueSource?: QbValueSource, compareField?: string): QbRule {\n return { id: qbId('r'), kind: 'rule', field, operator, value, valueSource, compareField };\n}\n\n/** Build a fresh group node. */\nexport function qbNewGroup(logic: 'AND' | 'OR' = 'AND', children: QbNode[] = []): QbGroup {\n return { id: qbId('g'), kind: 'group', logic, children };\n}\n\n// ---------------------------------------------------------------------------\n// Relative dates — a date/datetime rule's value may be a relative spec resolved\n// at query time, instead of an absolute picked date. The model is REUSED from\n// `@sdcorejs/utils`: an offset is a `DateRelative` ({ amount, direction, unit });\n// \"today\" is the `'TODAY'` sentinel. The serializer maps these to the Filter\n// `dataType` discriminator (`'date-relative'` / `'date-today'`). The builder UI\n// only offers day/week/month even though `DateRelative` also allows `'hour'`.\n// Single-value operators only (not BETWEEN).\n// ---------------------------------------------------------------------------\n\n/** Offset unit for a relative date — re-exported from the utils `DateRelative` model. */\nexport type SdQbRelativeUnit = DateRelative['unit'];\n\n/** Offset direction for a relative date — re-exported from the utils `DateRelative` model. */\nexport type SdQbRelativeDirection = DateRelative['direction'];\n\n/** Sentinel held as a rule value (and emitted as `data`) for the \"today\" date mode. */\nexport const QB_TODAY = 'TODAY';\n/** The `'TODAY'` sentinel type (matches the utils `date-today` data literal). */\nexport type QbToday = typeof QB_TODAY;\n\n/** Date value editor mode for a date/datetime rule (derived from the rule value). */\nexport type QbDateMode = 'absolute' | 'now' | 'relative';\n\n/** Type guard — narrows a rule value to a utils `DateRelative` (offset spec). */\nexport const qbIsRelativeDate = FilterUtilities.isDateRelative;\n\n/** Type guard — narrows a rule value to the `'TODAY'` sentinel (\"now\"/today mode). */\nexport function qbIsToday(v: any): v is QbToday {\n return v === QB_TODAY;\n}\n\n/** Starting relative value when a rule first switches to \"relative\" mode. */\nexport function qbDefaultRelative(): DateRelative {\n return { amount: 1, direction: 'previous', unit: 'day' };\n}\n\n/** One date-mode option — carries a Material icon shown in the dropdown + selected trigger. */\nexport interface QbDateModeOption {\n value: QbDateMode;\n display: string;\n /** Material icon name (outlined set). */\n icon: string;\n}\n\n/** Stable option list for the date-mode select (module ref — never reallocated). */\nexport const QB_DATE_MODES: QbDateModeOption[] = [\n { value: 'absolute', display: 'Ngày cụ thể', icon: 'event' },\n { value: 'now', display: 'Hôm nay', icon: 'today' },\n { value: 'relative', display: 'Tương đối', icon: 'history' },\n];\n\n/** One value-source option for field-to-field comparison UI. */\nexport interface QbValueSourceOption {\n value: QbValueSource;\n display: string;\n /** Material icon name (outlined set). */\n icon: string;\n}\n\n/** Stable option list for choosing between a literal value and another field. */\nexport const QB_VALUE_SOURCE_OPTIONS: QbValueSourceOption[] = [\n { value: 'literal', display: 'Nhập giá trị', icon: 'edit_note' },\n { value: 'field', display: 'Chọn trường', icon: 'view_column' },\n];\n\n/** Stable combined direction×unit option list (token `'unit:direction'`). */\nexport const QB_RELATIVE_UNIT_OPTIONS: { value: string; display: string }[] = [\n { value: 'day:previous', display: 'ngày trước' },\n { value: 'day:next', display: 'ngày tới' },\n { value: 'week:previous', display: 'tuần trước' },\n { value: 'week:next', display: 'tuần tới' },\n { value: 'month:previous', display: 'tháng trước' },\n { value: 'month:next', display: 'tháng tới' },\n];\n\n/** Shared empty option array — stable ref for fallbacks (avoids per-call allocation). */\nexport const QB_EMPTY_OPTIONS: SdQueryBuilderFieldOption[] = [];\n","import { DateRelative, Filter, Operator } from '@sdcorejs/utils/models';\nimport {\n isQbGroup,\n QB_MULTI_OPERATORS,\n QB_NO_DATA_OPERATORS,\n QB_TODAY,\n qbIsRelativeDate,\n qbIsToday,\n qbSupportsFieldCompareOperator,\n QbGroup,\n QbNode,\n QbRule,\n QbToday,\n QbToken,\n qbNewGroup,\n qbNewRule,\n SdQueryBuilderField,\n} from './query-builder.model';\n\n// SQL symbol for each single-value comparison operator.\nconst SYMBOL: Partial<Record<Operator, string>> = {\n EQUAL: '=',\n NOT_EQUAL: '!=',\n GREATER_THAN: '>',\n LESS_THAN: '<',\n GREATER_OR_EQUAL: '>=',\n LESS_OR_EQUAL: '<=',\n};\n\nconst LIKE_OPERATORS: Operator[] = ['CONTAIN', 'NOT_CONTAIN', 'START_WITH', 'NOT_START_WITH', 'END_WITH', 'NOT_END_WITH'];\n\n/** A `Filter` is a logical group when its operator is AND / OR and it carries a `data[]`. */\nfunction isAndOr(filter: any): filter is { operator: 'AND' | 'OR'; data: Filter[] } {\n return !!filter && (filter.operator === 'AND' || filter.operator === 'OR') && Array.isArray(filter.data);\n}\n\nfunction isEmptyValue(v: any): boolean {\n return v === null || v === undefined || v === '';\n}\n\n// ---------------------------------------------------------------------------\n// Internal tree → public Filter\n// ---------------------------------------------------------------------------\n\nfunction ruleToFilter(rule: QbRule): Filter | null {\n if (!rule.field || !rule.operator) return null;\n const operator = rule.operator;\n\n if (QB_NO_DATA_OPERATORS.includes(operator)) {\n return { field: rule.field as any, operator } as Filter;\n }\n\n if (rule.valueSource === 'field') {\n if (!qbSupportsFieldCompareOperator(operator) || isEmptyValue(rule.compareField)) return null;\n return { field: rule.field as any, operator, dataType: 'field', data: rule.compareField } as Filter;\n }\n\n if (operator === 'BETWEEN') {\n const v = rule.value;\n if (!v || typeof v !== 'object') return null;\n if (isEmptyValue(v.from) || isEmptyValue(v.to)) return null;\n return { field: rule.field as any, operator: 'BETWEEN', data: { from: v.from, to: v.to } } as Filter;\n }\n\n if (QB_MULTI_OPERATORS.includes(operator)) {\n const arr = Array.isArray(rule.value) ? rule.value : isEmptyValue(rule.value) ? [] : [rule.value];\n if (!arr.length) return null;\n return { field: rule.field as any, operator, data: arr } as Filter;\n }\n\n if (qbIsToday(rule.value)) {\n return { field: rule.field as any, operator, dataType: 'date-today', data: QB_TODAY } as Filter;\n }\n\n if (qbIsRelativeDate(rule.value)) {\n const v = rule.value;\n // emit only when fully specified, else drop the incomplete rule\n if (v.unit && v.direction && typeof v.amount === 'number' && v.amount >= 1) {\n return {\n field: rule.field as any,\n operator,\n dataType: 'date-relative',\n data: { amount: v.amount, direction: v.direction, unit: v.unit },\n } as Filter;\n }\n return null;\n }\n\n // A non-relative plain object is an incomplete/stray shape (e.g. a partial offset) — drop it.\n if (rule.value !== null && typeof rule.value === 'object' && !Array.isArray(rule.value)) return null;\n if (isEmptyValue(rule.value)) return null;\n return { field: rule.field as any, operator, data: rule.value } as Filter;\n}\n\nfunction nodeToFilter(node: QbNode): Filter | null {\n if (isQbGroup(node)) {\n const data = node.children.map(nodeToFilter).filter((f): f is Filter => f != null);\n if (!data.length) return null;\n return { operator: node.logic, data } as Filter;\n }\n return ruleToFilter(node);\n}\n\n/**\n * Map the internal builder tree to the public `Filter` (the root is always a\n * `FilterAndOr`). Rules missing field / operator / value — and empty nested\n * groups — are dropped so the result is always a valid `Filter`.\n *\n * @param group - the editable tree's root group.\n * @returns the canonical nested `Filter`, or `null` when no complete rule survives.\n */\nexport function treeToFilter(group: QbGroup): Filter | null {\n return nodeToFilter(group);\n}\n\n// ---------------------------------------------------------------------------\n// Public Filter → internal tree (for seeding [value])\n// ---------------------------------------------------------------------------\n\nfunction ruleFromFilter(filter: any): QbRule {\n const operator = filter.operator as Operator;\n if (QB_NO_DATA_OPERATORS.includes(operator)) {\n return qbNewRule(filter.field, operator);\n }\n if (filter.dataType === 'field') {\n return qbNewRule(filter.field, operator, undefined, 'field', filter.data);\n }\n // Relative dates: read the utils `dataType` discriminator back into the internal value.\n if (filter.dataType === 'date-today') {\n return qbNewRule(filter.field, operator, QB_TODAY);\n }\n if (filter.dataType === 'date-relative') {\n return qbNewRule(filter.field, operator, filter.data);\n }\n // Back-compat: legacy `{ rel: 'now' | 'offset' }` payloads (pre-dataType migration)\n // still seed the editor correctly.\n const legacy = readLegacyRelative(filter.data);\n if (legacy !== undefined) {\n return qbNewRule(filter.field, operator, legacy);\n }\n return qbNewRule(filter.field, operator, filter.data);\n}\n\n/** Map a pre-migration `{ rel }` payload to the new internal value, or `undefined` if not legacy. */\nfunction readLegacyRelative(data: any): QbToday | DateRelative | undefined {\n if (!data || typeof data !== 'object') return undefined;\n if (data.rel === 'now') return QB_TODAY;\n if (data.rel === 'offset' && data.unit && data.direction && typeof data.amount === 'number') {\n return { amount: data.amount, direction: data.direction, unit: data.unit };\n }\n return undefined;\n}\n\nfunction nodeFromFilter(filter: Filter): QbNode {\n return isAndOr(filter) ? groupFromFilter(filter) : ruleFromFilter(filter);\n}\n\nfunction groupFromFilter(filter: { operator: 'AND' | 'OR'; data: Filter[] }): QbGroup {\n return qbNewGroup(filter.operator, filter.data.map(nodeFromFilter));\n}\n\n/**\n * Inverse of {@link treeToFilter} — rebuild the editable tree from a `Filter` so a\n * consumer can seed `[value]`. A non-group (bare) filter is wrapped in an AND root;\n * `null` yields an empty AND root.\n *\n * @param filter - a `Filter` (group or leaf), or `null` / `undefined` for an empty tree.\n * @returns a fresh root `QbGroup` mirroring the filter's structure.\n */\nexport function filterToTree(filter: Filter | null | undefined): QbGroup {\n if (!filter) return qbNewGroup('AND', []);\n if (isAndOr(filter)) return groupFromFilter(filter);\n return qbNewGroup('AND', [ruleFromFilter(filter)]);\n}\n\n// ---------------------------------------------------------------------------\n// Public Filter → SQL-ish highlight tokens (view mode)\n// ---------------------------------------------------------------------------\n\nfunction escapeStr(s: string): string {\n return s.replace(/'/g, \"''\");\n}\n\nconst REL_UNIT_VI: Record<DateRelative['unit'], string> = { hour: 'giờ', day: 'ngày', week: 'tuần', month: 'tháng' };\n\n/** Render a relative-date offset as readable Vietnamese for the view string. */\nfunction formatRelative(v: DateRelative): string {\n const unit = REL_UNIT_VI[v.unit] ?? REL_UNIT_VI.day;\n const dir = v.direction === 'next' ? 'tới' : 'trước';\n return `${v.amount} ${unit} ${dir}`;\n}\n\n/** Format one scalar value for the view string — quoted/labelled per field type. */\nfunction formatScalar(field: SdQueryBuilderField | undefined, raw: any): string {\n if (qbIsToday(raw)) return 'hôm nay';\n if (qbIsRelativeDate(raw)) return formatRelative(raw);\n if (raw === null || raw === undefined) return '';\n if (field?.type === 'boolean') {\n return raw ? (field.trueLabel ?? 'Có') : (field.falseLabel ?? 'Không');\n }\n if (field?.type === 'values') {\n const opt = field.values?.find(o => o.value === raw);\n return `'${escapeStr(opt ? opt.display : String(raw))}'`;\n }\n if (field?.type === 'number' || typeof raw === 'number' || typeof raw === 'boolean') {\n return String(raw);\n }\n // string / date / datetime / unknown → quoted\n return `'${escapeStr(String(raw))}'`;\n}\n\nfunction likePattern(operator: Operator, raw: string): string {\n const esc = escapeStr(raw);\n if (operator === 'CONTAIN' || operator === 'NOT_CONTAIN') return `'%${esc}%'`;\n if (operator === 'START_WITH' || operator === 'NOT_START_WITH') return `'${esc}%'`;\n return `'%${esc}'`; // END_WITH / NOT_END_WITH\n}\n\nfunction operatorToken(operator: Operator): string {\n if (LIKE_OPERATORS.includes(operator)) return operator.startsWith('NOT_') ? 'not like' : 'like';\n return SYMBOL[operator] ?? operator;\n}\n\nfunction ruleTokens(filter: any, fields: SdQueryBuilderField[]): QbToken[] {\n const field = fields.find(f => f.key === filter.field);\n const out: QbToken[] = [{ kind: 'field', text: field?.label ?? String(filter.field) }];\n const sp = () => out.push({ kind: 'plain', text: ' ' });\n const operator = filter.operator as Operator;\n\n if (QB_NO_DATA_OPERATORS.includes(operator)) {\n sp();\n out.push({ kind: 'op', text: operator === 'NULL' ? 'is null' : 'is not null' });\n return out;\n }\n\n if (operator === 'BETWEEN') {\n sp();\n out.push({ kind: 'op', text: 'between' });\n sp();\n out.push({ kind: 'value', text: formatScalar(field, filter.data?.from) });\n out.push({ kind: 'plain', text: ' and ' });\n out.push({ kind: 'value', text: formatScalar(field, filter.data?.to) });\n return out;\n }\n\n if (QB_MULTI_OPERATORS.includes(operator)) {\n sp();\n out.push({ kind: 'op', text: operator === 'IN' ? 'in' : 'not in' });\n sp();\n const arr: any[] = Array.isArray(filter.data) ? filter.data : [];\n out.push({ kind: 'value', text: `(${arr.map((v: any) => formatScalar(field, v)).join(', ')})` });\n return out;\n }\n\n if (filter.dataType === 'field') {\n const compareField = fields.find(f => f.key === filter.data);\n sp();\n out.push({ kind: 'op', text: operatorToken(operator) });\n sp();\n out.push({ kind: 'field', text: compareField?.label ?? String(filter.data) });\n return out;\n }\n\n if (LIKE_OPERATORS.includes(operator)) {\n sp();\n out.push({ kind: 'op', text: operatorToken(operator) });\n sp();\n out.push({ kind: 'value', text: likePattern(operator, String(filter.data ?? '')) });\n return out;\n }\n\n sp();\n out.push({ kind: 'op', text: operatorToken(operator) });\n sp();\n out.push({ kind: 'value', text: formatScalar(field, filter.data) });\n return out;\n}\n\nfunction tokensFor(filter: Filter, fields: SdQueryBuilderField[]): QbToken[] {\n if (isAndOr(filter)) {\n const out: QbToken[] = [];\n filter.data.forEach((child, i) => {\n if (i > 0) out.push({ kind: 'logic', text: ` ${filter.operator.toLowerCase()} ` });\n const childTokens = tokensFor(child, fields);\n // Wrap a nested multi-child group in parentheses; a single-child group needs none.\n if (isAndOr(child) && child.data.length > 1) {\n out.push({ kind: 'paren', text: '(' }, ...childTokens, { kind: 'paren', text: ')' });\n } else {\n out.push(...childTokens);\n }\n });\n return out;\n }\n return ruleTokens(filter, fields);\n}\n\n/**\n * Render a `Filter` to a SQL-ish token stream for view mode. Field tokens use the\n * matching field's `label`; operators map to SQL syntax (`= != like between is null …`);\n * `and` / `or` are lowercase; nested multi-child groups are wrapped in parentheses.\n * Returns a token stream (not a string) so the template can wrap each piece in a\n * highlight `<span>` keyed by `QbToken.kind`.\n *\n * @param filter - the `Filter` to render, or `null` / `undefined`.\n * @param fields - field metadata, used to resolve each field key to its display label + value formatting.\n * @returns the ordered tokens, or `[]` when `filter` is empty.\n */\nexport function filterToTokens(filter: Filter | null | undefined, fields: SdQueryBuilderField[]): QbToken[] {\n if (!filter) return [];\n return tokensFor(filter, fields);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, booleanAttribute, computed, effect, input, model, signal, untracked } from '@angular/core';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdItemDefDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { DateRelative, Filter, Operator } from '@sdcorejs/utils/models';\nimport {\n isQbGroup,\n QB_DATE_MODES,\n QB_EMPTY_OPTIONS,\n QB_RELATIVE_UNIT_OPTIONS,\n QB_TODAY,\n QB_VALUE_SOURCE_OPTIONS,\n QbComparisonMode,\n QbDateMode,\n QbGroup,\n QbNode,\n QbRule,\n QbToken,\n QbValueSource,\n qbAllowedOperators,\n qbDefaultOperator,\n qbDefaultRelative,\n qbSupportsFieldCompareOperator,\n qbIsMultiOperator,\n qbIsNoDataOperator,\n qbIsRelativeDate,\n qbIsToday,\n qbFieldIcon,\n qbNewGroup,\n qbNewRule,\n SdQueryBuilderField,\n SdQueryBuilderFieldOption,\n SdQueryBuilderOption,\n} from './query-builder.model';\nimport { filterToTokens, filterToTree, treeToFilter } from './query-builder.serializer';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/** A logical `Filter` (AND / OR group) carries a `data[]` array. */\nfunction isAndOr(filter: any): boolean {\n return !!filter && (filter.operator === 'AND' || filter.operator === 'OR') && Array.isArray(filter.data);\n}\n\nconst QB_EMPTY_FIELDS: SdQueryBuilderField[] = [];\n\n/**\n * Visual filter / rule builder. Compose nested AND / OR groups of\n * `field operator value` conditions; emits the canonical `Filter` (root is a\n * `FilterAndOr` tree) via `[(value)]`, plus a flat `[(filters)]` mirror of the\n * root group's direct children. `mode=\"view\"` renders a read-only SQL-ish raw\n * string with highlighted operators + values.\n */\n@Component({\n selector: 'sd-query-builder',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, NgTemplateOutlet, SdOperator, SdSelect, SdInput, SdInputNumber, SdDate, SdDatetime, SdItemDefDefDirective],\n templateUrl: './query-builder.component.html',\n styleUrl: './query-builder.component.scss',\n})\nexport class SdQueryBuilder {\n // -------------------------------------------------------------------------\n // Inputs\n // -------------------------------------------------------------------------\n\n /** Main option object. Prefer this API for new usage; individual inputs stay as a migration bridge. */\n readonly option = input<SdQueryBuilderOption | undefined>(undefined);\n\n /** Filterable fields — each declares a `type` that drives the operator set + value editor. */\n readonly fields = input<SdQueryBuilderField[]>([]);\n\n /** `'edit'` (default) = interactive tree · `'view'` = read-only raw-query string. */\n readonly mode = input<'edit' | 'view'>('edit');\n\n /** `value-only` = literal operands only · `value-or-field` = each rule may compare against another field. */\n readonly comparisonMode = input<QbComparisonMode>('value-only');\n\n /** Disable all editing controls. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Prefix for `data-autoid` on inner controls (E2E selectors). */\n readonly autoId = input<string>();\n\n // -------------------------------------------------------------------------\n // Two-way models (output contract)\n // -------------------------------------------------------------------------\n\n /** Canonical output — the root `FilterAndOr` tree, or `null` when empty. `[(value)]`. */\n readonly value = model<Filter | null>(null);\n\n /** Convenience mirror — the root group's direct children. `[(filters)]`. */\n readonly filters = model<Filter[]>([]);\n\n /** Root group's logical connector. `[(rootLogic)]`. */\n readonly rootLogic = model<'AND' | 'OR'>('AND');\n\n // -------------------------------------------------------------------------\n // Internal source of truth — the editable tree (carries UI state).\n // -------------------------------------------------------------------------\n\n readonly #tree = signal<QbGroup>(qbNewGroup('AND'));\n readonly tree = this.#tree.asReadonly();\n\n /** Last filter WE emitted — used to recognise (and ignore) our own echo in the inbound effect. */\n #lastEmitted: Filter | null | undefined = undefined;\n\n // -------------------------------------------------------------------------\n // Derived state\n // -------------------------------------------------------------------------\n\n /** `field.key` → field, for fast lookup from a rule. */\n readonly resolvedFields = computed(() => this.option()?.fields ?? this.fields());\n readonly resolvedMode = computed(() => this.option()?.mode ?? this.mode());\n readonly resolvedComparisonMode = computed(() => this.option()?.comparisonMode ?? this.comparisonMode());\n readonly resolvedDisabled = computed(() => this.option()?.disabled ?? this.disabled());\n readonly resolvedAutoId = computed(() => this.option()?.autoId ?? this.autoId());\n\n readonly fieldByKey = computed<Record<string, SdQueryBuilderField>>(() => {\n const map: Record<string, SdQueryBuilderField> = {};\n for (const f of this.resolvedFields()) map[f.key] = f;\n return map;\n });\n\n /** Boolean fields → their stable `[true,false]` option list. Memoized so the template\n * binding hands `sd-select` the SAME array ref each CD (else its `toObservable(items)`\n * → `markForCheck()` loops → OOM). Recomputes only when `fields()` changes. */\n readonly #booleanOptionsByKey = computed<Map<string, SdQueryBuilderFieldOption[]>>(() => {\n const map = new Map<string, SdQueryBuilderFieldOption[]>();\n for (const f of this.resolvedFields()) {\n if (f.type === 'boolean') {\n map.set(f.key, [\n { value: true, display: f.trueLabel ?? 'Có' },\n { value: false, display: f.falseLabel ?? 'Không' },\n ]);\n }\n }\n return map;\n });\n\n /** Stable option list for the date-mode select. */\n readonly dateModes = QB_DATE_MODES;\n /** Stable option list for the literal-vs-field operand select. */\n readonly valueSourceOptions = QB_VALUE_SOURCE_OPTIONS;\n /** Stable combined unit×direction option list for the relative select. */\n readonly relativeUnitOptions = QB_RELATIVE_UNIT_OPTIONS;\n\n readonly #compareFieldsByKey = computed<Map<string, SdQueryBuilderField[]>>(() => {\n const fields = this.resolvedFields();\n const map = new Map<string, SdQueryBuilderField[]>();\n\n for (const left of fields) {\n if (left.allowFieldCompare === false) {\n map.set(left.key, QB_EMPTY_FIELDS);\n continue;\n }\n\n map.set(\n left.key,\n fields.filter(right => {\n if (right.key === left.key) return false;\n if (right.allowFieldCompare === false) return false;\n if (right.type !== left.type) return false;\n if ((left.compareGroup ?? right.compareGroup) !== undefined && left.compareGroup !== right.compareGroup) return false;\n return true;\n })\n );\n }\n\n return map;\n });\n\n /** View-mode token stream — recomputed from the emitted value. */\n readonly tokens = computed<QbToken[]>(() => filterToTokens(this.option()?.value ?? this.value(), this.resolvedFields()));\n\n readonly isView = computed(() => this.resolvedMode() === 'view');\n\n /** Expose the type-guard to the template. */\n readonly isGroup = isQbGroup;\n\n /** Resolve the leading icon for a field (own `icon` → per-type → `'tune'`) — used by the field picker. */\n readonly fieldIcon = qbFieldIcon;\n\n constructor() {\n // Inbound seeding: an EXTERNAL write to value / filters rebuilds the tree.\n // Our own emits are recognised via #lastEmitted and skipped (no echo loop).\n effect(() => {\n const option = this.option();\n const v = option?.value ?? this.value();\n const fl = option?.filters ?? this.filters();\n const incoming = this.#coalesce(v, fl, option?.rootLogic);\n if (this.#filterEq(incoming, this.#lastEmitted)) return;\n this.#tree.set(filterToTree(incoming));\n this.#commit();\n });\n }\n\n #coalesce(v: Filter | null, fl: Filter[], logic?: 'AND' | 'OR'): Filter | null {\n if (v) return v;\n if (fl && fl.length) return { operator: logic ?? untracked(() => this.rootLogic()), data: fl } as Filter;\n return null;\n }\n\n #filterEq(a: Filter | null | undefined, b: Filter | null | undefined): boolean {\n return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n }\n\n // -------------------------------------------------------------------------\n // Tree mutation → emit\n // -------------------------------------------------------------------------\n\n /** New root ref so the template (which reads `tree()`) re-renders. */\n #bumpTree(): void {\n this.#tree.set({ ...this.#tree() });\n }\n\n /** Recompute the output `Filter` from the tree and push it to value / filters / rootLogic. */\n #commit(): void {\n const filter = treeToFilter(this.#tree());\n this.#lastEmitted = filter;\n this.value.set(filter);\n const filters = isAndOr(filter) ? (filter as any).data : filter ? [filter] : [];\n this.filters.set(filters);\n const logic = this.#tree().logic;\n if (this.rootLogic() !== logic) this.rootLogic.set(logic);\n this.option()?.onValueChange?.(filter);\n this.option()?.onFiltersChange?.(filters);\n this.option()?.onRootLogicChange?.(logic);\n }\n\n /** Mutate-in-place + re-render + emit. */\n #apply(): void {\n this.#bumpTree();\n this.#commit();\n }\n\n // -------------------------------------------------------------------------\n // Group / rule structural mutations\n // -------------------------------------------------------------------------\n\n /** Switch a group's AND/OR connector and re-emit. No-op when disabled or unchanged. */\n setGroupLogic(group: QbGroup, logic: 'AND' | 'OR'): void {\n if (this.resolvedDisabled() || group.logic === logic) return;\n group.logic = logic;\n this.#apply();\n }\n\n /** Open this group's \"+\" menu (closing any other open one). UI-only — does not emit. */\n toggleDropdown(group: QbGroup, event: Event): void {\n if (this.resolvedDisabled()) return;\n event.stopPropagation();\n const willOpen = !group.open;\n this.#closeAllDropdowns(this.#tree());\n group.open = willOpen;\n this.#bumpTree(); // UI-only — no emit\n }\n\n closeAllDropdowns(): void {\n if (!this.#hasOpenDropdown(this.#tree())) return; // avoid a re-render on every container click\n this.#closeAllDropdowns(this.#tree());\n this.#bumpTree();\n }\n\n #hasOpenDropdown(node: QbNode): boolean {\n if (!isQbGroup(node)) return false;\n return node.open === true || node.children.some(c => this.#hasOpenDropdown(c));\n }\n\n #closeAllDropdowns(node: QbNode): void {\n if (isQbGroup(node)) {\n node.open = false;\n node.children.forEach(c => this.#closeAllDropdowns(c));\n }\n }\n\n /** Append a blank rule to `group`. */\n addRule(group: QbGroup): void {\n if (this.resolvedDisabled()) return;\n group.children.push(qbNewRule());\n group.open = false;\n this.#apply();\n }\n\n /** Append a nested sub-group (seeded with one blank rule) to `group`. */\n addGroup(group: QbGroup): void {\n if (this.resolvedDisabled()) return;\n group.children.push(qbNewGroup('AND', [qbNewRule()]));\n group.open = false;\n this.#apply();\n }\n\n /** Remove the child at `index` from `parent` (a rule or a whole sub-group). */\n removeNode(parent: QbGroup, index: number): void {\n if (this.resolvedDisabled()) return;\n parent.children.splice(index, 1);\n this.#apply();\n }\n\n // -------------------------------------------------------------------------\n // Rule field / operator / value mutations\n // -------------------------------------------------------------------------\n\n /**\n * Point `rule` at a new field. Resets operator to the field's default and the value\n * to that operator's empty shape — the old operator/value rarely fit the new type.\n *\n * @param rule - the rule being edited.\n * @param key - the chosen field key (from the field picker). Swap-only: a null / undefined\n * key is a no-op — the field can be changed but never cleared (issue #2).\n */\n setField(rule: QbRule, key: any): void {\n if (this.resolvedDisabled()) return;\n if (key == null) return; // swap-only: never clear the field (issue #2)\n rule.field = key;\n const field = this.fieldByKey()[rule.field as string];\n const op = qbDefaultOperator(field);\n rule.operator = op;\n rule.value = this.#defaultValueFor(op);\n this.#useLiteralSource(rule);\n this.#apply();\n }\n\n /** Change `rule`'s operator and reshape its value to fit the new operator (array / range / none). */\n setOperator(rule: QbRule, op: Operator | undefined): void {\n if (this.resolvedDisabled()) return;\n rule.operator = op;\n if (rule.valueSource === 'field' && this.canCompareWithField(rule)) {\n rule.value = null;\n if (!this.#isCompareFieldAllowed(rule, rule.compareField)) rule.compareField = undefined;\n } else {\n rule.value = this.#reshapeValue(op, rule.value);\n this.#useLiteralSource(rule);\n }\n this.#apply();\n }\n\n /** Set a single-value rule's value (coercing numeric fields to `number`). */\n setScalar(rule: QbRule, raw: any): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n rule.value = this.#coerce(rule, raw);\n this.#apply();\n }\n\n /** Set the lower bound of a BETWEEN rule's `{ from, to }` value. */\n setBetweenFrom(rule: QbRule, raw: any): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n rule.value = { ...(rule.value ?? {}), from: this.#coerce(rule, raw) };\n this.#apply();\n }\n\n /** Set the upper bound of a BETWEEN rule's `{ from, to }` value. */\n setBetweenTo(rule: QbRule, raw: any): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n rule.value = { ...(rule.value ?? {}), to: this.#coerce(rule, raw) };\n this.#apply();\n }\n\n setValueSource(rule: QbRule, source: unknown): void {\n if (this.resolvedDisabled()) return;\n if (source === 'field' && this.resolvedComparisonMode() === 'value-or-field' && this.canCompareWithField(rule)) {\n rule.valueSource = 'field';\n rule.value = null;\n if (!this.#isCompareFieldAllowed(rule, rule.compareField)) rule.compareField = undefined;\n } else {\n this.#useLiteralSource(rule);\n rule.value = this.#defaultValueFor(rule.operator);\n }\n this.#apply();\n }\n\n setCompareField(rule: QbRule, key: any): void {\n if (this.resolvedDisabled()) return;\n if (!this.#isCompareFieldAllowed(rule, key)) return;\n rule.valueSource = 'field';\n rule.compareField = key;\n rule.value = null;\n this.#apply();\n }\n\n /** Coerce numeric fields to `number` so the emitted Filter carries a real number. */\n #coerce(rule: QbRule, raw: any): any {\n const field = this.fieldByKey()[rule.field as string];\n if (field?.type === 'number' && raw !== null && raw !== undefined && raw !== '') {\n const n = Number(raw);\n return Number.isNaN(n) ? raw : n;\n }\n return raw;\n }\n\n #defaultValueFor(op: Operator | undefined): any {\n if (qbIsMultiOperator(op)) return [];\n if (op === 'BETWEEN') return { from: null, to: null };\n return null;\n }\n\n #reshapeValue(op: Operator | undefined, current: any): any {\n if (qbIsNoDataOperator(op)) return null;\n if (qbIsMultiOperator(op)) return Array.isArray(current) ? current : current == null ? [] : [current];\n if (op === 'BETWEEN') {\n // a relative spec / 'TODAY' can't be a BETWEEN endpoint — reset to a fresh range\n return current && typeof current === 'object' && !Array.isArray(current) && !qbIsRelativeDate(current)\n ? current\n : { from: null, to: null };\n }\n // single value — keep a relative spec or the 'TODAY' sentinel; else drop array/range remnants\n if (qbIsToday(current) || qbIsRelativeDate(current)) return current;\n return Array.isArray(current) || (current && typeof current === 'object') ? null : current;\n }\n\n #useLiteralSource(rule: QbRule): void {\n rule.valueSource = 'literal';\n rule.compareField = undefined;\n }\n\n #isCompareFieldAllowed(rule: QbRule, key: any): boolean {\n return !!key && this.compareFields(rule).some(f => f.key === key);\n }\n\n // -------------------------------------------------------------------------\n // Template helpers\n // -------------------------------------------------------------------------\n\n /** The field metadata for a rule's current `field` key (or undefined if unset). */\n fieldOf(rule: QbRule): SdQueryBuilderField | undefined {\n return rule.field ? this.fieldByKey()[rule.field] : undefined;\n }\n\n /** Operators allowed for a rule, derived from its field's type / override. */\n allowedOperators(rule: QbRule): Operator[] {\n return qbAllowedOperators(this.fieldOf(rule));\n }\n\n /** Whether to render the operator picker — hidden when only one operator is allowed. */\n showOperatorSelector(rule: QbRule): boolean {\n return this.allowedOperators(rule).length > 1;\n }\n\n compareFields(rule: QbRule): SdQueryBuilderField[] {\n const field = this.fieldOf(rule);\n if (!field) return QB_EMPTY_FIELDS;\n return this.#compareFieldsByKey().get(field.key) ?? QB_EMPTY_FIELDS;\n }\n\n canCompareWithField(rule: QbRule): boolean {\n return qbSupportsFieldCompareOperator(rule.operator) && this.compareFields(rule).length > 0;\n }\n\n showValueSourceSelector(rule: QbRule): boolean {\n return this.canCompareWithField(rule) && (this.resolvedComparisonMode() === 'value-or-field' || rule.valueSource === 'field');\n }\n\n valueSourceOf(rule: QbRule): QbValueSource {\n return rule.valueSource === 'field' && this.canCompareWithField(rule) ? 'field' : 'literal';\n }\n\n isFieldSource(rule: QbRule): boolean {\n return this.valueSourceOf(rule) === 'field';\n }\n\n /** True for NULL / NOT_NULL — the template then renders no value editor. */\n isNoData(op: Operator | undefined): boolean {\n return qbIsNoDataOperator(op);\n }\n\n /** True for IN / NOT_IN — the template then renders a multi-select value editor. */\n isMulti(op: Operator | undefined): boolean {\n return qbIsMultiOperator(op);\n }\n\n /** `[true/false]` option list for a boolean field's value select (stable reference). */\n booleanItems(field: SdQueryBuilderField): SdQueryBuilderFieldOption[] {\n return this.#booleanOptionsByKey().get(field.key) ?? QB_EMPTY_OPTIONS;\n }\n\n /** Current date-value mode of a rule, derived from its value (no separate state). */\n dateMode(rule: QbRule): QbDateMode {\n const v = rule.value;\n if (qbIsToday(v)) return 'now';\n if (qbIsRelativeDate(v)) return 'relative';\n return 'absolute';\n }\n\n /** Switch a date/datetime rule's value mode, reseeding the value for the new mode. */\n setDateMode(rule: QbRule, mode: unknown): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n if (mode === 'now') rule.value = QB_TODAY;\n else if (mode === 'relative') rule.value = qbDefaultRelative();\n else rule.value = null; // absolute — pick a concrete date\n this.#apply();\n }\n\n /** Read the offset amount of a relative rule (default 1). */\n relativeAmount(rule: QbRule): number {\n const v = rule.value;\n return qbIsRelativeDate(v) ? (v.amount ?? 1) : 1;\n }\n\n /** Set the offset amount (clamped to an integer >= 1). */\n setRelativeAmount(rule: QbRule, raw: any): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n const n = Math.floor(Number(raw));\n const amount = Number.isNaN(n) || n < 1 ? 1 : n;\n const cur = qbIsRelativeDate(rule.value) ? rule.value : qbDefaultRelative();\n rule.value = { amount, direction: cur.direction, unit: cur.unit } satisfies DateRelative;\n this.#apply();\n }\n\n /** Read the `'unit:direction'` token of a relative rule (default `'day:previous'`). */\n relativeUnitDirValue(rule: QbRule): string {\n const v = rule.value;\n if (qbIsRelativeDate(v)) return `${v.unit}:${v.direction}`;\n return 'day:previous';\n }\n\n /** Set the offset unit + direction from a `'unit:direction'` token. */\n setRelativeUnitDir(rule: QbRule, token: unknown): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n const normalizedToken = typeof token === 'string' ? token : 'day:previous';\n const [unit, direction] = normalizedToken.split(':') as [DateRelative['unit'], DateRelative['direction']];\n const cur = qbIsRelativeDate(rule.value) ? rule.value : qbDefaultRelative();\n rule.value = { amount: cur.amount, direction, unit } satisfies DateRelative;\n this.#apply();\n }\n\n /** Build a `data-autoid` for an inner control under this builder's `autoId` prefix. */\n autoIdFor(suffix: string): string {\n return `${this.resolvedAutoId() ?? 'qb'}-${suffix}`;\n }\n}\n","@if (isView()) {\n <div class=\"qb-view\" [attr.data-autoid]=\"autoIdFor('view')\" aria-readonly=\"true\">\n @if (tokens().length) {\n @for (t of tokens(); track $index) {\n <span class=\"qb-tok qb-tok-{{ t.kind }}\">{{ t.text }}</span>\n }\n } @else {\n <span class=\"qb-view-empty\">—</span>\n }\n </div>\n} @else {\n <div class=\"qb-container\" [class.is-disabled]=\"resolvedDisabled()\" (click)=\"closeAllDropdowns()\">\n <ng-container [ngTemplateOutlet]=\"groupTpl\" [ngTemplateOutletContext]=\"{ $implicit: tree(), isRoot: true }\"></ng-container>\n </div>\n}\n\n<!-- Recursive group node -->\n<ng-template #groupTpl let-group let-isRoot=\"isRoot\" let-parent=\"parent\" let-index=\"index\">\n <div class=\"qb-group\" [class.is-root]=\"isRoot\">\n <div class=\"qb-header\" [class.is-open]=\"group.open\">\n <div class=\"qb-logic-switch\">\n <button type=\"button\" [class.active]=\"group.logic === 'AND'\" [disabled]=\"resolvedDisabled()\" (click)=\"setGroupLogic(group, 'AND')\">AND</button>\n <button type=\"button\" [class.active]=\"group.logic === 'OR'\" [disabled]=\"resolvedDisabled()\" (click)=\"setGroupLogic(group, 'OR')\">OR</button>\n </div>\n\n <div class=\"qb-actions\">\n <button type=\"button\" class=\"qb-btn qb-btn-add\" title=\"Thêm\" aria-label=\"Thêm điều kiện hoặc nhóm\" [disabled]=\"resolvedDisabled()\" (click)=\"toggleDropdown(group, $event)\">+</button>\n @if (group.open) {\n <div class=\"qb-dropdown\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" (click)=\"addRule(group)\">+ Điều kiện</button>\n <button type=\"button\" (click)=\"addGroup(group)\">+ Nhóm</button>\n </div>\n }\n @if (!isRoot) {\n <button type=\"button\" class=\"qb-btn qb-btn-remove\" title=\"Xoá nhóm\" aria-label=\"Xoá nhóm\" [disabled]=\"resolvedDisabled()\" (click)=\"removeNode(parent, index)\">✕</button>\n }\n </div>\n </div>\n\n <div class=\"qb-body\">\n @for (node of group.children; track node.id; let i = $index) {\n <div class=\"qb-treenode\" [class.is-group]=\"isGroup(node)\" [class.is-rule]=\"!isGroup(node)\">\n @if (isGroup(node)) {\n <ng-container\n [ngTemplateOutlet]=\"groupTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: node, isRoot: false, parent: group, index: i }\"\n ></ng-container>\n } @else {\n <ng-container [ngTemplateOutlet]=\"ruleTpl\" [ngTemplateOutletContext]=\"{ $implicit: node, parent: group, index: i }\"></ng-container>\n }\n </div>\n } @empty {\n <div class=\"qb-empty\">Chưa có điều kiện</div>\n }\n </div>\n </div>\n</ng-template>\n\n<!-- Single rule node: field → operator → value -->\n<ng-template #ruleTpl let-rule let-parent=\"parent\" let-index=\"index\">\n <div class=\"qb-rule\">\n <sd-select\n class=\"qb-field\"\n [items]=\"resolvedFields()\"\n valueField=\"key\"\n displayField=\"label\"\n placeholder=\"Chọn trường\"\n size=\"sm\"\n [model]=\"rule.field\"\n (modelChange)=\"setField(rule, $event)\"\n [disabled]=\"resolvedDisabled()\"\n [clearable]=\"false\"\n hideInlineError\n [autoId]=\"autoIdFor('field-' + index)\"\n >\n <!-- Option trong dropdown: icon thể hiện type + label. -->\n <ng-template sdItemDef let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item).label }}</span>\n </span>\n </ng-template>\n <!-- Giá trị đã chọn ở trigger: icon mặc định theo type khi field chưa có icon riêng. -->\n <ng-template #sdSelected let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item)?.label }}</span>\n </span>\n </ng-template>\n </sd-select>\n\n @if (rule.field) {\n <div class=\"qb-divider\"></div>\n\n @if (showOperatorSelector(rule)) {\n <sd-operator\n class=\"qb-op\"\n [operators]=\"allowedOperators(rule)\"\n [model]=\"rule.operator\"\n (modelChange)=\"setOperator(rule, $event)\"\n [disabled]=\"resolvedDisabled()\"\n [autoId]=\"autoIdFor('op-' + index)\"\n ></sd-operator>\n }\n\n @if (rule.operator && !isNoData(rule.operator)) {\n <div class=\"qb-divider\"></div>\n\n @if (showValueSourceSelector(rule)) {\n <sd-select\n class=\"qb-value-source\"\n [items]=\"valueSourceOptions\"\n valueField=\"value\"\n displayField=\"display\"\n size=\"sm\"\n [model]=\"valueSourceOf(rule)\"\n (modelChange)=\"setValueSource(rule, $event)\"\n [disabled]=\"resolvedDisabled()\"\n [clearable]=\"false\"\n hideInlineError\n [autoId]=\"autoIdFor('valuesource-' + index)\"\n >\n <ng-template sdItemDef let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item).icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item).display }}</span>\n </span>\n </ng-template>\n <ng-template #sdSelected let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item)?.icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item)?.display }}</span>\n </span>\n </ng-template>\n </sd-select>\n <div class=\"qb-divider\"></div>\n }\n\n @if (isFieldSource(rule)) {\n <sd-select\n class=\"qb-val qb-compare-field\"\n [items]=\"compareFields(rule)\"\n valueField=\"key\"\n displayField=\"label\"\n placeholder=\"Chọn trường\"\n size=\"sm\"\n [model]=\"rule.compareField\"\n (modelChange)=\"setCompareField(rule, $event)\"\n [disabled]=\"resolvedDisabled()\"\n [clearable]=\"false\"\n hideInlineError\n [autoId]=\"autoIdFor('compare-field-' + index)\"\n >\n <ng-template sdItemDef let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item).label }}</span>\n </span>\n </ng-template>\n <ng-template #sdSelected let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item)?.label }}</span>\n </span>\n </ng-template>\n </sd-select>\n } @else if (rule.operator === 'BETWEEN') {\n <div class=\"qb-between\">\n @switch (fieldOf(rule)?.type) {\n @case ('number') {\n <sd-input-number class=\"qb-val\" placeholder=\"Từ\" size=\"sm\" [model]=\"rule.value?.from\" (modelChange)=\"setBetweenFrom(rule, $event)\" [min]=\"fieldOf(rule)?.min\" [max]=\"fieldOf(rule)?.max\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('from-' + index)\"></sd-input-number>\n <span class=\"qb-dash\">—</span>\n <sd-input-number class=\"qb-val\" placeholder=\"Đến\" size=\"sm\" [model]=\"rule.value?.to\" (modelChange)=\"setBetweenTo(rule, $event)\" [min]=\"fieldOf(rule)?.min\" [max]=\"fieldOf(rule)?.max\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('to-' + index)\"></sd-input-number>\n }\n @case ('date') {\n <sd-date class=\"qb-val qb-date-val\" size=\"sm\" [model]=\"rule.value?.from\" (modelChange)=\"setBetweenFrom(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('from-' + index)\"></sd-date>\n <span class=\"qb-dash\">—</span>\n <sd-date class=\"qb-val qb-date-val\" size=\"sm\" [model]=\"rule.value?.to\" (modelChange)=\"setBetweenTo(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('to-' + index)\"></sd-date>\n }\n @case ('datetime') {\n <sd-datetime class=\"qb-val\" size=\"sm\" [model]=\"rule.value?.from\" (modelChange)=\"setBetweenFrom(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('from-' + index)\"></sd-datetime>\n <span class=\"qb-dash\">—</span>\n <sd-datetime class=\"qb-val\" size=\"sm\" [model]=\"rule.value?.to\" (modelChange)=\"setBetweenTo(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('to-' + index)\"></sd-datetime>\n }\n }\n </div>\n } @else {\n @switch (fieldOf(rule)?.type) {\n @case ('string') {\n <sd-input class=\"qb-val\" placeholder=\"Giá trị\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-input>\n }\n @case ('number') {\n <sd-input-number class=\"qb-val\" placeholder=\"Giá trị\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [min]=\"fieldOf(rule)?.min\" [max]=\"fieldOf(rule)?.max\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-input-number>\n }\n @case ('boolean') {\n <sd-select class=\"qb-val\" [items]=\"booleanItems(fieldOf(rule)!)\" valueField=\"value\" displayField=\"display\" placeholder=\"Giá trị\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-select>\n }\n @case ('date') {\n @let _dateMode = dateMode(rule);\n <sd-select class=\"qb-date-mode\" [items]=\"dateModes\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"_dateMode\" (modelChange)=\"setDateMode(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('datemode-' + index)\">\n <ng-template sdItemDef let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item).icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item).display }}</span>\n </span>\n </ng-template>\n <ng-template #sdSelected let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item)?.icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item)?.display }}</span>\n </span>\n </ng-template>\n </sd-select>\n @switch (_dateMode) {\n @case ('absolute') {\n <sd-date class=\"qb-val qb-date-val\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-date>\n }\n @case ('relative') {\n <sd-input-number class=\"qb-rel-amount\" type=\"positive\" [precision]=\"0\" size=\"sm\" [model]=\"relativeAmount(rule)\" (modelChange)=\"setRelativeAmount(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('rel-amount-' + index)\"></sd-input-number>\n <sd-select class=\"qb-rel-unit\" [items]=\"relativeUnitOptions\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"relativeUnitDirValue(rule)\" (modelChange)=\"setRelativeUnitDir(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('rel-unit-' + index)\"></sd-select>\n }\n }\n }\n @case ('datetime') {\n @let _dtMode = dateMode(rule);\n <sd-select class=\"qb-date-mode\" [items]=\"dateModes\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"_dtMode\" (modelChange)=\"setDateMode(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('datemode-' + index)\">\n <ng-template sdItemDef let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item).icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item).display }}</span>\n </span>\n </ng-template>\n <ng-template #sdSelected let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item)?.icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item)?.display }}</span>\n </span>\n </ng-template>\n </sd-select>\n @switch (_dtMode) {\n @case ('absolute') {\n <sd-datetime class=\"qb-val\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-datetime>\n }\n @case ('relative') {\n <sd-input-number class=\"qb-rel-amount\" type=\"positive\" [precision]=\"0\" size=\"sm\" [model]=\"relativeAmount(rule)\" (modelChange)=\"setRelativeAmount(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('rel-amount-' + index)\"></sd-input-number>\n <sd-select class=\"qb-rel-unit\" [items]=\"relativeUnitOptions\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"relativeUnitDirValue(rule)\" (modelChange)=\"setRelativeUnitDir(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('rel-unit-' + index)\"></sd-select>\n }\n }\n }\n @case ('values') {\n <sd-select class=\"qb-val\" [items]=\"fieldOf(rule)!.values || []\" valueField=\"value\" displayField=\"display\" [multiple]=\"isMulti(rule.operator)\" placeholder=\"Giá trị\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-select>\n }\n }\n }\n }\n }\n\n <button type=\"button\" class=\"qb-btn qb-btn-remove-rule\" title=\"Xoá điều kiện\" aria-label=\"Xoá điều kiện\" [disabled]=\"resolvedDisabled()\" (click)=\"removeNode(parent, index)\">✕</button>\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["isAndOr"],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-components-query-builder.mjs","sources":["../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.model.ts","../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.serializer.ts","../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.component.ts","../../../projects/sdcorejs-angular/components/query-builder/src/query-builder.component.html","../../../projects/sdcorejs-angular/components/query-builder/sdcorejs-angular-components-query-builder.ts"],"sourcesContent":["import { DateRelative, Filter, Operator } from '@sdcorejs/utils/models';\nimport { FilterUtilities } from '@sdcorejs/utils/fns';\n\n// ---------------------------------------------------------------------------\n// Field metadata — the public config a consumer declares so the builder knows\n// each filterable field's type (→ which operators make sense) and how to render\n// its value editor + view-mode label. Self-contained: query-builder does NOT\n// reuse query-bar's SdQueryField; it only borrows `Operator`/`Filter` from utils.\n// ---------------------------------------------------------------------------\n\n/** Field kinds the builder understands. Drives the operator set + value editor. */\nexport type SdQueryBuilderFieldType = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'values';\n\n/** One option for a `values`-type field (enum / lookup). */\nexport interface SdQueryBuilderFieldOption {\n /** Stored value (sent inside the `Filter`). */\n value: any;\n /** Human-readable label shown in the select + view-mode string. */\n display: string;\n}\n\n/**\n * One filterable field. `key` matches `Filter.field` (dot-notation allowed);\n * `label` is what the view-mode raw string renders (field token = label).\n */\nexport interface SdQueryBuilderField {\n /** Dot-notation field path — written to `Filter.field`. */\n key: string;\n /** Human label — shown in the field picker AND as the view-mode field token. */\n label: string;\n /** Field type — picks the default operator set + value editor control. */\n type: SdQueryBuilderFieldType;\n /** Material icon shown before the label in the field picker; falls back to `SD_QB_TYPE_ICON[type]` then `'tune'`. */\n icon?: string;\n /** Override the allowed operator set (otherwise `SD_QB_OPERATORS_BY_TYPE[type]`). */\n operators?: Operator[];\n /** Override the starting operator (otherwise `SD_QB_DEFAULT_OPERATOR_BY_TYPE[type]`). */\n defaultOperator?: Operator;\n /** Options for `type: 'values'` — the select list + display-label lookup. */\n values?: SdQueryBuilderFieldOption[];\n /** Label for the `true` branch of a boolean field (defaults to i18n `core.component.query-builder.boolean.true`). */\n trueLabel?: string;\n /** Label for the `false` branch of a boolean field (defaults to i18n `core.component.query-builder.boolean.false`). */\n falseLabel?: string;\n /** Lower bound for number / date value editors. */\n min?: number | string;\n /** Upper bound for number / date value editors. */\n max?: number | string;\n /** Optional domain guard for field-to-field comparison candidates. */\n compareGroup?: string;\n /** Set false to hide this field from field-to-field comparison. */\n allowFieldCompare?: boolean;\n}\n\nexport interface SdQueryBuilderOption {\n autoId?: string;\n fields: SdQueryBuilderField[];\n mode?: 'edit' | 'view';\n comparisonMode?: SdQbComparisonMode;\n disabled?: boolean;\n value?: Filter | null;\n filters?: Filter[];\n rootLogic?: 'AND' | 'OR';\n onValueChange?: (value: Filter | null) => void;\n onFiltersChange?: (filters: Filter[]) => void;\n onRootLogicChange?: (logic: 'AND' | 'OR') => void;\n}\n\n// ---------------------------------------------------------------------------\n// Internal tree — carries UI state (stable `id` for @for + dropdown `open`).\n// NEVER emitted; mapped to/from the public `Filter` by the serializer.\n// ---------------------------------------------------------------------------\n\n// why: cả cụm `qb*` / `QB_*` / `Qb*` trước đây được export public từ `@sdcorejs/angular/components/query-builder`\n// (và lọt tiếp ra barrel `@sdcorejs/angular/components`) với tiền tố `qb` tự chế — không nằm trong namespace `sd`\n// của package. `QbGroup`, `QbRule`, `QbToken` là những tên rất dễ trùng với model cùng tên bên app consumer khi\n// import kiểu `export *`. Nay chuẩn hoá về `SdQb*` / `SD_QB_*` / `sdQb*`; các type đã đúng tiền tố `SdQb*`\n// (`SdQbRelativeUnit`, `SdQbRelativeDirection`, …) giữ nguyên.\nexport type SdQbNode = SdQbGroup | SdQbRule;\n\n/** Component-level capability for right-hand operands. */\nexport type SdQbComparisonMode = 'value-only' | 'value-or-field';\n\n/** Per-rule right-hand operand source. */\nexport type SdQbValueSource = 'literal' | 'field';\n\n/** A logical group of nodes joined by AND / OR. Maps to `FilterAndOr`. */\nexport interface SdQbGroup {\n id: string;\n kind: 'group';\n logic: 'AND' | 'OR';\n children: SdQbNode[];\n /** UI-only: whether this group's \"+\" dropdown is open. */\n open?: boolean;\n}\n\n/** A single `field operator value` condition. Maps to a leaf `Filter`. */\nexport interface SdQbRule {\n id: string;\n kind: 'rule';\n field?: string;\n operator?: Operator;\n /** Single value, `{ from, to }` for BETWEEN, or an array for IN / NOT_IN. */\n value?: any;\n /** Internal UI state: literal input or a same-type field reference. */\n valueSource?: SdQbValueSource;\n /** Right-hand field key when `valueSource` is `'field'`. */\n compareField?: string;\n}\n\n/** Type guard — narrows a `SdQbNode` to a `SdQbGroup`. */\nexport function sdIsQbGroup(node: SdQbNode): node is SdQbGroup {\n return node.kind === 'group';\n}\n\n// ---------------------------------------------------------------------------\n// View-mode tokens — the serializer turns a `Filter` into a token stream so the\n// template can wrap each piece in a highlight `<span>` (operator / value / etc).\n// ---------------------------------------------------------------------------\n\nexport type SdQbTokenKind = 'field' | 'op' | 'value' | 'logic' | 'paren' | 'plain';\n\n/** One piece of the rendered raw query string, tagged for highlight styling. */\nexport interface SdQbToken {\n text: string;\n kind: SdQbTokenKind;\n}\n\n// ---------------------------------------------------------------------------\n// Operator vocabulary per field type. Mirrors query-bar's\n// SD_QUERY_OPERATORS_BY_TYPE so the two components stay consistent, but is kept\n// local so query-builder has no dependency on the query-bar package.\n// ---------------------------------------------------------------------------\n\n/** Allowed operators per field type — used when `field.operators` is not set. */\nexport const SD_QB_OPERATORS_BY_TYPE: Record<SdQueryBuilderFieldType, Operator[]> = {\n string: ['CONTAIN', 'NOT_CONTAIN', 'EQUAL', 'NOT_EQUAL', 'START_WITH', 'END_WITH', 'NULL', 'NOT_NULL'],\n number: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'GREATER_OR_EQUAL', 'LESS_THAN', 'LESS_OR_EQUAL', 'BETWEEN', 'NULL', 'NOT_NULL'],\n boolean: ['EQUAL', 'NOT_EQUAL'],\n date: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'LESS_THAN', 'BETWEEN', 'NULL', 'NOT_NULL'],\n datetime: ['EQUAL', 'NOT_EQUAL', 'GREATER_THAN', 'LESS_THAN', 'BETWEEN', 'NULL', 'NOT_NULL'],\n values: ['IN', 'NOT_IN', 'EQUAL', 'NOT_EQUAL', 'NULL', 'NOT_NULL'],\n};\n\n/** Default operator when a rule is first created for a field. */\nexport const SD_QB_DEFAULT_OPERATOR_BY_TYPE: Record<SdQueryBuilderFieldType, Operator> = {\n string: 'CONTAIN',\n number: 'EQUAL',\n boolean: 'EQUAL',\n date: 'BETWEEN',\n datetime: 'BETWEEN',\n values: 'IN',\n};\n\n/** Operators with no value payload — the value editor is hidden for these. */\nexport const SD_QB_NO_DATA_OPERATORS: Operator[] = ['NULL', 'NOT_NULL'];\n\n/** Operators whose value is an array — the value editor offers multi-select. */\nexport const SD_QB_MULTI_OPERATORS: Operator[] = ['IN', 'NOT_IN'];\n\n/** Operators allowed for `field` — explicit override wins, else the per-type set. */\nexport function sdQbAllowedOperators(field: SdQueryBuilderField | undefined): Operator[] {\n if (!field) return [];\n if (field.operators?.length) return field.operators;\n return SD_QB_OPERATORS_BY_TYPE[field.type] ?? [];\n}\n\n/** Starting operator for a new rule on `field` — falls back to the per-type default. */\nexport function sdQbDefaultOperator(field: SdQueryBuilderField | undefined): Operator | undefined {\n if (!field) return undefined;\n const allowed = sdQbAllowedOperators(field);\n if (field.defaultOperator && allowed.includes(field.defaultOperator)) return field.defaultOperator;\n const byType = SD_QB_DEFAULT_OPERATOR_BY_TYPE[field.type];\n return allowed.includes(byType) ? byType : allowed[0];\n}\n\n/** True when `op` is NULL / NOT_NULL (no value editor). */\nexport function sdQbIsNoDataOperator(op: Operator | undefined): boolean {\n return !!op && SD_QB_NO_DATA_OPERATORS.includes(op);\n}\n\n/** True when `op` is IN / NOT_IN (array value). */\nexport function sdQbIsMultiOperator(op: Operator | undefined): boolean {\n return !!op && SD_QB_MULTI_OPERATORS.includes(op);\n}\n\n/** True when the operator accepts one right-hand operand, including a field reference. */\nexport function sdQbSupportsFieldCompareOperator(op: Operator | undefined): boolean {\n return !!op && !sdQbIsNoDataOperator(op) && !sdQbIsMultiOperator(op) && op !== 'BETWEEN';\n}\n\n/**\n * Icon fallback per field type when `SdQueryBuilderField.icon` is not set.\n * Mirrors query-bar's `SD_QUERY_TYPE_ICON` so the two components read consistently,\n * but kept local so query-builder has no dependency on the query-bar package.\n */\nexport const SD_QB_TYPE_ICON: Record<SdQueryBuilderFieldType, string> = {\n string: 'text_fields',\n number: 'tag',\n boolean: 'toggle_on',\n date: 'event',\n datetime: 'schedule',\n values: 'list',\n};\n\n/**\n * Icon shown before a field in the field picker / selected trigger.\n * Priority: `field.icon` → `SD_QB_TYPE_ICON[field.type]` → `'tune'` (default, like query-bar).\n */\nexport function sdQbFieldIcon(field: SdQueryBuilderField | undefined): string {\n if (!field) return 'tune';\n return field.icon ?? SD_QB_TYPE_ICON[field.type] ?? 'tune';\n}\n\n// ---------------------------------------------------------------------------\n// Node factories — monotonic counter for stable, render-safe ids (no Math.random\n// / Date.now so SSR + tests stay deterministic).\n// ---------------------------------------------------------------------------\n\nlet qbSeq = 0;\n\n/** Next stable node id with the given prefix. */\nexport function sdQbId(prefix = 'qb'): string {\n return `${prefix}-${++qbSeq}`;\n}\n\n/** Build a fresh rule node (optionally pre-filled). */\nexport function sdQbNewRule(\n field?: string,\n operator?: Operator,\n value?: any,\n valueSource?: SdQbValueSource,\n compareField?: string\n): SdQbRule {\n return { id: sdQbId('r'), kind: 'rule', field, operator, value, valueSource, compareField };\n}\n\n/** Build a fresh group node. */\nexport function sdQbNewGroup(logic: 'AND' | 'OR' = 'AND', children: SdQbNode[] = []): SdQbGroup {\n return { id: sdQbId('g'), kind: 'group', logic, children };\n}\n\n// ---------------------------------------------------------------------------\n// Relative dates — a date/datetime rule's value may be a relative spec resolved\n// at query time, instead of an absolute picked date. The model is REUSED from\n// `@sdcorejs/utils`: an offset is a `DateRelative` ({ amount, direction, unit });\n// \"today\" is the `'TODAY'` sentinel. The serializer maps these to the Filter\n// `dataType` discriminator (`'date-relative'` / `'date-today'`). The builder UI\n// only offers day/week/month even though `DateRelative` also allows `'hour'`.\n// Single-value operators only (not BETWEEN).\n// ---------------------------------------------------------------------------\n\n/** Offset unit for a relative date — re-exported from the utils `DateRelative` model. */\nexport type SdQbRelativeUnit = DateRelative['unit'];\n\n/** Offset direction for a relative date — re-exported from the utils `DateRelative` model. */\nexport type SdQbRelativeDirection = DateRelative['direction'];\n\n/** Sentinel held as a rule value (and emitted as `data`) for the \"today\" date mode. */\nexport const SD_QB_TODAY = 'TODAY';\n/** The `'TODAY'` sentinel type (matches the utils `date-today` data literal). */\nexport type SdQbToday = typeof SD_QB_TODAY;\n\n/** Date value editor mode for a date/datetime rule (derived from the rule value). */\nexport type SdQbDateMode = 'absolute' | 'now' | 'relative';\n\n/** Type guard — narrows a rule value to a utils `DateRelative` (offset spec). */\nexport const sdQbIsRelativeDate = FilterUtilities.isDateRelative;\n\n/** Type guard — narrows a rule value to the `'TODAY'` sentinel (\"now\"/today mode). */\nexport function sdQbIsToday(v: any): v is SdQbToday {\n return v === SD_QB_TODAY;\n}\n\n/** Starting relative value when a rule first switches to \"relative\" mode. */\nexport function sdQbDefaultRelative(): DateRelative {\n return { amount: 1, direction: 'previous', unit: 'day' };\n}\n\n// ---------------------------------------------------------------------------\n// Option tables — mỗi option mang KEY i18n, không mang nhãn đã dịch.\n//\n// why: các bảng này là hằng số cấp module, được đánh giá đúng MỘT lần lúc load module. Nhãn dịch\n// sẵn ở đây sẽ đóng băng theo ngôn ngữ tại thời điểm đó và không bao giờ phản ứng với\n// `I18nService.setLanguage()`. Giữ key ở đây rồi dịch lúc ĐỌC (computed trong component) để nhãn\n// bám theo ngôn ngữ hiện tại, đồng thời `computed` vẫn memo hoá nên tham chiếu mảng ổn định giữa\n// các chu kỳ change detection — điều kiện bắt buộc của `sd-select [items]` (xem `#booleanOptionsByKey`).\n// ---------------------------------------------------------------------------\n\n/** One date-mode option — carries a Material icon shown in the dropdown + selected trigger. */\nexport interface SdQbDateModeOption {\n value: SdQbDateMode;\n /** i18n key of the label — resolved at read time, NOT at module-eval time. */\n labelKey: string;\n /** Material icon name (outlined set). */\n icon: string;\n}\n\n/** Stable option list for the date-mode select (module ref — never reallocated). */\nexport const SD_QB_DATE_MODES: SdQbDateModeOption[] = [\n { value: 'absolute', labelKey: 'core.component.query-builder.date-mode.absolute', icon: 'event' },\n { value: 'now', labelKey: 'core.component.query-builder.date-mode.now', icon: 'today' },\n { value: 'relative', labelKey: 'core.component.query-builder.date-mode.relative', icon: 'history' },\n];\n\n/** One value-source option for field-to-field comparison UI. */\nexport interface SdQbValueSourceOption {\n value: SdQbValueSource;\n /** i18n key of the label — resolved at read time, NOT at module-eval time. */\n labelKey: string;\n /** Material icon name (outlined set). */\n icon: string;\n}\n\n/** Stable option list for choosing between a literal value and another field. */\nexport const SD_QB_VALUE_SOURCE_OPTIONS: SdQbValueSourceOption[] = [\n { value: 'literal', labelKey: 'core.component.query-builder.value-source.literal', icon: 'edit_note' },\n { value: 'field', labelKey: 'core.component.query-builder.value-source.field', icon: 'view_column' },\n];\n\n/** One combined direction×unit option (token `'unit:direction'`). */\nexport interface SdQbRelativeUnitOption {\n value: string;\n /** i18n key of the label — resolved at read time, NOT at module-eval time. */\n labelKey: string;\n}\n\n/** Stable combined direction×unit option list (token `'unit:direction'`). */\nexport const SD_QB_RELATIVE_UNIT_OPTIONS: SdQbRelativeUnitOption[] = [\n { value: 'day:previous', labelKey: 'core.component.query-builder.relative.day-previous' },\n { value: 'day:next', labelKey: 'core.component.query-builder.relative.day-next' },\n { value: 'week:previous', labelKey: 'core.component.query-builder.relative.week-previous' },\n { value: 'week:next', labelKey: 'core.component.query-builder.relative.week-next' },\n { value: 'month:previous', labelKey: 'core.component.query-builder.relative.month-previous' },\n { value: 'month:next', labelKey: 'core.component.query-builder.relative.month-next' },\n];\n\n/** i18n key of the combined `unit`×`direction` phrase for a relative-date offset. */\nexport function qbRelativeLabelKey(unit: SdQbRelativeUnit, direction: SdQbRelativeDirection): string {\n return `core.component.query-builder.relative.${unit}-${direction}`;\n}\n\n/** Shared empty option array — stable ref for fallbacks (avoids per-call allocation). */\nexport const SD_QB_EMPTY_OPTIONS: SdQueryBuilderFieldOption[] = [];\n","import { DateRelative, Filter, Operator } from '@sdcorejs/utils/models';\nimport {\n sdIsQbGroup,\n SD_QB_MULTI_OPERATORS,\n SD_QB_NO_DATA_OPERATORS,\n SD_QB_TODAY,\n sdQbIsRelativeDate,\n sdQbIsToday,\n sdQbSupportsFieldCompareOperator,\n SdQbGroup,\n SdQbNode,\n SdQbRule,\n SdQbToday,\n SdQbToken,\n sdQbNewGroup,\n sdQbNewRule,\n qbRelativeLabelKey,\n SdQueryBuilderField,\n} from './query-builder.model';\n\n/**\n * Hàm dịch một key i18n, do component truyền xuống.\n * why: `filterToTokens` là hàm thuần cấp module nên không inject `I18nService` được; nhận translator\n * qua tham số vẫn giữ được tính thuần mà bỏ được chuỗi tiếng Việt hardcode trong chuỗi view.\n */\nexport type SdQbTranslate = (key: string, params?: Record<string, string | number>) => string;\n\n/** Fallback khi caller không truyền translator: trả về chính key để thiếu i18n lộ ra, không im lặng. */\nconst IDENTITY_TRANSLATE: SdQbTranslate = key => key;\n\n// SQL symbol for each single-value comparison operator.\nconst SYMBOL: Partial<Record<Operator, string>> = {\n EQUAL: '=',\n NOT_EQUAL: '!=',\n GREATER_THAN: '>',\n LESS_THAN: '<',\n GREATER_OR_EQUAL: '>=',\n LESS_OR_EQUAL: '<=',\n};\n\nconst LIKE_OPERATORS: Operator[] = ['CONTAIN', 'NOT_CONTAIN', 'START_WITH', 'NOT_START_WITH', 'END_WITH', 'NOT_END_WITH'];\n\n/** A `Filter` is a logical group when its operator is AND / OR and it carries a `data[]`. */\nfunction isAndOr(filter: any): filter is { operator: 'AND' | 'OR'; data: Filter[] } {\n return !!filter && (filter.operator === 'AND' || filter.operator === 'OR') && Array.isArray(filter.data);\n}\n\nfunction isEmptyValue(v: any): boolean {\n return v === null || v === undefined || v === '';\n}\n\n// ---------------------------------------------------------------------------\n// Internal tree → public Filter\n// ---------------------------------------------------------------------------\n\nfunction ruleToFilter(rule: SdQbRule): Filter | null {\n if (!rule.field || !rule.operator) return null;\n const operator = rule.operator;\n\n if (SD_QB_NO_DATA_OPERATORS.includes(operator)) {\n return { field: rule.field as any, operator } as Filter;\n }\n\n if (rule.valueSource === 'field') {\n if (!sdQbSupportsFieldCompareOperator(operator) || isEmptyValue(rule.compareField)) return null;\n return { field: rule.field as any, operator, dataType: 'field', data: rule.compareField } as Filter;\n }\n\n if (operator === 'BETWEEN') {\n const v = rule.value;\n if (!v || typeof v !== 'object') return null;\n if (isEmptyValue(v.from) || isEmptyValue(v.to)) return null;\n return { field: rule.field as any, operator: 'BETWEEN', data: { from: v.from, to: v.to } } as Filter;\n }\n\n if (SD_QB_MULTI_OPERATORS.includes(operator)) {\n const arr = Array.isArray(rule.value) ? rule.value : isEmptyValue(rule.value) ? [] : [rule.value];\n if (!arr.length) return null;\n return { field: rule.field as any, operator, data: arr } as Filter;\n }\n\n if (sdQbIsToday(rule.value)) {\n return { field: rule.field as any, operator, dataType: 'date-today', data: SD_QB_TODAY } as Filter;\n }\n\n if (sdQbIsRelativeDate(rule.value)) {\n const v = rule.value;\n // emit only when fully specified, else drop the incomplete rule\n if (v.unit && v.direction && typeof v.amount === 'number' && v.amount >= 1) {\n return {\n field: rule.field as any,\n operator,\n dataType: 'date-relative',\n data: { amount: v.amount, direction: v.direction, unit: v.unit },\n } as Filter;\n }\n return null;\n }\n\n // A non-relative plain object is an incomplete/stray shape (e.g. a partial offset) — drop it.\n if (rule.value !== null && typeof rule.value === 'object' && !Array.isArray(rule.value)) return null;\n if (isEmptyValue(rule.value)) return null;\n return { field: rule.field as any, operator, data: rule.value } as Filter;\n}\n\nfunction nodeToFilter(node: SdQbNode): Filter | null {\n if (sdIsQbGroup(node)) {\n const data = node.children.map(nodeToFilter).filter((f): f is Filter => f != null);\n if (!data.length) return null;\n return { operator: node.logic, data } as Filter;\n }\n return ruleToFilter(node);\n}\n\n/**\n * Map the internal builder tree to the public `Filter` (the root is always a\n * `FilterAndOr`). Rules missing field / operator / value — and empty nested\n * groups — are dropped so the result is always a valid `Filter`.\n *\n * @param group - the editable tree's root group.\n * @returns the canonical nested `Filter`, or `null` when no complete rule survives.\n */\nexport function treeToFilter(group: SdQbGroup): Filter | null {\n return nodeToFilter(group);\n}\n\n// ---------------------------------------------------------------------------\n// Public Filter → internal tree (for seeding [value])\n// ---------------------------------------------------------------------------\n\nfunction ruleFromFilter(filter: any): SdQbRule {\n const operator = filter.operator as Operator;\n if (SD_QB_NO_DATA_OPERATORS.includes(operator)) {\n return sdQbNewRule(filter.field, operator);\n }\n if (filter.dataType === 'field') {\n return sdQbNewRule(filter.field, operator, undefined, 'field', filter.data);\n }\n // Relative dates: read the utils `dataType` discriminator back into the internal value.\n if (filter.dataType === 'date-today') {\n return sdQbNewRule(filter.field, operator, SD_QB_TODAY);\n }\n if (filter.dataType === 'date-relative') {\n return sdQbNewRule(filter.field, operator, filter.data);\n }\n // Back-compat: legacy `{ rel: 'now' | 'offset' }` payloads (pre-dataType migration)\n // still seed the editor correctly.\n const legacy = readLegacyRelative(filter.data);\n if (legacy !== undefined) {\n return sdQbNewRule(filter.field, operator, legacy);\n }\n return sdQbNewRule(filter.field, operator, filter.data);\n}\n\n/** Map a pre-migration `{ rel }` payload to the new internal value, or `undefined` if not legacy. */\nfunction readLegacyRelative(data: any): SdQbToday | DateRelative | undefined {\n if (!data || typeof data !== 'object') return undefined;\n if (data.rel === 'now') return SD_QB_TODAY;\n if (data.rel === 'offset' && data.unit && data.direction && typeof data.amount === 'number') {\n return { amount: data.amount, direction: data.direction, unit: data.unit };\n }\n return undefined;\n}\n\nfunction nodeFromFilter(filter: Filter): SdQbNode {\n return isAndOr(filter) ? groupFromFilter(filter) : ruleFromFilter(filter);\n}\n\nfunction groupFromFilter(filter: { operator: 'AND' | 'OR'; data: Filter[] }): SdQbGroup {\n return sdQbNewGroup(filter.operator, filter.data.map(nodeFromFilter));\n}\n\n/**\n * Inverse of {@link treeToFilter} — rebuild the editable tree from a `Filter` so a\n * consumer can seed `[value]`. A non-group (bare) filter is wrapped in an AND root;\n * `null` yields an empty AND root.\n *\n * @param filter - a `Filter` (group or leaf), or `null` / `undefined` for an empty tree.\n * @returns a fresh root `SdQbGroup` mirroring the filter's structure.\n */\nexport function filterToTree(filter: Filter | null | undefined): SdQbGroup {\n if (!filter) return sdQbNewGroup('AND', []);\n if (isAndOr(filter)) return groupFromFilter(filter);\n return sdQbNewGroup('AND', [ruleFromFilter(filter)]);\n}\n\n// ---------------------------------------------------------------------------\n// Public Filter → SQL-ish highlight tokens (view mode)\n// ---------------------------------------------------------------------------\n\nfunction escapeStr(s: string): string {\n return s.replace(/'/g, \"''\");\n}\n\n/** Render a relative-date offset as a readable phrase in the active language. */\nfunction formatRelative(v: DateRelative, t: SdQbTranslate): string {\n // why: mỗi ngôn ngữ ghép `amount` với cụm đơn vị+hướng theo trật tự khác nhau ('3 ngày trước' /\n // '3 days ago' / '3日前'), nên để catalog quyết định trật tự thay vì nối chuỗi cứng ở đây.\n return t('core.component.query-builder.relative.format', {\n amount: v.amount,\n phrase: t(qbRelativeLabelKey(v.unit, v.direction)),\n });\n}\n\n/** Format one scalar value for the view string — quoted/labelled per field type. */\nfunction formatScalar(field: SdQueryBuilderField | undefined, raw: any, t: SdQbTranslate): string {\n if (sdQbIsToday(raw)) return t('core.component.query-builder.date-mode.now');\n if (sdQbIsRelativeDate(raw)) return formatRelative(raw, t);\n if (raw === null || raw === undefined) return '';\n if (field?.type === 'boolean') {\n return raw\n ? (field.trueLabel ?? t('core.component.query-builder.boolean.true'))\n : (field.falseLabel ?? t('core.component.query-builder.boolean.false'));\n }\n if (field?.type === 'values') {\n const opt = field.values?.find(o => o.value === raw);\n return `'${escapeStr(opt ? opt.display : String(raw))}'`;\n }\n if (field?.type === 'number' || typeof raw === 'number' || typeof raw === 'boolean') {\n return String(raw);\n }\n // string / date / datetime / unknown → quoted\n return `'${escapeStr(String(raw))}'`;\n}\n\nfunction likePattern(operator: Operator, raw: string): string {\n const esc = escapeStr(raw);\n if (operator === 'CONTAIN' || operator === 'NOT_CONTAIN') return `'%${esc}%'`;\n if (operator === 'START_WITH' || operator === 'NOT_START_WITH') return `'${esc}%'`;\n return `'%${esc}'`; // END_WITH / NOT_END_WITH\n}\n\nfunction operatorToken(operator: Operator): string {\n if (LIKE_OPERATORS.includes(operator)) return operator.startsWith('NOT_') ? 'not like' : 'like';\n return SYMBOL[operator] ?? operator;\n}\n\nfunction ruleTokens(filter: any, fields: SdQueryBuilderField[], t: SdQbTranslate): SdQbToken[] {\n const field = fields.find(f => f.key === filter.field);\n const out: SdQbToken[] = [{ kind: 'field', text: field?.label ?? String(filter.field) }];\n const sp = () => out.push({ kind: 'plain', text: ' ' });\n const operator = filter.operator as Operator;\n\n if (SD_QB_NO_DATA_OPERATORS.includes(operator)) {\n sp();\n out.push({ kind: 'op', text: operator === 'NULL' ? 'is null' : 'is not null' });\n return out;\n }\n\n if (operator === 'BETWEEN') {\n sp();\n out.push({ kind: 'op', text: 'between' });\n sp();\n out.push({ kind: 'value', text: formatScalar(field, filter.data?.from, t) });\n out.push({ kind: 'plain', text: ' and ' });\n out.push({ kind: 'value', text: formatScalar(field, filter.data?.to, t) });\n return out;\n }\n\n if (SD_QB_MULTI_OPERATORS.includes(operator)) {\n sp();\n out.push({ kind: 'op', text: operator === 'IN' ? 'in' : 'not in' });\n sp();\n const arr: any[] = Array.isArray(filter.data) ? filter.data : [];\n out.push({ kind: 'value', text: `(${arr.map((v: any) => formatScalar(field, v, t)).join(', ')})` });\n return out;\n }\n\n if (filter.dataType === 'field') {\n const compareField = fields.find(f => f.key === filter.data);\n sp();\n out.push({ kind: 'op', text: operatorToken(operator) });\n sp();\n out.push({ kind: 'field', text: compareField?.label ?? String(filter.data) });\n return out;\n }\n\n if (LIKE_OPERATORS.includes(operator)) {\n sp();\n out.push({ kind: 'op', text: operatorToken(operator) });\n sp();\n out.push({ kind: 'value', text: likePattern(operator, String(filter.data ?? '')) });\n return out;\n }\n\n sp();\n out.push({ kind: 'op', text: operatorToken(operator) });\n sp();\n out.push({ kind: 'value', text: formatScalar(field, filter.data, t) });\n return out;\n}\n\nfunction tokensFor(filter: Filter, fields: SdQueryBuilderField[], t: SdQbTranslate): SdQbToken[] {\n if (isAndOr(filter)) {\n const out: SdQbToken[] = [];\n filter.data.forEach((child, i) => {\n if (i > 0) out.push({ kind: 'logic', text: ` ${filter.operator.toLowerCase()} ` });\n const childTokens = tokensFor(child, fields, t);\n // Wrap a nested multi-child group in parentheses; a single-child group needs none.\n if (isAndOr(child) && child.data.length > 1) {\n out.push({ kind: 'paren', text: '(' }, ...childTokens, { kind: 'paren', text: ')' });\n } else {\n out.push(...childTokens);\n }\n });\n return out;\n }\n return ruleTokens(filter, fields, t);\n}\n\n/**\n * Render a `Filter` to a SQL-ish token stream for view mode. Field tokens use the\n * matching field's `label`; operators map to SQL syntax (`= != like between is null …`);\n * `and` / `or` are lowercase; nested multi-child groups are wrapped in parentheses.\n * Returns a token stream (not a string) so the template can wrap each piece in a\n * highlight `<span>` keyed by `SdQbToken.kind`.\n *\n * @param filter - the `Filter` to render, or `null` / `undefined`.\n * @param fields - field metadata, used to resolve each field key to its display label + value formatting.\n * @param translate - i18n lookup for language-dependent value tokens (today / relative offsets /\n * boolean labels). Optional so the serializer stays callable outside an Angular injection context;\n * omitting it renders the raw i18n keys.\n * @returns the ordered tokens, or `[]` when `filter` is empty.\n */\nexport function filterToTokens(\n filter: Filter | null | undefined,\n fields: SdQueryBuilderField[],\n translate: SdQbTranslate = IDENTITY_TRANSLATE\n): SdQbToken[] {\n if (!filter) return [];\n return tokensFor(filter, fields, translate);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n untracked,\n} from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdItemDefDefDirective } from '@sdcorejs/angular/forms/directives';\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { DateRelative, Filter, Operator } from '@sdcorejs/utils/models';\nimport {\n sdIsQbGroup,\n SD_QB_DATE_MODES,\n SD_QB_EMPTY_OPTIONS,\n SD_QB_RELATIVE_UNIT_OPTIONS,\n SD_QB_TODAY,\n SD_QB_VALUE_SOURCE_OPTIONS,\n SdQbComparisonMode,\n SdQbDateMode,\n SdQbGroup,\n SdQbNode,\n SdQbRule,\n SdQbToken,\n SdQbValueSource,\n sdQbAllowedOperators,\n sdQbDefaultOperator,\n sdQbDefaultRelative,\n sdQbSupportsFieldCompareOperator,\n sdQbIsMultiOperator,\n sdQbIsNoDataOperator,\n sdQbIsRelativeDate,\n sdQbIsToday,\n sdQbFieldIcon,\n sdQbNewGroup,\n sdQbNewRule,\n SdQueryBuilderField,\n SdQueryBuilderFieldOption,\n SdQueryBuilderOption,\n} from './query-builder.model';\nimport { filterToTokens, filterToTree, treeToFilter } from './query-builder.serializer';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n/** A logical `Filter` (AND / OR group) carries a `data[]` array. */\nfunction isAndOr(filter: any): boolean {\n return !!filter && (filter.operator === 'AND' || filter.operator === 'OR') && Array.isArray(filter.data);\n}\n\nconst QB_EMPTY_FIELDS: SdQueryBuilderField[] = [];\n\n/**\n * Visual filter / rule builder. Compose nested AND / OR groups of\n * `field operator value` conditions; emits the canonical `Filter` (root is a\n * `FilterAndOr` tree) via `[(value)]`, plus a flat `[(filters)]` mirror of the\n * root group's direct children. `mode=\"view\"` renders a read-only SQL-ish raw\n * string with highlighted operators + values.\n */\n@Component({\n selector: 'sd-query-builder',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, NgTemplateOutlet, SdOperator, SdSelect, SdInput, SdInputNumber, SdDate, SdDatetime, SdItemDefDefDirective],\n templateUrl: './query-builder.component.html',\n styleUrl: './query-builder.component.scss',\n})\nexport class SdQueryBuilder {\n readonly #i18n = inject(I18nService);\n\n // -------------------------------------------------------------------------\n // Inputs\n // -------------------------------------------------------------------------\n\n /** Main option object. Prefer this API for new usage; individual inputs stay as a migration bridge. */\n readonly option = input<SdQueryBuilderOption | undefined>(undefined);\n\n /** Filterable fields — each declares a `type` that drives the operator set + value editor. */\n readonly fields = input<SdQueryBuilderField[]>([]);\n\n /** `'edit'` (default) = interactive tree · `'view'` = read-only raw-query string. */\n readonly mode = input<'edit' | 'view'>('edit');\n\n /** `value-only` = literal operands only · `value-or-field` = each rule may compare against another field. */\n readonly comparisonMode = input<SdQbComparisonMode>('value-only');\n\n /** Disable all editing controls. */\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** Prefix for `data-autoid` on inner controls (E2E selectors). */\n readonly autoId = input<string>();\n\n // -------------------------------------------------------------------------\n // Two-way models (output contract)\n // -------------------------------------------------------------------------\n\n /** Canonical output — the root `FilterAndOr` tree, or `null` when empty. `[(value)]`. */\n readonly value = model<Filter | null>(null);\n\n /** Convenience mirror — the root group's direct children. `[(filters)]`. */\n readonly filters = model<Filter[]>([]);\n\n /** Root group's logical connector. `[(rootLogic)]`. */\n readonly rootLogic = model<'AND' | 'OR'>('AND');\n\n // -------------------------------------------------------------------------\n // Internal source of truth — the editable tree (carries UI state).\n // -------------------------------------------------------------------------\n\n readonly #tree = signal<SdQbGroup>(sdQbNewGroup('AND'));\n readonly tree = this.#tree.asReadonly();\n\n /** Last filter WE emitted — used to recognise (and ignore) our own echo in the inbound effect. */\n #lastEmitted: Filter | null | undefined = undefined;\n\n // -------------------------------------------------------------------------\n // Derived state\n // -------------------------------------------------------------------------\n\n /** `field.key` → field, for fast lookup from a rule. */\n readonly resolvedFields = computed(() => this.option()?.fields ?? this.fields());\n readonly resolvedMode = computed(() => this.option()?.mode ?? this.mode());\n readonly resolvedComparisonMode = computed(() => this.option()?.comparisonMode ?? this.comparisonMode());\n readonly resolvedDisabled = computed(() => this.option()?.disabled ?? this.disabled());\n readonly resolvedAutoId = computed(() => this.option()?.autoId ?? this.autoId());\n\n readonly fieldByKey = computed<Record<string, SdQueryBuilderField>>(() => {\n const map: Record<string, SdQueryBuilderField> = {};\n for (const f of this.resolvedFields()) map[f.key] = f;\n return map;\n });\n\n /** Boolean fields → their stable `[true,false]` option list. Memoized so the template\n * binding hands `sd-select` the SAME array ref each CD (else its `toObservable(items)`\n * → `markForCheck()` loops → OOM). Recomputes only when `fields()` changes. */\n readonly #booleanOptionsByKey = computed<Map<string, SdQueryBuilderFieldOption[]>>(() => {\n const map = new Map<string, SdQueryBuilderFieldOption[]>();\n for (const f of this.resolvedFields()) {\n if (f.type === 'boolean') {\n map.set(f.key, [\n { value: true, display: f.trueLabel ?? this.#i18n.t('core.component.query-builder.boolean.true') },\n { value: false, display: f.falseLabel ?? this.#i18n.t('core.component.query-builder.boolean.false') },\n ]);\n }\n }\n return map;\n });\n\n // -------------------------------------------------------------------------\n // Option lists — dịch lúc ĐỌC, không phải lúc module được đánh giá.\n //\n // why: bảng hằng số trong `query-builder.model.ts` chỉ giữ `labelKey`; `computed` ở đây mới sinh\n // ra `display`. Nhờ vậy đổi ngôn ngữ là nhãn đổi theo (computed phụ thuộc signal `messages()` bên\n // trong `I18nService.t`), mà tham chiếu mảng vẫn ỔN ĐỊNH giữa các chu kỳ change detection vì\n // computed chỉ tính lại khi ngôn ngữ đổi — bắt buộc, nếu không `sd-select` sẽ rơi lại vào vòng lặp\n // `toObservable(items)` → `markForCheck()` → CD mới → mảng mới (xem `#booleanOptionsByKey`).\n // -------------------------------------------------------------------------\n\n /** Stable option list for the date-mode select. */\n readonly dateModes = computed(() => SD_QB_DATE_MODES.map(o => ({ ...o, display: this.#i18n.t(o.labelKey) })));\n /** Stable option list for the literal-vs-field operand select. */\n readonly valueSourceOptions = computed(() => SD_QB_VALUE_SOURCE_OPTIONS.map(o => ({ ...o, display: this.#i18n.t(o.labelKey) })));\n /** Stable combined unit×direction option list for the relative select. */\n readonly relativeUnitOptions = computed(() => SD_QB_RELATIVE_UNIT_OPTIONS.map(o => ({ ...o, display: this.#i18n.t(o.labelKey) })));\n\n // Nhãn i18n tĩnh của template (placeholder / title / aria-label / trạng thái rỗng).\n readonly selectFieldLabel = computed(() => this.#i18n.t('core.component.query-builder.select-field'));\n readonly valueLabel = computed(() => this.#i18n.t('core.component.query-builder.value'));\n readonly fromLabel = computed(() => this.#i18n.t('core.component.query-builder.from'));\n readonly toLabel = computed(() => this.#i18n.t('core.component.query-builder.to'));\n readonly addLabel = computed(() => this.#i18n.t('core.component.query-builder.add'));\n readonly addNodeLabel = computed(() => this.#i18n.t('core.component.query-builder.add-node'));\n readonly conditionLabel = computed(() => this.#i18n.t('core.component.query-builder.condition'));\n readonly groupLabel = computed(() => this.#i18n.t('core.component.query-builder.group'));\n readonly removeGroupLabel = computed(() => this.#i18n.t('core.component.query-builder.remove-group'));\n readonly removeConditionLabel = computed(() => this.#i18n.t('core.component.query-builder.remove-condition'));\n readonly emptyLabel = computed(() => this.#i18n.t('core.component.query-builder.empty'));\n\n readonly #compareFieldsByKey = computed<Map<string, SdQueryBuilderField[]>>(() => {\n const fields = this.resolvedFields();\n const map = new Map<string, SdQueryBuilderField[]>();\n\n for (const left of fields) {\n if (left.allowFieldCompare === false) {\n map.set(left.key, QB_EMPTY_FIELDS);\n continue;\n }\n\n map.set(\n left.key,\n fields.filter(right => {\n if (right.key === left.key) return false;\n if (right.allowFieldCompare === false) return false;\n if (right.type !== left.type) return false;\n if ((left.compareGroup ?? right.compareGroup) !== undefined && left.compareGroup !== right.compareGroup) return false;\n return true;\n })\n );\n }\n\n return map;\n });\n\n /**\n * Translator handed to the serializer.\n * why: `filterToTokens` là hàm thuần cấp module, không inject được. Truyền hàm dịch vào để chuỗi\n * view-mode (\"hôm nay\", \"3 ngày trước\", \"Có\"/\"Không\") không còn hardcode tiếng Việt. Trường ổn\n * định (không tạo mới mỗi lần gọi) để `computed` bên dưới không phụ thuộc tham chiếu mới.\n */\n readonly #translate = (key: string, params?: Record<string, string | number>): string => this.#i18n.t(key, params);\n\n /** View-mode token stream — recomputed from the emitted value (and from the active language). */\n readonly tokens = computed<SdQbToken[]>(() =>\n filterToTokens(this.option()?.value ?? this.value(), this.resolvedFields(), this.#translate)\n );\n\n readonly isView = computed(() => this.resolvedMode() === 'view');\n\n /** Expose the type-guard to the template. */\n readonly isGroup = sdIsQbGroup;\n\n /** Resolve the leading icon for a field (own `icon` → per-type → `'tune'`) — used by the field picker. */\n readonly fieldIcon = sdQbFieldIcon;\n\n constructor() {\n // Inbound seeding: an EXTERNAL write to value / filters rebuilds the tree.\n // Our own emits are recognised via #lastEmitted and skipped (no echo loop).\n effect(() => {\n const option = this.option();\n const v = option?.value ?? this.value();\n const fl = option?.filters ?? this.filters();\n const incoming = this.#coalesce(v, fl, option?.rootLogic);\n if (this.#filterEq(incoming, this.#lastEmitted)) return;\n this.#tree.set(filterToTree(incoming));\n this.#commit();\n });\n }\n\n #coalesce(v: Filter | null, fl: Filter[], logic?: 'AND' | 'OR'): Filter | null {\n if (v) return v;\n if (fl && fl.length) return { operator: logic ?? untracked(() => this.rootLogic()), data: fl } as Filter;\n return null;\n }\n\n #filterEq(a: Filter | null | undefined, b: Filter | null | undefined): boolean {\n return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n }\n\n // -------------------------------------------------------------------------\n // Tree mutation → emit\n // -------------------------------------------------------------------------\n\n /** New root ref so the template (which reads `tree()`) re-renders. */\n #bumpTree(): void {\n this.#tree.set({ ...this.#tree() });\n }\n\n /** Recompute the output `Filter` from the tree and push it to value / filters / rootLogic. */\n #commit(): void {\n const filter = treeToFilter(this.#tree());\n this.#lastEmitted = filter;\n this.value.set(filter);\n const filters = isAndOr(filter) ? (filter as any).data : filter ? [filter] : [];\n this.filters.set(filters);\n const logic = this.#tree().logic;\n if (this.rootLogic() !== logic) this.rootLogic.set(logic);\n this.option()?.onValueChange?.(filter);\n this.option()?.onFiltersChange?.(filters);\n this.option()?.onRootLogicChange?.(logic);\n }\n\n /** Mutate-in-place + re-render + emit. */\n #apply(): void {\n this.#bumpTree();\n this.#commit();\n }\n\n // -------------------------------------------------------------------------\n // Group / rule structural mutations\n // -------------------------------------------------------------------------\n\n /** Switch a group's AND/OR connector and re-emit. No-op when disabled or unchanged. */\n setGroupLogic(group: SdQbGroup, logic: 'AND' | 'OR'): void {\n if (this.resolvedDisabled() || group.logic === logic) return;\n group.logic = logic;\n this.#apply();\n }\n\n /** Open this group's \"+\" menu (closing any other open one). UI-only — does not emit. */\n toggleDropdown(group: SdQbGroup, event: Event): void {\n if (this.resolvedDisabled()) return;\n event.stopPropagation();\n const willOpen = !group.open;\n this.#closeAllDropdowns(this.#tree());\n group.open = willOpen;\n this.#bumpTree(); // UI-only — no emit\n }\n\n closeAllDropdowns(): void {\n if (!this.#hasOpenDropdown(this.#tree())) return; // avoid a re-render on every container click\n this.#closeAllDropdowns(this.#tree());\n this.#bumpTree();\n }\n\n #hasOpenDropdown(node: SdQbNode): boolean {\n if (!sdIsQbGroup(node)) return false;\n return node.open === true || node.children.some(c => this.#hasOpenDropdown(c));\n }\n\n #closeAllDropdowns(node: SdQbNode): void {\n if (sdIsQbGroup(node)) {\n node.open = false;\n node.children.forEach(c => this.#closeAllDropdowns(c));\n }\n }\n\n /** Append a blank rule to `group`. */\n addRule(group: SdQbGroup): void {\n if (this.resolvedDisabled()) return;\n group.children.push(sdQbNewRule());\n group.open = false;\n this.#apply();\n }\n\n /** Append a nested sub-group (seeded with one blank rule) to `group`. */\n addGroup(group: SdQbGroup): void {\n if (this.resolvedDisabled()) return;\n group.children.push(sdQbNewGroup('AND', [sdQbNewRule()]));\n group.open = false;\n this.#apply();\n }\n\n /** Remove the child at `index` from `parent` (a rule or a whole sub-group). */\n removeNode(parent: SdQbGroup, index: number): void {\n if (this.resolvedDisabled()) return;\n parent.children.splice(index, 1);\n this.#apply();\n }\n\n // -------------------------------------------------------------------------\n // Rule field / operator / value mutations\n // -------------------------------------------------------------------------\n\n /**\n * Point `rule` at a new field. Resets operator to the field's default and the value\n * to that operator's empty shape — the old operator/value rarely fit the new type.\n *\n * @param rule - the rule being edited.\n * @param key - the chosen field key (from the field picker). Swap-only: a null / undefined\n * key is a no-op — the field can be changed but never cleared (issue #2).\n */\n setField(rule: SdQbRule, key: any): void {\n if (this.resolvedDisabled()) return;\n if (key == null) return; // swap-only: never clear the field (issue #2)\n rule.field = key;\n const field = this.fieldByKey()[rule.field as string];\n const op = sdQbDefaultOperator(field);\n rule.operator = op;\n rule.value = this.#defaultValueFor(op);\n this.#useLiteralSource(rule);\n this.#apply();\n }\n\n /** Change `rule`'s operator and reshape its value to fit the new operator (array / range / none). */\n setOperator(rule: SdQbRule, op: Operator | undefined): void {\n if (this.resolvedDisabled()) return;\n rule.operator = op;\n if (rule.valueSource === 'field' && this.canCompareWithField(rule)) {\n rule.value = null;\n if (!this.#isCompareFieldAllowed(rule, rule.compareField)) rule.compareField = undefined;\n } else {\n rule.value = this.#reshapeValue(op, rule.value);\n this.#useLiteralSource(rule);\n }\n this.#apply();\n }\n\n /** Set a single-value rule's value (coercing numeric fields to `number`). */\n setScalar(rule: SdQbRule, raw: any): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n rule.value = this.#coerce(rule, raw);\n this.#apply();\n }\n\n /** Set the lower bound of a BETWEEN rule's `{ from, to }` value. */\n setBetweenFrom(rule: SdQbRule, raw: any): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n rule.value = { ...(rule.value ?? {}), from: this.#coerce(rule, raw) };\n this.#apply();\n }\n\n /** Set the upper bound of a BETWEEN rule's `{ from, to }` value. */\n setBetweenTo(rule: SdQbRule, raw: any): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n rule.value = { ...(rule.value ?? {}), to: this.#coerce(rule, raw) };\n this.#apply();\n }\n\n setValueSource(rule: SdQbRule, source: unknown): void {\n if (this.resolvedDisabled()) return;\n if (source === 'field' && this.resolvedComparisonMode() === 'value-or-field' && this.canCompareWithField(rule)) {\n rule.valueSource = 'field';\n rule.value = null;\n if (!this.#isCompareFieldAllowed(rule, rule.compareField)) rule.compareField = undefined;\n } else {\n this.#useLiteralSource(rule);\n rule.value = this.#defaultValueFor(rule.operator);\n }\n this.#apply();\n }\n\n setCompareField(rule: SdQbRule, key: any): void {\n if (this.resolvedDisabled()) return;\n if (!this.#isCompareFieldAllowed(rule, key)) return;\n rule.valueSource = 'field';\n rule.compareField = key;\n rule.value = null;\n this.#apply();\n }\n\n /** Coerce numeric fields to `number` so the emitted Filter carries a real number. */\n #coerce(rule: SdQbRule, raw: any): any {\n const field = this.fieldByKey()[rule.field as string];\n if (field?.type === 'number' && raw !== null && raw !== undefined && raw !== '') {\n const n = Number(raw);\n return Number.isNaN(n) ? raw : n;\n }\n return raw;\n }\n\n #defaultValueFor(op: Operator | undefined): any {\n if (sdQbIsMultiOperator(op)) return [];\n if (op === 'BETWEEN') return { from: null, to: null };\n return null;\n }\n\n #reshapeValue(op: Operator | undefined, current: any): any {\n if (sdQbIsNoDataOperator(op)) return null;\n if (sdQbIsMultiOperator(op)) return Array.isArray(current) ? current : current == null ? [] : [current];\n if (op === 'BETWEEN') {\n // a relative spec / 'TODAY' can't be a BETWEEN endpoint — reset to a fresh range\n return current && typeof current === 'object' && !Array.isArray(current) && !sdQbIsRelativeDate(current)\n ? current\n : { from: null, to: null };\n }\n // single value — keep a relative spec or the 'TODAY' sentinel; else drop array/range remnants\n if (sdQbIsToday(current) || sdQbIsRelativeDate(current)) return current;\n return Array.isArray(current) || (current && typeof current === 'object') ? null : current;\n }\n\n #useLiteralSource(rule: SdQbRule): void {\n rule.valueSource = 'literal';\n rule.compareField = undefined;\n }\n\n #isCompareFieldAllowed(rule: SdQbRule, key: any): boolean {\n return !!key && this.compareFields(rule).some(f => f.key === key);\n }\n\n // -------------------------------------------------------------------------\n // Template helpers\n // -------------------------------------------------------------------------\n\n /** The field metadata for a rule's current `field` key (or undefined if unset). */\n fieldOf(rule: SdQbRule): SdQueryBuilderField | undefined {\n return rule.field ? this.fieldByKey()[rule.field] : undefined;\n }\n\n /** Operators allowed for a rule, derived from its field's type / override. */\n allowedOperators(rule: SdQbRule): Operator[] {\n return sdQbAllowedOperators(this.fieldOf(rule));\n }\n\n /** Whether to render the operator picker — hidden when only one operator is allowed. */\n showOperatorSelector(rule: SdQbRule): boolean {\n return this.allowedOperators(rule).length > 1;\n }\n\n compareFields(rule: SdQbRule): SdQueryBuilderField[] {\n const field = this.fieldOf(rule);\n if (!field) return QB_EMPTY_FIELDS;\n return this.#compareFieldsByKey().get(field.key) ?? QB_EMPTY_FIELDS;\n }\n\n canCompareWithField(rule: SdQbRule): boolean {\n return sdQbSupportsFieldCompareOperator(rule.operator) && this.compareFields(rule).length > 0;\n }\n\n showValueSourceSelector(rule: SdQbRule): boolean {\n return this.canCompareWithField(rule) && (this.resolvedComparisonMode() === 'value-or-field' || rule.valueSource === 'field');\n }\n\n valueSourceOf(rule: SdQbRule): SdQbValueSource {\n return rule.valueSource === 'field' && this.canCompareWithField(rule) ? 'field' : 'literal';\n }\n\n isFieldSource(rule: SdQbRule): boolean {\n return this.valueSourceOf(rule) === 'field';\n }\n\n /** True for NULL / NOT_NULL — the template then renders no value editor. */\n isNoData(op: Operator | undefined): boolean {\n return sdQbIsNoDataOperator(op);\n }\n\n /** True for IN / NOT_IN — the template then renders a multi-select value editor. */\n isMulti(op: Operator | undefined): boolean {\n return sdQbIsMultiOperator(op);\n }\n\n /** `[true/false]` option list for a boolean field's value select (stable reference). */\n booleanItems(field: SdQueryBuilderField): SdQueryBuilderFieldOption[] {\n return this.#booleanOptionsByKey().get(field.key) ?? SD_QB_EMPTY_OPTIONS;\n }\n\n /**\n * Option list cho field `type:'values'`.\n *\n * why: template cũ bind thẳng `[items]=\"fieldOf(rule)!.values || []\"`. `values` là OPTIONAL trên\n * `SdQueryBuilderField`, nên với field khai thiếu `values`, nhánh `|| []` cấp phát một mảng MỚI\n * mỗi lần change detection chạy — đúng nguyên nhân OOM đã ghi ở `#booleanOptionsByKey`:\n * `sd-select` có `toObservable(items)` → `markForCheck()` → CD mới → mảng mới → lặp vô hạn.\n *\n * why: KHÔNG memo hoá qua `computed<Map>` snapshot. `field.values` vốn ĐÃ là mảng của consumer\n * nên tự nó ổn định; snapshot vào Map chỉ thêm một tầng cache không bao giờ invalidate khi\n * consumer nạp option bất đồng bộ bằng cách gán tại chỗ (`fields[0].values = loaded`) — reference\n * `fields` không đổi nên `computed` giữ nguyên list cũ vĩnh viễn. Chỉ nhánh RỖNG cần hằng số\n * dùng chung để tránh literal mới mỗi CD.\n */\n valueItems(field: SdQueryBuilderField): SdQueryBuilderFieldOption[] {\n return field.values?.length ? field.values : SD_QB_EMPTY_OPTIONS;\n }\n\n /** Current date-value mode of a rule, derived from its value (no separate state). */\n dateMode(rule: SdQbRule): SdQbDateMode {\n const v = rule.value;\n if (sdQbIsToday(v)) return 'now';\n if (sdQbIsRelativeDate(v)) return 'relative';\n return 'absolute';\n }\n\n /** Switch a date/datetime rule's value mode, reseeding the value for the new mode. */\n setDateMode(rule: SdQbRule, mode: unknown): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n if (mode === 'now') rule.value = SD_QB_TODAY;\n else if (mode === 'relative') rule.value = sdQbDefaultRelative();\n else rule.value = null; // absolute — pick a concrete date\n this.#apply();\n }\n\n /** Read the offset amount of a relative rule (default 1). */\n relativeAmount(rule: SdQbRule): number {\n const v = rule.value;\n return sdQbIsRelativeDate(v) ? (v.amount ?? 1) : 1;\n }\n\n /** Set the offset amount (clamped to an integer >= 1). */\n setRelativeAmount(rule: SdQbRule, raw: any): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n const n = Math.floor(Number(raw));\n const amount = Number.isNaN(n) || n < 1 ? 1 : n;\n const cur = sdQbIsRelativeDate(rule.value) ? rule.value : sdQbDefaultRelative();\n rule.value = { amount, direction: cur.direction, unit: cur.unit } satisfies DateRelative;\n this.#apply();\n }\n\n /** Read the `'unit:direction'` token of a relative rule (default `'day:previous'`). */\n relativeUnitDirValue(rule: SdQbRule): string {\n const v = rule.value;\n if (sdQbIsRelativeDate(v)) return `${v.unit}:${v.direction}`;\n return 'day:previous';\n }\n\n /** Set the offset unit + direction from a `'unit:direction'` token. */\n setRelativeUnitDir(rule: SdQbRule, token: unknown): void {\n if (this.resolvedDisabled()) return;\n this.#useLiteralSource(rule);\n const normalizedToken = typeof token === 'string' ? token : 'day:previous';\n const [unit, direction] = normalizedToken.split(':') as [DateRelative['unit'], DateRelative['direction']];\n const cur = sdQbIsRelativeDate(rule.value) ? rule.value : sdQbDefaultRelative();\n rule.value = { amount: cur.amount, direction, unit } satisfies DateRelative;\n this.#apply();\n }\n\n /** Build a `data-autoid` for an inner control under this builder's `autoId` prefix. */\n autoIdFor(suffix: string): string {\n return `${this.resolvedAutoId() ?? 'qb'}-${suffix}`;\n }\n}\n","@if (isView()) {\n <div class=\"qb-view\" [attr.data-autoid]=\"autoIdFor('view')\" aria-readonly=\"true\">\n @if (tokens().length) {\n @for (t of tokens(); track $index) {\n <span class=\"qb-tok qb-tok-{{ t.kind }}\">{{ t.text }}</span>\n }\n } @else {\n <span class=\"qb-view-empty\">—</span>\n }\n </div>\n} @else {\n <!-- why: \"click ra vùng trống để đóng dropdown\" là hành vi CHỈ có ở chuột — người dùng bàn phím\n không có cách nào đóng. Thêm Escape làm tương đương. role=\"group\": container là một nhóm\n control nên KHÔNG nhận tabindex, tab đi thẳng vào các nút/select bên trong. -->\n <div\n class=\"qb-container\"\n role=\"group\"\n [class.is-disabled]=\"resolvedDisabled()\"\n (click)=\"closeAllDropdowns()\"\n (keydown.escape)=\"closeAllDropdowns()\">\n <ng-container [ngTemplateOutlet]=\"groupTpl\" [ngTemplateOutletContext]=\"{ $implicit: tree(), isRoot: true }\"></ng-container>\n </div>\n}\n\n<!-- Recursive group node -->\n<ng-template #groupTpl let-group let-isRoot=\"isRoot\" let-parent=\"parent\" let-index=\"index\">\n @let _removeGroupLabel = removeGroupLabel();\n <div class=\"qb-group\" [class.is-root]=\"isRoot\">\n <div class=\"qb-header\" [class.is-open]=\"group.open\">\n <div class=\"qb-logic-switch\">\n <button type=\"button\" [class.active]=\"group.logic === 'AND'\" [disabled]=\"resolvedDisabled()\" (click)=\"setGroupLogic(group, 'AND')\">AND</button>\n <button type=\"button\" [class.active]=\"group.logic === 'OR'\" [disabled]=\"resolvedDisabled()\" (click)=\"setGroupLogic(group, 'OR')\">OR</button>\n </div>\n\n <div class=\"qb-actions\">\n <button type=\"button\" class=\"qb-btn qb-btn-add\" [title]=\"addLabel()\" [attr.aria-label]=\"addNodeLabel()\" [disabled]=\"resolvedDisabled()\" (click)=\"toggleDropdown(group, $event)\">+</button>\n @if (group.open) {\n <!-- why: dropdown là NHÓM hai nút (role=\"group\"), không phải nút — không nhận tabindex,\n tab đi thẳng vào hai nút. stopPropagation cho cả click lẫn Enter để thao tác bên\n trong dropdown không kích hoạt handler \"đóng tất cả\" của container. -->\n <div class=\"qb-dropdown\" role=\"group\" (click)=\"$event.stopPropagation()\" (keydown.enter)=\"$event.stopPropagation()\">\n <button type=\"button\" (click)=\"addRule(group)\">+ {{ conditionLabel() }}</button>\n <button type=\"button\" (click)=\"addGroup(group)\">+ {{ groupLabel() }}</button>\n </div>\n }\n @if (!isRoot) {\n <button type=\"button\" class=\"qb-btn qb-btn-remove\" [title]=\"_removeGroupLabel\" [attr.aria-label]=\"_removeGroupLabel\" [disabled]=\"resolvedDisabled()\" (click)=\"removeNode(parent, index)\">✕</button>\n }\n </div>\n </div>\n\n <div class=\"qb-body\">\n @for (node of group.children; track node.id; let i = $index) {\n <div class=\"qb-treenode\" [class.is-group]=\"isGroup(node)\" [class.is-rule]=\"!isGroup(node)\">\n @if (isGroup(node)) {\n <ng-container\n [ngTemplateOutlet]=\"groupTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: node, isRoot: false, parent: group, index: i }\"\n ></ng-container>\n } @else {\n <ng-container [ngTemplateOutlet]=\"ruleTpl\" [ngTemplateOutletContext]=\"{ $implicit: node, parent: group, index: i }\"></ng-container>\n }\n </div>\n } @empty {\n <div class=\"qb-empty\">{{ emptyLabel() }}</div>\n }\n </div>\n </div>\n</ng-template>\n\n<!-- Single rule node: field → operator → value -->\n<ng-template #ruleTpl let-rule let-parent=\"parent\" let-index=\"index\">\n @let _selectFieldLabel = selectFieldLabel();\n @let _valueLabel = valueLabel();\n @let _removeConditionLabel = removeConditionLabel();\n @let _dateModes = dateModes();\n @let _relativeUnitOptions = relativeUnitOptions();\n <div class=\"qb-rule\">\n <sd-select\n class=\"qb-field\"\n [items]=\"resolvedFields()\"\n valueField=\"key\"\n displayField=\"label\"\n [placeholder]=\"_selectFieldLabel\"\n size=\"sm\"\n [model]=\"rule.field\"\n (modelChange)=\"setField(rule, $event)\"\n [disabled]=\"resolvedDisabled()\"\n [clearable]=\"false\"\n hideInlineError\n [autoId]=\"autoIdFor('field-' + index)\"\n >\n <!-- Option trong dropdown: icon thể hiện type + label. -->\n <ng-template sdItemDef let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item).label }}</span>\n </span>\n </ng-template>\n <!-- Giá trị đã chọn ở trigger: icon mặc định theo type khi field chưa có icon riêng. -->\n <ng-template #sdSelected let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item)?.label }}</span>\n </span>\n </ng-template>\n </sd-select>\n\n @if (rule.field) {\n <div class=\"qb-divider\"></div>\n\n @if (showOperatorSelector(rule)) {\n <sd-operator\n class=\"qb-op\"\n [operators]=\"allowedOperators(rule)\"\n [model]=\"rule.operator\"\n (modelChange)=\"setOperator(rule, $event)\"\n [disabled]=\"resolvedDisabled()\"\n [autoId]=\"autoIdFor('op-' + index)\"\n ></sd-operator>\n }\n\n @if (rule.operator && !isNoData(rule.operator)) {\n <div class=\"qb-divider\"></div>\n\n @if (showValueSourceSelector(rule)) {\n <sd-select\n class=\"qb-value-source\"\n [items]=\"valueSourceOptions()\"\n valueField=\"value\"\n displayField=\"display\"\n size=\"sm\"\n [model]=\"valueSourceOf(rule)\"\n (modelChange)=\"setValueSource(rule, $event)\"\n [disabled]=\"resolvedDisabled()\"\n [clearable]=\"false\"\n hideInlineError\n [autoId]=\"autoIdFor('valuesource-' + index)\"\n >\n <ng-template sdItemDef let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item).icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item).display }}</span>\n </span>\n </ng-template>\n <ng-template #sdSelected let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item)?.icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item)?.display }}</span>\n </span>\n </ng-template>\n </sd-select>\n <div class=\"qb-divider\"></div>\n }\n\n @if (isFieldSource(rule)) {\n <sd-select\n class=\"qb-val qb-compare-field\"\n [items]=\"compareFields(rule)\"\n valueField=\"key\"\n displayField=\"label\"\n [placeholder]=\"_selectFieldLabel\"\n size=\"sm\"\n [model]=\"rule.compareField\"\n (modelChange)=\"setCompareField(rule, $event)\"\n [disabled]=\"resolvedDisabled()\"\n [clearable]=\"false\"\n hideInlineError\n [autoId]=\"autoIdFor('compare-field-' + index)\"\n >\n <ng-template sdItemDef let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item).label }}</span>\n </span>\n </ng-template>\n <ng-template #sdSelected let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"fieldIcon($any(item))\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item)?.label }}</span>\n </span>\n </ng-template>\n </sd-select>\n } @else if (rule.operator === 'BETWEEN') {\n <div class=\"qb-between\">\n @switch (fieldOf(rule)?.type) {\n @case ('number') {\n <sd-input-number class=\"qb-val\" [placeholder]=\"fromLabel()\" size=\"sm\" [model]=\"rule.value?.from\" (modelChange)=\"setBetweenFrom(rule, $event)\" [min]=\"fieldOf(rule)?.min\" [max]=\"fieldOf(rule)?.max\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('from-' + index)\"></sd-input-number>\n <span class=\"qb-dash\">—</span>\n <sd-input-number class=\"qb-val\" [placeholder]=\"toLabel()\" size=\"sm\" [model]=\"rule.value?.to\" (modelChange)=\"setBetweenTo(rule, $event)\" [min]=\"fieldOf(rule)?.min\" [max]=\"fieldOf(rule)?.max\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('to-' + index)\"></sd-input-number>\n }\n @case ('date') {\n <sd-date class=\"qb-val qb-date-val\" size=\"sm\" [model]=\"rule.value?.from\" (modelChange)=\"setBetweenFrom(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('from-' + index)\"></sd-date>\n <span class=\"qb-dash\">—</span>\n <sd-date class=\"qb-val qb-date-val\" size=\"sm\" [model]=\"rule.value?.to\" (modelChange)=\"setBetweenTo(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('to-' + index)\"></sd-date>\n }\n @case ('datetime') {\n <sd-datetime class=\"qb-val\" size=\"sm\" [model]=\"rule.value?.from\" (modelChange)=\"setBetweenFrom(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('from-' + index)\"></sd-datetime>\n <span class=\"qb-dash\">—</span>\n <sd-datetime class=\"qb-val\" size=\"sm\" [model]=\"rule.value?.to\" (modelChange)=\"setBetweenTo(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('to-' + index)\"></sd-datetime>\n }\n }\n </div>\n } @else {\n @switch (fieldOf(rule)?.type) {\n @case ('string') {\n <sd-input class=\"qb-val\" [placeholder]=\"_valueLabel\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-input>\n }\n @case ('number') {\n <sd-input-number class=\"qb-val\" [placeholder]=\"_valueLabel\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [min]=\"fieldOf(rule)?.min\" [max]=\"fieldOf(rule)?.max\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-input-number>\n }\n @case ('boolean') {\n <sd-select class=\"qb-val\" [items]=\"booleanItems(fieldOf(rule)!)\" valueField=\"value\" displayField=\"display\" [placeholder]=\"_valueLabel\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-select>\n }\n @case ('date') {\n @let _dateMode = dateMode(rule);\n <sd-select class=\"qb-date-mode\" [items]=\"_dateModes\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"_dateMode\" (modelChange)=\"setDateMode(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('datemode-' + index)\">\n <ng-template sdItemDef let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item).icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item).display }}</span>\n </span>\n </ng-template>\n <ng-template #sdSelected let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item)?.icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item)?.display }}</span>\n </span>\n </ng-template>\n </sd-select>\n @switch (_dateMode) {\n @case ('absolute') {\n <sd-date class=\"qb-val qb-date-val\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-date>\n }\n @case ('relative') {\n <sd-input-number class=\"qb-rel-amount\" type=\"positive\" [precision]=\"0\" size=\"sm\" [model]=\"relativeAmount(rule)\" (modelChange)=\"setRelativeAmount(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('rel-amount-' + index)\"></sd-input-number>\n <sd-select class=\"qb-rel-unit\" [items]=\"_relativeUnitOptions\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"relativeUnitDirValue(rule)\" (modelChange)=\"setRelativeUnitDir(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('rel-unit-' + index)\"></sd-select>\n }\n }\n }\n @case ('datetime') {\n @let _dtMode = dateMode(rule);\n <sd-select class=\"qb-date-mode\" [items]=\"_dateModes\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"_dtMode\" (modelChange)=\"setDateMode(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('datemode-' + index)\">\n <ng-template sdItemDef let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item).icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item).display }}</span>\n </span>\n </ng-template>\n <ng-template #sdSelected let-item=\"item\">\n <span class=\"qb-opt\">\n <sd-icon class=\"qb-opt-icon\" [name]=\"$any(item)?.icon\"></sd-icon>\n <span class=\"qb-opt-label\">{{ $any(item)?.display }}</span>\n </span>\n </ng-template>\n </sd-select>\n @switch (_dtMode) {\n @case ('absolute') {\n <sd-datetime class=\"qb-val\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-datetime>\n }\n @case ('relative') {\n <sd-input-number class=\"qb-rel-amount\" type=\"positive\" [precision]=\"0\" size=\"sm\" [model]=\"relativeAmount(rule)\" (modelChange)=\"setRelativeAmount(rule, $event)\" [disabled]=\"resolvedDisabled()\" hideInlineError [autoId]=\"autoIdFor('rel-amount-' + index)\"></sd-input-number>\n <sd-select class=\"qb-rel-unit\" [items]=\"_relativeUnitOptions\" valueField=\"value\" displayField=\"display\" size=\"sm\" [model]=\"relativeUnitDirValue(rule)\" (modelChange)=\"setRelativeUnitDir(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('rel-unit-' + index)\"></sd-select>\n }\n }\n }\n @case ('values') {\n <sd-select class=\"qb-val\" [items]=\"valueItems(fieldOf(rule)!)\" valueField=\"value\" displayField=\"display\" [multiple]=\"isMulti(rule.operator)\" [placeholder]=\"_valueLabel\" size=\"sm\" [model]=\"rule.value\" (modelChange)=\"setScalar(rule, $event)\" [disabled]=\"resolvedDisabled()\" [clearable]=\"false\" hideInlineError [autoId]=\"autoIdFor('val-' + index)\"></sd-select>\n }\n }\n }\n }\n }\n\n <button type=\"button\" class=\"qb-btn qb-btn-remove-rule\" [title]=\"_removeConditionLabel\" [attr.aria-label]=\"_removeConditionLabel\" [disabled]=\"resolvedDisabled()\" (click)=\"removeNode(parent, index)\">✕</button>\n </div>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["isAndOr"],"mappings":"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"}