@one-paragon/angular-utilities 2.8.4 → 2.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,467 +0,0 @@
1
- import {
2
- Component,
3
- ChangeDetectionStrategy,
4
- Predicate,
5
- inject,
6
- TemplateRef,
7
- Injector,
8
- contentChildren,
9
- computed,
10
- effect,
11
- untracked,
12
- input,
13
- viewChild,
14
- output,
15
- ElementRef,
16
- linkedSignal,
17
- DestroyRef,
18
- } from '@angular/core';
19
- import { BehaviorSubject, Timestamp } from 'rxjs';
20
- import { CustomCellMeta, MetaData } from '../../interfaces/meta-data';
21
- import { TableBuilder } from '../../classes/table-builder';
22
- import { MatRowDef } from '@angular/material/table';
23
- import { CustomCellDirective, CustomGroupRowDirective, CustomHeaderDirective, MultiSortDirective, TableCustomFilterDirective, TableFilterDirective } from '../../directives';
24
- import { TableStore } from '../../classes/table-store';
25
- import { ExportToCsvService } from '../../services/export-to-csv.service';
26
- import { InitializationState } from '../../classes/TableState';
27
- import { WrapperFilterStore } from '../table-container-filter/table-wrapper-filter-store';
28
- import { createFilterFunc, CustomFilter, FilterInfo, isCustomFilter, needsFilterCreation } from '../../classes/filter-info';
29
- import { TableWrapperDirective } from '../../directives/table-wrapper.directive';
30
- import { createLinkCreatorDict } from '../../services/link-creator.service';
31
- import { TableBuilderStateStore } from '../../ngrx/tableBuilderStateStore';
32
- import { FilterInfoDict, FilterInfoState, FilterPredicateState, patchDirectiveFromState, updateFilterInfoState, updateFilterPredicateState, updateFilterState } from './table-container.helpers/filter-state.helpers';
33
- import { initialSortState, SortState, updateSortState } from './table-container.helpers/sort-state.helpers';
34
- import { getAllGroupHeaderNames, getAllGroupHeaderNamesByKeys, GroupByState, updateGroupByState } from './table-container.helpers/groupBy.helpers';
35
- import { sortAndFilterData } from './table-container.helpers/data-state.helpers';
36
- import { TableProps } from './tableProps';
37
- import { PaginatorComponent } from '../generic-table/paginator.component';
38
- import { TableBuilderDataSource } from '../../classes/TableBuilderDataSource';
39
- import { GenericTableComponent } from '../generic-table/generic-table.component';
40
- import { outputFromObservable, toObservable } from '@angular/core/rxjs-interop';
41
- import { DataStore } from '../../classes/data-store';
42
- import { PersistedTableSettings } from '../../classes/table-builder-general-settings';
43
- import { mergeCustomCellMetaData } from './table-container.helpers/meta-data.helpers';
44
- import { SelectionChange } from '@angular/cdk/collections';
45
- import { MatMenu, MatMenuModule } from '@angular/material/menu';
46
- import { NgTemplateOutlet } from '@angular/common';
47
- import { MatButtonModule } from '@angular/material/button';
48
- import { MatIconModule } from '@angular/material/icon';
49
- import { MatTooltipModule } from '@angular/material/tooltip';
50
- import { GenColDisplayerComponent } from '../gen-col-displayer/gen-col-displayer.component';
51
- import { GroupByListComponent } from '../group-by-list/group-by-list.component';
52
- import { ProfilesMenuComponent } from '../profiles-menu/profiles-menu.component';
53
- import { SortMenuComponent } from '../sort-menu/sort-menu.component';
54
- import { FilterChipsComponent } from '../table-container-filter/filter-list/filter-list.component';
55
- import { GenFilterDisplayerComponent } from '../table-container-filter/gen-filter-displayer/gen-filter-displayer.component';
56
- import { TableHeaderMenuComponent } from '../table-header-menu/table-header-menu.component';
57
- import { VirtualScrollContainer } from './virtual-scroll-container';
58
- import { Sort } from '@angular/material/sort';
59
- import { TableBuilderConfigToken } from '../../classes/TableBuilderConfig';
60
- import { buildInAllValuesFilter } from '../../services/all-values-filter-creator.service';
61
- import { notNull } from '../../../rxjs';
62
- import { GroupedData, NoneGroupHeader } from '../../types/group-types';
63
-
64
- @Component({
65
- selector: 'tb-table-container',
66
- templateUrl: './table-container.component.html',
67
- styleUrls: ['./table-container.component.scss', '../../styles/collapser.styles.scss'],
68
- changeDetection: ChangeDetectionStrategy.OnPush,
69
- providers: [TableStore, ExportToCsvService, WrapperFilterStore, DataStore],
70
- imports: [
71
- NgTemplateOutlet,
72
- PaginatorComponent,
73
- MultiSortDirective, GroupByListComponent, FilterChipsComponent, GenFilterDisplayerComponent, GenColDisplayerComponent,
74
- SortMenuComponent, GenericTableComponent, ProfilesMenuComponent, TableHeaderMenuComponent,
75
- MatButtonModule, MatMenuModule, MatIconModule, MatTooltipModule, VirtualScrollContainer,
76
- ]
77
- }) export class TableContainerComponent<T = any> {
78
- public state = inject(TableStore);
79
- private dataStore = inject(DataStore);
80
- public wrapper = inject(TableWrapperDirective, { optional: true });
81
- public stateService = inject(TableBuilderStateStore);
82
- public injector = inject(Injector);
83
- public elementRef = inject(ElementRef);
84
- private exportToCsvService = inject(ExportToCsvService);
85
- private config = inject(TableBuilderConfigToken);
86
- protected dataSource = new TableBuilderDataSource<T>(
87
- this.state,
88
- this.dataStore
89
- );
90
-
91
- $filterDirectives = contentChildren(TableFilterDirective, { descendants: true });
92
- $customFilterDirectives = contentChildren(TableCustomFilterDirective, { descendants: true });
93
- $paginatorComponent = viewChild(PaginatorComponent);
94
- $paginatorWrapper = viewChild<ElementRef<HTMLDivElement>>('paginatorWrapper');
95
- $genericTable = viewChild(GenericTableComponent);
96
- _$customRows = contentChildren(MatRowDef<any>);
97
- $customRows = computed(() => [...this._$customRows()]);
98
- $customCells = contentChildren(CustomCellDirective);
99
- $customHeaders = contentChildren(CustomHeaderDirective);
100
- $customGroupRows = contentChildren(CustomGroupRowDirective);
101
- $menu = viewChild.required(MatMenu);
102
- menuInjector = Injector.create({
103
- providers: [{ provide: MatMenu, useFactory: () => this.$menu() }],
104
- parent: this.injector
105
- })
106
-
107
- $tableBuilder = input.required<TableBuilder<T>>({ alias: 'tableBuilder' });
108
- $tableIdInput = input<string | undefined>(undefined, { alias: 'tableId' });
109
- $trackByInput = input<string | undefined>(undefined, { alias: 'trackBy' });
110
- $inputFilters = input<(Predicate<T> | CustomFilter<T> | FilterInfo<any, T>)[]>([], { alias: 'inputFilters' });
111
- $filterInfoInputs = computed(() =>
112
- this.$inputFilters().filter(i => !isFunction(i)) as (FilterInfo | CustomFilter)[]);
113
-
114
- $indexColumnInput = input<boolean>(false, { alias: 'indexColumn' });
115
- $selectionColumnInput = input<boolean>(false, { alias: 'selectionColumn' });
116
- $stickyHeaderInput = input<boolean>(true, { alias: 'stickyHeader' });
117
- $stickyFooterInput = input<boolean>(undefined, { alias: 'stickyFooter' });
118
- $groupHeaderTemplate = input<TemplateRef<any> | undefined>(undefined, { alias: 'groupHeaderTemplate' });
119
- $groupHeaderHeight = input<number | undefined>(undefined, { alias: 'groupHeaderHeight' });
120
- $pageSize = input<number | undefined>(undefined, { alias: 'pageSize' });
121
-
122
- _selection$ = new BehaviorSubject<SelectionChange<T> | null>(null);
123
- selection$ = outputFromObservable(this._selection$.pipe(notNull()), { alias: 'selection' });
124
- onStateReset$ = output<null>({ alias: 'onStateReset' });
125
- onSaveState$ = output<null>({ alias: 'onSaveState' });
126
- state$ = outputFromObservable(toObservable(this.state.$savableState), { alias: 'state' });
127
- $data = computed(() => this.$sortedAndFilteredData()?.value || []);
128
- data$ = outputFromObservable(toObservable(this.$data), { alias: 'data' });
129
- /**
130
- * Will be different than $data if grouping is applied
131
- */
132
- $sortedAndFilteredAndGroupedData = computed(() => this.$filteredSortedAndGrouped()?.displayData || []);
133
- sortedAndFilteredAndGroupedData$ = outputFromObservable(toObservable(this.$sortedAndFilteredAndGroupedData), { alias: 'sortedAndFilteredAndGroupedData' });
134
-
135
- private $displayData = computed(() => this.$tableBuilder() && this.$filteredSortedAndGrouped()?.displayData);
136
- public clearSelections(){
137
- this.$genericTable()?.$selection().clear(true);
138
- }
139
- public firstPage(): void {
140
- this.$paginatorComponent()?.$paginator()?.firstPage();
141
- }
142
- public lastPage(): void {
143
- this.$paginatorComponent()?.$paginator()?.lastPage();
144
- }
145
- public expandAllGroups = () => {
146
- const groupHeaders = getAllGroupHeaderNames(this.$displayData()!);
147
- this.state.expandOfGroup(groupHeaders.map(g => ({ groupKey: g.groupKey, uniqueNameOfHeadersToExpand: g.headers })));
148
- }
149
-
150
- public expandAllOfGroup = (groupKey: string) => {
151
- const groupHeaders = getAllGroupHeaderNamesByKeys(this.$displayData()!, [groupKey]);
152
- this.state.expandOfGroup(groupHeaders.map(g => ({ groupKey: g.groupKey, uniqueNameOfHeadersToExpand: g.headers })));
153
- }
154
-
155
- public collapseAllGroups = () => this.state.collapseAll();
156
- public exportToCsv = () => this.exportToCsvService.exportToCsv(this.$data());
157
-
158
-
159
- protected $myColumns = computed(() => {
160
- return this.state.$metaDataArray().map( metaData => ({
161
- metaData,
162
- customCell: this.$customCells().filter(cc => cc.$inited()).find(cc => cc.$customCell() === metaData.key),
163
- customHeader: this.$customHeaders().filter(ch => ch.$inited()).find(ch => ch.$customHeader() === metaData.key)
164
- }))
165
- });
166
- protected $useVirtual = this.state.$isVirtual;
167
- protected $collapsedFooter = this.state.$footerCollapsed;
168
- protected $collapsedHeader = this.state.$headerCollapsed;
169
- protected $displayDataLength = computed(() => this.$displayData()?.length || 0);
170
-
171
-
172
- $tableBuilderSettings = computed(() => this.$tableBuilder().$settings());
173
- $trackBy = computed(() => this.$trackByInput() || this.$tableBuilderSettings()?.tableSettings?.trackBy);
174
- $tableId = computed(() => this.$tableIdInput() || this.$tableBuilderSettings()?.tableSettings?.tableId);
175
- $includeSelectionColumn = computed(() => this.$selectionColumnInput() || !!this.$tableBuilderSettings()?.tableSettings?.includeSelectionColumn);
176
- $includeIndexColumn = computed(() => this.$indexColumnInput() || !!this.$tableBuilderSettings()?.tableSettings?.includeIndexColumn);
177
- $stickyHeader = computed(() => {
178
- const settings = this.$tableBuilderSettings()?.columnHeaderSettings?.stickyHeaderRow;
179
- if(settings != null){
180
- return settings;
181
- }
182
- return this.$stickyHeaderInput();
183
- });
184
- $stickyFooter = computed(() => {
185
- if(this.$stickyFooterInput() != null){
186
- return !!this.$stickyFooterInput();
187
- }
188
- if(this.$tableBuilderSettings()?.columnFooterSettings?.stickyFooterRow != null){
189
- return !!this.$tableBuilderSettings()?.columnFooterSettings?.stickyFooterRow;
190
- }
191
- return this.config.defaultTableSettings?.columnFooterSettings?.stickyFooterRow || false;
192
- })
193
-
194
- $props = computed((): TableProps => {
195
- const indexColumn = this.$includeIndexColumn();
196
- const selectionColumn = this.$includeSelectionColumn();
197
- const stickHeader = this.$stickyHeader();
198
- const stickyFooter = this.$stickyFooter();
199
- const groupHeaderTemplate = this.$groupHeaderTemplate();
200
- const groupHeaderHeight = this.$groupHeaderHeight();
201
- const customGroupRows = this.$customGroupRows().filter(cgr => cgr.$inited());
202
- return ({ indexColumn, selectionColumn, isSticky: stickHeader, stickyFooter, groupHeaderTemplate, groupHeaderHeight, customGroupRows })
203
- });
204
-
205
- #initTableBuilder = effect(() => {
206
- const tb = this.$tableBuilder();
207
- untracked(() => {
208
- if(tb){
209
- tb?.prep(this.injector);
210
- tb._container.set(this);
211
- }
212
- })
213
- });
214
-
215
- #initializeTableSettingsFromTableBuilderAndPersistedStateEffect = effect(() => {
216
- const metaLoaded = this.$isInitializationState(InitializationState.MetaDataLoaded)();
217
- if(!metaLoaded) return;
218
- const persistedState = this.$persistedState();
219
- const tbSettings = this.$tableBuilderSettings()!;
220
- untracked(() => {
221
- this.state.setTableSettings(tbSettings);
222
- if(persistedState){
223
- persistedState.persistedTableSettings = new PersistedTableSettings(persistedState.persistedTableSettings);
224
- this.state.updateStateFromPersistedState(persistedState);
225
- }
226
- this.state.setInitializationState(InitializationState.Ready);
227
- });
228
- });
229
-
230
- #setPageSizeFromInputEffect = effect(() => {
231
- const pageSize = this.$pageSize();
232
- const userDefinedPageSize = this.state.$userDefinedPageSize();
233
- if(pageSize && !userDefinedPageSize) {
234
- untracked(() => this.state.setPageSize(pageSize));
235
- }
236
- });
237
-
238
- #patchedFilters: string[] = [];
239
-
240
- #patchSavableFilterDirectivesFromPersistedStateEffect = effect(() => {
241
- const loaded = this.$isInitializationState(InitializationState.TableSettingsLoaded)();
242
- const filterDirectives = this.$allFilterDirectives();
243
- if(!loaded || !filterDirectives.length) return;
244
- const stateFilters = this.state.$filters();
245
-
246
- untracked(() => {
247
- filterDirectives.filter(f => f.savable && !this.#patchedFilters.includes(f.filterId)).forEach( f => {
248
- this.#patchedFilters.push(f.filterId);
249
- const filter = stateFilters[f.filterId];
250
-
251
- patchDirectiveFromState(f, filter);
252
- this.state.addFilter(f.filter$ as any);
253
- });
254
- })
255
- });
256
-
257
- #patchSavableFilterInputsFromPersistedStateEffect = effect(() => {
258
- const loaded = this.$isInitializationState(InitializationState.TableSettingsLoaded)();
259
- const inputFilters = this.$filterInfoInputs();
260
- if(!loaded || !inputFilters.length) return;
261
-
262
- untracked(() => {
263
- const stateFilters = this.state.$filters();
264
- inputFilters.filter(f => f.filterId).forEach( f => {
265
- const patched = this.#patchedFilters.includes(f.filterId);
266
- const stateFilter = stateFilters[f.filterId];
267
-
268
- if(patched || !stateFilter) {
269
- this.state.addFilter(f);
270
- } else if(isCustomFilter(f)){
271
- (stateFilter as CustomFilter).predicate = f.predicate;
272
- this.state.addFilter(stateFilter);
273
- }
274
- this.#patchedFilters.push(f.filterId);
275
- });
276
- })
277
- });
278
-
279
- #addPropsToStoreFromInputsEffect = effect(() => {
280
- const props = this.$props();
281
- untracked(() => this.state.setProps(props));
282
- });
283
-
284
- #addMetaDataToStoreEffect = effect(() => {
285
- const allMetaDatas = this.$allMetaDatas();
286
- if(!allMetaDatas) return;
287
- untracked(() => {
288
- this.state.setMetaData(allMetaDatas);
289
- this.state.setLinkMaps(createLinkCreatorDict(allMetaDatas));
290
- });
291
- });
292
-
293
- #setFilteredDataLengthEffect = effect(() => {
294
- const tableBuilder = this.$tableBuilder();
295
- const data = this.$sortedAndFilteredData();
296
- if(!tableBuilder || !data) return;
297
- untracked(() => {
298
- this.dataStore.patchState({ sortedFilteredDataLength: data.value.length });
299
- })
300
- });
301
-
302
- #setDataSourceDataEffect = effect(() => {
303
- const tableBuilder = this.$tableBuilder();
304
- const flat = this.$filteredSortedAndGrouped();
305
- if(!tableBuilder || !flat) return;
306
- untracked(() => {
307
- const data = flat.displayData;
308
- this.dataSource.setData(data);
309
- this.dataStore.patchState({ sortedFilteredGroupedDataLength: data.length });
310
- })
311
- });
312
-
313
- #destroyRef = inject(DestroyRef).onDestroy(() => {
314
- const tableId = this.$tableId();
315
- if(tableId) {
316
- this.stateService.saveTableStateToLocal({ tableId, tableState: this.state.$savableState() });
317
- }
318
- });
319
-
320
- private $persistedState = computed(() => {
321
- const tableId = this.$tableId();
322
- if(tableId) {
323
- return this.stateService.$selectLocalTableStateForView(tableId)();
324
- }
325
- return undefined
326
- });
327
- private $allFilterDirectives = computed( () => {
328
- if(this.wrapper) {
329
- return [...this.$filterDirectives(), ...this.$customFilterDirectives(), ...this.wrapper.$registrations()];
330
- }
331
- return [...this.$filterDirectives(), ...this.$customFilterDirectives()];
332
- });
333
- private $tableBuilderMetaData = computed(() => this.$tableBuilder()?.$metaData());
334
- private $allMetaDatas = computed(() => {
335
- const tableBuilderMetaData = this.$tableBuilderMetaData();
336
- if(!tableBuilderMetaData) return;
337
- const customCellMetaDatas = this.$customCells().filter(cc => cc.$inited()).map(cc => cc.$metaData()).filter(d => !!d) as CustomCellMeta[];
338
- const mappedCustomCellMetaDatas = customCellMetaDatas.map( md => mergeCustomCellMetaData(md!, tableBuilderMetaData.find( item => item.key === md.key ) ));
339
-
340
- return [...tableBuilderMetaData, ...mappedCustomCellMetaDatas];
341
- });
342
-
343
- private $allMetaDataTimeStamped = linkedSignal<MetaData[] | undefined, { timestamp: number, value: MetaData[], previous: MetaData[]}>({
344
- source: this.$allMetaDatas,
345
- computation: (curr, previous) => {
346
- return { timestamp: Date.now(), value: curr || [], previous: previous?.value.value || [] }
347
- }
348
- });
349
-
350
- #setUpAllValuesFilters = effect(() => {
351
- const data = this.$allDataTimeStamped();
352
- const allMeta = this.$allMetaDataTimeStamped();
353
- if(!data) return;
354
- untracked(() => {
355
- const currentAll = computed(() => this.state.selectSignal(s => s.allFilters)())();
356
- const mapped = buildInAllValuesFilter(this.config, allMeta.previous, allMeta.value, data.value, allMeta.timestamp, data.timestamp, currentAll);
357
- this.state.patchState({ allFilters: mapped });
358
- })
359
- })
360
-
361
- private $preds = computed(() => {
362
- const predicateInputFilters = this.$inputFilters().filter(isFunction);
363
- const notSavableFilterDirectives = this.$allFilterDirectives()
364
- .filter(d => !d.savable)
365
- .map(d => d.$filter())
366
- .filter(d => !!d && needsFilterCreation(d))
367
- .map(d => createFilterFunc(d!));
368
- return [...predicateInputFilters, ...notSavableFilterDirectives]
369
- });
370
-
371
- private $predicateFiltersState = linkedSignal<Predicate<any>[], { value: FilterPredicateState<T>, timestamp: number } >({
372
- source: this.$preds,
373
- computation: (curr, previous) => {
374
- if(!previous?.value) return ({ value: updateFilterPredicateState({ allFilters: [] as Predicate<T>[] }, curr), timestamp: Date.now() })
375
- return ({ value: updateFilterPredicateState(previous.value.value, curr), timestamp: Date.now() })
376
- }
377
- });
378
-
379
- private $savableFiltersState = linkedSignal<FilterInfoDict, { value: FilterInfoState<T>, timestamp: number } >({
380
- source: this.state.$filters,
381
- computation: (curr, previous) => {
382
- if(!previous?.value) return ({ value: updateFilterInfoState({ allFilters: {} }, curr), timestamp: Date.now() })
383
- return ({ value: updateFilterInfoState(previous.value.value, curr), timestamp: Date.now() })
384
- }
385
- });
386
-
387
- private $allFilterStatesTimeStamped = computed(() => {
388
- if(!this.$isInitializationState(InitializationState.Ready)()) return undefined;
389
- return ({ value: updateFilterState(this.$savableFiltersState(), this.$predicateFiltersState()), timestamp: Date.now() })
390
- });
391
-
392
- private $sortStateTimeStamped = linkedSignal<Sort[] | false, { value: SortState, timestamp: number } | undefined>({
393
- source: computed(() => this.$isInitializationState(InitializationState.Ready)() && this.state.$getSorts()),
394
- computation: (curr, prev) => {
395
- if(!curr) return undefined;
396
- if(!prev?.value) return ({ value: updateSortState(initialSortState, curr), timestamp: Date.now() });
397
- return ({ value: updateSortState(prev.value.value, curr), timestamp: Date.now() });
398
- }
399
- });
400
-
401
- private $allData = computed(() => (this.$tableBuilder()?.$initialized() && this.$tableBuilder()?.$data()) || [])
402
- private $allDataTimeStamped = computed(() => {
403
- const data = this.$allData();
404
- if(!data) return undefined;
405
- return ({
406
- value: data,
407
- timestamp: Date.now()
408
- })
409
- });
410
- private $allTimeStamped = computed(() => {
411
- const data = this.$allDataTimeStamped();
412
- const sort = this.$sortStateTimeStamped();
413
- const filter = this.$allFilterStatesTimeStamped();
414
- if(!data?.value || !sort?.value || !filter?.value) return undefined;
415
- return ({
416
- data,
417
- sort,
418
- filter
419
- });
420
- });
421
- private $sortedAndFilteredData = linkedSignal<{data: Timestamp<T[]>, filter: Timestamp<FilterPredicateState<T>>, sort: Timestamp<SortState>} | undefined, Timestamp<T[]> | undefined>({
422
- source: this.$allTimeStamped,
423
- computation: (values, prev) => {
424
- const init = this.$isInitializationState(InitializationState.Ready);
425
- if(!values || !init) return undefined;
426
- const { data, filter, sort } = values;
427
- const val = prev?.value?.value || data.value;
428
- const filteredData = sortAndFilterData(data, filter, sort, !prev?.value, val);
429
- return ({ value: filteredData, timestamp: Date.now() });
430
- }
431
- });
432
-
433
- $timestampedGroups = computed(() => ({ value: this.state.$groupByData(), timestamp: Date.now() }));
434
- $timestampedExpanded = computed(() => ({ value: this.state.$expandGroups(), timestamp: Date.now() }));
435
- $timestampedGroupSortUpdated = computed(() => ({ value: this.state.$sortedGroupsUpdates(), timestamp: Date.now() }))
436
- private $dataAndGroupsTimestamped = computed(() => {
437
- const data = this.$sortedAndFilteredData() as Timestamp<(T & NoneGroupHeader)[]>;
438
- const groups = this.$timestampedGroups();
439
- const expanded = this.$timestampedExpanded();
440
- const groupSorts = this.$timestampedGroupSortUpdated();
441
- if(!data) return undefined;
442
- return ({
443
- data,
444
- groups,
445
- expanded,
446
- groupSorts,
447
- })});
448
-
449
- protected $filteredSortedAndGrouped = linkedSignal<{ data: Timestamp<(T & NoneGroupHeader)[]>, groups: Timestamp<GroupedData[]>, expanded: Timestamp<GroupedData[]>, groupSorts: Timestamp<GroupedData[]>} | undefined, GroupByState | undefined>({
450
- source: this.$dataAndGroupsTimestamped,
451
- computation: (curr, prev) => {
452
- if(!curr) return undefined;
453
- const val = prev?.value?.groupedData || [];
454
- return updateGroupByState(val, curr, !prev?.value, this.state.$metaData());
455
- }
456
- });
457
-
458
- private $isInitializationState = (state: InitializationState) => computed(() =>
459
- this.state.selectSignal(s => s.initializationState >= state)()) ;
460
-
461
- static headerId = 'tb-header-wrapper';
462
- headerId = TableContainerComponent.headerId;
463
- }
464
-
465
- function isFunction<T>(a: any):a is Predicate<T> {
466
- return typeof a === 'function';
467
- }
@@ -1,113 +0,0 @@
1
- import { Observable, Timestamp, combineLatest, map, scan, tap, timestamp } from "rxjs";
2
- import { SortState } from "./sort-state.helpers";
3
- import { FilterPredicateState } from "./filter-state.helpers";
4
- import { filterData, getFactory, sortData, tbNoShowSymbol } from "../../../functions/sort-data-function";
5
- import { defaultShareReplay } from "../../../../rxjs/defaultShareReplay";
6
- import { FieldType, MetaData } from "../../../interfaces/meta-data";
7
- import { 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(
14
- scan((mappedData, [data, sort, f], index) => {
15
- return mapDataSortsAndFilters( data, f, sort, index === 0, mappedData);
16
- }, [] as T[])
17
- ).pipe(
18
- map((resultData) => resultData.filter(item => !item[tbNoShowSymbol])),
19
- defaultShareReplay()
20
- );
21
-
22
- const mapDataSortsAndFilters = <T>(allData: Timestamp<T[]>, filters: Timestamp<FilterPredicateState<T>>, sort: Timestamp<SortState>, firstRun: boolean, filteredAndSortedData: T[]) => {
23
- const fresh = firstRun || (allData.timestamp > sort.timestamp && allData.timestamp > filters.timestamp);
24
- const sortChanged = !fresh && sort.timestamp > filters.timestamp;
25
- const filterRemoved = !fresh && !sortChanged && !filters.value.onlyAddedFilters;
26
- const runAllOnAllData = fresh || filterRemoved;
27
- const resetFilters = !fresh && filterRemoved;
28
-
29
- if(runAllOnAllData){
30
- const filteredData = filterData(sortData(allData.value, sort.value.allSorts ), filters.value.allFilters, resetFilters);
31
- return filteredData;
32
- }
33
- if(sortChanged){
34
- return (sortData(filteredAndSortedData, sort.value.sortsToRun));
35
- }
36
- return (filterData(filteredAndSortedData, filters.value.onlyAddedFilters || filters.value.allFilters, resetFilters));
37
- }
38
-
39
- export const sortAndFilterData = <T>(data: Timestamp<T[]>, filters: Timestamp<FilterPredicateState<T>>, sort: Timestamp<SortState>, firstRun: boolean, resultData: T[]) => {
40
- const markedAndSortedData = mapDataSortsAndFilters( data, filters, sort, firstRun, resultData);
41
- const filteredData = markedAndSortedData.filter(item => !item[tbNoShowSymbol]);
42
- return filteredData;
43
- }
44
- export const createDataCleaners = <T>(metadatas: MetaData<T>[], mutate = false) => {
45
- const transforms = createCleaners(metadatas);
46
- return (data: T) => {
47
- if(!mutate){
48
- data = { ...data }
49
- }
50
- for(const transform of transforms){
51
- transform(data);
52
- }
53
- return data;
54
- }
55
- }
56
-
57
- const createCleaners = <T>(metadatas: MetaData<T> []) => {
58
- return metadatas.reduce((transforms, metaData) => {
59
- const getter = getFactory(metaData.key);
60
- const setter = metaData.key.includes('.') ? (t, val) => set(t, metaData.key, val) : (t, val) => t[metaData.key as unknown as keyof T] = val
61
- switch ( metaData.fieldType ) {
62
- case FieldType.Currency:
63
- case FieldType.Number: {
64
- const transform = (t:T) => {
65
- const val = getter(t);
66
- const num = Number( val );
67
- setter(t, isNaN(num) || val == null ? null : num)
68
- };
69
- transforms.push(transform);
70
- break;
71
- }
72
- case FieldType.Date: {
73
- const transform = (t:T) => {
74
- const val = getter(t);
75
- const date = Date.parse(val);
76
- let mappedDate: Date;
77
- if(isNaN(date)){
78
- mappedDate = null as any;
79
- } else {
80
- mappedDate = new Date(date);
81
- mappedDate.setHours(0, 0, 0, 0);
82
- }
83
- setter(t, mappedDate);
84
- };
85
- transforms.push(transform);
86
- break;
87
- }
88
-
89
- case FieldType.DateTime: {
90
- const transform = (t:T) => {
91
- const val = getter(t);
92
- const date = Date.parse(val);
93
- let mappedDate: Date;
94
- if(isNaN(date)){
95
- mappedDate = null as any;
96
- } else {
97
- mappedDate = new Date(date);
98
- if(!metaData.additional?.dateTimeOptions?.includeMilliseconds){
99
- if(metaData.additional?.dateTimeOptions?.includeSeconds){
100
- mappedDate.setMilliseconds(0);
101
- } else {
102
- mappedDate.setSeconds(0, 0);
103
- }
104
- }
105
- }
106
- setter(t, mappedDate);
107
- };
108
- transforms.push(transform);
109
- }
110
- }
111
- return transforms;
112
- }, [] as ((t:T) => void)[])
113
- }