@one-paragon/angular-utilities 2.8.4 → 2.8.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/fesm2022/one-paragon-angular-utilities.mjs +7350 -0
  2. package/fesm2022/one-paragon-angular-utilities.mjs.map +1 -0
  3. package/package.json +27 -15
  4. package/types/one-paragon-angular-utilities.d.ts +2211 -0
  5. package/karma.conf.js +0 -43
  6. package/ng-package.json +0 -7
  7. package/src/action-state/action-state-spinner/action-state-spinner.component.css +0 -16
  8. package/src/action-state/action-state-spinner/action-state-spinner.component.html +0 -7
  9. package/src/action-state/action-state-spinner/action-state-spinner.component.spec.ts +0 -25
  10. package/src/action-state/action-state-spinner/action-state-spinner.component.ts +0 -26
  11. package/src/action-state/action-state-ui/action-state-ui.module.ts +0 -13
  12. package/src/action-state/index.ts +0 -8
  13. package/src/action-state/ngrx-ext/ngrx-ext.module.ts +0 -14
  14. package/src/action-state/ngrx.ts +0 -69
  15. package/src/http-request-state/RequestStateFactory.ts +0 -56
  16. package/src/http-request-state/RequestStateStore.ts +0 -360
  17. package/src/http-request-state/deprecated.ts +0 -20
  18. package/src/http-request-state/directives/HttpStateDirectiveBase.ts +0 -29
  19. package/src/http-request-state/directives/http-error-state-directive.ts +0 -21
  20. package/src/http-request-state/directives/http-inProgress-state-directive.ts +0 -19
  21. package/src/http-request-state/directives/http-notStarted-state-directive.ts +0 -19
  22. package/src/http-request-state/directives/http-success-state-directive.ts +0 -29
  23. package/src/http-request-state/directives/index.ts +0 -5
  24. package/src/http-request-state/directives/request-state-directive.spec.ts +0 -73
  25. package/src/http-request-state/directives/request-state-directive.ts +0 -78
  26. package/src/http-request-state/documentation/CREATE-REQUESTOR.md +0 -667
  27. package/src/http-request-state/documentation/README.md +0 -191
  28. package/src/http-request-state/documentation/REQUEST-STATE-STORE-CONFIG.md +0 -648
  29. package/src/http-request-state/documentation/REQUESTOR.md +0 -616
  30. package/src/http-request-state/helpers.ts +0 -30
  31. package/src/http-request-state/http-state-module.ts +0 -23
  32. package/src/http-request-state/index.ts +0 -7
  33. package/src/http-request-state/models/view-context.ts +0 -18
  34. package/src/http-request-state/observable.spec.ts +0 -43
  35. package/src/http-request-state/request-state.ts +0 -66
  36. package/src/http-request-state/rxjs/getRequestorBody.ts +0 -10
  37. package/src/http-request-state/rxjs/getRequestorState.ts +0 -8
  38. package/src/http-request-state/rxjs/index.ts +0 -4
  39. package/src/http-request-state/rxjs/tapError.ts +0 -16
  40. package/src/http-request-state/rxjs/tapSuccess.ts +0 -16
  41. package/src/http-request-state/strategies.spec.ts +0 -42
  42. package/src/http-request-state/types.ts +0 -54
  43. package/src/ngrx/actionable-selector.ts +0 -189
  44. package/src/ngrx/index.ts +0 -1
  45. package/src/public-api.ts +0 -40
  46. package/src/rxjs/defaultShareReplay.ts +0 -8
  47. package/src/rxjs/index.ts +0 -5
  48. package/src/rxjs/mapError.ts +0 -8
  49. package/src/rxjs/rxjs-operators.ts +0 -130
  50. package/src/rxjs/subjectifier.ts +0 -17
  51. package/src/rxjs/subscriber.directive.ts +0 -57
  52. package/src/specs/clickSubject.spec.ts +0 -99
  53. package/src/specs/dialog.spec.ts +0 -101
  54. package/src/specs/toggleGroupDirective.spec.ts +0 -229
  55. package/src/table-builder/classes/DefaultSettings.ts +0 -11
  56. package/src/table-builder/classes/MatTableObservableDataSource.ts +0 -23
  57. package/src/table-builder/classes/TableBuilderConfig.ts +0 -49
  58. package/src/table-builder/classes/TableBuilderDataSource.ts +0 -64
  59. package/src/table-builder/classes/TableState.ts +0 -96
  60. package/src/table-builder/classes/data-store.ts +0 -10
  61. package/src/table-builder/classes/display-col.ts +0 -5
  62. package/src/table-builder/classes/filter-info.ts +0 -129
  63. package/src/table-builder/classes/table-builder-general-settings.ts +0 -233
  64. package/src/table-builder/classes/table-builder.ts +0 -105
  65. package/src/table-builder/classes/table-store.helpers.ts +0 -109
  66. package/src/table-builder/classes/table-store.ts +0 -540
  67. package/src/table-builder/components/array-column.component.ts +0 -34
  68. package/src/table-builder/components/column-builder/column-builder.component.html +0 -109
  69. package/src/table-builder/components/column-builder/column-builder.component.scss +0 -43
  70. package/src/table-builder/components/column-builder/column-builder.component.spec.ts +0 -49
  71. package/src/table-builder/components/column-builder/column-builder.component.ts +0 -130
  72. package/src/table-builder/components/column-builder/column-helpers.ts +0 -54
  73. package/src/table-builder/components/column-header-menu/column-header-menu.component.html +0 -128
  74. package/src/table-builder/components/column-header-menu/column-header-menu.component.scss +0 -97
  75. package/src/table-builder/components/column-header-menu/column-header-menu.component.ts +0 -113
  76. package/src/table-builder/components/date-filter/date-filter.component.html +0 -39
  77. package/src/table-builder/components/date-filter/date-filter.component.ts +0 -33
  78. package/src/table-builder/components/date-time-filter/date-time-filter.component.html +0 -25
  79. package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +0 -33
  80. package/src/table-builder/components/filter/filter.component.html +0 -120
  81. package/src/table-builder/components/filter/filter.component.scss +0 -60
  82. package/src/table-builder/components/filter/filter.component.spec.ts +0 -86
  83. package/src/table-builder/components/filter/filter.component.ts +0 -73
  84. package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +0 -171
  85. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +0 -60
  86. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +0 -57
  87. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +0 -44
  88. package/src/table-builder/components/generic-table/generic-table.component.html +0 -140
  89. package/src/table-builder/components/generic-table/generic-table.component.scss +0 -45
  90. package/src/table-builder/components/generic-table/generic-table.component.ts +0 -531
  91. package/src/table-builder/components/generic-table/paginator.component.ts +0 -125
  92. package/src/table-builder/components/group-by-list/group-by-list.component.css +0 -24
  93. package/src/table-builder/components/group-by-list/group-by-list.component.html +0 -21
  94. package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +0 -23
  95. package/src/table-builder/components/group-by-list/group-by-list.component.ts +0 -26
  96. package/src/table-builder/components/in-filter/in-filter.component.css +0 -22
  97. package/src/table-builder/components/in-filter/in-filter.component.html +0 -38
  98. package/src/table-builder/components/in-filter/in-filter.component.ts +0 -66
  99. package/src/table-builder/components/index.ts +0 -9
  100. package/src/table-builder/components/initialization-component/initialization.component.html +0 -78
  101. package/src/table-builder/components/initialization-component/initialization.component.ts +0 -28
  102. package/src/table-builder/components/link-column.component.ts +0 -42
  103. package/src/table-builder/components/number-filter/number-filter.component.css +0 -10
  104. package/src/table-builder/components/number-filter/number-filter.component.html +0 -32
  105. package/src/table-builder/components/number-filter/number-filter.component.spec.ts +0 -30
  106. package/src/table-builder/components/number-filter/number-filter.component.ts +0 -34
  107. package/src/table-builder/components/profiles-menu/profiles-menu.component.html +0 -77
  108. package/src/table-builder/components/profiles-menu/profiles-menu.component.scss +0 -126
  109. package/src/table-builder/components/profiles-menu/profiles-menu.component.spec.ts +0 -23
  110. package/src/table-builder/components/profiles-menu/profiles-menu.component.ts +0 -64
  111. package/src/table-builder/components/reset-menu/reset-menu.component.css +0 -3
  112. package/src/table-builder/components/reset-menu/reset-menu.component.html +0 -10
  113. package/src/table-builder/components/reset-menu/reset-menu.component.ts +0 -87
  114. package/src/table-builder/components/scroll-strategy.ts +0 -139
  115. package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +0 -57
  116. package/src/table-builder/components/sort-menu/sort-menu.component.html +0 -115
  117. package/src/table-builder/components/sort-menu/sort-menu.component.scss +0 -119
  118. package/src/table-builder/components/sort-menu/sort-menu.component.ts +0 -88
  119. package/src/table-builder/components/table-container/table-container.component.html +0 -94
  120. package/src/table-builder/components/table-container/table-container.component.scss +0 -60
  121. package/src/table-builder/components/table-container/table-container.component.ts +0 -467
  122. package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +0 -113
  123. package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +0 -125
  124. package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +0 -172
  125. package/src/table-builder/components/table-container/table-container.helpers/meta-data.helpers.ts +0 -19
  126. package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +0 -47
  127. package/src/table-builder/components/table-container/tableProps.ts +0 -21
  128. package/src/table-builder/components/table-container/virtual-scroll-container.ts +0 -216
  129. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +0 -42
  130. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +0 -47
  131. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +0 -40
  132. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +0 -11
  133. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +0 -85
  134. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +0 -35
  135. package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +0 -13
  136. package/src/table-builder/components/table-header-menu/table-header-menu.component.css +0 -21
  137. package/src/table-builder/components/table-header-menu/table-header-menu.component.html +0 -48
  138. package/src/table-builder/components/table-header-menu/table-header-menu.component.ts +0 -36
  139. package/src/table-builder/directives/custom-cell-directive.ts +0 -63
  140. package/src/table-builder/directives/custom-header-directive.ts +0 -16
  141. package/src/table-builder/directives/group-row-directive.ts +0 -91
  142. package/src/table-builder/directives/index.ts +0 -8
  143. package/src/table-builder/directives/multi-sort.directive.spec.ts +0 -124
  144. package/src/table-builder/directives/multi-sort.directive.ts +0 -58
  145. package/src/table-builder/directives/resize-column.directive.ts +0 -107
  146. package/src/table-builder/directives/table-wrapper.directive.ts +0 -13
  147. package/src/table-builder/directives/tb-filter.directive.ts +0 -376
  148. package/src/table-builder/documentation/table-builder/CUSTOM-CELL.md +0 -568
  149. package/src/table-builder/documentation/table-builder/CUSTOM-GROUP-ROW.md +0 -356
  150. package/src/table-builder/documentation/table-builder/METADATA-DOCUMENTATION.md +0 -517
  151. package/src/table-builder/documentation/table-builder/STYLER-STYLE.md +0 -228
  152. package/src/table-builder/documentation/table-builder/TABLE-BUILDER-CONFIG.md +0 -325
  153. package/src/table-builder/documentation/table-builder/TABLE-BUILDER-SETTINGS.md +0 -515
  154. package/src/table-builder/documentation/table-builder/TABLE-BUILDER.md +0 -430
  155. package/src/table-builder/documentation/table-builder/TABLE-CONTAINER.md +0 -628
  156. package/src/table-builder/enums/filterTypes.ts +0 -39
  157. package/src/table-builder/functions/boolean-filter-function.ts +0 -12
  158. package/src/table-builder/functions/date-filter-function.ts +0 -85
  159. package/src/table-builder/functions/download-data.ts +0 -11
  160. package/src/table-builder/functions/null-filter-function.ts +0 -9
  161. package/src/table-builder/functions/number-filter-function.ts +0 -47
  162. package/src/table-builder/functions/sort-data-function.ts +0 -80
  163. package/src/table-builder/functions/string-filter-function.ts +0 -59
  164. package/src/table-builder/interfaces/ColumnInfo.ts +0 -9
  165. package/src/table-builder/interfaces/dictionary.ts +0 -3
  166. package/src/table-builder/interfaces/meta-data.ts +0 -279
  167. package/src/table-builder/ngrx/tableBuilderStateStore.ts +0 -203
  168. package/src/table-builder/pipes/column-total.pipe.ts +0 -16
  169. package/src/table-builder/pipes/format-filter-type.pipe.ts +0 -12
  170. package/src/table-builder/pipes/format-filter-value.pipe.ts +0 -71
  171. package/src/table-builder/pipes/key-display.ts +0 -13
  172. package/src/table-builder/services/all-values-filter-creator.service.ts +0 -92
  173. package/src/table-builder/services/export-to-csv.service.ts +0 -117
  174. package/src/table-builder/services/link-creator.service.ts +0 -98
  175. package/src/table-builder/services/table-template-service.ts +0 -47
  176. package/src/table-builder/services/transform-creator.ts +0 -90
  177. package/src/table-builder/specs/table-custom-filters.spec.ts +0 -262
  178. package/src/table-builder/styles/collapser.styles.scss +0 -16
  179. package/src/table-builder/table-builder.module.ts +0 -42
  180. package/src/table-builder/types/group-types.ts +0 -42
  181. package/src/table-builder/types/index.ts +0 -1
  182. package/src/test.ts +0 -17
  183. package/src/utilities/array-helpers.ts +0 -13
  184. package/src/utilities/directives/auto-focus.directive.ts +0 -20
  185. package/src/utilities/directives/clickEmitterDirective.ts +0 -15
  186. package/src/utilities/directives/clickSubject.ts +0 -19
  187. package/src/utilities/directives/conditional-classes.directive.ts +0 -36
  188. package/src/utilities/directives/dialog-service.ts +0 -19
  189. package/src/utilities/directives/dialog.ts +0 -174
  190. package/src/utilities/directives/mat-toggle-group-directive.ts +0 -60
  191. package/src/utilities/directives/prevent-enter.directive.ts +0 -12
  192. package/src/utilities/directives/stop-propagation.directive.ts +0 -19
  193. package/src/utilities/directives/styler.ts +0 -45
  194. package/src/utilities/directives/trim-whitespace.directive.ts +0 -20
  195. package/src/utilities/index.ts +0 -22
  196. package/src/utilities/module.ts +0 -53
  197. package/src/utilities/pipes/function.pipe.ts +0 -21
  198. package/src/utilities/pipes/phone.pipe.ts +0 -20
  199. package/src/utilities/pipes/space-case.pipes.spec.ts +0 -47
  200. package/src/utilities/pipes/space-case.pipes.ts +0 -29
  201. package/tsconfig.lib.json +0 -20
  202. package/tsconfig.lib.prod.json +0 -10
  203. package/tsconfig.spec.json +0 -17
@@ -1,125 +0,0 @@
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 if(predicates.timestamp > filterInfos.timestamp && !!predicates.value.onlyAddedFilters){
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>>;
@@ -1,172 +0,0 @@
1
- import { groupBy } from "lodash";
2
- import { Timestamp } from "rxjs";
3
- import { DataGroup, Group, GroupedData, GroupGroup, NoneGroupHeader } from "../../../types/group-types";
4
- import { initIndexSymbol } from "./sort-state.helpers";
5
- import { Dictionary } from "@ngrx/entity";
6
- import { getFactory } from "../../../functions/sort-data-function";
7
- import { MetaData } from "../../../interfaces/meta-data";
8
- import { SortDirection } from '@angular/material/sort';
9
-
10
- const supportsGroupBy = typeof Object.groupBy === 'function'
11
-
12
- function getGroupedData<T extends NoneGroupHeader>(data: T[], groupByDatas: GroupedData[], metaData: Dictionary<MetaData<T>>) {
13
- return tbGroupBy(data, groupByDatas, 1, metaData);
14
- }
15
-
16
- let tbGroupBy = <T extends NoneGroupHeader = any>(data: T[], groupByDatas: GroupedData[], level = 1, metaData: Dictionary<MetaData<T>>, parent?: Group) => {
17
- const currentGroupData = groupByDatas[0];
18
- const groupedDataArr = groupData(currentGroupData, data, level, metaData, parent);
19
-
20
- const remainingGroupByDatas = groupByDatas.slice(1);
21
- const hasChildrenGroups = !!remainingGroupByDatas.length;
22
-
23
- if(hasChildrenGroups) {
24
- //update the group with children groups and related data
25
- //group the children by iterating over each group and grouping it by the next keys
26
- const groupOfGroups = groupedDataArr.map((group) => {
27
- const children = (group as DataGroup<T>).children;
28
- const groups = tbGroupBy(children as T[], remainingGroupByDatas, level + 1, metaData, group);
29
- const groupGroup = {
30
- groupName: group.groupName,
31
- groupHeaderDisplay: group.groupHeaderDisplay,
32
- uniqueName: group.uniqueName,
33
- key: currentGroupData.key,
34
- hasTheData: false,
35
- isGroupHeader: true,
36
- padding: group.padding,
37
- level: group.level,
38
- length: group.length,
39
- groups,
40
- parent: group.parent,
41
- [initIndexSymbol]: group[initIndexSymbol],
42
- custom: false
43
- } as GroupGroup<T>;
44
- return groupGroup;
45
- });
46
- return groupOfGroups;
47
- }
48
- return groupedDataArr;
49
- }
50
-
51
- function groupData<T extends NoneGroupHeader = any>(groupByData: GroupedData, groupData: T[], level = 1, metaData: Dictionary<MetaData<T>>, parent?: Group){
52
- const groupByKey = groupByData.key;
53
- const meta = metaData[groupByKey];
54
- const metaGroupGroupBy = meta && (meta.groupByLogic?.groupBy === 'use map' ? meta.map : meta.groupByLogic?.groupBy);
55
- const getter = metaGroupGroupBy || getFactory(groupByKey);
56
- const groupedDataDict: Record<string, (T)[]> = supportsGroupBy ? Object.groupBy(groupData, d => getter(d) ?? null) as Record<string, T[]> : groupBy(groupData, groupByKey);
57
- let groupedDataArr: Group<T>[] = Object.entries(groupedDataDict).map(([name, groupData], index) => {
58
- const uniqueName = parent?.groupName ? `${parent.groupName}-${name}` : name;
59
- return ({
60
- isGroupHeader: true,
61
- groupHeaderDisplay: name,
62
- hasTheData: true,
63
- children: groupData,
64
- groupName: `tb_group_${uniqueName}`,
65
- padding: 1 + (20 * (level - 1)),
66
- key: groupByKey,
67
- length: groupData.length,
68
- uniqueName,
69
- level,
70
- custom: false,
71
- parent,
72
- [initIndexSymbol]: index,
73
- } as DataGroup<T>)
74
- });
75
- if(groupByData.sort){
76
- groupedDataArr = sortGroupsByGroupSortOneLevel(groupByData, groupedDataArr);
77
- }
78
- return groupedDataArr;
79
- }
80
-
81
- export function setCustomGroupBy(customGroupBy: <T extends NoneGroupHeader = any>(data: T[], groupByDatas: GroupedData[], level?: number, metaData?: Dictionary<MetaData<T>>, parent?: Group) => DataGroup<T>[] | GroupGroup<T>[]) {
82
- tbGroupBy = customGroupBy;
83
- }
84
-
85
- export function updateGroupByState<T extends NoneGroupHeader = any>(
86
- groupedData: any[],
87
- { data, groups, expanded, groupSorts }: { data: Timestamp<T[]>, groups: Timestamp<GroupedData[]>, expanded: Timestamp<GroupedData[]>, groupSorts: Timestamp<GroupedData[]>},
88
- firstRun: boolean,
89
- metaData: Dictionary<MetaData<T>>
90
- ){
91
- if(
92
- firstRun
93
- || dataUpdated(data, groups, expanded, groupSorts)
94
- || groupsUpdated(groups, expanded, groupSorts)
95
- ){
96
- const combinedGroupsAndSorts = groups.value.map(g => {
97
- const sortForGroup = groupSorts.value.find(s => s.key === g.key);
98
- return { ...g, sort: sortForGroup?.sort || '' as SortDirection };
99
- });
100
- groupedData = groups.value.length ? getGroupedData(data.value, combinedGroupsAndSorts, metaData) : data.value;
101
- } else {
102
- groupedData = sortGroupsDeep(groupedData, groupSorts.value);
103
- }
104
- const newDisplayData = expanded.value.length === 0
105
- ? groupedData
106
- : groupedData.map(group => mapGroupHeader(group, expanded.value.flatMap(g => g.expandedHeaders), expanded.value.filter(g => g.expandedHeaders === 'all').map(g => g.key))).flat();
107
- return ({ displayData: newDisplayData, groupedData }) as GroupByState;
108
- }
109
-
110
- function sortGroupsByGroupSortOneLevel(sortData: GroupedData, groups: Group[]){
111
- const direction = sortData.sort;
112
- const multiplier = direction === 'asc' ? 1 : -1;
113
- return groups.toSorted((a, b) => a.length === b.length ? 0 : (a.length > b.length ? 1 : -1) * multiplier );
114
- }
115
- function sortGroupsDeep(groups: Group[], sorts: GroupedData[]){
116
- const sortData = sorts?.find(gs => gs.key === groups[0]?.key);
117
- if(sortData?.sort){
118
- groups = sortGroupsByGroupSortOneLevel(sortData, groups);
119
- } else {
120
- groups = groups.toSorted((a, b) => a[initIndexSymbol] - b[initIndexSymbol]);
121
- }
122
- if(!groups[0]?.hasTheData){
123
- groups.forEach((g, i) => (groups[i] as GroupGroup).groups = sortGroupsDeep((g as GroupGroup).groups, sorts))
124
- }
125
- return groups;
126
- }
127
-
128
- export function mapGroupHeader(obj: DataGroup | GroupGroup, expandedHeaders: string[] | true, expandAllGroups: string[] = []): any[]{
129
- const showChildren = expandedHeaders === true || expandedHeaders.includes(obj.uniqueName) || expandAllGroups.includes(obj.key);
130
- const children = !showChildren ? [] :
131
- obj.hasTheData ? obj.children
132
- : obj.groups.map(a => mapGroupHeader(a, expandedHeaders, expandAllGroups))
133
- return [obj, ...children].flat() as any[]
134
- }
135
-
136
- function dataUpdated(data: Timestamp<any[]>, groups: Timestamp<GroupedData[]>, expandedGroups: Timestamp<GroupedData[]>, sorts: Timestamp<GroupedData[]>){
137
- return data.timestamp > groups.timestamp && data.timestamp > expandedGroups.timestamp && data.timestamp > sorts.timestamp;
138
- }
139
-
140
- function groupsUpdated(groups: Timestamp<GroupedData[]>, expandedGroups: Timestamp<GroupedData[]>, sorts: Timestamp<GroupedData[]>){
141
- return groups.timestamp >= expandedGroups.timestamp && groups.timestamp >= sorts.timestamp;
142
- }
143
-
144
- export interface GroupByState { displayData: any[], groupedData: Group[]}
145
-
146
- export const initialGroupByState = { displayData: [], groupedData: [] }
147
-
148
- export const getAllGroupHeaderNames = (data: any[]) => {
149
- const groups = getGroupHeaders(data, (d:any) => d.isGroupHeader);
150
- const a = supportsGroupBy ? Object.groupBy(groups, group => group.key) as Dictionary<Group[]> : groupBy(groups, 'key');
151
- return Object.entries(a).map(([key, groups]) => ({
152
- groupKey: key,
153
- headers: groups!.map(g => g.uniqueName)
154
- }));
155
- }
156
-
157
- export const getAllGroupHeaderNamesByKeys = (data: any[], keys: string[]) => {
158
- const groups = getGroupHeaders(data, (d:any) => d.isGroupHeader && keys.includes(d.key), [], keys.length === 1);
159
- const a = supportsGroupBy ? Object.groupBy(groups, group => group.key) as Dictionary<Group[]> : groupBy(groups, 'key');
160
- return Object.entries(a).map(([key, groups]) => ({
161
- groupKey: key,
162
- headers: groups!.map(g => g.uniqueName)
163
- }));
164
- }
165
-
166
- const getGroupHeaders = (data: any[], filterFunc: (d:any) => boolean, arr:Group[] = [], oneLevel: boolean = false) => {
167
- const headers: Group[] = data.filter(filterFunc);
168
- arr.push(...headers);
169
- if(oneLevel) return arr;
170
- headers.forEach(h => {if(h.hasTheData === false && !!h.groups.length) getGroupHeaders(h.groups, filterFunc, arr)});
171
- return arr;
172
- }
@@ -1,19 +0,0 @@
1
- import { CustomCellMeta, MetaData } from "../../../interfaces/meta-data";
2
-
3
- export function mergeCustomCellMetaData(metaData1: CustomCellMeta, metaData2?: MetaData) {
4
- if(!metaData2){
5
- metaData1.noExport = true;
6
- return metaData1 as MetaData
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(!metaData1.additional?.styles && metaData2.additional?.styles) metaData1.additional = { ...metaData1.additional, styles: metaData2.additional.styles };
13
- if(metaData2.fieldType) metaData1.fieldType = metaData2.fieldType;
14
- metaData1.noExport = metaData2.noExport;
15
-
16
- const meta = { ...metaData2, ...metaData1 } as MetaData;
17
-
18
- return meta;
19
- }
@@ -1,47 +0,0 @@
1
- import { Sort } from "@angular/material/sort";
2
- import { SortDirection } from "../../../interfaces/meta-data";
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 }
@@ -1,21 +0,0 @@
1
- import { TemplateRef } from '@angular/core';
2
- import { CustomGroupRowDirective } from '../../directives';
3
-
4
- export interface TableProps {
5
- indexColumn: boolean;
6
- selectionColumn: boolean;
7
- isSticky: boolean;
8
- stickyFooter:boolean;
9
- groupHeaderTemplate?: TemplateRef<any>;
10
- groupHeaderHeight?: number;
11
- customGroupRows?: CustomGroupRowDirective<any>[];
12
- }
13
-
14
- export const defaultProps: TableProps = {
15
- indexColumn: false,
16
- selectionColumn: false,
17
- isSticky: true,
18
- stickyFooter: false,
19
- groupHeaderHeight: undefined,
20
- customGroupRows: [],
21
- }
@@ -1,216 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ElementRef, OnDestroy, effect, forwardRef, untracked, viewChild, inject, computed, contentChild } from '@angular/core';
2
- import {
3
- CdkVirtualScrollViewport,
4
- ScrollingModule,
5
- VIRTUAL_SCROLL_STRATEGY,
6
- } from '@angular/cdk/scrolling';
7
- import { switchMap } from 'rxjs';
8
- import { notNull } from '../../../rxjs';
9
- import { TableStore } from '../../classes/table-store';
10
- import { TableVirtualScrollStrategy } from '../scroll-strategy';
11
- import { parseTbSizeToPixels, VirtualScrollOptions } from '../../classes/table-builder-general-settings';
12
- import { DataStore } from '../../classes/data-store';
13
- import { toObservable, toSignal } from '@angular/core/rxjs-interop';
14
- import { GenericTableComponent } from '../generic-table/generic-table.component';
15
- import { TableContainerComponent } from './table-container.component';
16
- import { InitializationState } from '../../classes/TableState';
17
-
18
- @Component({
19
- selector: 'tb-virtual-scroll-container',
20
- template: `
21
- <cdk-virtual-scroll-viewport>
22
- <ng-content/>
23
- </cdk-virtual-scroll-viewport>
24
- `,
25
- changeDetection: ChangeDetectionStrategy.OnPush,
26
- imports: [ScrollingModule],
27
- viewProviders: [
28
- {
29
- provide: VIRTUAL_SCROLL_STRATEGY,
30
- useFactory: (c: VirtualScrollContainer) => c.scrollStrategy,
31
- deps: [forwardRef(() => VirtualScrollContainer)],
32
- },
33
- ],
34
- })
35
- export class VirtualScrollContainer implements OnDestroy {
36
- private state = inject(TableStore);
37
- private dataStore = inject(DataStore);
38
-
39
- viewport = viewChild.required(CdkVirtualScrollViewport);
40
- private genericTable = contentChild(GenericTableComponent);
41
- private tableContainer = inject(TableContainerComponent);
42
-
43
- defaultOptions = new VirtualScrollOptions();
44
-
45
-
46
- $usePaginator = this.state.selectSignal(s => s.notPersistedTableSettings.usePaginator);
47
- $pageSize = this.state.$pageSize;
48
- $currentPage = this.state.$currentPage;
49
- $showAll = this.state.$showAll;
50
- $stateDataLength = this.dataStore.selectSignal(s => s.sortedFilteredGroupedDataLength);
51
- viewPort$ = toObservable(this.viewport).pipe(notNull());
52
- $scrolledIndexChange = toSignal(this.viewPort$.pipe(switchMap(v => v.scrolledIndexChange)));
53
- $renderedRange = toSignal(this.viewPort$.pipe(switchMap(v => v.renderedRangeStream)));
54
- $virtualScrollOptions = computed(() =>
55
- {
56
- if(this.state.$initializationState() >= InitializationState.Ready)
57
- return this.state.$tableSettings().virtualSettings!;
58
- else return undefined;
59
- }
60
- );
61
- $optionsSet = computed(() => !!this.$virtualScrollOptions());
62
- $dataLength = computed(() => {
63
- const paginated = this.$usePaginator() && !this.$showAll();
64
- const pageSize = this.$pageSize();
65
- const pageNumber = this.$currentPage();
66
- const dataLen = this.$stateDataLength();
67
- if(paginated) return Math.min(dataLen - (pageNumber * pageSize), pageSize);
68
- return dataLen;
69
- });
70
- constructor() {
71
- addEventListener('resize', this.resizeHandler);
72
- }
73
- #setViewportEffect = effect(() => {
74
- const viewport = this.viewport();
75
- const options = this.$optionsSet();
76
- untracked(() => {
77
- if(!!viewport && !!options){
78
- this.setSize(this.viewport()!.elementRef, 'initial');
79
- }
80
- })
81
- })
82
-
83
-
84
- #onRenderedRangeEffect = effect(() => {
85
- const renderedRange = this.$renderedRange();
86
- const viewport = this.viewport();
87
- if(!renderedRange) return;
88
- untracked(() => {
89
- this.dataStore.patchState({
90
- virtualEnds: {
91
- start: renderedRange.start,
92
- end: renderedRange.end,
93
- } });
94
- if(!viewport) return;
95
- this.setSize(viewport.elementRef, 'rendered range');
96
- })
97
- });
98
-
99
- ngOnDestroy(): void {
100
- removeEventListener('resize', this.resizeHandler);
101
- }
102
-
103
- setSize(el: ElementRef<HTMLElement>, trigger: SetSizeTrigger) {
104
- const virtualScrollOptions = this.$virtualScrollOptions();
105
- if(!virtualScrollOptions) return;
106
- if(virtualScrollOptions.dynamicHeight){
107
- this.calcDynamic(el);
108
- return;
109
- }
110
- const rowHeight = this.computedRowHeight();
111
- let amountOfVisibleItems = virtualScrollOptions?.amountOfVisibleItems || this.defaultOptions.amountOfVisibleItems;
112
- amountOfVisibleItems = Math.min(amountOfVisibleItems, this.$dataLength());
113
- let height = (rowHeight * amountOfVisibleItems);
114
-
115
- const footerHeight = this.computedFooterHeight();
116
- const headerHeight = this.computedHeaderHeight();
117
- height += (footerHeight + headerHeight);
118
-
119
- const maxViewPortHeightPx = parseTbSizeToPixels(virtualScrollOptions.maxViewPortHeight) || 0;
120
-
121
- if(virtualScrollOptions?.maxViewPortHeight && maxViewPortHeightPx) height = maxViewPortHeightPx;
122
-
123
- this.setHeight(height, el);
124
- }
125
-
126
- calcDynamic(el: ElementRef<HTMLElement>){
127
- const virtualScrollOptions = this.$virtualScrollOptions();
128
- if(!virtualScrollOptions) return;
129
-
130
- const t = this.tableContainer.elementRef.nativeElement.querySelector(`#${TableContainerComponent.headerId}`);
131
- const rect = t?.getBoundingClientRect();
132
- const windowHeight = window.innerHeight;
133
- const distanceFromBottom = windowHeight - rect!.bottom;
134
-
135
- const rowHeight = this.computedRowHeight();
136
-
137
- const footerHeight = this.computedFooterHeight();
138
-
139
- const headerHeight = this.computedHeaderHeight();
140
-
141
- const buffer = this.computedBuffer();
142
-
143
- const horizontalScrollPadding = el.nativeElement.scrollWidth > el.nativeElement.clientWidth ? 17 : 0;
144
-
145
- const maxViewPortHeightPx = parseTbSizeToPixels(virtualScrollOptions.maxViewPortHeight) || 0;
146
-
147
- let tableSize = distanceFromBottom;
148
- if(virtualScrollOptions?.maxViewPortHeight && maxViewPortHeightPx < tableSize){
149
- tableSize = maxViewPortHeightPx;
150
- }
151
-
152
- const available = (distanceFromBottom - footerHeight)
153
- - headerHeight
154
- - (this.$usePaginator() ? 20 : 0)
155
- - buffer
156
- - horizontalScrollPadding;
157
-
158
- const amountOfRowsThatWillFit = Math.floor(available / rowHeight);
159
-
160
- const minAmountOfRows = virtualScrollOptions?.amountOfVisibleItems || this.defaultOptions.amountOfVisibleItems;
161
-
162
- const amountOfVisibleItems = Math.min(Math.max(amountOfRowsThatWillFit, minAmountOfRows), this.$dataLength());
163
-
164
- let height = (rowHeight * amountOfVisibleItems);
165
-
166
- height += (footerHeight + headerHeight + horizontalScrollPadding);
167
- this.setHeight(height, el);
168
- }
169
-
170
- setHeight(height: number, el: ElementRef<HTMLElement>){
171
- const vsViewport = el.nativeElement;
172
- vsViewport.setAttribute(
173
- 'style',
174
- `height: ${height}px !important;`,
175
- );
176
- this.viewport()?.checkViewportSize();
177
- const virtualScrollOffset = this.viewport()?.getOffsetToRenderedContentStart() ?? 0
178
- this.dataStore.patchState({ virtualScrollOffset });
179
- }
180
-
181
- resizeHandler = () => {
182
- if(this.viewport() && this.$virtualScrollOptions()?.dynamicHeight) {
183
- this.setSize(this.viewport()!.elementRef, 'resize');
184
- }
185
- };
186
-
187
- computedRowHeight = computed(() => {
188
- const virtualScrollOptions = this.state.$tableSettings().virtualSettings! as VirtualScrollOptions;
189
- const rowHeight = this.state.$userDefinedRowHeight() || virtualScrollOptions?.rowHeight || this.state.$tableSettings().rowHeight || this.defaultOptions.rowHeight;
190
- return parseTbSizeToPixels(rowHeight) || 0;
191
- })
192
-
193
- computedHeaderHeight = computed(() => {
194
- if(this.state.$tableSettings().hideHeader) return 0;
195
- const virtualScrollOptions = this.state.$tableSettings().virtualSettings! as VirtualScrollOptions;
196
- const headerHeight = this.state.$userDefinedHeaderHeight() || virtualScrollOptions?.headerHeight || this.state.$tableSettings().headerHeight || this.defaultOptions.headerHeight;
197
- return parseTbSizeToPixels(headerHeight) || 0;
198
- });
199
-
200
- computedFooterHeight = computed(() => {
201
- return parseFloat(this.genericTable()?.$footerHeight()?.replace('px', '') || '0');
202
- });
203
-
204
- computedBuffer = computed(() => {
205
- const virtualScrollOptions = this.state.$tableSettings().virtualSettings! as VirtualScrollOptions;
206
- if(!virtualScrollOptions.dynamicalHeightBuffer) return 0
207
- return parseTbSizeToPixels(virtualScrollOptions.dynamicalHeightBuffer) || 0;
208
- })
209
-
210
- scrollStrategy = new TableVirtualScrollStrategy(
211
- this,
212
- this.dataStore
213
- );
214
- }
215
-
216
- type SetSizeTrigger = 'initial' | 'rendered range' | 'resize';
@@ -1,42 +0,0 @@
1
- <div class="d-w">
2
-
3
- @if ($currentFilters().length)
4
- {
5
- <button class="cancel-button" mat-icon-button matTooltip="Close all Filters Cards" (click)="clearAll()">
6
- <mat-icon class="cancel-button" color="primary">close</mat-icon>
7
- </button>
8
- <div class="float">
9
- @for (filter of $currentFilters(); track filter.key)
10
- {
11
- <div class="filter">
12
- <tb-filter [filter]="filter" (close)="deleteByIndex($index)" />
13
- </div>
14
- }
15
- </div>
16
- }
17
-
18
- <mat-chip-set>
19
- @for (filter of $filters(); track filter.key)
20
- {
21
- <mat-chip (dblclick)="addFilter(filter)" (removed)="tableState.removeFilter(filter.filterId!)">
22
- {{ (filter.key | keyDisplay)() }} {{filter.filterType | formatFilterType : filter.filterValue}} {{ (filter.filterValue | formatFilterValue: filter.key : filter.filterType)() }}
23
- <mat-icon matChipRemove>cancel</mat-icon>
24
- </mat-chip>
25
- }
26
- @for (filter of $certainCustomFilters(); track filter.filterId)
27
- {
28
- <mat-chip (removed)="tableState.removeFilter(filter.filterId!)">
29
- {{filter.chipLabel}}
30
- <mat-icon matChipRemove>cancel</mat-icon>
31
- </mat-chip>
32
- }
33
- @if (($filters().length + $certainCustomFilters().length) > 1)
34
- {
35
- <mat-chip (removed)="tableState.clearFilters()">
36
- Clear All
37
- <mat-icon matChipRemove>cancel</mat-icon>
38
- </mat-chip>
39
- }
40
- </mat-chip-set>
41
-
42
- </div>