@one-paragon/angular-utilities 0.3.10 → 0.3.11-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/karma.conf.js +44 -0
  2. package/ng-package.json +7 -0
  3. package/package.json +16 -30
  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 +26 -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/HttpRequestStateFactory.ts +29 -0
  13. package/src/http-request-state/HttpRequestStateStore.ts +147 -0
  14. package/src/http-request-state/directives/HttpStateDirectiveBase.ts +38 -0
  15. package/src/http-request-state/directives/http-error-state-directive.ts +32 -0
  16. package/src/http-request-state/directives/http-inProgress-state-directive.ts +32 -0
  17. package/src/http-request-state/directives/http-notStarted-state-directive.ts +31 -0
  18. package/src/http-request-state/directives/http-success-state-directive.ts +40 -0
  19. package/src/http-request-state/directives/request-state-directive.spec.ts +72 -0
  20. package/src/http-request-state/directives/request-state-directive.ts +79 -0
  21. package/src/http-request-state/helpers.ts +30 -0
  22. package/src/http-request-state/http-request-state.ts +69 -0
  23. package/src/http-request-state/http-state-module.ts +23 -0
  24. package/{http-request-state/index.d.ts → src/http-request-state/index.ts} +1 -1
  25. package/src/http-request-state/observable.spec.ts +43 -0
  26. package/src/http-request-state/rxjs/getRequestorBody.ts +10 -0
  27. package/src/http-request-state/rxjs/getRequestorState.ts +8 -0
  28. package/src/http-request-state/rxjs/tapError.ts +16 -0
  29. package/src/http-request-state/rxjs/tapSuccess.ts +16 -0
  30. package/src/http-request-state/strategies.spec.ts +42 -0
  31. package/src/http-request-state/types.ts +50 -0
  32. package/src/ngrx/actionable-selector.ts +95 -0
  33. package/src/ngrx/index.ts +1 -0
  34. package/{public-api.d.ts → src/public-api.ts} +35 -16
  35. package/src/rxjs/defaultShareReplay.ts +8 -0
  36. package/{rxjs/index.d.ts → src/rxjs/index.ts} +4 -4
  37. package/src/rxjs/mapError.ts +8 -0
  38. package/src/rxjs/rxjs-operators.ts +132 -0
  39. package/src/rxjs/subjectifier.ts +15 -0
  40. package/src/specs/clickSubject.spec.ts +95 -0
  41. package/src/specs/dialog.spec.ts +101 -0
  42. package/src/specs/toggleGroupDirective.spec.ts +229 -0
  43. package/src/table-builder/classes/DefaultSettings.ts +11 -0
  44. package/src/table-builder/classes/MatTableObservableDataSource.ts +23 -0
  45. package/src/table-builder/classes/TableBuilderConfig.ts +35 -0
  46. package/src/table-builder/classes/TableBuilderDataSource.ts +57 -0
  47. package/src/table-builder/classes/TableState.ts +83 -0
  48. package/src/table-builder/classes/filter-info.ts +131 -0
  49. package/src/table-builder/classes/table-builder-general-settings.ts +90 -0
  50. package/src/table-builder/classes/table-builder.ts +52 -0
  51. package/src/table-builder/classes/table-store.ts +394 -0
  52. package/src/table-builder/components/array-column.component.ts +36 -0
  53. package/src/table-builder/components/column-builder/column-builder.component.html +58 -0
  54. package/src/table-builder/components/column-builder/column-builder.component.scss +43 -0
  55. package/src/table-builder/components/column-builder/column-builder.component.spec.ts +49 -0
  56. package/src/table-builder/components/column-builder/column-builder.component.ts +117 -0
  57. package/src/table-builder/components/column-builder/column-helpers.ts +38 -0
  58. package/src/table-builder/components/date-filter/date-filter.component.html +23 -0
  59. package/src/table-builder/components/date-filter/date-filter.component.ts +24 -0
  60. package/src/table-builder/components/date-time-filter/date-time-filter.component.html +9 -0
  61. package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +22 -0
  62. package/src/table-builder/components/filter/filter.component.html +88 -0
  63. package/src/table-builder/components/filter/filter.component.scss +64 -0
  64. package/src/table-builder/components/filter/filter.component.spec.ts +87 -0
  65. package/src/table-builder/components/filter/filter.component.ts +55 -0
  66. package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +92 -0
  67. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +55 -0
  68. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +57 -0
  69. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +55 -0
  70. package/src/table-builder/components/generic-table/generic-table.component.html +71 -0
  71. package/src/table-builder/components/generic-table/generic-table.component.scss +51 -0
  72. package/src/table-builder/components/generic-table/generic-table.component.ts +220 -0
  73. package/src/table-builder/components/generic-table/paginator.component.ts +94 -0
  74. package/src/table-builder/components/group-by-list/group-by-list.component.css +8 -0
  75. package/src/table-builder/components/group-by-list/group-by-list.component.html +12 -0
  76. package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +23 -0
  77. package/src/table-builder/components/group-by-list/group-by-list.component.ts +21 -0
  78. package/src/table-builder/components/header-menu/header-menu.component.html +98 -0
  79. package/src/table-builder/components/header-menu/header-menu.component.scss +96 -0
  80. package/src/table-builder/components/header-menu/header-menu.component.ts +98 -0
  81. package/src/table-builder/components/in-filter/in-filter.component.css +3 -0
  82. package/src/table-builder/components/in-filter/in-filter.component.html +20 -0
  83. package/src/table-builder/components/in-filter/in-filter.component.ts +64 -0
  84. package/{table-builder/components/index.d.ts → src/table-builder/components/index.ts} +9 -9
  85. package/src/table-builder/components/initialization-component/initialization-component.html +29 -0
  86. package/src/table-builder/components/initialization-component/initialization-component.ts +24 -0
  87. package/src/table-builder/components/link-column.component.ts +47 -0
  88. package/src/table-builder/components/number-filter/number-filter.component.css +10 -0
  89. package/src/table-builder/components/number-filter/number-filter.component.html +19 -0
  90. package/src/table-builder/components/number-filter/number-filter.component.spec.ts +30 -0
  91. package/src/table-builder/components/number-filter/number-filter.component.ts +25 -0
  92. package/src/table-builder/components/scroll-strategy.ts +82 -0
  93. package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +62 -0
  94. package/src/table-builder/components/sort-menu/sort-menu.component.html +111 -0
  95. package/src/table-builder/components/sort-menu/sort-menu.component.scss +119 -0
  96. package/src/table-builder/components/sort-menu/sort-menu.component.ts +95 -0
  97. package/{table-builder/components/table-container/table-container-imports.d.ts → src/table-builder/components/table-container/table-container-imports.ts} +30 -14
  98. package/src/table-builder/components/table-container/table-container.css +45 -0
  99. package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +141 -0
  100. package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +106 -0
  101. package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +69 -0
  102. package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +45 -0
  103. package/src/table-builder/components/table-container/table-container.html +117 -0
  104. package/src/table-builder/components/table-container/table-container.spec.ts +154 -0
  105. package/src/table-builder/components/table-container/table-container.ts +325 -0
  106. package/src/table-builder/components/table-container/tableProps.ts +18 -0
  107. package/src/table-builder/components/table-container/virtual-scroll-container.ts +126 -0
  108. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +31 -0
  109. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +52 -0
  110. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +42 -0
  111. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +10 -0
  112. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +86 -0
  113. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +38 -0
  114. package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +23 -0
  115. package/src/table-builder/directives/custom-cell-directive.ts +46 -0
  116. package/{table-builder/directives/index.d.ts → src/table-builder/directives/index.ts} +6 -5
  117. package/src/table-builder/directives/multi-sort.directive.spec.ts +124 -0
  118. package/src/table-builder/directives/multi-sort.directive.ts +49 -0
  119. package/src/table-builder/directives/resize-column.directive.ts +105 -0
  120. package/src/table-builder/directives/table-wrapper.directive.ts +14 -0
  121. package/src/table-builder/directives/tb-filter.directive.ts +370 -0
  122. package/src/table-builder/enums/filterTypes.ts +79 -0
  123. package/src/table-builder/functions/boolean-filter-function.ts +13 -0
  124. package/src/table-builder/functions/date-filter-function.ts +69 -0
  125. package/src/table-builder/functions/download-data.ts +11 -0
  126. package/src/table-builder/functions/null-filter-function.ts +9 -0
  127. package/src/table-builder/functions/number-filter-function.ts +42 -0
  128. package/src/table-builder/functions/sort-data-function.ts +23 -0
  129. package/src/table-builder/functions/string-filter-function.ts +52 -0
  130. package/{table-builder/interfaces/ColumnInfo.d.ts → src/table-builder/interfaces/ColumnInfo.ts} +3 -2
  131. package/src/table-builder/interfaces/column-template.ts +9 -0
  132. package/{table-builder/interfaces/dictionary.d.ts → src/table-builder/interfaces/dictionary.ts} +3 -3
  133. package/src/table-builder/interfaces/report-def.ts +153 -0
  134. package/src/table-builder/ngrx/tableBuilderStateStore.ts +143 -0
  135. package/src/table-builder/pipes/column-total.pipe.ts +17 -0
  136. package/src/table-builder/pipes/format-filter-type.pipe.ts +12 -0
  137. package/src/table-builder/pipes/format-filter-value.pipe.ts +41 -0
  138. package/src/table-builder/pipes/key-display.ts +16 -0
  139. package/src/table-builder/services/export-to-csv.service.ts +96 -0
  140. package/src/table-builder/services/link-creator.service.ts +68 -0
  141. package/src/table-builder/services/table-template-service.ts +55 -0
  142. package/src/table-builder/services/transform-creator.ts +92 -0
  143. package/src/table-builder/specs/table-custom-filters.spec.ts +262 -0
  144. package/src/table-builder/styles/collapser.styles.scss +15 -0
  145. package/src/table-builder/table-builder.module.ts +73 -0
  146. package/src/test.ts +17 -0
  147. package/src/utilities/array-helpers.ts +13 -0
  148. package/src/utilities/directives/auto-focus.directive.ts +20 -0
  149. package/src/utilities/directives/clickEmitterDirective.ts +16 -0
  150. package/src/utilities/directives/clickSubject.ts +20 -0
  151. package/src/utilities/directives/conditional-classes.directive.ts +36 -0
  152. package/src/utilities/directives/dialog-service.ts +19 -0
  153. package/src/utilities/directives/dialog.ts +142 -0
  154. package/src/utilities/directives/mat-toggle-group-directive.ts +61 -0
  155. package/src/utilities/directives/prevent-enter.directive.ts +13 -0
  156. package/src/utilities/directives/stop-propagation.directive.ts +20 -0
  157. package/src/utilities/directives/styler.ts +39 -0
  158. package/src/utilities/directives/trim-whitespace.directive.ts +21 -0
  159. package/{utilities/index.d.ts → src/utilities/index.ts} +22 -15
  160. package/src/utilities/module.ts +55 -0
  161. package/src/utilities/pipes/function.pipe.ts +16 -0
  162. package/src/utilities/pipes/phone.pipe.ts +15 -0
  163. package/src/utilities/pipes/space-case.pipes.spec.ts +47 -0
  164. package/src/utilities/pipes/space-case.pipes.ts +23 -0
  165. package/tsconfig.lib.json +19 -0
  166. package/tsconfig.lib.prod.json +10 -0
  167. package/tsconfig.spec.json +17 -0
  168. package/action-state/action-state-spinner/action-state-spinner.component.d.ts +0 -12
  169. package/action-state/action-state-ui/action-state-ui.module.d.ts +0 -7
  170. package/action-state/ngrx-ext/ngrx-ext.module.d.ts +0 -8
  171. package/action-state/ngrx.d.ts +0 -31
  172. package/esm2022/action-state/action-state-spinner/action-state-spinner.component.mjs +0 -24
  173. package/esm2022/action-state/action-state-ui/action-state-ui.module.mjs +0 -20
  174. package/esm2022/action-state/index.mjs +0 -8
  175. package/esm2022/action-state/ngrx-ext/ngrx-ext.module.mjs +0 -23
  176. package/esm2022/action-state/ngrx.mjs +0 -42
  177. package/esm2022/http-request-state/HttpRequestStateFactory.mjs +0 -27
  178. package/esm2022/http-request-state/HttpRequestStateStore.mjs +0 -98
  179. package/esm2022/http-request-state/directives/HttpStateDirectiveBase.mjs +0 -34
  180. package/esm2022/http-request-state/directives/http-error-state-directive.mjs +0 -29
  181. package/esm2022/http-request-state/directives/http-inProgress-state-directive.mjs +0 -29
  182. package/esm2022/http-request-state/directives/http-notStarted-state-directive.mjs +0 -29
  183. package/esm2022/http-request-state/directives/http-success-state-directive.mjs +0 -34
  184. package/esm2022/http-request-state/directives/index.mjs +0 -6
  185. package/esm2022/http-request-state/directives/request-state-directive.mjs +0 -60
  186. package/esm2022/http-request-state/helpers.mjs +0 -22
  187. package/esm2022/http-request-state/http-request-state.mjs +0 -39
  188. package/esm2022/http-request-state/http-state-module.mjs +0 -40
  189. package/esm2022/http-request-state/index.mjs +0 -7
  190. package/esm2022/http-request-state/rxjs/getRequestorBody.mjs +0 -4
  191. package/esm2022/http-request-state/rxjs/getRequestorState.mjs +0 -3
  192. package/esm2022/http-request-state/rxjs/index.mjs +0 -5
  193. package/esm2022/http-request-state/rxjs/tapError.mjs +0 -12
  194. package/esm2022/http-request-state/rxjs/tapSuccess.mjs +0 -12
  195. package/esm2022/http-request-state/types.mjs +0 -16
  196. package/esm2022/ngrx/actionable-selector.mjs +0 -73
  197. package/esm2022/ngrx/index.mjs +0 -2
  198. package/esm2022/one-paragon-angular-utilities.mjs +0 -5
  199. package/esm2022/public-api.mjs +0 -20
  200. package/esm2022/rxjs/defaultShareReplay.mjs +0 -7
  201. package/esm2022/rxjs/index.mjs +0 -5
  202. package/esm2022/rxjs/mapError.mjs +0 -8
  203. package/esm2022/rxjs/rxjs-operators.mjs +0 -92
  204. package/esm2022/rxjs/subjectifier.mjs +0 -15
  205. package/esm2022/table-builder/classes/DefaultSettings.mjs +0 -6
  206. package/esm2022/table-builder/classes/MatTableObservableDataSource.mjs +0 -21
  207. package/esm2022/table-builder/classes/TableBuilderConfig.mjs +0 -18
  208. package/esm2022/table-builder/classes/TableBuilderDataSource.mjs +0 -50
  209. package/esm2022/table-builder/classes/TableState.mjs +0 -42
  210. package/esm2022/table-builder/classes/display-col.mjs +0 -2
  211. package/esm2022/table-builder/classes/filter-info.mjs +0 -73
  212. package/esm2022/table-builder/classes/table-builder-general-settings.mjs +0 -68
  213. package/esm2022/table-builder/classes/table-builder.mjs +0 -82
  214. package/esm2022/table-builder/classes/table-store.mjs +0 -314
  215. package/esm2022/table-builder/components/array-column.component.mjs +0 -78
  216. package/esm2022/table-builder/components/column-builder/column-builder.component.mjs +0 -118
  217. package/esm2022/table-builder/components/date-filter/date-filter.component.mjs +0 -29
  218. package/esm2022/table-builder/components/date-time-filter/date-time-filter.component.mjs +0 -24
  219. package/esm2022/table-builder/components/filter/filter.component.mjs +0 -66
  220. package/esm2022/table-builder/components/filter/in-list/in-list-filter.component.mjs +0 -101
  221. package/esm2022/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +0 -52
  222. package/esm2022/table-builder/components/generic-table/generic-table.component.mjs +0 -205
  223. package/esm2022/table-builder/components/generic-table/paginator.component.mjs +0 -79
  224. package/esm2022/table-builder/components/group-by-list/group-by-list.component.mjs +0 -23
  225. package/esm2022/table-builder/components/header-menu/header-menu.component.mjs +0 -101
  226. package/esm2022/table-builder/components/in-filter/in-filter.component.mjs +0 -64
  227. package/esm2022/table-builder/components/index.mjs +0 -10
  228. package/esm2022/table-builder/components/initialization-component/initialization-component.mjs +0 -36
  229. package/esm2022/table-builder/components/link-column.component.mjs +0 -73
  230. package/esm2022/table-builder/components/number-filter/number-filter.component.mjs +0 -29
  231. package/esm2022/table-builder/components/scroll-strategy.mjs +0 -63
  232. package/esm2022/table-builder/components/sort-menu/sort-menu.component-store.mjs +0 -43
  233. package/esm2022/table-builder/components/sort-menu/sort-menu.component.mjs +0 -81
  234. package/esm2022/table-builder/components/table-container/table-container-imports.mjs +0 -26
  235. package/esm2022/table-builder/components/table-container/table-container.helpers/data-state.helpers.mjs +0 -2
  236. package/esm2022/table-builder/components/table-container/table-container.helpers/filter-state.helpers.mjs +0 -62
  237. package/esm2022/table-builder/components/table-container/table-container.helpers/groupBy.helpers.mjs +0 -56
  238. package/esm2022/table-builder/components/table-container/table-container.helpers/sort-state.helpers.mjs +0 -36
  239. package/esm2022/table-builder/components/table-container/table-container.mjs +0 -337
  240. package/esm2022/table-builder/components/table-container/tableProps.mjs +0 -9
  241. package/esm2022/table-builder/components/table-container/virtual-scroll-container.mjs +0 -101
  242. package/esm2022/table-builder/components/table-container-filter/filter-list/filter-list.component.mjs +0 -47
  243. package/esm2022/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.mjs +0 -36
  244. package/esm2022/table-builder/components/table-container-filter/table-wrapper-filter-store.mjs +0 -25
  245. package/esm2022/table-builder/components/table-context.mjs +0 -2
  246. package/esm2022/table-builder/directives/custom-cell-directive.mjs +0 -60
  247. package/esm2022/table-builder/directives/index.mjs +0 -6
  248. package/esm2022/table-builder/directives/multi-sort.directive.mjs +0 -50
  249. package/esm2022/table-builder/directives/resize-column.directive.mjs +0 -87
  250. package/esm2022/table-builder/directives/table-wrapper.directive.mjs +0 -20
  251. package/esm2022/table-builder/directives/tb-filter.directive.mjs +0 -410
  252. package/esm2022/table-builder/enums/filterTypes.mjs +0 -72
  253. package/esm2022/table-builder/functions/boolean-filter-function.mjs +0 -10
  254. package/esm2022/table-builder/functions/date-filter-function.mjs +0 -58
  255. package/esm2022/table-builder/functions/download-data.mjs +0 -12
  256. package/esm2022/table-builder/functions/null-filter-function.mjs +0 -8
  257. package/esm2022/table-builder/functions/number-filter-function.mjs +0 -32
  258. package/esm2022/table-builder/functions/sort-data-function.mjs +0 -17
  259. package/esm2022/table-builder/functions/string-filter-function.mjs +0 -41
  260. package/esm2022/table-builder/interfaces/ColumnInfo.mjs +0 -2
  261. package/esm2022/table-builder/interfaces/dictionary.mjs +0 -2
  262. package/esm2022/table-builder/interfaces/report-def.mjs +0 -35
  263. package/esm2022/table-builder/ngrx/tableBuilderStateStore.mjs +0 -115
  264. package/esm2022/table-builder/pipes/column-total.pipe.mjs +0 -22
  265. package/esm2022/table-builder/pipes/format-filter-type.pipe.mjs +0 -18
  266. package/esm2022/table-builder/pipes/format-filter-value.pipe.mjs +0 -45
  267. package/esm2022/table-builder/pipes/key-display.mjs +0 -20
  268. package/esm2022/table-builder/services/export-to-csv.service.mjs +0 -88
  269. package/esm2022/table-builder/services/link-creator.service.mjs +0 -42
  270. package/esm2022/table-builder/services/table-template-service.mjs +0 -44
  271. package/esm2022/table-builder/services/transform-creator.mjs +0 -78
  272. package/esm2022/table-builder/table-builder.module.mjs +0 -124
  273. package/esm2022/utilities/array-helpers.mjs +0 -14
  274. package/esm2022/utilities/directives/auto-focus.directive.mjs +0 -27
  275. package/esm2022/utilities/directives/clickEmitterDirective.mjs +0 -22
  276. package/esm2022/utilities/directives/clickSubject.mjs +0 -28
  277. package/esm2022/utilities/directives/conditional-classes.directive.mjs +0 -36
  278. package/esm2022/utilities/directives/dialog-service.mjs +0 -23
  279. package/esm2022/utilities/directives/dialog.mjs +0 -138
  280. package/esm2022/utilities/directives/mat-toggle-group-directive.mjs +0 -60
  281. package/esm2022/utilities/directives/prevent-enter.directive.mjs +0 -20
  282. package/esm2022/utilities/directives/stop-propagation.directive.mjs +0 -26
  283. package/esm2022/utilities/directives/styler.mjs +0 -42
  284. package/esm2022/utilities/directives/trim-whitespace.directive.mjs +0 -30
  285. package/esm2022/utilities/index.mjs +0 -16
  286. package/esm2022/utilities/module.mjs +0 -90
  287. package/esm2022/utilities/pipes/function.pipe.mjs +0 -22
  288. package/esm2022/utilities/pipes/phone.pipe.mjs +0 -20
  289. package/esm2022/utilities/pipes/space-case.pipes.mjs +0 -28
  290. package/fesm2022/one-paragon-angular-utilities.mjs +0 -5045
  291. package/fesm2022/one-paragon-angular-utilities.mjs.map +0 -1
  292. package/http-request-state/HttpRequestStateFactory.d.ts +0 -15
  293. package/http-request-state/HttpRequestStateStore.d.ts +0 -49
  294. package/http-request-state/directives/HttpStateDirectiveBase.d.ts +0 -16
  295. package/http-request-state/directives/http-error-state-directive.d.ts +0 -12
  296. package/http-request-state/directives/http-inProgress-state-directive.d.ts +0 -12
  297. package/http-request-state/directives/http-notStarted-state-directive.d.ts +0 -12
  298. package/http-request-state/directives/http-success-state-directive.d.ts +0 -21
  299. package/http-request-state/directives/request-state-directive.d.ts +0 -35
  300. package/http-request-state/helpers.d.ts +0 -9
  301. package/http-request-state/http-request-state.d.ts +0 -12
  302. package/http-request-state/http-state-module.d.ts +0 -11
  303. package/http-request-state/rxjs/getRequestorBody.d.ts +0 -3
  304. package/http-request-state/rxjs/getRequestorState.d.ts +0 -3
  305. package/http-request-state/rxjs/tapError.d.ts +0 -3
  306. package/http-request-state/rxjs/tapSuccess.d.ts +0 -3
  307. package/http-request-state/types.d.ts +0 -36
  308. package/index.d.ts +0 -5
  309. package/ngrx/actionable-selector.d.ts +0 -17
  310. package/ngrx/index.d.ts +0 -1
  311. package/rxjs/defaultShareReplay.d.ts +0 -2
  312. package/rxjs/mapError.d.ts +0 -2
  313. package/rxjs/rxjs-operators.d.ts +0 -13
  314. package/rxjs/subjectifier.d.ts +0 -9
  315. package/table-builder/classes/DefaultSettings.d.ts +0 -9
  316. package/table-builder/classes/MatTableObservableDataSource.d.ts +0 -9
  317. package/table-builder/classes/TableBuilderConfig.d.ts +0 -21
  318. package/table-builder/classes/TableBuilderDataSource.d.ts +0 -13
  319. package/table-builder/classes/TableState.d.ts +0 -55
  320. package/table-builder/classes/filter-info.d.ts +0 -127
  321. package/table-builder/classes/table-builder-general-settings.d.ts +0 -43
  322. package/table-builder/classes/table-builder.d.ts +0 -14
  323. package/table-builder/classes/table-store.d.ts +0 -124
  324. package/table-builder/components/array-column.component.d.ts +0 -14
  325. package/table-builder/components/column-builder/column-builder.component.d.ts +0 -54
  326. package/table-builder/components/date-filter/date-filter.component.d.ts +0 -10
  327. package/table-builder/components/date-time-filter/date-time-filter.component.d.ts +0 -10
  328. package/table-builder/components/filter/filter.component.d.ts +0 -112
  329. package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +0 -27
  330. package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +0 -16
  331. package/table-builder/components/generic-table/generic-table.component.d.ts +0 -69
  332. package/table-builder/components/generic-table/paginator.component.d.ts +0 -27
  333. package/table-builder/components/group-by-list/group-by-list.component.d.ts +0 -7
  334. package/table-builder/components/header-menu/header-menu.component.d.ts +0 -25
  335. package/table-builder/components/in-filter/in-filter.component.d.ts +0 -21
  336. package/table-builder/components/initialization-component/initialization-component.d.ts +0 -12
  337. package/table-builder/components/link-column.component.d.ts +0 -17
  338. package/table-builder/components/number-filter/number-filter.component.d.ts +0 -12
  339. package/table-builder/components/scroll-strategy.d.ts +0 -23
  340. package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +0 -24
  341. package/table-builder/components/sort-menu/sort-menu.component.d.ts +0 -25
  342. package/table-builder/components/table-container/table-container.d.ts +0 -75
  343. package/table-builder/components/table-container/table-container.helpers/data-state.helpers.d.ts +0 -5
  344. package/table-builder/components/table-container/table-container.helpers/filter-state.helpers.d.ts +0 -15
  345. package/table-builder/components/table-container/table-container.helpers/groupBy.helpers.d.ts +0 -15
  346. package/table-builder/components/table-container/table-container.helpers/sort-state.helpers.d.ts +0 -9
  347. package/table-builder/components/table-container/tableProps.d.ts +0 -11
  348. package/table-builder/components/table-container/virtual-scroll-container.d.ts +0 -17
  349. package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +0 -16
  350. package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +0 -14
  351. package/table-builder/components/table-container-filter/table-wrapper-filter-store.d.ts +0 -14
  352. package/table-builder/components/table-context.d.ts +0 -10
  353. package/table-builder/directives/custom-cell-directive.d.ts +0 -19
  354. package/table-builder/directives/multi-sort.directive.d.ts +0 -11
  355. package/table-builder/directives/resize-column.directive.d.ts +0 -43
  356. package/table-builder/directives/table-wrapper.directive.d.ts +0 -8
  357. package/table-builder/directives/tb-filter.directive.d.ts +0 -120
  358. package/table-builder/enums/filterTypes.d.ts +0 -77
  359. package/table-builder/functions/boolean-filter-function.d.ts +0 -3
  360. package/table-builder/functions/date-filter-function.d.ts +0 -4
  361. package/table-builder/functions/download-data.d.ts +0 -1
  362. package/table-builder/functions/null-filter-function.d.ts +0 -2
  363. package/table-builder/functions/number-filter-function.d.ts +0 -4
  364. package/table-builder/functions/sort-data-function.d.ts +0 -6
  365. package/table-builder/functions/string-filter-function.d.ts +0 -7
  366. package/table-builder/interfaces/report-def.d.ts +0 -147
  367. package/table-builder/ngrx/tableBuilderStateStore.d.ts +0 -62
  368. package/table-builder/pipes/column-total.pipe.d.ts +0 -8
  369. package/table-builder/pipes/format-filter-type.pipe.d.ts +0 -8
  370. package/table-builder/pipes/format-filter-value.pipe.d.ts +0 -14
  371. package/table-builder/pipes/key-display.d.ts +0 -11
  372. package/table-builder/services/export-to-csv.service.d.ts +0 -22
  373. package/table-builder/services/link-creator.service.d.ts +0 -12
  374. package/table-builder/services/table-template-service.d.ts +0 -14
  375. package/table-builder/services/transform-creator.d.ts +0 -19
  376. package/table-builder/table-builder.module.d.ts +0 -21
  377. package/utilities/array-helpers.d.ts +0 -1
  378. package/utilities/directives/auto-focus.directive.d.ts +0 -10
  379. package/utilities/directives/clickEmitterDirective.d.ts +0 -7
  380. package/utilities/directives/clickSubject.d.ts +0 -9
  381. package/utilities/directives/conditional-classes.directive.d.ts +0 -14
  382. package/utilities/directives/dialog-service.d.ts +0 -10
  383. package/utilities/directives/dialog.d.ts +0 -46
  384. package/utilities/directives/mat-toggle-group-directive.d.ts +0 -21
  385. package/utilities/directives/prevent-enter.directive.d.ts +0 -6
  386. package/utilities/directives/stop-propagation.directive.d.ts +0 -7
  387. package/utilities/directives/styler.d.ts +0 -16
  388. package/utilities/directives/trim-whitespace.directive.d.ts +0 -9
  389. package/utilities/module.d.ts +0 -19
  390. package/utilities/pipes/function.pipe.d.ts +0 -7
  391. package/utilities/pipes/phone.pipe.d.ts +0 -7
  392. package/utilities/pipes/space-case.pipes.d.ts +0 -17
  393. /package/{http-request-state/directives/index.d.ts → src/http-request-state/directives/index.ts} +0 -0
  394. /package/{http-request-state/rxjs/index.d.ts → src/http-request-state/rxjs/index.ts} +0 -0
  395. /package/{table-builder/classes/display-col.d.ts → src/table-builder/classes/display-col.ts} +0 -0
@@ -0,0 +1,141 @@
1
+ import { Observable, combineLatest, map, scan, timestamp } from "rxjs";
2
+ import { SortState } from "./sort-state.helpers";
3
+ import { FilterPredicateState } from "./filter-state.helpers";
4
+ import { filterData, sortData, tbNoShowSymbol } from "../../../functions/sort-data-function";
5
+ import { defaultShareReplay } from "../../../../rxjs/defaultShareReplay";
6
+ import { FieldType, MetaData } from "../../../interfaces/report-def";
7
+ import { get, set } from "lodash";
8
+
9
+ export const sortAndFilterData = <T>(data: Observable<T[]>, sortState: Observable<SortState>, filterState: Observable<FilterPredicateState<T>>) => combineLatest([
10
+ data.pipe(timestamp()),
11
+ sortState.pipe(timestamp()),
12
+ filterState.pipe(timestamp())
13
+ ]).pipe(scan(({ mappedData: resultData }, [data, sort, f], index)=> {
14
+
15
+ if(index === 0 || (data.timestamp > sort.timestamp && data.timestamp > f.timestamp)){
16
+ return ({ mappedData: filterData(sortData(data.value , sort.value.sortsToRun ), f.value.allFilters)});
17
+ }
18
+
19
+ if(sort.timestamp > f.timestamp){
20
+ return ({ mappedData: sortData(resultData, sort.value.sortsToRun)});
21
+ }
22
+ return ({ mappedData: filterData(resultData, f.value.onlyAddedFilters || f.value.allFilters, !f.value.onlyAddedFilters)});
23
+ }, { mappedData: []} as { mappedData: T[]})
24
+ ).pipe(
25
+ map(({ mappedData: resultData }) => resultData.filter(item => !item[tbNoShowSymbol])),
26
+ defaultShareReplay()
27
+ );
28
+
29
+ export const createDataCleaners = <T>(metadatas: MetaData<T> [], mutate = false) => {
30
+ const transforms = createCleaners(metadatas);
31
+ return (data: T) => {
32
+ if(!mutate){
33
+ data = { ...data }
34
+ }
35
+ for(const transform of transforms){
36
+ transform(data);
37
+ }
38
+ return data;
39
+ }
40
+ }
41
+
42
+ const createCleaners = <T>(metadatas: MetaData<T> []) => {
43
+ return metadatas.reduce((transforms,metaData) => {
44
+ switch ( metaData.fieldType ) {
45
+ case FieldType.Currency:
46
+ case FieldType.Number:{
47
+ const nested = metaData.key.includes('.');
48
+ if(nested){
49
+ transforms.push( (t:T) => {
50
+ const val = get(t, metaData.key);
51
+ const num = Number( val );
52
+ set(t as {}, metaData.key, isNaN(num) || val == null ? null : num)
53
+ t[metaData.key] = (isNaN(num) || val == null ? null : num) as any});
54
+ } else {
55
+ transforms.push( (t:T) => {
56
+ const val = t[metaData.key];
57
+ const num = Number( val );
58
+ t[metaData.key] = (isNaN(num) || val == null ? null : num) as any});
59
+ }
60
+ break;
61
+ }
62
+ case FieldType.Date:{
63
+ const nested = metaData.key.includes('.');
64
+ if(nested){
65
+ transforms.push( (t:T) => {
66
+ const val = get(t, metaData.key);
67
+ const date = Date.parse(val);
68
+ if(isNaN(date)){
69
+ set(t as {}, metaData.key, null as any);
70
+ return
71
+ }
72
+ const d = new Date(date);
73
+ d.setHours(0,0,0,0);
74
+ set(t as {}, metaData.key, d as any);
75
+ })
76
+ } else {
77
+ transforms.push( (t:T) => {
78
+ const val = t[metaData.key] as string;
79
+ const date = Date.parse(val);
80
+ if(isNaN(date)){
81
+ t[metaData.key] = null as any;
82
+ return
83
+ }
84
+ const d = new Date(date);
85
+ d.setHours(0,0,0,0);
86
+ t[metaData.key] = d as any;
87
+ })
88
+ }
89
+ break;
90
+ }
91
+
92
+ case FieldType.DateTime:{
93
+ const nested = metaData.key.includes('.');
94
+ if(nested){
95
+ transforms.push( (t:T) => {
96
+ const val = get(t, metaData.key);
97
+ const dateTime = Date.parse(val);
98
+ if(isNaN(dateTime)){
99
+ set(t as {}, metaData.key, null as any);
100
+ return
101
+ }
102
+ const dt = new Date(dateTime);
103
+ if(metaData.additional?.dateTimeOptions?.includeMilliseconds){
104
+ set(t as {}, metaData.key, dt as any);
105
+ return
106
+ }
107
+ if(metaData.additional?.dateTimeOptions?.includeSeconds){
108
+ dt.setMilliseconds(0);
109
+ set(t as {}, metaData.key, dt as any);
110
+ return
111
+ }
112
+ dt.setSeconds(0, 0);
113
+ set(t as {}, metaData.key, dt as any);
114
+ })
115
+ } else {
116
+ transforms.push((t:T) => {
117
+ const val = t[metaData.key] as string;
118
+ const dateTime = Date.parse(val);
119
+ if(isNaN(dateTime)){
120
+ t[metaData.key] = null as any;
121
+ return;
122
+ }
123
+ const dt = new Date(dateTime);
124
+ if(metaData.additional?.dateTimeOptions?.includeMilliseconds){
125
+ t[metaData.key] = dt as any;
126
+ return;
127
+ }
128
+ if(metaData.additional?.dateTimeOptions?.includeSeconds){
129
+ dt.setMilliseconds(0);
130
+ t[metaData.key] = dt as any;
131
+ return;
132
+ }
133
+ dt.setSeconds(0, 0);
134
+ t[metaData.key] = dt as any;
135
+ })
136
+ }
137
+ }
138
+ }
139
+ return transforms;
140
+ }, [] as ((t:T) => void)[])
141
+ }
@@ -0,0 +1,106 @@
1
+ import { Timestamp } from "rxjs";
2
+ import { CustomFilter, FilterInfo, createFilterFunc } from "../../../classes/filter-info";
3
+ import { Dictionary } from "../../../interfaces/dictionary";
4
+ import { Predicate } from "@angular/core";
5
+ import { difference, intersection } from "lodash";
6
+
7
+ //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.
8
+ // So if filters were only added this method will return the added filters, if filters were removed or changed this method will return undefined.
9
+
10
+ export const updateFilterInfoState = <T>(previousState: FilterInfoState<T>, filterInfos: FilterInfoDict) => {
11
+ filterInfos = filterNonActiveFilters(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>} = s.onlyAddedFilters ? Object.entries(s.onlyAddedFilters).reduce((obj, [key, value]) => {
21
+ obj[key] = createFilterFunc(value);
22
+ return obj;
23
+ }, {} as {[key in keyof T]: Predicate<T>}) : {} as {[key in keyof T]: Predicate<T>};
24
+ const mappedAll = Object.entries(s.allFilters).map(([key, value]) => mappedAddOnly[key] || createFilterFunc(value));
25
+ return ({
26
+ allFilters: mappedAll,
27
+ onlyAddedFilters: s.onlyAddedFilters ? Object.values(mappedAddOnly) : undefined
28
+ })
29
+ }
30
+
31
+ export const updateFilterPredicateState = <T>(previousState: FilterPredicateState<T>, filters: Predicate<any>[]) => {
32
+ const currentState: FilterPredicateState<T> = {
33
+ allFilters: filters,
34
+ onlyAddedFilters: predicatesOnlyAdded(previousState.allFilters, filters)
35
+ }
36
+ return currentState;
37
+ }
38
+
39
+ export const updateFilterState = <T>(filterInfos: Timestamp<FilterInfoState<T>>, predicates: Timestamp<FilterPredicateState<T>>): FilterPredicateState<T> => {
40
+ const infos = mapFilterInfoStateToPredicateState(filterInfos.value);
41
+ const filtersState: FilterPredicateState<T> = {
42
+ allFilters: [...infos.allFilters, ...predicates.value.allFilters]
43
+ }
44
+ if(filterInfos.timestamp > predicates.timestamp && !!filterInfos.value.onlyAddedFilters){
45
+ filtersState.onlyAddedFilters = infos.onlyAddedFilters;
46
+ } else {
47
+ filtersState.onlyAddedFilters = predicates.value.onlyAddedFilters
48
+ }
49
+ return filtersState
50
+ }
51
+
52
+
53
+ const filterNonActiveFilters = <T>(filtersDict : FilterInfoDict) => Object.entries(filtersDict).reduce((obj ,[key, value]) => {
54
+ if(value.active !== false){
55
+ obj[key] = value
56
+ };
57
+ return obj;
58
+ }, {} as Dictionary<FilterInfo | CustomFilter>);
59
+
60
+
61
+ function filterInfoOnlyAdded(previousFilterInfos: FilterInfoDict, currentFilterInfos: FilterInfoDict): FilterInfoDict | undefined{
62
+ const previousKeys = Object.keys(previousFilterInfos);
63
+ const currentKeys = Object.keys(currentFilterInfos);
64
+ const keysInBoth = intersection(previousKeys, currentKeys);
65
+ const someRemoved = previousKeys.length > keysInBoth.length;
66
+ if(someRemoved || !previousKeys.length){
67
+ return undefined;
68
+ }
69
+ if(filtersInfosUpdated(previousFilterInfos, currentFilterInfos)){
70
+ return undefined;
71
+ }
72
+ const addedFilters = difference(currentKeys, keysInBoth).reduce((dict, key) => {
73
+ dict[key] = currentFilterInfos[key];
74
+ return dict;
75
+ }, {} as FilterInfoDict);
76
+ return addedFilters;
77
+ }
78
+
79
+ function predicatesOnlyAdded(previousPredicates: Predicate<any>[], currentPredicates: Predicate<any>[]){
80
+ if(!previousPredicates.length){
81
+ return undefined;
82
+ }
83
+ const predicateFiltersRemoved = difference(previousPredicates, currentPredicates).length;
84
+ if(predicateFiltersRemoved){
85
+ return undefined;
86
+ }
87
+ return difference(currentPredicates, previousPredicates);
88
+ }
89
+
90
+ function filtersInfosUpdated(previousFilterInfos: FilterInfoDict<any>, currentFilterInfos: FilterInfoDict<any>){
91
+ return !Object.entries(previousFilterInfos).every(([key, val]) => {
92
+ return currentFilterInfos[key].filterType === val.filterType && currentFilterInfos[key].filterValue === val.filterValue
93
+ })
94
+ }
95
+
96
+ export interface FilterInfoState<T> {
97
+ allFilters: FilterInfoDict<T>,
98
+ onlyAddedFilters?: FilterInfoDict<T> | undefined,
99
+ }
100
+
101
+ export interface FilterPredicateState<T> {
102
+ allFilters: Predicate<T>[],
103
+ onlyAddedFilters?: Predicate<T>[] | undefined,
104
+ }
105
+
106
+ export type FilterInfoDict<T = any> = Dictionary<FilterInfo<any, T> | CustomFilter<any>>;
@@ -0,0 +1,69 @@
1
+ import { groupBy } from "lodash";
2
+ import { Timestamp } from "rxjs";
3
+ import { GroupedData } from "../../../classes/TableState";
4
+ import { initIndexSymbol } from "./sort-state.helpers";
5
+
6
+ function getGroupedData(data: any[], groupByKeys: string[]): any[] {
7
+ return tbGroupBy(data, groupByKeys);
8
+ }
9
+
10
+ const tbGroupBy = (data: any[], groupByKeys: string[], parentGroupName?: any): any[] => {
11
+ const currentKey = groupByKeys[0];
12
+ const res = groupBy(data, currentKey);
13
+ const remainingGroupByKeys = groupByKeys.slice(1);
14
+ const finalGroups = !remainingGroupByKeys.length;
15
+ if (remainingGroupByKeys.length) {
16
+ Object.keys(res).forEach(key => res[key] = tbGroupBy(res[key], remainingGroupByKeys, key))
17
+ }
18
+ return Object.keys(res).map((groupName, i) => {
19
+ const uniqName = parentGroupName ? `${parentGroupName}-${groupName}` : `${groupName}`;
20
+ const groupHeaders = res[groupName]?.filter(row => row.isGroupHeader) ?? [];
21
+ return ({
22
+ isGroupHeader: true,
23
+ groupHeaderDisplay: groupName,
24
+ hasTheData: finalGroups,
25
+ children: finalGroups ? res[groupName] : res[groupName].map(d => {d.padding += 20; return d}),
26
+ groupName: `tb_group_${uniqName}`,
27
+ padding: 1,
28
+ key: currentKey,
29
+ length : groupHeaders.reduce((acc, curr) => curr.length + acc,0) + ((res[groupName] ?? []).length - groupHeaders.length),
30
+ [initIndexSymbol]: uniqName,
31
+ }
32
+ );
33
+ })
34
+ }
35
+
36
+ export function updateGroupByState({ groupedData }:GroupByState, [data, groups, expandedGroups] : [Timestamp<any[]>, Timestamp<string[]>, Timestamp<GroupedData[]>], index: number){
37
+ if(
38
+ index === 0
39
+ || dataUpdated(data, groups, expandedGroups)
40
+ || groupsUpdated(groups, expandedGroups)
41
+ ){
42
+ groupedData = groups.value.length ? getGroupedData(data.value, groups.value) : data.value;
43
+ }
44
+ const newDisplayData = expandedGroups.value.length === 0
45
+ ? groupedData
46
+ : groupedData.map(group => mapGroupHeader(group, expandedGroups.value)).flat();
47
+ return ({displayData: newDisplayData, groupedData});
48
+ }
49
+
50
+ function mapGroupHeader(obj: any, data: GroupedData[]){
51
+ const showChildren = data.find(a => a.expandedHeaders.includes(obj.groupName));
52
+ const children = !showChildren ? [] :
53
+ obj.hasTheData ? obj.children
54
+ : obj.children.map(a => mapGroupHeader(a, data))
55
+
56
+ return [obj, ...children].flat()
57
+ }
58
+
59
+ function dataUpdated(data: Timestamp<any[]>, groups: Timestamp<string[]>, expandedGroups: Timestamp<GroupedData[]>){
60
+ return data.timestamp > groups.timestamp && data.timestamp > expandedGroups.timestamp;
61
+ }
62
+
63
+ function groupsUpdated(groups: Timestamp<string[]>, expandedGroups: Timestamp<GroupedData[]>){
64
+ return groups.timestamp > expandedGroups.timestamp;
65
+ }
66
+
67
+ interface GroupByState { displayData: any[], groupedData: any[]};
68
+
69
+ export const initialGroupByState = { displayData: [], groupedData: []}
@@ -0,0 +1,45 @@
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: Sort[]): 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: Sort[], allSorts: Sort[]}
22
+
23
+ function addInitSort(sorts: Sort[]){
24
+ return [...sorts, {active: initIndexSymbol as unknown as string, direction: 'asc' as SortDirection}];
25
+ }
26
+
27
+ function sortsRemoved(previousSorts: Sort[], currentSorts: Sort[]): 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: Sort[], currentSorts: Sort[]){
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: []};
@@ -0,0 +1,117 @@
1
+ <ng-content select="[before]" />
2
+
3
+ <ng-container multiSort *ngrxLet="state.tableSettings$ as tableSettings">
4
+ <div class="header-wrapper">
5
+ <div class="title">
6
+ @if ((!(collapseHeader$ | async)) || tableSettings.showTitleWhenHeaderCollapsed) {
7
+ <ng-content select=".tb-header-title"/>
8
+ }
9
+ @if((state.groupByKeys$ | async)?.length){
10
+ <group-by-list />
11
+ }
12
+ </div>
13
+ <div class="flx-row-end">
14
+ <lib-filter-list />
15
+ @if (!tableSettings.hideHeader) {
16
+ @if (!(collapseHeader$ | async)) {
17
+ <ng-container *ngTemplateOutlet="headerMenu"/>
18
+ <button mat-icon-button color='primary' [matMenuTriggerFor]="mainMenu">
19
+ <mat-icon>more_vert</mat-icon>
20
+ </button>
21
+ <mat-menu #mainMenu='matMenu'>
22
+ <ng-container *ngTemplateOutlet="headerMenuExtra"/>
23
+ </mat-menu>
24
+ }
25
+ @else {
26
+ <mat-icon color="primary" [matMenuTriggerFor]="mainMenu" class="flat-menu-button pointer">more_horiz</mat-icon>
27
+ <mat-menu #mainMenu='matMenu'>
28
+ <div class="flex-column">
29
+ <ng-container *ngTemplateOutlet="headerMenu"/>
30
+ </div>
31
+ <ng-container *ngTemplateOutlet="headerMenuExtra"/>
32
+ </mat-menu>
33
+ }
34
+ <mat-icon [matTooltip]="(collapseHeader$ | async) ? 'expand' : 'collapse'" class="collapse-icon header"
35
+ (click)="state.toggleCollapseHeader()">
36
+ {{(collapseHeader$ | async) ? 'expand_less' : 'expand_more'}}
37
+ </mat-icon>
38
+ }
39
+
40
+ </div>
41
+ </div>
42
+ <div>
43
+ @if(!!tableSettings.useVirtualScroll) {
44
+ <tb-virtual-scroll-container>
45
+ <tb-generic-table [rows]='customRows' [data$]="data" [displayData$]="displayData"
46
+ (selection$)='selection$.emit($event)' [columnInfos]='myColumns$' [trackBy]="trackBy"></tb-generic-table>
47
+ </tb-virtual-scroll-container>
48
+ }
49
+ @else {
50
+ <tb-generic-table [rows]='customRows' [data$]="data" [displayData$]="displayData"
51
+ (selection$)='selection$.emit($event)' [columnInfos]='myColumns$' [trackBy]="trackBy"></tb-generic-table>
52
+ }
53
+ @if(tableSettings.usePaginator) {
54
+ <div class="paginator">
55
+ <tb-paginator #tbPaginator [data$]="data" [tableElRef]="tableElRef" />
56
+
57
+ <mat-icon [matTooltip]="(collapseFooter$ | async) ? 'expand' : 'collapse'" class="collapse-icon footer"
58
+ (click)="state.toggleCollapseFooter()">
59
+ {{(collapseFooter$ | async) ? 'expand_more' : 'expand_less'}}
60
+ </mat-icon>
61
+ </div>
62
+ }
63
+ </div>
64
+
65
+
66
+
67
+ <ng-template #headerMenu>
68
+ @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}
69
+ @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}
70
+ @if (!tableSettings.hideSort) {<tb-sort-menu/>}
71
+ </ng-template>
72
+
73
+ <ng-template #headerMenuExtra>
74
+ <button mat-menu-item (click)="resetState()">
75
+ <mat-icon color="primary">autorenew</mat-icon>
76
+ <span>Reset table</span>
77
+ </button>
78
+ @if (!tableSettings.hideExport) {
79
+ <button mat-menu-item (click)="exportToCsv()">
80
+ <mat-icon color="primary">file_download</mat-icon>
81
+ <span>Export Table</span>
82
+ </button>
83
+ }
84
+ @if (currentStateKey$ | async; as currentKey) {
85
+ @if (tableId) {
86
+ <button mat-menu-item (click)="saveState()">
87
+ <mat-icon color="primary">save</mat-icon>
88
+ <span>Save to {{currentKey}}</span>
89
+ </button>
90
+ <button mat-menu-item [matMenuTriggerFor]="savedNames">
91
+ <span>Choose Profile</span>
92
+ </button>
93
+ }
94
+ }
95
+
96
+ <mat-menu #savedNames='matMenu' panelClass='wide-menu'>
97
+ <button mat-menu-item clickEmitter #add='clickEmitter'>
98
+ <mat-icon>add</mat-icon>
99
+ <span>New</span>
100
+ </button>
101
+ @for (key of stateKeys$ | async; track key) {
102
+ <button mat-menu-item (click)='setProfileState(key)'>
103
+ <span>{{key}}</span>
104
+ <mat-icon color='warn' (click)='deleteProfileState(key)' stop-propagation>delete_forever</mat-icon>
105
+ </button>
106
+ }
107
+ </mat-menu>
108
+ <ng-container *opDialog='add'>
109
+ <mat-form-field>
110
+ <input class="add-key" matInput #addedKey />
111
+ </mat-form-field>
112
+ <button mat-button (click)='setProfileState(addedKey.value); add.next(false);' [disabled]="!addedKey.value">
113
+ Add
114
+ </button>
115
+ </ng-container>
116
+ </ng-template>
117
+ </ng-container>
@@ -0,0 +1,154 @@
1
+ import { BehaviorSubject, of } from 'rxjs';
2
+ import { TestBed, ComponentFixture } from '@angular/core/testing';
3
+ import { SpaceCasePipe, PhoneNumberPipe } from '../../../utilities';
4
+ import { FilterComponent } from '../filter/filter.component';
5
+ import { CommonModule, CurrencyPipe, DatePipe } from '@angular/common';
6
+ import { FormsModule } from '@angular/forms';
7
+ import { FieldType } from '../../interfaces/report-def';
8
+ import { NoopAnimationsModule } from '@angular/platform-browser/animations';
9
+ import { DateFilterComponent } from '../date-filter/date-filter.component';
10
+ import { TableContainerComponent } from './table-container';
11
+ import { GenFilterDisplayerComponent } from '../table-container-filter/gen-filter-displayer/gen-filter-displayer.component';
12
+ import { GenericTableComponent } from '../generic-table/generic-table.component';
13
+ import { GenColDisplayerComponent } from '../gen-col-displayer/gen-col-displayer.component';
14
+ import { ColumnTotalPipe } from '../../pipes/column-total.pipe';
15
+ import { TableBuilder } from '../../classes/table-builder';
16
+ import { MultiSortDirective } from '../../directives/multi-sort.directive';
17
+ import { TableBuilderConfigToken } from '../../classes/TableBuilderConfig';
18
+ import { provideMockStore } from '@ngrx/store/testing';
19
+ import { PaginatorComponent } from '../generic-table/paginator.component';
20
+ import { LetModule, PushModule } from '@ngrx/component';
21
+ import { HarnessLoader, parallel } from '@angular/cdk/testing';
22
+ import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed';
23
+ import {MatTableHarness} from '@angular/material/table/testing';
24
+ import { TransformCreator } from '../../services/transform-creator';
25
+
26
+ const data = [
27
+ {
28
+ name: 'Joe',
29
+ age: 10,
30
+ balance: 25
31
+ },
32
+ {
33
+ name: 'Jane',
34
+ age: 20,
35
+ balance: 35
36
+ }
37
+ ];
38
+ const metaData = [
39
+ {
40
+ key: 'name',
41
+ fieldType: FieldType.String,
42
+ additional: {},
43
+ order : 1
44
+ },
45
+ {
46
+ key: 'age',
47
+ fieldType: FieldType.Number,
48
+ additional: {},
49
+ order : 2
50
+ },
51
+ {
52
+ key: 'balance',
53
+ fieldType: FieldType.Number,
54
+ additional: {},
55
+ order : 3
56
+ }
57
+ ];
58
+
59
+ const initialState = {fullTableState: {
60
+ 'test-id': {
61
+ metaData,
62
+ hiddenKeys: [],
63
+ pageSize: 10,
64
+ initialized : true ,
65
+ filters: [],
66
+ }
67
+ },
68
+ globalStorageState : {
69
+ localProfiles: {}
70
+ }};
71
+ describe('table container', () => {
72
+ let fixture: ComponentFixture<TableContainerComponent>;
73
+ let component: TableContainerComponent;
74
+ let loader: HarnessLoader;
75
+
76
+ beforeEach(() => {
77
+
78
+ TestBed.configureTestingModule({
79
+ declarations: [
80
+ TableContainerComponent,
81
+ FilterComponent,
82
+ GenFilterDisplayerComponent,
83
+ GenericTableComponent,
84
+ PaginatorComponent,
85
+ GenColDisplayerComponent,
86
+ SpaceCasePipe,
87
+ CurrencyPipe,
88
+ ColumnTotalPipe,
89
+ DateFilterComponent,
90
+ MultiSortDirective,
91
+ ],
92
+ providers: [
93
+ { provide : TableBuilderConfigToken , useValue: {defaultTableState: { }}},
94
+ provideMockStore({ initialState }),
95
+ DatePipe,
96
+ TransformCreator,
97
+ CurrencyPipe,
98
+ PhoneNumberPipe,
99
+ ],
100
+ imports: [
101
+ NoopAnimationsModule,
102
+ CommonModule,
103
+ FormsModule,
104
+ LetModule,
105
+ ]
106
+ })
107
+ .compileComponents();
108
+ fixture = TestBed.createComponent(TableContainerComponent);
109
+ component = fixture.componentInstance;
110
+ loader = TestbedHarnessEnvironment.loader(fixture);
111
+ });
112
+
113
+ it('can create component', () => {
114
+ component.tableId = 'test-id';
115
+ component.tableBuilder = new TableBuilder(of(data));
116
+ fixture.detectChanges();
117
+ expect(component).toBeDefined();
118
+ });
119
+
120
+ it('can add metadata dynamicaly after the table has already been rendered', async () => {
121
+ const md = new BehaviorSubject(metaData);
122
+ component.tableId = 'test-id';
123
+ component.tableBuilder = new TableBuilder(of(data), md);
124
+
125
+ fixture.detectChanges();
126
+ expect(component).toBeDefined();
127
+
128
+ const tables = await loader.getAllHarnesses(MatTableHarness);
129
+ expect(tables.length).toBe(1);
130
+ const table = tables[0];
131
+
132
+ let rows = await table.getRows();
133
+
134
+ let cells = (await parallel(() => rows.map(row => row.getCells()))).map(row => row.length);
135
+
136
+ expect(cells).toEqual([3, 3]);
137
+
138
+ md.next([...metaData, {
139
+ key: 'dynamic',
140
+ fieldType: FieldType.String,
141
+ order : 4,
142
+ additional: {},
143
+ }]);
144
+
145
+ fixture.detectChanges();
146
+
147
+ rows = await table.getRows();
148
+
149
+ cells = (await parallel(() => rows.map(row => row.getCells()))).map(row => row.length);
150
+
151
+ expect(cells).toEqual([4, 4]);
152
+
153
+ });
154
+ });