@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.
- package/karma.conf.js +43 -0
- package/ng-package.json +7 -0
- package/package.json +15 -27
- package/src/action-state/action-state-spinner/action-state-spinner.component.css +16 -0
- package/src/action-state/action-state-spinner/action-state-spinner.component.html +7 -0
- package/src/action-state/action-state-spinner/action-state-spinner.component.spec.ts +25 -0
- package/src/action-state/action-state-spinner/action-state-spinner.component.ts +26 -0
- package/src/action-state/action-state-ui/action-state-ui.module.ts +13 -0
- package/src/action-state/index.ts +8 -0
- package/src/action-state/ngrx-ext/ngrx-ext.module.ts +14 -0
- package/src/action-state/ngrx.ts +69 -0
- package/src/http-request-state/RequestStateFactory.ts +56 -0
- package/src/http-request-state/RequestStateStore.ts +360 -0
- package/src/http-request-state/deprecated.ts +20 -0
- package/src/http-request-state/directives/HttpStateDirectiveBase.ts +29 -0
- package/src/http-request-state/directives/http-error-state-directive.ts +21 -0
- package/src/http-request-state/directives/http-inProgress-state-directive.ts +19 -0
- package/src/http-request-state/directives/http-notStarted-state-directive.ts +19 -0
- package/src/http-request-state/directives/http-success-state-directive.ts +29 -0
- package/src/http-request-state/directives/index.ts +5 -0
- package/src/http-request-state/directives/request-state-directive.spec.ts +73 -0
- package/src/http-request-state/directives/request-state-directive.ts +78 -0
- package/src/http-request-state/documentation/CREATE-REQUESTOR.md +667 -0
- package/src/http-request-state/documentation/README.md +191 -0
- package/src/http-request-state/documentation/REQUEST-STATE-STORE-CONFIG.md +648 -0
- package/src/http-request-state/documentation/REQUESTOR.md +616 -0
- package/src/http-request-state/helpers.ts +30 -0
- package/src/http-request-state/http-state-module.ts +23 -0
- package/src/http-request-state/index.ts +7 -0
- package/src/http-request-state/models/view-context.ts +18 -0
- package/src/http-request-state/observable.spec.ts +43 -0
- package/src/http-request-state/request-state.ts +66 -0
- package/src/http-request-state/rxjs/getRequestorBody.ts +10 -0
- package/src/http-request-state/rxjs/getRequestorState.ts +8 -0
- package/src/http-request-state/rxjs/index.ts +4 -0
- package/src/http-request-state/rxjs/tapError.ts +16 -0
- package/src/http-request-state/rxjs/tapSuccess.ts +16 -0
- package/src/http-request-state/strategies.spec.ts +42 -0
- package/src/http-request-state/types.ts +54 -0
- package/src/ngrx/actionable-selector.ts +189 -0
- package/src/ngrx/index.ts +1 -0
- package/src/public-api.ts +40 -0
- package/src/rxjs/defaultShareReplay.ts +8 -0
- package/src/rxjs/index.ts +5 -0
- package/src/rxjs/mapError.ts +8 -0
- package/src/rxjs/rxjs-operators.ts +130 -0
- package/src/rxjs/subjectifier.ts +17 -0
- package/src/rxjs/subscriber.directive.ts +57 -0
- package/src/specs/clickSubject.spec.ts +99 -0
- package/src/specs/dialog.spec.ts +101 -0
- package/src/specs/toggleGroupDirective.spec.ts +229 -0
- package/src/table-builder/classes/DefaultSettings.ts +11 -0
- package/src/table-builder/classes/MatTableObservableDataSource.ts +23 -0
- package/src/table-builder/classes/TableBuilderConfig.ts +49 -0
- package/src/table-builder/classes/TableBuilderDataSource.ts +64 -0
- package/src/table-builder/classes/TableState.ts +96 -0
- package/src/table-builder/classes/data-store.ts +10 -0
- package/src/table-builder/classes/display-col.ts +5 -0
- package/src/table-builder/classes/filter-info.ts +129 -0
- package/src/table-builder/classes/table-builder-general-settings.ts +233 -0
- package/src/table-builder/classes/table-builder.ts +105 -0
- package/src/table-builder/classes/table-store.helpers.ts +109 -0
- package/src/table-builder/classes/table-store.ts +540 -0
- package/src/table-builder/components/array-column.component.ts +34 -0
- package/src/table-builder/components/column-builder/column-builder.component.html +109 -0
- package/src/table-builder/components/column-builder/column-builder.component.scss +43 -0
- package/src/table-builder/components/column-builder/column-builder.component.spec.ts +49 -0
- package/src/table-builder/components/column-builder/column-builder.component.ts +130 -0
- package/src/table-builder/components/column-builder/column-helpers.ts +54 -0
- package/src/table-builder/components/column-header-menu/column-header-menu.component.html +128 -0
- package/src/table-builder/components/column-header-menu/column-header-menu.component.scss +97 -0
- package/src/table-builder/components/column-header-menu/column-header-menu.component.ts +113 -0
- package/src/table-builder/components/date-filter/date-filter.component.html +39 -0
- package/src/table-builder/components/date-filter/date-filter.component.ts +33 -0
- package/src/table-builder/components/date-time-filter/date-time-filter.component.html +25 -0
- package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +33 -0
- package/src/table-builder/components/filter/filter.component.html +120 -0
- package/src/table-builder/components/filter/filter.component.scss +60 -0
- package/src/table-builder/components/filter/filter.component.spec.ts +86 -0
- package/src/table-builder/components/filter/filter.component.ts +73 -0
- package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +171 -0
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +60 -0
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +57 -0
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +44 -0
- package/src/table-builder/components/generic-table/generic-table.component.html +140 -0
- package/src/table-builder/components/generic-table/generic-table.component.scss +45 -0
- package/src/table-builder/components/generic-table/generic-table.component.ts +531 -0
- package/src/table-builder/components/generic-table/paginator.component.ts +125 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.css +24 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.html +21 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +23 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.ts +26 -0
- package/src/table-builder/components/in-filter/in-filter.component.css +22 -0
- package/src/table-builder/components/in-filter/in-filter.component.html +38 -0
- package/src/table-builder/components/in-filter/in-filter.component.ts +66 -0
- package/src/table-builder/components/index.ts +9 -0
- package/src/table-builder/components/initialization-component/initialization.component.html +78 -0
- package/src/table-builder/components/initialization-component/initialization.component.ts +28 -0
- package/src/table-builder/components/link-column.component.ts +42 -0
- package/src/table-builder/components/number-filter/number-filter.component.css +10 -0
- package/src/table-builder/components/number-filter/number-filter.component.html +32 -0
- package/src/table-builder/components/number-filter/number-filter.component.spec.ts +30 -0
- package/src/table-builder/components/number-filter/number-filter.component.ts +34 -0
- package/src/table-builder/components/profiles-menu/profiles-menu.component.html +77 -0
- package/src/table-builder/components/profiles-menu/profiles-menu.component.scss +126 -0
- package/src/table-builder/components/profiles-menu/profiles-menu.component.spec.ts +23 -0
- package/src/table-builder/components/profiles-menu/profiles-menu.component.ts +64 -0
- package/src/table-builder/components/reset-menu/reset-menu.component.css +3 -0
- package/src/table-builder/components/reset-menu/reset-menu.component.html +10 -0
- package/src/table-builder/components/reset-menu/reset-menu.component.ts +87 -0
- package/src/table-builder/components/scroll-strategy.ts +139 -0
- package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +57 -0
- package/src/table-builder/components/sort-menu/sort-menu.component.html +115 -0
- package/src/table-builder/components/sort-menu/sort-menu.component.scss +119 -0
- package/src/table-builder/components/sort-menu/sort-menu.component.ts +88 -0
- package/src/table-builder/components/table-container/table-container.component.html +94 -0
- package/src/table-builder/components/table-container/table-container.component.scss +60 -0
- package/src/table-builder/components/table-container/table-container.component.ts +467 -0
- package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +113 -0
- package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +125 -0
- package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +172 -0
- package/src/table-builder/components/table-container/table-container.helpers/meta-data.helpers.ts +19 -0
- package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +47 -0
- package/src/table-builder/components/table-container/tableProps.ts +21 -0
- package/src/table-builder/components/table-container/virtual-scroll-container.ts +216 -0
- package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +42 -0
- package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +47 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +40 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +11 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +85 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +35 -0
- package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +13 -0
- package/src/table-builder/components/table-header-menu/table-header-menu.component.css +21 -0
- package/src/table-builder/components/table-header-menu/table-header-menu.component.html +48 -0
- package/src/table-builder/components/table-header-menu/table-header-menu.component.ts +36 -0
- package/src/table-builder/directives/custom-cell-directive.ts +63 -0
- package/src/table-builder/directives/custom-header-directive.ts +16 -0
- package/src/table-builder/directives/group-row-directive.ts +91 -0
- package/src/table-builder/directives/index.ts +8 -0
- package/src/table-builder/directives/multi-sort.directive.spec.ts +124 -0
- package/src/table-builder/directives/multi-sort.directive.ts +58 -0
- package/src/table-builder/directives/resize-column.directive.ts +107 -0
- package/src/table-builder/directives/table-wrapper.directive.ts +13 -0
- package/src/table-builder/directives/tb-filter.directive.ts +376 -0
- package/src/table-builder/documentation/table-builder/CUSTOM-CELL.md +568 -0
- package/src/table-builder/documentation/table-builder/CUSTOM-GROUP-ROW.md +356 -0
- package/src/table-builder/documentation/table-builder/METADATA-DOCUMENTATION.md +517 -0
- package/src/table-builder/documentation/table-builder/STYLER-STYLE.md +228 -0
- package/src/table-builder/documentation/table-builder/TABLE-BUILDER-CONFIG.md +325 -0
- package/src/table-builder/documentation/table-builder/TABLE-BUILDER-SETTINGS.md +515 -0
- package/src/table-builder/documentation/table-builder/TABLE-BUILDER.md +430 -0
- package/src/table-builder/documentation/table-builder/TABLE-CONTAINER.md +628 -0
- package/src/table-builder/enums/filterTypes.ts +39 -0
- package/src/table-builder/functions/boolean-filter-function.ts +12 -0
- package/src/table-builder/functions/date-filter-function.ts +85 -0
- package/src/table-builder/functions/download-data.ts +11 -0
- package/src/table-builder/functions/null-filter-function.ts +9 -0
- package/src/table-builder/functions/number-filter-function.ts +47 -0
- package/src/table-builder/functions/sort-data-function.ts +80 -0
- package/src/table-builder/functions/string-filter-function.ts +59 -0
- package/src/table-builder/interfaces/ColumnInfo.ts +9 -0
- package/src/table-builder/interfaces/dictionary.ts +3 -0
- package/src/table-builder/interfaces/meta-data.ts +279 -0
- package/src/table-builder/ngrx/tableBuilderStateStore.ts +203 -0
- package/src/table-builder/pipes/column-total.pipe.ts +16 -0
- package/src/table-builder/pipes/format-filter-type.pipe.ts +12 -0
- package/src/table-builder/pipes/format-filter-value.pipe.ts +71 -0
- package/src/table-builder/pipes/key-display.ts +13 -0
- package/src/table-builder/services/all-values-filter-creator.service.ts +92 -0
- package/src/table-builder/services/export-to-csv.service.ts +117 -0
- package/src/table-builder/services/link-creator.service.ts +98 -0
- package/src/table-builder/services/table-template-service.ts +47 -0
- package/src/table-builder/services/transform-creator.ts +90 -0
- package/src/table-builder/specs/table-custom-filters.spec.ts +262 -0
- package/src/table-builder/styles/collapser.styles.scss +16 -0
- package/src/table-builder/table-builder.module.ts +42 -0
- package/src/table-builder/types/group-types.ts +42 -0
- package/src/table-builder/types/index.ts +1 -0
- package/src/test.ts +17 -0
- package/src/utilities/array-helpers.ts +13 -0
- package/src/utilities/directives/auto-focus.directive.ts +20 -0
- package/src/utilities/directives/clickEmitterDirective.ts +15 -0
- package/src/utilities/directives/clickSubject.ts +19 -0
- package/src/utilities/directives/conditional-classes.directive.ts +36 -0
- package/src/utilities/directives/dialog-service.ts +19 -0
- package/src/utilities/directives/dialog.ts +174 -0
- package/src/utilities/directives/mat-toggle-group-directive.ts +60 -0
- package/src/utilities/directives/prevent-enter.directive.ts +12 -0
- package/src/utilities/directives/stop-propagation.directive.ts +19 -0
- package/src/utilities/directives/styler.ts +45 -0
- package/src/utilities/directives/trim-whitespace.directive.ts +20 -0
- package/src/utilities/index.ts +22 -0
- package/src/utilities/module.ts +53 -0
- package/src/utilities/pipes/function.pipe.ts +21 -0
- package/src/utilities/pipes/phone.pipe.ts +20 -0
- package/src/utilities/pipes/space-case.pipes.spec.ts +47 -0
- package/src/utilities/pipes/space-case.pipes.ts +29 -0
- package/tsconfig.lib.json +20 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +17 -0
- package/fesm2022/one-paragon-angular-utilities.mjs +0 -7328
- package/fesm2022/one-paragon-angular-utilities.mjs.map +0 -1
- 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
|