@elementar-rt/components 0.6.55

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 (259) hide show
  1. package/README.md +49 -0
  2. package/action-required/index.d.ts +13 -0
  3. package/alert/index.d.ts +51 -0
  4. package/announcement/index.d.ts +45 -0
  5. package/avatar/index.d.ts +67 -0
  6. package/block-loader/index.d.ts +21 -0
  7. package/block-state/index.d.ts +33 -0
  8. package/brand-colors/index.d.ts +27 -0
  9. package/breadcrumbs/index.d.ts +104 -0
  10. package/card-overlay/index.d.ts +20 -0
  11. package/carousel/index.d.ts +75 -0
  12. package/code-highlighter/index.d.ts +18 -0
  13. package/color-picker/index.d.ts +92 -0
  14. package/color-scheme/index.d.ts +44 -0
  15. package/command-bar/index.d.ts +28 -0
  16. package/comment-editor/index.d.ts +194 -0
  17. package/comparison-slider/index.d.ts +51 -0
  18. package/confirm/index.d.ts +35 -0
  19. package/content-fade/index.d.ts +17 -0
  20. package/cookie-popup/index.d.ts +41 -0
  21. package/core/index.d.ts +252 -0
  22. package/country-select/index.d.ts +76 -0
  23. package/crop/index.d.ts +59 -0
  24. package/currency-select/index.d.ts +78 -0
  25. package/dashboard/index.d.ts +48 -0
  26. package/data-view/index.d.ts +127 -0
  27. package/date-format-select/index.d.ts +56 -0
  28. package/divider/index.d.ts +13 -0
  29. package/drawer/index.d.ts +35 -0
  30. package/emoji-picker/index.d.ts +49 -0
  31. package/expand/index.d.ts +26 -0
  32. package/fesm2022/elementar-rt-components-action-required.mjs +30 -0
  33. package/fesm2022/elementar-rt-components-action-required.mjs.map +1 -0
  34. package/fesm2022/elementar-rt-components-alert.mjs +139 -0
  35. package/fesm2022/elementar-rt-components-alert.mjs.map +1 -0
  36. package/fesm2022/elementar-rt-components-announcement.mjs +73 -0
  37. package/fesm2022/elementar-rt-components-announcement.mjs.map +1 -0
  38. package/fesm2022/elementar-rt-components-avatar.mjs +234 -0
  39. package/fesm2022/elementar-rt-components-avatar.mjs.map +1 -0
  40. package/fesm2022/elementar-rt-components-block-loader.mjs +54 -0
  41. package/fesm2022/elementar-rt-components-block-loader.mjs.map +1 -0
  42. package/fesm2022/elementar-rt-components-block-state.mjs +75 -0
  43. package/fesm2022/elementar-rt-components-block-state.mjs.map +1 -0
  44. package/fesm2022/elementar-rt-components-brand-colors.mjs +78 -0
  45. package/fesm2022/elementar-rt-components-brand-colors.mjs.map +1 -0
  46. package/fesm2022/elementar-rt-components-breadcrumbs.mjs +213 -0
  47. package/fesm2022/elementar-rt-components-breadcrumbs.mjs.map +1 -0
  48. package/fesm2022/elementar-rt-components-card-overlay.mjs +55 -0
  49. package/fesm2022/elementar-rt-components-card-overlay.mjs.map +1 -0
  50. package/fesm2022/elementar-rt-components-carousel.mjs +605 -0
  51. package/fesm2022/elementar-rt-components-carousel.mjs.map +1 -0
  52. package/fesm2022/elementar-rt-components-code-highlighter.mjs +57 -0
  53. package/fesm2022/elementar-rt-components-code-highlighter.mjs.map +1 -0
  54. package/fesm2022/elementar-rt-components-color-picker.mjs +708 -0
  55. package/fesm2022/elementar-rt-components-color-picker.mjs.map +1 -0
  56. package/fesm2022/elementar-rt-components-color-scheme.mjs +106 -0
  57. package/fesm2022/elementar-rt-components-color-scheme.mjs.map +1 -0
  58. package/fesm2022/elementar-rt-components-command-bar.mjs +59 -0
  59. package/fesm2022/elementar-rt-components-command-bar.mjs.map +1 -0
  60. package/fesm2022/elementar-rt-components-comment-editor.mjs +1039 -0
  61. package/fesm2022/elementar-rt-components-comment-editor.mjs.map +1 -0
  62. package/fesm2022/elementar-rt-components-comparison-slider.mjs +193 -0
  63. package/fesm2022/elementar-rt-components-comparison-slider.mjs.map +1 -0
  64. package/fesm2022/elementar-rt-components-confirm.mjs +86 -0
  65. package/fesm2022/elementar-rt-components-confirm.mjs.map +1 -0
  66. package/fesm2022/elementar-rt-components-content-fade.mjs +35 -0
  67. package/fesm2022/elementar-rt-components-content-fade.mjs.map +1 -0
  68. package/fesm2022/elementar-rt-components-cookie-popup.mjs +109 -0
  69. package/fesm2022/elementar-rt-components-cookie-popup.mjs.map +1 -0
  70. package/fesm2022/elementar-rt-components-core.mjs +837 -0
  71. package/fesm2022/elementar-rt-components-core.mjs.map +1 -0
  72. package/fesm2022/elementar-rt-components-country-select.mjs +477 -0
  73. package/fesm2022/elementar-rt-components-country-select.mjs.map +1 -0
  74. package/fesm2022/elementar-rt-components-crop.mjs +183 -0
  75. package/fesm2022/elementar-rt-components-crop.mjs.map +1 -0
  76. package/fesm2022/elementar-rt-components-currency-select.mjs +384 -0
  77. package/fesm2022/elementar-rt-components-currency-select.mjs.map +1 -0
  78. package/fesm2022/elementar-rt-components-dashboard.mjs +96 -0
  79. package/fesm2022/elementar-rt-components-dashboard.mjs.map +1 -0
  80. package/fesm2022/elementar-rt-components-data-view.mjs +302 -0
  81. package/fesm2022/elementar-rt-components-data-view.mjs.map +1 -0
  82. package/fesm2022/elementar-rt-components-date-format-select.mjs +136 -0
  83. package/fesm2022/elementar-rt-components-date-format-select.mjs.map +1 -0
  84. package/fesm2022/elementar-rt-components-divider.mjs +31 -0
  85. package/fesm2022/elementar-rt-components-divider.mjs.map +1 -0
  86. package/fesm2022/elementar-rt-components-drawer.mjs +131 -0
  87. package/fesm2022/elementar-rt-components-drawer.mjs.map +1 -0
  88. package/fesm2022/elementar-rt-components-emoji-picker.mjs +249 -0
  89. package/fesm2022/elementar-rt-components-emoji-picker.mjs.map +1 -0
  90. package/fesm2022/elementar-rt-components-expand.mjs +60 -0
  91. package/fesm2022/elementar-rt-components-expand.mjs.map +1 -0
  92. package/fesm2022/elementar-rt-components-filter-builder.mjs +333 -0
  93. package/fesm2022/elementar-rt-components-filter-builder.mjs.map +1 -0
  94. package/fesm2022/elementar-rt-components-form-renderer-autocomplete-many-field.component-AqEghjO_.mjs +123 -0
  95. package/fesm2022/elementar-rt-components-form-renderer-autocomplete-many-field.component-AqEghjO_.mjs.map +1 -0
  96. package/fesm2022/elementar-rt-components-form-renderer-checkbox-field.component-CUKmZGFq.mjs +22 -0
  97. package/fesm2022/elementar-rt-components-form-renderer-checkbox-field.component-CUKmZGFq.mjs.map +1 -0
  98. package/fesm2022/elementar-rt-components-form-renderer-datepicker-field.component-DihIRWMt.mjs +40 -0
  99. package/fesm2022/elementar-rt-components-form-renderer-datepicker-field.component-DihIRWMt.mjs.map +1 -0
  100. package/fesm2022/elementar-rt-components-form-renderer-divider-content.component-CjlGcU3B.mjs +17 -0
  101. package/fesm2022/elementar-rt-components-form-renderer-divider-content.component-CjlGcU3B.mjs.map +1 -0
  102. package/fesm2022/elementar-rt-components-form-renderer-image-content.component-0pL2Fk0H.mjs +17 -0
  103. package/fesm2022/elementar-rt-components-form-renderer-image-content.component-0pL2Fk0H.mjs.map +1 -0
  104. package/fesm2022/elementar-rt-components-form-renderer-input-field.component-X2sKvj6J.mjs +33 -0
  105. package/fesm2022/elementar-rt-components-form-renderer-input-field.component-X2sKvj6J.mjs.map +1 -0
  106. package/fesm2022/elementar-rt-components-form-renderer-radio-group-field.component-DWXZAA3F.mjs +38 -0
  107. package/fesm2022/elementar-rt-components-form-renderer-radio-group-field.component-DWXZAA3F.mjs.map +1 -0
  108. package/fesm2022/elementar-rt-components-form-renderer-select-field.component-Cx9DZoD6.mjs +39 -0
  109. package/fesm2022/elementar-rt-components-form-renderer-select-field.component-Cx9DZoD6.mjs.map +1 -0
  110. package/fesm2022/elementar-rt-components-form-renderer-text-content.component-BmFyUG06.mjs +24 -0
  111. package/fesm2022/elementar-rt-components-form-renderer-text-content.component-BmFyUG06.mjs.map +1 -0
  112. package/fesm2022/elementar-rt-components-form-renderer-textarea-field.component-D9KmE049.mjs +37 -0
  113. package/fesm2022/elementar-rt-components-form-renderer-textarea-field.component-D9KmE049.mjs.map +1 -0
  114. package/fesm2022/elementar-rt-components-form-renderer-timezone-field.component-BroP_Q4P.mjs +35 -0
  115. package/fesm2022/elementar-rt-components-form-renderer-timezone-field.component-BroP_Q4P.mjs.map +1 -0
  116. package/fesm2022/elementar-rt-components-form-renderer-toggle-field.component-nGbtVi1_.mjs +22 -0
  117. package/fesm2022/elementar-rt-components-form-renderer-toggle-field.component-nGbtVi1_.mjs.map +1 -0
  118. package/fesm2022/elementar-rt-components-form-renderer.mjs +321 -0
  119. package/fesm2022/elementar-rt-components-form-renderer.mjs.map +1 -0
  120. package/fesm2022/elementar-rt-components-gauge.mjs +50 -0
  121. package/fesm2022/elementar-rt-components-gauge.mjs.map +1 -0
  122. package/fesm2022/elementar-rt-components-icon.mjs +62 -0
  123. package/fesm2022/elementar-rt-components-icon.mjs.map +1 -0
  124. package/fesm2022/elementar-rt-components-image-resizer.mjs +159 -0
  125. package/fesm2022/elementar-rt-components-image-resizer.mjs.map +1 -0
  126. package/fesm2022/elementar-rt-components-image-viewer.mjs +349 -0
  127. package/fesm2022/elementar-rt-components-image-viewer.mjs.map +1 -0
  128. package/fesm2022/elementar-rt-components-incidents.mjs +259 -0
  129. package/fesm2022/elementar-rt-components-incidents.mjs.map +1 -0
  130. package/fesm2022/elementar-rt-components-inline-text-edit.mjs +181 -0
  131. package/fesm2022/elementar-rt-components-inline-text-edit.mjs.map +1 -0
  132. package/fesm2022/elementar-rt-components-input-mask.mjs +180 -0
  133. package/fesm2022/elementar-rt-components-input-mask.mjs.map +1 -0
  134. package/fesm2022/elementar-rt-components-input-validator.mjs +24 -0
  135. package/fesm2022/elementar-rt-components-input-validator.mjs.map +1 -0
  136. package/fesm2022/elementar-rt-components-kanban-board.mjs +156 -0
  137. package/fesm2022/elementar-rt-components-kanban-board.mjs.map +1 -0
  138. package/fesm2022/elementar-rt-components-layout.mjs +188 -0
  139. package/fesm2022/elementar-rt-components-layout.mjs.map +1 -0
  140. package/fesm2022/elementar-rt-components-logo.mjs +43 -0
  141. package/fesm2022/elementar-rt-components-logo.mjs.map +1 -0
  142. package/fesm2022/elementar-rt-components-marquee.mjs +79 -0
  143. package/fesm2022/elementar-rt-components-marquee.mjs.map +1 -0
  144. package/fesm2022/elementar-rt-components-micro-chart.mjs +950 -0
  145. package/fesm2022/elementar-rt-components-micro-chart.mjs.map +1 -0
  146. package/fesm2022/elementar-rt-components-navigation.mjs +379 -0
  147. package/fesm2022/elementar-rt-components-navigation.mjs.map +1 -0
  148. package/fesm2022/elementar-rt-components-notifications.mjs +190 -0
  149. package/fesm2022/elementar-rt-components-notifications.mjs.map +1 -0
  150. package/fesm2022/elementar-rt-components-number-input.mjs +288 -0
  151. package/fesm2022/elementar-rt-components-number-input.mjs.map +1 -0
  152. package/fesm2022/elementar-rt-components-overlay-scrollbar.mjs +455 -0
  153. package/fesm2022/elementar-rt-components-overlay-scrollbar.mjs.map +1 -0
  154. package/fesm2022/elementar-rt-components-overlay.mjs +112 -0
  155. package/fesm2022/elementar-rt-components-overlay.mjs.map +1 -0
  156. package/fesm2022/elementar-rt-components-page-loading-bar.mjs +79 -0
  157. package/fesm2022/elementar-rt-components-page-loading-bar.mjs.map +1 -0
  158. package/fesm2022/elementar-rt-components-panel.mjs +105 -0
  159. package/fesm2022/elementar-rt-components-panel.mjs.map +1 -0
  160. package/fesm2022/elementar-rt-components-password-strength.mjs +474 -0
  161. package/fesm2022/elementar-rt-components-password-strength.mjs.map +1 -0
  162. package/fesm2022/elementar-rt-components-phone-input.mjs +637 -0
  163. package/fesm2022/elementar-rt-components-phone-input.mjs.map +1 -0
  164. package/fesm2022/elementar-rt-components-pin-input.mjs +197 -0
  165. package/fesm2022/elementar-rt-components-pin-input.mjs.map +1 -0
  166. package/fesm2022/elementar-rt-components-popover.mjs +262 -0
  167. package/fesm2022/elementar-rt-components-popover.mjs.map +1 -0
  168. package/fesm2022/elementar-rt-components-radio-card.mjs +102 -0
  169. package/fesm2022/elementar-rt-components-radio-card.mjs.map +1 -0
  170. package/fesm2022/elementar-rt-components-rail-nav.mjs +84 -0
  171. package/fesm2022/elementar-rt-components-rail-nav.mjs.map +1 -0
  172. package/fesm2022/elementar-rt-components-resizable-container.mjs +69 -0
  173. package/fesm2022/elementar-rt-components-resizable-container.mjs.map +1 -0
  174. package/fesm2022/elementar-rt-components-screen-loader.mjs +27 -0
  175. package/fesm2022/elementar-rt-components-screen-loader.mjs.map +1 -0
  176. package/fesm2022/elementar-rt-components-scroll-spy.mjs +165 -0
  177. package/fesm2022/elementar-rt-components-scroll-spy.mjs.map +1 -0
  178. package/fesm2022/elementar-rt-components-segmented.mjs +153 -0
  179. package/fesm2022/elementar-rt-components-segmented.mjs.map +1 -0
  180. package/fesm2022/elementar-rt-components-side-panel.mjs +110 -0
  181. package/fesm2022/elementar-rt-components-side-panel.mjs.map +1 -0
  182. package/fesm2022/elementar-rt-components-sidebar.mjs +423 -0
  183. package/fesm2022/elementar-rt-components-sidebar.mjs.map +1 -0
  184. package/fesm2022/elementar-rt-components-signature-pad.mjs +452 -0
  185. package/fesm2022/elementar-rt-components-signature-pad.mjs.map +1 -0
  186. package/fesm2022/elementar-rt-components-skeleton.mjs +56 -0
  187. package/fesm2022/elementar-rt-components-skeleton.mjs.map +1 -0
  188. package/fesm2022/elementar-rt-components-splash-screen.mjs +91 -0
  189. package/fesm2022/elementar-rt-components-splash-screen.mjs.map +1 -0
  190. package/fesm2022/elementar-rt-components-stepper.mjs +194 -0
  191. package/fesm2022/elementar-rt-components-stepper.mjs.map +1 -0
  192. package/fesm2022/elementar-rt-components-suggestions.mjs +76 -0
  193. package/fesm2022/elementar-rt-components-suggestions.mjs.map +1 -0
  194. package/fesm2022/elementar-rt-components-tab-panel.mjs +270 -0
  195. package/fesm2022/elementar-rt-components-tab-panel.mjs.map +1 -0
  196. package/fesm2022/elementar-rt-components-text-editor.mjs +1025 -0
  197. package/fesm2022/elementar-rt-components-text-editor.mjs.map +1 -0
  198. package/fesm2022/elementar-rt-components-thumbnail-maker.mjs +214 -0
  199. package/fesm2022/elementar-rt-components-thumbnail-maker.mjs.map +1 -0
  200. package/fesm2022/elementar-rt-components-timeline.mjs +122 -0
  201. package/fesm2022/elementar-rt-components-timeline.mjs.map +1 -0
  202. package/fesm2022/elementar-rt-components-timezone-select.mjs +351 -0
  203. package/fesm2022/elementar-rt-components-timezone-select.mjs.map +1 -0
  204. package/fesm2022/elementar-rt-components-upload.mjs +340 -0
  205. package/fesm2022/elementar-rt-components-upload.mjs.map +1 -0
  206. package/fesm2022/elementar-rt-components.mjs +6 -0
  207. package/fesm2022/elementar-rt-components.mjs.map +1 -0
  208. package/filter-builder/index.d.ts +107 -0
  209. package/form-renderer/index.d.ts +121 -0
  210. package/gauge/index.d.ts +21 -0
  211. package/icon/index.d.ts +17 -0
  212. package/image-resizer/index.d.ts +35 -0
  213. package/image-viewer/index.d.ts +63 -0
  214. package/incidents/index.d.ts +119 -0
  215. package/index.d.ts +2 -0
  216. package/inline-text-edit/index.d.ts +39 -0
  217. package/input-mask/index.d.ts +36 -0
  218. package/input-validator/index.d.ts +5 -0
  219. package/kanban-board/index.d.ts +68 -0
  220. package/layout/index.d.ts +75 -0
  221. package/logo/index.d.ts +21 -0
  222. package/marquee/index.d.ts +26 -0
  223. package/micro-chart/index.d.ts +193 -0
  224. package/navigation/index.d.ts +119 -0
  225. package/notifications/index.d.ts +84 -0
  226. package/number-input/index.d.ts +93 -0
  227. package/overlay/index.d.ts +12 -0
  228. package/overlay-scrollbar/index.d.ts +66 -0
  229. package/package.json +356 -0
  230. package/page-loading-bar/index.d.ts +20 -0
  231. package/panel/index.d.ts +43 -0
  232. package/password-strength/index.d.ts +109 -0
  233. package/phone-input/index.d.ts +94 -0
  234. package/pin-input/index.d.ts +48 -0
  235. package/popover/index.d.ts +75 -0
  236. package/radio-card/index.d.ts +37 -0
  237. package/rail-nav/index.d.ts +36 -0
  238. package/resizable-container/index.d.ts +21 -0
  239. package/screen-loader/index.d.ts +9 -0
  240. package/scroll-spy/index.d.ts +48 -0
  241. package/segmented/index.d.ts +54 -0
  242. package/side-panel/index.d.ts +42 -0
  243. package/sidebar/index.d.ts +143 -0
  244. package/signature-pad/index.d.ts +49 -0
  245. package/skeleton/index.d.ts +24 -0
  246. package/splash-screen/index.d.ts +31 -0
  247. package/stepper/index.d.ts +65 -0
  248. package/styles/_common.scss +776 -0
  249. package/styles/themes/cyan-orange.scss +41 -0
  250. package/styles/themes/default.scss +5 -0
  251. package/styles/themes/magenta-violet.scss +41 -0
  252. package/styles/themes/rose-red.scss +41 -0
  253. package/suggestions/index.d.ts +32 -0
  254. package/tab-panel/index.d.ts +96 -0
  255. package/text-editor/index.d.ts +191 -0
  256. package/thumbnail-maker/index.d.ts +35 -0
  257. package/timeline/index.d.ts +57 -0
  258. package/timezone-select/index.d.ts +72 -0
  259. package/upload/index.d.ts +134 -0
@@ -0,0 +1,333 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, TemplateRef, Directive, input, contentChild, ChangeDetectorRef, PLATFORM_ID, viewChildren, contentChildren, output, Component } from '@angular/core';
3
+ import { isPlatformServer, NgTemplateOutlet } from '@angular/common';
4
+ import { MatIcon } from '@angular/material/icon';
5
+ import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu';
6
+ import * as i1 from '@angular/forms';
7
+ import { FormsModule } from '@angular/forms';
8
+ import { MatOption } from '@angular/material/autocomplete';
9
+ import { MatFormField, MatInput } from '@angular/material/input';
10
+ import { MatSelect } from '@angular/material/select';
11
+ import { MenuOptionGroupDirective, AutoFocusDirective, FocusElementDirective } from '@elementar-rt/components/core';
12
+
13
+ class FilterBuilderOperationNameDirective {
14
+ templateRef = inject(TemplateRef);
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationNameDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
16
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.10", type: FilterBuilderOperationNameDirective, isStandalone: true, selector: "[emrFilterBuilderOperationName]", ngImport: i0 });
17
+ }
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationNameDirective, decorators: [{
19
+ type: Directive,
20
+ args: [{
21
+ selector: '[emrFilterBuilderOperationName]'
22
+ }]
23
+ }] });
24
+
25
+ class FilterBuilderOperationIconDirective {
26
+ templateRef = inject(TemplateRef);
27
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationIconDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
28
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.10", type: FilterBuilderOperationIconDirective, isStandalone: true, selector: "[emrFilterBuilderOperationIcon]", ngImport: i0 });
29
+ }
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationIconDirective, decorators: [{
31
+ type: Directive,
32
+ args: [{
33
+ selector: '[emrFilterBuilderOperationIcon]'
34
+ }]
35
+ }] });
36
+
37
+ class FilterBuilderOperationDefDirective {
38
+ id = input('', ...(ngDevMode ? [{ debugName: "id", alias: 'emrFilterBuilderOperationDef' }] : [{
39
+ alias: 'emrFilterBuilderOperationDef'
40
+ }]));
41
+ allowedDataTypes = input([], ...(ngDevMode ? [{ debugName: "allowedDataTypes" }] : []));
42
+ operationName = contentChild(FilterBuilderOperationNameDirective, ...(ngDevMode ? [{ debugName: "operationName" }] : []));
43
+ operationIcon = contentChild(FilterBuilderOperationIconDirective, ...(ngDevMode ? [{ debugName: "operationIcon" }] : []));
44
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationDefDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
45
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "20.3.10", type: FilterBuilderOperationDefDirective, isStandalone: true, selector: "[emrFilterBuilderOperationDef]", inputs: { id: { classPropertyName: "id", publicName: "emrFilterBuilderOperationDef", isSignal: true, isRequired: false, transformFunction: null }, allowedDataTypes: { classPropertyName: "allowedDataTypes", publicName: "allowedDataTypes", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "operationName", first: true, predicate: FilterBuilderOperationNameDirective, descendants: true, isSignal: true }, { propertyName: "operationIcon", first: true, predicate: FilterBuilderOperationIconDirective, descendants: true, isSignal: true }], ngImport: i0 });
46
+ }
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderOperationDefDirective, decorators: [{
48
+ type: Directive,
49
+ args: [{
50
+ selector: '[emrFilterBuilderOperationDef]'
51
+ }]
52
+ }], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "emrFilterBuilderOperationDef", required: false }] }], allowedDataTypes: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowedDataTypes", required: false }] }], operationName: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FilterBuilderOperationNameDirective), { isSignal: true }] }], operationIcon: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FilterBuilderOperationIconDirective), { isSignal: true }] }] } });
53
+
54
+ class FilterBuilderComponent {
55
+ _cdr = inject(ChangeDetectorRef);
56
+ _platformId = inject(PLATFORM_ID);
57
+ _isServer = isPlatformServer(this._platformId);
58
+ _operationAllowedTypesMap = new Map();
59
+ _resetMethodMap = {
60
+ '_resetStringValue': this._resetStringValue,
61
+ '_resetBooleanValue': this._resetBooleanValue,
62
+ '_resetArrayValue': this._resetArrayValue,
63
+ '_resetNumberValue': this._resetNumberValue,
64
+ };
65
+ value = input([], ...(ngDevMode ? [{ debugName: "value" }] : []));
66
+ fieldDefs = input([], ...(ngDevMode ? [{ debugName: "fieldDefs" }] : []));
67
+ categories = input([], ...(ngDevMode ? [{ debugName: "categories" }] : []));
68
+ groupOperations = input([
69
+ {
70
+ id: 'and',
71
+ name: 'And'
72
+ },
73
+ {
74
+ id: 'or',
75
+ name: 'Or'
76
+ }
77
+ ], ...(ngDevMode ? [{ debugName: "groupOperations" }] : []));
78
+ customOperations = input([], ...(ngDevMode ? [{ debugName: "customOperations" }] : []));
79
+ _logicalOperator = this.groupOperations()[0].id;
80
+ _prebuiltOperationDefs = viewChildren(FilterBuilderOperationDefDirective, ...(ngDevMode ? [{ debugName: "_prebuiltOperationDefs" }] : []));
81
+ _customOperationDefs = contentChildren(FilterBuilderOperationDefDirective, ...(ngDevMode ? [{ debugName: "_customOperationDefs" }] : []));
82
+ _operationDefs = [];
83
+ valueChanged = output();
84
+ _value = [];
85
+ _operations = [];
86
+ editItem;
87
+ ngOnInit() {
88
+ if (this.value().length) {
89
+ if (!this._isGroup(this.value()[0])) {
90
+ throw new Error('Invalid filter value, first element should be a filter group');
91
+ }
92
+ this._logicalOperator = this.value()[0]['logicalOperator'];
93
+ this._value = JSON.parse(JSON.stringify(this.value()[0]['value']));
94
+ }
95
+ }
96
+ ngAfterViewInit() {
97
+ this._operationDefs = [...this._prebuiltOperationDefs(), ...this._customOperationDefs()];
98
+ this._operationDefs.forEach(operationDef => {
99
+ this._operations.push({
100
+ id: operationDef.id(),
101
+ name: operationDef.operationName()?.templateRef
102
+ });
103
+ operationDef.allowedDataTypes().forEach((allowedType) => {
104
+ if (!this._operationAllowedTypesMap.has(allowedType)) {
105
+ this._operationAllowedTypesMap.set(allowedType, []);
106
+ }
107
+ const allowedTypeValue = this._operationAllowedTypesMap.get(allowedType);
108
+ allowedTypeValue.push(operationDef.id());
109
+ this._operationAllowedTypesMap.set(allowedType, allowedTypeValue);
110
+ });
111
+ });
112
+ this._cdr.detectChanges();
113
+ }
114
+ addCondition(targetGroup) {
115
+ const value = !targetGroup ? this._value : targetGroup.value;
116
+ value.push({
117
+ value: [this.fieldDefs()[0].dataField, this._operations[0].id, '']
118
+ });
119
+ }
120
+ addGroup(targetGroup) {
121
+ const value = !targetGroup ? this._value : targetGroup.value;
122
+ value.push({
123
+ logicalOperator: this.groupOperations()[0].id,
124
+ value: []
125
+ });
126
+ }
127
+ getConditionField(dataField) {
128
+ return this.fieldDefs().find(field => field.dataField === dataField);
129
+ }
130
+ getConditionOperation(id) {
131
+ return this._operations.find(operation => operation.id === id);
132
+ }
133
+ getSelectedGroupOperationName(targetGroup) {
134
+ const groupLogicalOperatorId = targetGroup ? targetGroup.logicalOperator : this._logicalOperator;
135
+ return this.groupOperations().find(groupOperator => groupOperator.id === groupLogicalOperatorId)?.name || '';
136
+ }
137
+ selectConditionField(item, field) {
138
+ this.editItem = undefined;
139
+ let allowedTypes = this._operationAllowedTypesMap.get(field.dataType);
140
+ item['value'][1] = allowedTypes[0];
141
+ this._resetValue(field, item);
142
+ this._emitChangeEvent();
143
+ }
144
+ operationChanged(item, operation) {
145
+ this.editItem = undefined;
146
+ const oldOperation = item['value'][1];
147
+ if (oldOperation === 'equals' && operation === 'isAnyOf') {
148
+ item['value'][2] = [];
149
+ }
150
+ else if (oldOperation === 'isAnyOf' && operation === 'equals') {
151
+ item['value'][2] = null;
152
+ }
153
+ if (oldOperation === 'isBetween' && operation !== 'isBetween') {
154
+ item['value'][2] = null;
155
+ }
156
+ else if (oldOperation !== 'isBetween' && operation === 'isBetween') {
157
+ item['value'][2] = [];
158
+ }
159
+ if (['isNotBlank', 'isBlank'].includes(operation)) {
160
+ item['value'][2] = null;
161
+ }
162
+ item['value'][1] = operation;
163
+ this._emitChangeEvent();
164
+ }
165
+ removeCondition(index, items) {
166
+ items.splice(index, 1);
167
+ this._emitChangeEvent();
168
+ }
169
+ isOperationAllowedForCondition(dataField, operationId) {
170
+ const fieldDef = this.fieldDefs().find(f => f.dataField === dataField);
171
+ let allowedTypes = this._operationAllowedTypesMap.get(fieldDef.dataType);
172
+ if (!allowedTypes) {
173
+ throw new Error('There are not operations for the datatype: ' + fieldDef.dataType);
174
+ }
175
+ return allowedTypes.includes(operationId);
176
+ }
177
+ modifyValue(item) {
178
+ this.editItem = item;
179
+ }
180
+ getFieldType(item) {
181
+ return this.fieldDefs().find(f => f.dataField === item['value'][0]).dataType;
182
+ }
183
+ isValueNotEmpty(item) {
184
+ if (this.getFieldType(item) === 'array') {
185
+ if (item['value'][1] === 'equals') {
186
+ return item['value'][2] !== null && item['value'][2] !== '';
187
+ }
188
+ else {
189
+ return item['value'][2].length > 0;
190
+ }
191
+ }
192
+ if (item['value'][1] === 'isBetween') {
193
+ return item['value'][2].length === 2 && item['value'][2][0] !== null && item['value'][2][1] !== null;
194
+ }
195
+ return item['value'][2] !== null && item['value'][2] !== '';
196
+ }
197
+ cancelEdit(delay = 0) {
198
+ setTimeout(() => {
199
+ this.editItem = undefined;
200
+ this._cdr.detectChanges();
201
+ }, delay);
202
+ }
203
+ getOptions(item) {
204
+ const fieldDef = this._getFieldDef(item);
205
+ return fieldDef.lookup?.dataSource;
206
+ }
207
+ getDataSourceItemNameById(item, dataSourceItemId) {
208
+ const fieldDef = this._getFieldDef(item);
209
+ return (fieldDef.lookup?.dataSource).find(item => item.id === dataSourceItemId)?.name || '';
210
+ }
211
+ selectBlur(event) {
212
+ event.preventDefault();
213
+ event.stopPropagation();
214
+ const select = event.target;
215
+ setTimeout(() => {
216
+ const formField = select.closest('.mat-mdc-form-field');
217
+ if (formField) {
218
+ if (!formField.classList.contains('mat-focused')) {
219
+ this.cancelEdit();
220
+ }
221
+ }
222
+ }, 25);
223
+ }
224
+ selectClosed() {
225
+ this.cancelEdit();
226
+ this._emitChangeEvent();
227
+ }
228
+ operationIconTemplateRef(operation) {
229
+ return operation.operationIcon()?.templateRef;
230
+ }
231
+ operationNameTemplateRef(operation) {
232
+ return operation.operationName()?.templateRef;
233
+ }
234
+ _isGroup(item) {
235
+ return 'logicalOperator' in item;
236
+ }
237
+ _isCondition(item) {
238
+ return !('logicalOperator' in item);
239
+ }
240
+ _emitChangeEvent() {
241
+ const value = this._normalizeValue(this._value);
242
+ if (value.length > 0) {
243
+ this.valueChanged.emit([
244
+ {
245
+ logicalOperator: this._logicalOperator,
246
+ value: value
247
+ }
248
+ ]);
249
+ }
250
+ else {
251
+ this.valueChanged.emit([]);
252
+ }
253
+ }
254
+ _getFieldDef(condition) {
255
+ return this.fieldDefs().find(f => f.dataField === condition['value'][0]);
256
+ }
257
+ _resetValue(field, condition) {
258
+ const fieldDef = this.fieldDefs().find(f => f.dataField === field.dataField);
259
+ const resetMethod = '_reset' + this._capitalizeFirstLetter(fieldDef.dataType) + 'Value';
260
+ this._resetMethodMap[resetMethod](condition);
261
+ }
262
+ _resetStringValue(condition) {
263
+ condition['value'][2] = '';
264
+ }
265
+ _resetNumberValue(condition) {
266
+ condition['value'][2] = null;
267
+ }
268
+ _resetArrayValue(condition) {
269
+ if (condition['value'][1] === 'equals') {
270
+ condition['value'][2] = null;
271
+ }
272
+ else {
273
+ condition['value'][2] = [];
274
+ }
275
+ }
276
+ _resetBooleanValue(condition) {
277
+ condition['value'][2] = false;
278
+ }
279
+ _capitalizeFirstLetter(value) {
280
+ return value.charAt(0).toUpperCase() + value.slice(1);
281
+ }
282
+ _normalizeValue(value) {
283
+ let result = [];
284
+ value.forEach(item => {
285
+ if (this._isGroup(item)) {
286
+ const groupValue = this._normalizeValue(item.value);
287
+ if (groupValue.length > 0) {
288
+ result = [...result, {
289
+ logicalOperator: item.logicalOperator,
290
+ value: groupValue
291
+ }];
292
+ }
293
+ }
294
+ else {
295
+ if (this.isValueNotEmpty(item)) {
296
+ result.push(item);
297
+ }
298
+ }
299
+ });
300
+ return result;
301
+ }
302
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
303
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.10", type: FilterBuilderComponent, isStandalone: true, selector: "emr-filter-builder", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, fieldDefs: { classPropertyName: "fieldDefs", publicName: "fieldDefs", isSignal: true, isRequired: false, transformFunction: null }, categories: { classPropertyName: "categories", publicName: "categories", isSignal: true, isRequired: false, transformFunction: null }, groupOperations: { classPropertyName: "groupOperations", publicName: "groupOperations", isSignal: true, isRequired: false, transformFunction: null }, customOperations: { classPropertyName: "customOperations", publicName: "customOperations", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChanged: "valueChanged" }, host: { classAttribute: "emr-filter-builder" }, queries: [{ propertyName: "_customOperationDefs", predicate: FilterBuilderOperationDefDirective, isSignal: true }], viewQueries: [{ propertyName: "_prebuiltOperationDefs", predicate: FilterBuilderOperationDefDirective, descendants: true, isSignal: true }], exportAs: ["emrFilterBuilder"], ngImport: i0, template: "@if (_isServer) {\r\n <ng-content/>\r\n}\r\n\r\n<ng-template #itemsTpl let-items>\r\n <div class=\"group\">\r\n @for (item of items; track item; let index = $index) {\r\n @if (_isGroup(item)) {\r\n <div class=\"flex items-center group-operations\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button [matMenuTriggerFor]=\"nestedGroupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName(item) }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addGroupMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n <mat-menu #nestedGroupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['logicalOperator']\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #addGroupMenu>\r\n <button mat-menu-item (click)=\"addCondition(item)\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup(item)\">Add Group</button>\r\n </mat-menu>\r\n </div>\r\n @if (item['value'].length > 0) {\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: item['value'] }\"></ng-container>\r\n }\r\n } @else if (_isCondition(item)) {\r\n <div class=\"condition\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button class=\"condition-field\"\r\n [matMenuTriggerFor]=\"fieldsMenu\">{{ getConditionField(item['value'][0])?.name }}</button>\r\n <button class=\"condition-operation\"\r\n [matMenuTriggerFor]=\"operationsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"getConditionOperation(item['value'][1])?.name\"></ng-template>\r\n </button>\r\n <div class=\"relative\">\r\n @if (editItem && editItem === item) {\r\n <div class=\"absolute start-0 top-0 -translate-y-1/2\">\r\n @switch (getFieldType(editItem)) {\r\n @case ('array') {\r\n @switch (editItem['value'][1]) {\r\n @case ('equals') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\"\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n\r\n @case ('isAnyOf') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\" multiple\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (closed)=\"selectClosed()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @case ('number') {\r\n @switch (editItem['value'][1]) {\r\n @case ('isBetween') {\r\n <div class=\"flex gap-2 items-center\"\r\n emrFocusElement (elementBlurred)=\"cancelEdit()\">\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n [(ngModel)]=\"item['value'][2][0]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n <div class=\"text-neutral-500\">&ndash;</div>\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput\r\n [(ngModel)]=\"item['value'][2][1]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n </div>\r\n }\r\n @default {\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @default {\r\n <mat-form-field class=\"form-field\">\r\n <input type=\"text\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n @if (item['value'][1] !== 'isBlank' && item['value'][1] !== 'isNotBlank') {\r\n @if (isValueNotEmpty(item)) {\r\n @if (getFieldType(item) === 'array') {\r\n @if (item['value'][1] === 'equals') {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n {{ getDataSourceItemNameById(item, item['value'][2]) }}\r\n </button>\r\n } @else {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n @for (dataSourceItemId of item['value'][2]; track dataSourceItemId; let last = $last) {\r\n <span>{{ getDataSourceItemNameById(item, dataSourceItemId) }}</span>\r\n @if (!last) {\r\n <span class=\"text-neutral-500\">|</span>\r\n }\r\n }\r\n </button>\r\n }\r\n } @else {\r\n @if (item['value'][1] === 'isBetween') {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2][0] }}</span>\r\n <span class=\"text-neutral-500\">&ndash;</span>\r\n <span>{{ item['value'][2][1] }}</span>\r\n </button>\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2] }}</span>\r\n </button>\r\n }\r\n }\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span i18n>&lt;enter a value&gt;</span>\r\n </button>\r\n }\r\n }\r\n }\r\n </div>\r\n </div>\r\n <mat-menu #fieldsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['value'][0]\">\r\n @for (fieldDef of fieldDefs(); track fieldDef) {\r\n <mat-option [value]=\"fieldDef.dataField\"\r\n (click)=\"selectConditionField(item, fieldDef)\">{{ fieldDef.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #operationsMenu>\r\n <div emrMenuOptionGroup [ngModel]=\"item['value'][1]\">\r\n @for (operation of _operationDefs; track operation.id()) {\r\n <div [hidden]=\"!isOperationAllowedForCondition(item['value'][0], operation.id())\">\r\n <mat-option [value]=\"operation.id()\" (click)=\"operationChanged(item, operation.id())\">\r\n <div class=\"flex items-center gap-3\">\r\n @if (operation.operationIcon()) {\r\n <ng-template [ngTemplateOutlet]=\"operationIconTemplateRef(operation)\"></ng-template>\r\n }\r\n <div>\r\n <ng-template [ngTemplateOutlet]=\"operationNameTemplateRef(operation)\"></ng-template>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </mat-menu>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"group\">\r\n <div class=\"flex items-center group-operations\">\r\n <button [matMenuTriggerFor]=\"groupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName() }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: _value }\"></ng-container>\r\n</div>\r\n\r\n<mat-menu #groupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"_logicalOperator\" (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n</mat-menu>\r\n<mat-menu #addMenu>\r\n <button mat-menu-item (click)=\"addCondition()\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup()\">Add Group</button>\r\n</mat-menu>\r\n\r\n<ng-container emrFilterBuilderOperationDef=\"contains\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Contains</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"doesNotContain\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Does not contain</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"startsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Starts with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"endsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Ends with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"equals\" [allowedDataTypes]=\"['string', 'number', 'array', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"notEquals\" [allowedDataTypes]=\"['string', 'number', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Not equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isNotBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is not blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBetween\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is between</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isAnyOf\" [allowedDataTypes]=\"['array']\">\r\n <ng-template emrFilterBuilderOperationName>Is any of</ng-template>\r\n</ng-container>\r\n", styles: [":host{--emr-filter-builder-group-operations-gap: calc(var(--spacing) * 2);--emr-filter-builder-group-operation-font-size: var(--text-tiny);--emr-filter-builder-group-operation-color: var(--color-neutral-800);--emr-filter-builder-group-operation-bg: transparent;--emr-filter-builder-group-operation-font-weight: 400;--emr-filter-builder-group-operation-border-radius: .5rem;--emr-filter-builder-group-operation-bpadding: 0 calc(var(--spacing) * 2);--emr-filter-builder-group-operation-height: calc(var(--spacing) * 7);--emr-filter-builder-group-operation-hover-color: var(--color-neutral-800);--emr-filter-builder-group-operation-hover-bg: var(--color-neutral-200);--emr-filter-builder-group-operation-active-color: var(--color-neutral-900);--emr-filter-builder-group-operation-active-bg: var(--color-neutral-300);--emr-filter-builder-group-operation-border: 1px solid var(--color-neutral-500);--emr-filter-builder-group-add-color: var(--color-primary);--emr-filter-builder-group-add-hover-color: var(--color-primary);--emr-filter-builder-group-margin: 0;--emr-filter-builder-group-padding: 0;--emr-filter-builder-group-gap: calc(var(--spacing) * 4);--emr-filter-builder-condition-gap: calc(var(--spacing) * 2);--emr-filter-builder-condition-field-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-field-font-size: var(--text-tiny);--emr-filter-builder-condition-field-color: var(--color-neutral-800);--emr-filter-builder-condition-field-bg: var(--color-primary-300);--emr-filter-builder-condition-field-font-weight: 400;--emr-filter-builder-condition-field-border-radius: .5rem;--emr-filter-builder-condition-field-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-field-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-field-hover-bg: var(--color-primary-400);--emr-filter-builder-condition-field-active-color: white;--emr-filter-builder-condition-field-active-bg: var(--color-primary-500);--emr-filter-builder-condition-operation-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-operation-font-size: var(--text-tiny);--emr-filter-builder-condition-operation-color: var(--color-neutral-800);--emr-filter-builder-condition-operation-bg: var(--color-tertiary-300);--emr-filter-builder-condition-operation-font-weight: 400;--emr-filter-builder-condition-operation-border-radius: .5rem;--emr-filter-builder-condition-operation-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-operation-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-operation-hover-bg: var(--color-tertiary-400);--emr-filter-builder-condition-operation-active-color: white;--emr-filter-builder-condition-operation-active-bg: var(--color-tertiary-500);--emr-filter-builder-condition-value-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-value-font-size: var(--text-tiny);--emr-filter-builder-condition-value-color: var(--color-neutral-800);--emr-filter-builder-condition-value-bg: var(--color-neutral-200);--emr-filter-builder-condition-value-font-weight: 400;--emr-filter-builder-condition-value-border-radius: .5rem;--emr-filter-builder-condition-value-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-value-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-value-hover-bg: var(--color-neutral-300);--emr-filter-builder-condition-remove-color: oklch(63.7% .237 25.331);--emr-filter-builder-condition-remove-hover-color: oklch(57.7% .245 27.325);display:block}:host ::ng-deep .mat-mdc-form-field-infix{--mat-form-field-container-height: 46px !important;--mat-form-field-container-vertical-padding: 12px !important}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host .form-field{width:200px}:host .form-field-number{width:140px}:host .group-operations{gap:var(--emr-filter-builder-group-operations-gap)}:host .group{margin:var(--emr-filter-builder-group-margin);padding:var(--emr-filter-builder-group-padding);display:flex;flex-direction:column;gap:var(--emr-filter-builder-group-gap)}:host .group .group{margin-left:calc(var(--spacing) * 4)}:host .icon:empty{display:none}:host .group-operation{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-group-operation-height);font-size:var(--emr-filter-builder-group-operation-font-size);font-weight:var(--emr-filter-builder-group-operation-font-weight);color:var(--emr-filter-builder-group-operation-color);background:var(--emr-filter-builder-group-operation-bg);border:var(--emr-filter-builder-group-operation-border);border-radius:var(--emr-filter-builder-group-operation-border-radius);padding:var(--emr-filter-builder-group-operation-bpadding)}:host .group-operation:hover{color:var(--emr-filter-builder-group-operation-hover-color);background:var(--emr-filter-builder-group-operation-hover-bg)}:host .group-operation:active,:host .group-operation.active{color:var(--emr-filter-builder-group-operation-active-color);background:var(--emr-filter-builder-group-operation-active-bg)}:host .condition{display:flex;align-items:center;gap:var(--emr-filter-builder-condition-gap)}:host .condition-field{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-field-height);font-size:var(--emr-filter-builder-condition-field-font-size);font-weight:var(--emr-filter-builder-condition-field-font-weight);color:var(--emr-filter-builder-condition-field-color);background:var(--emr-filter-builder-condition-field-bg);border-radius:var(--emr-filter-builder-condition-field-border-radius);padding:var(--emr-filter-builder-condition-field-bpadding)}:host .condition-field:hover{color:var(--emr-filter-builder-condition-field-hover-color);background:var(--emr-filter-builder-condition-field-hover-bg)}:host .add{line-height:0;color:var(--emr-filter-builder-group-add-color);cursor:pointer}:host .add:hover{color:var(--emr-filter-builder-group-add-hover-color)}:host .remove{line-height:0;color:var(--emr-filter-builder-condition-remove-color);cursor:pointer}:host .remove:hover{color:var(--emr-filter-builder-condition-remove-hover-color)}:host .condition-field:active,:host .condition-field.active{color:var(--emr-filter-builder-condition-field-active-color);background:var(--emr-filter-builder-condition-field-active-bg)}:host .condition-operation{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-operation-height);font-size:var(--emr-filter-builder-condition-operation-font-size);font-weight:var(--emr-filter-builder-condition-operation-font-weight);color:var(--emr-filter-builder-condition-operation-color);background:var(--emr-filter-builder-condition-operation-bg);border-radius:var(--emr-filter-builder-condition-operation-border-radius);padding:var(--emr-filter-builder-condition-operation-bpadding)}:host .condition-operation:hover{color:var(--emr-filter-builder-condition-operation-hover-color);background:var(--emr-filter-builder-condition-operation-hover-bg)}:host .condition-operation:active,:host .condition-operation.active{color:var(--emr-filter-builder-condition-operation-active-color);background:var(--emr-filter-builder-condition-operation-active-bg)}:host .condition-value{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-value-height);font-size:var(--emr-filter-builder-condition-value-font-size);font-weight:var(--emr-filter-builder-condition-value-font-weight);color:var(--emr-filter-builder-condition-value-color);background:var(--emr-filter-builder-condition-value-bg);border-radius:var(--emr-filter-builder-condition-value-border-radius);padding:var(--emr-filter-builder-condition-value-bpadding)}:host .condition-value:hover{color:var(--emr-filter-builder-condition-value-hover-color);background:var(--emr-filter-builder-condition-value-hover-bg)}:host-context(html.dark){--emr-filter-builder-group-operation-color: var(--color-neutral-200);--emr-filter-builder-group-operation-hover-bg: var(--color-neutral-600);--emr-filter-builder-group-operation-active-bg: var(--color-neutral-650);--emr-filter-builder-group-operation-hover-color: var(--color-neutral-100);--emr-filter-builder-group-operation-active-color: var(--color-neutral-50)}\n/*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: MenuOptionGroupDirective, selector: "[emrMenuOptionGroup]", outputs: ["valueChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: AutoFocusDirective, selector: "[emrAutoFocus]", exportAs: ["emrAutoFocus"] }, { kind: "directive", type: FocusElementDirective, selector: "[emrFocusElement]", inputs: ["checkChildren"], outputs: ["elementFocused", "elementBlurred"], exportAs: ["emrFocusElement"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: FilterBuilderOperationDefDirective, selector: "[emrFilterBuilderOperationDef]", inputs: ["emrFilterBuilderOperationDef", "allowedDataTypes"] }, { kind: "directive", type: FilterBuilderOperationNameDirective, selector: "[emrFilterBuilderOperationName]" }] });
304
+ }
305
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: FilterBuilderComponent, decorators: [{
306
+ type: Component,
307
+ args: [{ selector: 'emr-filter-builder', exportAs: 'emrFilterBuilder', imports: [
308
+ MatIcon,
309
+ MatMenuTrigger,
310
+ MatMenu,
311
+ MenuOptionGroupDirective,
312
+ FormsModule,
313
+ MatOption,
314
+ MatMenuItem,
315
+ NgTemplateOutlet,
316
+ MatFormField,
317
+ MatSelect,
318
+ AutoFocusDirective,
319
+ FocusElementDirective,
320
+ MatInput,
321
+ FilterBuilderOperationDefDirective,
322
+ FilterBuilderOperationNameDirective
323
+ ], host: {
324
+ 'class': 'emr-filter-builder'
325
+ }, template: "@if (_isServer) {\r\n <ng-content/>\r\n}\r\n\r\n<ng-template #itemsTpl let-items>\r\n <div class=\"group\">\r\n @for (item of items; track item; let index = $index) {\r\n @if (_isGroup(item)) {\r\n <div class=\"flex items-center group-operations\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button [matMenuTriggerFor]=\"nestedGroupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName(item) }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addGroupMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n <mat-menu #nestedGroupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['logicalOperator']\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #addGroupMenu>\r\n <button mat-menu-item (click)=\"addCondition(item)\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup(item)\">Add Group</button>\r\n </mat-menu>\r\n </div>\r\n @if (item['value'].length > 0) {\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: item['value'] }\"></ng-container>\r\n }\r\n } @else if (_isCondition(item)) {\r\n <div class=\"condition\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button class=\"condition-field\"\r\n [matMenuTriggerFor]=\"fieldsMenu\">{{ getConditionField(item['value'][0])?.name }}</button>\r\n <button class=\"condition-operation\"\r\n [matMenuTriggerFor]=\"operationsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"getConditionOperation(item['value'][1])?.name\"></ng-template>\r\n </button>\r\n <div class=\"relative\">\r\n @if (editItem && editItem === item) {\r\n <div class=\"absolute start-0 top-0 -translate-y-1/2\">\r\n @switch (getFieldType(editItem)) {\r\n @case ('array') {\r\n @switch (editItem['value'][1]) {\r\n @case ('equals') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\"\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n\r\n @case ('isAnyOf') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\" multiple\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (closed)=\"selectClosed()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @case ('number') {\r\n @switch (editItem['value'][1]) {\r\n @case ('isBetween') {\r\n <div class=\"flex gap-2 items-center\"\r\n emrFocusElement (elementBlurred)=\"cancelEdit()\">\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n [(ngModel)]=\"item['value'][2][0]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n <div class=\"text-neutral-500\">&ndash;</div>\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput\r\n [(ngModel)]=\"item['value'][2][1]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n </div>\r\n }\r\n @default {\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @default {\r\n <mat-form-field class=\"form-field\">\r\n <input type=\"text\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n @if (item['value'][1] !== 'isBlank' && item['value'][1] !== 'isNotBlank') {\r\n @if (isValueNotEmpty(item)) {\r\n @if (getFieldType(item) === 'array') {\r\n @if (item['value'][1] === 'equals') {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n {{ getDataSourceItemNameById(item, item['value'][2]) }}\r\n </button>\r\n } @else {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n @for (dataSourceItemId of item['value'][2]; track dataSourceItemId; let last = $last) {\r\n <span>{{ getDataSourceItemNameById(item, dataSourceItemId) }}</span>\r\n @if (!last) {\r\n <span class=\"text-neutral-500\">|</span>\r\n }\r\n }\r\n </button>\r\n }\r\n } @else {\r\n @if (item['value'][1] === 'isBetween') {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2][0] }}</span>\r\n <span class=\"text-neutral-500\">&ndash;</span>\r\n <span>{{ item['value'][2][1] }}</span>\r\n </button>\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2] }}</span>\r\n </button>\r\n }\r\n }\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span i18n>&lt;enter a value&gt;</span>\r\n </button>\r\n }\r\n }\r\n }\r\n </div>\r\n </div>\r\n <mat-menu #fieldsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['value'][0]\">\r\n @for (fieldDef of fieldDefs(); track fieldDef) {\r\n <mat-option [value]=\"fieldDef.dataField\"\r\n (click)=\"selectConditionField(item, fieldDef)\">{{ fieldDef.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #operationsMenu>\r\n <div emrMenuOptionGroup [ngModel]=\"item['value'][1]\">\r\n @for (operation of _operationDefs; track operation.id()) {\r\n <div [hidden]=\"!isOperationAllowedForCondition(item['value'][0], operation.id())\">\r\n <mat-option [value]=\"operation.id()\" (click)=\"operationChanged(item, operation.id())\">\r\n <div class=\"flex items-center gap-3\">\r\n @if (operation.operationIcon()) {\r\n <ng-template [ngTemplateOutlet]=\"operationIconTemplateRef(operation)\"></ng-template>\r\n }\r\n <div>\r\n <ng-template [ngTemplateOutlet]=\"operationNameTemplateRef(operation)\"></ng-template>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </mat-menu>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"group\">\r\n <div class=\"flex items-center group-operations\">\r\n <button [matMenuTriggerFor]=\"groupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName() }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: _value }\"></ng-container>\r\n</div>\r\n\r\n<mat-menu #groupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"_logicalOperator\" (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n</mat-menu>\r\n<mat-menu #addMenu>\r\n <button mat-menu-item (click)=\"addCondition()\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup()\">Add Group</button>\r\n</mat-menu>\r\n\r\n<ng-container emrFilterBuilderOperationDef=\"contains\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Contains</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"doesNotContain\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Does not contain</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"startsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Starts with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"endsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Ends with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"equals\" [allowedDataTypes]=\"['string', 'number', 'array', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"notEquals\" [allowedDataTypes]=\"['string', 'number', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Not equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isNotBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is not blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBetween\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is between</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isAnyOf\" [allowedDataTypes]=\"['array']\">\r\n <ng-template emrFilterBuilderOperationName>Is any of</ng-template>\r\n</ng-container>\r\n", styles: [":host{--emr-filter-builder-group-operations-gap: calc(var(--spacing) * 2);--emr-filter-builder-group-operation-font-size: var(--text-tiny);--emr-filter-builder-group-operation-color: var(--color-neutral-800);--emr-filter-builder-group-operation-bg: transparent;--emr-filter-builder-group-operation-font-weight: 400;--emr-filter-builder-group-operation-border-radius: .5rem;--emr-filter-builder-group-operation-bpadding: 0 calc(var(--spacing) * 2);--emr-filter-builder-group-operation-height: calc(var(--spacing) * 7);--emr-filter-builder-group-operation-hover-color: var(--color-neutral-800);--emr-filter-builder-group-operation-hover-bg: var(--color-neutral-200);--emr-filter-builder-group-operation-active-color: var(--color-neutral-900);--emr-filter-builder-group-operation-active-bg: var(--color-neutral-300);--emr-filter-builder-group-operation-border: 1px solid var(--color-neutral-500);--emr-filter-builder-group-add-color: var(--color-primary);--emr-filter-builder-group-add-hover-color: var(--color-primary);--emr-filter-builder-group-margin: 0;--emr-filter-builder-group-padding: 0;--emr-filter-builder-group-gap: calc(var(--spacing) * 4);--emr-filter-builder-condition-gap: calc(var(--spacing) * 2);--emr-filter-builder-condition-field-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-field-font-size: var(--text-tiny);--emr-filter-builder-condition-field-color: var(--color-neutral-800);--emr-filter-builder-condition-field-bg: var(--color-primary-300);--emr-filter-builder-condition-field-font-weight: 400;--emr-filter-builder-condition-field-border-radius: .5rem;--emr-filter-builder-condition-field-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-field-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-field-hover-bg: var(--color-primary-400);--emr-filter-builder-condition-field-active-color: white;--emr-filter-builder-condition-field-active-bg: var(--color-primary-500);--emr-filter-builder-condition-operation-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-operation-font-size: var(--text-tiny);--emr-filter-builder-condition-operation-color: var(--color-neutral-800);--emr-filter-builder-condition-operation-bg: var(--color-tertiary-300);--emr-filter-builder-condition-operation-font-weight: 400;--emr-filter-builder-condition-operation-border-radius: .5rem;--emr-filter-builder-condition-operation-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-operation-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-operation-hover-bg: var(--color-tertiary-400);--emr-filter-builder-condition-operation-active-color: white;--emr-filter-builder-condition-operation-active-bg: var(--color-tertiary-500);--emr-filter-builder-condition-value-height: calc(var(--spacing) * 7);--emr-filter-builder-condition-value-font-size: var(--text-tiny);--emr-filter-builder-condition-value-color: var(--color-neutral-800);--emr-filter-builder-condition-value-bg: var(--color-neutral-200);--emr-filter-builder-condition-value-font-weight: 400;--emr-filter-builder-condition-value-border-radius: .5rem;--emr-filter-builder-condition-value-bpadding: calc(var(--spacing) * .5) calc(var(--spacing) * 2);--emr-filter-builder-condition-value-hover-color: var(--color-neutral-800);--emr-filter-builder-condition-value-hover-bg: var(--color-neutral-300);--emr-filter-builder-condition-remove-color: oklch(63.7% .237 25.331);--emr-filter-builder-condition-remove-hover-color: oklch(57.7% .245 27.325);display:block}:host ::ng-deep .mat-mdc-form-field-infix{--mat-form-field-container-height: 46px !important;--mat-form-field-container-vertical-padding: 12px !important}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host .form-field{width:200px}:host .form-field-number{width:140px}:host .group-operations{gap:var(--emr-filter-builder-group-operations-gap)}:host .group{margin:var(--emr-filter-builder-group-margin);padding:var(--emr-filter-builder-group-padding);display:flex;flex-direction:column;gap:var(--emr-filter-builder-group-gap)}:host .group .group{margin-left:calc(var(--spacing) * 4)}:host .icon:empty{display:none}:host .group-operation{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-group-operation-height);font-size:var(--emr-filter-builder-group-operation-font-size);font-weight:var(--emr-filter-builder-group-operation-font-weight);color:var(--emr-filter-builder-group-operation-color);background:var(--emr-filter-builder-group-operation-bg);border:var(--emr-filter-builder-group-operation-border);border-radius:var(--emr-filter-builder-group-operation-border-radius);padding:var(--emr-filter-builder-group-operation-bpadding)}:host .group-operation:hover{color:var(--emr-filter-builder-group-operation-hover-color);background:var(--emr-filter-builder-group-operation-hover-bg)}:host .group-operation:active,:host .group-operation.active{color:var(--emr-filter-builder-group-operation-active-color);background:var(--emr-filter-builder-group-operation-active-bg)}:host .condition{display:flex;align-items:center;gap:var(--emr-filter-builder-condition-gap)}:host .condition-field{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-field-height);font-size:var(--emr-filter-builder-condition-field-font-size);font-weight:var(--emr-filter-builder-condition-field-font-weight);color:var(--emr-filter-builder-condition-field-color);background:var(--emr-filter-builder-condition-field-bg);border-radius:var(--emr-filter-builder-condition-field-border-radius);padding:var(--emr-filter-builder-condition-field-bpadding)}:host .condition-field:hover{color:var(--emr-filter-builder-condition-field-hover-color);background:var(--emr-filter-builder-condition-field-hover-bg)}:host .add{line-height:0;color:var(--emr-filter-builder-group-add-color);cursor:pointer}:host .add:hover{color:var(--emr-filter-builder-group-add-hover-color)}:host .remove{line-height:0;color:var(--emr-filter-builder-condition-remove-color);cursor:pointer}:host .remove:hover{color:var(--emr-filter-builder-condition-remove-hover-color)}:host .condition-field:active,:host .condition-field.active{color:var(--emr-filter-builder-condition-field-active-color);background:var(--emr-filter-builder-condition-field-active-bg)}:host .condition-operation{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-operation-height);font-size:var(--emr-filter-builder-condition-operation-font-size);font-weight:var(--emr-filter-builder-condition-operation-font-weight);color:var(--emr-filter-builder-condition-operation-color);background:var(--emr-filter-builder-condition-operation-bg);border-radius:var(--emr-filter-builder-condition-operation-border-radius);padding:var(--emr-filter-builder-condition-operation-bpadding)}:host .condition-operation:hover{color:var(--emr-filter-builder-condition-operation-hover-color);background:var(--emr-filter-builder-condition-operation-hover-bg)}:host .condition-operation:active,:host .condition-operation.active{color:var(--emr-filter-builder-condition-operation-active-color);background:var(--emr-filter-builder-condition-operation-active-bg)}:host .condition-value{display:flex;align-items:center;width:max-content;-webkit-user-select:none;user-select:none;cursor:pointer;height:var(--emr-filter-builder-condition-value-height);font-size:var(--emr-filter-builder-condition-value-font-size);font-weight:var(--emr-filter-builder-condition-value-font-weight);color:var(--emr-filter-builder-condition-value-color);background:var(--emr-filter-builder-condition-value-bg);border-radius:var(--emr-filter-builder-condition-value-border-radius);padding:var(--emr-filter-builder-condition-value-bpadding)}:host .condition-value:hover{color:var(--emr-filter-builder-condition-value-hover-color);background:var(--emr-filter-builder-condition-value-hover-bg)}:host-context(html.dark){--emr-filter-builder-group-operation-color: var(--color-neutral-200);--emr-filter-builder-group-operation-hover-bg: var(--color-neutral-600);--emr-filter-builder-group-operation-active-bg: var(--color-neutral-650);--emr-filter-builder-group-operation-hover-color: var(--color-neutral-100);--emr-filter-builder-group-operation-active-color: var(--color-neutral-50)}\n/*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */\n"] }]
326
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], fieldDefs: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldDefs", required: false }] }], categories: [{ type: i0.Input, args: [{ isSignal: true, alias: "categories", required: false }] }], groupOperations: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupOperations", required: false }] }], customOperations: [{ type: i0.Input, args: [{ isSignal: true, alias: "customOperations", required: false }] }], _prebuiltOperationDefs: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => FilterBuilderOperationDefDirective), { isSignal: true }] }], _customOperationDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FilterBuilderOperationDefDirective), { isSignal: true }] }], valueChanged: [{ type: i0.Output, args: ["valueChanged"] }] } });
327
+
328
+ /**
329
+ * Generated bundle index. Do not edit.
330
+ */
331
+
332
+ export { FilterBuilderComponent, FilterBuilderOperationDefDirective, FilterBuilderOperationIconDirective, FilterBuilderOperationNameDirective };
333
+ //# sourceMappingURL=elementar-rt-components-filter-builder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elementar-rt-components-filter-builder.mjs","sources":["../../../projects/components/filter-builder/src/filter-builder-operation-name.directive.ts","../../../projects/components/filter-builder/src/filter-builder-operation-icon.directive.ts","../../../projects/components/filter-builder/src/filter-builder-operation-def.directive.ts","../../../projects/components/filter-builder/src/filter-builder/filter-builder.component.ts","../../../projects/components/filter-builder/src/filter-builder/filter-builder.component.html","../../../projects/components/filter-builder/elementar-rt-components-filter-builder.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[emrFilterBuilderOperationName]'\r\n})\r\nexport class FilterBuilderOperationNameDirective {\r\n readonly templateRef = inject(TemplateRef);\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[emrFilterBuilderOperationIcon]'\r\n})\r\nexport class FilterBuilderOperationIconDirective {\r\n readonly templateRef = inject(TemplateRef);\r\n}\r\n","import { Directive, contentChild, input } from '@angular/core';\r\nimport { FilterBuilderOperationNameDirective } from './filter-builder-operation-name.directive';\r\nimport { FilterBuilderOperationIconDirective } from './filter-builder-operation-icon.directive';\r\n\r\n@Directive({\r\n selector: '[emrFilterBuilderOperationDef]'\r\n})\r\nexport class FilterBuilderOperationDefDirective {\r\n id = input('', {\r\n alias: 'emrFilterBuilderOperationDef'\r\n });\r\n allowedDataTypes = input<string[]>([]);\r\n readonly operationName = contentChild(FilterBuilderOperationNameDirective);\r\n readonly operationIcon = contentChild(FilterBuilderOperationIconDirective);\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectorRef,\r\n Component,\r\n inject,\r\n Input,\r\n OnInit,\r\n output,\r\n PLATFORM_ID,\r\n viewChildren,\r\n contentChildren, TemplateRef, input\r\n} from '@angular/core';\r\nimport { isPlatformServer, NgTemplateOutlet } from '@angular/common';\r\nimport { FilterBuilderOperationDefDirective } from '../filter-builder-operation-def.directive';\r\nimport {\r\n FilterBuilderCondition,\r\n FilterBuilderFieldDataSourceItem,\r\n FilterBuilderFieldDef,\r\n FilterBuilderGroup,\r\n FilterBuilderItemType\r\n} from '../types';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatOption } from '@angular/material/autocomplete';\r\nimport { MatFormField, MatInput } from '@angular/material/input';\r\nimport { MatSelect } from '@angular/material/select';\r\nimport { FilterBuilderOperationNameDirective } from '../filter-builder-operation-name.directive';\r\nimport { AutoFocusDirective, FocusElementDirective, MenuOptionGroupDirective } from '@elementar-rt/components/core';\r\n\r\n@Component({\r\n selector: 'emr-filter-builder',\r\n exportAs: 'emrFilterBuilder',\r\n imports: [\r\n MatIcon,\r\n MatMenuTrigger,\r\n MatMenu,\r\n MenuOptionGroupDirective,\r\n FormsModule,\r\n MatOption,\r\n MatMenuItem,\r\n NgTemplateOutlet,\r\n MatFormField,\r\n MatSelect,\r\n AutoFocusDirective,\r\n FocusElementDirective,\r\n MatInput,\r\n FilterBuilderOperationDefDirective,\r\n FilterBuilderOperationNameDirective\r\n ],\r\n templateUrl: './filter-builder.component.html',\r\n styleUrl: './filter-builder.component.scss',\r\n host: {\r\n 'class': 'emr-filter-builder'\r\n },\r\n})\r\nexport class FilterBuilderComponent implements OnInit, AfterViewInit {\r\n protected _cdr = inject(ChangeDetectorRef);\r\n protected _platformId = inject(PLATFORM_ID);\r\n protected _isServer = isPlatformServer(this._platformId);\r\n protected _operationAllowedTypesMap: Map<string, string[]> = new Map();\r\n private _resetMethodMap: { [prop: string]: (condition: FilterBuilderCondition) => void } = {\r\n '_resetStringValue': this._resetStringValue,\r\n '_resetBooleanValue': this._resetBooleanValue,\r\n '_resetArrayValue': this._resetArrayValue,\r\n '_resetNumberValue': this._resetNumberValue,\r\n };\r\n\r\n value = input<FilterBuilderGroup[]>([]);\r\n fieldDefs = input<FilterBuilderFieldDef[]>([]);\r\n categories = input([]);\r\n groupOperations = input([\r\n {\r\n id: 'and',\r\n name: 'And'\r\n },\r\n {\r\n id: 'or',\r\n name: 'Or'\r\n }\r\n ]);\r\n customOperations = input([]);\r\n\r\n protected _logicalOperator = this.groupOperations()[0].id;\r\n readonly _prebuiltOperationDefs = viewChildren(FilterBuilderOperationDefDirective);\r\n readonly _customOperationDefs = contentChildren(FilterBuilderOperationDefDirective);\r\n protected _operationDefs: FilterBuilderOperationDefDirective[] = [];\r\n\r\n readonly valueChanged = output<FilterBuilderGroup[]>();\r\n\r\n protected _value: FilterBuilderGroup[] = [];\r\n protected _operations: any[] = [];\r\n protected editItem: FilterBuilderCondition | undefined;\r\n\r\n ngOnInit() {\r\n if (this.value().length) {\r\n if (!this._isGroup(this.value()[0])) {\r\n throw new Error('Invalid filter value, first element should be a filter group');\r\n }\r\n\r\n this._logicalOperator = this.value()[0]['logicalOperator'] as string;\r\n this._value = JSON.parse(JSON.stringify(this.value()[0]['value']));\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._operationDefs = [...this._prebuiltOperationDefs(), ...this._customOperationDefs()];\r\n this._operationDefs.forEach(operationDef => {\r\n this._operations.push({\r\n id: operationDef.id(),\r\n name: operationDef.operationName()?.templateRef\r\n });\r\n operationDef.allowedDataTypes().forEach((allowedType: string) => {\r\n if (!this._operationAllowedTypesMap.has(allowedType)) {\r\n this._operationAllowedTypesMap.set(allowedType, []);\r\n }\r\n\r\n const allowedTypeValue = this._operationAllowedTypesMap.get(allowedType) as string[];\r\n allowedTypeValue.push(operationDef.id());\r\n this._operationAllowedTypesMap.set(allowedType, allowedTypeValue);\r\n });\r\n });\r\n this._cdr.detectChanges();\r\n }\r\n\r\n addCondition(targetGroup?: FilterBuilderGroup) {\r\n const value = !targetGroup ? this._value : targetGroup.value;\r\n value.push(\r\n {\r\n value: [this.fieldDefs()[0].dataField, this._operations[0].id, '']\r\n }\r\n );\r\n }\r\n\r\n addGroup(targetGroup?: FilterBuilderGroup) {\r\n const value = !targetGroup ? this._value : targetGroup.value;\r\n value.push(\r\n {\r\n logicalOperator: this.groupOperations()[0].id,\r\n value: []\r\n }\r\n );\r\n }\r\n\r\n getConditionField(dataField: string): FilterBuilderFieldDef | undefined {\r\n return this.fieldDefs().find(field => field.dataField === dataField);\r\n }\r\n\r\n getConditionOperation(id: string) {\r\n return this._operations.find(operation => operation.id === id);\r\n }\r\n\r\n getSelectedGroupOperationName(targetGroup?: FilterBuilderGroup): string {\r\n const groupLogicalOperatorId = targetGroup ? targetGroup.logicalOperator : this._logicalOperator\r\n return this.groupOperations().find(groupOperator => groupOperator.id === groupLogicalOperatorId)?.name || '';\r\n }\r\n\r\n selectConditionField(item: FilterBuilderCondition, field: FilterBuilderFieldDef): void {\r\n this.editItem = undefined;\r\n let allowedTypes = this._operationAllowedTypesMap.get(field.dataType) as string[];\r\n item['value'][1] = allowedTypes[0];\r\n this._resetValue(field, item);\r\n this._emitChangeEvent();\r\n }\r\n\r\n operationChanged(item: FilterBuilderCondition, operation: string): void {\r\n this.editItem = undefined;\r\n const oldOperation = item['value'][1];\r\n\r\n if (oldOperation === 'equals' && operation === 'isAnyOf') {\r\n item['value'][2] = [];\r\n } else if (oldOperation === 'isAnyOf' && operation === 'equals') {\r\n item['value'][2] = null;\r\n }\r\n\r\n if (oldOperation === 'isBetween' && operation !== 'isBetween') {\r\n item['value'][2] = null;\r\n } else if (oldOperation !== 'isBetween' && operation === 'isBetween') {\r\n item['value'][2] = [];\r\n }\r\n\r\n if (['isNotBlank', 'isBlank'].includes(operation)) {\r\n item['value'][2] = null;\r\n }\r\n\r\n item['value'][1] = operation;\r\n this._emitChangeEvent();\r\n }\r\n\r\n removeCondition(index: number, items: FilterBuilderItemType[]): void {\r\n items.splice(index, 1);\r\n this._emitChangeEvent();\r\n }\r\n\r\n isOperationAllowedForCondition(dataField: string, operationId: string): boolean {\r\n const fieldDef = this.fieldDefs().find(f =>\r\n f.dataField === dataField\r\n ) as FilterBuilderFieldDef;\r\n\r\n let allowedTypes = this._operationAllowedTypesMap.get(fieldDef.dataType);\r\n\r\n if (!allowedTypes) {\r\n throw new Error('There are not operations for the datatype: ' + fieldDef.dataType);\r\n }\r\n\r\n return allowedTypes.includes(operationId);\r\n }\r\n\r\n modifyValue(item: FilterBuilderCondition): void {\r\n this.editItem = item;\r\n }\r\n\r\n getFieldType(item: FilterBuilderCondition): string {\r\n return (this.fieldDefs().find(f =>\r\n f.dataField === item['value'][0]\r\n ) as FilterBuilderFieldDef).dataType;\r\n }\r\n\r\n isValueNotEmpty(item: FilterBuilderCondition): boolean {\r\n if (this.getFieldType(item) === 'array') {\r\n if (item['value'][1] === 'equals') {\r\n return item['value'][2] !== null && item['value'][2] !== '';\r\n } else {\r\n return item['value'][2].length > 0;\r\n }\r\n }\r\n\r\n if (item['value'][1] === 'isBetween') {\r\n return item['value'][2].length === 2 && item['value'][2][0] !== null && item['value'][2][1] !== null;\r\n }\r\n\r\n return item['value'][2] !== null && item['value'][2] !== '';\r\n }\r\n\r\n cancelEdit(delay = 0): void {\r\n setTimeout(() => {\r\n this.editItem = undefined;\r\n this._cdr.detectChanges();\r\n }, delay);\r\n }\r\n\r\n getOptions(item: FilterBuilderCondition): FilterBuilderFieldDataSourceItem[] {\r\n const fieldDef = this._getFieldDef(item);\r\n return fieldDef.lookup?.dataSource as FilterBuilderFieldDataSourceItem[];\r\n }\r\n\r\n getDataSourceItemNameById(item: FilterBuilderCondition, dataSourceItemId: string): string {\r\n const fieldDef = this._getFieldDef(item);\r\n return (fieldDef.lookup?.dataSource as FilterBuilderFieldDataSourceItem[]).find(\r\n item => item.id === dataSourceItemId\r\n )?.name || '';\r\n }\r\n\r\n selectBlur(event: FocusEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const select = event.target as HTMLElement;\r\n\r\n setTimeout(() => {\r\n const formField = select.closest('.mat-mdc-form-field');\r\n\r\n if (formField) {\r\n if (!formField.classList.contains('mat-focused')) {\r\n this.cancelEdit();\r\n }\r\n }\r\n }, 25);\r\n }\r\n\r\n selectClosed(): void {\r\n this.cancelEdit();\r\n this._emitChangeEvent();\r\n }\r\n\r\n protected operationIconTemplateRef(operation: FilterBuilderOperationDefDirective): TemplateRef<any> {\r\n return operation.operationIcon()?.templateRef as TemplateRef<any>;\r\n }\r\n\r\n protected operationNameTemplateRef(operation: FilterBuilderOperationDefDirective): TemplateRef<any> {\r\n return operation.operationName()?.templateRef as TemplateRef<any>;\r\n }\r\n\r\n protected _isGroup(item: FilterBuilderItemType): item is FilterBuilderGroup {\r\n return 'logicalOperator' in item;\r\n }\r\n\r\n protected _isCondition(item: FilterBuilderItemType): item is FilterBuilderCondition {\r\n return !('logicalOperator' in item);\r\n }\r\n\r\n protected _emitChangeEvent(): void {\r\n const value = this._normalizeValue(this._value);\r\n\r\n if (value.length > 0) {\r\n this.valueChanged.emit([\r\n {\r\n logicalOperator: this._logicalOperator,\r\n value: value\r\n }\r\n ]);\r\n } else {\r\n this.valueChanged.emit([]);\r\n }\r\n }\r\n\r\n private _getFieldDef(condition: FilterBuilderCondition): FilterBuilderFieldDef {\r\n return this.fieldDefs().find(f =>\r\n f.dataField === condition['value'][0]\r\n ) as FilterBuilderFieldDef;\r\n }\r\n\r\n private _resetValue(field: FilterBuilderFieldDef, condition: FilterBuilderCondition): void {\r\n const fieldDef = this.fieldDefs().find(f =>\r\n f.dataField === field.dataField\r\n ) as FilterBuilderFieldDef;\r\n const resetMethod = '_reset' + this._capitalizeFirstLetter(fieldDef.dataType) + 'Value';\r\n this._resetMethodMap[resetMethod](condition);\r\n }\r\n\r\n private _resetStringValue(condition: FilterBuilderCondition): void {\r\n condition['value'][2] = '';\r\n }\r\n\r\n private _resetNumberValue(condition: FilterBuilderCondition): void {\r\n condition['value'][2] = null;\r\n }\r\n\r\n private _resetArrayValue(condition: FilterBuilderCondition): void {\r\n if (condition['value'][1] === 'equals') {\r\n condition['value'][2] = null;\r\n } else {\r\n condition['value'][2] = [];\r\n }\r\n }\r\n\r\n private _resetBooleanValue(condition: FilterBuilderCondition): void {\r\n condition['value'][2] = false;\r\n }\r\n\r\n private _capitalizeFirstLetter(value: string) {\r\n return value.charAt(0).toUpperCase() + value.slice(1);\r\n }\r\n\r\n private _normalizeValue(value: FilterBuilderItemType[]): FilterBuilderItemType[] {\r\n let result: FilterBuilderItemType[] = [];\r\n value.forEach(item => {\r\n if (this._isGroup(item)) {\r\n const groupValue = this._normalizeValue(item.value);\r\n\r\n if (groupValue.length > 0) {\r\n result = [...result, {\r\n logicalOperator: item.logicalOperator,\r\n value: groupValue\r\n }];\r\n }\r\n } else {\r\n if (this.isValueNotEmpty(item)) {\r\n result.push(item);\r\n }\r\n }\r\n });\r\n return result;\r\n }\r\n}\r\n","@if (_isServer) {\r\n <ng-content/>\r\n}\r\n\r\n<ng-template #itemsTpl let-items>\r\n <div class=\"group\">\r\n @for (item of items; track item; let index = $index) {\r\n @if (_isGroup(item)) {\r\n <div class=\"flex items-center group-operations\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button [matMenuTriggerFor]=\"nestedGroupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName(item) }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addGroupMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n <mat-menu #nestedGroupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['logicalOperator']\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #addGroupMenu>\r\n <button mat-menu-item (click)=\"addCondition(item)\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup(item)\">Add Group</button>\r\n </mat-menu>\r\n </div>\r\n @if (item['value'].length > 0) {\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: item['value'] }\"></ng-container>\r\n }\r\n } @else if (_isCondition(item)) {\r\n <div class=\"condition\">\r\n <div class=\"remove\" (click)=\"removeCondition(index, items)\">\r\n <mat-icon class=\"font-icon\">close</mat-icon>\r\n </div>\r\n <button class=\"condition-field\"\r\n [matMenuTriggerFor]=\"fieldsMenu\">{{ getConditionField(item['value'][0])?.name }}</button>\r\n <button class=\"condition-operation\"\r\n [matMenuTriggerFor]=\"operationsMenu\">\r\n <ng-template [ngTemplateOutlet]=\"getConditionOperation(item['value'][1])?.name\"></ng-template>\r\n </button>\r\n <div class=\"relative\">\r\n @if (editItem && editItem === item) {\r\n <div class=\"absolute start-0 top-0 -translate-y-1/2\">\r\n @switch (getFieldType(editItem)) {\r\n @case ('array') {\r\n @switch (editItem['value'][1]) {\r\n @case ('equals') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\"\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n\r\n @case ('isAnyOf') {\r\n <mat-form-field class=\"form-field\">\r\n <mat-select placeholder=\"Select...\" multiple\r\n emrAutoFocus\r\n (blur)=\"selectBlur($event)\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (closed)=\"selectClosed()\">\r\n @for (option of getOptions(editItem); track option.id) {\r\n <mat-option [value]=\"option.id\">{{ option.name }}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @case ('number') {\r\n @switch (editItem['value'][1]) {\r\n @case ('isBetween') {\r\n <div class=\"flex gap-2 items-center\"\r\n emrFocusElement (elementBlurred)=\"cancelEdit()\">\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n [(ngModel)]=\"item['value'][2][0]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n <div class=\"text-neutral-500\">&ndash;</div>\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput\r\n [(ngModel)]=\"item['value'][2][1]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n </div>\r\n }\r\n @default {\r\n <mat-form-field class=\"form-field-number\">\r\n <input type=\"number\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n }\r\n\r\n @default {\r\n <mat-form-field class=\"form-field\">\r\n <input type=\"text\" matInput emrAutoFocus\r\n (blur)=\"cancelEdit()\"\r\n [(ngModel)]=\"item['value'][2]\"\r\n (ngModelChange)=\"_emitChangeEvent()\">\r\n </mat-form-field>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n @if (item['value'][1] !== 'isBlank' && item['value'][1] !== 'isNotBlank') {\r\n @if (isValueNotEmpty(item)) {\r\n @if (getFieldType(item) === 'array') {\r\n @if (item['value'][1] === 'equals') {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n {{ getDataSourceItemNameById(item, item['value'][2]) }}\r\n </button>\r\n } @else {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n @for (dataSourceItemId of item['value'][2]; track dataSourceItemId; let last = $last) {\r\n <span>{{ getDataSourceItemNameById(item, dataSourceItemId) }}</span>\r\n @if (!last) {\r\n <span class=\"text-neutral-500\">|</span>\r\n }\r\n }\r\n </button>\r\n }\r\n } @else {\r\n @if (item['value'][1] === 'isBetween') {\r\n <button class=\"condition-value flex items-center gap-2\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2][0] }}</span>\r\n <span class=\"text-neutral-500\">&ndash;</span>\r\n <span>{{ item['value'][2][1] }}</span>\r\n </button>\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span>{{ item['value'][2] }}</span>\r\n </button>\r\n }\r\n }\r\n } @else {\r\n <button class=\"condition-value\" (click)=\"modifyValue(item)\">\r\n <span i18n>&lt;enter a value&gt;</span>\r\n </button>\r\n }\r\n }\r\n }\r\n </div>\r\n </div>\r\n <mat-menu #fieldsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"item['value'][0]\">\r\n @for (fieldDef of fieldDefs(); track fieldDef) {\r\n <mat-option [value]=\"fieldDef.dataField\"\r\n (click)=\"selectConditionField(item, fieldDef)\">{{ fieldDef.name }}</mat-option>\r\n }\r\n </div>\r\n </mat-menu>\r\n <mat-menu #operationsMenu>\r\n <div emrMenuOptionGroup [ngModel]=\"item['value'][1]\">\r\n @for (operation of _operationDefs; track operation.id()) {\r\n <div [hidden]=\"!isOperationAllowedForCondition(item['value'][0], operation.id())\">\r\n <mat-option [value]=\"operation.id()\" (click)=\"operationChanged(item, operation.id())\">\r\n <div class=\"flex items-center gap-3\">\r\n @if (operation.operationIcon()) {\r\n <ng-template [ngTemplateOutlet]=\"operationIconTemplateRef(operation)\"></ng-template>\r\n }\r\n <div>\r\n <ng-template [ngTemplateOutlet]=\"operationNameTemplateRef(operation)\"></ng-template>\r\n </div>\r\n </div>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </mat-menu>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"group\">\r\n <div class=\"flex items-center group-operations\">\r\n <button [matMenuTriggerFor]=\"groupOperationsMenu\" class=\"group-operation\">\r\n {{ getSelectedGroupOperationName() }}\r\n </button>\r\n <div [matMenuTriggerFor]=\"addMenu\" class=\"add\">\r\n <mat-icon class=\"font-icon\">add</mat-icon>\r\n </div>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"itemsTpl\" [ngTemplateOutletContext]=\"{ $implicit: _value }\"></ng-container>\r\n</div>\r\n\r\n<mat-menu #groupOperationsMenu>\r\n <div emrMenuOptionGroup [(ngModel)]=\"_logicalOperator\" (ngModelChange)=\"_emitChangeEvent()\">\r\n @for (groupOperation of groupOperations(); track groupOperation.id) {\r\n <mat-option [value]=\"groupOperation.id\">{{ groupOperation.name }}</mat-option>\r\n }\r\n </div>\r\n</mat-menu>\r\n<mat-menu #addMenu>\r\n <button mat-menu-item (click)=\"addCondition()\">Add Condition</button>\r\n <button mat-menu-item (click)=\"addGroup()\">Add Group</button>\r\n</mat-menu>\r\n\r\n<ng-container emrFilterBuilderOperationDef=\"contains\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Contains</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"doesNotContain\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Does not contain</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"startsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Starts with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"endsWith\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Ends with</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"equals\" [allowedDataTypes]=\"['string', 'number', 'array', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"notEquals\" [allowedDataTypes]=\"['string', 'number', 'boolean']\">\r\n <ng-template emrFilterBuilderOperationName>Not equals</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isLessThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is less then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThen\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isGreaterThenOrEqual\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is greater then or equal to</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isNotBlank\" [allowedDataTypes]=\"['string']\">\r\n <ng-template emrFilterBuilderOperationName>Is not blank</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isBetween\" [allowedDataTypes]=\"['number']\">\r\n <ng-template emrFilterBuilderOperationName>Is between</ng-template>\r\n</ng-container>\r\n<ng-container emrFilterBuilderOperationDef=\"isAnyOf\" [allowedDataTypes]=\"['array']\">\r\n <ng-template emrFilterBuilderOperationName>Is any of</ng-template>\r\n</ng-container>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}