@one-paragon/angular-utilities 2.1.3 → 2.1.5

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 (298) hide show
  1. package/karma.conf.js +44 -0
  2. package/ng-package.json +7 -0
  3. package/package.json +15 -27
  4. package/src/action-state/action-state-spinner/action-state-spinner.component.css +16 -0
  5. package/src/action-state/action-state-spinner/action-state-spinner.component.html +6 -0
  6. package/src/action-state/action-state-spinner/action-state-spinner.component.spec.ts +25 -0
  7. package/src/action-state/action-state-spinner/action-state-spinner.component.ts +25 -0
  8. package/src/action-state/action-state-ui/action-state-ui.module.ts +13 -0
  9. package/{action-state/index.d.ts → src/action-state/index.ts} +8 -4
  10. package/src/action-state/ngrx-ext/ngrx-ext.module.ts +15 -0
  11. package/src/action-state/ngrx.ts +69 -0
  12. package/src/http-request-state/RequestStateFactory.ts +56 -0
  13. package/src/http-request-state/RequestStateStore.ts +284 -0
  14. package/{http-request-state/deprecated.d.ts → src/http-request-state/deprecated.ts} +20 -20
  15. package/src/http-request-state/directives/HttpStateDirectiveBase.ts +29 -0
  16. package/src/http-request-state/directives/http-error-state-directive.ts +21 -0
  17. package/src/http-request-state/directives/http-inProgress-state-directive.ts +19 -0
  18. package/src/http-request-state/directives/http-notStarted-state-directive.ts +19 -0
  19. package/src/http-request-state/directives/http-success-state-directive.ts +29 -0
  20. package/{http-request-state/directives/index.d.ts → src/http-request-state/directives/index.ts} +5 -5
  21. package/src/http-request-state/directives/request-state-directive.spec.ts +73 -0
  22. package/src/http-request-state/directives/request-state-directive.ts +78 -0
  23. package/src/http-request-state/helpers.ts +30 -0
  24. package/src/http-request-state/http-state-module.ts +23 -0
  25. package/{http-request-state/index.d.ts → src/http-request-state/index.ts} +7 -7
  26. package/src/http-request-state/models/view-context.ts +18 -0
  27. package/src/http-request-state/observable.spec.ts +43 -0
  28. package/src/http-request-state/request-state.ts +69 -0
  29. package/src/http-request-state/rxjs/getRequestorBody.ts +10 -0
  30. package/src/http-request-state/rxjs/getRequestorState.ts +8 -0
  31. package/{http-request-state/rxjs/index.d.ts → src/http-request-state/rxjs/index.ts} +4 -4
  32. package/src/http-request-state/rxjs/tapError.ts +16 -0
  33. package/src/http-request-state/rxjs/tapSuccess.ts +16 -0
  34. package/src/http-request-state/strategies.spec.ts +42 -0
  35. package/src/http-request-state/types.ts +54 -0
  36. package/src/ngrx/actionable-selector.ts +160 -0
  37. package/src/ngrx/index.ts +1 -0
  38. package/{public-api.d.ts → src/public-api.ts} +35 -16
  39. package/src/rxjs/defaultShareReplay.ts +8 -0
  40. package/{rxjs/index.d.ts → src/rxjs/index.ts} +5 -5
  41. package/src/rxjs/mapError.ts +8 -0
  42. package/src/rxjs/rxjs-operators.ts +130 -0
  43. package/src/rxjs/subjectifier.ts +17 -0
  44. package/src/rxjs/subscriber.directive.ts +57 -0
  45. package/src/specs/clickSubject.spec.ts +95 -0
  46. package/src/specs/dialog.spec.ts +101 -0
  47. package/src/specs/toggleGroupDirective.spec.ts +229 -0
  48. package/src/table-builder/classes/DefaultSettings.ts +11 -0
  49. package/src/table-builder/classes/MatTableObservableDataSource.ts +23 -0
  50. package/src/table-builder/classes/TableBuilderConfig.ts +42 -0
  51. package/src/table-builder/classes/TableBuilderDataSource.ts +65 -0
  52. package/src/table-builder/classes/TableState.ts +125 -0
  53. package/src/table-builder/classes/data-store.ts +10 -0
  54. package/{table-builder/classes/display-col.d.ts → src/table-builder/classes/display-col.ts} +5 -5
  55. package/src/table-builder/classes/filter-info.ts +126 -0
  56. package/src/table-builder/classes/table-builder-general-settings.ts +198 -0
  57. package/src/table-builder/classes/table-builder.ts +105 -0
  58. package/src/table-builder/classes/table-store.helpers.ts +104 -0
  59. package/src/table-builder/classes/table-store.ts +440 -0
  60. package/src/table-builder/components/array-column.component.ts +34 -0
  61. package/src/table-builder/components/column-builder/column-builder.component.html +73 -0
  62. package/src/table-builder/components/column-builder/column-builder.component.scss +43 -0
  63. package/src/table-builder/components/column-builder/column-builder.component.spec.ts +49 -0
  64. package/src/table-builder/components/column-builder/column-builder.component.ts +129 -0
  65. package/src/table-builder/components/column-builder/column-helpers.ts +54 -0
  66. package/src/table-builder/components/column-header-menu/column-header-menu.component.html +109 -0
  67. package/src/table-builder/components/column-header-menu/column-header-menu.component.scss +97 -0
  68. package/src/table-builder/components/column-header-menu/column-header-menu.component.ts +94 -0
  69. package/src/table-builder/components/date-filter/date-filter.component.html +23 -0
  70. package/src/table-builder/components/date-filter/date-filter.component.ts +22 -0
  71. package/src/table-builder/components/date-time-filter/date-time-filter.component.html +9 -0
  72. package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +20 -0
  73. package/src/table-builder/components/filter/filter.component.html +103 -0
  74. package/src/table-builder/components/filter/filter.component.scss +60 -0
  75. package/src/table-builder/components/filter/filter.component.spec.ts +87 -0
  76. package/src/table-builder/components/filter/filter.component.ts +64 -0
  77. package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +85 -0
  78. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +60 -0
  79. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +57 -0
  80. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +44 -0
  81. package/src/table-builder/components/generic-table/generic-table.component.html +96 -0
  82. package/src/table-builder/components/generic-table/generic-table.component.scss +38 -0
  83. package/src/table-builder/components/generic-table/generic-table.component.ts +399 -0
  84. package/src/table-builder/components/generic-table/paginator.component.ts +106 -0
  85. package/src/table-builder/components/group-by-list/group-by-list.component.css +17 -0
  86. package/src/table-builder/components/group-by-list/group-by-list.component.html +14 -0
  87. package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +23 -0
  88. package/src/table-builder/components/group-by-list/group-by-list.component.ts +18 -0
  89. package/src/table-builder/components/in-filter/in-filter.component.css +3 -0
  90. package/src/table-builder/components/in-filter/in-filter.component.html +19 -0
  91. package/src/table-builder/components/in-filter/in-filter.component.ts +65 -0
  92. package/{table-builder/components/index.d.ts → src/table-builder/components/index.ts} +9 -9
  93. package/src/table-builder/components/initialization-component/initialization-component.html +78 -0
  94. package/src/table-builder/components/initialization-component/initialization-component.ts +27 -0
  95. package/src/table-builder/components/link-column.component.ts +42 -0
  96. package/src/table-builder/components/number-filter/number-filter.component.css +10 -0
  97. package/src/table-builder/components/number-filter/number-filter.component.html +22 -0
  98. package/src/table-builder/components/number-filter/number-filter.component.spec.ts +30 -0
  99. package/src/table-builder/components/number-filter/number-filter.component.ts +25 -0
  100. package/src/table-builder/components/profiles-menu/profiles-menu.component.html +76 -0
  101. package/src/table-builder/components/profiles-menu/profiles-menu.component.scss +126 -0
  102. package/src/table-builder/components/profiles-menu/profiles-menu.component.spec.ts +23 -0
  103. package/src/table-builder/components/profiles-menu/profiles-menu.component.ts +63 -0
  104. package/src/table-builder/components/reset-menu/reset-menu.component.css +3 -0
  105. package/src/table-builder/components/reset-menu/reset-menu.component.html +10 -0
  106. package/src/table-builder/components/reset-menu/reset-menu.component.ts +87 -0
  107. package/src/table-builder/components/scroll-strategy.ts +139 -0
  108. package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +57 -0
  109. package/src/table-builder/components/sort-menu/sort-menu.component.html +109 -0
  110. package/src/table-builder/components/sort-menu/sort-menu.component.scss +119 -0
  111. package/src/table-builder/components/sort-menu/sort-menu.component.ts +88 -0
  112. package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +112 -0
  113. package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +125 -0
  114. package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +120 -0
  115. package/src/table-builder/components/table-container/table-container.helpers/meta-data.helpers.ts +16 -0
  116. package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +47 -0
  117. package/src/table-builder/components/table-container/table-container.html +79 -0
  118. package/src/table-builder/components/table-container/table-container.scss +47 -0
  119. package/src/table-builder/components/table-container/table-container.ts +403 -0
  120. package/src/table-builder/components/table-container/tableProps.ts +18 -0
  121. package/src/table-builder/components/table-container/virtual-scroll-container.ts +216 -0
  122. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +34 -0
  123. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +44 -0
  124. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +42 -0
  125. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +11 -0
  126. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +85 -0
  127. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +36 -0
  128. package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +23 -0
  129. package/src/table-builder/components/table-header-menu/table-header-menu.component.css +21 -0
  130. package/src/table-builder/components/table-header-menu/table-header-menu.component.html +48 -0
  131. package/src/table-builder/components/table-header-menu/table-header-menu.component.ts +35 -0
  132. package/src/table-builder/directives/custom-cell-directive.ts +59 -0
  133. package/{table-builder/directives/index.d.ts → src/table-builder/directives/index.ts} +6 -5
  134. package/src/table-builder/directives/multi-sort.directive.spec.ts +124 -0
  135. package/src/table-builder/directives/multi-sort.directive.ts +50 -0
  136. package/src/table-builder/directives/resize-column.directive.ts +107 -0
  137. package/src/table-builder/directives/table-wrapper.directive.ts +13 -0
  138. package/src/table-builder/directives/tb-filter.directive.ts +376 -0
  139. package/src/table-builder/enums/filterTypes.ts +40 -0
  140. package/src/table-builder/functions/boolean-filter-function.ts +12 -0
  141. package/src/table-builder/functions/date-filter-function.ts +68 -0
  142. package/src/table-builder/functions/download-data.ts +11 -0
  143. package/src/table-builder/functions/null-filter-function.ts +9 -0
  144. package/src/table-builder/functions/number-filter-function.ts +41 -0
  145. package/src/table-builder/functions/sort-data-function.ts +80 -0
  146. package/src/table-builder/functions/string-filter-function.ts +51 -0
  147. package/{table-builder/interfaces/ColumnInfo.d.ts → src/table-builder/interfaces/ColumnInfo.ts} +7 -6
  148. package/src/table-builder/interfaces/column-template.ts +9 -0
  149. package/{table-builder/interfaces/dictionary.d.ts → src/table-builder/interfaces/dictionary.ts} +3 -3
  150. package/src/table-builder/interfaces/report-def.ts +186 -0
  151. package/src/table-builder/ngrx/tableBuilderStateStore.ts +197 -0
  152. package/src/table-builder/pipes/column-total.pipe.ts +16 -0
  153. package/src/table-builder/pipes/format-filter-type.pipe.ts +12 -0
  154. package/src/table-builder/pipes/format-filter-value.pipe.ts +40 -0
  155. package/src/table-builder/pipes/key-display.ts +13 -0
  156. package/src/table-builder/services/export-to-csv.service.ts +75 -0
  157. package/src/table-builder/services/link-creator.service.ts +98 -0
  158. package/src/table-builder/services/table-template-service.ts +47 -0
  159. package/src/table-builder/services/transform-creator.ts +96 -0
  160. package/src/table-builder/specs/table-custom-filters.spec.ts +262 -0
  161. package/src/table-builder/styles/collapser.styles.scss +16 -0
  162. package/src/table-builder/table-builder.module.ts +38 -0
  163. package/src/test.ts +17 -0
  164. package/src/utilities/array-helpers.ts +13 -0
  165. package/src/utilities/directives/auto-focus.directive.ts +20 -0
  166. package/src/utilities/directives/clickEmitterDirective.ts +15 -0
  167. package/src/utilities/directives/clickSubject.ts +19 -0
  168. package/src/utilities/directives/conditional-classes.directive.ts +36 -0
  169. package/src/utilities/directives/dialog-service.ts +19 -0
  170. package/src/utilities/directives/dialog.ts +144 -0
  171. package/src/utilities/directives/mat-toggle-group-directive.ts +60 -0
  172. package/src/utilities/directives/prevent-enter.directive.ts +12 -0
  173. package/src/utilities/directives/stop-propagation.directive.ts +19 -0
  174. package/src/utilities/directives/styler.ts +44 -0
  175. package/src/utilities/directives/trim-whitespace.directive.ts +20 -0
  176. package/{utilities/index.d.ts → src/utilities/index.ts} +22 -15
  177. package/src/utilities/module.ts +55 -0
  178. package/src/utilities/pipes/function.pipe.ts +21 -0
  179. package/src/utilities/pipes/phone.pipe.ts +20 -0
  180. package/src/utilities/pipes/space-case.pipes.spec.ts +47 -0
  181. package/src/utilities/pipes/space-case.pipes.ts +26 -0
  182. package/tsconfig.lib.json +20 -0
  183. package/tsconfig.lib.prod.json +10 -0
  184. package/tsconfig.spec.json +17 -0
  185. package/action-state/action-state-spinner/action-state-spinner.component.d.ts +0 -12
  186. package/action-state/action-state-ui/action-state-ui.module.d.ts +0 -7
  187. package/action-state/ngrx-ext/ngrx-ext.module.d.ts +0 -8
  188. package/action-state/ngrx.d.ts +0 -31
  189. package/fesm2022/one-paragon-angular-utilities.mjs +0 -6320
  190. package/fesm2022/one-paragon-angular-utilities.mjs.map +0 -1
  191. package/http-request-state/RequestStateFactory.d.ts +0 -17
  192. package/http-request-state/RequestStateStore.d.ts +0 -101
  193. package/http-request-state/directives/HttpStateDirectiveBase.d.ts +0 -14
  194. package/http-request-state/directives/http-error-state-directive.d.ts +0 -9
  195. package/http-request-state/directives/http-inProgress-state-directive.d.ts +0 -9
  196. package/http-request-state/directives/http-notStarted-state-directive.d.ts +0 -9
  197. package/http-request-state/directives/http-success-state-directive.d.ts +0 -16
  198. package/http-request-state/directives/request-state-directive.d.ts +0 -34
  199. package/http-request-state/helpers.d.ts +0 -9
  200. package/http-request-state/http-state-module.d.ts +0 -11
  201. package/http-request-state/request-state.d.ts +0 -12
  202. package/http-request-state/rxjs/getRequestorBody.d.ts +0 -3
  203. package/http-request-state/rxjs/getRequestorState.d.ts +0 -3
  204. package/http-request-state/rxjs/tapError.d.ts +0 -3
  205. package/http-request-state/rxjs/tapSuccess.d.ts +0 -3
  206. package/http-request-state/types.d.ts +0 -41
  207. package/index.d.ts +0 -5
  208. package/ngrx/actionable-selector.d.ts +0 -32
  209. package/ngrx/index.d.ts +0 -1
  210. package/rxjs/defaultShareReplay.d.ts +0 -2
  211. package/rxjs/mapError.d.ts +0 -2
  212. package/rxjs/rxjs-operators.d.ts +0 -13
  213. package/rxjs/subjectifier.d.ts +0 -10
  214. package/rxjs/subscriber.directive.d.ts +0 -14
  215. package/table-builder/classes/DefaultSettings.d.ts +0 -9
  216. package/table-builder/classes/MatTableObservableDataSource.d.ts +0 -9
  217. package/table-builder/classes/TableBuilderConfig.d.ts +0 -23
  218. package/table-builder/classes/TableBuilderDataSource.d.ts +0 -18
  219. package/table-builder/classes/TableState.d.ts +0 -81
  220. package/table-builder/classes/data-store.d.ts +0 -8
  221. package/table-builder/classes/filter-info.d.ts +0 -39
  222. package/table-builder/classes/table-builder-general-settings.d.ts +0 -117
  223. package/table-builder/classes/table-builder.d.ts +0 -22
  224. package/table-builder/classes/table-store.d.ts +0 -146
  225. package/table-builder/classes/table-store.helpers.d.ts +0 -31
  226. package/table-builder/components/array-column.component.d.ts +0 -15
  227. package/table-builder/components/column-builder/column-builder.component.d.ts +0 -41
  228. package/table-builder/components/column-builder/column-helpers.d.ts +0 -38
  229. package/table-builder/components/column-header-menu/column-header-menu.component.d.ts +0 -50
  230. package/table-builder/components/date-filter/date-filter.component.d.ts +0 -37
  231. package/table-builder/components/date-time-filter/date-time-filter.component.d.ts +0 -37
  232. package/table-builder/components/filter/filter.component.d.ts +0 -48
  233. package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +0 -23
  234. package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +0 -17
  235. package/table-builder/components/generic-table/generic-table.component.d.ts +0 -84
  236. package/table-builder/components/generic-table/paginator.component.d.ts +0 -26
  237. package/table-builder/components/group-by-list/group-by-list.component.d.ts +0 -7
  238. package/table-builder/components/in-filter/in-filter.component.d.ts +0 -20
  239. package/table-builder/components/initialization-component/initialization-component.d.ts +0 -15
  240. package/table-builder/components/link-column.component.d.ts +0 -23
  241. package/table-builder/components/number-filter/number-filter.component.d.ts +0 -39
  242. package/table-builder/components/profiles-menu/profiles-menu.component.d.ts +0 -33
  243. package/table-builder/components/reset-menu/reset-menu.component.d.ts +0 -25
  244. package/table-builder/components/scroll-strategy.d.ts +0 -45
  245. package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +0 -24
  246. package/table-builder/components/sort-menu/sort-menu.component.d.ts +0 -19
  247. package/table-builder/components/table-container/table-container.d.ts +0 -104
  248. package/table-builder/components/table-container/table-container.helpers/data-state.helpers.d.ts +0 -7
  249. package/table-builder/components/table-container/table-container.helpers/filter-state.helpers.d.ts +0 -19
  250. package/table-builder/components/table-container/table-container.helpers/groupBy.helpers.d.ts +0 -19
  251. package/table-builder/components/table-container/table-container.helpers/meta-data.helpers.d.ts +0 -2
  252. package/table-builder/components/table-container/table-container.helpers/sort-state.helpers.d.ts +0 -12
  253. package/table-builder/components/table-container/tableProps.d.ts +0 -10
  254. package/table-builder/components/table-container/virtual-scroll-container.d.ts +0 -40
  255. package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +0 -15
  256. package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +0 -12
  257. package/table-builder/components/table-container-filter/table-wrapper-filter-store.d.ts +0 -14
  258. package/table-builder/components/table-header-menu/table-header-menu.component.d.ts +0 -15
  259. package/table-builder/directives/custom-cell-directive.d.ts +0 -34
  260. package/table-builder/directives/multi-sort.directive.d.ts +0 -10
  261. package/table-builder/directives/resize-column.directive.d.ts +0 -43
  262. package/table-builder/directives/table-wrapper.directive.d.ts +0 -8
  263. package/table-builder/directives/tb-filter.directive.d.ts +0 -116
  264. package/table-builder/enums/filterTypes.d.ts +0 -36
  265. package/table-builder/functions/boolean-filter-function.d.ts +0 -3
  266. package/table-builder/functions/date-filter-function.d.ts +0 -4
  267. package/table-builder/functions/download-data.d.ts +0 -1
  268. package/table-builder/functions/null-filter-function.d.ts +0 -2
  269. package/table-builder/functions/number-filter-function.d.ts +0 -4
  270. package/table-builder/functions/sort-data-function.d.ts +0 -5
  271. package/table-builder/functions/string-filter-function.d.ts +0 -5
  272. package/table-builder/interfaces/report-def.d.ts +0 -171
  273. package/table-builder/ngrx/tableBuilderStateStore.d.ts +0 -69
  274. package/table-builder/pipes/column-total.pipe.d.ts +0 -8
  275. package/table-builder/pipes/format-filter-type.pipe.d.ts +0 -8
  276. package/table-builder/pipes/format-filter-value.pipe.d.ts +0 -11
  277. package/table-builder/pipes/key-display.d.ts +0 -9
  278. package/table-builder/services/export-to-csv.service.d.ts +0 -14
  279. package/table-builder/services/link-creator.service.d.ts +0 -16
  280. package/table-builder/services/table-template-service.d.ts +0 -14
  281. package/table-builder/services/transform-creator.d.ts +0 -7
  282. package/table-builder/table-builder.module.d.ts +0 -14
  283. package/utilities/array-helpers.d.ts +0 -1
  284. package/utilities/directives/auto-focus.directive.d.ts +0 -9
  285. package/utilities/directives/clickEmitterDirective.d.ts +0 -7
  286. package/utilities/directives/clickSubject.d.ts +0 -9
  287. package/utilities/directives/conditional-classes.directive.d.ts +0 -12
  288. package/utilities/directives/dialog-service.d.ts +0 -10
  289. package/utilities/directives/dialog.d.ts +0 -45
  290. package/utilities/directives/mat-toggle-group-directive.d.ts +0 -21
  291. package/utilities/directives/prevent-enter.directive.d.ts +0 -6
  292. package/utilities/directives/stop-propagation.directive.d.ts +0 -7
  293. package/utilities/directives/styler.d.ts +0 -16
  294. package/utilities/directives/trim-whitespace.directive.d.ts +0 -7
  295. package/utilities/module.d.ts +0 -19
  296. package/utilities/pipes/function.pipe.d.ts +0 -11
  297. package/utilities/pipes/phone.pipe.d.ts +0 -8
  298. package/utilities/pipes/space-case.pipes.d.ts +0 -17
@@ -0,0 +1,125 @@
1
+ import { Timestamp } from "rxjs";
2
+ import { CustomFilter, FilterInfo, createFilterFunc, isCustomFilter, isFilterInfo, needsFilterCreation } from "../../../classes/filter-info";
3
+ import { Dictionary } from "../../../interfaces/dictionary";
4
+ import { Predicate } from "@angular/core";
5
+ import { difference, intersection } from "lodash";
6
+ import { TableCustomFilterDirective, TableFilterDirective } from "../../../directives";
7
+
8
+ //The idea of this is that if filters were only added, and none were removed or changed, then we only need to tag more rows to not be shown. We don't need to remove any 'dont show' tags.
9
+ // So if filters were only added this method will return the added filters, if filters were removed or changed this method will return undefined.
10
+ export const updateFilterInfoState = <T>(previousState: FilterInfoState<T>, filterInfos: FilterInfoDict) => {
11
+ filterInfos = filterNonActiveOrNotReadyFilters(filterInfos);
12
+ const currentState: FilterInfoState<T> = {
13
+ allFilters: filterInfos,
14
+ onlyAddedFilters: filterInfoOnlyAdded(previousState.allFilters, filterInfos)
15
+ }
16
+ return currentState;
17
+ }
18
+
19
+ export const mapFilterInfoStateToPredicateState = <T>(s: FilterInfoState<T>): FilterPredicateState<T> => {
20
+ const mappedAddOnly: {[key in keyof T]: Predicate<T>} =
21
+ s.onlyAddedFilters
22
+ ?
23
+ Object.entries(s.onlyAddedFilters).filter(([, v]) => needsFilterCreation(v)).reduce((obj, [key, value]) => {
24
+ obj[key] = createFilterFunc(value);
25
+ return obj;
26
+ }, {} as {[key in keyof T]: Predicate<T>})
27
+ : {} as {[key in keyof T]: Predicate<T>};
28
+ const mappedAll = Object.entries(s.allFilters).filter(([, v]) => needsFilterCreation(v))
29
+ .filter(([,v])=> !isCustomFilter(v) || !!v.predicate)
30
+ .map(([key, value]) => {
31
+ return mappedAddOnly[key] || createFilterFunc(value);
32
+ });
33
+ return ({
34
+ allFilters: mappedAll,
35
+ onlyAddedFilters: s.onlyAddedFilters ? Object.values(mappedAddOnly) : undefined
36
+ })
37
+ }
38
+
39
+ export const updateFilterPredicateState = <T>(previousState: FilterPredicateState<T>, filters: Predicate<any>[]) => {
40
+ const currentState: FilterPredicateState<T> = {
41
+ allFilters: filters,
42
+ onlyAddedFilters: predicatesOnlyAdded(previousState.allFilters, filters)
43
+ }
44
+ return currentState;
45
+ }
46
+
47
+ export const updateFilterState = <T>(filterInfos: Timestamp<FilterInfoState<T>>, predicates: Timestamp<FilterPredicateState<T>>): FilterPredicateState<T> => {
48
+ const infos = mapFilterInfoStateToPredicateState(filterInfos.value);
49
+ const filtersState: FilterPredicateState<T> = {
50
+ allFilters: [...infos.allFilters, ...predicates.value.allFilters]
51
+ }
52
+ if(filterInfos.timestamp > predicates.timestamp && !!filterInfos.value.onlyAddedFilters){
53
+ filtersState.onlyAddedFilters = infos.onlyAddedFilters;
54
+ } else {
55
+ filtersState.onlyAddedFilters = predicates.value.onlyAddedFilters
56
+ }
57
+ return filtersState
58
+ }
59
+
60
+
61
+ const filterNonActiveOrNotReadyFilters = (filtersDict : FilterInfoDict) => Object.entries(filtersDict).reduce((obj ,[key, value]) => {
62
+ if(value.active !== false && (!isCustomFilter(value) || !!value.predicate)){
63
+ obj[key] = value
64
+ };
65
+ return obj;
66
+ }, {} as Dictionary<FilterInfo | CustomFilter>);
67
+
68
+
69
+ function filterInfoOnlyAdded(previousFilterInfos: FilterInfoDict, currentFilterInfos: FilterInfoDict): FilterInfoDict | undefined{
70
+ const previousKeys = Object.keys(previousFilterInfos);
71
+ const currentKeys = Object.keys(currentFilterInfos);
72
+ const keysInBoth = intersection(previousKeys, currentKeys);
73
+ const someRemoved = previousKeys.length > keysInBoth.length;
74
+ if(someRemoved || !previousKeys.length){
75
+ return undefined;
76
+ }
77
+ if(filtersInfosUpdated(previousFilterInfos, currentFilterInfos)){
78
+ return undefined;
79
+ }
80
+ const addedFilters = difference(currentKeys, keysInBoth).reduce((dict, key) => {
81
+ dict[key] = currentFilterInfos[key];
82
+ return dict;
83
+ }, {} as FilterInfoDict);
84
+ return addedFilters;
85
+ }
86
+
87
+ function predicatesOnlyAdded(previousPredicates: Predicate<any>[], currentPredicates: Predicate<any>[]){
88
+ if(!previousPredicates.length){
89
+ return undefined;
90
+ }
91
+ const predicateFiltersRemoved = difference(previousPredicates, currentPredicates).length;
92
+ if(predicateFiltersRemoved){
93
+ return undefined;
94
+ }
95
+ return difference(currentPredicates, previousPredicates);
96
+ }
97
+
98
+ function filtersInfosUpdated(previousFilterInfos: FilterInfoDict<any>, currentFilterInfos: FilterInfoDict<any>){
99
+ return !Object.entries(previousFilterInfos).every(([key, val]) => {
100
+ return currentFilterInfos[key].filterType === val.filterType && currentFilterInfos[key].filterValue === val.filterValue
101
+ })
102
+ }
103
+
104
+ export function patchDirectiveFromState(directive: (TableCustomFilterDirective | TableFilterDirective), stateFilter: FilterInfo | CustomFilter){
105
+ if(isFilterInfo(stateFilter)) {
106
+ const filterDirective: TableFilterDirective = directive as TableFilterDirective;
107
+ filterDirective.setFilterValue(stateFilter.filterValue);
108
+ filterDirective.update();
109
+ }
110
+ if(isCustomFilter(stateFilter)) {
111
+ directive.active = stateFilter.active ?? false;
112
+ }
113
+ }
114
+
115
+ export interface FilterInfoState<T> {
116
+ allFilters: FilterInfoDict<T>,
117
+ onlyAddedFilters?: FilterInfoDict<T> | undefined,
118
+ }
119
+
120
+ export interface FilterPredicateState<T> {
121
+ allFilters: Predicate<T>[],
122
+ onlyAddedFilters?: Predicate<T>[] | undefined,
123
+ }
124
+
125
+ export type FilterInfoDict<T = any> = Dictionary<FilterInfo<any, T> | CustomFilter<any>>;
@@ -0,0 +1,120 @@
1
+ import { groupBy } from "lodash";
2
+ import { Timestamp } from "rxjs";
3
+ import { DataGroup, Group, GroupedData, GroupGroup, NoneGroupHeader } from "../../../classes/TableState";
4
+ import { initIndexSymbol } from "./sort-state.helpers";
5
+ import { Dictionary } from "@ngrx/entity";
6
+
7
+ const supportsGroupBy = typeof Object.groupBy === 'function'
8
+
9
+ function getGroupedData<T extends NoneGroupHeader>(data: T[], groupByKeys: string[]) {
10
+ return tbGroupBy(data, groupByKeys);
11
+ }
12
+
13
+ const tbGroupBy = <T extends NoneGroupHeader = any>(data: T[], groupByKeys: string[], level= 1, parentGroupName?: string) => {
14
+ const currentKey = groupByKeys[0];
15
+ const groupedDataArr = groupData(currentKey, data, level, parentGroupName);
16
+
17
+ const remainingGroupByKeys = groupByKeys.slice(1);
18
+ const hasChildrenGroups = !!remainingGroupByKeys.length;
19
+
20
+ if (hasChildrenGroups) {
21
+ //group the children by iterating over each group and grouping it by the next keys
22
+ const groupOfGroups = groupedDataArr.map((group: DataGroup<T>) => {
23
+ const children = group.children;
24
+ const groupGroup = {
25
+ groupName: group.groupName,
26
+ groupHeaderDisplay: group.groupHeaderDisplay,
27
+ uniqueName: group.uniqueName,
28
+ key: currentKey,
29
+ hasTheData: false,
30
+ isGroupHeader: true,
31
+ padding : group.padding,
32
+ level: group.level,
33
+ length: group.length,
34
+ groups: tbGroupBy(children as T[], remainingGroupByKeys, level + 1, group.groupName),
35
+ [initIndexSymbol]: group[initIndexSymbol],
36
+ } as GroupGroup<T>;
37
+ return groupGroup;
38
+ });
39
+ return groupOfGroups;
40
+ }
41
+
42
+ return groupedDataArr;
43
+ }
44
+
45
+ function groupData<T extends NoneGroupHeader = any>(groupByKey: string, groupData: T[], level = 1, parentGroupName?: string){
46
+ const groupedDataDict: Record<string, (T)[]> = supportsGroupBy ? Object.groupBy(groupData, d => d[groupByKey]) as Record<string, T[]> : groupBy(groupData, groupByKey);
47
+ const groupedDataArr = Object.entries(groupedDataDict).map(([name, groupData]) => {
48
+ const uniqueName = parentGroupName ? `${parentGroupName}-${name}` : `${name}`;
49
+
50
+ return ({
51
+ isGroupHeader: true,
52
+ groupHeaderDisplay: name,
53
+ hasTheData: true,
54
+ children: groupData,
55
+ groupName: `tb_group_${uniqueName}`,
56
+ padding: 1 + (20 * (level - 1)),
57
+ key: groupByKey,
58
+ length : groupData.length,
59
+ uniqueName,
60
+ level,
61
+ [initIndexSymbol]: uniqueName,
62
+ } as DataGroup<T>)
63
+ });
64
+ return groupedDataArr;
65
+ }
66
+
67
+ export function updateGroupByState<T extends NoneGroupHeader = any>(groupedData: any[], { data, groups, expanded}: { data: Timestamp<T[]>, groups: Timestamp<string[]>, expanded: Timestamp<GroupedData[]>}, firstRun: boolean){
68
+ if(
69
+ firstRun
70
+ || dataUpdated(data, groups, expanded)
71
+ || groupsUpdated(groups, expanded)
72
+ ){
73
+ groupedData = groups.value.length ? getGroupedData(data.value, groups.value) : data.value;
74
+ }
75
+ const newDisplayData = expanded.value.length === 0
76
+ ? groupedData
77
+ : groupedData.map(group => mapGroupHeader(group, expanded.value.flatMap(g => g.expandedHeaders))).flat();
78
+ return ({displayData: newDisplayData, groupedData}) as GroupByState;
79
+ }
80
+
81
+ export function mapGroupHeader(obj: DataGroup | GroupGroup, expandedHeaders: string[] | true): any[]{
82
+ const showChildren = expandedHeaders === true || expandedHeaders.includes(obj.groupName);
83
+ const children = !showChildren ? [] :
84
+ obj.hasTheData ? obj.children
85
+ : obj.groups.map(a => mapGroupHeader(a, expandedHeaders))
86
+ return [obj, ...children].flat() as any[]
87
+ }
88
+
89
+ function dataUpdated(data: Timestamp<any[]>, groups: Timestamp<string[]>, expandedGroups: Timestamp<GroupedData[]>){
90
+ return data.timestamp > groups.timestamp && data.timestamp > expandedGroups.timestamp;
91
+ }
92
+
93
+ function groupsUpdated(groups: Timestamp<string[]>, expandedGroups: Timestamp<GroupedData[]>){
94
+ return groups.timestamp >= expandedGroups.timestamp;
95
+ }
96
+
97
+ export interface GroupByState { displayData: any[], groupedData: DataGroup[]};
98
+
99
+ export const initialGroupByState = { displayData: [], groupedData: []}
100
+
101
+ export const getAllGroupHeaderNames = (data: any[]) => {
102
+ const groups = getGroupHeaders(data, (d:any) => d.isGroupHeader);
103
+ const a = supportsGroupBy ? Object.groupBy(groups, group => group.key) as Dictionary<Group[]> : groupBy(groups, 'key');
104
+ return Object.entries(a).reduce((names, [key, groups]) => {
105
+ names[key] = groups!.map(g => ({groupName: g.groupName, key: g.key}));
106
+ return names;
107
+ }, {})
108
+ }
109
+
110
+ export const getAllGroupHeaderNamesByKeys = (data: any[], keys: string[]) => {
111
+ const groups = getGroupHeaders(data, (d:any) => d.isGroupHeader && keys.includes(d.key));
112
+ return supportsGroupBy ? Object.groupBy(groups, group => group.key) as Dictionary<Group[]> : groupBy(groups, 'key');
113
+ }
114
+
115
+ const getGroupHeaders = (data: any[], filterFunc: (d:any) => boolean, arr:Group[] = []) => {
116
+ const headers: Group[] = data.filter(filterFunc);
117
+ arr.push(...headers);
118
+ headers.forEach(h => {if(h.hasTheData === false && !!h.groups.length) getGroupHeaders(h.groups, filterFunc, arr)});
119
+ return arr;
120
+ }
@@ -0,0 +1,16 @@
1
+ import { CustomCellMeta, MetaData } from "../../../interfaces/report-def";
2
+
3
+ export function mergeCustomCellMetaData(metaData1: CustomCellMeta, metaData2?: MetaData): MetaData {
4
+ if(!metaData2){
5
+ metaData1.noExport = true;
6
+ return metaData1
7
+ }
8
+ if(!metaData1.displayName) metaData1.displayName = metaData2.displayName;
9
+ if(!metaData1.preSort) metaData1.preSort = metaData2.preSort;
10
+ if(!metaData1.order) metaData1.order = metaData2.order;
11
+ if(!metaData1.width) metaData1.width = metaData2.width;
12
+ if(metaData2.fieldType) metaData1.fieldType = metaData2.fieldType;
13
+ metaData1.noExport = metaData2.noExport;
14
+
15
+ return ({ ...metaData2, ...metaData1 });
16
+ }
@@ -0,0 +1,47 @@
1
+ import { Sort } from "@angular/material/sort";
2
+ import { SortDirection } from "../../../interfaces/report-def";
3
+ import { difference } from "lodash";
4
+
5
+ // If we are only sorting due to a change in the Sorts[] we can 'optimize'. If the sort array was first by column a asc then by column b desc then by column c asc,
6
+ // and now it is first by column d asc then by column a desc then by column b desc then by column c asc, we dont need to rerun the tail, i.e. for culumn b and c.
7
+ // So we need to calculate the matching tail of the sort array. Then sortsToRun will be the non-matching head.
8
+ // But if any sorts were removed the only way to 'unsort' is to start by the original data and run all the existing sorts again, so 'sorts to run' will be all
9
+ // the sorts.
10
+ // We always pass allSorts to the container because if the table data changes all the sorts will need to be run.
11
+ export function updateSortState(previousSorts: SortState, currentSorts: TableBuilderSort[]): SortState{
12
+ currentSorts = addInitSort(currentSorts);
13
+ if(sortsRemoved(previousSorts.allSorts, currentSorts)){
14
+ return ({sortsToRun: currentSorts, allSorts: currentSorts});
15
+ }
16
+ const sameTailLength = getSameTailLength(previousSorts.allSorts, currentSorts);
17
+ const sortsToRun = currentSorts.slice(0, currentSorts.length - sameTailLength);
18
+ return ({sortsToRun, allSorts: currentSorts});
19
+ }
20
+
21
+ export interface SortState { sortsToRun: TableBuilderSort[], allSorts: TableBuilderSort[]}
22
+
23
+ function addInitSort(sorts: TableBuilderSort[]){
24
+ return [...sorts, {active: initIndexSymbol as unknown as string, direction: 'asc' as SortDirection}];
25
+ }
26
+
27
+ function sortsRemoved(previousSorts: TableBuilderSort[], currentSorts: TableBuilderSort[]): boolean{
28
+ const previousSortedColumns = previousSorts.map(s => s.active);
29
+ const currentSortedColumns = currentSorts.map(s => s.active);
30
+ const sortsRemoved = !!difference(previousSortedColumns, currentSortedColumns).length;
31
+ return sortsRemoved;
32
+ }
33
+
34
+
35
+ function getSameTailLength(previousSorts: TableBuilderSort[], currentSorts: TableBuilderSort[]){
36
+ previousSorts = [...previousSorts].reverse();
37
+ currentSorts = [...currentSorts].reverse();
38
+ let indexOfChange = currentSorts.findIndex((s, i) => s.active !== previousSorts[i]?.active || s.direction !== previousSorts[i]?.direction);
39
+ if(indexOfChange === -1) return indexOfChange = currentSorts.length;
40
+ return indexOfChange;
41
+ }
42
+
43
+ export const initIndexSymbol = Symbol('tb_init_index');
44
+
45
+ export const initialSortState: SortState = { sortsToRun: [], allSorts: []};
46
+
47
+ export type TableBuilderSort = Sort & { nulls?: 'first' | 'last' , sortBy?: (t) => any }
@@ -0,0 +1,79 @@
1
+ @let tableId = $tableId();
2
+ @let tableSettings = state.$tableSettings();
3
+
4
+ <ng-content select="[before]" />
5
+ <ng-container multiSort>
6
+ <div class="tb-header-wrapper" [id]="headerId">
7
+ <div class="title">
8
+ @if ((!$collapsedHeader()) || tableSettings.showTitleWhenHeaderCollapsed)
9
+ {
10
+ <ng-content select=".tb-header-title"/>
11
+ }
12
+ </div>
13
+ @if(state.$groupByKeys().length){
14
+ <group-by-list />
15
+ }
16
+ <div class="flx-row-end">
17
+ <lib-filter-list />
18
+ @if (!tableSettings.hideHeader)
19
+ {
20
+ @if (!$collapsedHeader())
21
+ {
22
+ <ng-container *ngTemplateOutlet="headerMenu"/>
23
+ <button mat-icon-button color='primary' [matMenuTriggerFor]="l.menu()">
24
+ <mat-icon>more_vert</mat-icon>
25
+ </button>
26
+
27
+ <lib-table-header-menu #l/>
28
+
29
+ }
30
+ @else {
31
+ <mat-icon color="primary" [matMenuTriggerFor]="mainMenu" class="flat-menu-button pointer">more_horiz</mat-icon>
32
+ <mat-menu #mainMenu='matMenu'>
33
+ <div class="flex-column">
34
+ <ng-container *ngTemplateOutlet="headerMenu; injector menuInjector"/>
35
+ </div>
36
+ <lib-table-header-menu />
37
+ </mat-menu>
38
+ }
39
+ <mat-icon [matTooltip]="$collapsedHeader() ? 'expand' : 'collapse'" class="collapse-icon header"
40
+ (click)="state.toggleCollapseHeader()">
41
+ {{$collapsedHeader() ? 'expand_less' : 'expand_more'}}
42
+ </mat-icon>
43
+ }
44
+
45
+ </div>
46
+ </div>
47
+
48
+ @if($useVirtual())
49
+ {
50
+ <tb-virtual-scroll-container class="scrollable">
51
+ <tb-generic-table [rows]="$customRows()" [data]="$data()!" [displayDataLength]="$displayDataLength()"
52
+ (selection)='selection$.emit($event)' [columnInfos]='$myColumns()' [trackBy]="$trackBy()" [dataSource]="dataSource" />
53
+ </tb-virtual-scroll-container>
54
+ }
55
+ @else
56
+ {
57
+ <tb-generic-table [rows]="$customRows()" [data]="$data()!" [displayDataLength]="$displayDataLength()"
58
+ (selection)='selection$.emit($event)' [columnInfos]='$myColumns()' [trackBy]="$trackBy()" [dataSource]="dataSource" />
59
+ }
60
+ @if(tableSettings.usePaginator)
61
+ {
62
+ <div class="paginator">
63
+ <tb-paginator #tbPaginator />
64
+
65
+ <mat-icon [matTooltip]="$collapsedFooter() ? 'expand' : 'collapse'" class="collapse-icon footer"
66
+ (click)="state.toggleCollapseFooter()">
67
+ {{$collapsedFooter() ? 'expand_more' : 'expand_less'}}
68
+ </mat-icon>
69
+ </div>
70
+ }
71
+
72
+ <ng-template #headerMenu>
73
+ @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}
74
+ @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}
75
+ @if (!tableSettings.hideSort) {<tb-sort-menu/>}
76
+ @if (!!tableId) {<tb-profiles-menu [tableId]="tableId"/>}
77
+ </ng-template>
78
+
79
+ </ng-container>
@@ -0,0 +1,47 @@
1
+ .tb-header-wrapper{
2
+ display: flex;
3
+ flex-direction: row;
4
+ width:100%;
5
+ }
6
+
7
+
8
+ .flx-row-end{
9
+ display: flex;
10
+ flex-direction: row;
11
+ justify-content: flex-end;
12
+ align-items: center;
13
+ margin-left: auto;
14
+ }
15
+
16
+ .flat-menu{
17
+ line-height: initial;
18
+ height: initial;
19
+ }
20
+
21
+ .pointer{
22
+ cursor: pointer;
23
+ }
24
+
25
+ .add-key{
26
+ width: 90%;
27
+ }
28
+
29
+ .paginator{
30
+ display: flex;
31
+ flex-direction: row;
32
+ justify-content: flex-end;
33
+ align-items: center;
34
+ background-color: white;
35
+ bottom: 0px;
36
+ position: sticky;
37
+ border-top: .5px solid rgba(0,0,0,.12);
38
+ }
39
+ .profiles-menu{
40
+ visibility: hidden;
41
+ width: 0px;
42
+ height: 0px;
43
+ display: block;
44
+ overflow: hidden;
45
+ position: absolute;
46
+ top: 50px;
47
+ }