@one-paragon/angular-utilities 2.8.2 → 2.8.4

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/karma.conf.js +43 -0
  2. package/ng-package.json +7 -0
  3. package/package.json +15 -27
  4. package/src/action-state/action-state-spinner/action-state-spinner.component.css +16 -0
  5. package/src/action-state/action-state-spinner/action-state-spinner.component.html +7 -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/src/action-state/index.ts +8 -0
  10. package/src/action-state/ngrx-ext/ngrx-ext.module.ts +14 -0
  11. package/src/action-state/ngrx.ts +69 -0
  12. package/src/http-request-state/RequestStateFactory.ts +56 -0
  13. package/src/http-request-state/RequestStateStore.ts +360 -0
  14. package/src/http-request-state/deprecated.ts +20 -0
  15. package/src/http-request-state/directives/HttpStateDirectiveBase.ts +29 -0
  16. package/src/http-request-state/directives/http-error-state-directive.ts +21 -0
  17. package/src/http-request-state/directives/http-inProgress-state-directive.ts +19 -0
  18. package/src/http-request-state/directives/http-notStarted-state-directive.ts +19 -0
  19. package/src/http-request-state/directives/http-success-state-directive.ts +29 -0
  20. package/src/http-request-state/directives/index.ts +5 -0
  21. package/src/http-request-state/directives/request-state-directive.spec.ts +73 -0
  22. package/src/http-request-state/directives/request-state-directive.ts +78 -0
  23. package/src/http-request-state/documentation/CREATE-REQUESTOR.md +667 -0
  24. package/src/http-request-state/documentation/README.md +191 -0
  25. package/src/http-request-state/documentation/REQUEST-STATE-STORE-CONFIG.md +648 -0
  26. package/src/http-request-state/documentation/REQUESTOR.md +616 -0
  27. package/src/http-request-state/helpers.ts +30 -0
  28. package/src/http-request-state/http-state-module.ts +23 -0
  29. package/src/http-request-state/index.ts +7 -0
  30. package/src/http-request-state/models/view-context.ts +18 -0
  31. package/src/http-request-state/observable.spec.ts +43 -0
  32. package/src/http-request-state/request-state.ts +66 -0
  33. package/src/http-request-state/rxjs/getRequestorBody.ts +10 -0
  34. package/src/http-request-state/rxjs/getRequestorState.ts +8 -0
  35. package/src/http-request-state/rxjs/index.ts +4 -0
  36. package/src/http-request-state/rxjs/tapError.ts +16 -0
  37. package/src/http-request-state/rxjs/tapSuccess.ts +16 -0
  38. package/src/http-request-state/strategies.spec.ts +42 -0
  39. package/src/http-request-state/types.ts +54 -0
  40. package/src/ngrx/actionable-selector.ts +189 -0
  41. package/src/ngrx/index.ts +1 -0
  42. package/src/public-api.ts +40 -0
  43. package/src/rxjs/defaultShareReplay.ts +8 -0
  44. package/src/rxjs/index.ts +5 -0
  45. package/src/rxjs/mapError.ts +8 -0
  46. package/src/rxjs/rxjs-operators.ts +130 -0
  47. package/src/rxjs/subjectifier.ts +17 -0
  48. package/src/rxjs/subscriber.directive.ts +57 -0
  49. package/src/specs/clickSubject.spec.ts +99 -0
  50. package/src/specs/dialog.spec.ts +101 -0
  51. package/src/specs/toggleGroupDirective.spec.ts +229 -0
  52. package/src/table-builder/classes/DefaultSettings.ts +11 -0
  53. package/src/table-builder/classes/MatTableObservableDataSource.ts +23 -0
  54. package/src/table-builder/classes/TableBuilderConfig.ts +49 -0
  55. package/src/table-builder/classes/TableBuilderDataSource.ts +64 -0
  56. package/src/table-builder/classes/TableState.ts +96 -0
  57. package/src/table-builder/classes/data-store.ts +10 -0
  58. package/src/table-builder/classes/display-col.ts +5 -0
  59. package/src/table-builder/classes/filter-info.ts +129 -0
  60. package/src/table-builder/classes/table-builder-general-settings.ts +233 -0
  61. package/src/table-builder/classes/table-builder.ts +105 -0
  62. package/src/table-builder/classes/table-store.helpers.ts +109 -0
  63. package/src/table-builder/classes/table-store.ts +540 -0
  64. package/src/table-builder/components/array-column.component.ts +34 -0
  65. package/src/table-builder/components/column-builder/column-builder.component.html +109 -0
  66. package/src/table-builder/components/column-builder/column-builder.component.scss +43 -0
  67. package/src/table-builder/components/column-builder/column-builder.component.spec.ts +49 -0
  68. package/src/table-builder/components/column-builder/column-builder.component.ts +130 -0
  69. package/src/table-builder/components/column-builder/column-helpers.ts +54 -0
  70. package/src/table-builder/components/column-header-menu/column-header-menu.component.html +128 -0
  71. package/src/table-builder/components/column-header-menu/column-header-menu.component.scss +97 -0
  72. package/src/table-builder/components/column-header-menu/column-header-menu.component.ts +113 -0
  73. package/src/table-builder/components/date-filter/date-filter.component.html +39 -0
  74. package/src/table-builder/components/date-filter/date-filter.component.ts +33 -0
  75. package/src/table-builder/components/date-time-filter/date-time-filter.component.html +25 -0
  76. package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +33 -0
  77. package/src/table-builder/components/filter/filter.component.html +120 -0
  78. package/src/table-builder/components/filter/filter.component.scss +60 -0
  79. package/src/table-builder/components/filter/filter.component.spec.ts +86 -0
  80. package/src/table-builder/components/filter/filter.component.ts +73 -0
  81. package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +171 -0
  82. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +60 -0
  83. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +57 -0
  84. package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +44 -0
  85. package/src/table-builder/components/generic-table/generic-table.component.html +140 -0
  86. package/src/table-builder/components/generic-table/generic-table.component.scss +45 -0
  87. package/src/table-builder/components/generic-table/generic-table.component.ts +531 -0
  88. package/src/table-builder/components/generic-table/paginator.component.ts +125 -0
  89. package/src/table-builder/components/group-by-list/group-by-list.component.css +24 -0
  90. package/src/table-builder/components/group-by-list/group-by-list.component.html +21 -0
  91. package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +23 -0
  92. package/src/table-builder/components/group-by-list/group-by-list.component.ts +26 -0
  93. package/src/table-builder/components/in-filter/in-filter.component.css +22 -0
  94. package/src/table-builder/components/in-filter/in-filter.component.html +38 -0
  95. package/src/table-builder/components/in-filter/in-filter.component.ts +66 -0
  96. package/src/table-builder/components/index.ts +9 -0
  97. package/src/table-builder/components/initialization-component/initialization.component.html +78 -0
  98. package/src/table-builder/components/initialization-component/initialization.component.ts +28 -0
  99. package/src/table-builder/components/link-column.component.ts +42 -0
  100. package/src/table-builder/components/number-filter/number-filter.component.css +10 -0
  101. package/src/table-builder/components/number-filter/number-filter.component.html +32 -0
  102. package/src/table-builder/components/number-filter/number-filter.component.spec.ts +30 -0
  103. package/src/table-builder/components/number-filter/number-filter.component.ts +34 -0
  104. package/src/table-builder/components/profiles-menu/profiles-menu.component.html +77 -0
  105. package/src/table-builder/components/profiles-menu/profiles-menu.component.scss +126 -0
  106. package/src/table-builder/components/profiles-menu/profiles-menu.component.spec.ts +23 -0
  107. package/src/table-builder/components/profiles-menu/profiles-menu.component.ts +64 -0
  108. package/src/table-builder/components/reset-menu/reset-menu.component.css +3 -0
  109. package/src/table-builder/components/reset-menu/reset-menu.component.html +10 -0
  110. package/src/table-builder/components/reset-menu/reset-menu.component.ts +87 -0
  111. package/src/table-builder/components/scroll-strategy.ts +139 -0
  112. package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +57 -0
  113. package/src/table-builder/components/sort-menu/sort-menu.component.html +115 -0
  114. package/src/table-builder/components/sort-menu/sort-menu.component.scss +119 -0
  115. package/src/table-builder/components/sort-menu/sort-menu.component.ts +88 -0
  116. package/src/table-builder/components/table-container/table-container.component.html +94 -0
  117. package/src/table-builder/components/table-container/table-container.component.scss +60 -0
  118. package/src/table-builder/components/table-container/table-container.component.ts +467 -0
  119. package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +113 -0
  120. package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +125 -0
  121. package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +172 -0
  122. package/src/table-builder/components/table-container/table-container.helpers/meta-data.helpers.ts +19 -0
  123. package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +47 -0
  124. package/src/table-builder/components/table-container/tableProps.ts +21 -0
  125. package/src/table-builder/components/table-container/virtual-scroll-container.ts +216 -0
  126. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +42 -0
  127. package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +47 -0
  128. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +40 -0
  129. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +11 -0
  130. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +85 -0
  131. package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +35 -0
  132. package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +13 -0
  133. package/src/table-builder/components/table-header-menu/table-header-menu.component.css +21 -0
  134. package/src/table-builder/components/table-header-menu/table-header-menu.component.html +48 -0
  135. package/src/table-builder/components/table-header-menu/table-header-menu.component.ts +36 -0
  136. package/src/table-builder/directives/custom-cell-directive.ts +63 -0
  137. package/src/table-builder/directives/custom-header-directive.ts +16 -0
  138. package/src/table-builder/directives/group-row-directive.ts +91 -0
  139. package/src/table-builder/directives/index.ts +8 -0
  140. package/src/table-builder/directives/multi-sort.directive.spec.ts +124 -0
  141. package/src/table-builder/directives/multi-sort.directive.ts +58 -0
  142. package/src/table-builder/directives/resize-column.directive.ts +107 -0
  143. package/src/table-builder/directives/table-wrapper.directive.ts +13 -0
  144. package/src/table-builder/directives/tb-filter.directive.ts +376 -0
  145. package/src/table-builder/documentation/table-builder/CUSTOM-CELL.md +568 -0
  146. package/src/table-builder/documentation/table-builder/CUSTOM-GROUP-ROW.md +356 -0
  147. package/src/table-builder/documentation/table-builder/METADATA-DOCUMENTATION.md +517 -0
  148. package/src/table-builder/documentation/table-builder/STYLER-STYLE.md +228 -0
  149. package/src/table-builder/documentation/table-builder/TABLE-BUILDER-CONFIG.md +325 -0
  150. package/src/table-builder/documentation/table-builder/TABLE-BUILDER-SETTINGS.md +515 -0
  151. package/src/table-builder/documentation/table-builder/TABLE-BUILDER.md +430 -0
  152. package/src/table-builder/documentation/table-builder/TABLE-CONTAINER.md +628 -0
  153. package/src/table-builder/enums/filterTypes.ts +39 -0
  154. package/src/table-builder/functions/boolean-filter-function.ts +12 -0
  155. package/src/table-builder/functions/date-filter-function.ts +85 -0
  156. package/src/table-builder/functions/download-data.ts +11 -0
  157. package/src/table-builder/functions/null-filter-function.ts +9 -0
  158. package/src/table-builder/functions/number-filter-function.ts +47 -0
  159. package/src/table-builder/functions/sort-data-function.ts +80 -0
  160. package/src/table-builder/functions/string-filter-function.ts +59 -0
  161. package/src/table-builder/interfaces/ColumnInfo.ts +9 -0
  162. package/src/table-builder/interfaces/dictionary.ts +3 -0
  163. package/src/table-builder/interfaces/meta-data.ts +279 -0
  164. package/src/table-builder/ngrx/tableBuilderStateStore.ts +203 -0
  165. package/src/table-builder/pipes/column-total.pipe.ts +16 -0
  166. package/src/table-builder/pipes/format-filter-type.pipe.ts +12 -0
  167. package/src/table-builder/pipes/format-filter-value.pipe.ts +71 -0
  168. package/src/table-builder/pipes/key-display.ts +13 -0
  169. package/src/table-builder/services/all-values-filter-creator.service.ts +92 -0
  170. package/src/table-builder/services/export-to-csv.service.ts +117 -0
  171. package/src/table-builder/services/link-creator.service.ts +98 -0
  172. package/src/table-builder/services/table-template-service.ts +47 -0
  173. package/src/table-builder/services/transform-creator.ts +90 -0
  174. package/src/table-builder/specs/table-custom-filters.spec.ts +262 -0
  175. package/src/table-builder/styles/collapser.styles.scss +16 -0
  176. package/src/table-builder/table-builder.module.ts +42 -0
  177. package/src/table-builder/types/group-types.ts +42 -0
  178. package/src/table-builder/types/index.ts +1 -0
  179. package/src/test.ts +17 -0
  180. package/src/utilities/array-helpers.ts +13 -0
  181. package/src/utilities/directives/auto-focus.directive.ts +20 -0
  182. package/src/utilities/directives/clickEmitterDirective.ts +15 -0
  183. package/src/utilities/directives/clickSubject.ts +19 -0
  184. package/src/utilities/directives/conditional-classes.directive.ts +36 -0
  185. package/src/utilities/directives/dialog-service.ts +19 -0
  186. package/src/utilities/directives/dialog.ts +174 -0
  187. package/src/utilities/directives/mat-toggle-group-directive.ts +60 -0
  188. package/src/utilities/directives/prevent-enter.directive.ts +12 -0
  189. package/src/utilities/directives/stop-propagation.directive.ts +19 -0
  190. package/src/utilities/directives/styler.ts +45 -0
  191. package/src/utilities/directives/trim-whitespace.directive.ts +20 -0
  192. package/src/utilities/index.ts +22 -0
  193. package/src/utilities/module.ts +53 -0
  194. package/src/utilities/pipes/function.pipe.ts +21 -0
  195. package/src/utilities/pipes/phone.pipe.ts +20 -0
  196. package/src/utilities/pipes/space-case.pipes.spec.ts +47 -0
  197. package/src/utilities/pipes/space-case.pipes.ts +29 -0
  198. package/tsconfig.lib.json +20 -0
  199. package/tsconfig.lib.prod.json +10 -0
  200. package/tsconfig.spec.json +17 -0
  201. package/fesm2022/one-paragon-angular-utilities.mjs +0 -7328
  202. package/fesm2022/one-paragon-angular-utilities.mjs.map +0 -1
  203. package/types/one-paragon-angular-utilities.d.ts +0 -2197
@@ -0,0 +1,628 @@
1
+ # Table Container Component Documentation
2
+
3
+ ## Overview
4
+
5
+ `tb-table-container` is the main component for rendering data tables with the Table Builder system. It provides a feature-rich table with built-in support for sorting, filtering, grouping, pagination, column customization, virtual scrolling, row selection, and CSV export.
6
+
7
+ ## Basic Usage
8
+
9
+ ```typescript
10
+ import { Component } from '@angular/core';
11
+ import { TableBuilder } from 'angular-utilities';
12
+ import { TableContainerComponent } from 'angular-utilities';
13
+
14
+ @Component({
15
+ selector: 'app-my-table',
16
+ standalone: true,
17
+ imports: [TableContainerComponent],
18
+ template: `
19
+ <tb-table-container [tableBuilder]="tableBuilder" />
20
+ `
21
+ })
22
+ export class MyTableComponent {
23
+ data = [
24
+ { id: 1, name: 'John Doe', email: 'john@example.com' },
25
+ { id: 2, name: 'Jane Smith', email: 'jane@example.com' }
26
+ ];
27
+
28
+ tableBuilder = new TableBuilder(this.data);
29
+ }
30
+ ```
31
+
32
+ ## Inputs
33
+
34
+ ### Required Inputs
35
+
36
+ #### `tableBuilder`
37
+ - **Type**: `TableBuilder<T>`
38
+ - **Required**: Yes
39
+ - **Description**: The TableBuilder instance that defines the data, columns, and settings for the table.
40
+ - **Related Documentation**: See [MetaData Documentation](METADATA-DOCUMENTATION.md) for column configuration and [TableBuilder Settings](TABLE-BUILDER-SETTINGS.md) for table behavior configuration.
41
+
42
+ **Example:**
43
+ ```typescript
44
+ import { TableBuilder } from 'angular-utilities';
45
+ import { FieldType } from 'angular-utilities';
46
+
47
+ const metaData = [
48
+ { key: 'id', fieldType: FieldType.Number, displayName: 'ID' },
49
+ { key: 'name', fieldType: FieldType.String, displayName: 'Name' },
50
+ { key: 'email', fieldType: FieldType.String, displayName: 'Email' }
51
+ ];
52
+
53
+ const tableBuilder = new TableBuilder(data, metaData);
54
+ ```
55
+
56
+ ### Optional Inputs
57
+
58
+ #### `tableId`
59
+ - **Type**: `string | undefined`
60
+ - **Default**: `undefined`
61
+ - **Description**: Unique identifier for the table. When provided, the table state (sorting, filtering, column order, etc.) is automatically persisted to local storage and restored on component initialization. Can also be configured via `TableBuilderSettings.tableSettings.tableId` in the TableBuilder constructor. See [TableBuilder Settings - tableId](TABLE-BUILDER-SETTINGS.md#tableid).
62
+
63
+ **Example (via input):**
64
+ ```html
65
+ <tb-table-container
66
+ [tableBuilder]="tableBuilder"
67
+ tableId="users-table" />
68
+ ```
69
+
70
+ **Example (via TableBuilder settings):**
71
+ ```typescript
72
+ const settings = {
73
+ tableSettings: {
74
+ tableId: 'users-table'
75
+ }
76
+ };
77
+ const tableBuilder = new TableBuilder(data, metaData, settings);
78
+ ```
79
+
80
+ #### `trackBy`
81
+ - **Type**: `string | undefined`
82
+ - **Default**: `undefined`
83
+ - **Description**: Property name to use for Angular's trackBy function in the table rows. Improves performance by helping Angular identify which items have changed. Can also be configured via `TableBuilderSettings.tableSettings.trackBy` in the TableBuilder constructor. See [TableBuilder Settings - trackBy](TABLE-BUILDER-SETTINGS.md#trackby).
84
+
85
+ **Example (via input):**
86
+ ```html
87
+ <tb-table-container
88
+ [tableBuilder]="tableBuilder"
89
+ trackBy="id" />
90
+ ```
91
+
92
+ **Example (via TableBuilder settings):**
93
+ ```typescript
94
+ const settings = {
95
+ tableSettings: {
96
+ trackBy: 'id'
97
+ }
98
+ };
99
+ const tableBuilder = new TableBuilder(data, metaData, settings);
100
+ ```
101
+
102
+ #### `inputFilters`
103
+ - **Type**: `(Predicate<T> | CustomFilter<T> | FilterInfo<any, T>)[]`
104
+ - **Default**: `[]`
105
+ - **Description**: Array of filters to apply to the table data. Supports three types:
106
+ - **Predicate**: Simple function `(row: T) => boolean`
107
+ - **CustomFilter**: Object with `{ filterId: string, predicate: (row: T) => boolean }` - saved to state when `filterId` is provided
108
+ - **FilterInfo**: Full filter configuration object with UI and persistence support
109
+
110
+ **Example:**
111
+ ```typescript
112
+ // Simple predicate filter
113
+ const activeOnly = (user: User) => user.isActive;
114
+
115
+ // Custom filter with ID (persisted)
116
+ const customFilter = {
117
+ filterId: 'active-filter',
118
+ predicate: (user: User) => user.isActive
119
+ };
120
+
121
+ // FilterInfo with full configuration
122
+ const filterInfo = {
123
+ filterId: 'status-filter',
124
+ key: 'status',
125
+ type: FilterType.Equals,
126
+ value: 'active'
127
+ };
128
+ ```
129
+
130
+ ```html
131
+ <tb-table-container
132
+ [tableBuilder]="tableBuilder"
133
+ [inputFilters]="[activeOnly, customFilter]" />
134
+ ```
135
+
136
+ #### `indexColumn`
137
+ - **Type**: `boolean`
138
+ - **Default**: `false`
139
+ - **Description**: Adds an index column as the first column, displaying row numbers starting from 1. Can also be configured via `TableBuilderSettings.tableSettings.includeIndexColumn` in the TableBuilder constructor. See [TableBuilder Settings - includeIndexColumn](TABLE-BUILDER-SETTINGS.md#includeindexcolumn).
140
+
141
+ **Example (via input):**
142
+ ```html
143
+ <tb-table-container
144
+ [tableBuilder]="tableBuilder"
145
+ [indexColumn]="true" />
146
+ ```
147
+
148
+ **Example (via TableBuilder settings):**
149
+ ```typescript
150
+ const settings = {
151
+ tableSettings: {
152
+ includeIndexColumn: true
153
+ }
154
+ };
155
+ const tableBuilder = new TableBuilder(data, metaData, settings);
156
+ ```
157
+
158
+ #### `selectionColumn`
159
+ - **Type**: `boolean`
160
+ - **Default**: `false`
161
+ - **Description**: Adds a checkbox column for row selection. Listen to the `selection` output to receive selection changes. Can also be configured via `TableBuilderSettings.tableSettings.includeSelectionColumn` in the TableBuilder constructor. See [TableBuilder Settings - includeSelectionColumn](TABLE-BUILDER-SETTINGS.md#includeselectioncolumn).
162
+
163
+ **Example (via input):**
164
+ ```html
165
+ <tb-table-container
166
+ [tableBuilder]="tableBuilder"
167
+ [selectionColumn]="true"
168
+ (selection)="onSelectionChange($event)" />
169
+ ```
170
+
171
+ **Example (via TableBuilder settings):**
172
+ ```typescript
173
+ const settings = {
174
+ tableSettings: {
175
+ includeSelectionColumn: true
176
+ }
177
+ };
178
+ const tableBuilder = new TableBuilder(data, metaData, settings);
179
+ ```
180
+
181
+ #### `stickyHeader`
182
+ - **Type**: `boolean`
183
+ - **Default**: `true`
184
+ - **Description**: Makes the table header sticky (fixed at the top when scrolling). Can also be configured via `TableBuilderSettings.columnHeaderSettings.stickyHeaderRow` in the TableBuilder constructor. See [TableBuilder Settings - stickyHeaderRow](TABLE-BUILDER-SETTINGS.md#stickyheaderrow).
185
+
186
+ **Example (via input):**
187
+ ```html
188
+ <tb-table-container
189
+ [tableBuilder]="tableBuilder"
190
+ [stickyHeader]="false" />
191
+ ```
192
+
193
+ **Example (via TableBuilder settings):**
194
+ ```typescript
195
+ const settings = {
196
+ columnHeaderSettings: {
197
+ stickyHeaderRow: false
198
+ }
199
+ };
200
+ const tableBuilder = new TableBuilder(data, metaData, settings);
201
+ ```
202
+
203
+ #### `stickyFooter`
204
+ - **Type**: `boolean`
205
+ - **Default**: `false`
206
+ - **Description**: Makes the table footer sticky (fixed at the bottom when scrolling). Can also be configured via `TableBuilderSettings.columnFooterSettings.stickyFooterRow` in the TableBuilder constructor. See [TableBuilder Settings - stickyFooterRow](TABLE-BUILDER-SETTINGS.md#stickyfooterrow).
207
+
208
+ **Example (via input):**
209
+ ```html
210
+ <tb-table-container
211
+ [tableBuilder]="tableBuilder"
212
+ [stickyFooter]="true" />
213
+ ```
214
+
215
+ **Example (via TableBuilder settings):**
216
+ ```typescript
217
+ const settings = {
218
+ columnFooterSettings: {
219
+ stickyFooterRow: true
220
+ }
221
+ };
222
+ const tableBuilder = new TableBuilder(data, metaData, settings);
223
+ ```
224
+
225
+ #### `groupHeaderTemplate`
226
+ - **Type**: `TemplateRef<any> | undefined`
227
+ - **Default**: `undefined`
228
+ - **Description**: Custom template for rendering group headers when data is grouped. The template receives the group context with information about the group.
229
+
230
+ **Example:**
231
+ ```typescript
232
+ @Component({
233
+ template: `
234
+ <tb-table-container
235
+ [tableBuilder]="tableBuilder"
236
+ [groupHeaderTemplate]="customGroupHeader" />
237
+
238
+ <ng-template #customGroupHeader let-group>
239
+ <div class="custom-group-header">
240
+ {{ group.key }}: {{ group.count }} items
241
+ </div>
242
+ </ng-template>
243
+ `
244
+ })
245
+ ```
246
+
247
+ #### `groupHeaderHeight`
248
+ - **Type**: `number | undefined`
249
+ - **Default**: `undefined`
250
+ - **Description**: Height in pixels for group header rows. Used for virtual scrolling calculations when grouping is enabled.
251
+
252
+ **Example:**
253
+ ```html
254
+ <tb-table-container
255
+ [tableBuilder]="tableBuilder"
256
+ [groupHeaderHeight]="48" />
257
+ ```
258
+
259
+ #### `pageSize`
260
+ - **Type**: `number | undefined`
261
+ - **Default**: `undefined`
262
+ - **Description**: Initial page size for pagination. This will be overridden if the user has already set a page size (which is persisted in state). Can also be configured via `TableBuilderSettings.tableSettings.paginatorSettings.pageSize` in the TableBuilder constructor. See [TableBuilder Settings - paginatorSettings](TABLE-BUILDER-SETTINGS.md#paginatorsettings) for configuring pagination behavior.
263
+
264
+ **Example (via input):**
265
+ ```html
266
+ <tb-table-container
267
+ [tableBuilder]="tableBuilder"
268
+ [pageSize]="25" />
269
+ ```
270
+
271
+ **Example (via TableBuilder settings):**
272
+ ```typescript
273
+ const settings = {
274
+ tableSettings: {
275
+ paginatorSettings: {
276
+ pageSize: 25
277
+ }
278
+ }
279
+ };
280
+ const tableBuilder = new TableBuilder(data, metaData, settings);
281
+ ```
282
+
283
+ ## Outputs
284
+
285
+ #### `selection`
286
+ - **Type**: `SelectionChange<T>`
287
+ - **Description**: Emits when row selection changes. Only emits when `selectionColumn` is enabled. The event contains `added` and `removed` arrays of selected rows.
288
+
289
+ **Example:**
290
+ ```typescript
291
+ onSelectionChange(event: SelectionChange<User>) {
292
+ console.log('Added:', event.added);
293
+ console.log('Removed:', event.removed);
294
+ console.log('Current selection:', event.source.selected);
295
+ }
296
+ ```
297
+
298
+ ```html
299
+ <tb-table-container
300
+ [tableBuilder]="tableBuilder"
301
+ [selectionColumn]="true"
302
+ (selection)="onSelectionChange($event)" />
303
+ ```
304
+
305
+ #### `onStateReset`
306
+ - **Type**: `null`
307
+ - **Description**: Emits when the table state is reset to defaults. This happens when the user clicks the reset button in the table header menu.
308
+
309
+ **Example:**
310
+ ```typescript
311
+ onStateReset() {
312
+ console.log('Table state has been reset');
313
+ }
314
+ ```
315
+
316
+ ```html
317
+ <tb-table-container
318
+ [tableBuilder]="tableBuilder"
319
+ (onStateReset)="onStateReset()" />
320
+ ```
321
+
322
+ #### `onSaveState`
323
+ - **Type**: `null`
324
+ - **Description**: Emits when the table state is manually saved. This happens when the user clicks the save button in the table header menu.
325
+
326
+ **Example:**
327
+ ```typescript
328
+ onSaveState() {
329
+ console.log('Table state has been saved');
330
+ }
331
+ ```
332
+
333
+ ```html
334
+ <tb-table-container
335
+ [tableBuilder]="tableBuilder"
336
+ (onSaveState)="onSaveState()" />
337
+ ```
338
+
339
+ #### `state`
340
+ - **Type**: `PersistedTableState`
341
+ - **Description**: Emits whenever the savable table state changes. The state includes sorting, filtering, column visibility, column order, grouping, and pagination settings. Useful for manually persisting state to a backend.
342
+
343
+ **Example:**
344
+ ```typescript
345
+ onStateChange(state: PersistedTableState) {
346
+ // Save to backend
347
+ this.tableService.saveTableState(state);
348
+ }
349
+ ```
350
+
351
+ ```html
352
+ <tb-table-container
353
+ [tableBuilder]="tableBuilder"
354
+ (state)="onStateChange($event)" />
355
+ ```
356
+
357
+ #### `data`
358
+ - **Type**: `T[]`
359
+ - **Description**: Emits the current sorted and filtered data (without grouping applied). Updates whenever sorting or filtering changes.
360
+
361
+ **Example:**
362
+ ```typescript
363
+ onDataChange(data: User[]) {
364
+ console.log('Filtered/sorted data:', data);
365
+ }
366
+ ```
367
+
368
+ ```html
369
+ <tb-table-container
370
+ [tableBuilder]="tableBuilder"
371
+ (data)="onDataChange($event)" />
372
+ ```
373
+
374
+ #### `sortedAndFilteredAndGroupedData`
375
+ - **Type**: `(T | GroupHeader)[]`
376
+ - **Description**: Emits the current sorted, filtered, and grouped data including group header rows. This is the actual data displayed in the table. Updates whenever sorting, filtering, or grouping changes.
377
+
378
+ **Example:**
379
+ ```typescript
380
+ onDisplayDataChange(data: (User | GroupHeader)[]) {
381
+ console.log('Display data with groups:', data);
382
+ }
383
+ ```
384
+
385
+ ```html
386
+ <tb-table-container
387
+ [tableBuilder]="tableBuilder"
388
+ (sortedAndFilteredAndGroupedData)="onDisplayDataChange($event)" />
389
+ ```
390
+
391
+ ## Public Methods
392
+
393
+ The component exposes several public methods that can be called via template reference or ViewChild:
394
+
395
+ ### `clearSelections()`
396
+ Clears all selected rows.
397
+
398
+ **Example:**
399
+ ```typescript
400
+ @ViewChild(TableContainerComponent) table!: TableContainerComponent;
401
+
402
+ clearAll() {
403
+ this.table.clearSelections();
404
+ }
405
+ ```
406
+
407
+ ### `firstPage()`
408
+ Navigates to the first page of the table.
409
+
410
+ ### `lastPage()`
411
+ Navigates to the last page of the table.
412
+
413
+ ### `expandAllGroups()`
414
+ Expands all group headers when grouping is applied.
415
+
416
+ ### `expandAllOfGroup(groupKey: string)`
417
+ Expands all headers for a specific group key.
418
+
419
+ **Example:**
420
+ ```typescript
421
+ expandDepartmentGroups() {
422
+ this.table.expandAllOfGroup('department');
423
+ }
424
+ ```
425
+
426
+ ### `collapseAllGroups()`
427
+ Collapses all group headers.
428
+
429
+ ### `exportToCsv()`
430
+ Exports the current filtered and sorted data to CSV format and triggers a download.
431
+
432
+ **Example:**
433
+ ```typescript
434
+ @Component({
435
+ template: `
436
+ <tb-table-container
437
+ #table
438
+ [tableBuilder]="tableBuilder" />
439
+
440
+ <button (click)="table.exportToCsv()">
441
+ Export to CSV
442
+ </button>
443
+ `
444
+ })
445
+ ```
446
+
447
+ ## Content Projection
448
+
449
+ The component supports content projection for advanced customization:
450
+
451
+ ### Custom Cell Templates
452
+
453
+ Use `CustomCellDirective` to provide custom rendering for specific columns:
454
+
455
+ ```typescript
456
+ import { CustomCellDirective } from 'angular-utilities';
457
+
458
+ @Component({
459
+ template: `
460
+ <tb-table-container [tableBuilder]="tableBuilder">
461
+ <ng-template customCell="status" let-row>
462
+ <span [class]="'status-' + row.status">
463
+ {{ row.status }}
464
+ </span>
465
+ </ng-template>
466
+ </tb-table-container>
467
+ `
468
+ })
469
+ ```
470
+
471
+ ### Custom Filter Directives
472
+
473
+ Use `TableFilterDirective` or `TableCustomFilterDirective` for custom filtering UI:
474
+
475
+ ```typescript
476
+ import { TableFilterDirective } from 'angular-utilities';
477
+
478
+ @Component({
479
+ template: `
480
+ <tb-table-container [tableBuilder]="tableBuilder">
481
+ <input
482
+ tbFilter
483
+ filterId="search"
484
+ [key]="'name'"
485
+ [type]="FilterType.Contains"
486
+ placeholder="Search by name" />
487
+ </tb-table-container>
488
+ `
489
+ })
490
+ ```
491
+
492
+ ### Custom Row Definitions
493
+
494
+ Use `MatRowDef` to define custom row rendering:
495
+
496
+ ```typescript
497
+ @Component({
498
+ template: `
499
+ <tb-table-container [tableBuilder]="tableBuilder">
500
+ <tr *matRowDef="let row; columns: displayedColumns"
501
+ [class.highlighted]="row.isImportant">
502
+ </tr>
503
+ </tb-table-container>
504
+ `
505
+ })
506
+ ```
507
+
508
+ ## Complete Example
509
+
510
+ ```typescript
511
+ import { Component, ViewChild } from '@angular/core';
512
+ import { TableBuilder, TableContainerComponent, FieldType } from 'angular-utilities';
513
+
514
+ interface User {
515
+ id: number;
516
+ name: string;
517
+ email: string;
518
+ department: string;
519
+ isActive: boolean;
520
+ }
521
+
522
+ @Component({
523
+ selector: 'app-users-table',
524
+ standalone: true,
525
+ imports: [TableContainerComponent],
526
+ template: `
527
+ <tb-table-container
528
+ #table
529
+ [tableBuilder]="tableBuilder"
530
+ tableId="users-table"
531
+ trackBy="id"
532
+ [selectionColumn]="true"
533
+ [indexColumn]="true"
534
+ [pageSize]="25"
535
+ [inputFilters]="filters"
536
+ (selection)="onSelectionChange($event)"
537
+ (data)="onDataChange($event)" />
538
+ `
539
+ })
540
+ export class UsersTableComponent {
541
+ @ViewChild('table') table!: TableContainerComponent<User>;
542
+
543
+ users: User[] = [
544
+ { id: 1, name: 'John Doe', email: 'john@example.com', department: 'Engineering', isActive: true },
545
+ { id: 2, name: 'Jane Smith', email: 'jane@example.com', department: 'Marketing', isActive: true }
546
+ ];
547
+
548
+ metaData = [
549
+ { key: 'id', fieldType: FieldType.Number, displayName: 'ID', width: '80px' },
550
+ { key: 'name', fieldType: FieldType.String, displayName: 'Name' },
551
+ { key: 'email', fieldType: FieldType.String, displayName: 'Email' },
552
+ { key: 'department', fieldType: FieldType.String, displayName: 'Department' },
553
+ { key: 'isActive', fieldType: FieldType.Boolean, displayName: 'Active' }
554
+ ];
555
+
556
+ tableBuilder = new TableBuilder(this.users, this.metaData);
557
+
558
+ filters = [
559
+ (user: User) => user.isActive // Only show active users
560
+ ];
561
+
562
+ onSelectionChange(event: any) {
563
+ console.log('Selected users:', event.source.selected);
564
+ }
565
+
566
+ onDataChange(data: User[]) {
567
+ console.log('Current data:', data);
568
+ }
569
+
570
+ exportData() {
571
+ this.table.exportToCsv();
572
+ }
573
+ }
574
+ ```
575
+
576
+ ## State Persistence
577
+
578
+ When a `tableId` is provided, the following state is automatically persisted to local storage:
579
+
580
+ - Column visibility and order
581
+ - Sort configuration
582
+ - Applied filters (with `filterId`)
583
+ - Group by settings
584
+ - Page size
585
+ - Expanded/collapsed group headers
586
+ - Header/footer collapsed state
587
+
588
+ The state is restored automatically when the component initializes with the same `tableId`.
589
+
590
+ ## Performance Considerations
591
+
592
+ ### Virtual Scrolling
593
+
594
+ The table automatically enables virtual scrolling for large datasets. This is controlled by the `TableBuilderSettings`:
595
+
596
+ ```typescript
597
+ const settings = {
598
+ tableSettings: {
599
+ useVirtual: true, // Enable virtual scrolling
600
+ virtualSettings: {
601
+ itemSize: 48, // Height of each row in pixels
602
+ bufferSize: 10 // Number of items to render outside viewport
603
+ }
604
+ }
605
+ };
606
+ ```
607
+
608
+ See [TableBuilder Settings](TABLE-BUILDER-SETTINGS.md) for more details.
609
+
610
+ ### TrackBy
611
+
612
+ Always provide a `trackBy` property for optimal performance, especially with large datasets or frequent updates:
613
+
614
+ ```html
615
+ <tb-table-container
616
+ [tableBuilder]="tableBuilder"
617
+ trackBy="id" />
618
+ ```
619
+
620
+ ## Related Documentation
621
+
622
+ - [MetaData Documentation](METADATA-DOCUMENTATION.md) - Column configuration
623
+ - [TableBuilder Settings](TABLE-BUILDER-SETTINGS.md) - Table behavior and appearance
624
+ - [TableBuilder Config](TABLE-BUILDER-CONFIG.md) - Global configuration
625
+ - [Styler Style Documentation](STYLER-STYLE.md) - Cell styling
626
+ - [TableBuilder Documentation](TABLE-BUILDER.md) - Setting up the table builder
627
+ - [CustomCell Directive](CUSTOM-CELL.md) - Custom cell templates
628
+ - [CustomGroupRow Directive](CUSTOM-GROUP-ROW.md) - Custom group row templates
@@ -0,0 +1,39 @@
1
+
2
+ export const FilterType = {
3
+ NumberEquals: 'Equals',
4
+ NumberNotEqual: 'Does Not Equal',
5
+ NumberGreaterThan: 'Greater Than',
6
+ NumberLessThan: 'Less Than',
7
+ NumberBetween: 'Between',
8
+ StringEquals: 'Equals',
9
+ StringContains: 'Contains',
10
+ StringDoesNotContain: 'Does Not Contain',
11
+ StringStartWith: 'Start With',
12
+ StringEndsWith: 'Ends With',
13
+ DateIsOn: 'Is on',
14
+ DateIsNotOn: 'Is Not On',
15
+ DateOnOrAfter: 'On or After',
16
+ DateOnOrBefore: 'On or Before',
17
+ DateBetween: 'Between',
18
+ DateTimeIsAt: 'Is At',
19
+ DateTimeIsNotAt: 'Is Not At',
20
+ DateTimeAtOrAfter: 'At or After',
21
+ DateTimeAtOrBefore: 'At or Before',
22
+ DateTimeBetween: 'Between',
23
+ BooleanEquals: 'Is',
24
+ IsNull: 'Is Blank',
25
+ And: 'And',
26
+ In: 'In',
27
+ Custom: 'Custom',
28
+ } as const;
29
+
30
+ export type FilterType = typeof FilterType[keyof typeof FilterType];
31
+
32
+ export type SubFilterTypes<T extends typeof FilterType[keyof typeof FilterType]> = T;
33
+
34
+ export type StringFilterTypes = SubFilterTypes<'Equals' | 'Contains' | 'Does Not Contain' | 'Start With' | 'Ends With' | 'Is Blank' | 'In'>;
35
+ export type NumberFilterTypes = SubFilterTypes<'Equals' | 'Does Not Equal' | 'Greater Than' | 'Less Than' | 'Between' | 'Is Blank' | 'In'>;
36
+ export type DateFilterTypes = SubFilterTypes<'Is on' | 'Is Not On' | 'On or After' | 'On or Before' | 'Between' | 'Is Blank' | 'In'>;
37
+ export type DateTimeFilterTypes = SubFilterTypes<'Is At' | 'Is Not At' | 'At or After' | 'At or Before' | 'Between' | DateFilterTypes>;
38
+ export type BooleanFilterTypes = SubFilterTypes<'Is' | 'Is Blank'>;
39
+ export type EnumFilterTypes = SubFilterTypes<'In' | 'Is Blank'>;
@@ -0,0 +1,12 @@
1
+ import { FilterFunc, FilterFuncs, FilterInfo } from '../classes/filter-info';
2
+ import { BooleanFilterTypes, FilterType } from '../enums/filterTypes';
3
+ import { isNull } from './null-filter-function';
4
+
5
+ const booleanEqualsFunc : FilterFunc<boolean> = (filterInfo:FilterInfo) => (val): boolean => {
6
+ return filterInfo.filterValue === val;
7
+ }
8
+
9
+ export const BooleanFilterFuncs: FilterFuncs<BooleanFilterTypes> = {
10
+ [FilterType.BooleanEquals]: booleanEqualsFunc,
11
+ [FilterType.IsNull]: isNull,
12
+ };