@memberjunction/ng-entity-viewer 5.0.0 → 5.1.0
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-entity-viewer",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.1.0",
|
|
4
4
|
"description": "MemberJunction: Angular components for viewing entity data in multiple formats (grid, cards) with filtering, selection, and shared data management",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -37,14 +37,14 @@
|
|
|
37
37
|
"ag-grid-community": "^35.0.1"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@memberjunction/core-entities": "5.
|
|
41
|
-
"@memberjunction/export-engine": "5.
|
|
42
|
-
"@memberjunction/global": "5.
|
|
43
|
-
"@memberjunction/core": "5.
|
|
44
|
-
"@memberjunction/ng-shared-generic": "5.
|
|
45
|
-
"@memberjunction/ng-timeline": "5.
|
|
46
|
-
"@memberjunction/ng-filter-builder": "5.
|
|
47
|
-
"@memberjunction/ng-export-service": "5.
|
|
40
|
+
"@memberjunction/core-entities": "5.1.0",
|
|
41
|
+
"@memberjunction/export-engine": "5.1.0",
|
|
42
|
+
"@memberjunction/global": "5.1.0",
|
|
43
|
+
"@memberjunction/core": "5.1.0",
|
|
44
|
+
"@memberjunction/ng-shared-generic": "5.1.0",
|
|
45
|
+
"@memberjunction/ng-timeline": "5.1.0",
|
|
46
|
+
"@memberjunction/ng-filter-builder": "5.1.0",
|
|
47
|
+
"@memberjunction/ng-export-service": "5.1.0",
|
|
48
48
|
"rxjs": "^7.8.2",
|
|
49
49
|
"tslib": "^2.8.1"
|
|
50
50
|
},
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import { EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
|
|
2
|
-
import { EntityInfo } from '@memberjunction/core';
|
|
3
|
-
import { BaseEntity } from '@memberjunction/core';
|
|
4
|
-
import { ColDef, GridReadyEvent, RowClickedEvent, RowDoubleClickedEvent, RowSelectionOptions, GetRowIdParams, SortChangedEvent as AgSortChangedEvent, ColumnResizedEvent, ColumnMovedEvent } from 'ag-grid-community';
|
|
5
|
-
import { GridColumnDef, RecordSelectedEvent, RecordOpenedEvent, SortState, SortChangedEvent, ViewGridStateConfig, GridStateChangedEvent } from '../types';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
/**
|
|
8
|
-
* EntityGridComponent - AG Grid based table view for entity records
|
|
9
|
-
*
|
|
10
|
-
* This component provides a lightweight, customizable grid view for displaying
|
|
11
|
-
* entity records. It uses AG Grid Community edition for high-performance rendering.
|
|
12
|
-
*
|
|
13
|
-
* Supports two modes:
|
|
14
|
-
* 1. Parent-managed data: Records are passed in via [records] input
|
|
15
|
-
* 2. Standalone: Component loads its own data with pagination
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* ```html
|
|
19
|
-
* <mj-entity-grid
|
|
20
|
-
* [entity]="selectedEntity"
|
|
21
|
-
* [records]="filteredRecords"
|
|
22
|
-
* [selectedRecordId]="selectedId"
|
|
23
|
-
* [sortState]="currentSort"
|
|
24
|
-
* [serverSideSorting]="true"
|
|
25
|
-
* (recordSelected)="onRecordSelected($event)"
|
|
26
|
-
* (recordOpened)="onRecordOpened($event)"
|
|
27
|
-
* (sortChanged)="onSortChanged($event)">
|
|
28
|
-
* </mj-entity-grid>
|
|
29
|
-
* ```
|
|
30
|
-
*/
|
|
31
|
-
export declare class EntityGridComponent implements OnInit, OnChanges {
|
|
32
|
-
/**
|
|
33
|
-
* The entity metadata for the records being displayed
|
|
34
|
-
*/
|
|
35
|
-
entity: EntityInfo | null;
|
|
36
|
-
/**
|
|
37
|
-
* The records to display in the grid (optional - component can load its own)
|
|
38
|
-
*/
|
|
39
|
-
records: BaseEntity[] | null;
|
|
40
|
-
/**
|
|
41
|
-
* The currently selected record's primary key string
|
|
42
|
-
*/
|
|
43
|
-
selectedRecordId: string | null;
|
|
44
|
-
/**
|
|
45
|
-
* Custom column definitions (optional - auto-generated if not provided)
|
|
46
|
-
*/
|
|
47
|
-
columns: GridColumnDef[];
|
|
48
|
-
/**
|
|
49
|
-
* Height of the grid (CSS value)
|
|
50
|
-
* @default '100%'
|
|
51
|
-
*/
|
|
52
|
-
height: string;
|
|
53
|
-
/**
|
|
54
|
-
* Whether to enable row selection
|
|
55
|
-
* @default true
|
|
56
|
-
*/
|
|
57
|
-
enableSelection: boolean;
|
|
58
|
-
/**
|
|
59
|
-
* Filter text for highlighting matches in cells
|
|
60
|
-
* Supports SQL-style % wildcards
|
|
61
|
-
*/
|
|
62
|
-
filterText: string;
|
|
63
|
-
/**
|
|
64
|
-
* Current sort state (for external control)
|
|
65
|
-
*/
|
|
66
|
-
sortState: SortState | null;
|
|
67
|
-
/**
|
|
68
|
-
* Whether sorting is handled server-side
|
|
69
|
-
* When true, sort changes emit events but don't sort locally
|
|
70
|
-
* @default true
|
|
71
|
-
*/
|
|
72
|
-
serverSideSorting: boolean;
|
|
73
|
-
/**
|
|
74
|
-
* Page size for standalone data loading
|
|
75
|
-
* @default 100
|
|
76
|
-
*/
|
|
77
|
-
pageSize: number;
|
|
78
|
-
/**
|
|
79
|
-
* Grid state from a User View - controls columns, widths, order, sort
|
|
80
|
-
* When provided, this takes precedence over auto-generated columns
|
|
81
|
-
*/
|
|
82
|
-
gridState: ViewGridStateConfig | null;
|
|
83
|
-
/**
|
|
84
|
-
* Emitted when a record is selected (single click)
|
|
85
|
-
*/
|
|
86
|
-
recordSelected: EventEmitter<RecordSelectedEvent>;
|
|
87
|
-
/**
|
|
88
|
-
* Emitted when a record should be opened (double click)
|
|
89
|
-
*/
|
|
90
|
-
recordOpened: EventEmitter<RecordOpenedEvent>;
|
|
91
|
-
/**
|
|
92
|
-
* Emitted when sort state changes
|
|
93
|
-
*/
|
|
94
|
-
sortChanged: EventEmitter<SortChangedEvent>;
|
|
95
|
-
/**
|
|
96
|
-
* Emitted when grid state changes (column resize, reorder, etc.)
|
|
97
|
-
*/
|
|
98
|
-
gridStateChanged: EventEmitter<GridStateChangedEvent>;
|
|
99
|
-
/** AG Grid column definitions */
|
|
100
|
-
columnDefs: ColDef[];
|
|
101
|
-
/** AG Grid row data */
|
|
102
|
-
rowData: Record<string, unknown>[];
|
|
103
|
-
/** AG Grid API reference */
|
|
104
|
-
private gridApi;
|
|
105
|
-
/** Internal records when loading standalone */
|
|
106
|
-
private internalRecords;
|
|
107
|
-
/** Track if we're in standalone mode (no external records provided) */
|
|
108
|
-
private standaloneMode;
|
|
109
|
-
/** Loading state for standalone mode */
|
|
110
|
-
isLoading: boolean;
|
|
111
|
-
/** Suppress sort changed events during programmatic sort updates */
|
|
112
|
-
private suppressSortEvents;
|
|
113
|
-
/** Default column settings */
|
|
114
|
-
defaultColDef: ColDef;
|
|
115
|
-
/** AG Grid theme (v34+) */
|
|
116
|
-
theme: import("ag-grid-community").Theme<import("ag-grid-community").ThemeDefaultParams>;
|
|
117
|
-
/** Row selection configuration (v34+ object-based API) */
|
|
118
|
-
rowSelection: RowSelectionOptions;
|
|
119
|
-
/** Get row ID function for AG Grid */
|
|
120
|
-
getRowId: (params: GetRowIdParams<Record<string, unknown>>) => string;
|
|
121
|
-
ngOnInit(): void;
|
|
122
|
-
ngOnChanges(changes: SimpleChanges): void;
|
|
123
|
-
/**
|
|
124
|
-
* Get effective records (external or internal)
|
|
125
|
-
*/
|
|
126
|
-
private get effectiveRecords();
|
|
127
|
-
/**
|
|
128
|
-
* Load data in standalone mode
|
|
129
|
-
*/
|
|
130
|
-
private loadData;
|
|
131
|
-
/**
|
|
132
|
-
* Handle AG Grid ready event
|
|
133
|
-
*/
|
|
134
|
-
onGridReady(event: GridReadyEvent): void;
|
|
135
|
-
/**
|
|
136
|
-
* Handle AG Grid sort changed event
|
|
137
|
-
*/
|
|
138
|
-
onGridSortChanged(event: AgSortChangedEvent): void;
|
|
139
|
-
/**
|
|
140
|
-
* Handle column resized event
|
|
141
|
-
*/
|
|
142
|
-
onColumnResized(event: ColumnResizedEvent): void;
|
|
143
|
-
/**
|
|
144
|
-
* Handle column moved event
|
|
145
|
-
*/
|
|
146
|
-
onColumnMoved(event: ColumnMovedEvent): void;
|
|
147
|
-
/**
|
|
148
|
-
* Emit grid state changed event with current column/sort state
|
|
149
|
-
*/
|
|
150
|
-
private emitGridStateChanged;
|
|
151
|
-
/**
|
|
152
|
-
* Build current grid state from AG Grid's column state
|
|
153
|
-
*/
|
|
154
|
-
private buildCurrentGridState;
|
|
155
|
-
/**
|
|
156
|
-
* Apply external sort state to the grid
|
|
157
|
-
*/
|
|
158
|
-
private applySortStateToGrid;
|
|
159
|
-
/**
|
|
160
|
-
* Handle row click event
|
|
161
|
-
*/
|
|
162
|
-
onRowClicked(event: RowClickedEvent): void;
|
|
163
|
-
/**
|
|
164
|
-
* Handle row double-click event
|
|
165
|
-
*/
|
|
166
|
-
onRowDoubleClicked(event: RowDoubleClickedEvent): void;
|
|
167
|
-
/**
|
|
168
|
-
* Build AG Grid column definitions from gridState, custom columns, or entity metadata
|
|
169
|
-
* Priority: gridState > custom columns > auto-generated
|
|
170
|
-
*/
|
|
171
|
-
private buildColumnDefs;
|
|
172
|
-
/**
|
|
173
|
-
* Build column definitions from gridState column settings
|
|
174
|
-
*/
|
|
175
|
-
private buildColumnDefsFromGridState;
|
|
176
|
-
/**
|
|
177
|
-
* Map custom column definition to AG Grid ColDef
|
|
178
|
-
*/
|
|
179
|
-
private mapCustomColumnDef;
|
|
180
|
-
/**
|
|
181
|
-
* Auto-generate column definitions from entity metadata
|
|
182
|
-
*/
|
|
183
|
-
private generateColumnDefs;
|
|
184
|
-
/**
|
|
185
|
-
* Cell renderer that highlights matching text
|
|
186
|
-
* Uses HighlightUtil which only highlights if the text actually matches the pattern
|
|
187
|
-
*/
|
|
188
|
-
private highlightCellRenderer;
|
|
189
|
-
/**
|
|
190
|
-
* Determine if a field should be shown in the grid
|
|
191
|
-
*/
|
|
192
|
-
private shouldShowField;
|
|
193
|
-
/**
|
|
194
|
-
* Estimate appropriate column width based on field type
|
|
195
|
-
*/
|
|
196
|
-
private estimateColumnWidth;
|
|
197
|
-
/**
|
|
198
|
-
* Get value formatter for a field based on its type
|
|
199
|
-
*/
|
|
200
|
-
private getValueFormatter;
|
|
201
|
-
/**
|
|
202
|
-
* Build row data from entity records
|
|
203
|
-
*/
|
|
204
|
-
private buildRowData;
|
|
205
|
-
/**
|
|
206
|
-
* Update grid selection to match selectedRecordId and scroll to the selected row
|
|
207
|
-
*/
|
|
208
|
-
private updateSelection;
|
|
209
|
-
/**
|
|
210
|
-
* Find a record by its primary key string
|
|
211
|
-
*/
|
|
212
|
-
private findRecordByPk;
|
|
213
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<EntityGridComponent, never>;
|
|
214
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<EntityGridComponent, "mj-entity-grid", never, { "entity": { "alias": "entity"; "required": false; }; "records": { "alias": "records"; "required": false; }; "selectedRecordId": { "alias": "selectedRecordId"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "height": { "alias": "height"; "required": false; }; "enableSelection": { "alias": "enableSelection"; "required": false; }; "filterText": { "alias": "filterText"; "required": false; }; "sortState": { "alias": "sortState"; "required": false; }; "serverSideSorting": { "alias": "serverSideSorting"; "required": false; }; "pageSize": { "alias": "pageSize"; "required": false; }; "gridState": { "alias": "gridState"; "required": false; }; }, { "recordSelected": "recordSelected"; "recordOpened": "recordOpened"; "sortChanged": "sortChanged"; "gridStateChanged": "gridStateChanged"; }, never, never, false, never>;
|
|
215
|
-
}
|
|
216
|
-
//# sourceMappingURL=entity-grid.component.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entity-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/entity-grid/entity-grid.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,676 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { RunView } from '@memberjunction/core';
|
|
3
|
-
import { ModuleRegistry, AllCommunityModule, themeAlpine } from 'ag-grid-community';
|
|
4
|
-
import { HighlightUtil } from '../utils/highlight.util';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "ag-grid-angular";
|
|
7
|
-
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
8
|
-
function EntityGridComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
9
|
-
i0.ɵɵelementStart(0, "div", 1);
|
|
10
|
-
i0.ɵɵelement(1, "mj-loading", 5);
|
|
11
|
-
i0.ɵɵelementEnd();
|
|
12
|
-
} }
|
|
13
|
-
function EntityGridComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
14
|
-
const _r1 = i0.ɵɵgetCurrentView();
|
|
15
|
-
i0.ɵɵelementStart(0, "ag-grid-angular", 6);
|
|
16
|
-
i0.ɵɵlistener("gridReady", function EntityGridComponent_Conditional_2_Template_ag_grid_angular_gridReady_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onGridReady($event)); })("rowClicked", function EntityGridComponent_Conditional_2_Template_ag_grid_angular_rowClicked_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRowClicked($event)); })("rowDoubleClicked", function EntityGridComponent_Conditional_2_Template_ag_grid_angular_rowDoubleClicked_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRowDoubleClicked($event)); })("sortChanged", function EntityGridComponent_Conditional_2_Template_ag_grid_angular_sortChanged_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onGridSortChanged($event)); })("columnResized", function EntityGridComponent_Conditional_2_Template_ag_grid_angular_columnResized_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onColumnResized($event)); })("columnMoved", function EntityGridComponent_Conditional_2_Template_ag_grid_angular_columnMoved_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onColumnMoved($event)); });
|
|
17
|
-
i0.ɵɵelementEnd();
|
|
18
|
-
} if (rf & 2) {
|
|
19
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
20
|
-
i0.ɵɵproperty("theme", ctx_r1.theme)("columnDefs", ctx_r1.columnDefs)("rowData", ctx_r1.rowData)("defaultColDef", ctx_r1.defaultColDef)("rowSelection", ctx_r1.enableSelection ? ctx_r1.rowSelection : undefined)("getRowId", ctx_r1.getRowId)("suppressCellFocus", true);
|
|
21
|
-
} }
|
|
22
|
-
function EntityGridComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
23
|
-
i0.ɵɵelementStart(0, "div", 3);
|
|
24
|
-
i0.ɵɵelement(1, "i", 7);
|
|
25
|
-
i0.ɵɵelementStart(2, "p");
|
|
26
|
-
i0.ɵɵtext(3, "No records to display");
|
|
27
|
-
i0.ɵɵelementEnd()();
|
|
28
|
-
} }
|
|
29
|
-
function EntityGridComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
30
|
-
i0.ɵɵelementStart(0, "div", 4);
|
|
31
|
-
i0.ɵɵelement(1, "i", 8);
|
|
32
|
-
i0.ɵɵelementStart(2, "p");
|
|
33
|
-
i0.ɵɵtext(3, "Select an entity to view records");
|
|
34
|
-
i0.ɵɵelementEnd()();
|
|
35
|
-
} }
|
|
36
|
-
// Register AG Grid modules (required for v34+)
|
|
37
|
-
ModuleRegistry.registerModules([AllCommunityModule]);
|
|
38
|
-
/**
|
|
39
|
-
* EntityGridComponent - AG Grid based table view for entity records
|
|
40
|
-
*
|
|
41
|
-
* This component provides a lightweight, customizable grid view for displaying
|
|
42
|
-
* entity records. It uses AG Grid Community edition for high-performance rendering.
|
|
43
|
-
*
|
|
44
|
-
* Supports two modes:
|
|
45
|
-
* 1. Parent-managed data: Records are passed in via [records] input
|
|
46
|
-
* 2. Standalone: Component loads its own data with pagination
|
|
47
|
-
*
|
|
48
|
-
* @example
|
|
49
|
-
* ```html
|
|
50
|
-
* <mj-entity-grid
|
|
51
|
-
* [entity]="selectedEntity"
|
|
52
|
-
* [records]="filteredRecords"
|
|
53
|
-
* [selectedRecordId]="selectedId"
|
|
54
|
-
* [sortState]="currentSort"
|
|
55
|
-
* [serverSideSorting]="true"
|
|
56
|
-
* (recordSelected)="onRecordSelected($event)"
|
|
57
|
-
* (recordOpened)="onRecordOpened($event)"
|
|
58
|
-
* (sortChanged)="onSortChanged($event)">
|
|
59
|
-
* </mj-entity-grid>
|
|
60
|
-
* ```
|
|
61
|
-
*/
|
|
62
|
-
export class EntityGridComponent {
|
|
63
|
-
/**
|
|
64
|
-
* The entity metadata for the records being displayed
|
|
65
|
-
*/
|
|
66
|
-
entity = null;
|
|
67
|
-
/**
|
|
68
|
-
* The records to display in the grid (optional - component can load its own)
|
|
69
|
-
*/
|
|
70
|
-
records = null;
|
|
71
|
-
/**
|
|
72
|
-
* The currently selected record's primary key string
|
|
73
|
-
*/
|
|
74
|
-
selectedRecordId = null;
|
|
75
|
-
/**
|
|
76
|
-
* Custom column definitions (optional - auto-generated if not provided)
|
|
77
|
-
*/
|
|
78
|
-
columns = [];
|
|
79
|
-
/**
|
|
80
|
-
* Height of the grid (CSS value)
|
|
81
|
-
* @default '100%'
|
|
82
|
-
*/
|
|
83
|
-
height = '100%';
|
|
84
|
-
/**
|
|
85
|
-
* Whether to enable row selection
|
|
86
|
-
* @default true
|
|
87
|
-
*/
|
|
88
|
-
enableSelection = true;
|
|
89
|
-
/**
|
|
90
|
-
* Filter text for highlighting matches in cells
|
|
91
|
-
* Supports SQL-style % wildcards
|
|
92
|
-
*/
|
|
93
|
-
filterText = '';
|
|
94
|
-
/**
|
|
95
|
-
* Current sort state (for external control)
|
|
96
|
-
*/
|
|
97
|
-
sortState = null;
|
|
98
|
-
/**
|
|
99
|
-
* Whether sorting is handled server-side
|
|
100
|
-
* When true, sort changes emit events but don't sort locally
|
|
101
|
-
* @default true
|
|
102
|
-
*/
|
|
103
|
-
serverSideSorting = true;
|
|
104
|
-
/**
|
|
105
|
-
* Page size for standalone data loading
|
|
106
|
-
* @default 100
|
|
107
|
-
*/
|
|
108
|
-
pageSize = 100;
|
|
109
|
-
/**
|
|
110
|
-
* Grid state from a User View - controls columns, widths, order, sort
|
|
111
|
-
* When provided, this takes precedence over auto-generated columns
|
|
112
|
-
*/
|
|
113
|
-
gridState = null;
|
|
114
|
-
/**
|
|
115
|
-
* Emitted when a record is selected (single click)
|
|
116
|
-
*/
|
|
117
|
-
recordSelected = new EventEmitter();
|
|
118
|
-
/**
|
|
119
|
-
* Emitted when a record should be opened (double click)
|
|
120
|
-
*/
|
|
121
|
-
recordOpened = new EventEmitter();
|
|
122
|
-
/**
|
|
123
|
-
* Emitted when sort state changes
|
|
124
|
-
*/
|
|
125
|
-
sortChanged = new EventEmitter();
|
|
126
|
-
/**
|
|
127
|
-
* Emitted when grid state changes (column resize, reorder, etc.)
|
|
128
|
-
*/
|
|
129
|
-
gridStateChanged = new EventEmitter();
|
|
130
|
-
/** AG Grid column definitions */
|
|
131
|
-
columnDefs = [];
|
|
132
|
-
/** AG Grid row data */
|
|
133
|
-
rowData = [];
|
|
134
|
-
/** AG Grid API reference */
|
|
135
|
-
gridApi = null;
|
|
136
|
-
/** Internal records when loading standalone */
|
|
137
|
-
internalRecords = [];
|
|
138
|
-
/** Track if we're in standalone mode (no external records provided) */
|
|
139
|
-
standaloneMode = false;
|
|
140
|
-
/** Loading state for standalone mode */
|
|
141
|
-
isLoading = false;
|
|
142
|
-
/** Suppress sort changed events during programmatic sort updates */
|
|
143
|
-
suppressSortEvents = false;
|
|
144
|
-
/** Default column settings */
|
|
145
|
-
defaultColDef = {
|
|
146
|
-
sortable: true,
|
|
147
|
-
filter: false, // Filtering is handled at the parent level
|
|
148
|
-
resizable: true,
|
|
149
|
-
minWidth: 80
|
|
150
|
-
};
|
|
151
|
-
/** AG Grid theme (v34+) */
|
|
152
|
-
theme = themeAlpine;
|
|
153
|
-
/** Row selection configuration (v34+ object-based API) */
|
|
154
|
-
rowSelection = {
|
|
155
|
-
mode: 'singleRow'
|
|
156
|
-
};
|
|
157
|
-
/** Get row ID function for AG Grid */
|
|
158
|
-
getRowId = (params) => params.data['__pk'];
|
|
159
|
-
ngOnInit() {
|
|
160
|
-
this.standaloneMode = this.records === null;
|
|
161
|
-
this.buildColumnDefs();
|
|
162
|
-
if (this.standaloneMode && this.entity) {
|
|
163
|
-
this.loadData();
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
this.buildRowData();
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
ngOnChanges(changes) {
|
|
170
|
-
if (changes['entity'] || changes['columns'] || changes['gridState']) {
|
|
171
|
-
this.buildColumnDefs();
|
|
172
|
-
}
|
|
173
|
-
if (changes['entity'] && this.standaloneMode && this.entity) {
|
|
174
|
-
this.loadData();
|
|
175
|
-
}
|
|
176
|
-
if (changes['records']) {
|
|
177
|
-
this.standaloneMode = this.records === null;
|
|
178
|
-
if (!this.standaloneMode) {
|
|
179
|
-
this.buildRowData();
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
if (changes['selectedRecordId'] && this.gridApi) {
|
|
183
|
-
this.updateSelection();
|
|
184
|
-
}
|
|
185
|
-
// When filter text changes, refresh the grid to update highlighting
|
|
186
|
-
if (changes['filterText'] && this.gridApi) {
|
|
187
|
-
this.gridApi.refreshCells({ force: true });
|
|
188
|
-
}
|
|
189
|
-
// Handle external sort state changes
|
|
190
|
-
if (changes['sortState'] && this.gridApi && this.sortState) {
|
|
191
|
-
this.applySortStateToGrid();
|
|
192
|
-
}
|
|
193
|
-
// Handle gridState changes - apply sort if present
|
|
194
|
-
if (changes['gridState'] && this.gridApi && this.gridState?.sortSettings?.length) {
|
|
195
|
-
const sortSetting = this.gridState.sortSettings[0];
|
|
196
|
-
this.sortState = {
|
|
197
|
-
field: sortSetting.field,
|
|
198
|
-
direction: sortSetting.dir
|
|
199
|
-
};
|
|
200
|
-
this.applySortStateToGrid();
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Get effective records (external or internal)
|
|
205
|
-
*/
|
|
206
|
-
get effectiveRecords() {
|
|
207
|
-
return this.records ?? this.internalRecords;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Load data in standalone mode
|
|
211
|
-
*/
|
|
212
|
-
async loadData() {
|
|
213
|
-
if (!this.entity)
|
|
214
|
-
return;
|
|
215
|
-
this.isLoading = true;
|
|
216
|
-
try {
|
|
217
|
-
const rv = new RunView();
|
|
218
|
-
// Build OrderBy from sort state
|
|
219
|
-
let orderBy;
|
|
220
|
-
if (this.sortState?.field && this.sortState.direction) {
|
|
221
|
-
orderBy = `${this.sortState.field} ${this.sortState.direction.toUpperCase()}`;
|
|
222
|
-
}
|
|
223
|
-
const result = await rv.RunView({
|
|
224
|
-
EntityName: this.entity.Name,
|
|
225
|
-
ResultType: 'entity_object',
|
|
226
|
-
MaxRows: this.pageSize,
|
|
227
|
-
OrderBy: orderBy
|
|
228
|
-
});
|
|
229
|
-
if (result.Success) {
|
|
230
|
-
this.internalRecords = result.Results;
|
|
231
|
-
this.buildRowData();
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
catch (error) {
|
|
235
|
-
console.error('Error loading grid data:', error);
|
|
236
|
-
}
|
|
237
|
-
finally {
|
|
238
|
-
this.isLoading = false;
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Handle AG Grid ready event
|
|
243
|
-
*/
|
|
244
|
-
onGridReady(event) {
|
|
245
|
-
this.gridApi = event.api;
|
|
246
|
-
this.updateSelection();
|
|
247
|
-
// Apply initial sort state if provided
|
|
248
|
-
if (this.sortState) {
|
|
249
|
-
this.applySortStateToGrid();
|
|
250
|
-
}
|
|
251
|
-
// Auto-size columns to fit content
|
|
252
|
-
event.api.sizeColumnsToFit();
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Handle AG Grid sort changed event
|
|
256
|
-
*/
|
|
257
|
-
onGridSortChanged(event) {
|
|
258
|
-
if (this.suppressSortEvents)
|
|
259
|
-
return;
|
|
260
|
-
const sortModel = event.api.getColumnState()
|
|
261
|
-
.filter(col => col.sort)
|
|
262
|
-
.map(col => ({ field: col.colId, direction: col.sort }));
|
|
263
|
-
if (sortModel.length > 0) {
|
|
264
|
-
const newSort = {
|
|
265
|
-
field: sortModel[0].field,
|
|
266
|
-
direction: sortModel[0].direction
|
|
267
|
-
};
|
|
268
|
-
this.sortChanged.emit({ sort: newSort });
|
|
269
|
-
// Also emit as grid state change
|
|
270
|
-
this.emitGridStateChanged('sort');
|
|
271
|
-
// If in standalone mode and server-side sorting, reload data
|
|
272
|
-
if (this.standaloneMode && this.serverSideSorting) {
|
|
273
|
-
// The parent should handle this, but if standalone, reload
|
|
274
|
-
this.loadData();
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
else {
|
|
278
|
-
this.sortChanged.emit({ sort: null });
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Handle column resized event
|
|
283
|
-
*/
|
|
284
|
-
onColumnResized(event) {
|
|
285
|
-
// Only emit on finished (not during drag)
|
|
286
|
-
if (event.finished && event.source !== 'api') {
|
|
287
|
-
this.emitGridStateChanged('columns');
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Handle column moved event
|
|
292
|
-
*/
|
|
293
|
-
onColumnMoved(event) {
|
|
294
|
-
// Only emit when the drag is finished
|
|
295
|
-
if (event.finished && event.source !== 'api') {
|
|
296
|
-
this.emitGridStateChanged('columns');
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* Emit grid state changed event with current column/sort state
|
|
301
|
-
*/
|
|
302
|
-
emitGridStateChanged(changeType) {
|
|
303
|
-
if (!this.gridApi || !this.entity)
|
|
304
|
-
return;
|
|
305
|
-
const currentState = this.buildCurrentGridState();
|
|
306
|
-
this.gridStateChanged.emit({
|
|
307
|
-
gridState: currentState,
|
|
308
|
-
changeType
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* Build current grid state from AG Grid's column state
|
|
313
|
-
*/
|
|
314
|
-
buildCurrentGridState() {
|
|
315
|
-
if (!this.gridApi || !this.entity) {
|
|
316
|
-
return { columnSettings: [], sortSettings: [] };
|
|
317
|
-
}
|
|
318
|
-
const columnState = this.gridApi.getColumnState();
|
|
319
|
-
const columnSettings = [];
|
|
320
|
-
const sortSettings = [];
|
|
321
|
-
for (let i = 0; i < columnState.length; i++) {
|
|
322
|
-
const col = columnState[i];
|
|
323
|
-
const field = this.entity.Fields.find(f => f.Name === col.colId);
|
|
324
|
-
if (field) {
|
|
325
|
-
columnSettings.push({
|
|
326
|
-
ID: field.ID,
|
|
327
|
-
Name: field.Name,
|
|
328
|
-
DisplayName: field.DisplayNameOrName,
|
|
329
|
-
hidden: col.hide ?? false,
|
|
330
|
-
width: col.width ?? undefined,
|
|
331
|
-
orderIndex: i
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
// Capture sort settings
|
|
335
|
-
if (col.sort) {
|
|
336
|
-
sortSettings.push({
|
|
337
|
-
field: col.colId,
|
|
338
|
-
dir: col.sort
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
return { columnSettings, sortSettings };
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* Apply external sort state to the grid
|
|
346
|
-
*/
|
|
347
|
-
applySortStateToGrid() {
|
|
348
|
-
if (!this.gridApi || !this.sortState)
|
|
349
|
-
return;
|
|
350
|
-
this.suppressSortEvents = true;
|
|
351
|
-
try {
|
|
352
|
-
const columnState = this.gridApi.getColumnState().map(col => ({
|
|
353
|
-
...col,
|
|
354
|
-
sort: col.colId === this.sortState.field ? this.sortState.direction : null,
|
|
355
|
-
sortIndex: col.colId === this.sortState.field ? 0 : null
|
|
356
|
-
}));
|
|
357
|
-
this.gridApi.applyColumnState({ state: columnState });
|
|
358
|
-
}
|
|
359
|
-
finally {
|
|
360
|
-
this.suppressSortEvents = false;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Handle row click event
|
|
365
|
-
*/
|
|
366
|
-
onRowClicked(event) {
|
|
367
|
-
if (!this.entity || !event.data)
|
|
368
|
-
return;
|
|
369
|
-
const record = this.findRecordByPk(event.data['__pk']);
|
|
370
|
-
if (!record)
|
|
371
|
-
return;
|
|
372
|
-
this.recordSelected.emit({
|
|
373
|
-
record,
|
|
374
|
-
entity: this.entity,
|
|
375
|
-
compositeKey: record.PrimaryKey
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* Handle row double-click event
|
|
380
|
-
*/
|
|
381
|
-
onRowDoubleClicked(event) {
|
|
382
|
-
if (!this.entity || !event.data)
|
|
383
|
-
return;
|
|
384
|
-
const record = this.findRecordByPk(event.data['__pk']);
|
|
385
|
-
if (!record)
|
|
386
|
-
return;
|
|
387
|
-
this.recordOpened.emit({
|
|
388
|
-
record,
|
|
389
|
-
entity: this.entity,
|
|
390
|
-
compositeKey: record.PrimaryKey
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* Build AG Grid column definitions from gridState, custom columns, or entity metadata
|
|
395
|
-
* Priority: gridState > custom columns > auto-generated
|
|
396
|
-
*/
|
|
397
|
-
buildColumnDefs() {
|
|
398
|
-
if (this.gridState?.columnSettings && this.gridState.columnSettings.length > 0 && this.entity) {
|
|
399
|
-
// Use gridState column configuration (from User View)
|
|
400
|
-
this.columnDefs = this.buildColumnDefsFromGridState(this.gridState.columnSettings);
|
|
401
|
-
}
|
|
402
|
-
else if (this.columns.length > 0) {
|
|
403
|
-
// Use custom column definitions
|
|
404
|
-
this.columnDefs = this.columns.map(col => this.mapCustomColumnDef(col));
|
|
405
|
-
}
|
|
406
|
-
else if (this.entity) {
|
|
407
|
-
// Auto-generate from entity metadata
|
|
408
|
-
this.columnDefs = this.generateColumnDefs(this.entity);
|
|
409
|
-
}
|
|
410
|
-
else {
|
|
411
|
-
this.columnDefs = [];
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
/**
|
|
415
|
-
* Build column definitions from gridState column settings
|
|
416
|
-
*/
|
|
417
|
-
buildColumnDefsFromGridState(columnSettings) {
|
|
418
|
-
if (!this.entity)
|
|
419
|
-
return [];
|
|
420
|
-
// Sort by orderIndex
|
|
421
|
-
const sortedColumns = [...columnSettings].sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));
|
|
422
|
-
const cols = [];
|
|
423
|
-
for (const colConfig of sortedColumns) {
|
|
424
|
-
// Skip hidden columns
|
|
425
|
-
if (colConfig.hidden)
|
|
426
|
-
continue;
|
|
427
|
-
// Find the corresponding entity field
|
|
428
|
-
const field = this.entity.Fields.find(f => f.Name.toLowerCase() === colConfig.Name.toLowerCase());
|
|
429
|
-
if (!field)
|
|
430
|
-
continue;
|
|
431
|
-
const colDef = {
|
|
432
|
-
field: field.Name,
|
|
433
|
-
headerName: colConfig.DisplayName || field.DisplayNameOrName,
|
|
434
|
-
width: colConfig.width || this.estimateColumnWidth(field),
|
|
435
|
-
sortable: true,
|
|
436
|
-
resizable: true
|
|
437
|
-
};
|
|
438
|
-
// For string fields, use a cell renderer that supports highlighting
|
|
439
|
-
if (field.TSType === 'string') {
|
|
440
|
-
colDef.cellRenderer = (params) => this.highlightCellRenderer(params);
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
// For non-string fields, use value formatter
|
|
444
|
-
colDef.valueFormatter = this.getValueFormatter(field);
|
|
445
|
-
}
|
|
446
|
-
cols.push(colDef);
|
|
447
|
-
}
|
|
448
|
-
return cols;
|
|
449
|
-
}
|
|
450
|
-
/**
|
|
451
|
-
* Map custom column definition to AG Grid ColDef
|
|
452
|
-
*/
|
|
453
|
-
mapCustomColumnDef(col) {
|
|
454
|
-
return {
|
|
455
|
-
field: col.field,
|
|
456
|
-
headerName: col.headerName,
|
|
457
|
-
width: col.width,
|
|
458
|
-
minWidth: col.minWidth,
|
|
459
|
-
maxWidth: col.maxWidth,
|
|
460
|
-
sortable: col.sortable ?? true,
|
|
461
|
-
filter: false, // Filtering handled at parent level
|
|
462
|
-
resizable: col.resizable ?? true,
|
|
463
|
-
hide: col.hide ?? false
|
|
464
|
-
};
|
|
465
|
-
}
|
|
466
|
-
/**
|
|
467
|
-
* Auto-generate column definitions from entity metadata
|
|
468
|
-
*/
|
|
469
|
-
generateColumnDefs(entity) {
|
|
470
|
-
const cols = [];
|
|
471
|
-
// Filter fields to show
|
|
472
|
-
const visibleFields = entity.Fields.filter(f => this.shouldShowField(f));
|
|
473
|
-
for (const field of visibleFields) {
|
|
474
|
-
const colDef = {
|
|
475
|
-
field: field.Name,
|
|
476
|
-
headerName: field.DisplayNameOrName,
|
|
477
|
-
width: this.estimateColumnWidth(field),
|
|
478
|
-
sortable: true,
|
|
479
|
-
resizable: true
|
|
480
|
-
};
|
|
481
|
-
// For string fields, use a cell renderer that supports highlighting
|
|
482
|
-
if (field.TSType === 'string') {
|
|
483
|
-
colDef.cellRenderer = (params) => this.highlightCellRenderer(params);
|
|
484
|
-
}
|
|
485
|
-
else {
|
|
486
|
-
// For non-string fields, use value formatter
|
|
487
|
-
colDef.valueFormatter = this.getValueFormatter(field);
|
|
488
|
-
}
|
|
489
|
-
cols.push(colDef);
|
|
490
|
-
}
|
|
491
|
-
return cols;
|
|
492
|
-
}
|
|
493
|
-
/**
|
|
494
|
-
* Cell renderer that highlights matching text
|
|
495
|
-
* Uses HighlightUtil which only highlights if the text actually matches the pattern
|
|
496
|
-
*/
|
|
497
|
-
highlightCellRenderer(params) {
|
|
498
|
-
const value = params.value;
|
|
499
|
-
if (value === null || value === undefined)
|
|
500
|
-
return '';
|
|
501
|
-
const text = String(value);
|
|
502
|
-
return HighlightUtil.highlight(text, this.filterText, true);
|
|
503
|
-
}
|
|
504
|
-
/**
|
|
505
|
-
* Determine if a field should be shown in the grid
|
|
506
|
-
*/
|
|
507
|
-
shouldShowField(field) {
|
|
508
|
-
// Skip internal MJ fields
|
|
509
|
-
if (field.Name.startsWith('__mj_'))
|
|
510
|
-
return false;
|
|
511
|
-
// Skip primary key if it's a GUID (usually not useful to display)
|
|
512
|
-
if (field.IsPrimaryKey && field.SQLFullType?.toLowerCase() === 'uniqueidentifier') {
|
|
513
|
-
return false;
|
|
514
|
-
}
|
|
515
|
-
// Prefer DefaultInView fields
|
|
516
|
-
if (field.DefaultInView === true)
|
|
517
|
-
return true;
|
|
518
|
-
// Skip large text fields by default
|
|
519
|
-
if (field.Length > 500)
|
|
520
|
-
return false;
|
|
521
|
-
return true;
|
|
522
|
-
}
|
|
523
|
-
/**
|
|
524
|
-
* Estimate appropriate column width based on field type
|
|
525
|
-
*/
|
|
526
|
-
estimateColumnWidth(field) {
|
|
527
|
-
if (field.TSType === 'boolean')
|
|
528
|
-
return 100;
|
|
529
|
-
if (field.TSType === 'number')
|
|
530
|
-
return 120;
|
|
531
|
-
if (field.TSType === 'Date')
|
|
532
|
-
return 150;
|
|
533
|
-
if (field.Name.toLowerCase().includes('id'))
|
|
534
|
-
return 100;
|
|
535
|
-
if (field.Name.toLowerCase().includes('email'))
|
|
536
|
-
return 200;
|
|
537
|
-
if (field.Name.toLowerCase().includes('name'))
|
|
538
|
-
return 180;
|
|
539
|
-
// Default based on length
|
|
540
|
-
const charWidth = 8;
|
|
541
|
-
const padding = 20;
|
|
542
|
-
const estimatedWidth = Math.min(Math.max(field.Length * charWidth / 2, 100), 300) + padding;
|
|
543
|
-
return estimatedWidth;
|
|
544
|
-
}
|
|
545
|
-
/**
|
|
546
|
-
* Get value formatter for a field based on its type
|
|
547
|
-
*/
|
|
548
|
-
getValueFormatter(field) {
|
|
549
|
-
if (field.TSType === 'Date') {
|
|
550
|
-
return (params) => {
|
|
551
|
-
if (!params.value)
|
|
552
|
-
return '';
|
|
553
|
-
const date = params.value instanceof Date ? params.value : new Date(params.value);
|
|
554
|
-
if (isNaN(date.getTime()))
|
|
555
|
-
return String(params.value);
|
|
556
|
-
return date.toLocaleDateString(undefined, {
|
|
557
|
-
month: 'short',
|
|
558
|
-
day: 'numeric',
|
|
559
|
-
year: 'numeric'
|
|
560
|
-
});
|
|
561
|
-
};
|
|
562
|
-
}
|
|
563
|
-
if (field.TSType === 'boolean') {
|
|
564
|
-
return (params) => {
|
|
565
|
-
if (params.value === null || params.value === undefined)
|
|
566
|
-
return '';
|
|
567
|
-
return params.value ? 'Yes' : 'No';
|
|
568
|
-
};
|
|
569
|
-
}
|
|
570
|
-
if (field.TSType === 'number') {
|
|
571
|
-
const fieldNameLower = field.Name.toLowerCase();
|
|
572
|
-
const isCurrency = fieldNameLower.includes('amount') ||
|
|
573
|
-
fieldNameLower.includes('price') ||
|
|
574
|
-
fieldNameLower.includes('cost') ||
|
|
575
|
-
fieldNameLower.includes('total');
|
|
576
|
-
if (isCurrency) {
|
|
577
|
-
return (params) => {
|
|
578
|
-
if (params.value === null || params.value === undefined)
|
|
579
|
-
return '';
|
|
580
|
-
const num = Number(params.value);
|
|
581
|
-
if (isNaN(num))
|
|
582
|
-
return String(params.value);
|
|
583
|
-
return `$${num.toLocaleString()}`;
|
|
584
|
-
};
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
return undefined;
|
|
588
|
-
}
|
|
589
|
-
/**
|
|
590
|
-
* Build row data from entity records
|
|
591
|
-
*/
|
|
592
|
-
buildRowData() {
|
|
593
|
-
if (!this.entity) {
|
|
594
|
-
this.rowData = [];
|
|
595
|
-
return;
|
|
596
|
-
}
|
|
597
|
-
const records = this.effectiveRecords;
|
|
598
|
-
this.rowData = records.map(record => {
|
|
599
|
-
const row = {
|
|
600
|
-
__pk: record.PrimaryKey.ToConcatenatedString()
|
|
601
|
-
};
|
|
602
|
-
// Copy all field values
|
|
603
|
-
for (const field of this.entity.Fields) {
|
|
604
|
-
row[field.Name] = record.Get(field.Name);
|
|
605
|
-
}
|
|
606
|
-
return row;
|
|
607
|
-
});
|
|
608
|
-
}
|
|
609
|
-
/**
|
|
610
|
-
* Update grid selection to match selectedRecordId and scroll to the selected row
|
|
611
|
-
*/
|
|
612
|
-
updateSelection() {
|
|
613
|
-
if (!this.gridApi || !this.selectedRecordId) {
|
|
614
|
-
this.gridApi?.deselectAll();
|
|
615
|
-
return;
|
|
616
|
-
}
|
|
617
|
-
const node = this.gridApi.getRowNode(this.selectedRecordId);
|
|
618
|
-
if (node) {
|
|
619
|
-
node.setSelected(true);
|
|
620
|
-
// Scroll the selected row into view (middle of viewport if possible)
|
|
621
|
-
this.gridApi.ensureNodeVisible(node, 'middle');
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
/**
|
|
625
|
-
* Find a record by its primary key string
|
|
626
|
-
*/
|
|
627
|
-
findRecordByPk(pkString) {
|
|
628
|
-
return this.effectiveRecords.find(r => r.PrimaryKey.ToConcatenatedString() === pkString);
|
|
629
|
-
}
|
|
630
|
-
static ɵfac = function EntityGridComponent_Factory(t) { return new (t || EntityGridComponent)(); };
|
|
631
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: EntityGridComponent, selectors: [["mj-entity-grid"]], inputs: { entity: "entity", records: "records", selectedRecordId: "selectedRecordId", columns: "columns", height: "height", enableSelection: "enableSelection", filterText: "filterText", sortState: "sortState", serverSideSorting: "serverSideSorting", pageSize: "pageSize", gridState: "gridState" }, outputs: { recordSelected: "recordSelected", recordOpened: "recordOpened", sortChanged: "sortChanged", gridStateChanged: "gridStateChanged" }, features: [i0.ɵɵNgOnChangesFeature], decls: 5, vars: 3, consts: [[1, "entity-grid-container"], [1, "loading-state"], [1, "entity-grid", 3, "theme", "columnDefs", "rowData", "defaultColDef", "rowSelection", "getRowId", "suppressCellFocus"], [1, "no-data"], [1, "no-entity"], ["text", "Loading...", "size", "medium"], [1, "entity-grid", 3, "gridReady", "rowClicked", "rowDoubleClicked", "sortChanged", "columnResized", "columnMoved", "theme", "columnDefs", "rowData", "defaultColDef", "rowSelection", "getRowId", "suppressCellFocus"], [1, "fa-solid", "fa-inbox"], [1, "fa-solid", "fa-database"]], template: function EntityGridComponent_Template(rf, ctx) { if (rf & 1) {
|
|
632
|
-
i0.ɵɵelementStart(0, "div", 0);
|
|
633
|
-
i0.ɵɵtemplate(1, EntityGridComponent_Conditional_1_Template, 2, 0, "div", 1)(2, EntityGridComponent_Conditional_2_Template, 1, 7, "ag-grid-angular", 2)(3, EntityGridComponent_Conditional_3_Template, 4, 0, "div", 3)(4, EntityGridComponent_Conditional_4_Template, 4, 0, "div", 4);
|
|
634
|
-
i0.ɵɵelementEnd();
|
|
635
|
-
} if (rf & 2) {
|
|
636
|
-
i0.ɵɵstyleProp("height", ctx.height);
|
|
637
|
-
i0.ɵɵadvance();
|
|
638
|
-
i0.ɵɵconditional(ctx.isLoading && ctx.rowData.length === 0 ? 1 : ctx.entity && ctx.rowData.length > 0 ? 2 : ctx.entity && ctx.rowData.length === 0 ? 3 : 4);
|
|
639
|
-
} }, dependencies: [i1.AgGridAngular, i2.LoadingComponent], styles: [".entity-grid-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.entity-grid[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n flex: 1;\n min-height: 0;\n}\n\n\n\n.no-data[_ngcontent-%COMP%], \n.no-entity[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 200px;\n color: #9e9e9e;\n text-align: center;\n}\n\n.no-data[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.no-entity[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n}\n\n.no-data[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.no-entity[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n .highlight-match {\n background-color: #fff176;\n border-radius: 2px;\n}"] });
|
|
640
|
-
}
|
|
641
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EntityGridComponent, [{
|
|
642
|
-
type: Component,
|
|
643
|
-
args: [{ selector: 'mj-entity-grid', template: "<div class=\"entity-grid-container\" [style.height]=\"height\">\n @if (isLoading && rowData.length === 0) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (entity && rowData.length > 0) {\n <ag-grid-angular\n class=\"entity-grid\"\n [theme]=\"theme\"\n [columnDefs]=\"columnDefs\"\n [rowData]=\"rowData\"\n [defaultColDef]=\"defaultColDef\"\n [rowSelection]=\"enableSelection ? rowSelection : undefined\"\n [getRowId]=\"getRowId\"\n [suppressCellFocus]=\"true\"\n (gridReady)=\"onGridReady($event)\"\n (rowClicked)=\"onRowClicked($event)\"\n (rowDoubleClicked)=\"onRowDoubleClicked($event)\"\n (sortChanged)=\"onGridSortChanged($event)\"\n (columnResized)=\"onColumnResized($event)\"\n (columnMoved)=\"onColumnMoved($event)\">\n </ag-grid-angular>\n } @else if (entity && rowData.length === 0) {\n <div class=\"no-data\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No records to display</p>\n </div>\n } @else {\n <div class=\"no-entity\">\n <i class=\"fa-solid fa-database\"></i>\n <p>Select an entity to view records</p>\n </div>\n }\n</div>\n", styles: [".entity-grid-container {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n.entity-grid {\n width: 100%;\n height: 100%;\n flex: 1;\n min-height: 0;\n}\n\n/* Empty states */\n.no-data,\n.no-entity {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n min-height: 200px;\n color: #9e9e9e;\n text-align: center;\n}\n\n.no-data i,\n.no-entity i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n}\n\n.no-data p,\n.no-entity p {\n margin: 0;\n font-size: 14px;\n}\n\n/* Highlight matches in grid cells */\n::ng-deep .highlight-match {\n background-color: #fff176;\n border-radius: 2px;\n}\n"] }]
|
|
644
|
-
}], null, { entity: [{
|
|
645
|
-
type: Input
|
|
646
|
-
}], records: [{
|
|
647
|
-
type: Input
|
|
648
|
-
}], selectedRecordId: [{
|
|
649
|
-
type: Input
|
|
650
|
-
}], columns: [{
|
|
651
|
-
type: Input
|
|
652
|
-
}], height: [{
|
|
653
|
-
type: Input
|
|
654
|
-
}], enableSelection: [{
|
|
655
|
-
type: Input
|
|
656
|
-
}], filterText: [{
|
|
657
|
-
type: Input
|
|
658
|
-
}], sortState: [{
|
|
659
|
-
type: Input
|
|
660
|
-
}], serverSideSorting: [{
|
|
661
|
-
type: Input
|
|
662
|
-
}], pageSize: [{
|
|
663
|
-
type: Input
|
|
664
|
-
}], gridState: [{
|
|
665
|
-
type: Input
|
|
666
|
-
}], recordSelected: [{
|
|
667
|
-
type: Output
|
|
668
|
-
}], recordOpened: [{
|
|
669
|
-
type: Output
|
|
670
|
-
}], sortChanged: [{
|
|
671
|
-
type: Output
|
|
672
|
-
}], gridStateChanged: [{
|
|
673
|
-
type: Output
|
|
674
|
-
}] }); })();
|
|
675
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EntityGridComponent, { className: "EntityGridComponent" }); })();
|
|
676
|
-
//# sourceMappingURL=entity-grid.component.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entity-grid.component.js","sourceRoot":"","sources":["../../../src/lib/entity-grid/entity-grid.component.ts","../../../src/lib/entity-grid/entity-grid.component.html"],"names":[],"mappings":"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"}
|