@one-paragon/angular-utilities 2.8.3 → 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,356 @@
1
+ # CustomGroupRow Directive Documentation
2
+
3
+ ## Overview
4
+
5
+ The `customGroupRow` directive allows you to provide custom templates for rendering group header rows when data is grouped. This is useful when you want to display group headers in a specific way, add custom styling, or include interactive elements like expand/collapse buttons or group actions.
6
+
7
+ > **💡 Type Safety Recommendation**: For better TypeScript support and type inference in your templates, it's recommended to use the `tableRef` input parameter. See [customGroupRowTableRef](#customgrouprowtableref) for details.
8
+
9
+ ## Basic Usage
10
+
11
+ ### Global Custom Group Row (applies to all groupings)
12
+
13
+ ```typescript
14
+ import { Component } from '@angular/core';
15
+ import { TableBuilder, CustomGroupRowDirective } from 'angular-utilities';
16
+ import { TableContainerComponent } from 'angular-utilities';
17
+
18
+ @Component({
19
+ selector: 'app-products-table',
20
+ standalone: true,
21
+ imports: [TableContainerComponent, CustomGroupRowDirective],
22
+ template: `
23
+ <tb-table-container [tableBuilder]="tableBuilder">
24
+ <!-- This custom row will be used for all group headers -->
25
+ <div *customGroupRow="let group" style="background: lightblue; padding: 8px;">
26
+ 📁 Group: <strong>{{group.groupHeaderDisplay}}</strong>
27
+ ({{group.length}} items)
28
+ </div>
29
+ </tb-table-container>
30
+ `
31
+ })
32
+ export class ProductsTableComponent {
33
+ products = [
34
+ { category: 'Electronics', name: 'Laptop', price: 999 },
35
+ { category: 'Electronics', name: 'Phone', price: 699 },
36
+ { category: 'Clothing', name: 'Shirt', price: 29 }
37
+ ];
38
+
39
+ tableBuilder = new TableBuilder(this.products, undefined, {
40
+ tableSettings: {
41
+ groupBySettings: [{ key: 'category', expanded: true }]
42
+ }
43
+ });
44
+ }
45
+ ```
46
+
47
+ ### Key-Specific Custom Group Row
48
+
49
+ ```typescript
50
+ @Component({
51
+ selector: 'app-products-table',
52
+ standalone: true,
53
+ imports: [TableContainerComponent, CustomGroupRowDirective],
54
+ template: `
55
+ <tb-table-container [tableBuilder]="tableBuilder">
56
+ <!-- This custom row only applies when grouping by 'category' -->
57
+ <div *customGroupRow="'category'; let group" style="background: lightgreen; padding: 8px;">
58
+ 🏷️ Category: <strong>{{group.groupHeaderDisplay}}</strong>
59
+ ({{group.length}} products)
60
+ </div>
61
+
62
+ <!-- This custom row only applies when grouping by 'status' -->
63
+ <div *customGroupRow="'status'; let group" style="background: lightyellow; padding: 8px;">
64
+ ⭐ Status: <strong>{{group.groupHeaderDisplay}}</strong>
65
+ ({{group.length}} items)
66
+ </div>
67
+
68
+ <!-- This custom row applies to all other groupings -->
69
+ <div *customGroupRow="let group" style="background: lightgray; padding: 8px;">
70
+ 📋 Default Group: <strong>{{group.groupHeaderDisplay}}</strong>
71
+ ({{group.length}} items)
72
+ </div>
73
+ </tb-table-container>
74
+ `
75
+ })
76
+ export class ProductsTableComponent {
77
+ // ... component logic
78
+ }
79
+ ```
80
+
81
+ ### Multiple Keys
82
+
83
+ You can apply a single custom group row template to multiple grouping keys:
84
+
85
+ ```typescript
86
+ @Component({
87
+ template: `
88
+ <tb-table-container [tableBuilder]="tableBuilder">
89
+ <!-- This applies to both 'category' and 'department' groupings -->
90
+ <div *customGroupRow="['category', 'department']; let group"
91
+ style="background: lightcoral; padding: 8px;">
92
+ 📊 {{group.groupHeaderDisplay}} ({{group.length}} items)
93
+ </div>
94
+ </tb-table-container>
95
+ `
96
+ })
97
+ export class MyComponent {
98
+ // ... component logic
99
+ }
100
+ ```
101
+
102
+ ## Template Context
103
+
104
+ The custom group row template receives a context object with the following properties:
105
+
106
+ ### `$implicit` (default)
107
+ - **Type**: `Group<T>`
108
+ - **Description**: The group row data. This is the default context variable.
109
+
110
+ ### `element`
111
+ - **Type**: `T`
112
+ - **Description**: Alternative named access to the group row data.
113
+
114
+ ### `expanded`
115
+ - **Type**: `boolean`
116
+ - **Description**: Whether the group is currently expanded.
117
+
118
+ ### `level`
119
+ - **Type**: `number`
120
+ - **Description**: The nesting level of the group (0 for top-level groups, 1 for nested, etc.).
121
+
122
+ ### `key`
123
+ - **Type**: `string`
124
+ - **Description**: The grouping key that created this group (e.g., 'category', 'status').
125
+
126
+ ### `uniqueName`
127
+ - **Type**: `string`
128
+ - **Description**: Unique identifier for this specific group instance.
129
+
130
+ ### `groupHeaderDisplay`
131
+ - **Type**: `string`
132
+ - **Description**: The display text for the group header (e.g., the value of the grouped property).
133
+
134
+ ### `length`
135
+ - **Type**: `number`
136
+ - **Description**: Number of items in the group.
137
+
138
+ ### `padding`
139
+ - **Type**: `number`
140
+ - **Description**: Calculated padding in pixels for visual nesting indication.
141
+
142
+ **Example using context properties:**
143
+ ```html
144
+ <div *customGroupRow="let group">
145
+ <div [style.padding-left.px]="group.padding">
146
+ <span>{{group.expanded ? '▼' : '▶'}}</span>
147
+ <strong>{{group.groupHeaderDisplay}}</strong>
148
+ <span>({{group.length}} items, Level {{group.level}})</span>
149
+ </div>
150
+ </div>
151
+ ```
152
+
153
+ ## Priority System
154
+
155
+ When multiple custom group row directives could apply to the same grouping, they are prioritized as follows:
156
+
157
+ 1. **Key-specific matches** (e.g., `*customGroupRow="'category'"`) automatically have higher priority than global matches (`*customGroupRow="let group"`)
158
+ 2. **Explicit priority** - Use the `customGroupRowPriority` input to set explicit priorities
159
+ 3. **Higher numbers win** - When comparing priorities, higher numbers take precedence
160
+
161
+ **Example:**
162
+ ```typescript
163
+ @Component({
164
+ template: `
165
+ <tb-table-container [tableBuilder]="tableBuilder">
166
+ <!-- Priority: 0 (default), key-specific -->
167
+ <div *customGroupRow="'category'; let group">
168
+ Default category template
169
+ </div>
170
+
171
+ <!-- Priority: 10, key-specific - THIS ONE WINS -->
172
+ <div *customGroupRow="'category'; priority: 10; let group">
173
+ Special category template with higher priority
174
+ </div>
175
+
176
+ <!-- Priority: 0 (default), global -->
177
+ <div *customGroupRow="let group">
178
+ Global fallback template
179
+ </div>
180
+ </tb-table-container>
181
+ `
182
+ })
183
+ export class MyComponent {
184
+ // ... component logic
185
+ }
186
+ ```
187
+
188
+ ## Advanced Example with Interaction
189
+
190
+ ```typescript
191
+ import { Component } from '@angular/core';
192
+ import { TableBuilder, CustomGroupRowDirective } from 'angular-utilities';
193
+ import { TableContainerComponent } from 'angular-utilities';
194
+
195
+ @Component({
196
+ selector: 'app-interactive-table',
197
+ standalone: true,
198
+ imports: [TableContainerComponent, CustomGroupRowDirective],
199
+ template: `
200
+ <tb-table-container [tableBuilder]="tableBuilder" #tableContainer>
201
+ <div *customGroupRow="let group"
202
+ style="background: #f0f8ff; padding: 12px; border-left: 4px solid #007acc;
203
+ margin: 4px 0; border-radius: 4px;">
204
+ <div style="display: flex; align-items: center; justify-content: space-between;">
205
+ <div style="display: flex; align-items: center; gap: 8px;">
206
+ <button (click)="toggleGroup(tableContainer, group)"
207
+ style="background: none; border: none; font-size: 16px; cursor: pointer;">
208
+ {{group.expanded ? '📂' : '📁'}}
209
+ </button>
210
+ <strong>{{group.groupHeaderDisplay}}</strong>
211
+ <span style="color: #666; font-size: 0.9em;">({{group.length}} items)</span>
212
+ <span style="background: #007acc; color: white; padding: 2px 6px;
213
+ border-radius: 12px; font-size: 0.8em;">
214
+ Level {{group.level}}
215
+ </span>
216
+ </div>
217
+ <div>
218
+ <button (click)="selectAllInGroup(group)"
219
+ style="font-size: 0.8em; padding: 4px 8px;">
220
+ Select All
221
+ </button>
222
+ </div>
223
+ </div>
224
+ </div>
225
+ </tb-table-container>
226
+ `
227
+ })
228
+ export class InteractiveTableComponent {
229
+ data = [
230
+ { category: 'Electronics', name: 'Laptop', price: 999 },
231
+ { category: 'Electronics', name: 'Phone', price: 699 },
232
+ { category: 'Clothing', name: 'Shirt', price: 29 }
233
+ ];
234
+
235
+ tableBuilder = new TableBuilder(this.data, undefined, {
236
+ tableSettings: {
237
+ groupBySettings: [{ key: 'category', expanded: false }]
238
+ }
239
+ });
240
+
241
+ toggleGroup(tableContainer: TableContainerComponent, group: any) {
242
+ // Access the generic table to toggle expansion
243
+ const genericTable = tableContainer.$genericTable();
244
+ if (genericTable) {
245
+ genericTable.setExpanded(group.key, group.uniqueName, !group.expanded);
246
+ }
247
+ }
248
+
249
+ selectAllInGroup(group: any) {
250
+ // Custom logic to select all items in the group
251
+ console.log('Selecting all items in group:', group.uniqueName);
252
+ }
253
+ }
254
+ ```
255
+
256
+ ## Directive Inputs
257
+
258
+ ### `customGroupRow`
259
+ - **Type**: `string | string[] | null`
260
+ - **Default**: `null` (applies to all groupings)
261
+ - **Description**: The grouping key(s) this directive applies to. Can be:
262
+ - `null` or omitted: Applies to all groupings (global default)
263
+ - A string: Applies only when grouped by that specific key
264
+ - An array of strings: Applies when grouped by any of the specified keys
265
+
266
+ **Examples:**
267
+ ```html
268
+ <!-- Global: applies to all groupings -->
269
+ <div *customGroupRow="let group">
270
+ {{group.groupHeaderDisplay}}
271
+ </div>
272
+
273
+ <!-- Key-specific: only for 'category' -->
274
+ <div *customGroupRow="'category'; let group">
275
+ Category: {{group.groupHeaderDisplay}}
276
+ </div>
277
+
278
+ <!-- Multiple keys: for 'category' or 'status' -->
279
+ <div *customGroupRow="['category', 'status']; let group">
280
+ {{group.groupHeaderDisplay}}
281
+ </div>
282
+ ```
283
+
284
+ ### `customGroupRowPriority`
285
+ - **Type**: `number`
286
+ - **Default**: `0`
287
+ - **Description**: Priority for this directive when multiple directives could apply to the same grouping. Higher numbers have higher priority. Key-specific directives automatically get higher priority than global directives.
288
+
289
+ **Example:**
290
+ ```html
291
+ <!-- Lower priority (will be overridden) -->
292
+ <div *customGroupRow="'category'; let group">
293
+ Default category template
294
+ </div>
295
+
296
+ <!-- Higher priority (this one wins) -->
297
+ <div *customGroupRow="'category'; priority: 10; let group">
298
+ Special category template
299
+ </div>
300
+ ```
301
+
302
+ ### `customGroupRowTableRef`
303
+ - **Type**: `TableBuilder<T> | undefined`
304
+ - **Default**: `undefined`
305
+ - **Description**: Reference to the TableBuilder instance for type safety. This helps TypeScript infer the correct type for the group data in the template.
306
+
307
+ **Example:**
308
+ ```typescript
309
+ @Component({
310
+ template: `
311
+ <tb-table-container [tableBuilder]="tableBuilder">
312
+ <div *customGroupRow="tableRef: tableBuilder; let group">
313
+ <!-- TypeScript now knows the correct type for group -->
314
+ {{group.groupHeaderDisplay}}
315
+ </div>
316
+ </tb-table-container>
317
+ `
318
+ })
319
+ export class MyComponent {
320
+ tableBuilder = new TableBuilder<Product>(this.products);
321
+ }
322
+ ```
323
+
324
+ ## Grouping Configuration
325
+
326
+ To use custom group rows, you first need to configure grouping in your table settings. See [TableBuilder Settings - groupBySettings](TABLE-BUILDER-SETTINGS.md#groupbysettings) for detailed configuration options.
327
+
328
+ **Example:**
329
+ ```typescript
330
+ const settings = {
331
+ tableSettings: {
332
+ groupBySettings: [
333
+ { key: 'category', expanded: true },
334
+ { key: 'status', expanded: false }
335
+ ]
336
+ }
337
+ };
338
+
339
+ const tableBuilder = new TableBuilder(data, metaData, settings);
340
+ ```
341
+
342
+ ## Important Notes
343
+
344
+ - The directive selector is `[customGroupRow]`
345
+ - Multiple custom group row directives can be defined in the same component
346
+ - Key-specific directives automatically have higher priority than global ones
347
+ - The template receives the full group data including expansion state and nesting information
348
+ - Custom group rows completely replace the default group header rendering when matched
349
+ - For type safety, always provide the `tableRef` input in TypeScript strict mode
350
+
351
+ ## Related Documentation
352
+
353
+ - [Table Container Component](TABLE-CONTAINER.md) - Main table component documentation
354
+ - [TableBuilder Settings](TABLE-BUILDER-SETTINGS.md) - Configuring grouping behavior
355
+ - [CustomCell Directive](CUSTOM-CELL.md) - Custom cell templates
356
+ - [TableBuilder Documentation](TABLE-BUILDER.md) - Setting up the table builder