@mediusinc/mng-commons 6.0.0-rc.4 → 6.0.0-rc.6

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 (386) hide show
  1. package/core/components/notification/notification-wrapper.component.d.ts +4 -4
  2. package/core/error/error.model.d.ts +4 -4
  3. package/core/helpers/notification.d.ts +2 -2
  4. package/core/provide.d.ts +3 -3
  5. package/core/styles/style-constants.d.ts +9 -8
  6. package/core/styles/style.model.d.ts +2 -1
  7. package/fesm2022/mediusinc-mng-commons-core.mjs +91 -104
  8. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  9. package/fesm2022/mediusinc-mng-commons-form-api.mjs +8 -9
  10. package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
  11. package/fesm2022/mediusinc-mng-commons-form.mjs +149 -49
  12. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  13. package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs +31 -0
  14. package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs.map +1 -0
  15. package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs +2118 -0
  16. package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs.map +1 -0
  17. package/fesm2022/mediusinc-mng-commons-table.mjs +1 -2154
  18. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  19. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +97 -49
  20. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  21. package/fesm2022/mediusinc-mng-commons-tableview.mjs +340 -309
  22. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  23. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
  24. package/form/api/index.d.ts +1 -0
  25. package/form/api/models/empty-value.model.d.ts +7 -0
  26. package/form/components/autocomplete/autocomplete.component.d.ts +1 -2
  27. package/form/components/date-range/date-range.component.d.ts +4 -3
  28. package/form/components/dropdown/dropdown.component.d.ts +3 -2
  29. package/form/components/number-range/number-range.component.d.ts +3 -2
  30. package/form/directives/input-empty-value.directive.d.ts +40 -0
  31. package/form/directives/input-trim.directive.d.ts +3 -5
  32. package/form/index.d.ts +1 -0
  33. package/i18n/en.json +57 -8
  34. package/i18n/sl.json +1 -3
  35. package/package.json +16 -42
  36. package/provide.d.ts +2 -2
  37. package/table/components/column-toggle/column-toggle.component.d.ts +12 -0
  38. package/table/components/filter/filter-form/filter-form.component.d.ts +2 -2
  39. package/table/components/table/table.component.d.ts +0 -1
  40. package/table/helpers/filters.d.ts +3 -2
  41. package/table/helpers/notification.d.ts +2 -2
  42. package/table/services/table-metadata.service.d.ts +3 -3
  43. package/tableview/action/components/action/action.component.d.ts +1 -0
  44. package/tableview/action/components/editor/action-editor.component.d.ts +1 -1
  45. package/tableview/action/components/table/action-table.component.d.ts +2 -1
  46. package/tableview/action/helpers/notification.d.ts +3 -3
  47. package/tableview/action/models/execution/action-context.model.d.ts +2 -2
  48. package/tableview/action/services/action-executor.service.d.ts +1 -1
  49. package/tableview/api/action/models/execution/action-context.model.d.ts +2 -2
  50. package/tableview/api/editor/descriptors/editor.descriptor.d.ts +5 -0
  51. package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +14 -10
  52. package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +10 -0
  53. package/tableview/api/editor/descriptors/field.descriptor.d.ts +36 -9
  54. package/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.d.ts +1 -1
  55. package/tableview/api/editor/models/field-action-context.model.d.ts +1 -1
  56. package/tableview/api/editor/models/field.model.d.ts +1 -2
  57. package/tableview/api/editor/models/form-editor.interface.d.ts +2 -2
  58. package/tableview/api/editor/models/formly-custom-field.model.d.ts +1 -1
  59. package/tableview/api/editor/models/formly-field.model.d.ts +2 -2
  60. package/tableview/editor/components/editor/form-editor.component.d.ts +2 -2
  61. package/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.d.ts +1 -1
  62. package/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.d.ts +2 -1
  63. package/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +4 -6
  64. package/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +0 -2
  65. package/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +2 -2
  66. package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +8 -15
  67. package/tableview/editor/components/formly/fields/formly-group-type.abstract.component.d.ts +7 -0
  68. package/tableview/editor/components/formly/fields/formly-type.abstract.component.d.ts +20 -0
  69. package/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +11 -4
  70. package/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +2 -1
  71. package/tableview/editor/helpers/formly-config.d.ts +1 -1
  72. package/tableview/editor/helpers/notification.d.ts +3 -3
  73. package/tableview/editor/models/formly-config.model.d.ts +10 -1
  74. package/tableview/editor/models/formly.model.d.ts +23 -0
  75. package/tableview/editor/services/form-editor.service.d.ts +2 -2
  76. package/tableview/tableview/router/tableview-route-builder.d.ts +10 -3
  77. package/tableview/tableview/services/tableview-feature-config.token.d.ts +1 -1
  78. package/version-info.json +3 -3
  79. package/esm2022/core/action/action-data.model.mjs +0 -2
  80. package/esm2022/core/action/action-parameters.model.mjs +0 -2
  81. package/esm2022/core/components/notification/notification-wrapper.component.mjs +0 -50
  82. package/esm2022/core/data-list/data-list-params-helpers.mjs +0 -465
  83. package/esm2022/core/data-list/data-list.model.mjs +0 -2
  84. package/esm2022/core/data-list/filter-match.model.mjs +0 -105
  85. package/esm2022/core/data-list/filter-metadata.model.mjs +0 -2
  86. package/esm2022/core/data-providers/base.data-provider.mjs +0 -16
  87. package/esm2022/core/data-providers/lookup.data-provider.mjs +0 -2
  88. package/esm2022/core/descriptors/action.descriptor.mjs +0 -2
  89. package/esm2022/core/descriptors/column.descriptor.mjs +0 -2
  90. package/esm2022/core/descriptors/editor.descriptor.mjs +0 -2
  91. package/esm2022/core/descriptors/enum.descriptor.mjs +0 -2
  92. package/esm2022/core/descriptors/filter.descriptor.mjs +0 -2
  93. package/esm2022/core/descriptors/lookup.descriptor.mjs +0 -2
  94. package/esm2022/core/descriptors/model.descriptor.mjs +0 -2
  95. package/esm2022/core/descriptors/table.descriptor.mjs +0 -2
  96. package/esm2022/core/descriptors/tableview.descriptor.mjs +0 -2
  97. package/esm2022/core/directives/component.directive.mjs +0 -75
  98. package/esm2022/core/directives/rerender.directive.mjs +0 -25
  99. package/esm2022/core/directives/template.directive.mjs +0 -29
  100. package/esm2022/core/enum/enum-helpers.mjs +0 -90
  101. package/esm2022/core/enum/enum.model.mjs +0 -2
  102. package/esm2022/core/error/error-handler.mjs +0 -20
  103. package/esm2022/core/error/error-helpers.mjs +0 -273
  104. package/esm2022/core/error/error.model.mjs +0 -33
  105. package/esm2022/core/helpers/coercion.mjs +0 -55
  106. package/esm2022/core/helpers/date.mjs +0 -119
  107. package/esm2022/core/helpers/notification.mjs +0 -21
  108. package/esm2022/core/helpers/number.mjs +0 -19
  109. package/esm2022/core/helpers/object.mjs +0 -152
  110. package/esm2022/core/helpers/route.mjs +0 -58
  111. package/esm2022/core/helpers/string.mjs +0 -57
  112. package/esm2022/core/helpers/templates.mjs +0 -4
  113. package/esm2022/core/helpers/type-helpers.mjs +0 -2
  114. package/esm2022/core/i18n/i18n-common.mjs +0 -24
  115. package/esm2022/core/i18n/i18n-error.mjs +0 -29
  116. package/esm2022/core/i18n/i18n-type.mjs +0 -46
  117. package/esm2022/core/index.mjs +0 -107
  118. package/esm2022/core/log/log-publisher-console.service.mjs +0 -40
  119. package/esm2022/core/log/log.model.mjs +0 -10
  120. package/esm2022/core/log/logger.service.mjs +0 -131
  121. package/esm2022/core/mediusinc-mng-commons-core.mjs +0 -5
  122. package/esm2022/core/models/class-attribute.model.mjs +0 -2
  123. package/esm2022/core/models/class-service.model.mjs +0 -2
  124. package/esm2022/core/models/getter.model.mjs +0 -2
  125. package/esm2022/core/models/i18n.model.mjs +0 -2
  126. package/esm2022/core/models/menu.model.mjs +0 -2
  127. package/esm2022/core/models/user.model.mjs +0 -2
  128. package/esm2022/core/models/version.model.mjs +0 -2
  129. package/esm2022/core/pipes/boolean.pipe.mjs +0 -34
  130. package/esm2022/core/pipes/class-map.pipe.mjs +0 -23
  131. package/esm2022/core/pipes/enum.pipe.mjs +0 -38
  132. package/esm2022/core/pipes/enumerate-async.pipe.mjs +0 -36
  133. package/esm2022/core/pipes/enumerate.pipe.mjs +0 -49
  134. package/esm2022/core/pipes/getter.pipe.mjs +0 -21
  135. package/esm2022/core/pipes/i18n-property.pipe.mjs +0 -19
  136. package/esm2022/core/pipes/json-path.pipe.mjs +0 -25
  137. package/esm2022/core/pipes/parametrize.pipe.mjs +0 -86
  138. package/esm2022/core/pipes/template.pipe.mjs +0 -25
  139. package/esm2022/core/provide.mjs +0 -79
  140. package/esm2022/core/reactivity/effect.mjs +0 -22
  141. package/esm2022/core/reflect/type-enum-decorator.mjs +0 -12
  142. package/esm2022/core/reflect/type-enum-metadata.mjs +0 -62
  143. package/esm2022/core/registry/registry.model.mjs +0 -2
  144. package/esm2022/core/registry/type-registry.mjs +0 -106
  145. package/esm2022/core/router/route-builder.mjs +0 -431
  146. package/esm2022/core/router/router.model.mjs +0 -2
  147. package/esm2022/core/router/routes-builder.mjs +0 -52
  148. package/esm2022/core/rxjs/map-data-list-result-operator.mjs +0 -22
  149. package/esm2022/core/security/permission-helpers.mjs +0 -14
  150. package/esm2022/core/security/permission.guard.mjs +0 -15
  151. package/esm2022/core/security/permission.service.mjs +0 -101
  152. package/esm2022/core/security/permissions.model.mjs +0 -93
  153. package/esm2022/core/services/commons-configuration.service.mjs +0 -189
  154. package/esm2022/core/services/commons-init.service.mjs +0 -111
  155. package/esm2022/core/services/commons-router.service.mjs +0 -181
  156. package/esm2022/core/services/commons-storage.service.mjs +0 -31
  157. package/esm2022/core/services/commons.service.mjs +0 -324
  158. package/esm2022/core/services/providers/commons-init.provider.mjs +0 -4
  159. package/esm2022/core/services/tokens/browser-storage.token.mjs +0 -3
  160. package/esm2022/core/services/tokens/commons-init.token.mjs +0 -3
  161. package/esm2022/core/services/tokens/log-publisher.token.mjs +0 -3
  162. package/esm2022/core/services/tokens/module-config.token.mjs +0 -3
  163. package/esm2022/core/styles/style-constants.mjs +0 -11
  164. package/esm2022/core/styles/style.model.mjs +0 -20
  165. package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +0 -31
  166. package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +0 -168
  167. package/esm2022/filter/descriptors/filter.descriptor.mjs +0 -421
  168. package/esm2022/filter/index.mjs +0 -8
  169. package/esm2022/filter/mediusinc-mng-commons-filter.mjs +0 -5
  170. package/esm2022/filter/models/filter-generic-property.model.mjs +0 -2
  171. package/esm2022/filter/models/filter.model.mjs +0 -20
  172. package/esm2022/form/api/data-providers/lookup-data-provider.factory.mjs +0 -15
  173. package/esm2022/form/api/data-providers/lookup.data-provider.mjs +0 -15
  174. package/esm2022/form/api/descriptors/action-button.descriptor.mjs +0 -56
  175. package/esm2022/form/api/descriptors/button-style.builder.mjs +0 -153
  176. package/esm2022/form/api/index.mjs +0 -10
  177. package/esm2022/form/api/mediusinc-mng-commons-form-api.mjs +0 -5
  178. package/esm2022/form/api/models/button.model.mjs +0 -2
  179. package/esm2022/form/api/models/trim.model.mjs +0 -2
  180. package/esm2022/form/components/autocomplete/autocomplete.component.mjs +0 -436
  181. package/esm2022/form/components/date-range/date-range.component.mjs +0 -147
  182. package/esm2022/form/components/dropdown/dropdown.component.mjs +0 -372
  183. package/esm2022/form/components/number-range/number-range.component.mjs +0 -123
  184. package/esm2022/form/directives/input-trim.directive.mjs +0 -50
  185. package/esm2022/form/index.mjs +0 -8
  186. package/esm2022/form/mediusinc-mng-commons-form.mjs +0 -5
  187. package/esm2022/index.mjs +0 -2
  188. package/esm2022/mediusinc-mng-commons.mjs +0 -5
  189. package/esm2022/model/class/data-providers/base-from-class-data-provider.factory.mjs +0 -5
  190. package/esm2022/model/class/descriptors/model-class.descriptor.mjs +0 -28
  191. package/esm2022/model/class/descriptors/type-class.descriptor.mjs +0 -6
  192. package/esm2022/model/class/helpers/model.mjs +0 -53
  193. package/esm2022/model/class/index.mjs +0 -8
  194. package/esm2022/model/class/mediusinc-mng-commons-model-class.mjs +0 -5
  195. package/esm2022/model/data-providers/base-from-type-data-provider.factory.mjs +0 -13
  196. package/esm2022/model/descriptors/enum.descriptor.mjs +0 -28
  197. package/esm2022/model/descriptors/model.descriptor.mjs +0 -53
  198. package/esm2022/model/descriptors/type.descriptor.mjs +0 -7
  199. package/esm2022/model/helpers/i18n.mjs +0 -47
  200. package/esm2022/model/index.mjs +0 -9
  201. package/esm2022/model/mediusinc-mng-commons-model.mjs +0 -5
  202. package/esm2022/provide.mjs +0 -6
  203. package/esm2022/table/api/class/class-table-attribute-converter.mjs +0 -80
  204. package/esm2022/table/api/class/class-table-attribute.model.mjs +0 -2
  205. package/esm2022/table/api/class/class-table-data-provider.factory.mjs +0 -5
  206. package/esm2022/table/api/class/class-table-descriptor-helpers.mjs +0 -99
  207. package/esm2022/table/api/class/class-table-descriptor.factory.mjs +0 -21
  208. package/esm2022/table/api/class/index.mjs +0 -6
  209. package/esm2022/table/api/class/mediusinc-mng-commons-table-api-class.mjs +0 -5
  210. package/esm2022/table/api/data-providers/table-data-provider.factory.mjs +0 -15
  211. package/esm2022/table/api/data-providers/table.data-provider.mjs +0 -33
  212. package/esm2022/table/api/descriptors/column.descriptor.mjs +0 -475
  213. package/esm2022/table/api/descriptors/sort.descriptor.mjs +0 -67
  214. package/esm2022/table/api/descriptors/table-descriptor.factory.mjs +0 -22
  215. package/esm2022/table/api/descriptors/table.descriptor.mjs +0 -1116
  216. package/esm2022/table/api/helpers/column-converter.mjs +0 -25
  217. package/esm2022/table/api/helpers/table-data-provider-descriptor-convert.mjs +0 -7
  218. package/esm2022/table/api/index.mjs +0 -19
  219. package/esm2022/table/api/mediusinc-mng-commons-table-api.mjs +0 -5
  220. package/esm2022/table/api/models/column-value.model.mjs +0 -2
  221. package/esm2022/table/api/models/column.model.mjs +0 -21
  222. package/esm2022/table/api/models/row-expandable-component.model.mjs +0 -2
  223. package/esm2022/table/api/models/table-columns.model.mjs +0 -2
  224. package/esm2022/table/api/models/table-event.model.mjs +0 -2
  225. package/esm2022/table/api/models/table.model.mjs +0 -21
  226. package/esm2022/table/components/column-filter/column-filter.component.mjs +0 -389
  227. package/esm2022/table/components/column-value/column-value.component.mjs +0 -78
  228. package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +0 -55
  229. package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +0 -226
  230. package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +0 -219
  231. package/esm2022/table/components/table/table.component.mjs +0 -319
  232. package/esm2022/table/helpers/filters.mjs +0 -312
  233. package/esm2022/table/helpers/notification.mjs +0 -21
  234. package/esm2022/table/helpers/table-layout-prefs.mjs +0 -10
  235. package/esm2022/table/helpers/table.mjs +0 -24
  236. package/esm2022/table/index.mjs +0 -24
  237. package/esm2022/table/mediusinc-mng-commons-table.mjs +0 -5
  238. package/esm2022/table/models/column-preferences.model.mjs +0 -2
  239. package/esm2022/table/models/filter.model.mjs +0 -2
  240. package/esm2022/table/pipes/filter-value.pipe.mjs +0 -77
  241. package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +0 -27
  242. package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +0 -25
  243. package/esm2022/table/provide.mjs +0 -19
  244. package/esm2022/table/services/table-data.service.mjs +0 -194
  245. package/esm2022/table/services/table-feature-config.token.mjs +0 -3
  246. package/esm2022/table/services/table-metadata.service.mjs +0 -136
  247. package/esm2022/table/services/table-preferences.service.mjs +0 -142
  248. package/esm2022/tableview/action/components/action/action.component.mjs +0 -277
  249. package/esm2022/tableview/action/components/editor/action-editor.component.mjs +0 -86
  250. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +0 -428
  251. package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +0 -35
  252. package/esm2022/tableview/action/components/route/action-route.component.mjs +0 -146
  253. package/esm2022/tableview/action/components/table/action-table.component.mjs +0 -102
  254. package/esm2022/tableview/action/guards/unsaved-changes.guard.mjs +0 -4
  255. package/esm2022/tableview/action/helpers/action-execution.mjs +0 -25
  256. package/esm2022/tableview/action/helpers/i18n.mjs +0 -102
  257. package/esm2022/tableview/action/helpers/notification.mjs +0 -78
  258. package/esm2022/tableview/action/helpers/styles.mjs +0 -32
  259. package/esm2022/tableview/action/models/action-editor-dialog-data.model.mjs +0 -2
  260. package/esm2022/tableview/action/models/can-component-deactivate.model.mjs +0 -2
  261. package/esm2022/tableview/action/models/execution/action-context.model.mjs +0 -64
  262. package/esm2022/tableview/action/models/execution/action-instance.model.mjs +0 -169
  263. package/esm2022/tableview/action/services/action-error-mapper.service.mjs +0 -20
  264. package/esm2022/tableview/action/services/action-executor.service.mjs +0 -777
  265. package/esm2022/tableview/action/services/component-action-executor.service.mjs +0 -19
  266. package/esm2022/tableview/action/services/data-provider-executor.service.mjs +0 -41
  267. package/esm2022/tableview/action/services/navigation.service.mjs +0 -53
  268. package/esm2022/tableview/action/services/providers/provide-action-executor.mjs +0 -9
  269. package/esm2022/tableview/action/services/providers/provide-view-container.mjs +0 -17
  270. package/esm2022/tableview/action/services/root-action-executor.service.mjs +0 -18
  271. package/esm2022/tableview/action/services/tokens/action-editor.token.mjs +0 -3
  272. package/esm2022/tableview/action/services/view-container.service.mjs +0 -40
  273. package/esm2022/tableview/api/action/descriptors/action-descriptor.factory.mjs +0 -28
  274. package/esm2022/tableview/api/action/descriptors/action-editor-descriptor.factory.mjs +0 -30
  275. package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +0 -223
  276. package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +0 -32
  277. package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +0 -74
  278. package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +0 -302
  279. package/esm2022/tableview/api/action/descriptors/editor-action-descriptor.factory.mjs +0 -21
  280. package/esm2022/tableview/api/action/descriptors/editor-action-editor-descriptor.factory.mjs +0 -21
  281. package/esm2022/tableview/api/action/descriptors/table-action-descriptor.factory.mjs +0 -37
  282. package/esm2022/tableview/api/action/descriptors/table-action-editor-descriptor.factory.mjs +0 -40
  283. package/esm2022/tableview/api/action/helpers/data-provider-executors.mjs +0 -100
  284. package/esm2022/tableview/api/action/models/action-component.model.mjs +0 -2
  285. package/esm2022/tableview/api/action/models/action-confirmation.model.mjs +0 -2
  286. package/esm2022/tableview/api/action/models/action-descriptor.types.mjs +0 -2
  287. package/esm2022/tableview/api/action/models/action-editor.model.mjs +0 -2
  288. package/esm2022/tableview/api/action/models/action-error.model.mjs +0 -14
  289. package/esm2022/tableview/api/action/models/action.type.mjs +0 -26
  290. package/esm2022/tableview/api/action/models/execution/action-context-validation.model.mjs +0 -2
  291. package/esm2022/tableview/api/action/models/execution/action-context.model.mjs +0 -2
  292. package/esm2022/tableview/api/action/models/execution/action-execution-error.model.mjs +0 -2
  293. package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +0 -32
  294. package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +0 -2
  295. package/esm2022/tableview/api/action/models/execution/view-container.model.mjs +0 -2
  296. package/esm2022/tableview/api/action/models/tableview-action-default-categories.model.mjs +0 -11
  297. package/esm2022/tableview/api/action/services/data-provider-executor.service.mjs +0 -28
  298. package/esm2022/tableview/api/action/services/tokens/data-language-dropdown.token.mjs +0 -3
  299. package/esm2022/tableview/api/class/editor/class-editor-attribute-converter.mjs +0 -85
  300. package/esm2022/tableview/api/class/editor/class-editor-attribute.model.mjs +0 -2
  301. package/esm2022/tableview/api/class/editor/class-editor-data-provider.factory.mjs +0 -5
  302. package/esm2022/tableview/api/class/editor/class-editor-descriptor-helpers.mjs +0 -95
  303. package/esm2022/tableview/api/class/editor/class-editor-descriptor.factory.mjs +0 -21
  304. package/esm2022/tableview/api/class/index.mjs +0 -13
  305. package/esm2022/tableview/api/class/mediusinc-mng-commons-tableview-api-class.mjs +0 -5
  306. package/esm2022/tableview/api/class/tableview/class-tableview-attribute-converter.mjs +0 -35
  307. package/esm2022/tableview/api/class/tableview/class-tableview-attribute.model.mjs +0 -2
  308. package/esm2022/tableview/api/class/tableview/class-tableview-data-provider.factory.mjs +0 -5
  309. package/esm2022/tableview/api/class/tableview/class-tableview-descriptor-helpers.mjs +0 -111
  310. package/esm2022/tableview/api/class/tableview/class-tableview-descriptor.factory.mjs +0 -26
  311. package/esm2022/tableview/api/editor/data-providers/editor-data-provider.factory.mjs +0 -15
  312. package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +0 -114
  313. package/esm2022/tableview/api/editor/descriptors/editor-descriptor.factory.mjs +0 -15
  314. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +0 -437
  315. package/esm2022/tableview/api/editor/descriptors/field-action.descriptor.mjs +0 -51
  316. package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +0 -314
  317. package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +0 -103
  318. package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +0 -211
  319. package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +0 -142
  320. package/esm2022/tableview/api/editor/descriptors/field-validation.descriptor.mjs +0 -25
  321. package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +0 -402
  322. package/esm2022/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.mjs +0 -51
  323. package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +0 -2
  324. package/esm2022/tableview/api/editor/models/editor.model.mjs +0 -9
  325. package/esm2022/tableview/api/editor/models/field-action-context.model.mjs +0 -2
  326. package/esm2022/tableview/api/editor/models/field-image-preview.model.mjs +0 -2
  327. package/esm2022/tableview/api/editor/models/field-validation.model.mjs +0 -2
  328. package/esm2022/tableview/api/editor/models/field.model.mjs +0 -57
  329. package/esm2022/tableview/api/editor/models/form-editor.event.mjs +0 -28
  330. package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +0 -2
  331. package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +0 -70
  332. package/esm2022/tableview/api/editor/models/formly-field.model.mjs +0 -2
  333. package/esm2022/tableview/api/editor/models/formly-options.model.mjs +0 -2
  334. package/esm2022/tableview/api/editor/models/radio.model.mjs +0 -2
  335. package/esm2022/tableview/api/index.mjs +0 -76
  336. package/esm2022/tableview/api/mediusinc-mng-commons-tableview-api.mjs +0 -5
  337. package/esm2022/tableview/api/tableview/data-providers/tableview-data-provider.factory.mjs +0 -18
  338. package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +0 -84
  339. package/esm2022/tableview/api/tableview/descriptors/tableview-descriptor.factory.mjs +0 -34
  340. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +0 -377
  341. package/esm2022/tableview/api/tableview/helpers/files-export.mjs +0 -34
  342. package/esm2022/tableview/api/tableview/helpers/tableview-create.mjs +0 -26
  343. package/esm2022/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.mjs +0 -7
  344. package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +0 -324
  345. package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +0 -319
  346. package/esm2022/tableview/api/tableview/models/tableview-descriptor-fields-manage-helper.type.mjs +0 -2
  347. package/esm2022/tableview/api/tableview/models/tableview-descriptor-helper.type.mjs +0 -2
  348. package/esm2022/tableview/api/tableview/models/tableview-input.model.mjs +0 -2
  349. package/esm2022/tableview/api/tableview/models/tableview-route.model.mjs +0 -2
  350. package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +0 -82
  351. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +0 -480
  352. package/esm2022/tableview/editor/components/formly/constants.mjs +0 -2
  353. package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +0 -66
  354. package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +0 -47
  355. package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +0 -39
  356. package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +0 -165
  357. package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +0 -42
  358. package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +0 -34
  359. package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +0 -211
  360. package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +0 -23
  361. package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +0 -195
  362. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +0 -239
  363. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +0 -205
  364. package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -28
  365. package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +0 -46
  366. package/esm2022/tableview/editor/components/formly/pipes/formly-field-label.pipe.mjs +0 -19
  367. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +0 -33
  368. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +0 -59
  369. package/esm2022/tableview/editor/helpers/editor-autosave.mjs +0 -49
  370. package/esm2022/tableview/editor/helpers/editor-field.mjs +0 -39
  371. package/esm2022/tableview/editor/helpers/editor-formly.mjs +0 -388
  372. package/esm2022/tableview/editor/helpers/editor-validators.mjs +0 -25
  373. package/esm2022/tableview/editor/helpers/field-create.mjs +0 -21
  374. package/esm2022/tableview/editor/helpers/formly-config.mjs +0 -260
  375. package/esm2022/tableview/editor/helpers/notification.mjs +0 -11
  376. package/esm2022/tableview/editor/models/editor-auto-save-preview.model.mjs +0 -2
  377. package/esm2022/tableview/editor/models/formly-config.model.mjs +0 -2
  378. package/esm2022/tableview/editor/services/form-editor.service.mjs +0 -96
  379. package/esm2022/tableview/editor/services/formly-config.provider.mjs +0 -31
  380. package/esm2022/tableview/index.mjs +0 -67
  381. package/esm2022/tableview/mediusinc-mng-commons-tableview.mjs +0 -5
  382. package/esm2022/tableview/provide.mjs +0 -105
  383. package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +0 -15
  384. package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +0 -59
  385. package/esm2022/tableview/tableview/router/tableview-route-builder.mjs +0 -175
  386. package/esm2022/tableview/tableview/services/tableview-feature-config.token.mjs +0 -3
@@ -0,0 +1,2118 @@
1
+ import { trigger, transition, style, animate } from '@angular/animations';
2
+ import { NgTemplateOutlet, DecimalPipe, CurrencyPipe, DatePipe, AsyncPipe, NgClass, NgStyle } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { InjectionToken, inject, Injector, signal, computed, Injectable, ElementRef, Renderer2, ChangeDetectorRef, DestroyRef, input, viewChild, untracked, Component, ViewEncapsulation, ChangeDetectionStrategy, LOCALE_ID, Pipe, output, booleanAttribute, contentChildren, viewChildren, afterNextRender } from '@angular/core';
5
+ import { toSignal, toObservable, takeUntilDestroyed, outputFromObservable } from '@angular/core/rxjs-interop';
6
+ import * as i1$1 from '@angular/forms';
7
+ import { FormsModule } from '@angular/forms';
8
+ import * as i1 from '@ngx-translate/core';
9
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
10
+ import { OverlayService, TranslationKeys, MessageService } from 'primeng/api';
11
+ import { ButtonDirective, ButtonIcon, Button } from 'primeng/button';
12
+ import { Checkbox } from 'primeng/checkbox';
13
+ import { DatePicker } from 'primeng/datepicker';
14
+ import { DomHandler, ConnectedOverlayScrollHandler } from 'primeng/dom';
15
+ import { FilterIcon } from 'primeng/icons/filter';
16
+ import { InputNumber } from 'primeng/inputnumber';
17
+ import { InputText } from 'primeng/inputtext';
18
+ import * as i2 from 'primeng/table';
19
+ import { Table, TableModule } from 'primeng/table';
20
+ import { ZIndexUtils } from 'primeng/utils';
21
+ import { combineLatest, switchMap, of, Subject, debounceTime, distinctUntilChanged, ReplaySubject, NEVER, BehaviorSubject, skip, filter } from 'rxjs';
22
+ import { FilterMatchMode, dateToIsoString, angularDateFormatHasTime, fromAngularDateFormatToPrime, angularDateFormatHasSeconds, fromAngularNumberFormatToFractions, COMMONS_MODULE_CONFIG_IT, effectWithDeps, toObservable as toObservable$1, CommonsService, RerenderDirective, GetterPipe, TemplatePipe, JsonPathPipe, BooleanPipe, EnumPipe, ComponentDirective, getI18nTypePropertyKey, TemplateDirective, findTemplateByName, getI18nForError, getI18nErrorParams, toastMessage, CommonsStorageService, LoggerService, booleanOrUndefinedAttribute, mergeDataListParamsWithDefaults, fromTableLoadToDataListParams, dataListParamsToUrlQuery, fromSubscribeError, getErrorLogLevel, fromUrlQueryToDataListParams, I18nPropertyPipe, ClassMapPipe, CommonsFeatureTypeEnum } from '@mediusinc/mng-commons/core';
23
+ import { FilterTypeEnum, FilterDescriptor, FilterDisplayTypeEnum, FilterLookupTypeEnum, FilterLookupDescriptor } from '@mediusinc/mng-commons/filter';
24
+ import { DateRangeComponent, AutocompleteComponent, DropdownComponent, InputTrimDirective, NumberRangeComponent } from '@mediusinc/mng-commons/form';
25
+ import { tableDescriptor, TableDynamicDescriptorInst, TablePaginationModeEnum, ColumnDisplayTypeEnum, TableSizeEnum } from '@mediusinc/mng-commons/table/api';
26
+ import { PrimeNG } from 'primeng/config';
27
+ import { Tooltip } from 'primeng/tooltip';
28
+ import { Tag, TagModule } from 'primeng/tag';
29
+ import { Message } from 'primeng/message';
30
+ import { ToggleButton } from 'primeng/togglebutton';
31
+ import { lookupDataProvider } from '@mediusinc/mng-commons/form/api';
32
+ import { IconField } from 'primeng/iconfield';
33
+ import { InputIcon } from 'primeng/inputicon';
34
+ import { Popover } from 'primeng/popover';
35
+ import { Router, ActivatedRoute, NavigationStart, NavigationEnd, NavigationCancel, NavigationError } from '@angular/router';
36
+ import { Skeleton } from 'primeng/skeleton';
37
+ import { getI18nForModel } from '@mediusinc/mng-commons/model';
38
+
39
+ function filterGenerateMatchModeOptions(primeConfig, descriptor, cmpSerCfg) {
40
+ let options = undefined;
41
+ if (descriptor == null || descriptor.filterType === FilterTypeEnum.String) {
42
+ options = [
43
+ { value: FilterMatchMode.Contains, label: primeConfig.getTranslation(FilterMatchMode.Contains) },
44
+ { value: FilterMatchMode.NotContains, label: primeConfig.getTranslation(FilterMatchMode.NotContains) },
45
+ { value: FilterMatchMode.Equals, label: primeConfig.getTranslation(FilterMatchMode.Equals) },
46
+ { value: FilterMatchMode.NotEquals, label: primeConfig.getTranslation(FilterMatchMode.NotEquals) },
47
+ { value: FilterMatchMode.StartsWith, label: primeConfig.getTranslation(FilterMatchMode.StartsWith) },
48
+ { value: FilterMatchMode.EndsWith, label: primeConfig.getTranslation(FilterMatchMode.EndsWith) }
49
+ ];
50
+ }
51
+ else if (descriptor.filterType === FilterTypeEnum.Boolean) {
52
+ options = [{ value: FilterMatchMode.Equals, label: primeConfig.getTranslation(FilterMatchMode.Equals) }];
53
+ }
54
+ else if (descriptor.filterType === FilterTypeEnum.Number) {
55
+ options = [
56
+ { value: FilterMatchMode.Equals, label: primeConfig.getTranslation(FilterMatchMode.Equals) },
57
+ { value: FilterMatchMode.NotEquals, label: primeConfig.getTranslation(FilterMatchMode.NotEquals) },
58
+ { value: FilterMatchMode.LessThan, label: primeConfig.getTranslation(FilterMatchMode.LessThan) },
59
+ { value: FilterMatchMode.LessThanOrEqualTo, label: primeConfig.getTranslation(FilterMatchMode.LessThanOrEqualTo) },
60
+ { value: FilterMatchMode.GreaterThan, label: primeConfig.getTranslation(FilterMatchMode.GreaterThan) },
61
+ { value: FilterMatchMode.GreaterThanOrEqualTo, label: primeConfig.getTranslation(FilterMatchMode.GreaterThanOrEqualTo) },
62
+ { value: FilterMatchMode.Between, label: primeConfig.getTranslation(FilterMatchMode.Between) }
63
+ ];
64
+ }
65
+ else if (descriptor.filterType === FilterTypeEnum.Lookup || descriptor.filterType === FilterTypeEnum.LookupEnum) {
66
+ options = [
67
+ { value: FilterMatchMode.Equals, label: primeConfig.getTranslation(FilterMatchMode.Equals) },
68
+ { value: FilterMatchMode.NotEquals, label: primeConfig.getTranslation(FilterMatchMode.NotEquals) },
69
+ { value: FilterMatchMode.In, label: primeConfig.getTranslation(FilterMatchMode.In) },
70
+ { value: FilterMatchMode.NotIn, label: primeConfig.getTranslation(FilterMatchMode.NotIn) }
71
+ ];
72
+ }
73
+ else if (descriptor.filterType === FilterTypeEnum.Date) {
74
+ if (!descriptor.datePickerShowTime && !descriptor.dateValueNoTime && !cmpSerCfg?.filtersDateOnlyDisabled) {
75
+ options = [
76
+ { value: FilterMatchMode.Equals, label: primeConfig.getTranslation(FilterMatchMode.Equals) },
77
+ { value: FilterMatchMode.NotEquals, label: primeConfig.getTranslation(FilterMatchMode.NotEquals) },
78
+ { value: FilterMatchMode.LessThanOrEqualTo, label: primeConfig.getTranslation(FilterMatchMode.LessThanOrEqualTo) },
79
+ { value: FilterMatchMode.GreaterThanOrEqualTo, label: primeConfig.getTranslation(FilterMatchMode.GreaterThanOrEqualTo) },
80
+ { value: FilterMatchMode.Between, label: primeConfig.getTranslation(FilterMatchMode.Between) }
81
+ ];
82
+ }
83
+ else {
84
+ options = [
85
+ { value: FilterMatchMode.Equals, label: primeConfig.getTranslation(FilterMatchMode.Equals) },
86
+ { value: FilterMatchMode.LessThanOrEqualTo, label: primeConfig.getTranslation(FilterMatchMode.LessThanOrEqualTo) },
87
+ { value: FilterMatchMode.GreaterThanOrEqualTo, label: primeConfig.getTranslation(FilterMatchMode.GreaterThanOrEqualTo) },
88
+ { value: FilterMatchMode.Between, label: primeConfig.getTranslation(FilterMatchMode.Between) }
89
+ ];
90
+ }
91
+ }
92
+ options?.push({ value: FilterMatchMode.Exists, label: primeConfig.getTranslation(FilterMatchMode.Exists) }, { value: FilterMatchMode.DoesNotExist, label: primeConfig.getTranslation(FilterMatchMode.DoesNotExist) });
93
+ if (descriptor?.matchModes) {
94
+ options = descriptor.matchModes.map(mm => ({ value: mm, label: primeConfig.getTranslation(mm) }));
95
+ }
96
+ return options || [];
97
+ }
98
+ /**
99
+ * Gets the default match mode for a filter.
100
+ *
101
+ * @param {FilterDescriptor<any, any>} [descriptor] - The filter descriptor.
102
+ * @param {SelectItem[]} [matchModes=[]] - The available match modes options.
103
+ *
104
+ * @return {FilterMatchModeExtendedType} The default match mode for the filter.
105
+ */
106
+ function filterGetDefaultMatchMode(descriptor, matchModes = []) {
107
+ let defaultMatchMode = FilterMatchMode.Equals;
108
+ if (descriptor?.filterType === FilterTypeEnum.String)
109
+ defaultMatchMode = FilterMatchMode.StartsWith;
110
+ // overwrite type default set in descriptor
111
+ if (descriptor?.defaultMatchMode) {
112
+ defaultMatchMode = descriptor.defaultMatchMode;
113
+ }
114
+ // check if default mode exists!
115
+ if (matchModes.length > 0 && !matchModes.some(m => m.value === defaultMatchMode)) {
116
+ defaultMatchMode = matchModes[0].value;
117
+ }
118
+ return defaultMatchMode;
119
+ }
120
+ function filterSetMetadataOnChange(filter, matchMode, value, filterType, filterDateCfg) {
121
+ let displayValue = filter?.displayValue ?? value;
122
+ let displayMatchMode = filter?.displayMatchMode ?? matchMode;
123
+ // when equals is used on dates with time, the actual filter will be between, but displayed as equals
124
+ if (filterType === FilterTypeEnum.Date && !filterDateCfg?.valueNoTime) {
125
+ if (matchMode === FilterMatchMode.Between &&
126
+ Array.isArray(value) &&
127
+ value.length === 2 &&
128
+ value.every(v => v instanceof Date || typeof v === 'string' || typeof v === 'number')) {
129
+ if (filterAreDatesEqual(value[0], value[1], filterDateCfg)) {
130
+ displayMatchMode = FilterMatchMode.Equals;
131
+ displayValue = new Date(value[0]);
132
+ }
133
+ }
134
+ else if (matchMode === FilterMatchMode.Equals && !value) {
135
+ matchMode = FilterMatchMode.Between;
136
+ }
137
+ }
138
+ if (filterType === FilterTypeEnum.Date && displayValue) {
139
+ // display value for calendar cannot be string, convert to date
140
+ displayValue = Array.isArray(displayValue)
141
+ ? displayValue.map(v => (!(v instanceof Date) ? new Date(v) : v))
142
+ : displayValue instanceof Date
143
+ ? displayValue
144
+ : new Date(displayValue);
145
+ }
146
+ if (filterType === FilterTypeEnum.Boolean && displayValue != null && typeof displayValue !== 'boolean') {
147
+ displayValue = (typeof displayValue === 'string' && displayValue.toLowerCase() === 'true') || displayValue === 1;
148
+ }
149
+ if (filterType === FilterTypeEnum.Number && displayValue != null && typeof displayValue !== 'number') {
150
+ const numValue = +displayValue;
151
+ if (!isNaN(numValue)) {
152
+ displayValue = numValue;
153
+ }
154
+ }
155
+ return {
156
+ ...filter,
157
+ matchMode,
158
+ value: value,
159
+ displayMatchMode,
160
+ displayValue
161
+ };
162
+ }
163
+ function filterSetMetadataOnDisplayChange(filter, displayMatchMode, displayValue, filterType, filterDateCfg) {
164
+ let matchMode = displayMatchMode;
165
+ let value = displayValue;
166
+ if (filterType === FilterTypeEnum.Date) {
167
+ if (!filterDateCfg?.valueNoTime && displayValue !== null) {
168
+ if (displayMatchMode === FilterMatchMode.Equals) {
169
+ if (value instanceof Date || typeof value === 'string' || typeof value === 'number') {
170
+ const fromDate = new Date(value);
171
+ const toDate = new Date(value);
172
+ if (filterDateCfg?.showTime) {
173
+ if (filterDateCfg?.showSeconds) {
174
+ fromDate.setMilliseconds(0);
175
+ toDate.setMilliseconds(999);
176
+ }
177
+ else {
178
+ fromDate.setSeconds(0, 0);
179
+ toDate.setSeconds(59, 999);
180
+ }
181
+ }
182
+ else {
183
+ fromDate.setHours(0, 0, 0, 0);
184
+ toDate.setHours(23, 59, 59, 999);
185
+ }
186
+ value = [fromDate, toDate];
187
+ matchMode = FilterMatchMode.Between;
188
+ }
189
+ else {
190
+ value = null;
191
+ }
192
+ }
193
+ else if (displayMatchMode === FilterMatchMode.Between) {
194
+ if (Array.isArray(value) && value.length === 2 && value.every(i => i instanceof Date || typeof i === 'string' || typeof i === 'number')) {
195
+ const fromDate = new Date(value[0]);
196
+ let toDate = new Date(value[1]);
197
+ if (filterAreDatesEqual(fromDate, toDate, filterDateCfg)) {
198
+ toDate = new Date(fromDate);
199
+ if (filterDateCfg?.showTime) {
200
+ if (filterDateCfg?.showSeconds) {
201
+ toDate.setSeconds(toDate.getSeconds() + 1);
202
+ }
203
+ else {
204
+ toDate.setMinutes(toDate.getMinutes() + 1);
205
+ }
206
+ }
207
+ else {
208
+ toDate.setDate(toDate.getDate() + 1);
209
+ }
210
+ value = [fromDate, toDate];
211
+ matchMode = FilterMatchMode.Between;
212
+ }
213
+ }
214
+ else {
215
+ value = null;
216
+ }
217
+ }
218
+ }
219
+ const convertDateType = filterDateCfg?.valueNoTime ? 'date' : 'date-time';
220
+ const convertDateTimeOpts = {
221
+ utc: filterDateCfg?.valueUtc,
222
+ noMillis: filterDateCfg?.valueNoMillis,
223
+ noTimezone: filterDateCfg?.valueNoTimezone
224
+ };
225
+ value =
226
+ value == null
227
+ ? value
228
+ : Array.isArray(value)
229
+ ? value.filter(i => i != null).map(i => dateToIsoString(i, convertDateType, convertDateTimeOpts))
230
+ : dateToIsoString(value, convertDateType, convertDateTimeOpts);
231
+ }
232
+ if (matchMode === FilterMatchMode.Exists || matchMode === FilterMatchMode.DoesNotExist) {
233
+ value = null;
234
+ }
235
+ return {
236
+ ...filter,
237
+ displayMatchMode: displayMatchMode,
238
+ matchMode: matchMode,
239
+ displayValue: displayValue,
240
+ value: value,
241
+ caseSensitive: filterType === FilterTypeEnum.String ? filter?.caseSensitive : undefined
242
+ };
243
+ }
244
+ function filterAreDatesEqual(fromDate, toDate, filterDateCfg) {
245
+ const startDate = dateToIsoString(fromDate);
246
+ const endDate = dateToIsoString(toDate);
247
+ // 2020-11-02T11:12:12.000
248
+ const cmpLength = filterDateCfg?.showTime ? (filterDateCfg?.showSeconds ? 19 : 16) : 10;
249
+ return startDate.substring(0, cmpLength) === endDate.substring(0, cmpLength);
250
+ }
251
+ function filterApplySerializationConfigToCmp(config, cmpSerCfg) {
252
+ // set default
253
+ cmpSerCfg.dateTimeInUtc = false;
254
+ cmpSerCfg.dateTimeWithTimezone = true;
255
+ cmpSerCfg.dateTimeWithMillis = true;
256
+ cmpSerCfg.filtersDateOnlyDisabled = false;
257
+ // set customizations
258
+ if (config?.serialization) {
259
+ if (config.serialization.dateTimeInUtc !== undefined)
260
+ cmpSerCfg.dateTimeInUtc = config.serialization.dateTimeInUtc;
261
+ if (config.serialization.dateTimeWithTimezone !== undefined)
262
+ cmpSerCfg.dateTimeWithTimezone = config.serialization.dateTimeWithTimezone;
263
+ if (config.serialization.dateTimeWithMillis !== undefined)
264
+ cmpSerCfg.dateTimeWithMillis = config.serialization.dateTimeWithMillis;
265
+ if (config.serialization.filtersDateOnlyDisabled !== undefined)
266
+ cmpSerCfg.filtersDateOnlyDisabled = config.serialization.filtersDateOnlyDisabled;
267
+ }
268
+ }
269
+ function filterAdjustDisplayValueOnMatchModeChange(matchMode, value) {
270
+ if (matchMode == null || matchMode === FilterMatchMode.Exists || matchMode === FilterMatchMode.DoesNotExist) {
271
+ return value; // never change, only change later if something else changes here
272
+ }
273
+ if (matchMode === FilterMatchMode.Between) {
274
+ if (!Array.isArray(value)) {
275
+ return value != null ? [value, value] : [];
276
+ }
277
+ else if (value.length === 0 || value.length === 2) {
278
+ return value;
279
+ }
280
+ else if (value.length === 1) {
281
+ return [value[0], value[0]];
282
+ }
283
+ else {
284
+ return [value[0], value[1]];
285
+ }
286
+ }
287
+ if (matchMode === FilterMatchMode.In || matchMode === FilterMatchMode.NotIn) {
288
+ return Array.isArray(value) ? value : value == null ? [] : [value];
289
+ }
290
+ return Array.isArray(value) && value.length > 0 ? value[0] : value;
291
+ }
292
+ function filterGetDateConfig(descriptor, serCfg) {
293
+ if (!descriptor || descriptor.filterType !== FilterTypeEnum.Date) {
294
+ return undefined;
295
+ }
296
+ const showTime = descriptor.datePickerShowTime ?? (descriptor.displayFormatApplyToField && descriptor.displayFormat ? angularDateFormatHasTime(descriptor.displayFormat) : false);
297
+ return {
298
+ valueNoTime: descriptor.dateValueNoTime || (!serCfg?.filtersDateOnlyDisabled && !showTime),
299
+ valueUtc: descriptor.dateValueUtc ?? serCfg?.dateTimeInUtc,
300
+ valueNoTimezone: descriptor.dateValueNoTimezone ?? !serCfg?.dateTimeWithTimezone,
301
+ valueNoMillis: !serCfg?.dateTimeWithMillis,
302
+ format: descriptor.datePickerFormat ?? (descriptor.displayFormatApplyToField && descriptor.displayFormat ? fromAngularDateFormatToPrime(descriptor.displayFormat) : undefined),
303
+ showTime: showTime,
304
+ showSeconds: showTime &&
305
+ (descriptor.datePickerShowSeconds ?? (descriptor.displayFormatApplyToField && descriptor.displayFormat ? angularDateFormatHasSeconds(descriptor.displayFormat) : false))
306
+ };
307
+ }
308
+ function filterGetNumberConfig(descriptor) {
309
+ if (!descriptor || descriptor.filterType !== FilterTypeEnum.Number) {
310
+ return undefined;
311
+ }
312
+ const displayCfg = descriptor.displayFormatApplyToField && descriptor.displayFormat ? fromAngularNumberFormatToFractions(descriptor.displayFormat) : undefined;
313
+ return {
314
+ fractionsMin: descriptor.numberMinFractionDigits ?? displayCfg?.fractionsMin,
315
+ fractionsMax: descriptor.numberMaxFractionDigits ?? displayCfg?.fractionsMax
316
+ };
317
+ }
318
+ /**
319
+ * Creates an array of filter descriptors from an array of generic filter properties.
320
+ *
321
+ * @param {FilterGenericProperty[]} properties - The array of filterable properties, their types and options.
322
+ * @param {LookupDataProviderInst<string, any, any, 'field'>} [valueLookup] - The lookup data provider for value suggestions.
323
+ */
324
+ function createFilterDescriptorsFromGeneric(properties, valueLookup) {
325
+ return properties.reduce((createdFilterDescriptors, genericFilter) => {
326
+ // when no generic value lookup is provided, lookup enum filters are treated as string filters
327
+ const filterType = genericFilter.type === FilterTypeEnum.LookupEnum && valueLookup === undefined ? FilterTypeEnum.String : genericFilter.type;
328
+ const filterDescriptor = new FilterDescriptor(genericFilter.property).asFilterType(filterType).asGenericFilter();
329
+ if ((genericFilter.type === FilterTypeEnum.String || genericFilter.type === FilterTypeEnum.LookupEnum) && valueLookup) {
330
+ filterDescriptor.withGenericValueProvider(valueLookup);
331
+ }
332
+ if (filterDescriptor && genericFilter.opts !== undefined) {
333
+ switch (genericFilter.type) {
334
+ case FilterTypeEnum.Number:
335
+ filterDescriptor.asNumber(genericFilter.opts);
336
+ break;
337
+ case FilterTypeEnum.Date:
338
+ filterDescriptor.asDate(genericFilter.opts);
339
+ break;
340
+ }
341
+ }
342
+ if (filterDescriptor) {
343
+ createdFilterDescriptors.push(filterDescriptor);
344
+ }
345
+ return createdFilterDescriptors;
346
+ }, []);
347
+ }
348
+
349
+ function tableCreateFilterMeta(paramsWithDefaults) {
350
+ const primeFilterMeta = {};
351
+ // if any filter is present, no default filters should be applied!
352
+ if (paramsWithDefaults?.filters) {
353
+ Object.entries(paramsWithDefaults.filters).forEach(([key, value]) => {
354
+ primeFilterMeta[key] = {
355
+ value: value?.value,
356
+ matchMode: value?.matchMode,
357
+ caseSensitive: value?.caseSensitive
358
+ };
359
+ });
360
+ }
361
+ return primeFilterMeta;
362
+ }
363
+ function tableCreateSortMeta(paramsWithDefaults) {
364
+ if (paramsWithDefaults?.sort !== undefined && Array.isArray(paramsWithDefaults?.sort) && paramsWithDefaults?.sort.length > 0) {
365
+ return paramsWithDefaults?.sort.map(s => ({
366
+ field: s.property,
367
+ order: s.ascending ? 1 : -1
368
+ }));
369
+ }
370
+ return undefined;
371
+ }
372
+
373
+ const COMMONS_TABLE_FEATURE_CONFIG_IT = new InjectionToken('COMMONS_TABLE_FEATURE_CONFIG');
374
+
375
+ class TableMetadataService {
376
+ static { this.cmpTypeName = 'TableComponent'; }
377
+ #injector;
378
+ #translationObserver;
379
+ // signal sources
380
+ #signalSources;
381
+ #descriptor;
382
+ #updateDescriptorFromSourceEffect;
383
+ #genericFilters;
384
+ // search
385
+ #searchFieldsFromSignalSource;
386
+ #searchFields;
387
+ #searchFieldsEffect;
388
+ constructor() {
389
+ this.#injector = inject(Injector);
390
+ this.primeConfig = inject(PrimeNG);
391
+ this.moduleConfig = inject(COMMONS_MODULE_CONFIG_IT, { optional: true });
392
+ this.tableModuleConfig = inject(COMMONS_TABLE_FEATURE_CONFIG_IT, { optional: true });
393
+ this.serializationCfg = {};
394
+ this.#translationObserver = toSignal(this.primeConfig.translationObserver);
395
+ this.defaultFilterDisplayType = this.tableModuleConfig?.filterDisplayType ?? FilterDisplayTypeEnum.Column;
396
+ // signal sources
397
+ this.#signalSources = signal({});
398
+ // descriptors
399
+ this.descriptorFromSource = computed(() => this.#signalSources().descriptor?.());
400
+ this.#descriptor = signal(tableDescriptor());
401
+ this.descriptor = this.#descriptor.asReadonly();
402
+ this.#updateDescriptorFromSourceEffect = effectWithDeps([this.descriptorFromSource], ([d]) => {
403
+ if (d != null) {
404
+ this.#descriptor.set(d);
405
+ }
406
+ });
407
+ // pagination
408
+ this.rowsPerPageOptions = computed(() => {
409
+ const descriptor = this.descriptor();
410
+ if (Array.isArray(descriptor.rowsPerPageOptions) && descriptor.rowsPerPageOptions.length > 0) {
411
+ return descriptor.rowsPerPageOptions;
412
+ }
413
+ else {
414
+ return [25, 50, 100];
415
+ }
416
+ });
417
+ // filters
418
+ this.filterDescriptors = computed(() => this.descriptor().filters);
419
+ this.filters = computed(() => {
420
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
421
+ const observer = this.#translationObserver(); // need this one to track language changes
422
+ return this.filterDescriptors().map(d => this.mapDescriptorToMetadata(d));
423
+ });
424
+ this.genericFilterDescriptor = computed(() => this.descriptor().genericFilter);
425
+ this.#genericFilters = signal([]);
426
+ this.genericFilters = this.#genericFilters.asReadonly();
427
+ // search
428
+ this.#searchFieldsFromSignalSource = computed(() => this.#signalSources().searchFields?.());
429
+ this.#searchFields = signal([]);
430
+ this.searchFields = this.#searchFields.asReadonly();
431
+ this.#searchFieldsEffect = effectWithDeps([this.descriptor, this.#searchFieldsFromSignalSource], ([descriptor, searchFieldsFromSignalSource]) => {
432
+ this.#searchFields.set(searchFieldsFromSignalSource ?? (descriptor.search && descriptor.searchFields ? descriptor.searchFields : this.descriptor().columns.map(c => c.property)));
433
+ });
434
+ // params
435
+ this.defaultParams = computed(() => {
436
+ const params = {
437
+ offset: 0,
438
+ limit: this.rowsPerPageOptions()[0],
439
+ sort: this.descriptor()
440
+ .sorts.filter(s => s.defaultIsEnabled)
441
+ .sort((s1, s2) => (s1.defaultOrder ?? 1000) - (s2.defaultOrder ?? 1000))
442
+ .map(s => ({
443
+ property: s.property,
444
+ ascending: s.defaultIsAscending
445
+ })),
446
+ filters: {}
447
+ };
448
+ this.filters()
449
+ .filter(f => f.descriptor.hasDefaultValue)
450
+ .forEach(f => {
451
+ params.filters[f.descriptor.property] = {
452
+ value: f.descriptor.defaultValue,
453
+ matchMode: f.defaultMatchMode
454
+ };
455
+ });
456
+ return params;
457
+ });
458
+ filterApplySerializationConfigToCmp(this.moduleConfig, this.serializationCfg);
459
+ combineLatest([toObservable(this.genericFilterDescriptor), toObservable(this.#translationObserver)])
460
+ .pipe(switchMap(([genericFilterDescriptor]) => {
461
+ if (genericFilterDescriptor) {
462
+ const dataProvider = this.genericFilterDescriptor()?.propertyLookup;
463
+ const genericFilterService = dataProvider?.serviceType ? this.#injector.get(dataProvider.serviceType) : null;
464
+ // fetch filterable properties
465
+ return toObservable$1(genericFilterDescriptor.propertyLookup.lookup({}, genericFilterService));
466
+ }
467
+ return of([]);
468
+ }), takeUntilDestroyed())
469
+ .subscribe({
470
+ next: genericFilters => {
471
+ // set descriptors from generic filter data
472
+ this.#genericFilters.set(createFilterDescriptorsFromGeneric(genericFilters, this.genericFilterDescriptor()?.valueLookup).map(d => this.mapDescriptorToMetadata(d)));
473
+ }
474
+ });
475
+ }
476
+ setSignalSources(descriptor, searchFields) {
477
+ this.#signalSources.set({ descriptor, searchFields });
478
+ }
479
+ setDescriptor(descriptor) {
480
+ if (this.descriptorFromSource() instanceof TableDynamicDescriptorInst) {
481
+ this.#descriptor.set(descriptor);
482
+ }
483
+ }
484
+ mapDescriptorToMetadata(descriptor) {
485
+ const matchModes = filterGenerateMatchModeOptions(this.primeConfig, descriptor, this.serializationCfg);
486
+ return {
487
+ descriptor: descriptor,
488
+ matchModes: matchModes,
489
+ defaultMatchMode: filterGetDefaultMatchMode(descriptor, matchModes),
490
+ dateConfig: filterGetDateConfig(descriptor, this.serializationCfg),
491
+ numberConfig: filterGetNumberConfig(descriptor)
492
+ };
493
+ }
494
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableMetadataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
495
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableMetadataService }); }
496
+ }
497
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableMetadataService, decorators: [{
498
+ type: Injectable
499
+ }], ctorParameters: () => [] });
500
+
501
+ class TableDataService {
502
+ constructor() {
503
+ this.#injector = inject(Injector);
504
+ this.#commons = inject(CommonsService);
505
+ this.#metadata = inject(TableMetadataService);
506
+ // signal sources
507
+ this.#dataSources = signal({});
508
+ // data sources
509
+ this.#manualLoading = computed(() => this.#dataSources()?.manualLoading?.());
510
+ // results that are set directly via input and are not result of a asynchronous operation (aka data provider)
511
+ this.#synchronousResult = computed(() => {
512
+ const dataSources = this.#dataSources();
513
+ if (dataSources?.dataProvider?.() !== undefined) {
514
+ return undefined;
515
+ }
516
+ if (dataSources?.dataListResult?.() !== undefined) {
517
+ return dataSources?.dataListResult();
518
+ }
519
+ if (dataSources?.arrayItems?.() !== undefined) {
520
+ return { data: dataSources.arrayItems(), totalCount: dataSources.arrayItems()?.length ?? 0 };
521
+ }
522
+ return undefined;
523
+ });
524
+ this.#dataProvider = computed(() => this.#dataSources()?.dataProvider?.());
525
+ this.#dataProviderService = computed(() => {
526
+ const dataProvider = this.#dataProvider();
527
+ return dataProvider?.serviceType ? this.#injector.get(dataProvider.serviceType) : null;
528
+ });
529
+ this.#synchronousResultEffect = effectWithDeps([this.#synchronousResult], ([res]) => {
530
+ if (res != null) {
531
+ this.#setData(res.data ?? [], res.totalCount);
532
+ }
533
+ });
534
+ this.#synchronousLoadingEffect = effectWithDeps([this.#synchronousResult, this.#manualLoading], ([res, manualLoading]) => {
535
+ if (res != null && manualLoading == null) {
536
+ this.#loading.set(false);
537
+ }
538
+ });
539
+ this.#manualLoadingEffect = effectWithDeps([this.#manualLoading], ([manualLoading]) => {
540
+ if (manualLoading != null) {
541
+ this.#loading.set(manualLoading);
542
+ }
543
+ });
544
+ // pagination
545
+ this.#params = signal(undefined);
546
+ this.params = this.#params.asReadonly();
547
+ this.#sortMeta = signal(undefined);
548
+ this.sortMeta = this.#sortMeta.asReadonly();
549
+ this.#filterMeta = signal({});
550
+ this.filterMeta = this.#filterMeta.asReadonly();
551
+ this.#isSortAndFilterMetaInitialized = signal(false);
552
+ this.#defaultParamsEffect = effectWithDeps([this.#metadata.defaultParams], ([defaultParams]) => {
553
+ this.#sortMeta.set(tableCreateSortMeta(defaultParams));
554
+ this.#filterMeta.set(tableCreateFilterMeta(defaultParams));
555
+ this.#isSortAndFilterMetaInitialized.set(true);
556
+ }, { firstOnly: true });
557
+ this.#isSearchMetaInitialized = signal(false);
558
+ this.#searchMeta = signal(undefined);
559
+ this.searchMeta = this.#searchMeta.asReadonly();
560
+ this.isAllPaginationMetaInitialized = computed(() => this.#isSortAndFilterMetaInitialized() && this.#isSortAndFilterMetaInitialized());
561
+ this.paginationMode = computed(() => {
562
+ const descriptor = this.#metadata.descriptor();
563
+ if (descriptor.paginationMode != null) {
564
+ // descriptor choice is the strongest - if defined, use this value
565
+ return descriptor.paginationMode;
566
+ }
567
+ else if (this.#dataProvider() != null) {
568
+ // when data provider is used, use pagination
569
+ return TablePaginationModeEnum.Pagination;
570
+ }
571
+ else {
572
+ return TablePaginationModeEnum.None;
573
+ }
574
+ });
575
+ this.offset = computed(() => this.params()?.offset ?? 0);
576
+ this.rows = computed(() => {
577
+ if (this.params()?.limit) {
578
+ return this.params()?.limit;
579
+ }
580
+ const descriptor = this.#metadata.descriptor();
581
+ const rowsPerPageOptions = this.#metadata.rowsPerPageOptions();
582
+ if (descriptor.defaultNumRows && rowsPerPageOptions.includes(descriptor.defaultNumRows)) {
583
+ return descriptor.defaultNumRows;
584
+ }
585
+ return rowsPerPageOptions[0];
586
+ });
587
+ // data
588
+ this.#data = signal([]);
589
+ this.data = this.#data.asReadonly();
590
+ this.#count = signal(0);
591
+ this.count = this.#count.asReadonly();
592
+ this.#loading = signal(true);
593
+ this.loading = this.#loading.asReadonly();
594
+ }
595
+ #injector;
596
+ #commons;
597
+ #metadata;
598
+ // signal sources
599
+ #dataSources;
600
+ // data sources
601
+ #manualLoading;
602
+ // results that are set directly via input and are not result of a asynchronous operation (aka data provider)
603
+ #synchronousResult;
604
+ #dataProvider;
605
+ #dataProviderService;
606
+ #synchronousResultEffect;
607
+ #synchronousLoadingEffect;
608
+ #manualLoadingEffect;
609
+ #dataProviderSubscription;
610
+ // pagination
611
+ #params;
612
+ #sortMeta;
613
+ #filterMeta;
614
+ #isSortAndFilterMetaInitialized;
615
+ #defaultParamsEffect;
616
+ #isSearchMetaInitialized;
617
+ #searchMeta;
618
+ // data
619
+ #data;
620
+ #count;
621
+ #loading;
622
+ setDataSources(arrayItems, dataListResult, dataProvider, manualLoading) {
623
+ this.#dataSources.set({ arrayItems, dataListResult, dataProvider, manualLoading });
624
+ }
625
+ fetchWithDataProvider(params, onErrorFn) {
626
+ const dataProvider = this.#dataProvider();
627
+ if (!dataProvider || params.limit === 0) {
628
+ return false;
629
+ }
630
+ this.#dataProviderSubscription?.unsubscribe();
631
+ this.#loading.set(true);
632
+ this.#dataProviderSubscription = toObservable$1(dataProvider.getAll(params, this.#dataProviderService(), this.#metadata.descriptor().isLocalized ? (this.#commons.appDataLocale() ?? undefined) : undefined)).subscribe({
633
+ next: res => {
634
+ const descriptorInput = this.#metadata.descriptorFromSource();
635
+ if (descriptorInput instanceof TableDynamicDescriptorInst) {
636
+ this.#metadata.setDescriptor(descriptorInput.toTableDescriptorFromData(res));
637
+ }
638
+ this.#setData(res?.data ?? [], res?.totalCount);
639
+ this.#loading.set(false);
640
+ },
641
+ error: err => {
642
+ onErrorFn(err);
643
+ this.#setData([]);
644
+ this.#loading.set(false);
645
+ }
646
+ });
647
+ return true;
648
+ }
649
+ setParams(params, fromQueryParams = false) {
650
+ if (!fromQueryParams && this.compareWithCurrentParams(params)) {
651
+ return;
652
+ }
653
+ this.#params.set(params);
654
+ this.#sortMeta.set(tableCreateSortMeta(params));
655
+ this.#filterMeta.set(tableCreateFilterMeta(params));
656
+ this.#isSortAndFilterMetaInitialized.set(true);
657
+ if (fromQueryParams && !this.#isSearchMetaInitialized() && params?.search) {
658
+ this.#searchMeta.set({ value: params.search, caseSensitive: params.filters?.['global']?.caseSensitive ?? false });
659
+ }
660
+ this.#isSearchMetaInitialized.set(true);
661
+ }
662
+ /**
663
+ * Compare the given params with the stored params in the DataListService.
664
+ *
665
+ * @param {DataListParams} params - The params to compare with the stored params.
666
+ *
667
+ * @return {boolean} - True if the given params match the stored params, otherwise false.
668
+ */
669
+ compareWithCurrentParams(params) {
670
+ return (params.offset === this.offset() &&
671
+ params.limit === this.rows() &&
672
+ JSON.stringify(tableCreateSortMeta(params)) === JSON.stringify(this.#sortMeta()) &&
673
+ JSON.stringify(tableCreateFilterMeta(params)) === JSON.stringify(this.#filterMeta()));
674
+ }
675
+ #setData(data, count) {
676
+ this.#data.set([...data]);
677
+ this.#count.set(count ?? data.length);
678
+ }
679
+ ngOnDestroy() {
680
+ this.#dataProviderSubscription?.unsubscribe();
681
+ }
682
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableDataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
683
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableDataService }); }
684
+ }
685
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableDataService, decorators: [{
686
+ type: Injectable
687
+ }] });
688
+
689
+ /**
690
+ * Cannot be on push change detection strategy because of filter updates triggered from route which causes to force update values in force metadata
691
+ * and these must be propagated through to this component and beyond to primeNG.
692
+ */
693
+ class TableColumnFilterComponent {
694
+ constructor() {
695
+ this.lookupTypeDropdown = FilterLookupTypeEnum.Dropdown;
696
+ this.lookupTypeAutocomplete = FilterLookupTypeEnum.Autocomplete;
697
+ this.FilterTypeEnum = FilterTypeEnum;
698
+ this.FilterMatchMode = FilterMatchMode;
699
+ this.el = inject(ElementRef);
700
+ this.primeTable = inject(Table);
701
+ this.renderer = inject(Renderer2);
702
+ this.overlayService = inject(OverlayService);
703
+ this.cd = inject(ChangeDetectorRef);
704
+ this.destroyRef = inject(DestroyRef);
705
+ this.tableData = inject((TableDataService));
706
+ this.tableMetadata = inject(TableMetadataService);
707
+ this.document = window.document;
708
+ this.metadata = input.required();
709
+ this.descriptorAsLookup = computed(() => this.metadata().descriptor instanceof FilterLookupDescriptor ? this.metadata().descriptor : undefined);
710
+ this.icon = viewChild('icon');
711
+ this.matchModes = computed(() => this.metadata().matchModes);
712
+ this.filterConstraint = signal(undefined);
713
+ this.isFilterSet = computed(() => this.filterConstraint()?.matchMode === FilterMatchMode.Exists ||
714
+ this.filterConstraint()?.matchMode === FilterMatchMode.DoesNotExist ||
715
+ !this.primeTable.isFilterBlank(this.filterConstraint()?.value));
716
+ this.isInputDisabled = computed(() => this.filterConstraint()?.matchMode === FilterMatchMode.Exists || this.filterConstraint()?.matchMode === FilterMatchMode.DoesNotExist);
717
+ this.overlayVisible = signal(false);
718
+ // display configs
719
+ this.isMultiselect = computed(() => {
720
+ const ft = this.filterConstraint();
721
+ const matchMode = ft?.displayMatchMode ?? this.metadata().defaultMatchMode;
722
+ return (matchMode === FilterMatchMode.In || matchMode === FilterMatchMode.NotIn) && (ft?.displayValue == null || Array.isArray(ft.displayValue));
723
+ });
724
+ this.window = this.document.defaultView;
725
+ this.numericValueFromModelChange = null;
726
+ this.dateDebounceSubject = new Subject();
727
+ this.dateDebounceSubject.pipe(debounceTime(500), distinctUntilChanged(), takeUntilDestroyed()).subscribe(v => this.updateFilterOnDisplayValueChange(v));
728
+ effectWithDeps([this.metadata, this.filterConstraint], ([metadata]) => {
729
+ const fieldFilterMeta = this.tableData.filterMeta()?.[metadata.descriptor.property];
730
+ const filterConstraint = this.filterConstraint();
731
+ if (fieldFilterMeta && (!filterConstraint || filterConstraint.value !== fieldFilterMeta.value || filterConstraint.matchMode !== fieldFilterMeta.matchMode)) {
732
+ this.setFilterConstraint(filterSetMetadataOnChange(fieldFilterMeta, fieldFilterMeta.matchMode, fieldFilterMeta.value, untracked(() => this.metadata().descriptor.filterType), untracked(() => this.metadata().dateConfig)));
733
+ }
734
+ });
735
+ }
736
+ ngOnDestroy() {
737
+ if (this.overlay) {
738
+ this.renderer.appendChild(this.el.nativeElement, this.overlay);
739
+ ZIndexUtils.clear(this.overlay);
740
+ this.onOverlayHide();
741
+ }
742
+ this.resetSubscription?.unsubscribe();
743
+ this.overlaySubscription?.unsubscribe();
744
+ }
745
+ onTextModelChange(event) {
746
+ const value = event.target.value;
747
+ if (value === '') {
748
+ this.updateFilterOnDisplayValueChange(value);
749
+ }
750
+ }
751
+ onTextInputEnterKeyDown(event) {
752
+ const value = event.target.value;
753
+ this.updateFilterOnDisplayValueChange(value);
754
+ event.preventDefault();
755
+ }
756
+ onNumericModelChange(value) {
757
+ this.numericValueFromModelChange = value;
758
+ if (value === null) {
759
+ this.updateFilterOnDisplayValueChange(value);
760
+ }
761
+ }
762
+ onNumericInputKeyDown(event) {
763
+ if (event.key === 'Enter') {
764
+ if (this.filterConstraint()?.displayMatchMode === FilterMatchMode.Between && Array.isArray(this.numericValueFromModelChange)) {
765
+ const numberValues = this.numericValueFromModelChange.filter(v => typeof v === 'number');
766
+ if (numberValues.length !== 2) {
767
+ return;
768
+ }
769
+ }
770
+ this.updateFilterOnDisplayValueChange(this.numericValueFromModelChange);
771
+ event.preventDefault();
772
+ }
773
+ }
774
+ onCheckboxModelChange(value) {
775
+ this.updateFilterOnDisplayValueChange(value);
776
+ }
777
+ onDateFilterModelChange(value) {
778
+ if (this.filterConstraint()?.displayMatchMode === FilterMatchMode.Between && Array.isArray(value)) {
779
+ const dateValues = value.filter(v => v instanceof Date);
780
+ if (dateValues.length !== 2) {
781
+ return;
782
+ }
783
+ }
784
+ this.dateDebounceSubject.next(value);
785
+ }
786
+ autocompleteFilter(value) {
787
+ this.updateFilterOnDisplayValueChange(value);
788
+ }
789
+ dropdownFilter(value) {
790
+ this.updateFilterOnDisplayValueChange(value);
791
+ }
792
+ onMatchModeChange(displayMatchMode) {
793
+ if (this.filterConstraint()?.displayMatchMode === displayMatchMode) {
794
+ return;
795
+ }
796
+ this.setFilterConstraint(filterSetMetadataOnDisplayChange(this.filterConstraint(), displayMatchMode, filterAdjustDisplayValueOnMatchModeChange(displayMatchMode, this.filterConstraint()?.displayValue), this.metadata().descriptor.filterType, this.metadata().dateConfig));
797
+ this.hideOverlay();
798
+ }
799
+ onMatchModeKeyDown(event) {
800
+ const item = event.target;
801
+ switch (event.key) {
802
+ case 'ArrowDown':
803
+ // eslint-disable-next-line no-case-declarations
804
+ const nextItem = this.findNextMenuModeItem(item);
805
+ if (nextItem) {
806
+ item.removeAttribute('tabindex');
807
+ nextItem.tabIndex = '0';
808
+ nextItem.focus();
809
+ }
810
+ event.preventDefault();
811
+ break;
812
+ case 'ArrowUp':
813
+ // eslint-disable-next-line no-case-declarations
814
+ const prevItem = this.findPrevMenuModeItem(item);
815
+ if (prevItem) {
816
+ item.removeAttribute('tabindex');
817
+ prevItem.tabIndex = '0';
818
+ prevItem.focus();
819
+ }
820
+ event.preventDefault();
821
+ break;
822
+ }
823
+ }
824
+ onRowClearItemClick() {
825
+ this.clearFilter();
826
+ this.hideOverlay();
827
+ }
828
+ toggleMenu(event) {
829
+ this.overlayVisible.set(!this.overlayVisible());
830
+ event.stopPropagation();
831
+ }
832
+ onToggleButtonKeyDown(event) {
833
+ switch (event.key) {
834
+ case 'Escape':
835
+ case 'Tab':
836
+ this.overlayVisible.set(false);
837
+ break;
838
+ case 'ArrowDown':
839
+ if (this.overlayVisible()) {
840
+ const focusable = DomHandler.getFocusableElements(this.overlay);
841
+ if (focusable) {
842
+ focusable[0].focus();
843
+ }
844
+ event.preventDefault();
845
+ }
846
+ else if (event.altKey) {
847
+ this.overlayVisible.set(true);
848
+ event.preventDefault();
849
+ }
850
+ break;
851
+ }
852
+ }
853
+ onEscape() {
854
+ this.overlayVisible.set(false);
855
+ }
856
+ onContentClick() {
857
+ this.selfClick = true;
858
+ }
859
+ // onOverlayAnimationStart(event: AnimationEvent) {
860
+ onOverlayAnimationStart(event) {
861
+ switch (event.toState) {
862
+ case 'visible':
863
+ this.overlay = event.element;
864
+ this.renderer.appendChild(this.document.body, this.overlay);
865
+ ZIndexUtils.set('overlay', this.overlay, this.tableMetadata.primeConfig.zIndex.overlay);
866
+ DomHandler.absolutePosition(this.overlay, this.icon()?.nativeElement);
867
+ this.bindDocumentClickListener();
868
+ this.bindDocumentResizeListener();
869
+ this.bindScrollListener();
870
+ this.overlayEventListener = (e) => {
871
+ if (this.overlay && this.overlay.contains(e.target)) {
872
+ this.selfClick = true;
873
+ }
874
+ };
875
+ this.overlaySubscription = this.overlayService.clickObservable.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(this.overlayEventListener);
876
+ break;
877
+ case 'void':
878
+ this.onOverlayHide();
879
+ this.overlaySubscription?.unsubscribe();
880
+ break;
881
+ }
882
+ }
883
+ // onOverlayAnimationEnd(event: AnimationEvent) {
884
+ onOverlayAnimationEnd(event) {
885
+ switch (event.toState) {
886
+ case 'void':
887
+ ZIndexUtils.clear(event.element);
888
+ break;
889
+ }
890
+ }
891
+ get noFilterLabel() {
892
+ return this.tableMetadata.primeConfig.getTranslation(TranslationKeys.NO_FILTER);
893
+ }
894
+ clearFilter() {
895
+ this.initFilterConstraint(true);
896
+ this.primeTable._filter();
897
+ this.hideOverlay();
898
+ }
899
+ findNextMenuModeItem(item) {
900
+ const nextItem = item.nextElementSibling;
901
+ if (nextItem)
902
+ return DomHandler.hasClass(nextItem, 'p-column-filter-separator') ? this.findNextMenuModeItem(nextItem) : nextItem;
903
+ else
904
+ return item.parentElement?.firstElementChild;
905
+ }
906
+ findPrevMenuModeItem(item) {
907
+ const prevItem = item.previousElementSibling;
908
+ if (prevItem)
909
+ return DomHandler.hasClass(prevItem, 'p-column-filter-separator') ? this.findPrevMenuModeItem(prevItem) : prevItem;
910
+ else
911
+ return item.parentElement?.lastElementChild;
912
+ }
913
+ isOutsideClicked(event) {
914
+ return !(this.overlay?.isSameNode(event.target) ||
915
+ this.overlay?.contains(event.target) ||
916
+ this.icon()?.nativeElement.isSameNode(event.target) ||
917
+ this.icon()?.nativeElement.contains(event.target) ||
918
+ DomHandler.hasClass(event.target, 'p-column-filter-add-button') ||
919
+ DomHandler.hasClass(event.target.parentElement, 'p-column-filter-add-button') ||
920
+ DomHandler.hasClass(event.target, 'p-column-filter-remove-button') ||
921
+ DomHandler.hasClass(event.target.parentElement, 'p-column-filter-remove-button'));
922
+ }
923
+ bindDocumentClickListener() {
924
+ if (!this.documentClickListener) {
925
+ const documentTarget = this.el ? this.el.nativeElement.ownerDocument : 'document';
926
+ this.documentClickListener = this.renderer.listen(documentTarget, 'click', event => {
927
+ if (this.overlayVisible() && !this.selfClick && this.isOutsideClicked(event)) {
928
+ this.hideOverlay();
929
+ }
930
+ this.selfClick = false;
931
+ });
932
+ }
933
+ }
934
+ unbindDocumentClickListener() {
935
+ if (this.documentClickListener) {
936
+ this.documentClickListener();
937
+ this.documentClickListener = null;
938
+ this.selfClick = false;
939
+ }
940
+ }
941
+ bindDocumentResizeListener() {
942
+ if (!this.documentResizeListener) {
943
+ this.documentResizeListener = this.renderer.listen(this.window, 'resize', () => {
944
+ if (this.overlayVisible() && !DomHandler.isTouchDevice()) {
945
+ this.hideOverlay();
946
+ }
947
+ });
948
+ }
949
+ }
950
+ unbindDocumentResizeListener() {
951
+ if (this.documentResizeListener) {
952
+ this.documentResizeListener();
953
+ this.documentResizeListener = null;
954
+ }
955
+ }
956
+ bindScrollListener() {
957
+ if (!this.scrollHandler) {
958
+ this.scrollHandler = new ConnectedOverlayScrollHandler(this.icon()?.nativeElement, () => {
959
+ if (this.overlayVisible()) {
960
+ this.hideOverlay();
961
+ }
962
+ });
963
+ }
964
+ this.scrollHandler.bindScrollListener();
965
+ }
966
+ unbindScrollListener() {
967
+ if (this.scrollHandler) {
968
+ this.scrollHandler.unbindScrollListener();
969
+ }
970
+ }
971
+ hideOverlay() {
972
+ this.overlayVisible.set(false);
973
+ this.cd.markForCheck();
974
+ }
975
+ onOverlayHide() {
976
+ this.unbindDocumentClickListener();
977
+ this.unbindDocumentResizeListener();
978
+ this.unbindScrollListener();
979
+ this.overlay = null;
980
+ }
981
+ updateFilterOnDisplayValueChange(displayValue) {
982
+ this.setFilterConstraint(filterSetMetadataOnDisplayChange(this.filterConstraint(), this.filterConstraint()?.displayMatchMode ?? this.metadata().defaultMatchMode, displayValue, this.metadata().descriptor.filterType, this.metadata().dateConfig));
983
+ }
984
+ initFilterConstraint(reset = false) {
985
+ if (reset) {
986
+ this.primeTable.filters[this.metadata().descriptor.property] = { value: null, matchMode: this.metadata().defaultMatchMode };
987
+ }
988
+ // set internal filter constraint
989
+ let metadata = this.primeTable.filters[this.metadata().descriptor.property];
990
+ if (Array.isArray(metadata)) {
991
+ metadata = metadata[0];
992
+ }
993
+ this.setFilterConstraint(filterSetMetadataOnChange(metadata, metadata?.matchMode, metadata?.value, this.metadata().descriptor.filterType, this.metadata().dateConfig));
994
+ }
995
+ setFilterConstraint(metadata) {
996
+ if (metadata && !metadata.displayMatchMode)
997
+ metadata.displayMatchMode = metadata.matchMode;
998
+ if (metadata && !metadata.displayValue)
999
+ metadata.displayValue = metadata.value;
1000
+ this.filterConstraint.set(metadata);
1001
+ this.primeTable.filters[this.metadata().descriptor.property] = this.filterConstraint();
1002
+ this.primeTable._filter();
1003
+ }
1004
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableColumnFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1005
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.7", type: TableColumnFilterComponent, isStandalone: true, selector: "mng-table-column-filter", inputs: { metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "icon", first: true, predicate: ["icon"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex items-center\">\n @switch (metadata().descriptor.filterType) {\n @case (FilterTypeEnum.Number) {\n @if (filterConstraint()?.displayMatchMode === 'between') {\n <mng-number-range\n vertical=\"true\"\n className=\"mng-column-filter-number-input\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onNumericModelChange($event)\"\n (keyDown)=\"onNumericInputKeyDown($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [useGrouping]=\"metadata().descriptor.numberUseGrouping\"\n [minFractionDigits]=\"metadata().numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"metadata().numberConfig?.fractionsMax\"\n [disabled]=\"isInputDisabled()\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onNumericModelChange($event)\"\n (onKeyDown)=\"onNumericInputKeyDown($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [useGrouping]=\"metadata().descriptor.numberUseGrouping\"\n [minFractionDigits]=\"metadata().numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"metadata().numberConfig?.fractionsMax\"\n [disabled]=\"isInputDisabled()\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [ngModel]=\"filterConstraint()?.displayValue\" binary=\"true\" (ngModelChange)=\"onCheckboxModelChange($event)\"></p-checkbox>\n }\n @case (FilterTypeEnum.Date) {\n @if (filterConstraint()?.displayMatchMode === FilterMatchMode.Between) {\n <mng-date-range\n vertical=\"true\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onDateFilterModelChange($event)\"\n [showTime]=\"metadata().dateConfig?.showTime ?? false\"\n [showSeconds]=\"metadata().dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"metadata().dateConfig?.format\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [disabled]=\"isInputDisabled()\"></mng-date-range>\n } @else {\n <p-date-picker\n appendTo=\"body\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onDateFilterModelChange($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"metadata().dateConfig?.showTime ?? false\"\n [showSeconds]=\"metadata().dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"metadata().dateConfig?.format\"\n [firstDayOfWeek]=\"1\">\n </p-date-picker>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\" />\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\" />\n }\n @default {\n <input\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input\"\n [value]=\"filterConstraint()?.displayValue\"\n [disabled]=\"isInputDisabled()\"\n (input)=\"onTextModelChange($event)\"\n (keydown.enter)=\"onTextInputEnterKeyDown($event)\"\n [attr.placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [mngInputTrim]=\"metadata().descriptor.trimOption\" />\n }\n }\n\n <ng-template #lookupFilter>\n @if (descriptorAsLookup(); as lookup) {\n @switch (lookup.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n *mngRerender=\"isMultiselect()\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n [dataProvider]=\"lookup.dataProvider\"\n [optionsTrackProperty]=\"lookup.optionsValueProperty\"\n [optionsValueProperty]=\"lookup.optionsValueProperty\"\n [optionsLabelProperty]=\"lookup.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookup.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [autoClear]=\"lookup.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookup.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookup.autocompleteInlineSearch ?? false\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.searchToFilter' | translate\"\n [className]=\"lookup.className\"\n [dropdownClassName]=\"lookup.dropdownClassName\"\n [disabled]=\"isInputDisabled()\"\n (valueChange)=\"autocompleteFilter($event)\"\n [searchTrim]=\"metadata().descriptor.trimOption\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n *mngRerender=\"isMultiselect()\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n [dataProvider]=\"lookup.dataProvider\"\n [optionsValueProperty]=\"lookup.optionsValueProperty\"\n [optionsLabelProperty]=\"lookup.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookup.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.selectToFilter' | translate\"\n [className]=\"lookup.className\"\n [dropdownClassName]=\"lookup.dropdownClassName\"\n [showClear]=\"false\"\n [changeValueOnBlur]=\"isMultiselect()\"\n [disabled]=\"isInputDisabled()\"\n (valueChange)=\"dropdownFilter($event)\">\n </mng-dropdown>\n }\n }\n }\n </ng-template>\n\n @if (matchModes().length > 1) {\n <button\n #icon\n pButton\n type=\"button\"\n class=\"mng-button-xs mx-1\"\n [class.!hidden]=\"!isFilterSet()\"\n rounded=\"true\"\n severity=\"primary\"\n (click)=\"toggleMenu($event)\"\n (keydown)=\"onToggleButtonKeyDown($event)\">\n <FilterIcon pButtonIcon />\n </button>\n }\n @if (overlayVisible()) {\n <div\n class=\"p-datatable-filter-overlay\"\n (click)=\"onContentClick()\"\n [@overlayAnimation]=\"'visible'\"\n (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\"\n (@overlayAnimation.done)=\"onOverlayAnimationEnd($event)\"\n (keydown.escape)=\"onEscape()\">\n <ul class=\"p-datatable-filter-constraint-list\">\n @for (matchMode of matchModes(); track matchMode; let i = $index) {\n <li\n class=\"p-datatable-filter-constraint\"\n [class.p-datatable-filter-constraint-selected]=\"matchMode.value === filterConstraint()?.displayMatchMode\"\n (click)=\"onMatchModeChange(matchMode.value)\"\n (keydown)=\"onMatchModeKeyDown($event)\"\n (keydown.enter)=\"this.onMatchModeChange(matchMode.value)\"\n [attr.tabindex]=\"i === 0 ? '0' : null\">\n {{ matchMode.label }}\n </li>\n }\n <li class=\"p-datatable-filter-constraint-separator\"></li>\n <li class=\"p-datatable-filter-constraint\" (click)=\"onRowClearItemClick()\" (keydown)=\"onMatchModeKeyDown($event)\" (keydown.enter)=\"onRowClearItemClick()\">\n {{ noFilterLabel }}\n </li>\n </ul>\n </div>\n }\n</div>\n", styles: [".mng-column-filter-string{min-width:135px}.mng-column-filter-number{min-width:165px}.mng-column-filter-date{min-width:170px}.mng-column-filter-boolean{min-width:80px}.mng-column-filter-lookup,.mng-column-filter-lookupenum{min-width:180px}\n"], dependencies: [{ kind: "ngmodule", type: TableModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: DateRangeComponent, selector: "mng-date-range", inputs: ["placeholder", "showTime", "showSeconds", "dateFormat", "className", "required", "disabled", "vertical"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AutocompleteComponent, selector: "mng-autocomplete", inputs: ["dataProvider", "optionsTrackProperty", "optionsValueProperty", "optionsLabelProperty", "optionsLabelTranslate", "inlineSearch", "openOnFocus", "multiselect", "placeholder", "className", "dropdownClassName", "showClear", "autoClear", "selectFirst", "searchTrim", "disabled"], outputs: ["valueChange", "blur"] }, { kind: "component", type: DropdownComponent, selector: "mng-dropdown", inputs: ["dataProvider", "options", "optionsTrackProperty", "optionsLabelProperty", "optionsLabelTranslate", "optionsValueProperty", "optionsDisabledProperty", "multiselect", "placeholder", "showClear", "selectFirstItem", "className", "dropdownClassName", "changeValueOnBlur", "loading", "disabled", "allowInput", "appendTo", "inlineSearch", "searchTrim"], outputs: ["valueChange", "blur"] }, { kind: "component", type: InputNumber, selector: "p-inputNumber, p-inputnumber, p-input-number", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled", "fluid"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "component", type: FilterIcon, selector: "FilterIcon" }, { kind: "directive", type: InputTrimDirective, selector: "[mngInputTrim]", inputs: ["mngInputTrim"] }, { kind: "component", type: NumberRangeComponent, selector: "mng-number-range", inputs: ["placeholder", "useGrouping", "minFractionDigits", "maxFractionDigits", "required", "disabled", "vertical"], outputs: ["keyDown"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["value", "name", "disabled", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "inputStyle", "styleClass", "inputClass", "indeterminate", "size", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: RerenderDirective, selector: "[mngRerender]", inputs: ["mngRerender"] }, { kind: "component", type: DatePicker, selector: "p-datePicker, p-datepicker, p-date-picker", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "size", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "directive", type: ButtonIcon, selector: "[pButtonIcon]" }], animations: [
1006
+ trigger('overlayAnimation', [
1007
+ transition(':enter', [style({ opacity: 0, transform: 'scaleY(0.8)' }), animate('.12s cubic-bezier(0, 0, 0.2, 1)')]),
1008
+ transition(':leave', [animate('.1s linear', style({ opacity: 0 }))])
1009
+ ])
1010
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1011
+ }
1012
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableColumnFilterComponent, decorators: [{
1013
+ type: Component,
1014
+ args: [{ selector: 'mng-table-column-filter', imports: [
1015
+ TableModule,
1016
+ TranslateModule,
1017
+ DateRangeComponent,
1018
+ FormsModule,
1019
+ AutocompleteComponent,
1020
+ DropdownComponent,
1021
+ InputNumber,
1022
+ InputText,
1023
+ FilterIcon,
1024
+ InputTrimDirective,
1025
+ NumberRangeComponent,
1026
+ NgTemplateOutlet,
1027
+ Checkbox,
1028
+ RerenderDirective,
1029
+ DatePicker,
1030
+ ButtonDirective,
1031
+ ButtonIcon
1032
+ ], animations: [
1033
+ trigger('overlayAnimation', [
1034
+ transition(':enter', [style({ opacity: 0, transform: 'scaleY(0.8)' }), animate('.12s cubic-bezier(0, 0, 0.2, 1)')]),
1035
+ transition(':leave', [animate('.1s linear', style({ opacity: 0 }))])
1036
+ ])
1037
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex items-center\">\n @switch (metadata().descriptor.filterType) {\n @case (FilterTypeEnum.Number) {\n @if (filterConstraint()?.displayMatchMode === 'between') {\n <mng-number-range\n vertical=\"true\"\n className=\"mng-column-filter-number-input\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onNumericModelChange($event)\"\n (keyDown)=\"onNumericInputKeyDown($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [useGrouping]=\"metadata().descriptor.numberUseGrouping\"\n [minFractionDigits]=\"metadata().numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"metadata().numberConfig?.fractionsMax\"\n [disabled]=\"isInputDisabled()\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onNumericModelChange($event)\"\n (onKeyDown)=\"onNumericInputKeyDown($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [useGrouping]=\"metadata().descriptor.numberUseGrouping\"\n [minFractionDigits]=\"metadata().numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"metadata().numberConfig?.fractionsMax\"\n [disabled]=\"isInputDisabled()\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [ngModel]=\"filterConstraint()?.displayValue\" binary=\"true\" (ngModelChange)=\"onCheckboxModelChange($event)\"></p-checkbox>\n }\n @case (FilterTypeEnum.Date) {\n @if (filterConstraint()?.displayMatchMode === FilterMatchMode.Between) {\n <mng-date-range\n vertical=\"true\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onDateFilterModelChange($event)\"\n [showTime]=\"metadata().dateConfig?.showTime ?? false\"\n [showSeconds]=\"metadata().dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"metadata().dateConfig?.format\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [disabled]=\"isInputDisabled()\"></mng-date-range>\n } @else {\n <p-date-picker\n appendTo=\"body\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n (ngModelChange)=\"onDateFilterModelChange($event)\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"metadata().dateConfig?.showTime ?? false\"\n [showSeconds]=\"metadata().dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"metadata().dateConfig?.format\"\n [firstDayOfWeek]=\"1\">\n </p-date-picker>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\" />\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\" />\n }\n @default {\n <input\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input\"\n [value]=\"filterConstraint()?.displayValue\"\n [disabled]=\"isInputDisabled()\"\n (input)=\"onTextModelChange($event)\"\n (keydown.enter)=\"onTextInputEnterKeyDown($event)\"\n [attr.placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.typeToFilter' | translate\"\n [mngInputTrim]=\"metadata().descriptor.trimOption\" />\n }\n }\n\n <ng-template #lookupFilter>\n @if (descriptorAsLookup(); as lookup) {\n @switch (lookup.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n *mngRerender=\"isMultiselect()\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n [dataProvider]=\"lookup.dataProvider\"\n [optionsTrackProperty]=\"lookup.optionsValueProperty\"\n [optionsValueProperty]=\"lookup.optionsValueProperty\"\n [optionsLabelProperty]=\"lookup.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookup.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [autoClear]=\"lookup.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookup.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookup.autocompleteInlineSearch ?? false\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.searchToFilter' | translate\"\n [className]=\"lookup.className\"\n [dropdownClassName]=\"lookup.dropdownClassName\"\n [disabled]=\"isInputDisabled()\"\n (valueChange)=\"autocompleteFilter($event)\"\n [searchTrim]=\"metadata().descriptor.trimOption\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n *mngRerender=\"isMultiselect()\"\n [ngModel]=\"filterConstraint()?.displayValue\"\n [dataProvider]=\"lookup.dataProvider\"\n [optionsValueProperty]=\"lookup.optionsValueProperty\"\n [optionsLabelProperty]=\"lookup.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookup.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [placeholder]=\"metadata().descriptor.placeholder ?? 'mngTable.selectToFilter' | translate\"\n [className]=\"lookup.className\"\n [dropdownClassName]=\"lookup.dropdownClassName\"\n [showClear]=\"false\"\n [changeValueOnBlur]=\"isMultiselect()\"\n [disabled]=\"isInputDisabled()\"\n (valueChange)=\"dropdownFilter($event)\">\n </mng-dropdown>\n }\n }\n }\n </ng-template>\n\n @if (matchModes().length > 1) {\n <button\n #icon\n pButton\n type=\"button\"\n class=\"mng-button-xs mx-1\"\n [class.!hidden]=\"!isFilterSet()\"\n rounded=\"true\"\n severity=\"primary\"\n (click)=\"toggleMenu($event)\"\n (keydown)=\"onToggleButtonKeyDown($event)\">\n <FilterIcon pButtonIcon />\n </button>\n }\n @if (overlayVisible()) {\n <div\n class=\"p-datatable-filter-overlay\"\n (click)=\"onContentClick()\"\n [@overlayAnimation]=\"'visible'\"\n (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\"\n (@overlayAnimation.done)=\"onOverlayAnimationEnd($event)\"\n (keydown.escape)=\"onEscape()\">\n <ul class=\"p-datatable-filter-constraint-list\">\n @for (matchMode of matchModes(); track matchMode; let i = $index) {\n <li\n class=\"p-datatable-filter-constraint\"\n [class.p-datatable-filter-constraint-selected]=\"matchMode.value === filterConstraint()?.displayMatchMode\"\n (click)=\"onMatchModeChange(matchMode.value)\"\n (keydown)=\"onMatchModeKeyDown($event)\"\n (keydown.enter)=\"this.onMatchModeChange(matchMode.value)\"\n [attr.tabindex]=\"i === 0 ? '0' : null\">\n {{ matchMode.label }}\n </li>\n }\n <li class=\"p-datatable-filter-constraint-separator\"></li>\n <li class=\"p-datatable-filter-constraint\" (click)=\"onRowClearItemClick()\" (keydown)=\"onMatchModeKeyDown($event)\" (keydown.enter)=\"onRowClearItemClick()\">\n {{ noFilterLabel }}\n </li>\n </ul>\n </div>\n }\n</div>\n", styles: [".mng-column-filter-string{min-width:135px}.mng-column-filter-number{min-width:165px}.mng-column-filter-date{min-width:170px}.mng-column-filter-boolean{min-width:80px}.mng-column-filter-lookup,.mng-column-filter-lookupenum{min-width:180px}\n"] }]
1038
+ }], ctorParameters: () => [] });
1039
+
1040
+ var columnFilter_component = /*#__PURE__*/Object.freeze({
1041
+ __proto__: null,
1042
+ TableColumnFilterComponent: TableColumnFilterComponent
1043
+ });
1044
+
1045
+ class TableColumnValueComponent {
1046
+ constructor() {
1047
+ this.columnDisplayTypeString = ColumnDisplayTypeEnum.String;
1048
+ this.columnDisplayTypeNumber = ColumnDisplayTypeEnum.Number;
1049
+ this.columnDisplayTypeCurrency = ColumnDisplayTypeEnum.Currency;
1050
+ this.columnDisplayTypeBoolean = ColumnDisplayTypeEnum.Boolean;
1051
+ this.columnDisplayTypeDate = ColumnDisplayTypeEnum.Date;
1052
+ this.columnDisplayTypeEnum = ColumnDisplayTypeEnum.Enum;
1053
+ this.columnDisplayTypeComponent = ColumnDisplayTypeEnum.Component;
1054
+ this.columnDisplayTypeHtml = ColumnDisplayTypeEnum.Html;
1055
+ this.elementRef = inject(ElementRef);
1056
+ this.messageService = inject(MessageService);
1057
+ this.translate = inject(TranslateService);
1058
+ this.getterPipe = new GetterPipe();
1059
+ this.templatePipe = new TemplatePipe();
1060
+ this.jsonPathPipe = new JsonPathPipe();
1061
+ this.descriptor = input.required();
1062
+ this.item = input.required();
1063
+ this.styleMaxWidth = computed(() => this.descriptor().maxWidth ?? null);
1064
+ this.className = computed(() => {
1065
+ let className = 'nowrap';
1066
+ if (this.descriptor().columnDisplayType === ColumnDisplayTypeEnum.String && this.descriptor().isMultiline) {
1067
+ className += ' multiline';
1068
+ }
1069
+ return className;
1070
+ });
1071
+ this.value = computed(() => {
1072
+ let value = this.jsonPathPipe.transform(this.item(), `$.${this.descriptor().property}`);
1073
+ if (typeof this.descriptor().getter === 'function') {
1074
+ value = this.getterPipe.transform(value, this.descriptor().getter, this.item());
1075
+ }
1076
+ if (this.descriptor().template) {
1077
+ value = this.templatePipe.transform(value, this.descriptor().template);
1078
+ }
1079
+ return value;
1080
+ });
1081
+ this.currency = computed(() => {
1082
+ if (this.descriptor().columnDisplayType === ColumnDisplayTypeEnum.Currency) {
1083
+ return this.descriptor().currencyProperty ? this.item()[this.descriptor().currencyProperty] : (this.descriptor().currencyCode ?? 'EUR');
1084
+ }
1085
+ return;
1086
+ });
1087
+ this.hasCopyToClipboard = computed(() => this.descriptor().hasCopyToClipboard && this.value() != null);
1088
+ }
1089
+ copyToClipboard(event) {
1090
+ event.stopPropagation();
1091
+ let value = this.elementRef.nativeElement.innerText.trim();
1092
+ const clipboardValueGetter = this.descriptor().clipboardValueGetter;
1093
+ if (clipboardValueGetter) {
1094
+ value = clipboardValueGetter(this.value(), this.item());
1095
+ }
1096
+ navigator.clipboard.writeText(value);
1097
+ const title = this.translate.instant('mngTable.copyNotificationTitle');
1098
+ const message = this.translate.instant('mngTable.copyNotificationMessage', { value });
1099
+ this.messageService.add({ severity: 'info', summary: title, detail: message });
1100
+ }
1101
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableColumnValueComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1102
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.7", type: TableColumnValueComponent, isStandalone: true, selector: "mng-table-column-value", inputs: { descriptor: { classPropertyName: "descriptor", publicName: "descriptor", isSignal: true, isRequired: true, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, host: { properties: { "class": "className()", "style.max-width.px": "styleMaxWidth()" } }, ngImport: i0, template: "@if (descriptor().localizationExistsProperty && !item()[descriptor().localizationExistsProperty!]) {\n <i class=\"pi pi-exclamation-circle\" [pTooltip]=\"'mngTable.translationMissing' | translate\"></i>\n}\n@switch (descriptor().columnDisplayType) {\n @case (columnDisplayTypeString) {\n @if (descriptor().hasValueAsTooltip) {\n <span [pTooltip]=\"value()\" tooltipPosition=\"left\">{{ value() }}</span>\n } @else {\n {{ value() }}\n }\n }\n @case (columnDisplayTypeHtml) {\n <span [innerHTML]=\"value()\"></span>\n }\n @case (columnDisplayTypeNumber) {\n {{ value() | number: descriptor().displayFormat : descriptor().locale }}\n }\n @case (columnDisplayTypeCurrency) {\n {{ value() | currency: currency() : descriptor().currencyDisplay : descriptor().displayFormat : descriptor().locale }}\n }\n @case (columnDisplayTypeDate) {\n {{ value() | date: descriptor().displayFormat }}\n }\n @case (columnDisplayTypeBoolean) {\n @if (descriptor().booleanAsIcon) {\n <i [class]=\"value() | mngBoolean: descriptor().booleanYes : descriptor().booleanNo : true\"></i>\n } @else {\n {{ value() | mngBoolean: descriptor().booleanYes : descriptor().booleanNo | translate }}\n }\n }\n @case (columnDisplayTypeEnum) {\n {{ value() | mngEnum: descriptor().enum | translate }}\n }\n @case (columnDisplayTypeComponent) {\n <ng-container\n [mngComponent]=\"descriptor().customComponentType!\"\n [inputs]=\"{\n value: value(),\n item: item(),\n descriptor: descriptor()\n }\"></ng-container>\n }\n}\n@if (hasCopyToClipboard()) {\n <div class=\"help-buttons\">\n <button pButton type=\"button\" icon=\"pi pi-copy\" class=\"p-button-rounded p-button-info p-button-sm\" (click)=\"copyToClipboard($event)\"></button>\n </div>\n}\n", styles: [":host{display:inline-block;overflow:hidden}:host.nowrap{white-space:nowrap;text-overflow:ellipsis}:host.multiline{white-space:pre-wrap;word-wrap:break-word}.help-buttons{display:none;position:absolute;right:0;top:50%;transform:translateY(-50%)}.help-buttons .p-button{height:1.9rem;width:1.9rem;padding:0}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: BooleanPipe, name: "mngBoolean" }, { kind: "pipe", type: EnumPipe, name: "mngEnum" }, { kind: "directive", type: ComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "injectionToken", "inputs", "attachToHost", "parentInjector"], outputs: ["instanceCreated"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "directive", type: ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1103
+ }
1104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableColumnValueComponent, decorators: [{
1105
+ type: Component,
1106
+ args: [{ selector: 'mng-table-column-value', imports: [TranslateModule, BooleanPipe, EnumPipe, ComponentDirective, DecimalPipe, CurrencyPipe, DatePipe, ButtonDirective, Tooltip], changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class]': 'className()', '[style.max-width.px]': 'styleMaxWidth()' }, template: "@if (descriptor().localizationExistsProperty && !item()[descriptor().localizationExistsProperty!]) {\n <i class=\"pi pi-exclamation-circle\" [pTooltip]=\"'mngTable.translationMissing' | translate\"></i>\n}\n@switch (descriptor().columnDisplayType) {\n @case (columnDisplayTypeString) {\n @if (descriptor().hasValueAsTooltip) {\n <span [pTooltip]=\"value()\" tooltipPosition=\"left\">{{ value() }}</span>\n } @else {\n {{ value() }}\n }\n }\n @case (columnDisplayTypeHtml) {\n <span [innerHTML]=\"value()\"></span>\n }\n @case (columnDisplayTypeNumber) {\n {{ value() | number: descriptor().displayFormat : descriptor().locale }}\n }\n @case (columnDisplayTypeCurrency) {\n {{ value() | currency: currency() : descriptor().currencyDisplay : descriptor().displayFormat : descriptor().locale }}\n }\n @case (columnDisplayTypeDate) {\n {{ value() | date: descriptor().displayFormat }}\n }\n @case (columnDisplayTypeBoolean) {\n @if (descriptor().booleanAsIcon) {\n <i [class]=\"value() | mngBoolean: descriptor().booleanYes : descriptor().booleanNo : true\"></i>\n } @else {\n {{ value() | mngBoolean: descriptor().booleanYes : descriptor().booleanNo | translate }}\n }\n }\n @case (columnDisplayTypeEnum) {\n {{ value() | mngEnum: descriptor().enum | translate }}\n }\n @case (columnDisplayTypeComponent) {\n <ng-container\n [mngComponent]=\"descriptor().customComponentType!\"\n [inputs]=\"{\n value: value(),\n item: item(),\n descriptor: descriptor()\n }\"></ng-container>\n }\n}\n@if (hasCopyToClipboard()) {\n <div class=\"help-buttons\">\n <button pButton type=\"button\" icon=\"pi pi-copy\" class=\"p-button-rounded p-button-info p-button-sm\" (click)=\"copyToClipboard($event)\"></button>\n </div>\n}\n", styles: [":host{display:inline-block;overflow:hidden}:host.nowrap{white-space:nowrap;text-overflow:ellipsis}:host.multiline{white-space:pre-wrap;word-wrap:break-word}.help-buttons{display:none;position:absolute;right:0;top:50%;transform:translateY(-50%)}.help-buttons .p-button{height:1.9rem;width:1.9rem;padding:0}\n"] }]
1107
+ }] });
1108
+
1109
+ class FilterValuePipe {
1110
+ constructor() {
1111
+ this.locale = inject(LOCALE_ID);
1112
+ this.translate = inject(TranslateService);
1113
+ this.enumPipe = new EnumPipe();
1114
+ this.subject = new ReplaySubject(1);
1115
+ }
1116
+ transform(value, descriptor) {
1117
+ const valTransform = this.prepareValueTransform(value, descriptor);
1118
+ this.subscription?.unsubscribe();
1119
+ if (valTransform.translate) {
1120
+ this.subscription = this.translate.stream(valTransform.valueArr).subscribe(i18n => {
1121
+ this.subject.next(valTransform.valueArr.map(k => i18n[k]).join(', '));
1122
+ });
1123
+ }
1124
+ else {
1125
+ this.subject.next(valTransform.valueArr.join(', '));
1126
+ }
1127
+ return this.subject.asObservable();
1128
+ }
1129
+ /**
1130
+ * If returns a string, this represents i18n key that must go through translation. If translation is not needed, undefined is returned.
1131
+ */
1132
+ prepareValueTransform(value, descriptor) {
1133
+ const result = {
1134
+ translate: false,
1135
+ valueArr: Array.isArray(value) ? value : [value]
1136
+ };
1137
+ switch (descriptor?.filterType) {
1138
+ case FilterTypeEnum.Date:
1139
+ // eslint-disable-next-line no-case-declarations
1140
+ const datePipe = new DatePipe(this.locale);
1141
+ result.valueArr = result.valueArr.map(v => datePipe.transform(v, descriptor.displayFormat, descriptor.locale));
1142
+ break;
1143
+ case FilterTypeEnum.Number:
1144
+ // eslint-disable-next-line no-case-declarations
1145
+ const decimalPipe = new DecimalPipe(this.locale);
1146
+ result.valueArr = result.valueArr.map(v => decimalPipe.transform(v, descriptor.displayFormat, descriptor.locale));
1147
+ break;
1148
+ case FilterTypeEnum.Boolean:
1149
+ // eslint-disable-next-line no-case-declarations
1150
+ const booleanPipe = new BooleanPipe();
1151
+ result.valueArr = result.valueArr.map(v => booleanPipe.transform(v));
1152
+ result.translate = true;
1153
+ break;
1154
+ case FilterTypeEnum.LookupEnum:
1155
+ // eslint-disable-next-line no-case-declarations
1156
+ const enumPipe = new EnumPipe();
1157
+ result.valueArr = result.valueArr.map(v => enumPipe.transform(v, descriptor.enum));
1158
+ result.translate = true;
1159
+ break;
1160
+ }
1161
+ return result;
1162
+ }
1163
+ ngOnDestroy() {
1164
+ this.subscription?.unsubscribe();
1165
+ this.subject.complete();
1166
+ }
1167
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: FilterValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
1168
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.7", ngImport: i0, type: FilterValuePipe, isStandalone: true, name: "mngFilterValue" }); }
1169
+ }
1170
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: FilterValuePipe, decorators: [{
1171
+ type: Pipe,
1172
+ args: [{
1173
+ name: 'mngFilterValue',
1174
+ pure: true
1175
+ }]
1176
+ }] });
1177
+
1178
+ class TableFilterActiveTagComponent {
1179
+ constructor() {
1180
+ this.FilterMatchMode = FilterMatchMode;
1181
+ this.model = input.required();
1182
+ this.filter = input.required();
1183
+ this.edit = output();
1184
+ this.remove = output();
1185
+ this.label = computed(() => this.getPropertyLabelKey(this.filter().metadata.descriptor));
1186
+ this.matchMode = computed(() => this.filter().displayMatchMode);
1187
+ this.matchModeSymbol = computed(() => `mngFilterActiveTag.matchMode.${this.matchMode()}`);
1188
+ this.value = computed(() => this.filter().displayValue);
1189
+ }
1190
+ onRemove(event) {
1191
+ event.stopPropagation();
1192
+ this.remove.emit({
1193
+ filter: this.filter(),
1194
+ event: event
1195
+ });
1196
+ }
1197
+ onEdit(event) {
1198
+ this.edit.emit({
1199
+ filter: this.filter(),
1200
+ event: event
1201
+ });
1202
+ }
1203
+ getPropertyLabelKey(filterDescriptor) {
1204
+ if (filterDescriptor.isGenericFilter) {
1205
+ return filterDescriptor.property;
1206
+ }
1207
+ let labelKey;
1208
+ if (filterDescriptor.title !== undefined && !filterDescriptor.titleUseModelBase) {
1209
+ labelKey = filterDescriptor.title;
1210
+ }
1211
+ else {
1212
+ labelKey = getI18nTypePropertyKey(this.model().i18nBaseKey, filterDescriptor.title ?? filterDescriptor.property);
1213
+ }
1214
+ return labelKey;
1215
+ }
1216
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableFilterActiveTagComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1217
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.7", type: TableFilterActiveTagComponent, isStandalone: true, selector: "mng-table-filter-active-tag", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { edit: "edit", remove: "remove" }, ngImport: i0, template: "<p-tag severity=\"secondary\" styleClass=\"mr-1 mng-tag-outlined\">\n <div class=\"flex items-center gap-2 p-1 cursor-pointer\" (click)=\"onEdit($event)\">\n <span>{{ label() | translate }}</span>\n @if (matchMode() === FilterMatchMode.Between) {\n <span class=\"font-semibold\">{{ value()?.[0] | mngFilterValue: filter().metadata.descriptor | async }}</span>\n <span class=\"text-primary\">{{ matchModeSymbol() | translate }}</span>\n <span class=\"font-semibold\">{{ value()?.[1] | mngFilterValue: filter().metadata.descriptor | async }}</span>\n } @else {\n <span class=\"text-primary\">{{ matchModeSymbol() | translate }}</span>\n <span class=\"font-semibold\">{{ value() | mngFilterValue: filter().metadata.descriptor | async }}</span>\n @if (filter().caseSensitive) {\n <small class=\"border-solid border rounded px-1 text-primary-400\">Aa</small>\n }\n }\n <span class=\"pi pi-times text-xs\" (click)=\"onRemove($event)\"></span>\n </div>\n</p-tag>\n", styles: ["mng-table-filter-active-tag.p-tag.p-tag-secondary.mng-tag-outlined{background-color:unset;border:1px solid var(--mng-tag-secondary-outlined-border)}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: FilterValuePipe, name: "mngFilterValue" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1218
+ }
1219
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableFilterActiveTagComponent, decorators: [{
1220
+ type: Component,
1221
+ args: [{ selector: 'mng-table-filter-active-tag', imports: [TranslateModule, FilterValuePipe, AsyncPipe, Tag], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<p-tag severity=\"secondary\" styleClass=\"mr-1 mng-tag-outlined\">\n <div class=\"flex items-center gap-2 p-1 cursor-pointer\" (click)=\"onEdit($event)\">\n <span>{{ label() | translate }}</span>\n @if (matchMode() === FilterMatchMode.Between) {\n <span class=\"font-semibold\">{{ value()?.[0] | mngFilterValue: filter().metadata.descriptor | async }}</span>\n <span class=\"text-primary\">{{ matchModeSymbol() | translate }}</span>\n <span class=\"font-semibold\">{{ value()?.[1] | mngFilterValue: filter().metadata.descriptor | async }}</span>\n } @else {\n <span class=\"text-primary\">{{ matchModeSymbol() | translate }}</span>\n <span class=\"font-semibold\">{{ value() | mngFilterValue: filter().metadata.descriptor | async }}</span>\n @if (filter().caseSensitive) {\n <small class=\"border-solid border rounded px-1 text-primary-400\">Aa</small>\n }\n }\n <span class=\"pi pi-times text-xs\" (click)=\"onRemove($event)\"></span>\n </div>\n</p-tag>\n", styles: ["mng-table-filter-active-tag.p-tag.p-tag-secondary.mng-tag-outlined{background-color:unset;border:1px solid var(--mng-tag-secondary-outlined-border)}\n"] }]
1222
+ }] });
1223
+
1224
+ class TableFilterFormComponent {
1225
+ constructor() {
1226
+ this.lookupTypeDropdown = FilterLookupTypeEnum.Dropdown;
1227
+ this.lookupTypeAutocomplete = FilterLookupTypeEnum.Autocomplete;
1228
+ this.FilterTypeEnum = FilterTypeEnum;
1229
+ this.FilterMatchMode = FilterMatchMode;
1230
+ this.elementRef = inject(ElementRef);
1231
+ this.translate = inject(TranslateService);
1232
+ this.title = input();
1233
+ this.metadata = input.required();
1234
+ this.genericDescriptor = input();
1235
+ this.model = input.required();
1236
+ this.filter = input();
1237
+ this.overlay = input();
1238
+ this.disabledProperties = input([]);
1239
+ this.enableCaseSensitive = input(true);
1240
+ this.propertySearch = input(false, { transform: booleanAttribute });
1241
+ this.apply = output();
1242
+ this.propertyOptionsWithTranslations = computed(() => {
1243
+ const disabledProperties = this.disabledProperties();
1244
+ const filter = this.filter();
1245
+ return (this.metadata()?.map(d => {
1246
+ return {
1247
+ property: d.descriptor.property,
1248
+ label: d.descriptor.isGenericFilter ? d.descriptor.property : this.getPropertyLabelKey(d.descriptor),
1249
+ disabled: !filter && disabledProperties.includes(d.descriptor.property)
1250
+ };
1251
+ }) ?? []);
1252
+ });
1253
+ this.selectedFilterMetadata = computed(() => {
1254
+ const property = this.propertyModel();
1255
+ return this.metadata().find(d => d.descriptor.property === property);
1256
+ });
1257
+ // change value lookup function to include the property name of the generic filter
1258
+ this.genericValueDataProvider = computed(() => {
1259
+ const genericValueProvider = this.genericDescriptor()?.valueLookup;
1260
+ if (genericValueProvider && genericValueProvider.serviceType) {
1261
+ const lookupFn = genericValueProvider.lookup;
1262
+ return lookupDataProvider({ service: genericValueProvider.serviceType }).withLookup((params, service, search) => {
1263
+ params = {
1264
+ ...params,
1265
+ filters: {
1266
+ ...params?.filters,
1267
+ field: {
1268
+ value: this.selectedFilterMetadata()?.descriptor.property,
1269
+ matchMode: this.selectedFilterMetadata()?.descriptor.filterType === FilterTypeEnum.LookupEnum ? FilterMatchMode.In : FilterMatchMode.StartsWith
1270
+ }
1271
+ }
1272
+ };
1273
+ return lookupFn(params, service, search);
1274
+ });
1275
+ }
1276
+ return;
1277
+ });
1278
+ this.selectedDescriptorAsLookup = computed(() => {
1279
+ const filterDescriptor = this.selectedFilterMetadata()?.descriptor;
1280
+ return filterDescriptor !== undefined &&
1281
+ !filterDescriptor.isGenericFilter &&
1282
+ (filterDescriptor.filterType === FilterTypeEnum.Lookup || filterDescriptor.filterType === FilterTypeEnum.LookupEnum)
1283
+ ? filterDescriptor
1284
+ : undefined;
1285
+ });
1286
+ this.isEdit = computed(() => this.filter() != null);
1287
+ this.formSubmitted = signal(false);
1288
+ this.formErrorMessage = signal([]);
1289
+ // UI utilities
1290
+ this.filterForm = viewChild.required('filterForm');
1291
+ // Filter form model and form utilities
1292
+ this.propertyModel = signal(null);
1293
+ this.matchModeModel = signal(null);
1294
+ this.valueModel = signal(null);
1295
+ this.caseSensitiveModel = signal(false);
1296
+ this.isMultiselect = computed(() => this.matchModeModel() === FilterMatchMode.In || this.matchModeModel() === FilterMatchMode.NotIn);
1297
+ effectWithDeps([this.filter], ([edit]) => {
1298
+ if (edit) {
1299
+ this.resetForm({
1300
+ property: edit.metadata.descriptor.property,
1301
+ matchMode: edit.displayMatchMode ?? edit.matchMode ?? null,
1302
+ value: edit.displayValue ?? edit.value,
1303
+ caseSensitive: edit.caseSensitive ?? false
1304
+ });
1305
+ }
1306
+ else {
1307
+ this.resetForm();
1308
+ }
1309
+ });
1310
+ effectWithDeps([this.selectedFilterMetadata], ([selectedFilterMetadata]) => {
1311
+ const descriptor = selectedFilterMetadata?.descriptor;
1312
+ const value = this.valueModel();
1313
+ if (value != null) {
1314
+ // reset value if filter type and value type mismatch
1315
+ if ((descriptor?.filterType === FilterTypeEnum.String && (value === true || value === false || value === 'true' || value === 'false' || value instanceof Date)) ||
1316
+ (descriptor?.filterType === FilterTypeEnum.Number && typeof value !== 'number' && isNaN(+value)) ||
1317
+ (descriptor?.filterType === FilterTypeEnum.Date && !(value instanceof Date)) ||
1318
+ descriptor?.filterType === FilterTypeEnum.Lookup ||
1319
+ descriptor?.filterType === FilterTypeEnum.LookupEnum) {
1320
+ this.valueModel.set(null);
1321
+ }
1322
+ else if (descriptor?.filterType === FilterTypeEnum.Boolean && typeof value !== 'boolean') {
1323
+ this.valueModel.set(false);
1324
+ }
1325
+ }
1326
+ const matchModeOptions = selectedFilterMetadata?.matchModes ?? [];
1327
+ const matchMode = this.matchModeModel();
1328
+ const filterForm = this.filterForm();
1329
+ if (matchModeOptions.length > 0 &&
1330
+ (!matchMode || filterForm.controls['matchMode']?.pristine || filterForm.controls['matchMode']?.untouched || !matchModeOptions.find(o => o.value === matchMode))) {
1331
+ this.matchModeModel.set(filterGetDefaultMatchMode(this.selectedFilterMetadata()?.descriptor, matchModeOptions));
1332
+ }
1333
+ });
1334
+ effectWithDeps([this.matchModeModel], ([matchModeModel]) => this.valueModel.set(filterAdjustDisplayValueOnMatchModeChange(matchModeModel ?? undefined, this.valueModel())));
1335
+ toObservable(this.overlay)
1336
+ .pipe(switchMap(o => (o ? o.onShow : NEVER)), takeUntilDestroyed())
1337
+ .subscribe(() => {
1338
+ const formFields = this.elementRef.nativeElement.querySelectorAll('input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [role="combobox"]:not([disabled])');
1339
+ const activeEl = document.activeElement;
1340
+ const activeInputIdx = activeEl ? [...formFields].findIndex(el => activeEl.isEqualNode(el)) : 0;
1341
+ if (activeInputIdx <= 0) {
1342
+ formFields[0].focus();
1343
+ }
1344
+ });
1345
+ }
1346
+ onFormSubmit(form) {
1347
+ this.formSubmitted.set(true);
1348
+ // mark all as dirty
1349
+ for (const key in form.controls) {
1350
+ form.controls[key].markAsDirty();
1351
+ }
1352
+ const property = this.propertyModel();
1353
+ const matchMode = this.matchModeModel();
1354
+ if (form.invalid || !property || !matchMode) {
1355
+ this.formErrorMessage.set([
1356
+ {
1357
+ severity: 'warn',
1358
+ summary: this.translate.instant('mngFilter.messages.invalidFormTitle'),
1359
+ detail: this.translate.instant('mngFilter.messages.invalidFormMessage')
1360
+ }
1361
+ ]);
1362
+ return;
1363
+ }
1364
+ this.apply.emit({
1365
+ property: property,
1366
+ matchMode: matchMode,
1367
+ value: this.valueModel(),
1368
+ caseSensitive: this.caseSensitiveModel()
1369
+ });
1370
+ // resetting the form is done from the parent component (filter-overlay-with-tag) for smoother animations
1371
+ }
1372
+ resetForm(value) {
1373
+ this.filterForm().resetForm(value);
1374
+ // somehow have to set case sensitivity manually
1375
+ this.caseSensitiveModel.set(value?.caseSensitive ?? false);
1376
+ this.formSubmitted.set(false);
1377
+ }
1378
+ getPropertyLabelKey(filterDescriptor) {
1379
+ let labelKey;
1380
+ if (filterDescriptor.title !== undefined && !filterDescriptor.titleUseModelBase) {
1381
+ labelKey = filterDescriptor.title;
1382
+ }
1383
+ else {
1384
+ labelKey = getI18nTypePropertyKey(this.model().i18nBaseKey, filterDescriptor.title ?? filterDescriptor.property);
1385
+ }
1386
+ return labelKey;
1387
+ }
1388
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableFilterFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1389
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.7", type: TableFilterFormComponent, isStandalone: true, selector: "mng-table-filter-form", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: true, transformFunction: null }, genericDescriptor: { classPropertyName: "genericDescriptor", publicName: "genericDescriptor", isSignal: true, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, overlay: { classPropertyName: "overlay", publicName: "overlay", isSignal: true, isRequired: false, transformFunction: null }, disabledProperties: { classPropertyName: "disabledProperties", publicName: "disabledProperties", isSignal: true, isRequired: false, transformFunction: null }, enableCaseSensitive: { classPropertyName: "enableCaseSensitive", publicName: "enableCaseSensitive", isSignal: true, isRequired: false, transformFunction: null }, propertySearch: { classPropertyName: "propertySearch", publicName: "propertySearch", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { apply: "apply" }, host: { classAttribute: "flex grow" }, viewQueries: [{ propertyName: "filterForm", first: true, predicate: ["filterForm"], descendants: true, isSignal: true }], ngImport: i0, template: "<div>\n <div>\n <h5>{{ filter() ? ('mngFilter.titleEdit' | translate) : ('mngFilter.titleAdd' | translate) }}</h5>\n </div>\n <form #filterForm=\"ngForm\" (ngSubmit)=\"onFormSubmit(filterForm)\" class=\"flex flex-col items-center lg:flex-row gap-4\">\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"property\"\n id=\"property\"\n tabindex=\"1\"\n #propertyControl=\"ngModel\"\n [(ngModel)]=\"propertyModel\"\n [options]=\"propertyOptionsWithTranslations()\"\n optionsValueProperty=\"property\"\n optionsDisabledProperty=\"disabled\"\n optionsLabelProperty=\"label\"\n [placeholder]=\"'mngFilter.property' | translate\"\n [optionsLabelTranslate]=\"!propertySearch()\"\n [inlineSearch]=\"propertySearch()\"\n required=\"true\"\n className=\"w-full\"\n [disabled]=\"isEdit()\"\n [appendTo]=\"null\" />\n </div>\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"matchMode\"\n id=\"matchMode\"\n [(ngModel)]=\"matchModeModel\"\n className=\"w-full\"\n [options]=\"selectedFilterMetadata()?.matchModes ?? []\"\n [placeholder]=\"'mngFilter.matchMode' | translate\"\n [disabled]=\"!propertyControl.value\"\n class=\"self-end\"\n required=\"true\"\n [appendTo]=\"null\" />\n </div>\n @if (!(matchModeModel() === FilterMatchMode.Exists || matchModeModel() === FilterMatchMode.DoesNotExist)) {\n <div class=\"w-full lg:w-auto flex flex-col\">\n @switch (selectedFilterMetadata()?.descriptor?.filterType) {\n @case (FilterTypeEnum.Number) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-number-range\n className=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedFilterMetadata()?.descriptor?.numberUseGrouping ?? false\"\n [minFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMax\"\n required=\"true\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedFilterMetadata()?.descriptor?.numberUseGrouping\"\n [minFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMax\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [(ngModel)]=\"valueModel\" [disabled]=\"!matchModeModel()\" name=\"value\" binary=\"true\" required=\"true\" />\n }\n @case (FilterTypeEnum.Date) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-date-range\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [showTime]=\"selectedFilterMetadata()?.dateConfig?.showTime ?? false\"\n [showSeconds]=\"selectedFilterMetadata()?.dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"selectedFilterMetadata()?.dateConfig?.format\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\"></mng-date-range>\n } @else {\n <p-date-picker\n appendTo=\"body\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"selectedFilterMetadata()?.dateConfig?.showTime ?? false\"\n [showSeconds]=\"selectedFilterMetadata()?.dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"selectedFilterMetadata()?.dateConfig?.format\"\n [firstDayOfWeek]=\"1\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </p-date-picker>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @default {\n @if (selectedFilterMetadata()?.descriptor?.genericValueProvider && genericValueDataProvider()) {\n <div class=\"flex\">\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [className]=\"selectedFilterMetadata()?.descriptor?.className + ' ' + (enableCaseSensitive() ? '!rounded-r-none' : '')\"\n [dropdownClassName]=\"selectedFilterMetadata()?.descriptor?.dropdownClassName\"\n [placeholder]=\"valueModel() ? undefined : ('mngFilter.value' | translate)\"\n allowInput=\"true\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\" />\n @if (enableCaseSensitive()) {\n <p-toggle-button\n [(ngModel)]=\"caseSensitiveModel\"\n [disabled]=\"!matchModeModel()\"\n name=\"caseSensitive\"\n styleClass=\"mng-button-xs mng-toggle-button-addon-right\"\n onLabel=\"Aa\"\n offLabel=\"Aa\" />\n }\n </div>\n } @else {\n <div class=\"flex\">\n <input\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input w-full\"\n [class.!rounded-r-none]=\"enableCaseSensitive()\"\n [attr.placeholder]=\"'mngFilter.value' | translate\"\n [mngInputTrim]=\"selectedFilterMetadata()?.descriptor?.trimOption\"\n [disabled]=\"!matchModeModel()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\" />\n @if (enableCaseSensitive()) {\n <p-toggle-button\n [(ngModel)]=\"caseSensitiveModel\"\n [disabled]=\"!matchModeModel()\"\n name=\"caseSensitive\"\n styleClass=\"mng-button-xs mng-toggle-button-addon-right\"\n onLabel=\"Aa\"\n offLabel=\"Aa\" />\n }\n </div>\n }\n }\n }\n <ng-template #lookupFilter>\n @if (selectedDescriptorAsLookup(); as lookupFilterDescriptor) {\n @switch (lookupFilterDescriptor.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsTrackProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [autoClear]=\"lookupFilterDescriptor.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookupFilterDescriptor.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookupFilterDescriptor.autocompleteInlineSearch ?? false\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n [searchTrim]=\"selectedFilterMetadata()?.descriptor?.trimOption\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className + ' w-full'\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n }\n } @else if (selectedFilterMetadata()?.descriptor?.isGenericFilter && genericValueDataProvider()) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n </ng-template>\n </div>\n }\n <div class=\"flex justify-end\">\n <button pButton type=\"submit\" class=\"self-end\">\n {{ (filter() ? 'general.apply' : 'general.add') | translate }}\n </button>\n </div>\n </form>\n @if (formSubmitted() && filterForm.invalid) {\n @for (message of formErrorMessage(); track message) {\n <p-message [severity]=\"message.severity\" [text]=\"message.detail\" [icon]=\"message.icon\" styleClass=\"mt-2\" />\n }\n }\n</div>\n", styles: ["::ng-deep .mng-toggle-button-addon-right button,::ng-deep .mng-toggle-button-addon-right button.p-togglebutton-checked{border-color:var(--p-select-border-color)!important;border-left:none!important;border-top-left-radius:0!important;border-bottom-left-radius:0!important}\n"], dependencies: [{ kind: "component", type: DropdownComponent, selector: "mng-dropdown", inputs: ["dataProvider", "options", "optionsTrackProperty", "optionsLabelProperty", "optionsLabelTranslate", "optionsValueProperty", "optionsDisabledProperty", "multiselect", "placeholder", "showClear", "selectFirstItem", "className", "dropdownClassName", "changeValueOnBlur", "loading", "disabled", "allowInput", "appendTo", "inlineSearch", "searchTrim"], outputs: ["valueChange", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: InputTrimDirective, selector: "[mngInputTrim]", inputs: ["mngInputTrim"] }, { kind: "component", type: NumberRangeComponent, selector: "mng-number-range", inputs: ["placeholder", "useGrouping", "minFractionDigits", "maxFractionDigits", "required", "disabled", "vertical"], outputs: ["keyDown"] }, { kind: "component", type: InputNumber, selector: "p-inputNumber, p-inputnumber, p-input-number", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled", "fluid"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: DateRangeComponent, selector: "mng-date-range", inputs: ["placeholder", "showTime", "showSeconds", "dateFormat", "className", "required", "disabled", "vertical"] }, { kind: "component", type: AutocompleteComponent, selector: "mng-autocomplete", inputs: ["dataProvider", "optionsTrackProperty", "optionsValueProperty", "optionsLabelProperty", "optionsLabelTranslate", "inlineSearch", "openOnFocus", "multiselect", "placeholder", "className", "dropdownClassName", "showClear", "autoClear", "selectFirst", "searchTrim", "disabled"], outputs: ["valueChange", "blur"] }, { kind: "component", type: Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["value", "name", "disabled", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "inputStyle", "styleClass", "inputClass", "indeterminate", "size", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "component", type: Message, selector: "p-message", inputs: ["severity", "text", "escape", "style", "styleClass", "closable", "icon", "closeIcon", "life", "showTransitionOptions", "hideTransitionOptions", "size", "variant"], outputs: ["onClose"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ToggleButton, selector: "p-toggleButton, p-togglebutton, p-toggle-button", inputs: ["onLabel", "offLabel", "onIcon", "offIcon", "ariaLabel", "ariaLabelledBy", "disabled", "style", "styleClass", "inputId", "tabindex", "size", "iconPos", "autofocus", "allowEmpty"], outputs: ["onChange"] }, { kind: "component", type: DatePicker, selector: "p-datePicker, p-datepicker, p-date-picker", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "size", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1390
+ }
1391
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableFilterFormComponent, decorators: [{
1392
+ type: Component,
1393
+ args: [{ selector: 'mng-table-filter-form', imports: [
1394
+ DropdownComponent,
1395
+ FormsModule,
1396
+ TranslateModule,
1397
+ InputTrimDirective,
1398
+ NumberRangeComponent,
1399
+ InputNumber,
1400
+ DateRangeComponent,
1401
+ AutocompleteComponent,
1402
+ Checkbox,
1403
+ Message,
1404
+ InputText,
1405
+ NgTemplateOutlet,
1406
+ ToggleButton,
1407
+ DatePicker,
1408
+ ButtonDirective
1409
+ ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
1410
+ class: 'flex grow'
1411
+ }, template: "<div>\n <div>\n <h5>{{ filter() ? ('mngFilter.titleEdit' | translate) : ('mngFilter.titleAdd' | translate) }}</h5>\n </div>\n <form #filterForm=\"ngForm\" (ngSubmit)=\"onFormSubmit(filterForm)\" class=\"flex flex-col items-center lg:flex-row gap-4\">\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"property\"\n id=\"property\"\n tabindex=\"1\"\n #propertyControl=\"ngModel\"\n [(ngModel)]=\"propertyModel\"\n [options]=\"propertyOptionsWithTranslations()\"\n optionsValueProperty=\"property\"\n optionsDisabledProperty=\"disabled\"\n optionsLabelProperty=\"label\"\n [placeholder]=\"'mngFilter.property' | translate\"\n [optionsLabelTranslate]=\"!propertySearch()\"\n [inlineSearch]=\"propertySearch()\"\n required=\"true\"\n className=\"w-full\"\n [disabled]=\"isEdit()\"\n [appendTo]=\"null\" />\n </div>\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"matchMode\"\n id=\"matchMode\"\n [(ngModel)]=\"matchModeModel\"\n className=\"w-full\"\n [options]=\"selectedFilterMetadata()?.matchModes ?? []\"\n [placeholder]=\"'mngFilter.matchMode' | translate\"\n [disabled]=\"!propertyControl.value\"\n class=\"self-end\"\n required=\"true\"\n [appendTo]=\"null\" />\n </div>\n @if (!(matchModeModel() === FilterMatchMode.Exists || matchModeModel() === FilterMatchMode.DoesNotExist)) {\n <div class=\"w-full lg:w-auto flex flex-col\">\n @switch (selectedFilterMetadata()?.descriptor?.filterType) {\n @case (FilterTypeEnum.Number) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-number-range\n className=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedFilterMetadata()?.descriptor?.numberUseGrouping ?? false\"\n [minFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMax\"\n required=\"true\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedFilterMetadata()?.descriptor?.numberUseGrouping\"\n [minFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMax\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [(ngModel)]=\"valueModel\" [disabled]=\"!matchModeModel()\" name=\"value\" binary=\"true\" required=\"true\" />\n }\n @case (FilterTypeEnum.Date) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-date-range\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [showTime]=\"selectedFilterMetadata()?.dateConfig?.showTime ?? false\"\n [showSeconds]=\"selectedFilterMetadata()?.dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"selectedFilterMetadata()?.dateConfig?.format\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\"></mng-date-range>\n } @else {\n <p-date-picker\n appendTo=\"body\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"selectedFilterMetadata()?.dateConfig?.showTime ?? false\"\n [showSeconds]=\"selectedFilterMetadata()?.dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"selectedFilterMetadata()?.dateConfig?.format\"\n [firstDayOfWeek]=\"1\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </p-date-picker>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @default {\n @if (selectedFilterMetadata()?.descriptor?.genericValueProvider && genericValueDataProvider()) {\n <div class=\"flex\">\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [className]=\"selectedFilterMetadata()?.descriptor?.className + ' ' + (enableCaseSensitive() ? '!rounded-r-none' : '')\"\n [dropdownClassName]=\"selectedFilterMetadata()?.descriptor?.dropdownClassName\"\n [placeholder]=\"valueModel() ? undefined : ('mngFilter.value' | translate)\"\n allowInput=\"true\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\" />\n @if (enableCaseSensitive()) {\n <p-toggle-button\n [(ngModel)]=\"caseSensitiveModel\"\n [disabled]=\"!matchModeModel()\"\n name=\"caseSensitive\"\n styleClass=\"mng-button-xs mng-toggle-button-addon-right\"\n onLabel=\"Aa\"\n offLabel=\"Aa\" />\n }\n </div>\n } @else {\n <div class=\"flex\">\n <input\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input w-full\"\n [class.!rounded-r-none]=\"enableCaseSensitive()\"\n [attr.placeholder]=\"'mngFilter.value' | translate\"\n [mngInputTrim]=\"selectedFilterMetadata()?.descriptor?.trimOption\"\n [disabled]=\"!matchModeModel()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\" />\n @if (enableCaseSensitive()) {\n <p-toggle-button\n [(ngModel)]=\"caseSensitiveModel\"\n [disabled]=\"!matchModeModel()\"\n name=\"caseSensitive\"\n styleClass=\"mng-button-xs mng-toggle-button-addon-right\"\n onLabel=\"Aa\"\n offLabel=\"Aa\" />\n }\n </div>\n }\n }\n }\n <ng-template #lookupFilter>\n @if (selectedDescriptorAsLookup(); as lookupFilterDescriptor) {\n @switch (lookupFilterDescriptor.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsTrackProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [autoClear]=\"lookupFilterDescriptor.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookupFilterDescriptor.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookupFilterDescriptor.autocompleteInlineSearch ?? false\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n [searchTrim]=\"selectedFilterMetadata()?.descriptor?.trimOption\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className + ' w-full'\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n }\n } @else if (selectedFilterMetadata()?.descriptor?.isGenericFilter && genericValueDataProvider()) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n </ng-template>\n </div>\n }\n <div class=\"flex justify-end\">\n <button pButton type=\"submit\" class=\"self-end\">\n {{ (filter() ? 'general.apply' : 'general.add') | translate }}\n </button>\n </div>\n </form>\n @if (formSubmitted() && filterForm.invalid) {\n @for (message of formErrorMessage(); track message) {\n <p-message [severity]=\"message.severity\" [text]=\"message.detail\" [icon]=\"message.icon\" styleClass=\"mt-2\" />\n }\n }\n</div>\n", styles: ["::ng-deep .mng-toggle-button-addon-right button,::ng-deep .mng-toggle-button-addon-right button.p-togglebutton-checked{border-color:var(--p-select-border-color)!important;border-left:none!important;border-top-left-radius:0!important;border-bottom-left-radius:0!important}\n"] }]
1412
+ }], ctorParameters: () => [] });
1413
+
1414
+ class TableFilterOverlayWithTagComponent {
1415
+ static { this.SEARCH_WORD_LIMIT_MAX = 4; }
1416
+ constructor() {
1417
+ this.primeTable = inject(Table);
1418
+ this.tableData = inject((TableDataService));
1419
+ this.tableConfig = inject(COMMONS_TABLE_FEATURE_CONFIG_IT, { optional: true });
1420
+ this.metadata = input.required();
1421
+ this.genericFilterDescriptor = input();
1422
+ this.model = input.required();
1423
+ this.enableSearch = input(false, { transform: booleanAttribute });
1424
+ this.search = input();
1425
+ this.searchLimitWordMax = input(undefined);
1426
+ this.enableCaseSensitive = input(true, { transform: booleanAttribute });
1427
+ this.filterOverlay = viewChild.required(Popover);
1428
+ this.filterFormComponent = viewChild(TableFilterFormComponent);
1429
+ this.templates = contentChildren(TemplateDirective);
1430
+ this.titleTemplate = computed(() => findTemplateByName([...this.templates()], 'title'));
1431
+ this.filters = computed(() => {
1432
+ return this.getInitialFilters(this.tableData.filterMeta(), this.metadata());
1433
+ });
1434
+ this.showFilterButton = computed(() => this.metadata().length > 0);
1435
+ this.activeFilters = computed(() => {
1436
+ const filterEntry = this.filters();
1437
+ return this.metadata()
1438
+ .filter(d => {
1439
+ const filter = filterEntry[d.descriptor.property];
1440
+ return (filter &&
1441
+ filter.matchMode !== undefined &&
1442
+ filter.displayMatchMode !== undefined &&
1443
+ (filter.matchMode === FilterMatchMode.Exists ||
1444
+ filter.matchMode === FilterMatchMode.DoesNotExist ||
1445
+ (filter.value !== undefined && filter.displayValue !== undefined)));
1446
+ })
1447
+ .map(d => filterEntry[d.descriptor.property]);
1448
+ });
1449
+ this.activeFilterProperties = computed(() => this.activeFilters().map(f => f.metadata.descriptor.property));
1450
+ this.filterEdit = signal(undefined);
1451
+ // global search model
1452
+ this.searchValue = computed(() => this.search()?.value);
1453
+ this.searchCaseSensitive = computed(() => this.search()?.caseSensitive);
1454
+ this.searchWordLimitMaxError = signal(false);
1455
+ this.searchWordLimitMaxCmp = computed(() => {
1456
+ const inputLimit = this.searchLimitWordMax();
1457
+ if (inputLimit !== undefined) {
1458
+ return inputLimit;
1459
+ }
1460
+ return this.tableConfig?.searchLimitMaxWords !== undefined ? this.tableConfig?.searchLimitMaxWords : TableFilterOverlayWithTagComponent.SEARCH_WORD_LIMIT_MAX;
1461
+ });
1462
+ this.searchValueSubject = new BehaviorSubject(undefined);
1463
+ this.searchCaseSensitiveSubject = new BehaviorSubject(undefined);
1464
+ // UI utilities
1465
+ this.clickedOnFilterEvent = undefined;
1466
+ combineLatest([this.searchValueSubject.pipe(debounceTime(500), distinctUntilChanged()), this.searchCaseSensitiveSubject])
1467
+ // NOTE: skip is used to ignore propagating the initial value of the subjects
1468
+ .pipe(skip(1), takeUntilDestroyed())
1469
+ .subscribe(([value, caseSensitive]) => {
1470
+ this.updatePrimeTableGlobalFilter(value == null ? (this.search()?.value ?? '') : value, caseSensitive == null ? (this.search()?.caseSensitive ?? undefined) : caseSensitive);
1471
+ });
1472
+ }
1473
+ onFilterFormApply(event) {
1474
+ const filterMetadata = this.metadata().find(d => d.descriptor.property === event.property);
1475
+ if (!filterMetadata) {
1476
+ return;
1477
+ }
1478
+ const filterData = {
1479
+ ...filterSetMetadataOnDisplayChange({ caseSensitive: event.caseSensitive }, event.matchMode, event.value, filterMetadata.descriptor.filterType, filterMetadata.dateConfig),
1480
+ metadata: filterMetadata
1481
+ };
1482
+ this.updatePrimeTableFilter(filterData);
1483
+ // this keeps the UI updated properly before closing the overlay
1484
+ this.filterEdit.set(filterData);
1485
+ // Resetting the form is done in the onOverlayHide callback because resetting the
1486
+ // values here renders empty inputs for a split second before closing the overlay
1487
+ this.filterOverlay().hide();
1488
+ }
1489
+ onFilterRemove(event) {
1490
+ this.updatePrimeTableFilter({
1491
+ ...this.filters()[event.filter.metadata.descriptor.property],
1492
+ matchMode: undefined,
1493
+ displayMatchMode: undefined,
1494
+ value: undefined,
1495
+ displayValue: undefined
1496
+ });
1497
+ }
1498
+ onFilterEdit(event) {
1499
+ this.onFilterAddOrEdit(event.filter, event.event);
1500
+ }
1501
+ onFilterAdd(event) {
1502
+ this.onFilterAddOrEdit(undefined, event);
1503
+ }
1504
+ onSearchChange(value) {
1505
+ const searchWordLimitMax = this.searchWordLimitMaxCmp();
1506
+ if (searchWordLimitMax !== null) {
1507
+ const wordCount = value.split(/\s+/).filter(word => word.length > 0).length;
1508
+ this.searchWordLimitMaxError.set(wordCount > searchWordLimitMax);
1509
+ }
1510
+ else {
1511
+ this.searchWordLimitMaxError.set(false);
1512
+ }
1513
+ if (!this.searchWordLimitMaxError()) {
1514
+ this.searchValueSubject.next(value);
1515
+ }
1516
+ }
1517
+ onSearchCaseSensitiveChange(value) {
1518
+ this.searchCaseSensitiveSubject.next(value);
1519
+ }
1520
+ onOverlayHide() {
1521
+ // resetting the form is done here for a smoother animation
1522
+ if (this.filterFormComponent !== undefined) {
1523
+ this.filterFormComponent()?.resetForm();
1524
+ }
1525
+ if (this.clickedOnFilterEvent) {
1526
+ // show the overlay again if the user clicked another filter
1527
+ setTimeout(() => {
1528
+ this.filterEdit.set(this.clickedOnFilterEvent?.filter);
1529
+ this.filterOverlay().show(this.clickedOnFilterEvent?.event);
1530
+ this.clickedOnFilterEvent = undefined;
1531
+ }, 0);
1532
+ return;
1533
+ }
1534
+ else {
1535
+ // clean state
1536
+ this.filterEdit.set(undefined);
1537
+ }
1538
+ }
1539
+ onFilterAddOrEdit(filter, event) {
1540
+ // If user clicks on the same filter or add that is already open, close the overlay
1541
+ if (this.filterOverlay().overlayVisible && this.filterEdit()?.metadata.descriptor.property === filter?.metadata.descriptor.property) {
1542
+ this.filterOverlay().hide();
1543
+ return;
1544
+ }
1545
+ if (this.filterOverlay().overlayVisible) {
1546
+ // In case the user clicks another filter, 're-showing' the overlay in
1547
+ // the new position is done in the onOverlayHide callback
1548
+ this.clickedOnFilterEvent = { event, filter };
1549
+ this.filterOverlay().hide();
1550
+ }
1551
+ else {
1552
+ this.filterEdit.set(filter);
1553
+ this.filterOverlay().show(event);
1554
+ }
1555
+ }
1556
+ getInitialFilters(filtersInit, metadata) {
1557
+ const filtersResult = {};
1558
+ if (filtersInit) {
1559
+ for (const property in filtersInit) {
1560
+ const filterInit = filtersInit[property];
1561
+ const filterMetadata = metadata.find(m => m.descriptor.property === property);
1562
+ if (!filterMetadata) {
1563
+ continue;
1564
+ }
1565
+ filtersResult[property] = {
1566
+ ...filterSetMetadataOnChange(filterInit, filterInit.matchMode, filterInit.value, filterMetadata.descriptor.filterType, filterMetadata.dateConfig),
1567
+ metadata: filterMetadata
1568
+ };
1569
+ }
1570
+ }
1571
+ return filtersResult;
1572
+ }
1573
+ updatePrimeTableFilter(filter) {
1574
+ this.primeTable.filters[filter.metadata.descriptor.property] = { ...filter };
1575
+ this.primeTable._filter();
1576
+ }
1577
+ updatePrimeTableGlobalFilter(searchQuery, caseSensitive = false) {
1578
+ // match mode needs to be set for inline search
1579
+ this.primeTable.filters['global'] = { ...{ value: searchQuery, matchMode: 'contains', caseSensitive: caseSensitive } };
1580
+ this.primeTable._filter();
1581
+ }
1582
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableFilterOverlayWithTagComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1583
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.7", type: TableFilterOverlayWithTagComponent, isStandalone: true, selector: "mng-table-filter-overlay-with-tag", inputs: { metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: true, transformFunction: null }, genericFilterDescriptor: { classPropertyName: "genericFilterDescriptor", publicName: "genericFilterDescriptor", isSignal: true, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, enableSearch: { classPropertyName: "enableSearch", publicName: "enableSearch", isSignal: true, isRequired: false, transformFunction: null }, search: { classPropertyName: "search", publicName: "search", isSignal: true, isRequired: false, transformFunction: null }, searchLimitWordMax: { classPropertyName: "searchLimitWordMax", publicName: "searchLimitWordMax", isSignal: true, isRequired: false, transformFunction: null }, enableCaseSensitive: { classPropertyName: "enableCaseSensitive", publicName: "enableCaseSensitive", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "templates", predicate: TemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "filterOverlay", first: true, predicate: Popover, descendants: true, isSignal: true }, { propertyName: "filterFormComponent", first: true, predicate: TableFilterFormComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex items-center grow\">\n @if (titleTemplate()) {\n <ng-container *ngTemplateOutlet=\"titleTemplate()\"></ng-container>\n }\n @if (showFilterButton()) {\n <p-button\n icon=\"pi pi-filter\"\n rounded=\"true\"\n [severity]=\"activeFilters().length > 0 ? 'primary' : 'secondary'\"\n size=\"small\"\n (click)=\"onFilterAdd($event)\"\n [styleClass]=\"'my-1 mr-2' + (titleTemplate() ? ' ml-3' : '')\">\n </p-button>\n }\n @if (enableSearch()) {\n <div class=\"col-span-4\" [ngClass]=\"{'ml-3': !showFilterButton() && titleTemplate()}\">\n <span class=\"p-input-icon-left w-full\">\n <p-iconfield>\n <p-inputicon class=\"pi pi-search\" />\n <input\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"onSearchChange($event)\"\n name=\"globalSearch\"\n type=\"text\"\n pInputText\n class=\"search-input w-full\"\n [ngClass]=\"{'ng-invalid': searchWordLimitMaxError()}\"\n [attr.placeholder]=\"'mngFilter.search.input' | translate\"\n [placeholder]=\"'mngFilter.search.input' | translate\" />\n </p-iconfield>\n @if (enableCaseSensitive()) {\n <span class=\"toggle-button-input\">\n <p-toggleButton\n styleClass=\"ml-1 p-1 p-button-sm\"\n [ngModel]=\"searchCaseSensitive()\"\n (ngModelChange)=\"onSearchCaseSensitiveChange($event)\"\n onLabel=\"Aa\"\n offLabel=\"Aa\" />\n </span>\n }\n </span>\n @if (searchWordLimitMaxError()) {\n <small class=\"p-error block\">\n {{ 'mngFilter.search.maxWordsExceededMessage' | translate }}\n </small>\n }\n </div>\n }\n</div>\n@if (activeFilters().length > 0) {\n <div class=\"flex items-center flex-wrap mt-2\">\n @for (filter of activeFilters(); track filter.metadata.descriptor.property) {\n <mng-table-filter-active-tag [model]=\"model()\" [filter]=\"filter\" (edit)=\"onFilterEdit($event)\" (remove)=\"onFilterRemove($event)\" />\n }\n </div>\n}\n<p-popover #op showCloseIcon=\"true\" (onHide)=\"onOverlayHide()\" appendTo=\"body\">\n <mng-table-filter-form\n [model]=\"model()\"\n [metadata]=\"metadata()\"\n [genericDescriptor]=\"genericFilterDescriptor()\"\n [filter]=\"filterEdit()\"\n [disabledProperties]=\"activeFilterProperties()\"\n [propertySearch]=\"genericFilterDescriptor()?.propertySearch\"\n [overlay]=\"op\"\n [enableCaseSensitive]=\"enableCaseSensitive()\"\n (apply)=\"onFilterFormApply($event)\" />\n</p-popover>\n", styles: [".toggle-button-input{position:absolute;right:.35rem;top:50%;transform:translateY(-50%)}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: TableFilterFormComponent, selector: "mng-table-filter-form", inputs: ["title", "metadata", "genericDescriptor", "model", "filter", "overlay", "disabledProperties", "enableCaseSensitive", "propertySearch"], outputs: ["apply"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: TableFilterActiveTagComponent, selector: "mng-table-filter-active-tag", inputs: ["model", "filter"], outputs: ["edit", "remove"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ToggleButton, selector: "p-toggleButton, p-togglebutton, p-toggle-button", inputs: ["onLabel", "offLabel", "onIcon", "offIcon", "ariaLabel", "ariaLabelledBy", "disabled", "style", "styleClass", "inputId", "tabindex", "size", "iconPos", "autofocus", "allowEmpty"], outputs: ["onChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IconField, selector: "p-iconfield, p-iconField, p-icon-field", inputs: ["iconPosition", "styleClass"] }, { kind: "component", type: InputIcon, selector: "p-inputicon, p-inputIcon", inputs: ["styleClass"] }, { kind: "component", type: Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1584
+ }
1585
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableFilterOverlayWithTagComponent, decorators: [{
1586
+ type: Component,
1587
+ args: [{ selector: 'mng-table-filter-overlay-with-tag', imports: [
1588
+ TranslateModule,
1589
+ TagModule,
1590
+ TableFilterFormComponent,
1591
+ Button,
1592
+ TableFilterActiveTagComponent,
1593
+ NgTemplateOutlet,
1594
+ InputText,
1595
+ NgClass,
1596
+ ToggleButton,
1597
+ FormsModule,
1598
+ IconField,
1599
+ InputIcon,
1600
+ Popover
1601
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex items-center grow\">\n @if (titleTemplate()) {\n <ng-container *ngTemplateOutlet=\"titleTemplate()\"></ng-container>\n }\n @if (showFilterButton()) {\n <p-button\n icon=\"pi pi-filter\"\n rounded=\"true\"\n [severity]=\"activeFilters().length > 0 ? 'primary' : 'secondary'\"\n size=\"small\"\n (click)=\"onFilterAdd($event)\"\n [styleClass]=\"'my-1 mr-2' + (titleTemplate() ? ' ml-3' : '')\">\n </p-button>\n }\n @if (enableSearch()) {\n <div class=\"col-span-4\" [ngClass]=\"{'ml-3': !showFilterButton() && titleTemplate()}\">\n <span class=\"p-input-icon-left w-full\">\n <p-iconfield>\n <p-inputicon class=\"pi pi-search\" />\n <input\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"onSearchChange($event)\"\n name=\"globalSearch\"\n type=\"text\"\n pInputText\n class=\"search-input w-full\"\n [ngClass]=\"{'ng-invalid': searchWordLimitMaxError()}\"\n [attr.placeholder]=\"'mngFilter.search.input' | translate\"\n [placeholder]=\"'mngFilter.search.input' | translate\" />\n </p-iconfield>\n @if (enableCaseSensitive()) {\n <span class=\"toggle-button-input\">\n <p-toggleButton\n styleClass=\"ml-1 p-1 p-button-sm\"\n [ngModel]=\"searchCaseSensitive()\"\n (ngModelChange)=\"onSearchCaseSensitiveChange($event)\"\n onLabel=\"Aa\"\n offLabel=\"Aa\" />\n </span>\n }\n </span>\n @if (searchWordLimitMaxError()) {\n <small class=\"p-error block\">\n {{ 'mngFilter.search.maxWordsExceededMessage' | translate }}\n </small>\n }\n </div>\n }\n</div>\n@if (activeFilters().length > 0) {\n <div class=\"flex items-center flex-wrap mt-2\">\n @for (filter of activeFilters(); track filter.metadata.descriptor.property) {\n <mng-table-filter-active-tag [model]=\"model()\" [filter]=\"filter\" (edit)=\"onFilterEdit($event)\" (remove)=\"onFilterRemove($event)\" />\n }\n </div>\n}\n<p-popover #op showCloseIcon=\"true\" (onHide)=\"onOverlayHide()\" appendTo=\"body\">\n <mng-table-filter-form\n [model]=\"model()\"\n [metadata]=\"metadata()\"\n [genericDescriptor]=\"genericFilterDescriptor()\"\n [filter]=\"filterEdit()\"\n [disabledProperties]=\"activeFilterProperties()\"\n [propertySearch]=\"genericFilterDescriptor()?.propertySearch\"\n [overlay]=\"op\"\n [enableCaseSensitive]=\"enableCaseSensitive()\"\n (apply)=\"onFilterFormApply($event)\" />\n</p-popover>\n", styles: [".toggle-button-input{position:absolute;right:.35rem;top:50%;transform:translateY(-50%)}\n"] }]
1602
+ }], ctorParameters: () => [] });
1603
+
1604
+ var filterOverlayWithTag_component = /*#__PURE__*/Object.freeze({
1605
+ __proto__: null,
1606
+ TableFilterOverlayWithTagComponent: TableFilterOverlayWithTagComponent
1607
+ });
1608
+
1609
+ /**
1610
+ * Generates and displays a notification for a table-related error with localized error messages and details.
1611
+ *
1612
+ * @param {TranslateService} translate - The service used to handle localization and translations.
1613
+ * @param {MessageService} messageService - The service used to manage and display messages.
1614
+ * @param {TableDescriptorInst<any>} table - The table descriptor containing table-specific information and model data.
1615
+ * @param {Error} error - The error object providing details about the error that occurred.
1616
+ * @return {Message | null} The generated message object for the error notification or null if no notification was created.
1617
+ */
1618
+ function tableNotificationError(translate, messageService, table, error) {
1619
+ const params = {
1620
+ errorMessage: getI18nForError(translate, error) ?? error.message,
1621
+ ...getI18nErrorParams(error)
1622
+ };
1623
+ const tableErrorTitle = getI18nForModel(translate, table.model, 'table.error.title', { fallbackKey: 'general.error', params }) ?? undefined;
1624
+ const tableErrorMessage = getI18nForModel(translate, table.model, 'table.error.message', { fallbackKey: 'general.errorMessage', params }) ?? undefined;
1625
+ return toastMessage(tableErrorMessage ?? error.message, 'error', { messageService: messageService, title: tableErrorTitle, icon: 'pi-exclamation-triangle' });
1626
+ }
1627
+
1628
+ class LocaleDefaultRowClassPipe {
1629
+ constructor(injector) {
1630
+ this.injector = injector;
1631
+ }
1632
+ transform(value, descriptor, item) {
1633
+ if (descriptor?.isLocalized) {
1634
+ if (item[descriptor.localizationLocaleProperty] === this.injector.get(CommonsService).getDefaultLocale()) {
1635
+ return value + ' mng-table-row-localization-default-locale';
1636
+ }
1637
+ }
1638
+ return value ?? '';
1639
+ }
1640
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: LocaleDefaultRowClassPipe, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Pipe }); }
1641
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.7", ngImport: i0, type: LocaleDefaultRowClassPipe, isStandalone: true, name: "mngLocaleDefaultRowClass" }); }
1642
+ }
1643
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: LocaleDefaultRowClassPipe, decorators: [{
1644
+ type: Pipe,
1645
+ args: [{
1646
+ name: 'mngLocaleDefaultRowClass',
1647
+ pure: true
1648
+ }]
1649
+ }], ctorParameters: () => [{ type: i0.Injector }] });
1650
+
1651
+ class TableColumnFilterClassPipe {
1652
+ transform(value, filter, isEnabled) {
1653
+ const strValue = typeof value === 'string' ? value : '';
1654
+ if (isEnabled && filter?.filterType !== undefined) {
1655
+ return `${strValue} mng-column-filter-${FilterTypeEnum[filter.filterType].toLowerCase()}`;
1656
+ }
1657
+ else {
1658
+ return strValue;
1659
+ }
1660
+ }
1661
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableColumnFilterClassPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
1662
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.0.7", ngImport: i0, type: TableColumnFilterClassPipe, isStandalone: true, name: "mngTableColumnFilterClass" }); }
1663
+ }
1664
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableColumnFilterClassPipe, decorators: [{
1665
+ type: Pipe,
1666
+ args: [{
1667
+ pure: true,
1668
+ name: 'mngTableColumnFilterClass'
1669
+ }]
1670
+ }] });
1671
+
1672
+ /**
1673
+ * generates table layout preferences key used when saving preferences to localstorage
1674
+ * @param typeName string, required
1675
+ * @param url string, required
1676
+ * @param trackProperty string, not required
1677
+ */
1678
+ function generateTableLayoutPrefsKey(typeName, url, trackProperty) {
1679
+ return `commonsTableLayoutPrefs~~${typeName}~~${trackProperty ?? url.split('?')[0].split('#')[0]}`;
1680
+ }
1681
+
1682
+ class TablePreferencesService {
1683
+ constructor() {
1684
+ this.#router = inject(Router);
1685
+ this.#storageService = inject(CommonsStorageService);
1686
+ this.#metadata = inject(TableMetadataService);
1687
+ this.localstorageKey = computed(() => {
1688
+ const descriptor = this.#metadata.descriptor();
1689
+ return descriptor.model.i18nBaseKey ? generateTableLayoutPrefsKey(descriptor.model.i18nBaseKey, this.#router.url, descriptor.identifier) : null;
1690
+ });
1691
+ this.#layoutPrefsSaveCnt = signal(0);
1692
+ this.layoutPreferences = computed(() => {
1693
+ const lsKey = this.localstorageKey();
1694
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1695
+ const cnt = this.#layoutPrefsSaveCnt(); // needed to force updates on user changes
1696
+ const layoutPrefs = lsKey ? this.#storageService.getItem(TableMetadataService.cmpTypeName, lsKey) : undefined;
1697
+ return layoutPrefs ?? { columnWidths: {} };
1698
+ });
1699
+ // columns
1700
+ this.columnsWithPrefs = computed(() => this.#computeColumnsWithLayout());
1701
+ }
1702
+ #router;
1703
+ #storageService;
1704
+ #metadata;
1705
+ #layoutPrefsSaveCnt;
1706
+ /**
1707
+ * Method is called on column resize
1708
+ * @param element event's element
1709
+ */
1710
+ onColumnResize({ element }) {
1711
+ const fieldId = element.id;
1712
+ const width = element.offsetWidth;
1713
+ const layoutPrefs = this.layoutPreferences();
1714
+ const col = this.columnsWithPrefs().find(el => el.descriptor.property === fieldId);
1715
+ if (col)
1716
+ col.width = width;
1717
+ if (!layoutPrefs.columnWidths)
1718
+ layoutPrefs.columnWidths = {};
1719
+ layoutPrefs.columnWidths[fieldId] = width;
1720
+ this.#saveLayoutPreferences(layoutPrefs);
1721
+ }
1722
+ onColumnToggle(event) {
1723
+ const layoutPrefs = this.layoutPreferences();
1724
+ const selectedColumns = event.value.map(v => v.descriptor.property);
1725
+ layoutPrefs.columnHidden = this.columnsWithPrefs()
1726
+ .filter(c => selectedColumns.indexOf(c.descriptor.property) < 0)
1727
+ .map(c => c.descriptor.property);
1728
+ this.#saveLayoutPreferences(layoutPrefs, true);
1729
+ }
1730
+ onColumnToggleAll() {
1731
+ const layoutPrefs = this.layoutPreferences();
1732
+ const columns = [...this.columnsWithPrefs()];
1733
+ const isVisible = !this.columnsWithPrefs().some(c => c.isVisible);
1734
+ for (const col of columns) {
1735
+ if (isVisible !== col.isVisible) {
1736
+ col.isVisible = isVisible;
1737
+ }
1738
+ }
1739
+ layoutPrefs.columnHidden = columns.filter(c => !c.isVisible).map(c => c.descriptor.property);
1740
+ this.#saveLayoutPreferences(layoutPrefs, true);
1741
+ }
1742
+ onColumnReorder(event) {
1743
+ if (event.dropIndex !== undefined && event.dropIndex >= 0 && event.dragIndex !== undefined && event.dragIndex >= 0 && event.dropIndex !== event.dragIndex) {
1744
+ const eventDropIndex = event.dropIndex;
1745
+ const eventDragIndex = event.dragIndex;
1746
+ const prevVisibleColumns = this.columnsWithPrefs().filter(c => c.isVisible);
1747
+ const colAtDrop = prevVisibleColumns[eventDropIndex];
1748
+ const colAtDrag = prevVisibleColumns[eventDragIndex];
1749
+ const colAtDropIndex = this.columnsWithPrefs().findIndex(el => el.id === colAtDrop.id);
1750
+ const colAtDragIndex = this.columnsWithPrefs().findIndex(el => el.id === colAtDrag.id);
1751
+ if (colAtDropIndex > -1 && colAtDragIndex > -1) {
1752
+ let columns = [...this.columnsWithPrefs()];
1753
+ columns.splice(colAtDragIndex, 1);
1754
+ const dropIndex = columns.findIndex(el => el.id === colAtDrop.id) + (eventDropIndex > eventDragIndex ? 1 : 0);
1755
+ columns = [...columns.slice(0, dropIndex), colAtDrag, ...columns.slice(dropIndex)];
1756
+ const layoutPrefs = this.layoutPreferences();
1757
+ layoutPrefs.columnOrder = columns.map(el => el.descriptor.property);
1758
+ this.#saveLayoutPreferences(layoutPrefs);
1759
+ }
1760
+ }
1761
+ }
1762
+ /**
1763
+ * Reset column order and column visibility to default settings
1764
+ */
1765
+ clearLayoutPreferences() {
1766
+ const key = this.localstorageKey();
1767
+ if (key) {
1768
+ this.#storageService.removeItem(TableMetadataService.cmpTypeName, key);
1769
+ this.#layoutPrefsSaveCnt.update(v => v + 1);
1770
+ }
1771
+ }
1772
+ #saveLayoutPreferences(layoutPrefs, forceUpdate = false) {
1773
+ const key = this.localstorageKey();
1774
+ if (key) {
1775
+ this.#storageService.setItem(TableMetadataService.cmpTypeName, key, layoutPrefs);
1776
+ if (forceUpdate) {
1777
+ this.#layoutPrefsSaveCnt.update(v => v + 1);
1778
+ }
1779
+ }
1780
+ }
1781
+ #computeColumnsWithLayout() {
1782
+ const descriptor = this.#metadata.descriptor();
1783
+ const layoutPrefs = this.layoutPreferences();
1784
+ // initialize columns with additional properties
1785
+ const timestamp = new Date().getTime();
1786
+ const columns = descriptor.columns.map(col => ({
1787
+ id: `${col.property}-${timestamp}`,
1788
+ descriptor: col,
1789
+ filter: this.#metadata
1790
+ .filters()
1791
+ .find(f => f.descriptor.showOnColumn === col.property &&
1792
+ ((f.descriptor.displayType == null && this.#metadata.defaultFilterDisplayType === FilterDisplayTypeEnum.Column) ||
1793
+ f.descriptor.displayType === FilterDisplayTypeEnum.Column)),
1794
+ sort: descriptor.sorts.find(f => f.showOnColumn === col.property),
1795
+ disabled: !col.isToggleable,
1796
+ isVisible: layoutPrefs.columnHidden ? !layoutPrefs.columnHidden.includes(col.property) : col.isVisible,
1797
+ width: layoutPrefs.columnWidths?.[col.property]
1798
+ }));
1799
+ if (layoutPrefs.columnOrder) {
1800
+ for (let i = 0; i < layoutPrefs.columnOrder.length; i++) {
1801
+ const colName = layoutPrefs.columnOrder[i];
1802
+ const colWithPrefs = columns.find(el => el.descriptor.property === colName);
1803
+ if (colWithPrefs) {
1804
+ colWithPrefs.orderIdx = i;
1805
+ }
1806
+ }
1807
+ }
1808
+ return columns.sort((a, b) => (a.orderIdx !== undefined && b.orderIdx !== undefined ? a.orderIdx - b.orderIdx : 0));
1809
+ }
1810
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TablePreferencesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1811
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TablePreferencesService }); }
1812
+ }
1813
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TablePreferencesService, decorators: [{
1814
+ type: Injectable
1815
+ }] });
1816
+
1817
+ class TableComponent {
1818
+ // subscriptions and refs
1819
+ #previousDataProvider;
1820
+ #dataProviderEagerFirstLoad;
1821
+ #dataProviderReloadSubscription;
1822
+ #routeQueryParamsSubscription;
1823
+ #routerEventsSubscription;
1824
+ #afterNextRenderRef;
1825
+ constructor() {
1826
+ this.filterKeyPrepend = 'f_';
1827
+ this.logger = inject(LoggerService).create(TableMetadataService.cmpTypeName);
1828
+ this.router = inject(Router);
1829
+ this.route = inject(ActivatedRoute);
1830
+ this.translate = inject(TranslateService);
1831
+ this.messageService = inject(MessageService);
1832
+ this.metadata = inject(TableMetadataService);
1833
+ this.prefs = inject(TablePreferencesService);
1834
+ this.data = inject((TableDataService));
1835
+ // descriptor
1836
+ this.descriptorInput = input.required({ alias: 'descriptor' });
1837
+ // data source inputs
1838
+ this.items = input();
1839
+ this.result = input();
1840
+ this.loadingInput = input(undefined, { alias: 'loading', transform: booleanOrUndefinedAttribute });
1841
+ this.dataProvider = input();
1842
+ // extra features input
1843
+ this.useQueryParams = input(false, { transform: booleanAttribute });
1844
+ this.cellClickEnabled = input(true, { transform: booleanAttribute });
1845
+ this.selectionMode = input('multiple');
1846
+ this.selectionEnabled = input(false, { transform: booleanAttribute });
1847
+ this.rowReorderEnabledInput = input(true, { alias: 'rowReorderEnabled', transform: booleanAttribute });
1848
+ this.rowReorderEnabled = computed(() => this.rowReorderEnabledInput() && this.metadata.descriptor().rowReorderable);
1849
+ this.expandedRowKeys = computed(() => {
1850
+ const descriptor = this.metadata.descriptor();
1851
+ if (typeof descriptor.isRowExpanded === 'string') {
1852
+ return this.data.data()?.reduce((acc, item) => {
1853
+ acc[item[descriptor.trackProperty]] = !!item[descriptor.isRowExpanded];
1854
+ return acc;
1855
+ }, {});
1856
+ }
1857
+ else if (typeof descriptor.isRowExpanded === 'function') {
1858
+ return this.data.data()?.reduce((acc, item) => {
1859
+ acc[item[descriptor.trackProperty]] = descriptor.isRowExpanded(item);
1860
+ return acc;
1861
+ }, {});
1862
+ }
1863
+ return {};
1864
+ });
1865
+ // styling
1866
+ this.columnLastMinWidth = input();
1867
+ this.columnsColspan = computed(() => this.visibleColumns().length + (this.hasLastColumn() ? 1 : 0) + (this.selectionEnabled() ? 1 : 0) + (this.rowReorderEnabled() ? 1 : 0));
1868
+ this.hasTitleDisplay = computed(() => this.captionTemplate() || this.captionComponent() || this.metadata.descriptor().title);
1869
+ this.isCaptionVisible = computed(() => this.hasTitleDisplay() || this.overlayWithTagFilters().length > 0 || this.metadata.descriptor().search);
1870
+ // component inputs
1871
+ this.captionComponent = input();
1872
+ this.columnCustomLastComponent = input();
1873
+ this.globalFilterFieldsInput = input(undefined, { alias: 'globalFilterFields' });
1874
+ // cell click
1875
+ this.cellClickSubject = new Subject();
1876
+ this.isCellClickObserved = signal(this.cellClickSubject.observed);
1877
+ this.isCellClickEnabled = computed(() => this.cellClickEnabled() && this.isCellClickObserved());
1878
+ // event outputs
1879
+ this.tableLoad = output();
1880
+ this.cellClick = outputFromObservable(this.cellClickSubject);
1881
+ this.selectionChange = output();
1882
+ this.captionComponentInstance = output();
1883
+ this.columnCustomLastComponentInstance = output();
1884
+ this.rowReorder = output();
1885
+ // content and view queries
1886
+ this.templates = contentChildren(TemplateDirective);
1887
+ this.components = viewChildren((ComponentDirective));
1888
+ this.primeTable = viewChild(Table);
1889
+ // templates
1890
+ this.captionTemplate = computed(() => findTemplateByName([...this.templates()], 'caption'));
1891
+ this.columnCustomLastTemplate = computed(() => findTemplateByName([...this.templates()], 'columnCustomLast'));
1892
+ this.footerTemplate = computed(() => findTemplateByName([...this.templates()], 'footer'));
1893
+ this.rowExpandTemplate = computed(() => findTemplateByName([...this.templates()], 'rowExpandContent'));
1894
+ // data provider and items
1895
+ this.isLazy = computed(() => this.dataProvider()?.isLazy === true);
1896
+ this.isPagination = computed(() => this.data.paginationMode() === TablePaginationModeEnum.Pagination);
1897
+ this.useQueryParamsInitialized = signal(false);
1898
+ // visual
1899
+ this.className = computed(() => {
1900
+ let className = this.metadata.descriptor().className ?? '';
1901
+ switch (this.metadata.descriptor().size) {
1902
+ case TableSizeEnum.Small:
1903
+ className += ' p-datatable-sm';
1904
+ break;
1905
+ case TableSizeEnum.Large:
1906
+ className += ' p-datatable-lg';
1907
+ break;
1908
+ }
1909
+ if (this.metadata.descriptor().hasGridlines) {
1910
+ className += ' p-datatable-gridlines';
1911
+ }
1912
+ return className;
1913
+ });
1914
+ // columns
1915
+ this.visibleColumns = computed(() => this.prefs.columnsWithPrefs().filter(col => col.isVisible));
1916
+ this.areColumnsReorderable = computed(() => this.prefs.columnsWithPrefs().some(col => col.descriptor.isReorderable));
1917
+ this.areColumnsToggleable = computed(() => this.prefs.columnsWithPrefs().some(col => col.descriptor.isToggleable));
1918
+ // filter, sort
1919
+ this.hasColumnFilters = computed(() => (this.metadata.defaultFilterDisplayType === FilterDisplayTypeEnum.OverlayWithTag &&
1920
+ this.metadata.filterDescriptors().some(d => d.displayType === FilterDisplayTypeEnum.Column)) ||
1921
+ (this.metadata.defaultFilterDisplayType === FilterDisplayTypeEnum.Column && this.metadata.filterDescriptors().some(d => d.displayType == null)));
1922
+ this.overlayWithTagFilters = computed(() => {
1923
+ // statically defined filters AND generic filters
1924
+ const filters = this.metadata
1925
+ .filters()
1926
+ .filter(d => (d.descriptor.displayType == null && this.metadata.defaultFilterDisplayType === FilterDisplayTypeEnum.OverlayWithTag) ||
1927
+ d.descriptor.displayType === FilterDisplayTypeEnum.OverlayWithTag);
1928
+ return filters.concat(this.metadata.genericFilters());
1929
+ });
1930
+ this.hasCustomLastColumn = computed(() => this.columnCustomLastComponent() || this.columnCustomLastTemplate());
1931
+ this.hasLastColumn = computed(() => this.hasCustomLastColumn() || this.areColumnsToggleable() || this.areColumnsReorderable());
1932
+ // other
1933
+ this.navigationOutOfTableInProgress = false;
1934
+ this.navigationInTableInProgress = false;
1935
+ this.#dataProviderEagerFirstLoad = effectWithDeps([this.dataProvider], ([dataProvider]) => {
1936
+ if (dataProvider?.isLazy === false) {
1937
+ this.loadTableWithDataProvider(this.metadata.defaultParams());
1938
+ }
1939
+ else if (this.#previousDataProvider && dataProvider) {
1940
+ this.reload();
1941
+ }
1942
+ this.#previousDataProvider = dataProvider;
1943
+ });
1944
+ this.#dataProviderReloadSubscription = toObservable(this.dataProvider)
1945
+ .pipe(switchMap(dp => dp?.tableReload$ ?? of({})), takeUntilDestroyed())
1946
+ .subscribe({
1947
+ next: e => {
1948
+ this.reload(e);
1949
+ }
1950
+ });
1951
+ this.#routeQueryParamsSubscription = toObservable(this.useQueryParams)
1952
+ .pipe(switchMap(useQp => (useQp ? this.route.queryParams : NEVER)), takeUntilDestroyed())
1953
+ .subscribe(qp => {
1954
+ this.loadTableFromRouteUpdate(qp);
1955
+ });
1956
+ this.#routerEventsSubscription = toObservable(this.useQueryParams)
1957
+ .pipe(switchMap(useQp => (useQp ? this.router.events : NEVER)), filter(e => (e instanceof NavigationStart && e.url.split('?')[0].split('#')[0] !== this.router.url.split('?')[0].split('#')[0]) ||
1958
+ e instanceof NavigationEnd ||
1959
+ e instanceof NavigationCancel ||
1960
+ e instanceof NavigationError), takeUntilDestroyed())
1961
+ .subscribe(e => {
1962
+ this.navigationOutOfTableInProgress = e instanceof NavigationStart;
1963
+ });
1964
+ this.#afterNextRenderRef = afterNextRender(() => {
1965
+ this.isCellClickObserved.set(this.cellClickSubject.observed);
1966
+ });
1967
+ this.metadata.setSignalSources(this.descriptorInput, this.globalFilterFieldsInput);
1968
+ this.data.setDataSources(this.items, this.result, this.dataProvider, this.loadingInput);
1969
+ }
1970
+ reload(emitEvent) {
1971
+ const params = emitEvent?.params ? emitEvent?.params : emitEvent?.resetParams ? undefined : this.lastParamsWithDefaults;
1972
+ const reloadParams = mergeDataListParamsWithDefaults(params ?? {}, this.metadata.defaultParams());
1973
+ this.loadTableWithDataProvider(reloadParams, emitEvent?.emitEvent ?? false);
1974
+ }
1975
+ onTableLazyLoad(event) {
1976
+ this.lastLazyLoadEvent = event;
1977
+ const params = fromTableLoadToDataListParams(event);
1978
+ if (this.useQueryParams()) {
1979
+ if (!this.navigationOutOfTableInProgress && !this.navigationInTableInProgress) {
1980
+ // this check is necessary: from some reason, primeNG commits one last lazy load event whenever any angular router navigation occurs
1981
+ this.navigationInTableInProgress = true;
1982
+ const newParams = dataListParamsToUrlQuery(params, this.metadata.defaultParams(), { prependFilterName: this.filterKeyPrepend });
1983
+ const newParamsWithParamsToRemove = { ...newParams };
1984
+ const currentQp = this.route.snapshot.queryParams;
1985
+ if (currentQp) {
1986
+ Object.keys(currentQp)
1987
+ .filter(k => (k.startsWith(this.filterKeyPrepend) || ['offset', 'limit', 'sort', 'q'].indexOf(k) >= 0) && newParams[k] === undefined)
1988
+ .forEach(k => (newParamsWithParamsToRemove[k] = null));
1989
+ }
1990
+ this.router
1991
+ .navigate([], {
1992
+ relativeTo: this.route,
1993
+ replaceUrl: true,
1994
+ queryParams: newParamsWithParamsToRemove,
1995
+ queryParamsHandling: 'merge'
1996
+ })
1997
+ .then(() => {
1998
+ this.navigationInTableInProgress = false;
1999
+ });
2000
+ }
2001
+ }
2002
+ else {
2003
+ const paramsWithDefaults = mergeDataListParamsWithDefaults(params, this.metadata.defaultParams());
2004
+ this.data.setParams(paramsWithDefaults);
2005
+ this.loadTableWithDataProvider(paramsWithDefaults);
2006
+ }
2007
+ }
2008
+ onTableFilter(event) {
2009
+ if (this.useQueryParams()) {
2010
+ return;
2011
+ }
2012
+ const params = fromTableLoadToDataListParams({ filters: event.filters });
2013
+ const paramsWithDefaults = mergeDataListParamsWithDefaults(params, this.metadata.defaultParams());
2014
+ // if table doesn't use lazy loading, filter params need to be set here
2015
+ // because the onTableLazyLoad event is not emitted
2016
+ if (!this.isLazy()) {
2017
+ this.data.setParams(paramsWithDefaults);
2018
+ }
2019
+ }
2020
+ onCellClick(event, col, item, idx) {
2021
+ if (!this.isCellClickEnabled()) {
2022
+ return;
2023
+ }
2024
+ const tableEvent = {
2025
+ column: col,
2026
+ rowItem: item,
2027
+ rowIndex: idx,
2028
+ event: event
2029
+ };
2030
+ this.cellClickSubject.next(tableEvent);
2031
+ }
2032
+ onSelectionChange(event) {
2033
+ this.selectionChange.emit(event);
2034
+ }
2035
+ onRowReorder(event) {
2036
+ this.rowReorder.emit(event);
2037
+ }
2038
+ loadTableWithDataProvider(paramsWithDefaults, emitEvent = true) {
2039
+ const isFetched = this.data.fetchWithDataProvider(paramsWithDefaults, error => {
2040
+ tableNotificationError(this.translate, this.messageService, this.metadata.descriptor(), error);
2041
+ const commonsError = fromSubscribeError(error, 'TableComponentError', {
2042
+ params: paramsWithDefaults
2043
+ });
2044
+ this.logger.log(commonsError, getErrorLogLevel(commonsError));
2045
+ });
2046
+ if (isFetched) {
2047
+ this.lastParamsWithDefaults = paramsWithDefaults;
2048
+ if (emitEvent) {
2049
+ const tableEvent = {
2050
+ originalEvent: this.lastLazyLoadEvent,
2051
+ params: paramsWithDefaults
2052
+ };
2053
+ this.tableLoad.emit(tableEvent);
2054
+ }
2055
+ }
2056
+ }
2057
+ loadTableFromRouteUpdate(urlParams) {
2058
+ const paramsWithDefaults = mergeDataListParamsWithDefaults(fromUrlQueryToDataListParams(urlParams, {
2059
+ prependFilterName: this.filterKeyPrepend,
2060
+ searchAsGlobal: true
2061
+ }), this.metadata.defaultParams());
2062
+ this.data.setParams(paramsWithDefaults, true);
2063
+ this.loadTableWithDataProvider(paramsWithDefaults);
2064
+ }
2065
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.7", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2066
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.7", type: TableComponent, isStandalone: true, selector: "mng-table", inputs: { descriptorInput: { classPropertyName: "descriptorInput", publicName: "descriptor", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, result: { classPropertyName: "result", publicName: "result", isSignal: true, isRequired: false, transformFunction: null }, loadingInput: { classPropertyName: "loadingInput", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, dataProvider: { classPropertyName: "dataProvider", publicName: "dataProvider", isSignal: true, isRequired: false, transformFunction: null }, useQueryParams: { classPropertyName: "useQueryParams", publicName: "useQueryParams", isSignal: true, isRequired: false, transformFunction: null }, cellClickEnabled: { classPropertyName: "cellClickEnabled", publicName: "cellClickEnabled", isSignal: true, isRequired: false, transformFunction: null }, selectionMode: { classPropertyName: "selectionMode", publicName: "selectionMode", isSignal: true, isRequired: false, transformFunction: null }, selectionEnabled: { classPropertyName: "selectionEnabled", publicName: "selectionEnabled", isSignal: true, isRequired: false, transformFunction: null }, rowReorderEnabledInput: { classPropertyName: "rowReorderEnabledInput", publicName: "rowReorderEnabled", isSignal: true, isRequired: false, transformFunction: null }, columnLastMinWidth: { classPropertyName: "columnLastMinWidth", publicName: "columnLastMinWidth", isSignal: true, isRequired: false, transformFunction: null }, captionComponent: { classPropertyName: "captionComponent", publicName: "captionComponent", isSignal: true, isRequired: false, transformFunction: null }, columnCustomLastComponent: { classPropertyName: "columnCustomLastComponent", publicName: "columnCustomLastComponent", isSignal: true, isRequired: false, transformFunction: null }, globalFilterFieldsInput: { classPropertyName: "globalFilterFieldsInput", publicName: "globalFilterFields", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tableLoad: "tableLoad", cellClick: "cellClick", selectionChange: "selectionChange", captionComponentInstance: "captionComponentInstance", columnCustomLastComponentInstance: "columnCustomLastComponentInstance", rowReorder: "rowReorder" }, host: { properties: { "class.mng-table-no-header": "!isCaptionVisible()" } }, providers: [TableMetadataService, TableDataService, TablePreferencesService], queries: [{ propertyName: "templates", predicate: TemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "components", predicate: (ComponentDirective), descendants: true, isSignal: true }, { propertyName: "primeTable", first: true, predicate: Table, descendants: true, isSignal: true }], ngImport: i0, template: "<div>\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n @if (data.isAllPaginationMetaInitialized()) {\n <p-table\n [value]=\"data.data()\"\n [dataKey]=\"metadata.descriptor().trackProperty\"\n [lazy]=\"isLazy()\"\n [loading]=\"data.loading()\"\n [paginator]=\"isPagination()\"\n [rows]=\"data.rows()\"\n [first]=\"data.offset()\"\n [totalRecords]=\"data.count()\"\n [rowsPerPageOptions]=\"metadata.rowsPerPageOptions()\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"data.sortMeta()\"\n [filters]=\"data.filterMeta()\"\n [globalFilterFields]=\"metadata.searchFields()\"\n sortMode=\"multiple\"\n [selection]=\"[]\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled() ? selectionMode() : null\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [rowHover]=\"metadata.descriptor().hasHover\"\n [styleClass]=\"className()\"\n [resizableColumns]=\"metadata.descriptor().hasResizableColumns\"\n [columnResizeMode]=\"metadata.descriptor().columnResizeMode ?? 'expand'\"\n [reorderableColumns]=\"areColumnsReorderable()\"\n paginatorDropdownAppendTo=\"body\"\n [columns]=\"visibleColumns()\"\n [expandedRowKeys]=\"expandedRowKeys()\"\n (onColResize)=\"prefs.onColumnResize($event)\"\n (onColReorder)=\"prefs.onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onFilter)=\"onTableFilter($event)\"\n (onRowReorder)=\"onRowReorder($event)\">\n <ng-template #caption>\n @if (isCaptionVisible()) {\n <div class=\"table-header\">\n @if (overlayWithTagFilters().length > 0 || metadata.descriptor().search) {\n @defer (on idle) {\n <mng-table-filter-overlay-with-tag\n [title]=\"metadata.descriptor().title\"\n [metadata]=\"overlayWithTagFilters()\"\n [genericFilterDescriptor]=\"metadata.genericFilterDescriptor()\"\n [model]=\"metadata.descriptor().model\"\n [enableSearch]=\"metadata.descriptor().search\"\n [search]=\"data.searchMeta()\"\n [searchLimitWordMax]=\"metadata.descriptor().searchLimitMaxWords\"\n [enableCaseSensitive]=\"isLazy()\">\n @if (hasTitleDisplay()) {\n <ng-template mngTemplate=\"title\">\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n </ng-template>\n }\n </mng-table-filter-overlay-with-tag>\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n }\n <ng-template #captionTemplateOrComponentOrTitle>\n @if (captionTemplate()) {\n <ng-container *ngTemplateOutlet=\"captionTemplate()\"></ng-container>\n } @else if (captionComponent()) {\n <ng-container [mngComponent]=\"captionComponent()\" (instanceCreated)=\"captionComponentInstance.emit($event)\"></ng-container>\n } @else if (metadata.descriptor().title) {\n <h5 class=\"p-0 m-0\">{{ metadata.descriptor().title! | translate }}</h5>\n }\n </ng-template>\n </div>\n }\n </ng-template>\n <ng-template #header>\n @if (!metadata.descriptor().hideHeader) {\n <tr class=\"mng-table-header\" [class]=\"metadata.descriptor().headerClassName\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox />\n </th>\n } @else {\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\"></th>\n }\n }\n @if (metadata.descriptor().rowExpandable) {\n <th scope=\"col\" pFrozenColumn [frozen]=\"true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-between items-center\">\n {{\n (col.descriptor.title && !col.descriptor.titleUseModelBase\n ? col.descriptor.title\n : (col.descriptor.title ?? col.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n <p-sortIcon [field]=\"col.sort?.property\" class=\"flex\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{\n (col.descriptor.title && !col.descriptor.titleUseModelBase\n ? col.descriptor.title\n : (col.descriptor.title ?? col.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n </ng-template>\n @if (col.descriptor.isReorderable) {\n <th\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n } @else {\n <th\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n }\n }\n @if (hasLastColumn()) {\n <th\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"metadata.descriptor().actionColumnFrozen ?? areColumnsToggleable()\"\n alignFrozen=\"right\"\n class=\"mng-table-column-custom-last !text-right\">\n @if (areColumnsToggleable()) {\n @defer (on idle) {\n <mng-table-column-toggle [columns]=\"visibleColumns()\" />\n }\n }\n </th>\n }\n </tr>\n }\n @if (hasColumnFilters()) {\n <tr class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n @if (selectionEnabled()) {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @if (metadata.descriptor().rowExpandable) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <th\n [class]=\"'!px-1 ' + col.filter?.descriptor?.columnClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\"\n [style.width.px]=\"col.width\"\n [style.width.%]=\"col.width ? null : (col.filter?.descriptor?.columnWidth ?? col.descriptor.width ?? null)\"\n [style.min-width.px]=\"col.width ? null : (col.filter?.descriptor?.columnMinWidth ?? col.descriptor.minWidth)\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n @if (col.filter) {\n @defer (on idle) {\n <mng-table-column-filter [metadata]=\"col.filter\"></mng-table-column-filter>\n }\n }\n </th>\n }\n @if (hasLastColumn()) {\n <th pFrozenColumn alignFrozen=\"right\" class=\"mng-table-column-custom-last\" [style.min-width.px]=\"columnLastMinWidth()\"></th>\n }\n </tr>\n }\n </ng-template>\n <ng-template #body let-item let-idx=\"rowIndex\" let-expanded=\"expanded\">\n <tr\n [pReorderableRow]=\"idx\"\n [ngClass]=\"\n metadata.descriptor().rowClassName | mngClassMap: metadata.descriptor().rowClassNameMapFn : item | mngLocaleDefaultRowClass: metadata.descriptor() : item\n \">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n } @else {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n }\n }\n @if (metadata.descriptor().rowExpandable) {\n <td>\n @let expandProp = metadata.descriptor().rowExpandableProperty;\n @if (!expandProp || item[expandProp]) {\n <button\n pButton\n type=\"button\"\n [pRowToggler]=\"item\"\n rounded=\"true\"\n text=\"true\"\n class=\"mng-button-sm\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"></button>\n }\n </td>\n }\n @if (rowReorderEnabled()) {\n <td>\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\n </td>\n }\n @for (col of visibleColumns(); track col.id) {\n <td\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n col.descriptor.className\n | mngClassMap: col.descriptor.classNameMapFn : item\n | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\n \"\n [class.clickable]=\"isCellClickEnabled()\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n }\n @if (hasLastColumn()) {\n <td\n class=\"mng-table-column-custom-last justify-end !text-right\"\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n alignFrozen=\"right\"\n [frozen]=\"metadata.descriptor().actionColumnFrozen ?? true\">\n @if (columnCustomLastTemplate()) {\n <ng-container *ngTemplateOutlet=\"columnCustomLastTemplate(); context: {rowItem: item, rowIndex: idx}\"></ng-container>\n } @else if (columnCustomLastComponent()) {\n <div [mngComponent]=\"columnCustomLastComponent()\" (instanceCreated)=\"columnCustomLastComponentInstance.emit($event)\"></div>\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template #expandedrow let-item>\n @if (metadata.descriptor().rowExpandable) {\n <tr>\n <td></td>\n <td [colSpan]=\"metadata.descriptor().rowExpandableColSpan\">\n @if (metadata.descriptor().rowExpandableComponentType !== undefined) {\n <ng-container [mngComponent]=\"metadata.descriptor().rowExpandableComponentType\" [inputs]=\"{item}\"> </ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"rowExpandTemplate(); context: {rowItem: item}\"></ng-container>\n }\n </td>\n </tr>\n }\n </ng-template>\n <ng-template #loadingicon>\n <div class=\"flex flex-col items-center\">\n @if (metadata.descriptor().loadingIcon) {\n <i [class]=\"'text-white text-4xl pi-spin ' + metadata.descriptor().loadingIcon\"></i>\n }\n @if (metadata.descriptor().loadingText) {\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': metadata.descriptor().loadingIcon}\">\n {{ metadata.descriptor().loadingText ?? '' | translate }}\n </div>\n }\n </div>\n </ng-template>\n <ng-template #loadingbody>\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n @if (footerTemplate()) {\n <ng-template #summary>\n <ng-container *ngTemplateOutlet=\"footerTemplate(); context: {data: data.data(), totalCount: data.count()}\"></ng-container>\n </ng-template>\n }\n </p-table>\n }\n</div>\n", styles: ["mng-table .p-datatable .p-datatable-header{border-top:0}mng-table .p-datatable:not(.p-datatable-gridlines) .p-datatable-tbody>tr>td{cursor:auto}mng-table .p-datatable:not(.p-datatable-gridlines) .p-datatable-tbody>tr>td.clickable{cursor:pointer}mng-table .p-datatable :is(.p-datatable-thead>tr>th,.p-datatable-tbody>tr>td):hover mng-table-column-value .help-buttons{display:block}mng-table .p-datatable .p-datatable-thead>tr>th.mng-table-column-custom-last{padding:var(--mng-table-column-head-custom-last, .1rem 1rem)}mng-table .p-datatable .p-datatable-tbody>tr>td{position:relative}mng-table .p-datatable .p-datatable-tbody>tr>td.mng-table-column-custom-last{padding-top:.1rem;padding-bottom:.1rem}mng-table .p-datatable .p-datatable-tbody>tr>td.p-datatable-frozen-column{position:sticky;z-index:1;background:transparent}mng-table .p-datatable.p-datatable-lg .p-datatable-tbody>tr>td.mng-table-column-custom-last{padding:var(--mng-table-column-body-custom-last, .15rem 1rem)}mng-table .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td.mng-table-column-custom-last{padding:var(--mng-table-sm-column-body-custom-last, .05rem 1rem)}mng-table .p-datatable.p-datatable-flex-scrollable .p-datatable-thead>tr>th{overflow:hidden;text-overflow:ellipsis}mng-table .p-datatable.p-datatable-flex-scrollable .p-datatable-tbody>tr>td{overflow:hidden}mng-table .p-datatable .mng-table-row-localization-default-locale{background:var(--p-surface-100)!important}mng-table .mng-table-header>th:not(:first-child):not(:last-child){border-radius:0!important}mng-table .mng-table-header>th:first-child{border-top-right-radius:0!important;border-bottom-right-radius:0!important}mng-table .mng-table-header>th:last-child{border-radius:0!important}mng-table .mng-table-header .mng-table-columns-multiselect{width:36px}mng-table .mng-table-header .mng-table-columns-multiselect .p-multiselect-label-container{width:0}mng-table.mng-table-no-header p-datatable .p-datatable-header{display:none}mng-table.mng-table-header-compact .p-datatable-header{padding:var(--mng-table-header-compact-padding, 0 0 .5rem 0)}\n"], dependencies: [{ kind: "directive", type: ComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "injectionToken", "inputs", "attachToHost", "parentInjector"], outputs: ["instanceCreated"] }, { kind: "pipe", type: I18nPropertyPipe, name: "mngI18nProperty" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: TableColumnValueComponent, selector: "mng-table-column-value", inputs: ["descriptor", "item"] }, { kind: "pipe", type: ClassMapPipe, name: "mngClassMap" }, { kind: "pipe", type: LocaleDefaultRowClassPipe, name: "mngLocaleDefaultRowClass" }, { kind: "pipe", type: TableColumnFilterClassPipe, name: "mngTableColumnFilterClass" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i2.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i2.RowToggler, selector: "[pRowToggler]", inputs: ["pRowToggler", "pRowTogglerDisabled"] }, { kind: "directive", type: i2.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i2.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i2.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i2.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i2.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i2.ReorderableRowHandle, selector: "[pReorderableRowHandle]" }, { kind: "directive", type: i2.ReorderableRow, selector: "[pReorderableRow]", inputs: ["pReorderableRow", "pReorderableRowDisabled"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "style", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None, deferBlockDependencies: [() => [NgTemplateOutlet, Promise.resolve().then(function () { return filterOverlayWithTag_component; }).then(m => m.TableFilterOverlayWithTagComponent), TemplateDirective], () => [import('./mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs').then(m => m.TableColumnToggleComponent)], () => [Promise.resolve().then(function () { return columnFilter_component; }).then(m => m.TableColumnFilterComponent)]] }); }
2067
+ }
2068
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "19.0.7", ngImport: i0, type: TableComponent, resolveDeferredDeps: () => [Promise.resolve().then(function () { return filterOverlayWithTag_component; }).then(m => m.TableFilterOverlayWithTagComponent), import('./mediusinc-mng-commons-table-column-toggle.component-DTSBP9WQ.mjs').then(m => m.TableColumnToggleComponent), Promise.resolve().then(function () { return columnFilter_component; }).then(m => m.TableColumnFilterComponent)], resolveMetadata: (TableFilterOverlayWithTagComponent, TableColumnToggleComponent, TableColumnFilterComponent) => ({ decorators: [{
2069
+ type: Component,
2070
+ args: [{ selector: 'mng-table', imports: [
2071
+ ComponentDirective,
2072
+ I18nPropertyPipe,
2073
+ NgClass,
2074
+ NgStyle,
2075
+ NgTemplateOutlet,
2076
+ TableColumnValueComponent,
2077
+ ClassMapPipe,
2078
+ LocaleDefaultRowClassPipe,
2079
+ TableColumnFilterComponent,
2080
+ TableColumnFilterClassPipe,
2081
+ TranslateModule,
2082
+ TableFilterOverlayWithTagComponent,
2083
+ FormsModule,
2084
+ TemplateDirective,
2085
+ TableModule,
2086
+ Skeleton,
2087
+ TableColumnToggleComponent,
2088
+ ButtonDirective
2089
+ ], providers: [TableMetadataService, TableDataService, TablePreferencesService], host: {
2090
+ '[class.mng-table-no-header]': '!isCaptionVisible()'
2091
+ }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div>\n <!-- MUST NOT use observable for value when using virtual scroll - does not work for some reason -->\n @if (data.isAllPaginationMetaInitialized()) {\n <p-table\n [value]=\"data.data()\"\n [dataKey]=\"metadata.descriptor().trackProperty\"\n [lazy]=\"isLazy()\"\n [loading]=\"data.loading()\"\n [paginator]=\"isPagination()\"\n [rows]=\"data.rows()\"\n [first]=\"data.offset()\"\n [totalRecords]=\"data.count()\"\n [rowsPerPageOptions]=\"metadata.rowsPerPageOptions()\"\n [showCurrentPageReport]=\"true\"\n [currentPageReportTemplate]=\"'mngTable.paginationMsg' | translate\"\n [multiSortMeta]=\"data.sortMeta()\"\n [filters]=\"data.filterMeta()\"\n [globalFilterFields]=\"metadata.searchFields()\"\n sortMode=\"multiple\"\n [selection]=\"[]\"\n (selectionChange)=\"onSelectionChange($event)\"\n [selectionMode]=\"selectionEnabled() ? selectionMode() : null\"\n [scrollable]=\"true\"\n scrollHeight=\"flex\"\n [rowHover]=\"metadata.descriptor().hasHover\"\n [styleClass]=\"className()\"\n [resizableColumns]=\"metadata.descriptor().hasResizableColumns\"\n [columnResizeMode]=\"metadata.descriptor().columnResizeMode ?? 'expand'\"\n [reorderableColumns]=\"areColumnsReorderable()\"\n paginatorDropdownAppendTo=\"body\"\n [columns]=\"visibleColumns()\"\n [expandedRowKeys]=\"expandedRowKeys()\"\n (onColResize)=\"prefs.onColumnResize($event)\"\n (onColReorder)=\"prefs.onColumnReorder($event)\"\n (onLazyLoad)=\"onTableLazyLoad($event)\"\n (onFilter)=\"onTableFilter($event)\"\n (onRowReorder)=\"onRowReorder($event)\">\n <ng-template #caption>\n @if (isCaptionVisible()) {\n <div class=\"table-header\">\n @if (overlayWithTagFilters().length > 0 || metadata.descriptor().search) {\n @defer (on idle) {\n <mng-table-filter-overlay-with-tag\n [title]=\"metadata.descriptor().title\"\n [metadata]=\"overlayWithTagFilters()\"\n [genericFilterDescriptor]=\"metadata.genericFilterDescriptor()\"\n [model]=\"metadata.descriptor().model\"\n [enableSearch]=\"metadata.descriptor().search\"\n [search]=\"data.searchMeta()\"\n [searchLimitWordMax]=\"metadata.descriptor().searchLimitMaxWords\"\n [enableCaseSensitive]=\"isLazy()\">\n @if (hasTitleDisplay()) {\n <ng-template mngTemplate=\"title\">\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n </ng-template>\n }\n </mng-table-filter-overlay-with-tag>\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"captionTemplateOrComponentOrTitle\"></ng-container>\n }\n <ng-template #captionTemplateOrComponentOrTitle>\n @if (captionTemplate()) {\n <ng-container *ngTemplateOutlet=\"captionTemplate()\"></ng-container>\n } @else if (captionComponent()) {\n <ng-container [mngComponent]=\"captionComponent()\" (instanceCreated)=\"captionComponentInstance.emit($event)\"></ng-container>\n } @else if (metadata.descriptor().title) {\n <h5 class=\"p-0 m-0\">{{ metadata.descriptor().title! | translate }}</h5>\n }\n </ng-template>\n </div>\n }\n </ng-template>\n <ng-template #header>\n @if (!metadata.descriptor().hideHeader) {\n <tr class=\"mng-table-header\" [class]=\"metadata.descriptor().headerClassName\">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableHeaderCheckbox />\n </th>\n } @else {\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\"></th>\n }\n }\n @if (metadata.descriptor().rowExpandable) {\n <th scope=\"col\" pFrozenColumn [frozen]=\"true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <ng-template #sortableColumnTHTemplate>\n <div class=\"flex justify-between items-center\">\n {{\n (col.descriptor.title && !col.descriptor.titleUseModelBase\n ? col.descriptor.title\n : (col.descriptor.title ?? col.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n <p-sortIcon [field]=\"col.sort?.property\" class=\"flex\"></p-sortIcon>\n </div>\n </ng-template>\n <ng-template #nonSortableColumnTHTemplate>\n {{\n (col.descriptor.title && !col.descriptor.titleUseModelBase\n ? col.descriptor.title\n : (col.descriptor.title ?? col.descriptor.property | mngI18nProperty: metadata.descriptor().model)\n ) | translate\n }}\n </ng-template>\n @if (col.descriptor.isReorderable) {\n <th\n pResizableColumn\n pReorderableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n } @else {\n <th\n pResizableColumn\n [id]=\"col.descriptor.property\"\n [pSortableColumn]=\"col.sort?.property\"\n [pSortableColumnDisabled]=\"!col.sort\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\"\n [class]=\"col.descriptor.headerClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\">\n <ng-container *ngTemplateOutlet=\"col.sort ? sortableColumnTHTemplate : nonSortableColumnTHTemplate\"></ng-container>\n </th>\n }\n }\n @if (hasLastColumn()) {\n <th\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n [frozen]=\"metadata.descriptor().actionColumnFrozen ?? areColumnsToggleable()\"\n alignFrozen=\"right\"\n class=\"mng-table-column-custom-last !text-right\">\n @if (areColumnsToggleable()) {\n @defer (on idle) {\n <mng-table-column-toggle [columns]=\"visibleColumns()\" />\n }\n }\n </th>\n }\n </tr>\n }\n @if (hasColumnFilters()) {\n <tr class=\"mng-column-filter-row\">\n <!-- We need the line below, because otherwise p-tableRadioButton shifts the rest of the columns in table -->\n @if (selectionEnabled()) {\n <th style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\"></th>\n }\n @if (rowReorderEnabled()) {\n <th scope=\"col\"></th>\n }\n @if (metadata.descriptor().rowExpandable) {\n <th scope=\"col\"></th>\n }\n @for (col of visibleColumns(); track col.id) {\n <th\n [class]=\"'!px-1 ' + col.filter?.descriptor?.columnClassName | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\"\n [style.width.px]=\"col.width\"\n [style.width.%]=\"col.width ? null : (col.filter?.descriptor?.columnWidth ?? col.descriptor.width ?? null)\"\n [style.min-width.px]=\"col.width ? null : (col.filter?.descriptor?.columnMinWidth ?? col.descriptor.minWidth)\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n @if (col.filter) {\n @defer (on idle) {\n <mng-table-column-filter [metadata]=\"col.filter\"></mng-table-column-filter>\n }\n }\n </th>\n }\n @if (hasLastColumn()) {\n <th pFrozenColumn alignFrozen=\"right\" class=\"mng-table-column-custom-last\" [style.min-width.px]=\"columnLastMinWidth()\"></th>\n }\n </tr>\n }\n </ng-template>\n <ng-template #body let-item let-idx=\"rowIndex\" let-expanded=\"expanded\">\n <tr\n [pReorderableRow]=\"idx\"\n [ngClass]=\"\n metadata.descriptor().rowClassName | mngClassMap: metadata.descriptor().rowClassNameMapFn : item | mngLocaleDefaultRowClass: metadata.descriptor() : item\n \">\n @if (selectionEnabled()) {\n @if (selectionMode() === 'multiple') {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableCheckbox [value]=\"item\"></p-tableCheckbox>\n </td>\n } @else {\n <td style=\"min-width: 36px\" pFrozenColumn [frozen]=\"metadata.descriptor().selectionColumnFrozen ?? true\">\n <p-tableRadioButton [value]=\"item\"></p-tableRadioButton>\n </td>\n }\n }\n @if (metadata.descriptor().rowExpandable) {\n <td>\n @let expandProp = metadata.descriptor().rowExpandableProperty;\n @if (!expandProp || item[expandProp]) {\n <button\n pButton\n type=\"button\"\n [pRowToggler]=\"item\"\n rounded=\"true\"\n text=\"true\"\n class=\"mng-button-sm\"\n [icon]=\"expanded ? 'pi pi-chevron-down' : 'pi pi-chevron-right'\"></button>\n }\n </td>\n }\n @if (rowReorderEnabled()) {\n <td>\n <span class=\"pi pi-bars\" pReorderableRowHandle></span>\n </td>\n }\n @for (col of visibleColumns(); track col.id) {\n <td\n (click)=\"onCellClick($event, col.descriptor, item, idx)\"\n [class]=\"\n col.descriptor.className\n | mngClassMap: col.descriptor.classNameMapFn : item\n | mngTableColumnFilterClass: col.filter?.descriptor : hasColumnFilters() && !col.width\n \"\n [class.clickable]=\"isCellClickEnabled()\"\n [style.width]=\"col.width ? col.width + 'px' : col.descriptor.width + '%'\"\n [style.min-width.px]=\"col.width ? null : col.descriptor.minWidth\"\n [style.max-width.px]=\"col.width ?? col.descriptor.maxWidth\">\n <mng-table-column-value [descriptor]=\"col.descriptor\" [item]=\"item\"></mng-table-column-value>\n </td>\n }\n @if (hasLastColumn()) {\n <td\n class=\"mng-table-column-custom-last justify-end !text-right\"\n [style.min-width.px]=\"columnLastMinWidth()\"\n pFrozenColumn\n alignFrozen=\"right\"\n [frozen]=\"metadata.descriptor().actionColumnFrozen ?? true\">\n @if (columnCustomLastTemplate()) {\n <ng-container *ngTemplateOutlet=\"columnCustomLastTemplate(); context: {rowItem: item, rowIndex: idx}\"></ng-container>\n } @else if (columnCustomLastComponent()) {\n <div [mngComponent]=\"columnCustomLastComponent()\" (instanceCreated)=\"columnCustomLastComponentInstance.emit($event)\"></div>\n }\n </td>\n }\n </tr>\n </ng-template>\n <ng-template #expandedrow let-item>\n @if (metadata.descriptor().rowExpandable) {\n <tr>\n <td></td>\n <td [colSpan]=\"metadata.descriptor().rowExpandableColSpan\">\n @if (metadata.descriptor().rowExpandableComponentType !== undefined) {\n <ng-container [mngComponent]=\"metadata.descriptor().rowExpandableComponentType\" [inputs]=\"{item}\"> </ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"rowExpandTemplate(); context: {rowItem: item}\"></ng-container>\n }\n </td>\n </tr>\n }\n </ng-template>\n <ng-template #loadingicon>\n <div class=\"flex flex-col items-center\">\n @if (metadata.descriptor().loadingIcon) {\n <i [class]=\"'text-white text-4xl pi-spin ' + metadata.descriptor().loadingIcon\"></i>\n }\n @if (metadata.descriptor().loadingText) {\n <div class=\"text text-white text-lg font-semibold\" [ngClass]=\"{'mt-3': metadata.descriptor().loadingIcon}\">\n {{ metadata.descriptor().loadingText ?? '' | translate }}\n </div>\n }\n </div>\n </ng-template>\n <ng-template #loadingbody>\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n <div class=\"loading-text\"></div>\n <p-skeleton [ngStyle]=\"{width: '100%'}\"></p-skeleton>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td [attr.colspan]=\"columnsColspan()\">\n {{ 'mngTable.noItems' | translate }}\n </td>\n </tr>\n </ng-template>\n @if (footerTemplate()) {\n <ng-template #summary>\n <ng-container *ngTemplateOutlet=\"footerTemplate(); context: {data: data.data(), totalCount: data.count()}\"></ng-container>\n </ng-template>\n }\n </p-table>\n }\n</div>\n", styles: ["mng-table .p-datatable .p-datatable-header{border-top:0}mng-table .p-datatable:not(.p-datatable-gridlines) .p-datatable-tbody>tr>td{cursor:auto}mng-table .p-datatable:not(.p-datatable-gridlines) .p-datatable-tbody>tr>td.clickable{cursor:pointer}mng-table .p-datatable :is(.p-datatable-thead>tr>th,.p-datatable-tbody>tr>td):hover mng-table-column-value .help-buttons{display:block}mng-table .p-datatable .p-datatable-thead>tr>th.mng-table-column-custom-last{padding:var(--mng-table-column-head-custom-last, .1rem 1rem)}mng-table .p-datatable .p-datatable-tbody>tr>td{position:relative}mng-table .p-datatable .p-datatable-tbody>tr>td.mng-table-column-custom-last{padding-top:.1rem;padding-bottom:.1rem}mng-table .p-datatable .p-datatable-tbody>tr>td.p-datatable-frozen-column{position:sticky;z-index:1;background:transparent}mng-table .p-datatable.p-datatable-lg .p-datatable-tbody>tr>td.mng-table-column-custom-last{padding:var(--mng-table-column-body-custom-last, .15rem 1rem)}mng-table .p-datatable.p-datatable-sm .p-datatable-tbody>tr>td.mng-table-column-custom-last{padding:var(--mng-table-sm-column-body-custom-last, .05rem 1rem)}mng-table .p-datatable.p-datatable-flex-scrollable .p-datatable-thead>tr>th{overflow:hidden;text-overflow:ellipsis}mng-table .p-datatable.p-datatable-flex-scrollable .p-datatable-tbody>tr>td{overflow:hidden}mng-table .p-datatable .mng-table-row-localization-default-locale{background:var(--p-surface-100)!important}mng-table .mng-table-header>th:not(:first-child):not(:last-child){border-radius:0!important}mng-table .mng-table-header>th:first-child{border-top-right-radius:0!important;border-bottom-right-radius:0!important}mng-table .mng-table-header>th:last-child{border-radius:0!important}mng-table .mng-table-header .mng-table-columns-multiselect{width:36px}mng-table .mng-table-header .mng-table-columns-multiselect .p-multiselect-label-container{width:0}mng-table.mng-table-no-header p-datatable .p-datatable-header{display:none}mng-table.mng-table-header-compact .p-datatable-header{padding:var(--mng-table-header-compact-padding, 0 0 .5rem 0)}\n"] }]
2092
+ }], ctorParameters: () => [], propDecorators: null }) });
2093
+
2094
+ /**
2095
+ * Prepares providers for usage of the tableview functionalities.
2096
+ *
2097
+ * @returns {CommonsFeature} The `CommonsFeature` object with the layout configuration.
2098
+ */
2099
+ function withTable(config) {
2100
+ return {
2101
+ type: CommonsFeatureTypeEnum.Table,
2102
+ providers: [
2103
+ {
2104
+ provide: COMMONS_TABLE_FEATURE_CONFIG_IT,
2105
+ useValue: config
2106
+ }
2107
+ ]
2108
+ };
2109
+ }
2110
+
2111
+ // components
2112
+
2113
+ /**
2114
+ * Generated bundle index. Do not edit.
2115
+ */
2116
+
2117
+ export { COMMONS_TABLE_FEATURE_CONFIG_IT as C, FilterValuePipe as F, LocaleDefaultRowClassPipe as L, TableMetadataService as T, TablePreferencesService as a, TableColumnFilterComponent as b, TableColumnValueComponent as c, TableFilterActiveTagComponent as d, TableFilterFormComponent as e, TableFilterOverlayWithTagComponent as f, TableComponent as g, filterGenerateMatchModeOptions as h, filterGetDefaultMatchMode as i, filterSetMetadataOnChange as j, filterSetMetadataOnDisplayChange as k, filterAreDatesEqual as l, filterApplySerializationConfigToCmp as m, filterAdjustDisplayValueOnMatchModeChange as n, filterGetDateConfig as o, filterGetNumberConfig as p, createFilterDescriptorsFromGeneric as q, generateTableLayoutPrefsKey as r, TableColumnFilterClassPipe as s, tableNotificationError as t, TableDataService as u, withTable as w };
2118
+ //# sourceMappingURL=mediusinc-mng-commons-table-mediusinc-mng-commons-table-JZpyiDIL.mjs.map