@memberjunction/ng-entity-viewer 2.132.0 → 3.0.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.
Files changed (42) hide show
  1. package/README.md +317 -124
  2. package/dist/lib/entity-cards/entity-cards.component.js +2 -2
  3. package/dist/lib/entity-cards/entity-cards.component.js.map +1 -1
  4. package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts +793 -0
  5. package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts.map +1 -0
  6. package/dist/lib/entity-data-grid/entity-data-grid.component.js +3781 -0
  7. package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -0
  8. package/dist/lib/entity-data-grid/events/grid-events.d.ts +398 -0
  9. package/dist/lib/entity-data-grid/events/grid-events.d.ts.map +1 -0
  10. package/dist/lib/entity-data-grid/events/grid-events.js +556 -0
  11. package/dist/lib/entity-data-grid/events/grid-events.js.map +1 -0
  12. package/dist/lib/entity-data-grid/models/grid-types.d.ts +437 -0
  13. package/dist/lib/entity-data-grid/models/grid-types.d.ts.map +1 -0
  14. package/dist/lib/entity-data-grid/models/grid-types.js +37 -0
  15. package/dist/lib/entity-data-grid/models/grid-types.js.map +1 -0
  16. package/dist/lib/entity-grid/entity-grid.component.js +1 -1
  17. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js +2 -2
  18. package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js.map +1 -1
  19. package/dist/lib/entity-viewer/entity-viewer.component.d.ts +136 -2
  20. package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -1
  21. package/dist/lib/entity-viewer/entity-viewer.component.js +321 -94
  22. package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -1
  23. package/dist/lib/pagination/pagination.component.js +2 -2
  24. package/dist/lib/pagination/pagination.component.js.map +1 -1
  25. package/dist/lib/pill/pill.component.js +2 -2
  26. package/dist/lib/pill/pill.component.js.map +1 -1
  27. package/dist/lib/types.d.ts +14 -31
  28. package/dist/lib/types.d.ts.map +1 -1
  29. package/dist/lib/types.js.map +1 -1
  30. package/dist/lib/view-config-panel/view-config-panel.component.d.ts +363 -0
  31. package/dist/lib/view-config-panel/view-config-panel.component.d.ts.map +1 -0
  32. package/dist/lib/view-config-panel/view-config-panel.component.js +2006 -0
  33. package/dist/lib/view-config-panel/view-config-panel.component.js.map +1 -0
  34. package/dist/module.d.ts +16 -13
  35. package/dist/module.d.ts.map +1 -1
  36. package/dist/module.js +25 -15
  37. package/dist/module.js.map +1 -1
  38. package/dist/public-api.d.ts +4 -1
  39. package/dist/public-api.d.ts.map +1 -1
  40. package/dist/public-api.js +6 -1
  41. package/dist/public-api.js.map +1 -1
  42. package/package.json +15 -11
@@ -0,0 +1,2006 @@
1
+ import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
2
+ import { Metadata } from '@memberjunction/core';
3
+ import { createEmptyFilter } from '@memberjunction/ng-filter-builder';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ const _forTrack0 = ($index, $item) => $item.ID;
7
+ const _forTrack1 = ($index, $item) => $item.fieldId;
8
+ function ViewConfigPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
9
+ const _r1 = i0.ɵɵgetCurrentView();
10
+ i0.ɵɵelementStart(0, "div", 22);
11
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onClose()); });
12
+ i0.ɵɵelementEnd();
13
+ } }
14
+ function ViewConfigPanelComponent_Conditional_25_For_11_Template(rf, ctx) { if (rf & 1) {
15
+ i0.ɵɵelementStart(0, "option", 28);
16
+ i0.ɵɵtext(1);
17
+ i0.ɵɵelementEnd();
18
+ } if (rf & 2) {
19
+ const field_r4 = ctx.$implicit;
20
+ i0.ɵɵproperty("value", field_r4.Name);
21
+ i0.ɵɵadvance();
22
+ i0.ɵɵtextInterpolate(field_r4.DisplayNameOrName);
23
+ } }
24
+ function ViewConfigPanelComponent_Conditional_25_Conditional_12_Template(rf, ctx) { if (rf & 1) {
25
+ const _r5 = i0.ɵɵgetCurrentView();
26
+ i0.ɵɵelementStart(0, "div", 29)(1, "button", 38);
27
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_25_Conditional_12_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.sortDirection = "asc"); });
28
+ i0.ɵɵelement(2, "i", 39);
29
+ i0.ɵɵelementEnd();
30
+ i0.ɵɵelementStart(3, "button", 40);
31
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_25_Conditional_12_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.sortDirection = "desc"); });
32
+ i0.ɵɵelement(4, "i", 41);
33
+ i0.ɵɵelementEnd()();
34
+ } if (rf & 2) {
35
+ const ctx_r1 = i0.ɵɵnextContext(2);
36
+ i0.ɵɵadvance();
37
+ i0.ɵɵclassProp("active", ctx_r1.sortDirection === "asc");
38
+ i0.ɵɵadvance(2);
39
+ i0.ɵɵclassProp("active", ctx_r1.sortDirection === "desc");
40
+ } }
41
+ function ViewConfigPanelComponent_Conditional_25_For_22_Conditional_0_Template(rf, ctx) { if (rf & 1) {
42
+ i0.ɵɵelement(0, "div", 42);
43
+ } }
44
+ function ViewConfigPanelComponent_Conditional_25_For_22_Conditional_6_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelement(0, "i", 47);
46
+ } if (rf & 2) {
47
+ const column_r7 = i0.ɵɵnextContext().$implicit;
48
+ i0.ɵɵpropertyInterpolate1("title", "Custom name: ", column_r7.userDisplayName, "");
49
+ } }
50
+ function ViewConfigPanelComponent_Conditional_25_For_22_Conditional_7_Template(rf, ctx) { if (rf & 1) {
51
+ i0.ɵɵelement(0, "i", 48);
52
+ } }
53
+ function ViewConfigPanelComponent_Conditional_25_For_22_Conditional_17_Template(rf, ctx) { if (rf & 1) {
54
+ i0.ɵɵelement(0, "div", 42);
55
+ } }
56
+ function ViewConfigPanelComponent_Conditional_25_For_22_Template(rf, ctx) { if (rf & 1) {
57
+ const _r6 = i0.ɵɵgetCurrentView();
58
+ i0.ɵɵtemplate(0, ViewConfigPanelComponent_Conditional_25_For_22_Conditional_0_Template, 1, 0, "div", 42);
59
+ i0.ɵɵelementStart(1, "div", 43);
60
+ i0.ɵɵlistener("dragstart", function ViewConfigPanelComponent_Conditional_25_For_22_Template_div_dragstart_1_listener($event) { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragStart($event, column_r7)); })("dragover", function ViewConfigPanelComponent_Conditional_25_For_22_Template_div_dragover_1_listener($event) { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragOver($event, column_r7)); })("dragleave", function ViewConfigPanelComponent_Conditional_25_For_22_Template_div_dragleave_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragLeave($event)); })("drop", function ViewConfigPanelComponent_Conditional_25_For_22_Template_div_drop_1_listener($event) { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDrop($event, column_r7)); })("dragend", function ViewConfigPanelComponent_Conditional_25_For_22_Template_div_dragend_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragEnd($event)); });
61
+ i0.ɵɵelementStart(2, "div", 44);
62
+ i0.ɵɵelement(3, "i", 45);
63
+ i0.ɵɵelementEnd();
64
+ i0.ɵɵelementStart(4, "span", 46);
65
+ i0.ɵɵtext(5);
66
+ i0.ɵɵtemplate(6, ViewConfigPanelComponent_Conditional_25_For_22_Conditional_6_Template, 1, 2, "i", 47)(7, ViewConfigPanelComponent_Conditional_25_For_22_Conditional_7_Template, 1, 0, "i", 48);
67
+ i0.ɵɵelementEnd();
68
+ i0.ɵɵelementStart(8, "div", 49)(9, "button", 50);
69
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_25_For_22_Template_button_click_9_listener() { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openFormatEditor(column_r7)); });
70
+ i0.ɵɵelement(10, "i", 51);
71
+ i0.ɵɵelementEnd();
72
+ i0.ɵɵelementStart(11, "button", 52);
73
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_25_For_22_Template_button_click_11_listener() { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.moveColumnUp(column_r7)); });
74
+ i0.ɵɵelement(12, "i", 53);
75
+ i0.ɵɵelementEnd();
76
+ i0.ɵɵelementStart(13, "button", 54);
77
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_25_For_22_Template_button_click_13_listener() { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.moveColumnDown(column_r7)); });
78
+ i0.ɵɵelement(14, "i", 55);
79
+ i0.ɵɵelementEnd();
80
+ i0.ɵɵelementStart(15, "button", 56);
81
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_25_For_22_Template_button_click_15_listener() { const column_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleColumnVisibility(column_r7)); });
82
+ i0.ɵɵelement(16, "i", 34);
83
+ i0.ɵɵelementEnd()()();
84
+ i0.ɵɵtemplate(17, ViewConfigPanelComponent_Conditional_25_For_22_Conditional_17_Template, 1, 0, "div", 42);
85
+ } if (rf & 2) {
86
+ const column_r7 = ctx.$implicit;
87
+ const ɵ$index_96_r8 = ctx.$index;
88
+ const ctx_r1 = i0.ɵɵnextContext(2);
89
+ i0.ɵɵconditional(ctx_r1.isDropBefore(column_r7) ? 0 : -1);
90
+ i0.ɵɵadvance();
91
+ i0.ɵɵclassProp("dragging", ctx_r1.draggedColumn === column_r7)("drop-target", ctx_r1.dropTargetColumn === column_r7);
92
+ i0.ɵɵadvance(4);
93
+ i0.ɵɵtextInterpolate1(" ", column_r7.userDisplayName || column_r7.displayName, " ");
94
+ i0.ɵɵadvance();
95
+ i0.ɵɵconditional(column_r7.userDisplayName ? 6 : -1);
96
+ i0.ɵɵadvance();
97
+ i0.ɵɵconditional(ctx_r1.hasCustomFormat(column_r7) ? 7 : -1);
98
+ i0.ɵɵadvance(4);
99
+ i0.ɵɵproperty("disabled", ɵ$index_96_r8 === 0);
100
+ i0.ɵɵadvance(2);
101
+ i0.ɵɵproperty("disabled", ɵ$index_96_r8 === ctx_r1.visibleColumns.length - 1);
102
+ i0.ɵɵadvance(4);
103
+ i0.ɵɵconditional(ctx_r1.isDropAfter(column_r7) && ɵ$index_96_r8 === ctx_r1.visibleColumns.length - 1 ? 17 : -1);
104
+ } }
105
+ function ViewConfigPanelComponent_Conditional_25_Conditional_23_Template(rf, ctx) { if (rf & 1) {
106
+ i0.ɵɵelementStart(0, "div", 33);
107
+ i0.ɵɵelement(1, "i", 57);
108
+ i0.ɵɵelementStart(2, "span");
109
+ i0.ɵɵtext(3, "No columns visible. Add columns from below.");
110
+ i0.ɵɵelementEnd()();
111
+ } }
112
+ function ViewConfigPanelComponent_Conditional_25_Conditional_31_Template(rf, ctx) { if (rf & 1) {
113
+ const _r9 = i0.ɵɵgetCurrentView();
114
+ i0.ɵɵelementStart(0, "div", 35);
115
+ i0.ɵɵelement(1, "i", 58);
116
+ i0.ɵɵelementStart(2, "input", 59);
117
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_25_Conditional_31_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.columnSearchText, $event) || (ctx_r1.columnSearchText = $event); return i0.ɵɵresetView($event); });
118
+ i0.ɵɵelementEnd()();
119
+ } if (rf & 2) {
120
+ const ctx_r1 = i0.ɵɵnextContext(2);
121
+ i0.ɵɵadvance(2);
122
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.columnSearchText);
123
+ } }
124
+ function ViewConfigPanelComponent_Conditional_25_For_34_Template(rf, ctx) { if (rf & 1) {
125
+ const _r10 = i0.ɵɵgetCurrentView();
126
+ i0.ɵɵelementStart(0, "div", 37)(1, "span", 46);
127
+ i0.ɵɵtext(2);
128
+ i0.ɵɵelementEnd();
129
+ i0.ɵɵelementStart(3, "button", 60);
130
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_25_For_34_Template_button_click_3_listener() { const column_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleColumnVisibility(column_r11)); });
131
+ i0.ɵɵelement(4, "i", 61);
132
+ i0.ɵɵelementEnd()();
133
+ } if (rf & 2) {
134
+ const column_r11 = ctx.$implicit;
135
+ i0.ɵɵadvance(2);
136
+ i0.ɵɵtextInterpolate(column_r11.displayName);
137
+ } }
138
+ function ViewConfigPanelComponent_Conditional_25_Conditional_35_Template(rf, ctx) { if (rf & 1) {
139
+ i0.ɵɵelementStart(0, "div", 33);
140
+ i0.ɵɵelement(1, "i", 62);
141
+ i0.ɵɵelementStart(2, "span");
142
+ i0.ɵɵtext(3, "All columns are visible");
143
+ i0.ɵɵelementEnd()();
144
+ } }
145
+ function ViewConfigPanelComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
146
+ const _r3 = i0.ɵɵgetCurrentView();
147
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 23)(2, "div", 24);
148
+ i0.ɵɵelement(3, "i", 25);
149
+ i0.ɵɵelementStart(4, "span");
150
+ i0.ɵɵtext(5, "Default Sort");
151
+ i0.ɵɵelementEnd()();
152
+ i0.ɵɵelementStart(6, "div", 26)(7, "select", 27);
153
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_25_Template_select_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.sortField, $event) || (ctx_r1.sortField = $event); return i0.ɵɵresetView($event); });
154
+ i0.ɵɵelementStart(8, "option", 28);
155
+ i0.ɵɵtext(9, "No default sort");
156
+ i0.ɵɵelementEnd();
157
+ i0.ɵɵrepeaterCreate(10, ViewConfigPanelComponent_Conditional_25_For_11_Template, 2, 2, "option", 28, _forTrack0);
158
+ i0.ɵɵelementEnd();
159
+ i0.ɵɵtemplate(12, ViewConfigPanelComponent_Conditional_25_Conditional_12_Template, 5, 4, "div", 29);
160
+ i0.ɵɵelementEnd()();
161
+ i0.ɵɵelementStart(13, "div", 23)(14, "div", 24);
162
+ i0.ɵɵelement(15, "i", 30);
163
+ i0.ɵɵelementStart(16, "span");
164
+ i0.ɵɵtext(17, "Visible Columns");
165
+ i0.ɵɵelementEnd();
166
+ i0.ɵɵelementStart(18, "span", 31);
167
+ i0.ɵɵtext(19);
168
+ i0.ɵɵelementEnd()();
169
+ i0.ɵɵelementStart(20, "div", 32);
170
+ i0.ɵɵrepeaterCreate(21, ViewConfigPanelComponent_Conditional_25_For_22_Template, 18, 11, null, null, _forTrack1);
171
+ i0.ɵɵtemplate(23, ViewConfigPanelComponent_Conditional_25_Conditional_23_Template, 4, 0, "div", 33);
172
+ i0.ɵɵelementEnd()();
173
+ i0.ɵɵelementStart(24, "div", 23)(25, "div", 24);
174
+ i0.ɵɵelement(26, "i", 34);
175
+ i0.ɵɵelementStart(27, "span");
176
+ i0.ɵɵtext(28, "Hidden Columns");
177
+ i0.ɵɵelementEnd();
178
+ i0.ɵɵelementStart(29, "span", 31);
179
+ i0.ɵɵtext(30);
180
+ i0.ɵɵelementEnd()();
181
+ i0.ɵɵtemplate(31, ViewConfigPanelComponent_Conditional_25_Conditional_31_Template, 3, 1, "div", 35);
182
+ i0.ɵɵelementStart(32, "div", 36);
183
+ i0.ɵɵrepeaterCreate(33, ViewConfigPanelComponent_Conditional_25_For_34_Template, 5, 1, "div", 37, _forTrack1);
184
+ i0.ɵɵtemplate(35, ViewConfigPanelComponent_Conditional_25_Conditional_35_Template, 4, 0, "div", 33);
185
+ i0.ɵɵelementEnd()()();
186
+ } if (rf & 2) {
187
+ const ctx_r1 = i0.ɵɵnextContext();
188
+ i0.ɵɵadvance(7);
189
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.sortField);
190
+ i0.ɵɵadvance();
191
+ i0.ɵɵproperty("value", null);
192
+ i0.ɵɵadvance(2);
193
+ i0.ɵɵrepeater(ctx_r1.sortableFields);
194
+ i0.ɵɵadvance(2);
195
+ i0.ɵɵconditional(ctx_r1.sortField ? 12 : -1);
196
+ i0.ɵɵadvance(7);
197
+ i0.ɵɵtextInterpolate(ctx_r1.visibleColumns.length);
198
+ i0.ɵɵadvance(2);
199
+ i0.ɵɵrepeater(ctx_r1.visibleColumns);
200
+ i0.ɵɵadvance(2);
201
+ i0.ɵɵconditional(ctx_r1.visibleColumns.length === 0 ? 23 : -1);
202
+ i0.ɵɵadvance(7);
203
+ i0.ɵɵtextInterpolate(ctx_r1.hiddenColumns.length);
204
+ i0.ɵɵadvance();
205
+ i0.ɵɵconditional(ctx_r1.hiddenColumns.length > 5 ? 31 : -1);
206
+ i0.ɵɵadvance(2);
207
+ i0.ɵɵrepeater(ctx_r1.filteredHiddenColumns);
208
+ i0.ɵɵadvance(2);
209
+ i0.ɵɵconditional(ctx_r1.hiddenColumns.length === 0 ? 35 : -1);
210
+ } }
211
+ function ViewConfigPanelComponent_Conditional_26_Conditional_16_Template(rf, ctx) { if (rf & 1) {
212
+ const _r13 = i0.ɵɵgetCurrentView();
213
+ i0.ɵɵelementStart(0, "div", 72)(1, "small", 108);
214
+ i0.ɵɵtext(2);
215
+ i0.ɵɵelementEnd();
216
+ i0.ɵɵelementStart(3, "button", 109);
217
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Conditional_16_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.formatEditingColumn.userDisplayName = undefined); });
218
+ i0.ɵɵelement(4, "i", 8);
219
+ i0.ɵɵelementEnd()();
220
+ } if (rf & 2) {
221
+ const ctx_r1 = i0.ɵɵnextContext(2);
222
+ i0.ɵɵadvance(2);
223
+ i0.ɵɵtextInterpolate1("Original: ", ctx_r1.formatEditingColumn.displayName, "");
224
+ } }
225
+ function ViewConfigPanelComponent_Conditional_26_For_26_Template(rf, ctx) { if (rf & 1) {
226
+ i0.ɵɵelementStart(0, "div", 110);
227
+ i0.ɵɵtext(1);
228
+ i0.ɵɵelementEnd();
229
+ } if (rf & 2) {
230
+ const value_r14 = ctx.$implicit;
231
+ const ctx_r1 = i0.ɵɵnextContext(2);
232
+ i0.ɵɵstyleProp("text-align", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.align) || "left")("font-weight", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.bold) ? "bold" : "normal")("font-style", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.italic) ? "italic" : "normal")("text-decoration", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.underline) ? "underline" : "none")("color", ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.color)("background-color", ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.backgroundColor);
233
+ i0.ɵɵadvance();
234
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.formatPreviewValue(value_r14, ctx_r1.formatEditingColumn.format), " ");
235
+ } }
236
+ function ViewConfigPanelComponent_Conditional_26_Conditional_49_Conditional_9_Template(rf, ctx) { if (rf & 1) {
237
+ const _r16 = i0.ɵɵgetCurrentView();
238
+ i0.ɵɵelementStart(0, "div", 70)(1, "label");
239
+ i0.ɵɵtext(2, "Currency");
240
+ i0.ɵɵelementEnd();
241
+ i0.ɵɵelementStart(3, "select", 79);
242
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_26_Conditional_49_Conditional_9_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.currencyCode, $event) || (ctx_r1.formatEditingColumn.format.currencyCode = $event); return i0.ɵɵresetView($event); });
243
+ i0.ɵɵelementStart(4, "option", 114);
244
+ i0.ɵɵtext(5, "USD ($)");
245
+ i0.ɵɵelementEnd();
246
+ i0.ɵɵelementStart(6, "option", 115);
247
+ i0.ɵɵtext(7, "EUR (\u20AC)");
248
+ i0.ɵɵelementEnd();
249
+ i0.ɵɵelementStart(8, "option", 116);
250
+ i0.ɵɵtext(9, "GBP (\u00A3)");
251
+ i0.ɵɵelementEnd();
252
+ i0.ɵɵelementStart(10, "option", 117);
253
+ i0.ɵɵtext(11, "JPY (\u00A5)");
254
+ i0.ɵɵelementEnd();
255
+ i0.ɵɵelementStart(12, "option", 118);
256
+ i0.ɵɵtext(13, "CAD ($)");
257
+ i0.ɵɵelementEnd();
258
+ i0.ɵɵelementStart(14, "option", 119);
259
+ i0.ɵɵtext(15, "AUD ($)");
260
+ i0.ɵɵelementEnd()()();
261
+ } if (rf & 2) {
262
+ const ctx_r1 = i0.ɵɵnextContext(3);
263
+ i0.ɵɵadvance(3);
264
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.currencyCode);
265
+ } }
266
+ function ViewConfigPanelComponent_Conditional_26_Conditional_49_Template(rf, ctx) { if (rf & 1) {
267
+ const _r15 = i0.ɵɵgetCurrentView();
268
+ i0.ɵɵelementStart(0, "div", 67)(1, "div", 68);
269
+ i0.ɵɵelement(2, "i", 111);
270
+ i0.ɵɵelementStart(3, "span");
271
+ i0.ɵɵtext(4, "Number Options");
272
+ i0.ɵɵelementEnd()();
273
+ i0.ɵɵelementStart(5, "div", 70)(6, "label");
274
+ i0.ɵɵtext(7, "Decimal Places");
275
+ i0.ɵɵelementEnd();
276
+ i0.ɵɵelementStart(8, "input", 112);
277
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_26_Conditional_49_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.decimals, $event) || (ctx_r1.formatEditingColumn.format.decimals = $event); return i0.ɵɵresetView($event); });
278
+ i0.ɵɵelementEnd()();
279
+ i0.ɵɵtemplate(9, ViewConfigPanelComponent_Conditional_26_Conditional_49_Conditional_9_Template, 16, 1, "div", 70);
280
+ i0.ɵɵelementStart(10, "div", 70)(11, "label");
281
+ i0.ɵɵtext(12, "Thousands Separator");
282
+ i0.ɵɵelementEnd();
283
+ i0.ɵɵelementStart(13, "input", 113);
284
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_26_Conditional_49_Template_input_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.thousandsSeparator, $event) || (ctx_r1.formatEditingColumn.format.thousandsSeparator = $event); return i0.ɵɵresetView($event); });
285
+ i0.ɵɵelementEnd()()();
286
+ } if (rf & 2) {
287
+ const ctx_r1 = i0.ɵɵnextContext(2);
288
+ i0.ɵɵadvance(8);
289
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.decimals);
290
+ i0.ɵɵadvance();
291
+ i0.ɵɵconditional((ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.type) === "currency" ? 9 : -1);
292
+ i0.ɵɵadvance(4);
293
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.thousandsSeparator);
294
+ } }
295
+ function ViewConfigPanelComponent_Conditional_26_Conditional_50_Template(rf, ctx) { if (rf & 1) {
296
+ const _r17 = i0.ɵɵgetCurrentView();
297
+ i0.ɵɵelementStart(0, "div", 67)(1, "div", 68);
298
+ i0.ɵɵelement(2, "i", 120);
299
+ i0.ɵɵelementStart(3, "span");
300
+ i0.ɵɵtext(4, "Date Options");
301
+ i0.ɵɵelementEnd()();
302
+ i0.ɵɵelementStart(5, "div", 70)(6, "label");
303
+ i0.ɵɵtext(7, "Format");
304
+ i0.ɵɵelementEnd();
305
+ i0.ɵɵelementStart(8, "select", 79);
306
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_26_Conditional_50_Template_select_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.dateFormat, $event) || (ctx_r1.formatEditingColumn.format.dateFormat = $event); return i0.ɵɵresetView($event); });
307
+ i0.ɵɵelementStart(9, "option", 121);
308
+ i0.ɵɵtext(10, "Short (1/15/25)");
309
+ i0.ɵɵelementEnd();
310
+ i0.ɵɵelementStart(11, "option", 122);
311
+ i0.ɵɵtext(12, "Short + Day (Wed, 1/15/25)");
312
+ i0.ɵɵelementEnd();
313
+ i0.ɵɵelementStart(13, "option", 123);
314
+ i0.ɵɵtext(14, "Medium (Jan 15, 2025)");
315
+ i0.ɵɵelementEnd();
316
+ i0.ɵɵelementStart(15, "option", 124);
317
+ i0.ɵɵtext(16, "Medium + Day (Wed, Jan 15, 2025)");
318
+ i0.ɵɵelementEnd();
319
+ i0.ɵɵelementStart(17, "option", 125);
320
+ i0.ɵɵtext(18, "Long (January 15, 2025)");
321
+ i0.ɵɵelementEnd();
322
+ i0.ɵɵelementStart(19, "option", 126);
323
+ i0.ɵɵtext(20, "Long + Day (Wednesday, January 15, 2025)");
324
+ i0.ɵɵelementEnd()()()();
325
+ } if (rf & 2) {
326
+ const ctx_r1 = i0.ɵɵnextContext(2);
327
+ i0.ɵɵadvance(8);
328
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.dateFormat);
329
+ } }
330
+ function ViewConfigPanelComponent_Conditional_26_Conditional_51_Template(rf, ctx) { if (rf & 1) {
331
+ const _r18 = i0.ɵɵgetCurrentView();
332
+ i0.ɵɵelementStart(0, "div", 67)(1, "div", 68);
333
+ i0.ɵɵelement(2, "i", 127);
334
+ i0.ɵɵelementStart(3, "span");
335
+ i0.ɵɵtext(4, "Boolean Options");
336
+ i0.ɵɵelementEnd()();
337
+ i0.ɵɵelementStart(5, "div", 70)(6, "label");
338
+ i0.ɵɵtext(7, "True Label");
339
+ i0.ɵɵelementEnd();
340
+ i0.ɵɵelementStart(8, "input", 128);
341
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_26_Conditional_51_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.trueLabel, $event) || (ctx_r1.formatEditingColumn.format.trueLabel = $event); return i0.ɵɵresetView($event); });
342
+ i0.ɵɵelementEnd()();
343
+ i0.ɵɵelementStart(9, "div", 70)(10, "label");
344
+ i0.ɵɵtext(11, "False Label");
345
+ i0.ɵɵelementEnd();
346
+ i0.ɵɵelementStart(12, "input", 129);
347
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_26_Conditional_51_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.falseLabel, $event) || (ctx_r1.formatEditingColumn.format.falseLabel = $event); return i0.ɵɵresetView($event); });
348
+ i0.ɵɵelementEnd()();
349
+ i0.ɵɵelementStart(13, "div", 70)(14, "label");
350
+ i0.ɵɵtext(15, "Display As");
351
+ i0.ɵɵelementEnd();
352
+ i0.ɵɵelementStart(16, "select", 79);
353
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_26_Conditional_51_Template_select_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.booleanDisplay, $event) || (ctx_r1.formatEditingColumn.format.booleanDisplay = $event); return i0.ɵɵresetView($event); });
354
+ i0.ɵɵelementStart(17, "option", 81);
355
+ i0.ɵɵtext(18, "Text");
356
+ i0.ɵɵelementEnd();
357
+ i0.ɵɵelementStart(19, "option", 130);
358
+ i0.ɵɵtext(20, "Checkbox");
359
+ i0.ɵɵelementEnd();
360
+ i0.ɵɵelementStart(21, "option", 131);
361
+ i0.ɵɵtext(22, "Icon");
362
+ i0.ɵɵelementEnd()()()();
363
+ } if (rf & 2) {
364
+ const ctx_r1 = i0.ɵɵnextContext(2);
365
+ i0.ɵɵadvance(8);
366
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.trueLabel);
367
+ i0.ɵɵadvance(4);
368
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.falseLabel);
369
+ i0.ɵɵadvance(4);
370
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.booleanDisplay);
371
+ } }
372
+ function ViewConfigPanelComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
373
+ const _r12 = i0.ɵɵgetCurrentView();
374
+ i0.ɵɵelementStart(0, "div", 16)(1, "div", 63)(2, "button", 64);
375
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeFormatEditor()); });
376
+ i0.ɵɵelement(3, "i", 65);
377
+ i0.ɵɵelementEnd();
378
+ i0.ɵɵelementStart(4, "div", 66)(5, "span");
379
+ i0.ɵɵtext(6);
380
+ i0.ɵɵelementEnd()()();
381
+ i0.ɵɵelementStart(7, "div", 67)(8, "div", 68);
382
+ i0.ɵɵelement(9, "i", 69);
383
+ i0.ɵɵelementStart(10, "span");
384
+ i0.ɵɵtext(11, "Column Name");
385
+ i0.ɵɵelementEnd()();
386
+ i0.ɵɵelementStart(12, "div", 70)(13, "label");
387
+ i0.ɵɵtext(14, "Display As");
388
+ i0.ɵɵelementEnd();
389
+ i0.ɵɵelementStart(15, "input", 71);
390
+ i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_26_Template_input_input_15_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.updateUserDisplayName($event.target.value)); });
391
+ i0.ɵɵelementEnd()();
392
+ i0.ɵɵtemplate(16, ViewConfigPanelComponent_Conditional_26_Conditional_16_Template, 5, 1, "div", 72);
393
+ i0.ɵɵelementEnd();
394
+ i0.ɵɵelementStart(17, "div", 73)(18, "div", 74);
395
+ i0.ɵɵelement(19, "i", 30);
396
+ i0.ɵɵelementStart(20, "span");
397
+ i0.ɵɵtext(21, "Preview");
398
+ i0.ɵɵelementEnd()();
399
+ i0.ɵɵelementStart(22, "div", 75)(23, "div", 76);
400
+ i0.ɵɵtext(24);
401
+ i0.ɵɵelementEnd();
402
+ i0.ɵɵrepeaterCreate(25, ViewConfigPanelComponent_Conditional_26_For_26_Template, 2, 13, "div", 77, i0.ɵɵrepeaterTrackByIndex);
403
+ i0.ɵɵelementEnd()();
404
+ i0.ɵɵelementStart(27, "div", 67)(28, "div", 68);
405
+ i0.ɵɵelement(29, "i", 78);
406
+ i0.ɵɵelementStart(30, "span");
407
+ i0.ɵɵtext(31, "Format Type");
408
+ i0.ɵɵelementEnd()();
409
+ i0.ɵɵelementStart(32, "select", 79);
410
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_26_Template_select_ngModelChange_32_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.type, $event) || (ctx_r1.formatEditingColumn.format.type = $event); return i0.ɵɵresetView($event); });
411
+ i0.ɵɵelementStart(33, "option", 80);
412
+ i0.ɵɵtext(34, "Auto (Smart Default)");
413
+ i0.ɵɵelementEnd();
414
+ i0.ɵɵelementStart(35, "option", 81);
415
+ i0.ɵɵtext(36, "Text");
416
+ i0.ɵɵelementEnd();
417
+ i0.ɵɵelementStart(37, "option", 82);
418
+ i0.ɵɵtext(38, "Number");
419
+ i0.ɵɵelementEnd();
420
+ i0.ɵɵelementStart(39, "option", 83);
421
+ i0.ɵɵtext(40, "Currency");
422
+ i0.ɵɵelementEnd();
423
+ i0.ɵɵelementStart(41, "option", 84);
424
+ i0.ɵɵtext(42, "Percent");
425
+ i0.ɵɵelementEnd();
426
+ i0.ɵɵelementStart(43, "option", 85);
427
+ i0.ɵɵtext(44, "Date");
428
+ i0.ɵɵelementEnd();
429
+ i0.ɵɵelementStart(45, "option", 86);
430
+ i0.ɵɵtext(46, "Date & Time");
431
+ i0.ɵɵelementEnd();
432
+ i0.ɵɵelementStart(47, "option", 87);
433
+ i0.ɵɵtext(48, "Boolean");
434
+ i0.ɵɵelementEnd()()();
435
+ i0.ɵɵtemplate(49, ViewConfigPanelComponent_Conditional_26_Conditional_49_Template, 14, 3, "div", 67)(50, ViewConfigPanelComponent_Conditional_26_Conditional_50_Template, 21, 1, "div", 67)(51, ViewConfigPanelComponent_Conditional_26_Conditional_51_Template, 23, 3, "div", 67);
436
+ i0.ɵɵelementStart(52, "div", 67)(53, "div", 68);
437
+ i0.ɵɵelement(54, "i", 88);
438
+ i0.ɵɵelementStart(55, "span");
439
+ i0.ɵɵtext(56, "Alignment");
440
+ i0.ɵɵelementEnd()();
441
+ i0.ɵɵelementStart(57, "div", 89)(58, "button", 90);
442
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_58_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.formatEditingColumn.format.align = "left"); });
443
+ i0.ɵɵelement(59, "i", 88);
444
+ i0.ɵɵelementEnd();
445
+ i0.ɵɵelementStart(60, "button", 91);
446
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_60_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.formatEditingColumn.format.align = "center"); });
447
+ i0.ɵɵelement(61, "i", 92);
448
+ i0.ɵɵelementEnd();
449
+ i0.ɵɵelementStart(62, "button", 93);
450
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_62_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.formatEditingColumn.format.align = "right"); });
451
+ i0.ɵɵelement(63, "i", 94);
452
+ i0.ɵɵelementEnd()()();
453
+ i0.ɵɵelementStart(64, "div", 67)(65, "div", 68);
454
+ i0.ɵɵelement(66, "i", 95);
455
+ i0.ɵɵelementStart(67, "span");
456
+ i0.ɵɵtext(68, "Header Style");
457
+ i0.ɵɵelementEnd()();
458
+ i0.ɵɵelementStart(69, "div", 96)(70, "button", 97);
459
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_70_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleHeaderStyle("bold")); });
460
+ i0.ɵɵelement(71, "i", 98);
461
+ i0.ɵɵelementEnd();
462
+ i0.ɵɵelementStart(72, "button", 99);
463
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_72_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleHeaderStyle("italic")); });
464
+ i0.ɵɵelement(73, "i", 100);
465
+ i0.ɵɵelementEnd();
466
+ i0.ɵɵelementStart(74, "button", 101);
467
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_74_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleHeaderStyle("underline")); });
468
+ i0.ɵɵelement(75, "i", 102);
469
+ i0.ɵɵelementEnd()();
470
+ i0.ɵɵelementStart(76, "div", 70)(77, "label");
471
+ i0.ɵɵtext(78, "Text Color");
472
+ i0.ɵɵelementEnd();
473
+ i0.ɵɵelementStart(79, "input", 103);
474
+ i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_26_Template_input_input_79_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.updateHeaderColor("color", $event.target.value)); });
475
+ i0.ɵɵelementEnd()();
476
+ i0.ɵɵelementStart(80, "div", 70)(81, "label");
477
+ i0.ɵɵtext(82, "Background");
478
+ i0.ɵɵelementEnd();
479
+ i0.ɵɵelementStart(83, "input", 103);
480
+ i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_26_Template_input_input_83_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.updateHeaderColor("backgroundColor", $event.target.value)); });
481
+ i0.ɵɵelementEnd()()();
482
+ i0.ɵɵelementStart(84, "div", 67)(85, "div", 68);
483
+ i0.ɵɵelement(86, "i", 104);
484
+ i0.ɵɵelementStart(87, "span");
485
+ i0.ɵɵtext(88, "Cell Style");
486
+ i0.ɵɵelementEnd()();
487
+ i0.ɵɵelementStart(89, "div", 96)(90, "button", 97);
488
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_90_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleCellStyle("bold")); });
489
+ i0.ɵɵelement(91, "i", 98);
490
+ i0.ɵɵelementEnd();
491
+ i0.ɵɵelementStart(92, "button", 99);
492
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_92_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleCellStyle("italic")); });
493
+ i0.ɵɵelement(93, "i", 100);
494
+ i0.ɵɵelementEnd();
495
+ i0.ɵɵelementStart(94, "button", 101);
496
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_94_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleCellStyle("underline")); });
497
+ i0.ɵɵelement(95, "i", 102);
498
+ i0.ɵɵelementEnd()();
499
+ i0.ɵɵelementStart(96, "div", 70)(97, "label");
500
+ i0.ɵɵtext(98, "Text Color");
501
+ i0.ɵɵelementEnd();
502
+ i0.ɵɵelementStart(99, "input", 103);
503
+ i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_26_Template_input_input_99_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.updateCellColor("color", $event.target.value)); });
504
+ i0.ɵɵelementEnd()();
505
+ i0.ɵɵelementStart(100, "div", 70)(101, "label");
506
+ i0.ɵɵtext(102, "Background");
507
+ i0.ɵɵelementEnd();
508
+ i0.ɵɵelementStart(103, "input", 103);
509
+ i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_26_Template_input_input_103_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.updateCellColor("backgroundColor", $event.target.value)); });
510
+ i0.ɵɵelementEnd()()();
511
+ i0.ɵɵelementStart(104, "div", 105)(105, "button", 106);
512
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_105_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); ctx_r1.clearColumnFormat(ctx_r1.formatEditingColumn); return i0.ɵɵresetView(ctx_r1.closeFormatEditor()); });
513
+ i0.ɵɵelement(106, "i", 107);
514
+ i0.ɵɵtext(107, " Clear Formatting ");
515
+ i0.ɵɵelementEnd()()();
516
+ } if (rf & 2) {
517
+ const ctx_r1 = i0.ɵɵnextContext();
518
+ i0.ɵɵadvance(6);
519
+ i0.ɵɵtextInterpolate1("Format: ", ctx_r1.formatEditingColumn.userDisplayName || ctx_r1.formatEditingColumn.displayName, "");
520
+ i0.ɵɵadvance(9);
521
+ i0.ɵɵproperty("value", ctx_r1.formatEditingColumn.userDisplayName || "")("placeholder", ctx_r1.formatEditingColumn.displayName);
522
+ i0.ɵɵadvance();
523
+ i0.ɵɵconditional(ctx_r1.formatEditingColumn.userDisplayName ? 16 : -1);
524
+ i0.ɵɵadvance(7);
525
+ i0.ɵɵstyleProp("font-weight", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.headerStyle == null ? null : ctx_r1.formatEditingColumn.format.headerStyle.bold) ? "bold" : "normal")("font-style", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.headerStyle == null ? null : ctx_r1.formatEditingColumn.format.headerStyle.italic) ? "italic" : "normal")("text-decoration", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.headerStyle == null ? null : ctx_r1.formatEditingColumn.format.headerStyle.underline) ? "underline" : "none")("color", ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.headerStyle == null ? null : ctx_r1.formatEditingColumn.format.headerStyle.color)("background-color", ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.headerStyle == null ? null : ctx_r1.formatEditingColumn.format.headerStyle.backgroundColor);
526
+ i0.ɵɵadvance();
527
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.formatEditingColumn.userDisplayName || ctx_r1.formatEditingColumn.displayName, " ");
528
+ i0.ɵɵadvance();
529
+ i0.ɵɵrepeater(ctx_r1.getSampleValues(ctx_r1.formatEditingColumn));
530
+ i0.ɵɵadvance(7);
531
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.type);
532
+ i0.ɵɵadvance(17);
533
+ i0.ɵɵconditional((ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.type) === "number" || (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.type) === "currency" || (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.type) === "percent" ? 49 : -1);
534
+ i0.ɵɵadvance();
535
+ i0.ɵɵconditional((ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.type) === "date" || (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.type) === "datetime" ? 50 : -1);
536
+ i0.ɵɵadvance();
537
+ i0.ɵɵconditional((ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.type) === "boolean" ? 51 : -1);
538
+ i0.ɵɵadvance(7);
539
+ i0.ɵɵclassProp("active", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.align) === "left" || !(ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.align));
540
+ i0.ɵɵadvance(2);
541
+ i0.ɵɵclassProp("active", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.align) === "center");
542
+ i0.ɵɵadvance(2);
543
+ i0.ɵɵclassProp("active", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.align) === "right");
544
+ i0.ɵɵadvance(8);
545
+ i0.ɵɵclassProp("active", ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.headerStyle == null ? null : ctx_r1.formatEditingColumn.format.headerStyle.bold);
546
+ i0.ɵɵadvance(2);
547
+ i0.ɵɵclassProp("active", ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.headerStyle == null ? null : ctx_r1.formatEditingColumn.format.headerStyle.italic);
548
+ i0.ɵɵadvance(2);
549
+ i0.ɵɵclassProp("active", ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.headerStyle == null ? null : ctx_r1.formatEditingColumn.format.headerStyle.underline);
550
+ i0.ɵɵadvance(5);
551
+ i0.ɵɵproperty("value", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.headerStyle == null ? null : ctx_r1.formatEditingColumn.format.headerStyle.color) || "#000000");
552
+ i0.ɵɵadvance(4);
553
+ i0.ɵɵproperty("value", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.headerStyle == null ? null : ctx_r1.formatEditingColumn.format.headerStyle.backgroundColor) || "#ffffff");
554
+ i0.ɵɵadvance(7);
555
+ i0.ɵɵclassProp("active", ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.bold);
556
+ i0.ɵɵadvance(2);
557
+ i0.ɵɵclassProp("active", ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.italic);
558
+ i0.ɵɵadvance(2);
559
+ i0.ɵɵclassProp("active", ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.underline);
560
+ i0.ɵɵadvance(5);
561
+ i0.ɵɵproperty("value", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.color) || "#000000");
562
+ i0.ɵɵadvance(4);
563
+ i0.ɵɵproperty("value", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.backgroundColor) || "#ffffff");
564
+ } }
565
+ function ViewConfigPanelComponent_Conditional_27_Conditional_10_Template(rf, ctx) { if (rf & 1) {
566
+ i0.ɵɵelement(0, "i", 139);
567
+ } }
568
+ function ViewConfigPanelComponent_Conditional_27_Conditional_19_Template(rf, ctx) { if (rf & 1) {
569
+ i0.ɵɵelement(0, "i", 139);
570
+ } }
571
+ function ViewConfigPanelComponent_Conditional_27_Conditional_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
572
+ i0.ɵɵelementStart(0, "div", 145);
573
+ i0.ɵɵelement(1, "i", 156);
574
+ i0.ɵɵelementStart(2, "span");
575
+ i0.ɵɵtext(3);
576
+ i0.ɵɵelementEnd()();
577
+ } if (rf & 2) {
578
+ const ctx_r1 = i0.ɵɵnextContext(3);
579
+ i0.ɵɵadvance(3);
580
+ i0.ɵɵtextInterpolate(ctx_r1.smartFilterExplanation);
581
+ } }
582
+ function ViewConfigPanelComponent_Conditional_27_Conditional_20_Template(rf, ctx) { if (rf & 1) {
583
+ const _r20 = i0.ɵɵgetCurrentView();
584
+ i0.ɵɵelementStart(0, "div", 140)(1, "div", 142)(2, "div", 143);
585
+ i0.ɵɵelement(3, "i", 135);
586
+ i0.ɵɵelementEnd();
587
+ i0.ɵɵelementStart(4, "textarea", 144);
588
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_27_Conditional_20_Template_textarea_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.smartFilterPrompt, $event) || (ctx_r1.smartFilterPrompt = $event); return i0.ɵɵresetView($event); });
589
+ i0.ɵɵelementEnd()();
590
+ i0.ɵɵtemplate(5, ViewConfigPanelComponent_Conditional_27_Conditional_20_Conditional_5_Template, 4, 1, "div", 145);
591
+ i0.ɵɵelementStart(6, "div", 146)(7, "div", 147);
592
+ i0.ɵɵelement(8, "i", 148);
593
+ i0.ɵɵelementStart(9, "span");
594
+ i0.ɵɵtext(10, "Try these examples:");
595
+ i0.ɵɵelementEnd()();
596
+ i0.ɵɵelementStart(11, "div", 149)(12, "button", 150);
597
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_27_Conditional_20_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Show records created in the last 30 days")); });
598
+ i0.ɵɵelement(13, "i", 151);
599
+ i0.ɵɵtext(14, " Last 30 days ");
600
+ i0.ɵɵelementEnd();
601
+ i0.ɵɵelementStart(15, "button", 150);
602
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_27_Conditional_20_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Active records only")); });
603
+ i0.ɵɵelement(16, "i", 152);
604
+ i0.ɵɵtext(17, " Active only ");
605
+ i0.ɵɵelementEnd();
606
+ i0.ɵɵelementStart(18, "button", 150);
607
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_27_Conditional_20_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Records with high priority")); });
608
+ i0.ɵɵelement(19, "i", 153);
609
+ i0.ɵɵtext(20, " High priority ");
610
+ i0.ɵɵelementEnd();
611
+ i0.ɵɵelementStart(21, "button", 150);
612
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_27_Conditional_20_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Records modified this week")); });
613
+ i0.ɵɵelement(22, "i", 154);
614
+ i0.ɵɵtext(23, " Modified this week ");
615
+ i0.ɵɵelementEnd()()();
616
+ i0.ɵɵelementStart(24, "div", 155);
617
+ i0.ɵɵelement(25, "i", 57);
618
+ i0.ɵɵelementStart(26, "span");
619
+ i0.ɵɵtext(27, "The AI will interpret your description and create the appropriate filter when you save the view.");
620
+ i0.ɵɵelementEnd()()();
621
+ } if (rf & 2) {
622
+ const ctx_r1 = i0.ɵɵnextContext(2);
623
+ i0.ɵɵadvance(4);
624
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.smartFilterPrompt);
625
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
626
+ i0.ɵɵadvance();
627
+ i0.ɵɵconditional(ctx_r1.smartFilterExplanation ? 5 : -1);
628
+ i0.ɵɵadvance(7);
629
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
630
+ i0.ɵɵadvance(3);
631
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
632
+ i0.ɵɵadvance(3);
633
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
634
+ i0.ɵɵadvance(3);
635
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
636
+ } }
637
+ function ViewConfigPanelComponent_Conditional_27_Conditional_21_Conditional_4_Template(rf, ctx) { if (rf & 1) {
638
+ i0.ɵɵelementStart(0, "span", 166);
639
+ i0.ɵɵtext(1);
640
+ i0.ɵɵelementEnd();
641
+ i0.ɵɵelementStart(2, "span", 167);
642
+ i0.ɵɵtext(3);
643
+ i0.ɵɵelementEnd();
644
+ } if (rf & 2) {
645
+ const ctx_r1 = i0.ɵɵnextContext(3);
646
+ i0.ɵɵadvance();
647
+ i0.ɵɵtextInterpolate(ctx_r1.getFilterCount());
648
+ i0.ɵɵadvance(2);
649
+ i0.ɵɵtextInterpolate(ctx_r1.getFilterSummary());
650
+ } }
651
+ function ViewConfigPanelComponent_Conditional_27_Conditional_21_Conditional_5_Template(rf, ctx) { if (rf & 1) {
652
+ i0.ɵɵelementStart(0, "span", 160);
653
+ i0.ɵɵtext(1, "No filters configured");
654
+ i0.ɵɵelementEnd();
655
+ } }
656
+ function ViewConfigPanelComponent_Conditional_27_Conditional_21_Conditional_7_Template(rf, ctx) { if (rf & 1) {
657
+ const _r22 = i0.ɵɵgetCurrentView();
658
+ i0.ɵɵelementStart(0, "button", 168);
659
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_27_Conditional_21_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.clearFilters()); });
660
+ i0.ɵɵelement(1, "i", 8);
661
+ i0.ɵɵtext(2, " Clear ");
662
+ i0.ɵɵelementEnd();
663
+ } }
664
+ function ViewConfigPanelComponent_Conditional_27_Conditional_21_Template(rf, ctx) { if (rf & 1) {
665
+ const _r21 = i0.ɵɵgetCurrentView();
666
+ i0.ɵɵelementStart(0, "div", 141)(1, "div", 157)(2, "div", 158)(3, "div", 159);
667
+ i0.ɵɵtemplate(4, ViewConfigPanelComponent_Conditional_27_Conditional_21_Conditional_4_Template, 4, 2)(5, ViewConfigPanelComponent_Conditional_27_Conditional_21_Conditional_5_Template, 2, 0, "span", 160);
668
+ i0.ɵɵelementEnd();
669
+ i0.ɵɵelementStart(6, "div", 161);
670
+ i0.ɵɵtemplate(7, ViewConfigPanelComponent_Conditional_27_Conditional_21_Conditional_7_Template, 3, 0, "button", 162);
671
+ i0.ɵɵelementStart(8, "button", 163);
672
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_27_Conditional_21_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openFilterDialog()); });
673
+ i0.ɵɵelement(9, "i", 164);
674
+ i0.ɵɵtext(10);
675
+ i0.ɵɵelementEnd()()()();
676
+ i0.ɵɵelementStart(11, "div", 165);
677
+ i0.ɵɵelement(12, "i", 57);
678
+ i0.ɵɵelementStart(13, "span");
679
+ i0.ɵɵtext(14, "Build precise filters by selecting fields, operators, and values. Use groups for complex AND/OR logic.");
680
+ i0.ɵɵelementEnd()()();
681
+ } if (rf & 2) {
682
+ const ctx_r1 = i0.ɵɵnextContext(2);
683
+ i0.ɵɵadvance(4);
684
+ i0.ɵɵconditional(ctx_r1.getFilterCount() > 0 ? 4 : 5);
685
+ i0.ɵɵadvance(3);
686
+ i0.ɵɵconditional(ctx_r1.getFilterCount() > 0 && ctx_r1.canEdit ? 7 : -1);
687
+ i0.ɵɵadvance();
688
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit && ctx_r1.getFilterCount() === 0);
689
+ i0.ɵɵadvance(2);
690
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.getFilterCount() > 0 ? "Edit Filters" : "Add Filters", " ");
691
+ } }
692
+ function ViewConfigPanelComponent_Conditional_27_Template(rf, ctx) { if (rf & 1) {
693
+ const _r19 = i0.ɵɵgetCurrentView();
694
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 132)(2, "button", 133);
695
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_27_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setFilterMode("smart")); });
696
+ i0.ɵɵelementStart(3, "div", 134);
697
+ i0.ɵɵelement(4, "i", 135);
698
+ i0.ɵɵelementEnd();
699
+ i0.ɵɵelementStart(5, "div", 136)(6, "span", 137);
700
+ i0.ɵɵtext(7, "Smart Filter");
701
+ i0.ɵɵelementEnd();
702
+ i0.ɵɵelementStart(8, "span", 138);
703
+ i0.ɵɵtext(9, "Use AI to filter with natural language");
704
+ i0.ɵɵelementEnd()();
705
+ i0.ɵɵtemplate(10, ViewConfigPanelComponent_Conditional_27_Conditional_10_Template, 1, 0, "i", 139);
706
+ i0.ɵɵelementEnd();
707
+ i0.ɵɵelementStart(11, "button", 133);
708
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_27_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setFilterMode("traditional")); });
709
+ i0.ɵɵelementStart(12, "div", 134);
710
+ i0.ɵɵelement(13, "i", 111);
711
+ i0.ɵɵelementEnd();
712
+ i0.ɵɵelementStart(14, "div", 136)(15, "span", 137);
713
+ i0.ɵɵtext(16, "Traditional Filter");
714
+ i0.ɵɵelementEnd();
715
+ i0.ɵɵelementStart(17, "span", 138);
716
+ i0.ɵɵtext(18, "Build filters with field/operator/value");
717
+ i0.ɵɵelementEnd()();
718
+ i0.ɵɵtemplate(19, ViewConfigPanelComponent_Conditional_27_Conditional_19_Template, 1, 0, "i", 139);
719
+ i0.ɵɵelementEnd()();
720
+ i0.ɵɵtemplate(20, ViewConfigPanelComponent_Conditional_27_Conditional_20_Template, 28, 7, "div", 140)(21, ViewConfigPanelComponent_Conditional_27_Conditional_21_Template, 15, 4, "div", 141);
721
+ i0.ɵɵelementEnd();
722
+ } if (rf & 2) {
723
+ const ctx_r1 = i0.ɵɵnextContext();
724
+ i0.ɵɵadvance(2);
725
+ i0.ɵɵclassProp("active", ctx_r1.filterMode === "smart");
726
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
727
+ i0.ɵɵadvance(8);
728
+ i0.ɵɵconditional(ctx_r1.filterMode === "smart" ? 10 : -1);
729
+ i0.ɵɵadvance();
730
+ i0.ɵɵclassProp("active", ctx_r1.filterMode === "traditional");
731
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
732
+ i0.ɵɵadvance(8);
733
+ i0.ɵɵconditional(ctx_r1.filterMode === "traditional" ? 19 : -1);
734
+ i0.ɵɵadvance();
735
+ i0.ɵɵconditional(ctx_r1.filterMode === "smart" ? 20 : -1);
736
+ i0.ɵɵadvance();
737
+ i0.ɵɵconditional(ctx_r1.filterMode === "traditional" ? 21 : -1);
738
+ } }
739
+ function ViewConfigPanelComponent_Conditional_28_Conditional_26_Template(rf, ctx) { if (rf & 1) {
740
+ const _r24 = i0.ɵɵgetCurrentView();
741
+ i0.ɵɵelementStart(0, "div", 178)(1, "div", 24);
742
+ i0.ɵɵelement(2, "i", 179);
743
+ i0.ɵɵelementStart(3, "span");
744
+ i0.ɵɵtext(4, "Danger Zone");
745
+ i0.ɵɵelementEnd()();
746
+ i0.ɵɵelementStart(5, "button", 180);
747
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_28_Conditional_26_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDelete()); });
748
+ i0.ɵɵelement(6, "i", 181);
749
+ i0.ɵɵelementStart(7, "span");
750
+ i0.ɵɵtext(8, "Delete View");
751
+ i0.ɵɵelementEnd()()();
752
+ } }
753
+ function ViewConfigPanelComponent_Conditional_28_Template(rf, ctx) { if (rf & 1) {
754
+ const _r23 = i0.ɵɵgetCurrentView();
755
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 23)(2, "div", 24);
756
+ i0.ɵɵelement(3, "i", 57);
757
+ i0.ɵɵelementStart(4, "span");
758
+ i0.ɵɵtext(5, "View Details");
759
+ i0.ɵɵelementEnd()();
760
+ i0.ɵɵelementStart(6, "div", 169)(7, "label", 170);
761
+ i0.ɵɵtext(8, "Name");
762
+ i0.ɵɵelementEnd();
763
+ i0.ɵɵelementStart(9, "input", 171);
764
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_28_Template_input_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.viewName, $event) || (ctx_r1.viewName = $event); return i0.ɵɵresetView($event); });
765
+ i0.ɵɵelementEnd()();
766
+ i0.ɵɵelementStart(10, "div", 169)(11, "label", 172);
767
+ i0.ɵɵtext(12, "Description");
768
+ i0.ɵɵelementEnd();
769
+ i0.ɵɵelementStart(13, "textarea", 173);
770
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_28_Template_textarea_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.viewDescription, $event) || (ctx_r1.viewDescription = $event); return i0.ɵɵresetView($event); });
771
+ i0.ɵɵelementEnd()()();
772
+ i0.ɵɵelementStart(14, "div", 23)(15, "div", 24);
773
+ i0.ɵɵelement(16, "i", 174);
774
+ i0.ɵɵelementStart(17, "span");
775
+ i0.ɵɵtext(18, "Sharing");
776
+ i0.ɵɵelementEnd()();
777
+ i0.ɵɵelementStart(19, "label", 175)(20, "input", 176);
778
+ i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_28_Template_input_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.isShared, $event) || (ctx_r1.isShared = $event); return i0.ɵɵresetView($event); });
779
+ i0.ɵɵelementEnd();
780
+ i0.ɵɵelementStart(21, "span", 177)(22, "strong");
781
+ i0.ɵɵtext(23, "Share with others");
782
+ i0.ɵɵelementEnd();
783
+ i0.ɵɵelementStart(24, "small");
784
+ i0.ɵɵtext(25, "Allow other users to use this view");
785
+ i0.ɵɵelementEnd()()()();
786
+ i0.ɵɵtemplate(26, ViewConfigPanelComponent_Conditional_28_Conditional_26_Template, 9, 0, "div", 178);
787
+ i0.ɵɵelementEnd();
788
+ } if (rf & 2) {
789
+ const ctx_r1 = i0.ɵɵnextContext();
790
+ i0.ɵɵadvance(9);
791
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.viewName);
792
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
793
+ i0.ɵɵadvance(4);
794
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.viewDescription);
795
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
796
+ i0.ɵɵadvance(7);
797
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.isShared);
798
+ i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
799
+ i0.ɵɵadvance(6);
800
+ i0.ɵɵconditional(ctx_r1.viewEntity && ctx_r1.canDelete ? 26 : -1);
801
+ } }
802
+ function ViewConfigPanelComponent_Conditional_31_Conditional_1_Template(rf, ctx) { if (rf & 1) {
803
+ i0.ɵɵelement(0, "i", 183);
804
+ } }
805
+ function ViewConfigPanelComponent_Conditional_31_Conditional_2_Template(rf, ctx) { if (rf & 1) {
806
+ i0.ɵɵelement(0, "i", 184);
807
+ } }
808
+ function ViewConfigPanelComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
809
+ const _r25 = i0.ɵɵgetCurrentView();
810
+ i0.ɵɵelementStart(0, "button", 182);
811
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_31_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSave()); });
812
+ i0.ɵɵtemplate(1, ViewConfigPanelComponent_Conditional_31_Conditional_1_Template, 1, 0, "i", 183)(2, ViewConfigPanelComponent_Conditional_31_Conditional_2_Template, 1, 0, "i", 184);
813
+ i0.ɵɵtext(3);
814
+ i0.ɵɵelementEnd();
815
+ } if (rf & 2) {
816
+ const ctx_r1 = i0.ɵɵnextContext();
817
+ i0.ɵɵproperty("disabled", ctx_r1.isSaving || !ctx_r1.viewName);
818
+ i0.ɵɵadvance();
819
+ i0.ɵɵconditional(ctx_r1.isSaving ? 1 : 2);
820
+ i0.ɵɵadvance(2);
821
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Saving..." : "Save", " ");
822
+ } }
823
+ function ViewConfigPanelComponent_Conditional_32_Conditional_1_Template(rf, ctx) { if (rf & 1) {
824
+ i0.ɵɵelement(0, "i", 183);
825
+ } }
826
+ function ViewConfigPanelComponent_Conditional_32_Conditional_2_Template(rf, ctx) { if (rf & 1) {
827
+ i0.ɵɵelement(0, "i", 184);
828
+ } }
829
+ function ViewConfigPanelComponent_Conditional_32_Conditional_5_Template(rf, ctx) { if (rf & 1) {
830
+ i0.ɵɵelement(0, "i", 183);
831
+ } }
832
+ function ViewConfigPanelComponent_Conditional_32_Conditional_6_Template(rf, ctx) { if (rf & 1) {
833
+ i0.ɵɵelement(0, "i", 61);
834
+ } }
835
+ function ViewConfigPanelComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
836
+ const _r26 = i0.ɵɵgetCurrentView();
837
+ i0.ɵɵelementStart(0, "button", 182);
838
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_32_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveDefaults()); });
839
+ i0.ɵɵtemplate(1, ViewConfigPanelComponent_Conditional_32_Conditional_1_Template, 1, 0, "i", 183)(2, ViewConfigPanelComponent_Conditional_32_Conditional_2_Template, 1, 0, "i", 184);
840
+ i0.ɵɵtext(3);
841
+ i0.ɵɵelementEnd();
842
+ i0.ɵɵelementStart(4, "button", 185);
843
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_32_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveAsNew()); });
844
+ i0.ɵɵtemplate(5, ViewConfigPanelComponent_Conditional_32_Conditional_5_Template, 1, 0, "i", 183)(6, ViewConfigPanelComponent_Conditional_32_Conditional_6_Template, 1, 0, "i", 61);
845
+ i0.ɵɵtext(7);
846
+ i0.ɵɵelementEnd();
847
+ } if (rf & 2) {
848
+ const ctx_r1 = i0.ɵɵnextContext();
849
+ i0.ɵɵproperty("disabled", ctx_r1.isSaving);
850
+ i0.ɵɵadvance();
851
+ i0.ɵɵconditional(ctx_r1.isSaving ? 1 : 2);
852
+ i0.ɵɵadvance(2);
853
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Saving..." : "Save", " ");
854
+ i0.ɵɵadvance();
855
+ i0.ɵɵproperty("disabled", ctx_r1.isSaving || !ctx_r1.viewName);
856
+ i0.ɵɵadvance();
857
+ i0.ɵɵconditional(ctx_r1.isSaving ? 5 : 6);
858
+ i0.ɵɵadvance(2);
859
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Creating..." : "Save As New", " ");
860
+ } }
861
+ function ViewConfigPanelComponent_Conditional_33_Conditional_1_Template(rf, ctx) { if (rf & 1) {
862
+ i0.ɵɵelement(0, "i", 183);
863
+ } }
864
+ function ViewConfigPanelComponent_Conditional_33_Conditional_2_Template(rf, ctx) { if (rf & 1) {
865
+ i0.ɵɵelement(0, "i", 61);
866
+ } }
867
+ function ViewConfigPanelComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
868
+ const _r27 = i0.ɵɵgetCurrentView();
869
+ i0.ɵɵelementStart(0, "button", 185);
870
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveAsNew()); });
871
+ i0.ɵɵtemplate(1, ViewConfigPanelComponent_Conditional_33_Conditional_1_Template, 1, 0, "i", 183)(2, ViewConfigPanelComponent_Conditional_33_Conditional_2_Template, 1, 0, "i", 61);
872
+ i0.ɵɵtext(3, " Save As New ");
873
+ i0.ɵɵelementEnd();
874
+ } if (rf & 2) {
875
+ const ctx_r1 = i0.ɵɵnextContext();
876
+ i0.ɵɵproperty("disabled", ctx_r1.isSaving);
877
+ i0.ɵɵadvance();
878
+ i0.ɵɵconditional(ctx_r1.isSaving ? 1 : 2);
879
+ } }
880
+ /**
881
+ * ViewConfigPanelComponent - Sliding panel for configuring view settings
882
+ *
883
+ * Features:
884
+ * - Column visibility and ordering with drag-drop
885
+ * - Column formatting (number, currency, date, etc.)
886
+ * - Sort configuration
887
+ * - View name and description editing
888
+ * - Share settings
889
+ * - Save / Save As New / Cancel actions
890
+ */
891
+ export class ViewConfigPanelComponent {
892
+ cdr;
893
+ /**
894
+ * The entity being viewed
895
+ */
896
+ entity = null;
897
+ /**
898
+ * The current view entity (null for default view)
899
+ */
900
+ viewEntity = null;
901
+ /**
902
+ * Whether the panel is open
903
+ */
904
+ isOpen = false;
905
+ /**
906
+ * Current grid state from the grid (includes live column widths/order from user interaction)
907
+ * This takes precedence over viewEntity.Columns for showing current state
908
+ */
909
+ currentGridState = null;
910
+ /**
911
+ * Sample data for column format preview (first few records)
912
+ */
913
+ sampleData = [];
914
+ /**
915
+ * Emitted when the panel should close
916
+ */
917
+ close = new EventEmitter();
918
+ /**
919
+ * Emitted when the view should be saved
920
+ */
921
+ save = new EventEmitter();
922
+ /**
923
+ * Emitted when default view settings should be saved to user settings
924
+ * (Used for dynamic/default views that persist to MJ: User Settings)
925
+ */
926
+ saveDefaults = new EventEmitter();
927
+ /**
928
+ * Emitted when the view should be deleted
929
+ */
930
+ delete = new EventEmitter();
931
+ /**
932
+ * Emitted when filter dialog should be opened (at dashboard level for full width)
933
+ */
934
+ openFilterDialogRequest = new EventEmitter();
935
+ /**
936
+ * Filter state from external dialog (set by parent after dialog closes)
937
+ */
938
+ externalFilterState = null;
939
+ // Form state
940
+ viewName = '';
941
+ viewDescription = '';
942
+ isShared = false;
943
+ columns = [];
944
+ sortField = null;
945
+ sortDirection = 'asc';
946
+ // Smart Filter state
947
+ smartFilterEnabled = false;
948
+ smartFilterPrompt = '';
949
+ smartFilterExplanation = '';
950
+ // Traditional Filter state
951
+ filterState = createEmptyFilter();
952
+ filterFields = [];
953
+ // Filter mode: 'smart' or 'traditional' (mutually exclusive)
954
+ filterMode = 'smart';
955
+ // UI state
956
+ activeTab = 'columns';
957
+ isSaving = false;
958
+ columnSearchText = '';
959
+ // Drag state for column reordering
960
+ draggedColumn = null;
961
+ dropTargetColumn = null;
962
+ dropPosition = null;
963
+ // Column format editing state
964
+ formatEditingColumn = null;
965
+ // Panel resize state
966
+ isResizing = false;
967
+ panelWidth = 400;
968
+ MIN_PANEL_WIDTH = 320;
969
+ MAX_PANEL_WIDTH = 800;
970
+ DEFAULT_PANEL_WIDTH = 400;
971
+ resizeStartX = 0;
972
+ resizeStartWidth = 0;
973
+ metadata = new Metadata();
974
+ constructor(cdr) {
975
+ this.cdr = cdr;
976
+ }
977
+ /**
978
+ * Handle keyboard shortcuts
979
+ * Escape: Close the panel or format sub-panel
980
+ */
981
+ handleEscape() {
982
+ if (this.formatEditingColumn) {
983
+ this.closeFormatEditor();
984
+ }
985
+ else if (this.isOpen) {
986
+ this.onClose();
987
+ }
988
+ }
989
+ // ========================================
990
+ // PANEL RESIZE HANDLERS
991
+ // ========================================
992
+ /**
993
+ * Start resizing the panel
994
+ */
995
+ onResizeStart(event) {
996
+ event.preventDefault();
997
+ this.isResizing = true;
998
+ this.resizeStartX = event.clientX;
999
+ this.resizeStartWidth = this.panelWidth;
1000
+ // Add document-level listeners for mouse move and up
1001
+ document.addEventListener('mousemove', this.onResizeMove);
1002
+ document.addEventListener('mouseup', this.onResizeEnd);
1003
+ document.body.style.cursor = 'ew-resize';
1004
+ document.body.style.userSelect = 'none';
1005
+ }
1006
+ /**
1007
+ * Handle resize movement (bound to document)
1008
+ */
1009
+ onResizeMove = (event) => {
1010
+ if (!this.isResizing)
1011
+ return;
1012
+ // Calculate new width (panel is on the right, so moving left increases width)
1013
+ const deltaX = this.resizeStartX - event.clientX;
1014
+ let newWidth = this.resizeStartWidth + deltaX;
1015
+ // Clamp to min/max bounds
1016
+ newWidth = Math.max(this.MIN_PANEL_WIDTH, Math.min(this.MAX_PANEL_WIDTH, newWidth));
1017
+ this.panelWidth = newWidth;
1018
+ this.cdr.detectChanges();
1019
+ };
1020
+ /**
1021
+ * End resizing the panel (bound to document)
1022
+ */
1023
+ onResizeEnd = () => {
1024
+ this.isResizing = false;
1025
+ document.removeEventListener('mousemove', this.onResizeMove);
1026
+ document.removeEventListener('mouseup', this.onResizeEnd);
1027
+ document.body.style.cursor = '';
1028
+ document.body.style.userSelect = '';
1029
+ this.cdr.detectChanges();
1030
+ };
1031
+ ngOnInit() {
1032
+ this.initializeFromEntity();
1033
+ }
1034
+ ngOnChanges(changes) {
1035
+ // Reset to first tab and clear search when panel opens
1036
+ if (changes['isOpen'] && this.isOpen) {
1037
+ this.activeTab = 'columns';
1038
+ this.columnSearchText = '';
1039
+ this.formatEditingColumn = null;
1040
+ }
1041
+ if (changes['entity'] || changes['viewEntity'] || changes['currentGridState']) {
1042
+ this.initializeFromEntity();
1043
+ }
1044
+ // Apply external filter state when it changes (from dashboard-level dialog)
1045
+ if (changes['externalFilterState'] && this.externalFilterState) {
1046
+ this.filterState = this.externalFilterState;
1047
+ this.cdr.detectChanges();
1048
+ }
1049
+ }
1050
+ /**
1051
+ * Initialize form state from entity and view
1052
+ * Priority for column state: currentGridState > viewEntity.Columns > entity defaults
1053
+ */
1054
+ initializeFromEntity() {
1055
+ if (!this.entity) {
1056
+ this.columns = [];
1057
+ return;
1058
+ }
1059
+ // Initialize columns from entity fields (including __mj_ fields for audit/timestamp info)
1060
+ this.columns = this.entity.Fields
1061
+ .map((field, index) => ({
1062
+ fieldId: field.ID,
1063
+ fieldName: field.Name,
1064
+ displayName: field.DisplayNameOrName,
1065
+ userDisplayName: undefined,
1066
+ visible: field.DefaultInView,
1067
+ width: field.DefaultColumnWidth || null,
1068
+ orderIndex: index,
1069
+ field,
1070
+ format: undefined
1071
+ }));
1072
+ // Priority 1: Use currentGridState if available (reflects live grid state including resizes)
1073
+ if (this.currentGridState?.columnSettings && this.currentGridState.columnSettings.length > 0) {
1074
+ this.applyGridStateToColumns(this.currentGridState.columnSettings);
1075
+ // Also apply sort from currentGridState
1076
+ if (this.currentGridState.sortSettings && this.currentGridState.sortSettings.length > 0) {
1077
+ this.sortField = this.currentGridState.sortSettings[0].field;
1078
+ this.sortDirection = this.currentGridState.sortSettings[0].dir;
1079
+ }
1080
+ }
1081
+ // Priority 2: If we have a view, apply its column configuration
1082
+ else if (this.viewEntity) {
1083
+ const viewColumns = this.viewEntity.Columns;
1084
+ if (viewColumns && viewColumns.length > 0) {
1085
+ // Mark all columns as hidden initially
1086
+ this.columns.forEach(c => c.visible = false);
1087
+ // Apply view column settings
1088
+ viewColumns.forEach((vc, idx) => {
1089
+ const column = this.columns.find(c => c.fieldName.toLowerCase() === vc.Name?.toLowerCase());
1090
+ if (column) {
1091
+ column.visible = !vc.hidden;
1092
+ column.width = vc.width || null;
1093
+ column.orderIndex = vc.orderIndex ?? idx;
1094
+ // Apply userDisplayName if present
1095
+ if (vc.userDisplayName) {
1096
+ column.userDisplayName = vc.userDisplayName;
1097
+ }
1098
+ // Apply format if present
1099
+ if (vc.format) {
1100
+ column.format = vc.format;
1101
+ }
1102
+ }
1103
+ });
1104
+ // Sort by orderIndex
1105
+ this.columns.sort((a, b) => a.orderIndex - b.orderIndex);
1106
+ }
1107
+ // Apply view's sort configuration
1108
+ const sortInfo = this.viewEntity.ViewSortInfo;
1109
+ if (sortInfo && sortInfo.length > 0) {
1110
+ this.sortField = sortInfo[0].field;
1111
+ this.sortDirection = sortInfo[0].direction === 'Desc' ? 'desc' : 'asc';
1112
+ }
1113
+ }
1114
+ // Initialize filter fields from entity
1115
+ this.filterFields = this.buildFilterFields();
1116
+ // Apply view entity metadata (name, description, etc.) if available
1117
+ if (this.viewEntity) {
1118
+ this.viewName = this.viewEntity.Name;
1119
+ this.viewDescription = this.viewEntity.Description || '';
1120
+ this.isShared = this.viewEntity.IsShared;
1121
+ // Apply view's smart filter configuration
1122
+ this.smartFilterEnabled = this.viewEntity.SmartFilterEnabled || false;
1123
+ this.smartFilterPrompt = this.viewEntity.SmartFilterPrompt || '';
1124
+ this.smartFilterExplanation = this.viewEntity.SmartFilterExplanation || '';
1125
+ // Apply view's traditional filter state
1126
+ this.filterState = this.parseFilterState(this.viewEntity.FilterState);
1127
+ // Set filter mode based on which type of filter is active
1128
+ // Smart filter takes precedence if enabled
1129
+ if (this.smartFilterEnabled && this.smartFilterPrompt) {
1130
+ this.filterMode = 'smart';
1131
+ }
1132
+ else if (this.getFilterCount() > 0) {
1133
+ this.filterMode = 'traditional';
1134
+ }
1135
+ else {
1136
+ // Default to smart mode for new/empty filters (promote AI filtering)
1137
+ this.filterMode = 'smart';
1138
+ this.smartFilterEnabled = true;
1139
+ }
1140
+ }
1141
+ else {
1142
+ // Default view - use entity defaults
1143
+ this.viewName = '';
1144
+ this.viewDescription = '';
1145
+ this.isShared = false;
1146
+ if (!this.currentGridState?.sortSettings?.length) {
1147
+ this.sortField = null;
1148
+ this.sortDirection = 'asc';
1149
+ }
1150
+ this.smartFilterPrompt = '';
1151
+ this.smartFilterExplanation = '';
1152
+ this.filterState = createEmptyFilter();
1153
+ // Default to smart mode (promote AI filtering)
1154
+ this.filterMode = 'smart';
1155
+ this.smartFilterEnabled = true;
1156
+ }
1157
+ this.cdr.detectChanges();
1158
+ }
1159
+ /**
1160
+ * Build filter fields from entity fields (including __mj_ fields for filtering by timestamps)
1161
+ */
1162
+ buildFilterFields() {
1163
+ if (!this.entity)
1164
+ return [];
1165
+ return this.entity.Fields
1166
+ .filter(f => !f.IsBinaryFieldType)
1167
+ .map(field => ({
1168
+ name: field.Name,
1169
+ displayName: field.DisplayNameOrName,
1170
+ type: this.mapFieldType(field),
1171
+ lookupEntityName: field.RelatedEntity || undefined,
1172
+ valueList: field.ValueListType === 'List' && field.EntityFieldValues?.length > 0
1173
+ ? field.EntityFieldValues.map(v => ({ value: v.Value, label: v.Value }))
1174
+ : undefined
1175
+ }));
1176
+ }
1177
+ /**
1178
+ * Map entity field type to filter field type
1179
+ */
1180
+ mapFieldType(field) {
1181
+ // Check for lookup first - RelatedEntity is a string (entity name) if it's a lookup field
1182
+ if (field.RelatedEntity) {
1183
+ return 'lookup';
1184
+ }
1185
+ // Map based on SQL type
1186
+ const sqlType = field.Type.toLowerCase();
1187
+ if (sqlType.includes('bit') || sqlType === 'boolean') {
1188
+ return 'boolean';
1189
+ }
1190
+ if (sqlType.includes('date') || sqlType.includes('time')) {
1191
+ return 'date';
1192
+ }
1193
+ if (sqlType.includes('int') || sqlType.includes('decimal') ||
1194
+ sqlType.includes('numeric') || sqlType.includes('float') ||
1195
+ sqlType.includes('real') || sqlType.includes('money')) {
1196
+ return 'number';
1197
+ }
1198
+ return 'string';
1199
+ }
1200
+ /**
1201
+ * Parse the filter state from JSON string
1202
+ */
1203
+ parseFilterState(filterStateJson) {
1204
+ if (!filterStateJson) {
1205
+ return createEmptyFilter();
1206
+ }
1207
+ try {
1208
+ const parsed = JSON.parse(filterStateJson);
1209
+ // Validate it has the expected structure
1210
+ if (parsed && typeof parsed === 'object' && 'logic' in parsed && 'filters' in parsed) {
1211
+ return parsed;
1212
+ }
1213
+ return createEmptyFilter();
1214
+ }
1215
+ catch {
1216
+ return createEmptyFilter();
1217
+ }
1218
+ }
1219
+ /**
1220
+ * Handle filter state change from filter builder
1221
+ */
1222
+ onFilterChange(filter) {
1223
+ this.filterState = filter;
1224
+ this.cdr.detectChanges();
1225
+ }
1226
+ /**
1227
+ * Open the filter dialog - emits event to parent (dashboard) which renders the dialog at viewport level
1228
+ */
1229
+ openFilterDialog() {
1230
+ this.openFilterDialogRequest.emit({
1231
+ filterState: this.filterState,
1232
+ filterFields: this.filterFields
1233
+ });
1234
+ }
1235
+ /**
1236
+ * Get the count of active filter rules
1237
+ */
1238
+ getFilterCount() {
1239
+ return this.countFilters(this.filterState);
1240
+ }
1241
+ /**
1242
+ * Count filters recursively
1243
+ */
1244
+ countFilters(filter) {
1245
+ let count = 0;
1246
+ for (const item of filter.filters || []) {
1247
+ if ('logic' in item && 'filters' in item) {
1248
+ count += this.countFilters(item);
1249
+ }
1250
+ else if ('field' in item) {
1251
+ count++;
1252
+ }
1253
+ }
1254
+ return count;
1255
+ }
1256
+ /**
1257
+ * Get a human-readable summary of the filter state
1258
+ */
1259
+ getFilterSummary() {
1260
+ const count = this.getFilterCount();
1261
+ if (count === 0) {
1262
+ return 'No filters applied';
1263
+ }
1264
+ return `${count} filter${count !== 1 ? 's' : ''} active`;
1265
+ }
1266
+ /**
1267
+ * Clear all filters
1268
+ */
1269
+ clearFilters() {
1270
+ this.filterState = createEmptyFilter();
1271
+ this.cdr.detectChanges();
1272
+ }
1273
+ /**
1274
+ * Apply grid state column settings to the columns array
1275
+ */
1276
+ applyGridStateToColumns(gridColumns) {
1277
+ // Mark all columns as hidden initially
1278
+ this.columns.forEach(c => c.visible = false);
1279
+ // Apply grid state column settings
1280
+ gridColumns.forEach((gc, idx) => {
1281
+ const column = this.columns.find(c => c.fieldName.toLowerCase() === gc.Name.toLowerCase());
1282
+ if (column) {
1283
+ column.visible = !gc.hidden;
1284
+ column.width = gc.width || null;
1285
+ column.orderIndex = gc.orderIndex ?? idx;
1286
+ if (gc.DisplayName) {
1287
+ column.displayName = gc.DisplayName;
1288
+ }
1289
+ // Apply userDisplayName if present
1290
+ if (gc.userDisplayName) {
1291
+ column.userDisplayName = gc.userDisplayName;
1292
+ }
1293
+ // Apply format if present
1294
+ if (gc.format) {
1295
+ column.format = gc.format;
1296
+ }
1297
+ }
1298
+ });
1299
+ // Sort by orderIndex
1300
+ this.columns.sort((a, b) => a.orderIndex - b.orderIndex);
1301
+ }
1302
+ /**
1303
+ * Get visible columns
1304
+ */
1305
+ get visibleColumns() {
1306
+ return this.columns.filter(c => c.visible);
1307
+ }
1308
+ /**
1309
+ * Get hidden columns
1310
+ */
1311
+ get hiddenColumns() {
1312
+ return this.columns.filter(c => !c.visible);
1313
+ }
1314
+ /**
1315
+ * Get filtered columns for search
1316
+ */
1317
+ get filteredHiddenColumns() {
1318
+ if (!this.columnSearchText) {
1319
+ return this.hiddenColumns;
1320
+ }
1321
+ const search = this.columnSearchText.toLowerCase();
1322
+ return this.hiddenColumns.filter(c => c.displayName.toLowerCase().includes(search) ||
1323
+ c.fieldName.toLowerCase().includes(search));
1324
+ }
1325
+ /**
1326
+ * Get sortable fields for dropdown (including __mj_ fields for sorting by timestamps)
1327
+ */
1328
+ get sortableFields() {
1329
+ if (!this.entity)
1330
+ return [];
1331
+ return this.entity.Fields.filter(f => !f.IsBinaryFieldType // Exclude binary fields from sorting
1332
+ );
1333
+ }
1334
+ /**
1335
+ * Check if the current user can edit the view
1336
+ */
1337
+ get canEdit() {
1338
+ if (!this.viewEntity)
1339
+ return true; // Can always create new
1340
+ return this.viewEntity.UserCanEdit;
1341
+ }
1342
+ /**
1343
+ * Check if the current user can delete the view
1344
+ */
1345
+ get canDelete() {
1346
+ if (!this.viewEntity)
1347
+ return false; // Can't delete default
1348
+ return this.viewEntity.UserCanDelete;
1349
+ }
1350
+ /**
1351
+ * Toggle column visibility
1352
+ */
1353
+ toggleColumnVisibility(column) {
1354
+ column.visible = !column.visible;
1355
+ if (column.visible) {
1356
+ // Add to end of visible columns
1357
+ column.orderIndex = this.visibleColumns.length;
1358
+ }
1359
+ this.cdr.detectChanges();
1360
+ }
1361
+ /**
1362
+ * Move column up in order
1363
+ */
1364
+ moveColumnUp(column) {
1365
+ const visibleCols = this.visibleColumns;
1366
+ const currentIndex = visibleCols.indexOf(column);
1367
+ if (currentIndex > 0) {
1368
+ const prevColumn = visibleCols[currentIndex - 1];
1369
+ const tempOrder = column.orderIndex;
1370
+ column.orderIndex = prevColumn.orderIndex;
1371
+ prevColumn.orderIndex = tempOrder;
1372
+ this.columns.sort((a, b) => a.orderIndex - b.orderIndex);
1373
+ this.cdr.detectChanges();
1374
+ }
1375
+ }
1376
+ /**
1377
+ * Move column down in order
1378
+ */
1379
+ moveColumnDown(column) {
1380
+ const visibleCols = this.visibleColumns;
1381
+ const currentIndex = visibleCols.indexOf(column);
1382
+ if (currentIndex < visibleCols.length - 1) {
1383
+ const nextColumn = visibleCols[currentIndex + 1];
1384
+ const tempOrder = column.orderIndex;
1385
+ column.orderIndex = nextColumn.orderIndex;
1386
+ nextColumn.orderIndex = tempOrder;
1387
+ this.columns.sort((a, b) => a.orderIndex - b.orderIndex);
1388
+ this.cdr.detectChanges();
1389
+ }
1390
+ }
1391
+ // ========================================
1392
+ // DRAG AND DROP WITH DROP INDICATOR
1393
+ // ========================================
1394
+ /**
1395
+ * Handle drag start for column reordering
1396
+ */
1397
+ onDragStart(event, column) {
1398
+ this.draggedColumn = column;
1399
+ if (event.dataTransfer) {
1400
+ event.dataTransfer.effectAllowed = 'move';
1401
+ event.dataTransfer.setData('text/plain', column.fieldId);
1402
+ }
1403
+ // Add dragging class to the element
1404
+ event.target.classList.add('dragging');
1405
+ }
1406
+ /**
1407
+ * Handle drag over for column reordering - determines drop position
1408
+ */
1409
+ onDragOver(event, column) {
1410
+ event.preventDefault();
1411
+ if (event.dataTransfer) {
1412
+ event.dataTransfer.dropEffect = 'move';
1413
+ }
1414
+ if (!this.draggedColumn || this.draggedColumn === column) {
1415
+ this.dropTargetColumn = null;
1416
+ this.dropPosition = null;
1417
+ return;
1418
+ }
1419
+ // Calculate if we're in the top or bottom half of the target
1420
+ const rect = event.currentTarget.getBoundingClientRect();
1421
+ const y = event.clientY - rect.top;
1422
+ const threshold = rect.height / 2;
1423
+ this.dropTargetColumn = column;
1424
+ this.dropPosition = y < threshold ? 'before' : 'after';
1425
+ }
1426
+ /**
1427
+ * Handle drag leave - clear drop indicator
1428
+ */
1429
+ onDragLeave(event) {
1430
+ // Only clear if we're leaving the column item, not entering a child element
1431
+ const relatedTarget = event.relatedTarget;
1432
+ const currentTarget = event.currentTarget;
1433
+ if (!currentTarget.contains(relatedTarget)) {
1434
+ this.dropTargetColumn = null;
1435
+ this.dropPosition = null;
1436
+ }
1437
+ }
1438
+ /**
1439
+ * Handle drop for column reordering
1440
+ */
1441
+ onDrop(event, targetColumn) {
1442
+ event.preventDefault();
1443
+ if (this.draggedColumn && this.draggedColumn !== targetColumn && this.dropPosition) {
1444
+ const visibleCols = this.visibleColumns;
1445
+ const draggedIndex = visibleCols.indexOf(this.draggedColumn);
1446
+ let targetIndex = visibleCols.indexOf(targetColumn);
1447
+ // Adjust target index based on drop position
1448
+ if (this.dropPosition === 'after') {
1449
+ targetIndex++;
1450
+ }
1451
+ // If dragging from before target, adjust for removal
1452
+ if (draggedIndex < targetIndex) {
1453
+ targetIndex--;
1454
+ }
1455
+ // Reorder the columns
1456
+ this.reorderColumn(this.draggedColumn, targetIndex);
1457
+ }
1458
+ this.clearDragState();
1459
+ }
1460
+ /**
1461
+ * Handle drag end
1462
+ */
1463
+ onDragEnd(event) {
1464
+ event.target.classList.remove('dragging');
1465
+ this.clearDragState();
1466
+ }
1467
+ /**
1468
+ * Clear all drag state
1469
+ */
1470
+ clearDragState() {
1471
+ this.draggedColumn = null;
1472
+ this.dropTargetColumn = null;
1473
+ this.dropPosition = null;
1474
+ this.cdr.detectChanges();
1475
+ }
1476
+ /**
1477
+ * Reorder a column to a new position
1478
+ */
1479
+ reorderColumn(column, newIndex) {
1480
+ const visibleCols = this.visibleColumns;
1481
+ // Remove from current position
1482
+ const currentIndex = visibleCols.indexOf(column);
1483
+ if (currentIndex === newIndex)
1484
+ return;
1485
+ // Update order indices
1486
+ visibleCols.forEach((col, idx) => {
1487
+ if (col === column) {
1488
+ col.orderIndex = newIndex;
1489
+ }
1490
+ else if (currentIndex < newIndex) {
1491
+ // Dragging down - shift items between old and new position up
1492
+ if (idx > currentIndex && idx <= newIndex) {
1493
+ col.orderIndex = idx - 1;
1494
+ }
1495
+ }
1496
+ else {
1497
+ // Dragging up - shift items between new and old position down
1498
+ if (idx >= newIndex && idx < currentIndex) {
1499
+ col.orderIndex = idx + 1;
1500
+ }
1501
+ }
1502
+ });
1503
+ // Re-sort all columns by orderIndex
1504
+ this.columns.sort((a, b) => a.orderIndex - b.orderIndex);
1505
+ this.cdr.detectChanges();
1506
+ }
1507
+ /**
1508
+ * Check if drop indicator should show before a column
1509
+ */
1510
+ isDropBefore(column) {
1511
+ return this.dropTargetColumn === column && this.dropPosition === 'before';
1512
+ }
1513
+ /**
1514
+ * Check if drop indicator should show after a column
1515
+ */
1516
+ isDropAfter(column) {
1517
+ return this.dropTargetColumn === column && this.dropPosition === 'after';
1518
+ }
1519
+ // ========================================
1520
+ // COLUMN FORMAT EDITOR
1521
+ // ========================================
1522
+ /**
1523
+ * Open the format editor for a column
1524
+ */
1525
+ openFormatEditor(column) {
1526
+ // Initialize format if not present
1527
+ if (!column.format) {
1528
+ column.format = this.getDefaultFormat(column.field);
1529
+ }
1530
+ this.formatEditingColumn = column;
1531
+ this.cdr.detectChanges();
1532
+ }
1533
+ /**
1534
+ * Close the format editor
1535
+ */
1536
+ closeFormatEditor() {
1537
+ this.formatEditingColumn = null;
1538
+ this.cdr.detectChanges();
1539
+ }
1540
+ /**
1541
+ * Get default format based on field type
1542
+ */
1543
+ getDefaultFormat(field) {
1544
+ const sqlType = field.Type.toLowerCase();
1545
+ if (sqlType.includes('money') || sqlType.includes('currency')) {
1546
+ return { type: 'currency', decimals: 2, currencyCode: 'USD', thousandsSeparator: true };
1547
+ }
1548
+ if (sqlType.includes('percent')) {
1549
+ return { type: 'percent', decimals: 1 };
1550
+ }
1551
+ if (sqlType.includes('decimal') || sqlType.includes('numeric') || sqlType.includes('float') || sqlType.includes('real')) {
1552
+ return { type: 'number', decimals: 2, thousandsSeparator: true };
1553
+ }
1554
+ if (sqlType.includes('int')) {
1555
+ return { type: 'number', decimals: 0, thousandsSeparator: true };
1556
+ }
1557
+ if (sqlType.includes('datetime')) {
1558
+ return { type: 'datetime', dateFormat: 'medium' };
1559
+ }
1560
+ if (sqlType.includes('date')) {
1561
+ return { type: 'date', dateFormat: 'medium' };
1562
+ }
1563
+ if (sqlType.includes('bit') || sqlType === 'boolean') {
1564
+ return { type: 'boolean', trueLabel: 'Yes', falseLabel: 'No', booleanDisplay: 'text' };
1565
+ }
1566
+ return { type: 'auto' };
1567
+ }
1568
+ /**
1569
+ * Check if a column has custom formatting applied
1570
+ */
1571
+ hasCustomFormat(column) {
1572
+ return !!column.format && column.format.type !== 'auto';
1573
+ }
1574
+ /**
1575
+ * Clear formatting for a column
1576
+ */
1577
+ clearColumnFormat(column) {
1578
+ column.format = undefined;
1579
+ this.cdr.detectChanges();
1580
+ }
1581
+ /**
1582
+ * Get sample values for preview
1583
+ */
1584
+ getSampleValues(column) {
1585
+ if (!this.sampleData || this.sampleData.length === 0) {
1586
+ return this.getPlaceholderSamples(column.field);
1587
+ }
1588
+ return this.sampleData
1589
+ .slice(0, 5)
1590
+ .map(row => row[column.fieldName])
1591
+ .filter(v => v != null);
1592
+ }
1593
+ /**
1594
+ * Get placeholder sample values when no data available
1595
+ */
1596
+ getPlaceholderSamples(field) {
1597
+ const sqlType = field.Type.toLowerCase();
1598
+ if (sqlType.includes('money') || sqlType.includes('decimal') || sqlType.includes('numeric')) {
1599
+ return [1234.56, -567.89, 10000.00, 0.50, 999999.99];
1600
+ }
1601
+ if (sqlType.includes('int')) {
1602
+ return [42, 100, 1500, 0, -25];
1603
+ }
1604
+ if (sqlType.includes('date')) {
1605
+ const now = new Date();
1606
+ return [
1607
+ new Date(now.getTime() - 86400000),
1608
+ new Date(now.getTime() - 172800000),
1609
+ now,
1610
+ new Date(now.getTime() + 86400000),
1611
+ new Date(now.getTime() - 604800000)
1612
+ ];
1613
+ }
1614
+ if (sqlType.includes('bit') || sqlType === 'boolean') {
1615
+ return [true, false, true, false, true];
1616
+ }
1617
+ return ['Sample', 'Text', 'Values', 'Here', 'Preview'];
1618
+ }
1619
+ /**
1620
+ * Format a value for preview display
1621
+ */
1622
+ formatPreviewValue(value, format) {
1623
+ if (value == null)
1624
+ return '—';
1625
+ if (!format || format.type === 'auto')
1626
+ return String(value);
1627
+ switch (format.type) {
1628
+ case 'number':
1629
+ return this.formatNumber(value, format);
1630
+ case 'currency':
1631
+ return this.formatCurrency(value, format);
1632
+ case 'percent':
1633
+ return this.formatPercent(value, format);
1634
+ case 'date':
1635
+ case 'datetime':
1636
+ return this.formatDate(value, format);
1637
+ case 'boolean':
1638
+ return this.formatBoolean(value, format);
1639
+ default:
1640
+ return String(value);
1641
+ }
1642
+ }
1643
+ formatNumber(value, format) {
1644
+ const options = {
1645
+ minimumFractionDigits: format.decimals ?? 0,
1646
+ maximumFractionDigits: format.decimals ?? 0,
1647
+ useGrouping: format.thousandsSeparator ?? true
1648
+ };
1649
+ return new Intl.NumberFormat('en-US', options).format(value);
1650
+ }
1651
+ formatCurrency(value, format) {
1652
+ const options = {
1653
+ style: 'currency',
1654
+ currency: format.currencyCode || 'USD',
1655
+ minimumFractionDigits: format.decimals ?? 2,
1656
+ maximumFractionDigits: format.decimals ?? 2
1657
+ };
1658
+ return new Intl.NumberFormat('en-US', options).format(value);
1659
+ }
1660
+ formatPercent(value, format) {
1661
+ const options = {
1662
+ style: 'percent',
1663
+ minimumFractionDigits: format.decimals ?? 0,
1664
+ maximumFractionDigits: format.decimals ?? 0
1665
+ };
1666
+ // Assume value is already a percentage (e.g., 50 = 50%), divide by 100
1667
+ return new Intl.NumberFormat('en-US', options).format(value / 100);
1668
+ }
1669
+ formatDate(value, format) {
1670
+ const date = value instanceof Date ? value : new Date(value);
1671
+ if (isNaN(date.getTime()))
1672
+ return String(value);
1673
+ // Parse format string - check for weekday variants
1674
+ const formatStr = format.dateFormat || 'medium';
1675
+ const includeWeekday = formatStr.includes('-weekday');
1676
+ const baseFormat = formatStr.replace('-weekday', '');
1677
+ let options;
1678
+ // Intl.DateTimeFormat doesn't allow combining dateStyle with weekday
1679
+ // So we must use individual components when weekday is requested
1680
+ if (includeWeekday) {
1681
+ if (baseFormat === 'short') {
1682
+ options = { weekday: 'short', month: 'numeric', day: 'numeric', year: '2-digit' };
1683
+ }
1684
+ else if (baseFormat === 'long') {
1685
+ options = { weekday: 'long', month: 'long', day: 'numeric', year: 'numeric' };
1686
+ }
1687
+ else {
1688
+ // medium
1689
+ options = { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric' };
1690
+ }
1691
+ if (format.type === 'datetime') {
1692
+ options.hour = 'numeric';
1693
+ options.minute = '2-digit';
1694
+ }
1695
+ }
1696
+ else {
1697
+ // No weekday - can use dateStyle shorthand
1698
+ options = {
1699
+ dateStyle: baseFormat === 'short' ? 'short' : baseFormat === 'long' ? 'long' : 'medium'
1700
+ };
1701
+ if (format.type === 'datetime') {
1702
+ options.timeStyle = 'short';
1703
+ }
1704
+ }
1705
+ return new Intl.DateTimeFormat('en-US', options).format(date);
1706
+ }
1707
+ formatBoolean(value, format) {
1708
+ return value ? (format.trueLabel || 'Yes') : (format.falseLabel || 'No');
1709
+ }
1710
+ // ========================================
1711
+ // CLOSE / SAVE / DELETE
1712
+ // ========================================
1713
+ /**
1714
+ * Close the panel
1715
+ */
1716
+ onClose() {
1717
+ this.close.emit();
1718
+ }
1719
+ /**
1720
+ * Check if filter state has any active filters
1721
+ */
1722
+ hasActiveFilters() {
1723
+ return this.filterState?.filters?.length > 0;
1724
+ }
1725
+ /**
1726
+ * Save the view
1727
+ */
1728
+ onSave() {
1729
+ // Guard against double-clicks or rapid repeated calls
1730
+ if (this.isSaving)
1731
+ return;
1732
+ this.save.emit({
1733
+ name: this.viewName,
1734
+ description: this.viewDescription,
1735
+ isShared: this.isShared,
1736
+ saveAsNew: false,
1737
+ columns: this.visibleColumns,
1738
+ sortField: this.sortField,
1739
+ sortDirection: this.sortDirection,
1740
+ smartFilterEnabled: this.smartFilterEnabled,
1741
+ smartFilterPrompt: this.smartFilterPrompt,
1742
+ filterState: this.hasActiveFilters() ? this.filterState : null
1743
+ });
1744
+ }
1745
+ /**
1746
+ * Save as a new view
1747
+ */
1748
+ onSaveAsNew() {
1749
+ // Guard against double-clicks or rapid repeated calls
1750
+ if (this.isSaving)
1751
+ return;
1752
+ this.save.emit({
1753
+ name: this.viewName || 'New View',
1754
+ description: this.viewDescription,
1755
+ isShared: this.isShared,
1756
+ saveAsNew: true,
1757
+ columns: this.visibleColumns,
1758
+ sortField: this.sortField,
1759
+ sortDirection: this.sortDirection,
1760
+ smartFilterEnabled: this.smartFilterEnabled,
1761
+ smartFilterPrompt: this.smartFilterPrompt,
1762
+ filterState: this.hasActiveFilters() ? this.filterState : null
1763
+ });
1764
+ }
1765
+ /**
1766
+ * Save default view settings to user settings
1767
+ * Used for dynamic/default views that don't have a stored view entity
1768
+ */
1769
+ onSaveDefaults() {
1770
+ // Guard against double-clicks or rapid repeated calls
1771
+ if (this.isSaving)
1772
+ return;
1773
+ this.saveDefaults.emit({
1774
+ name: 'Default',
1775
+ description: '',
1776
+ isShared: false,
1777
+ saveAsNew: false,
1778
+ columns: this.visibleColumns,
1779
+ sortField: this.sortField,
1780
+ sortDirection: this.sortDirection,
1781
+ smartFilterEnabled: this.smartFilterEnabled,
1782
+ smartFilterPrompt: this.smartFilterPrompt,
1783
+ filterState: this.hasActiveFilters() ? this.filterState : null
1784
+ });
1785
+ }
1786
+ /**
1787
+ * Delete the view
1788
+ */
1789
+ onDelete() {
1790
+ if (confirm('Are you sure you want to delete this view?')) {
1791
+ this.delete.emit();
1792
+ }
1793
+ }
1794
+ /**
1795
+ * Set the active tab
1796
+ */
1797
+ setActiveTab(tab) {
1798
+ this.activeTab = tab;
1799
+ this.formatEditingColumn = null; // Close format editor when switching tabs
1800
+ this.cdr.detectChanges();
1801
+ }
1802
+ /**
1803
+ * Set the filter mode (smart or traditional)
1804
+ * When switching modes, clear the other mode's settings
1805
+ */
1806
+ setFilterMode(mode) {
1807
+ if (this.filterMode === mode)
1808
+ return;
1809
+ this.filterMode = mode;
1810
+ // When switching to smart mode, clear traditional filters and enable smart filter
1811
+ if (mode === 'smart') {
1812
+ this.smartFilterEnabled = true;
1813
+ this.filterState = createEmptyFilter();
1814
+ }
1815
+ // When switching to traditional mode, disable smart filter and clear its prompt
1816
+ else {
1817
+ this.smartFilterEnabled = false;
1818
+ this.smartFilterPrompt = '';
1819
+ this.smartFilterExplanation = '';
1820
+ }
1821
+ this.cdr.detectChanges();
1822
+ }
1823
+ /**
1824
+ * Apply a smart filter example to the prompt field
1825
+ */
1826
+ applySmartFilterExample(example) {
1827
+ this.smartFilterPrompt = example;
1828
+ this.cdr.detectChanges();
1829
+ }
1830
+ // ========================================
1831
+ // STYLE UPDATE HELPERS
1832
+ // ========================================
1833
+ /**
1834
+ * Toggle a header style property
1835
+ */
1836
+ toggleHeaderStyle(prop) {
1837
+ if (!this.formatEditingColumn?.format)
1838
+ return;
1839
+ const format = this.formatEditingColumn.format;
1840
+ if (!format.headerStyle) {
1841
+ format.headerStyle = {};
1842
+ }
1843
+ if (prop === 'bold' || prop === 'italic' || prop === 'underline') {
1844
+ format.headerStyle[prop] = !format.headerStyle[prop];
1845
+ }
1846
+ this.cdr.detectChanges();
1847
+ }
1848
+ /**
1849
+ * Update the user-defined display name for a column
1850
+ */
1851
+ updateUserDisplayName(value) {
1852
+ if (!this.formatEditingColumn)
1853
+ return;
1854
+ // Set to undefined if empty string, otherwise use the value
1855
+ this.formatEditingColumn.userDisplayName = value.trim() || undefined;
1856
+ this.cdr.detectChanges();
1857
+ }
1858
+ /**
1859
+ * Update a header style color property
1860
+ */
1861
+ updateHeaderColor(prop, value) {
1862
+ if (!this.formatEditingColumn?.format)
1863
+ return;
1864
+ const format = this.formatEditingColumn.format;
1865
+ if (!format.headerStyle) {
1866
+ format.headerStyle = {};
1867
+ }
1868
+ format.headerStyle[prop] = value;
1869
+ this.cdr.detectChanges();
1870
+ }
1871
+ /**
1872
+ * Toggle a cell style property
1873
+ */
1874
+ toggleCellStyle(prop) {
1875
+ if (!this.formatEditingColumn?.format)
1876
+ return;
1877
+ const format = this.formatEditingColumn.format;
1878
+ if (!format.cellStyle) {
1879
+ format.cellStyle = {};
1880
+ }
1881
+ if (prop === 'bold' || prop === 'italic' || prop === 'underline') {
1882
+ format.cellStyle[prop] = !format.cellStyle[prop];
1883
+ }
1884
+ this.cdr.detectChanges();
1885
+ }
1886
+ /**
1887
+ * Update a cell style color property
1888
+ */
1889
+ updateCellColor(prop, value) {
1890
+ if (!this.formatEditingColumn?.format)
1891
+ return;
1892
+ const format = this.formatEditingColumn.format;
1893
+ if (!format.cellStyle) {
1894
+ format.cellStyle = {};
1895
+ }
1896
+ format.cellStyle[prop] = value;
1897
+ this.cdr.detectChanges();
1898
+ }
1899
+ static ɵfac = function ViewConfigPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ViewConfigPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
1900
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ViewConfigPanelComponent, selectors: [["mj-view-config-panel"]], hostBindings: function ViewConfigPanelComponent_HostBindings(rf, ctx) { if (rf & 1) {
1901
+ i0.ɵɵlistener("keydown.escape", function ViewConfigPanelComponent_keydown_escape_HostBindingHandler() { return ctx.handleEscape(); }, false, i0.ɵɵresolveDocument);
1902
+ } }, inputs: { entity: "entity", viewEntity: "viewEntity", isOpen: "isOpen", currentGridState: "currentGridState", sampleData: "sampleData", externalFilterState: "externalFilterState", isSaving: "isSaving" }, outputs: { close: "close", save: "save", saveDefaults: "saveDefaults", delete: "delete", openFilterDialogRequest: "openFilterDialogRequest" }, features: [i0.ɵɵNgOnChangesFeature], decls: 36, vars: 21, consts: [[1, "panel-backdrop"], [1, "config-panel"], ["title", "Drag to resize", 1, "resize-handle", 3, "mousedown"], [1, "resize-grip"], [1, "panel-header"], [1, "header-title"], [1, "fa-solid", "fa-sliders-h"], ["title", "Close", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "tab-nav"], [1, "tab-btn", 3, "click"], [1, "fa-solid", "fa-columns"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-cog"], [1, "panel-content"], [1, "tab-content"], [1, "format-editor"], [1, "panel-footer"], [1, "footer-left"], [1, "footer-btn", "save-btn", "primary", 3, "disabled"], [1, "footer-btn", "save-as-btn", 3, "disabled"], [1, "footer-btn", "cancel-btn", 3, "click"], [1, "panel-backdrop", 3, "click"], [1, "config-section"], [1, "section-header"], [1, "fa-solid", "fa-sort"], [1, "sort-config"], [1, "sort-field-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "sort-direction-toggle"], [1, "fa-solid", "fa-eye"], [1, "column-count"], [1, "column-list", "visible-columns"], [1, "empty-list"], [1, "fa-solid", "fa-eye-slash"], [1, "column-search"], [1, "column-list", "hidden-columns"], [1, "column-item", "hidden"], ["title", "Ascending", 1, "direction-btn", 3, "click"], [1, "fa-solid", "fa-arrow-up"], ["title", "Descending", 1, "direction-btn", 3, "click"], [1, "fa-solid", "fa-arrow-down"], [1, "drop-indicator"], ["draggable", "true", 1, "column-item", 3, "dragstart", "dragover", "dragleave", "drop", "dragend"], [1, "drag-handle"], [1, "fa-solid", "fa-grip-vertical"], [1, "column-name"], [1, "fa-solid", "fa-pen-nib", "alias-indicator", 3, "title"], ["title", "Custom formatting applied", 1, "fa-solid", "fa-paintbrush", "format-indicator"], [1, "column-actions"], ["title", "Format column", 1, "action-btn", "format-btn", 3, "click"], [1, "fa-solid", "fa-paintbrush"], ["title", "Move up", 1, "action-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["title", "Move down", 1, "action-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["title", "Hide column", 1, "action-btn", "hide-btn", 3, "click"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search columns...", 3, "ngModelChange", "ngModel"], ["title", "Show column", 1, "action-btn", "show-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "fa-solid", "fa-check-circle"], [1, "format-editor-header"], [1, "back-btn", 3, "click"], [1, "fa-solid", "fa-arrow-left"], [1, "format-editor-title"], [1, "format-section"], [1, "format-section-header"], [1, "fa-solid", "fa-pen-nib"], [1, "format-row"], ["type", "text", 1, "format-input", 3, "input", "value", "placeholder"], [1, "format-row", "alias-info"], [1, "format-preview-section"], [1, "preview-header"], [1, "preview-table"], [1, "preview-header-cell"], [1, "preview-cell", 3, "text-align", "font-weight", "font-style", "text-decoration", "color", "background-color"], [1, "fa-solid", "fa-hashtag"], [1, "format-select", 3, "ngModelChange", "ngModel"], ["value", "auto"], ["value", "text"], ["value", "number"], ["value", "currency"], ["value", "percent"], ["value", "date"], ["value", "datetime"], ["value", "boolean"], [1, "fa-solid", "fa-align-left"], [1, "alignment-toggle"], ["title", "Left", 1, "align-btn", 3, "click"], ["title", "Center", 1, "align-btn", 3, "click"], [1, "fa-solid", "fa-align-center"], ["title", "Right", 1, "align-btn", 3, "click"], [1, "fa-solid", "fa-align-right"], [1, "fa-solid", "fa-heading"], [1, "style-buttons"], ["title", "Bold", 1, "style-btn", 3, "click"], [1, "fa-solid", "fa-bold"], ["title", "Italic", 1, "style-btn", 3, "click"], [1, "fa-solid", "fa-italic"], ["title", "Underline", 1, "style-btn", 3, "click"], [1, "fa-solid", "fa-underline"], ["type", "color", 1, "color-input", 3, "input", "value"], [1, "fa-solid", "fa-table-cells"], [1, "format-actions"], [1, "clear-format-btn", 3, "click"], [1, "fa-solid", "fa-eraser"], [1, "muted-text"], ["title", "Clear alias", 1, "clear-alias-btn", 3, "click"], [1, "preview-cell"], [1, "fa-solid", "fa-sliders"], ["type", "number", "min", "0", "max", "10", 1, "format-input", "small", 3, "ngModelChange", "ngModel"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], ["value", "USD"], ["value", "EUR"], ["value", "GBP"], ["value", "JPY"], ["value", "CAD"], ["value", "AUD"], [1, "fa-solid", "fa-calendar"], ["value", "short"], ["value", "short-weekday"], ["value", "medium"], ["value", "medium-weekday"], ["value", "long"], ["value", "long-weekday"], [1, "fa-solid", "fa-toggle-on"], ["type", "text", "placeholder", "Yes", 1, "format-input", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "No", 1, "format-input", 3, "ngModelChange", "ngModel"], ["value", "checkbox"], ["value", "icon"], [1, "filter-mode-selector"], [1, "filter-mode-btn", 3, "click", "disabled"], [1, "mode-icon"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "mode-content"], [1, "mode-title"], [1, "mode-subtitle"], [1, "fa-solid", "fa-check", "mode-check"], [1, "config-section", "smart-filter-section"], [1, "config-section", "traditional-filter-section"], [1, "smart-filter-input-container"], [1, "smart-filter-icon"], ["id", "smartFilterPrompt", "placeholder", "Describe what you're looking for...", "rows", "3", 1, "smart-filter-textarea", 3, "ngModelChange", "ngModel", "disabled"], [1, "smart-filter-explanation"], [1, "smart-filter-examples"], [1, "examples-header"], [1, "fa-solid", "fa-lightbulb"], [1, "example-chips"], [1, "example-chip", 3, "click", "disabled"], [1, "fa-regular", "fa-calendar"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-star"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "smart-filter-tip"], [1, "fa-solid", "fa-robot"], [1, "filter-summary-container"], [1, "filter-summary"], [1, "summary-info"], [1, "summary-text", "no-filters"], [1, "summary-actions"], ["title", "Clear all filters", 1, "summary-btn", "clear-btn"], ["title", "Edit filters", 1, "summary-btn", "edit-btn", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-pen"], [1, "traditional-filter-tip"], [1, "filter-badge"], [1, "summary-text"], ["title", "Clear all filters", 1, "summary-btn", "clear-btn", 3, "click"], [1, "form-group"], ["for", "viewName"], ["id", "viewName", "type", "text", "placeholder", "Enter view name...", 1, "form-input", 3, "ngModelChange", "ngModel", "disabled"], ["for", "viewDescription"], ["id", "viewDescription", "placeholder", "Describe this view...", "rows", "3", 1, "form-input", "form-textarea", 3, "ngModelChange", "ngModel", "disabled"], [1, "fa-solid", "fa-share-alt"], [1, "checkbox-label"], ["type", "checkbox", 3, "ngModelChange", "ngModel", "disabled"], [1, "checkbox-text"], [1, "config-section", "danger-zone"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "delete-btn", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "footer-btn", "save-btn", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-save"], [1, "footer-btn", "save-as-btn", 3, "click", "disabled"]], template: function ViewConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
1903
+ i0.ɵɵtemplate(0, ViewConfigPanelComponent_Conditional_0_Template, 1, 0, "div", 0);
1904
+ i0.ɵɵelementStart(1, "div", 1)(2, "div", 2);
1905
+ i0.ɵɵlistener("mousedown", function ViewConfigPanelComponent_Template_div_mousedown_2_listener($event) { return ctx.onResizeStart($event); });
1906
+ i0.ɵɵelement(3, "div", 3);
1907
+ i0.ɵɵelementEnd();
1908
+ i0.ɵɵelementStart(4, "div", 4)(5, "div", 5);
1909
+ i0.ɵɵelement(6, "i", 6);
1910
+ i0.ɵɵelementStart(7, "span");
1911
+ i0.ɵɵtext(8);
1912
+ i0.ɵɵelementEnd()();
1913
+ i0.ɵɵelementStart(9, "button", 7);
1914
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_9_listener() { return ctx.onClose(); });
1915
+ i0.ɵɵelement(10, "i", 8);
1916
+ i0.ɵɵelementEnd()();
1917
+ i0.ɵɵelementStart(11, "div", 9)(12, "button", 10);
1918
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_12_listener() { return ctx.setActiveTab("columns"); });
1919
+ i0.ɵɵelement(13, "i", 11);
1920
+ i0.ɵɵelementStart(14, "span");
1921
+ i0.ɵɵtext(15, "Columns");
1922
+ i0.ɵɵelementEnd()();
1923
+ i0.ɵɵelementStart(16, "button", 10);
1924
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_16_listener() { return ctx.setActiveTab("filters"); });
1925
+ i0.ɵɵelement(17, "i", 12);
1926
+ i0.ɵɵelementStart(18, "span");
1927
+ i0.ɵɵtext(19, "Filters");
1928
+ i0.ɵɵelementEnd()();
1929
+ i0.ɵɵelementStart(20, "button", 10);
1930
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_20_listener() { return ctx.setActiveTab("settings"); });
1931
+ i0.ɵɵelement(21, "i", 13);
1932
+ i0.ɵɵelementStart(22, "span");
1933
+ i0.ɵɵtext(23, "Settings");
1934
+ i0.ɵɵelementEnd()()();
1935
+ i0.ɵɵelementStart(24, "div", 14);
1936
+ i0.ɵɵtemplate(25, ViewConfigPanelComponent_Conditional_25_Template, 36, 8, "div", 15)(26, ViewConfigPanelComponent_Conditional_26_Template, 108, 41, "div", 16)(27, ViewConfigPanelComponent_Conditional_27_Template, 22, 10, "div", 15)(28, ViewConfigPanelComponent_Conditional_28_Template, 27, 7, "div", 15);
1937
+ i0.ɵɵelementEnd();
1938
+ i0.ɵɵelementStart(29, "div", 17)(30, "div", 18);
1939
+ i0.ɵɵtemplate(31, ViewConfigPanelComponent_Conditional_31_Template, 4, 3, "button", 19)(32, ViewConfigPanelComponent_Conditional_32_Template, 8, 6)(33, ViewConfigPanelComponent_Conditional_33_Template, 4, 2, "button", 20);
1940
+ i0.ɵɵelementEnd();
1941
+ i0.ɵɵelementStart(34, "button", 21);
1942
+ i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_34_listener() { return ctx.onClose(); });
1943
+ i0.ɵɵtext(35, " Cancel ");
1944
+ i0.ɵɵelementEnd()()();
1945
+ } if (rf & 2) {
1946
+ i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
1947
+ i0.ɵɵadvance();
1948
+ i0.ɵɵstyleProp("width", ctx.panelWidth, "px");
1949
+ i0.ɵɵclassProp("open", ctx.isOpen)("resizing", ctx.isResizing);
1950
+ i0.ɵɵadvance(7);
1951
+ i0.ɵɵtextInterpolate(ctx.viewEntity ? "Edit View" : "Configure View");
1952
+ i0.ɵɵadvance(4);
1953
+ i0.ɵɵclassProp("active", ctx.activeTab === "columns");
1954
+ i0.ɵɵadvance(4);
1955
+ i0.ɵɵclassProp("active", ctx.activeTab === "filters");
1956
+ i0.ɵɵadvance(4);
1957
+ i0.ɵɵclassProp("active", ctx.activeTab === "settings");
1958
+ i0.ɵɵadvance(5);
1959
+ i0.ɵɵconditional(ctx.activeTab === "columns" && !ctx.formatEditingColumn ? 25 : -1);
1960
+ i0.ɵɵadvance();
1961
+ i0.ɵɵconditional(ctx.activeTab === "columns" && ctx.formatEditingColumn ? 26 : -1);
1962
+ i0.ɵɵadvance();
1963
+ i0.ɵɵconditional(ctx.activeTab === "filters" ? 27 : -1);
1964
+ i0.ɵɵadvance();
1965
+ i0.ɵɵconditional(ctx.activeTab === "settings" ? 28 : -1);
1966
+ i0.ɵɵadvance(3);
1967
+ i0.ɵɵconditional(ctx.viewEntity && ctx.canEdit ? 31 : -1);
1968
+ i0.ɵɵadvance();
1969
+ i0.ɵɵconditional(!ctx.viewEntity ? 32 : -1);
1970
+ i0.ɵɵadvance();
1971
+ i0.ɵɵconditional(ctx.viewEntity && ctx.canEdit ? 33 : -1);
1972
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel], styles: ["\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.config-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n width: 400px;\n min-width: 320px;\n max-width: min(800px, 100vw);\n height: 100%;\n background: white;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.25s ease, width 0s;\n}\n\n.config-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.config-panel.resizing[_ngcontent-%COMP%] {\n transition: none;\n user-select: none;\n}\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.config-panel.resizing[_ngcontent-%COMP%] .resize-handle[_ngcontent-%COMP%] {\n background: linear-gradient(90deg, rgba(25, 118, 210, 0.1) 0%, transparent 100%);\n}\n\n.resize-grip[_ngcontent-%COMP%] {\n width: 3px;\n height: 40px;\n background: #cbd5e1;\n border-radius: 3px;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover .resize-grip[_ngcontent-%COMP%], \n.config-panel.resizing[_ngcontent-%COMP%] .resize-grip[_ngcontent-%COMP%] {\n opacity: 1;\n background: #1976d2;\n}\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n}\n\n.header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: #e0e0e0;\n color: #333;\n}\n\n\n\n.tab-nav[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.tab-btn[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 16px;\n border: none;\n background: transparent;\n color: #666;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n border-bottom: 2px solid transparent;\n}\n\n.tab-btn[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n.tab-btn.active[_ngcontent-%COMP%] {\n color: #1976d2;\n border-bottom-color: #1976d2;\n background: transparent;\n}\n\n.tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n padding: 16px 0;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.tab-content[_ngcontent-%COMP%] {\n padding: 0 20px;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n}\n\n\n\n.config-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n font-size: 12px;\n}\n\n.column-count[_ngcontent-%COMP%] {\n margin-left: auto;\n background: #e3f2fd;\n color: #1976d2;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n}\n\n\n\n.sort-config[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.sort-field-select[_ngcontent-%COMP%] {\n flex: 1;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\n}\n\n.sort-field-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.sort-direction-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 2px;\n}\n\n.direction-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.direction-btn[_ngcontent-%COMP%]:hover {\n color: #333;\n}\n\n.direction-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.column-list[_ngcontent-%COMP%] {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: #fafafa;\n}\n\n.column-list.visible-columns[_ngcontent-%COMP%] {\n max-height: 300px;\n overflow-y: auto;\n}\n\n.column-list.hidden-columns[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 100px;\n overflow-y: auto;\n}\n\n\n\n.config-section[_ngcontent-%COMP%]:last-child {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n margin-bottom: 0;\n}\n\n.column-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: white;\n border-bottom: 1px solid #f0f0f0;\n transition: background 0.1s ease;\n position: relative;\n}\n\n.column-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.column-item[_ngcontent-%COMP%]:hover {\n background: #f5f7fa;\n}\n\n.column-item.hidden[_ngcontent-%COMP%] {\n background: #fafafa;\n}\n\n.column-item.hidden[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n}\n\n\n\n\n\n\n\n\n.drop-indicator[_ngcontent-%COMP%] {\n height: 3px;\n background: linear-gradient(90deg, #1976d2 0%, #42a5f5 50%, #1976d2 100%);\n border-radius: 2px;\n margin: 0 12px;\n box-shadow: 0 0 8px rgba(25, 118, 210, 0.5);\n animation: _ngcontent-%COMP%_dropIndicatorPulse 0.8s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_dropIndicatorPulse {\n 0%, 100% { opacity: 1; transform: scaleX(1); }\n 50% { opacity: 0.7; transform: scaleX(0.98); }\n}\n\n\n\n.column-item.dragging[_ngcontent-%COMP%] {\n opacity: 0.5;\n background: #e3f2fd;\n}\n\n\n\n.column-item.drag-over[_ngcontent-%COMP%] {\n background: #f5f7fa;\n}\n\n.drag-handle[_ngcontent-%COMP%] {\n cursor: grab;\n color: #999;\n padding: 4px;\n transition: color 0.15s ease;\n}\n\n.drag-handle[_ngcontent-%COMP%]:hover {\n color: #666;\n}\n\n.drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n color: #1976d2;\n}\n\n.column-name[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 14px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.column-name[_ngcontent-%COMP%] .format-indicator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #1976d2;\n opacity: 0.7;\n}\n\n.column-name[_ngcontent-%COMP%] .alias-indicator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: #7b1fa2;\n opacity: 0.8;\n}\n\n.column-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #999;\n transition: all 0.15s ease;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #e0e0e0;\n color: #333;\n}\n\n.action-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.action-btn.hide-btn[_ngcontent-%COMP%]:hover {\n background: #ffebee;\n color: #c62828;\n}\n\n.action-btn.show-btn[_ngcontent-%COMP%]:hover {\n background: #e8f5e9;\n color: #2e7d32;\n}\n\n.action-btn.format-btn[_ngcontent-%COMP%]:hover {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.action-btn.format-btn.has-format[_ngcontent-%COMP%] {\n color: #1976d2;\n background: #e3f2fd;\n}\n\n.empty-list[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 20px;\n color: #999;\n font-size: 13px;\n}\n\n\n\n.column-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n margin-bottom: 8px;\n}\n\n.column-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #999;\n font-size: 12px;\n}\n\n.column-search[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n outline: none;\n font-size: 14px;\n}\n\n\n\n\n\n\n.format-editor-panel[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: white;\n z-index: 100;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_slideInFromRight 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideInFromRight {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n.format-editor-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.format-back-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.format-back-btn[_ngcontent-%COMP%]:hover {\n background: #e0e0e0;\n color: #333;\n}\n\n.format-header-title[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.format-header-title[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:first-child {\n font-size: 14px;\n font-weight: 600;\n color: #333;\n}\n\n.format-header-title[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:last-child {\n font-size: 12px;\n color: #666;\n}\n\n.format-editor-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n\n\n.format-preview-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n padding: 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border: 1px solid #e2e8f0;\n border-radius: 12px;\n}\n\n.preview-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 12px;\n font-weight: 600;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.preview-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n}\n\n.preview-samples[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.preview-sample[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.preview-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #94a3b8;\n min-width: 60px;\n}\n\n.preview-value[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 14px;\n font-family: 'SF Mono', 'Monaco', monospace;\n color: #1e293b;\n}\n\n\n\n.format-type-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.format-type-section[_ngcontent-%COMP%] .section-label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 10px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n}\n\n.format-type-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 8px;\n}\n\n.format-type-btn[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 12px 8px;\n border: 2px solid #e5e7eb;\n border-radius: 10px;\n background: white;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.format-type-btn[_ngcontent-%COMP%]:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n}\n\n.format-type-btn.active[_ngcontent-%COMP%] {\n border-color: #3b82f6;\n background: #eff6ff;\n}\n\n.format-type-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n color: #64748b;\n}\n\n.format-type-btn.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n}\n\n.format-type-btn[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 500;\n color: #64748b;\n}\n\n.format-type-btn.active[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n color: #1d4ed8;\n}\n\n\n\n.format-options-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.format-options-section[_ngcontent-%COMP%] .section-label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n}\n\n.format-option-group[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.format-option-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n}\n\n.format-option-group[_ngcontent-%COMP%] input[_ngcontent-%COMP%], \n.format-option-group[_ngcontent-%COMP%] select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.15s ease;\n}\n\n.format-option-group[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus, \n.format-option-group[_ngcontent-%COMP%] select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.format-option-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n}\n\n.format-option-row[_ngcontent-%COMP%] .format-option-group[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.format-checkbox[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n cursor: pointer;\n}\n\n.format-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.format-checkbox[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #333;\n}\n\n\n\n.alignment-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.align-btn[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 10px;\n border: 2px solid #e5e7eb;\n border-radius: 8px;\n background: white;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.align-btn[_ngcontent-%COMP%]:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n}\n\n.align-btn.active[_ngcontent-%COMP%] {\n border-color: #3b82f6;\n background: #eff6ff;\n color: #3b82f6;\n}\n\n.align-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #64748b;\n}\n\n.align-btn.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n}\n\n\n\n.style-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.style-section[_ngcontent-%COMP%] .section-label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n}\n\n.style-toggle-group[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.style-toggle-btn[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border: 2px solid #e5e7eb;\n border-radius: 8px;\n background: white;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.style-toggle-btn[_ngcontent-%COMP%]:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n}\n\n.style-toggle-btn.active[_ngcontent-%COMP%] {\n border-color: #3b82f6;\n background: #eff6ff;\n}\n\n.style-toggle-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #64748b;\n}\n\n.style-toggle-btn.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n}\n\n.color-picker-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n align-items: center;\n}\n\n.color-picker-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.color-picker-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #64748b;\n min-width: 80px;\n}\n\n.color-picker-group[_ngcontent-%COMP%] input[type=\"color\"][_ngcontent-%COMP%] {\n width: 40px;\n height: 32px;\n padding: 2px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.color-clear-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n background: white;\n cursor: pointer;\n color: #999;\n transition: all 0.15s ease;\n}\n\n.color-clear-btn[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n color: #666;\n}\n\n\n\n.format-editor-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.format-footer-left[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.format-footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.format-footer-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.format-footer-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #f0f0f0;\n border-color: #ccc;\n}\n\n.format-footer-btn.primary[_ngcontent-%COMP%] {\n background: #1976d2;\n border-color: #1976d2;\n color: white;\n}\n\n.format-footer-btn.primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #1565c0;\n border-color: #1565c0;\n}\n\n.format-footer-btn.danger[_ngcontent-%COMP%] {\n color: #c62828;\n border-color: #c62828;\n}\n\n.format-footer-btn.danger[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #c62828;\n color: white;\n}\n\n\n\n.filter-summary-container[_ngcontent-%COMP%] {\n padding: 4px 0;\n}\n\n.filter-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: #f5f7fa;\n border-radius: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.summary-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-badge[_ngcontent-%COMP%] {\n background: #1976d2;\n color: white;\n font-size: 12px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n min-width: 20px;\n text-align: center;\n}\n\n.summary-text[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #333;\n}\n\n.summary-text.no-filters[_ngcontent-%COMP%] {\n color: #999;\n}\n\n.summary-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.summary-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.summary-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.summary-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.summary-btn.clear-btn[_ngcontent-%COMP%] {\n background: transparent;\n color: #c62828;\n border: 1px solid #e0e0e0;\n}\n\n.summary-btn.clear-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #ffebee;\n border-color: #c62828;\n}\n\n.summary-btn.edit-btn[_ngcontent-%COMP%] {\n background: #1976d2;\n color: white;\n}\n\n.summary-btn.edit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #1565c0;\n}\n\n\n\n\n\n\n.filter-mode-selector[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 16px;\n border: 2px solid #e5e7eb;\n border-radius: 12px;\n background: white;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: left;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #d1d5db;\n background: #f9fafb;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.filter-mode-btn.active[_ngcontent-%COMP%] {\n border-color: #3b82f6;\n background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] .mode-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n background: #f3f4f6;\n color: #6b7280;\n font-size: 16px;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.filter-mode-btn.active[_ngcontent-%COMP%] .mode-icon[_ngcontent-%COMP%] {\n background: #3b82f6;\n color: white;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] .mode-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] .mode-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] .mode-subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6b7280;\n}\n\n.filter-mode-btn.active[_ngcontent-%COMP%] .mode-title[_ngcontent-%COMP%] {\n color: #1d4ed8;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%] .mode-check[_ngcontent-%COMP%] {\n color: #3b82f6;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.smart-filter-section[_ngcontent-%COMP%] {\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.smart-filter-input-container[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\n border: 1px solid #bae6fd;\n border-radius: 12px;\n margin-bottom: 16px;\n}\n\n.smart-filter-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #3b82f6 0%, #6366f1 100%);\n border-radius: 10px;\n color: white;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.smart-filter-input-container[_ngcontent-%COMP%] .smart-filter-textarea[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: white;\n border-radius: 8px;\n padding: 12px;\n font-size: 14px;\n line-height: 1.5;\n resize: none;\n min-height: 60px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.smart-filter-input-container[_ngcontent-%COMP%] .smart-filter-textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3), 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.smart-filter-input-container[_ngcontent-%COMP%] .smart-filter-textarea[_ngcontent-%COMP%]::placeholder {\n color: #9ca3af;\n}\n\n.smart-filter-explanation[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 12px;\n background: #e3f2fd;\n border-radius: 6px;\n margin-bottom: 12px;\n font-size: 13px;\n color: #1565c0;\n}\n\n.smart-filter-explanation[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n font-size: 14px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n\n\n.smart-filter-examples[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.examples-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 10px;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.examples-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f59e0b;\n}\n\n.example-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.example-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n border: 1px solid #e5e7eb;\n border-radius: 20px;\n background: white;\n font-size: 12px;\n font-weight: 500;\n color: #4b5563;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.example-chip[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #3b82f6;\n background: #eff6ff;\n color: #1d4ed8;\n}\n\n.example-chip[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.example-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #9ca3af;\n}\n\n.example-chip[_ngcontent-%COMP%]:hover:not(:disabled) i[_ngcontent-%COMP%] {\n color: #3b82f6;\n}\n\n\n\n.smart-filter-tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 14px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 12px;\n color: #64748b;\n line-height: 1.5;\n}\n\n.smart-filter-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n.traditional-filter-section[_ngcontent-%COMP%] {\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.traditional-filter-tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 14px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 12px;\n color: #64748b;\n line-height: 1.5;\n margin-top: 12px;\n}\n\n.traditional-filter-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n.summary-btn.edit-btn.primary[_ngcontent-%COMP%] {\n background: #3b82f6;\n color: white;\n border-color: #3b82f6;\n}\n\n.summary-btn.edit-btn.primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #2563eb;\n border-color: #2563eb;\n}\n\n\n\n.form-group[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n}\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.15s ease;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.form-input[_ngcontent-%COMP%]:disabled {\n background: #f5f5f5;\n color: #999;\n}\n\n.form-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 80px;\n}\n\n\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n cursor: pointer;\n}\n\n.checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n margin-top: 2px;\n cursor: pointer;\n}\n\n.checkbox-text[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-text[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #333;\n}\n\n.checkbox-text[_ngcontent-%COMP%] small[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n}\n\n\n\n.danger-zone[_ngcontent-%COMP%] {\n padding-top: 16px;\n border-top: 1px solid #ffcdd2;\n}\n\n.danger-zone[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n color: #c62828;\n}\n\n.danger-zone[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #c62828;\n}\n\n.delete-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n padding: 10px 16px;\n border: 1px solid #c62828;\n background: transparent;\n border-radius: 6px;\n color: #c62828;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.delete-btn[_ngcontent-%COMP%]:hover {\n background: #c62828;\n color: white;\n}\n\n\n\n.panel-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.footer-left[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.footer-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.footer-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #f0f0f0;\n border-color: #ccc;\n}\n\n.footer-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.footer-btn.primary[_ngcontent-%COMP%] {\n background: #1976d2;\n border-color: #1976d2;\n color: white;\n}\n\n.footer-btn.primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #1565c0;\n border-color: #1565c0;\n}\n\n.footer-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n\n\n.format-editor[_ngcontent-%COMP%] {\n padding: 0 20px;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n}\n\n.format-editor[_ngcontent-%COMP%] .format-editor-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0 16px 0;\n border-bottom: 1px solid #e0e0e0;\n margin-bottom: 16px;\n}\n\n.format-editor[_ngcontent-%COMP%] .back-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.format-editor[_ngcontent-%COMP%] .back-btn[_ngcontent-%COMP%]:hover {\n background: #e0e0e0;\n color: #333;\n}\n\n.format-editor[_ngcontent-%COMP%] .format-editor-title[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n}\n\n\n\n.format-editor[_ngcontent-%COMP%] .preview-table[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-top: 12px;\n}\n\n.format-editor[_ngcontent-%COMP%] .preview-header-cell[_ngcontent-%COMP%] {\n padding: 10px 14px;\n background: #f1f5f9;\n border-radius: 6px;\n font-weight: 600;\n font-size: 13px;\n color: #333;\n}\n\n.format-editor[_ngcontent-%COMP%] .preview-cell[_ngcontent-%COMP%] {\n padding: 8px 14px;\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 4px;\n font-size: 14px;\n color: #333;\n}\n\n\n\n.format-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n padding-bottom: 16px;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.format-section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.format-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n}\n\n.format-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n font-size: 12px;\n}\n\n\n\n.format-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 10px;\n}\n\n.format-row[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.format-row[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #555;\n flex-shrink: 0;\n}\n\n\n\n.format-select[_ngcontent-%COMP%] {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\n min-width: 120px;\n}\n\n.format-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.format-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n}\n\n.format-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.format-input.small[_ngcontent-%COMP%] {\n width: 80px;\n}\n\n\n\n.format-row.alias-info[_ngcontent-%COMP%] {\n justify-content: flex-start;\n gap: 8px;\n}\n\n.format-row.alias-info[_ngcontent-%COMP%] .muted-text[_ngcontent-%COMP%] {\n color: #888;\n font-size: 12px;\n}\n\n.clear-alias-btn[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border: none;\n background: #f0f0f0;\n border-radius: 50%;\n color: #888;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n transition: all 0.15s ease;\n}\n\n.clear-alias-btn[_ngcontent-%COMP%]:hover {\n background: #e0e0e0;\n color: #c62828;\n}\n\n\n\n.color-input[_ngcontent-%COMP%] {\n width: 50px;\n height: 32px;\n padding: 2px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n background: white;\n}\n\n.color-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n\n\n.alignment-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.align-btn[_ngcontent-%COMP%] {\n width: 40px;\n height: 36px;\n border: 2px solid #e5e7eb;\n border-radius: 6px;\n background: white;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.align-btn[_ngcontent-%COMP%]:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n}\n\n.align-btn.active[_ngcontent-%COMP%] {\n border-color: #1976d2;\n background: #e3f2fd;\n}\n\n.align-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #64748b;\n}\n\n.align-btn.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n}\n\n\n\n.style-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.style-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: 2px solid #e5e7eb;\n border-radius: 6px;\n background: white;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.style-btn[_ngcontent-%COMP%]:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n}\n\n.style-btn.active[_ngcontent-%COMP%] {\n border-color: #1976d2;\n background: #e3f2fd;\n}\n\n.style-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #64748b;\n}\n\n.style-btn.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n}\n\n\n\n.format-section-collapsible[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.format-section-collapsible[_ngcontent-%COMP%] summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px;\n background: #f8fafc;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n list-style: none;\n}\n\n.format-section-collapsible[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::-webkit-details-marker {\n display: none;\n}\n\n.format-section-collapsible[_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::before {\n content: '\\f054';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 10px;\n color: #999;\n transition: transform 0.2s ease;\n}\n\n.format-section-collapsible[open][_ngcontent-%COMP%] summary[_ngcontent-%COMP%]::before {\n transform: rotate(90deg);\n}\n\n.format-section-collapsible[_ngcontent-%COMP%] summary[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n font-size: 12px;\n}\n\n.format-section-collapsible[_ngcontent-%COMP%] summary[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.format-section-content[_ngcontent-%COMP%] {\n padding: 14px;\n background: white;\n border-top: 1px solid #e0e0e0;\n}\n\n\n\n.format-actions[_ngcontent-%COMP%] {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid #e0e0e0;\n}\n\n.clear-format-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n padding: 10px 16px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 6px;\n color: #666;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.clear-format-btn[_ngcontent-%COMP%]:hover {\n background: #fff5f5;\n border-color: #f87171;\n color: #dc2626;\n}\n\n.clear-format-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n@media (max-width: 768px) {\n .config-panel[_ngcontent-%COMP%] {\n width: 100% !important;\n max-width: 100vw !important;\n }\n\n \n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .tab-btn[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n display: none;\n }\n\n .tab-btn[_ngcontent-%COMP%] {\n padding: 14px;\n }\n\n .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .format-type-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(3, 1fr);\n }\n}\n\n\n\n@media (min-width: 769px) and (max-width: 1200px) {\n .config-panel[_ngcontent-%COMP%] {\n max-width: min(600px, 80vw);\n }\n}"] });
1973
+ }
1974
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ViewConfigPanelComponent, [{
1975
+ type: Component,
1976
+ args: [{ selector: 'mj-view-config-panel', template: "<!-- Backdrop -->\n@if (isOpen) {\n <div class=\"panel-backdrop\" (click)=\"onClose()\"></div>\n}\n\n<!-- Sliding Panel -->\n<div class=\"config-panel\"\n [class.open]=\"isOpen\"\n [class.resizing]=\"isResizing\"\n [style.width.px]=\"panelWidth\">\n <!-- Resize Handle -->\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n title=\"Drag to resize\">\n <div class=\"resize-grip\"></div>\n </div>\n\n <!-- Panel Header -->\n <div class=\"panel-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-sliders-h\"></i>\n <span>{{ viewEntity ? 'Edit View' : 'Configure View' }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"onClose()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Tab Navigation -->\n <div class=\"tab-nav\">\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'columns'\"\n (click)=\"setActiveTab('columns')\">\n <i class=\"fa-solid fa-columns\"></i>\n <span>Columns</span>\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'filters'\"\n (click)=\"setActiveTab('filters')\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>Filters</span>\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'settings'\"\n (click)=\"setActiveTab('settings')\">\n <i class=\"fa-solid fa-cog\"></i>\n <span>Settings</span>\n </button>\n </div>\n\n <!-- Panel Content -->\n <div class=\"panel-content\">\n <!-- Columns Tab -->\n @if (activeTab === 'columns' && !formatEditingColumn) {\n <div class=\"tab-content\">\n <!-- Sort Configuration -->\n <div class=\"config-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-sort\"></i>\n <span>Default Sort</span>\n </div>\n <div class=\"sort-config\">\n <select\n class=\"sort-field-select\"\n [(ngModel)]=\"sortField\">\n <option [value]=\"null\">No default sort</option>\n @for (field of sortableFields; track field.ID) {\n <option [value]=\"field.Name\">{{ field.DisplayNameOrName }}</option>\n }\n </select>\n @if (sortField) {\n <div class=\"sort-direction-toggle\">\n <button\n class=\"direction-btn\"\n [class.active]=\"sortDirection === 'asc'\"\n (click)=\"sortDirection = 'asc'\"\n title=\"Ascending\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n </button>\n <button\n class=\"direction-btn\"\n [class.active]=\"sortDirection === 'desc'\"\n (click)=\"sortDirection = 'desc'\"\n title=\"Descending\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n\n <!-- Visible Columns -->\n <div class=\"config-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-eye\"></i>\n <span>Visible Columns</span>\n <span class=\"column-count\">{{ visibleColumns.length }}</span>\n </div>\n <div class=\"column-list visible-columns\">\n @for (column of visibleColumns; track column.fieldId; let i = $index) {\n <!-- Drop indicator before -->\n @if (isDropBefore(column)) {\n <div class=\"drop-indicator\"></div>\n }\n <div\n class=\"column-item\"\n [class.dragging]=\"draggedColumn === column\"\n [class.drop-target]=\"dropTargetColumn === column\"\n draggable=\"true\"\n (dragstart)=\"onDragStart($event, column)\"\n (dragover)=\"onDragOver($event, column)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, column)\"\n (dragend)=\"onDragEnd($event)\">\n <div class=\"drag-handle\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </div>\n <span class=\"column-name\">\n {{ column.userDisplayName || column.displayName }}\n @if (column.userDisplayName) {\n <i class=\"fa-solid fa-pen-nib alias-indicator\" title=\"Custom name: {{ column.userDisplayName }}\"></i>\n }\n @if (hasCustomFormat(column)) {\n <i class=\"fa-solid fa-paintbrush format-indicator\" title=\"Custom formatting applied\"></i>\n }\n </span>\n <div class=\"column-actions\">\n <button\n class=\"action-btn format-btn\"\n (click)=\"openFormatEditor(column)\"\n title=\"Format column\">\n <i class=\"fa-solid fa-paintbrush\"></i>\n </button>\n <button\n class=\"action-btn\"\n [disabled]=\"i === 0\"\n (click)=\"moveColumnUp(column)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button\n class=\"action-btn\"\n [disabled]=\"i === visibleColumns.length - 1\"\n (click)=\"moveColumnDown(column)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n <button\n class=\"action-btn hide-btn\"\n (click)=\"toggleColumnVisibility(column)\"\n title=\"Hide column\">\n <i class=\"fa-solid fa-eye-slash\"></i>\n </button>\n </div>\n </div>\n <!-- Drop indicator after (only for last item) -->\n @if (isDropAfter(column) && i === visibleColumns.length - 1) {\n <div class=\"drop-indicator\"></div>\n }\n }\n @if (visibleColumns.length === 0) {\n <div class=\"empty-list\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>No columns visible. Add columns from below.</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Hidden Columns -->\n <div class=\"config-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-eye-slash\"></i>\n <span>Hidden Columns</span>\n <span class=\"column-count\">{{ hiddenColumns.length }}</span>\n </div>\n @if (hiddenColumns.length > 5) {\n <div class=\"column-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Search columns...\"\n [(ngModel)]=\"columnSearchText\"\n />\n </div>\n }\n <div class=\"column-list hidden-columns\">\n @for (column of filteredHiddenColumns; track column.fieldId) {\n <div class=\"column-item hidden\">\n <span class=\"column-name\">{{ column.displayName }}</span>\n <button\n class=\"action-btn show-btn\"\n (click)=\"toggleColumnVisibility(column)\"\n title=\"Show column\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n </div>\n }\n @if (hiddenColumns.length === 0) {\n <div class=\"empty-list\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>All columns are visible</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Column Format Editor Sub-Panel -->\n @if (activeTab === 'columns' && formatEditingColumn) {\n <div class=\"format-editor\">\n <!-- Format Editor Header -->\n <div class=\"format-editor-header\">\n <button class=\"back-btn\" (click)=\"closeFormatEditor()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n <div class=\"format-editor-title\">\n <span>Format: {{ formatEditingColumn.userDisplayName || formatEditingColumn.displayName }}</span>\n </div>\n </div>\n\n <!-- Column Alias Section -->\n <div class=\"format-section\">\n <div class=\"format-section-header\">\n <i class=\"fa-solid fa-pen-nib\"></i>\n <span>Column Name</span>\n </div>\n <div class=\"format-row\">\n <label>Display As</label>\n <input type=\"text\" class=\"format-input\"\n [value]=\"formatEditingColumn.userDisplayName || ''\"\n (input)=\"updateUserDisplayName($any($event.target).value)\"\n [placeholder]=\"formatEditingColumn.displayName\" />\n </div>\n @if (formatEditingColumn.userDisplayName) {\n <div class=\"format-row alias-info\">\n <small class=\"muted-text\">Original: {{ formatEditingColumn.displayName }}</small>\n <button class=\"clear-alias-btn\" (click)=\"formatEditingColumn.userDisplayName = undefined\" title=\"Clear alias\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n </div>\n\n <!-- Preview Section -->\n <div class=\"format-preview-section\">\n <div class=\"preview-header\">\n <i class=\"fa-solid fa-eye\"></i>\n <span>Preview</span>\n </div>\n <div class=\"preview-table\">\n <div class=\"preview-header-cell\"\n [style.font-weight]=\"formatEditingColumn.format?.headerStyle?.bold ? 'bold' : 'normal'\"\n [style.font-style]=\"formatEditingColumn.format?.headerStyle?.italic ? 'italic' : 'normal'\"\n [style.text-decoration]=\"formatEditingColumn.format?.headerStyle?.underline ? 'underline' : 'none'\"\n [style.color]=\"formatEditingColumn.format?.headerStyle?.color\"\n [style.background-color]=\"formatEditingColumn.format?.headerStyle?.backgroundColor\">\n {{ formatEditingColumn.userDisplayName || formatEditingColumn.displayName }}\n </div>\n @for (value of getSampleValues(formatEditingColumn); track $index) {\n <div class=\"preview-cell\"\n [style.text-align]=\"formatEditingColumn.format?.align || 'left'\"\n [style.font-weight]=\"formatEditingColumn.format?.cellStyle?.bold ? 'bold' : 'normal'\"\n [style.font-style]=\"formatEditingColumn.format?.cellStyle?.italic ? 'italic' : 'normal'\"\n [style.text-decoration]=\"formatEditingColumn.format?.cellStyle?.underline ? 'underline' : 'none'\"\n [style.color]=\"formatEditingColumn.format?.cellStyle?.color\"\n [style.background-color]=\"formatEditingColumn.format?.cellStyle?.backgroundColor\">\n {{ formatPreviewValue(value, formatEditingColumn.format) }}\n </div>\n }\n </div>\n </div>\n\n <!-- Format Type -->\n <div class=\"format-section\">\n <div class=\"format-section-header\">\n <i class=\"fa-solid fa-hashtag\"></i>\n <span>Format Type</span>\n </div>\n <select class=\"format-select\" [(ngModel)]=\"formatEditingColumn.format!.type\">\n <option value=\"auto\">Auto (Smart Default)</option>\n <option value=\"text\">Text</option>\n <option value=\"number\">Number</option>\n <option value=\"currency\">Currency</option>\n <option value=\"percent\">Percent</option>\n <option value=\"date\">Date</option>\n <option value=\"datetime\">Date & Time</option>\n <option value=\"boolean\">Boolean</option>\n </select>\n </div>\n\n <!-- Type-Specific Options -->\n @if (formatEditingColumn.format?.type === 'number' || formatEditingColumn.format?.type === 'currency' || formatEditingColumn.format?.type === 'percent') {\n <div class=\"format-section\">\n <div class=\"format-section-header\">\n <i class=\"fa-solid fa-sliders\"></i>\n <span>Number Options</span>\n </div>\n <div class=\"format-row\">\n <label>Decimal Places</label>\n <input type=\"number\" class=\"format-input small\" min=\"0\" max=\"10\"\n [(ngModel)]=\"formatEditingColumn.format!.decimals\" />\n </div>\n @if (formatEditingColumn.format?.type === 'currency') {\n <div class=\"format-row\">\n <label>Currency</label>\n <select class=\"format-select\" [(ngModel)]=\"formatEditingColumn.format!.currencyCode\">\n <option value=\"USD\">USD ($)</option>\n <option value=\"EUR\">EUR (\u20AC)</option>\n <option value=\"GBP\">GBP (\u00A3)</option>\n <option value=\"JPY\">JPY (\u00A5)</option>\n <option value=\"CAD\">CAD ($)</option>\n <option value=\"AUD\">AUD ($)</option>\n </select>\n </div>\n }\n <div class=\"format-row\">\n <label>Thousands Separator</label>\n <input type=\"checkbox\" [(ngModel)]=\"formatEditingColumn.format!.thousandsSeparator\" />\n </div>\n </div>\n }\n\n @if (formatEditingColumn.format?.type === 'date' || formatEditingColumn.format?.type === 'datetime') {\n <div class=\"format-section\">\n <div class=\"format-section-header\">\n <i class=\"fa-solid fa-calendar\"></i>\n <span>Date Options</span>\n </div>\n <div class=\"format-row\">\n <label>Format</label>\n <select class=\"format-select\" [(ngModel)]=\"formatEditingColumn.format!.dateFormat\">\n <option value=\"short\">Short (1/15/25)</option>\n <option value=\"short-weekday\">Short + Day (Wed, 1/15/25)</option>\n <option value=\"medium\">Medium (Jan 15, 2025)</option>\n <option value=\"medium-weekday\">Medium + Day (Wed, Jan 15, 2025)</option>\n <option value=\"long\">Long (January 15, 2025)</option>\n <option value=\"long-weekday\">Long + Day (Wednesday, January 15, 2025)</option>\n </select>\n </div>\n </div>\n }\n\n @if (formatEditingColumn.format?.type === 'boolean') {\n <div class=\"format-section\">\n <div class=\"format-section-header\">\n <i class=\"fa-solid fa-toggle-on\"></i>\n <span>Boolean Options</span>\n </div>\n <div class=\"format-row\">\n <label>True Label</label>\n <input type=\"text\" class=\"format-input\" [(ngModel)]=\"formatEditingColumn.format!.trueLabel\" placeholder=\"Yes\" />\n </div>\n <div class=\"format-row\">\n <label>False Label</label>\n <input type=\"text\" class=\"format-input\" [(ngModel)]=\"formatEditingColumn.format!.falseLabel\" placeholder=\"No\" />\n </div>\n <div class=\"format-row\">\n <label>Display As</label>\n <select class=\"format-select\" [(ngModel)]=\"formatEditingColumn.format!.booleanDisplay\">\n <option value=\"text\">Text</option>\n <option value=\"checkbox\">Checkbox</option>\n <option value=\"icon\">Icon</option>\n </select>\n </div>\n </div>\n }\n\n <!-- Alignment -->\n <div class=\"format-section\">\n <div class=\"format-section-header\">\n <i class=\"fa-solid fa-align-left\"></i>\n <span>Alignment</span>\n </div>\n <div class=\"alignment-toggle\">\n <button class=\"align-btn\" [class.active]=\"formatEditingColumn.format?.align === 'left' || !formatEditingColumn.format?.align\"\n (click)=\"formatEditingColumn.format!.align = 'left'\" title=\"Left\">\n <i class=\"fa-solid fa-align-left\"></i>\n </button>\n <button class=\"align-btn\" [class.active]=\"formatEditingColumn.format?.align === 'center'\"\n (click)=\"formatEditingColumn.format!.align = 'center'\" title=\"Center\">\n <i class=\"fa-solid fa-align-center\"></i>\n </button>\n <button class=\"align-btn\" [class.active]=\"formatEditingColumn.format?.align === 'right'\"\n (click)=\"formatEditingColumn.format!.align = 'right'\" title=\"Right\">\n <i class=\"fa-solid fa-align-right\"></i>\n </button>\n </div>\n </div>\n\n <!-- Header Style -->\n <div class=\"format-section\">\n <div class=\"format-section-header\">\n <i class=\"fa-solid fa-heading\"></i>\n <span>Header Style</span>\n </div>\n <div class=\"style-buttons\">\n <button class=\"style-btn\" [class.active]=\"formatEditingColumn.format?.headerStyle?.bold\"\n (click)=\"toggleHeaderStyle('bold')\"\n title=\"Bold\">\n <i class=\"fa-solid fa-bold\"></i>\n </button>\n <button class=\"style-btn\" [class.active]=\"formatEditingColumn.format?.headerStyle?.italic\"\n (click)=\"toggleHeaderStyle('italic')\"\n title=\"Italic\">\n <i class=\"fa-solid fa-italic\"></i>\n </button>\n <button class=\"style-btn\" [class.active]=\"formatEditingColumn.format?.headerStyle?.underline\"\n (click)=\"toggleHeaderStyle('underline')\"\n title=\"Underline\">\n <i class=\"fa-solid fa-underline\"></i>\n </button>\n </div>\n <div class=\"format-row\">\n <label>Text Color</label>\n <input type=\"color\" class=\"color-input\"\n [value]=\"formatEditingColumn.format?.headerStyle?.color || '#000000'\"\n (input)=\"updateHeaderColor('color', $any($event.target).value)\" />\n </div>\n <div class=\"format-row\">\n <label>Background</label>\n <input type=\"color\" class=\"color-input\"\n [value]=\"formatEditingColumn.format?.headerStyle?.backgroundColor || '#ffffff'\"\n (input)=\"updateHeaderColor('backgroundColor', $any($event.target).value)\" />\n </div>\n </div>\n\n <!-- Cell Style -->\n <div class=\"format-section\">\n <div class=\"format-section-header\">\n <i class=\"fa-solid fa-table-cells\"></i>\n <span>Cell Style</span>\n </div>\n <div class=\"style-buttons\">\n <button class=\"style-btn\" [class.active]=\"formatEditingColumn.format?.cellStyle?.bold\"\n (click)=\"toggleCellStyle('bold')\"\n title=\"Bold\">\n <i class=\"fa-solid fa-bold\"></i>\n </button>\n <button class=\"style-btn\" [class.active]=\"formatEditingColumn.format?.cellStyle?.italic\"\n (click)=\"toggleCellStyle('italic')\"\n title=\"Italic\">\n <i class=\"fa-solid fa-italic\"></i>\n </button>\n <button class=\"style-btn\" [class.active]=\"formatEditingColumn.format?.cellStyle?.underline\"\n (click)=\"toggleCellStyle('underline')\"\n title=\"Underline\">\n <i class=\"fa-solid fa-underline\"></i>\n </button>\n </div>\n <div class=\"format-row\">\n <label>Text Color</label>\n <input type=\"color\" class=\"color-input\"\n [value]=\"formatEditingColumn.format?.cellStyle?.color || '#000000'\"\n (input)=\"updateCellColor('color', $any($event.target).value)\" />\n </div>\n <div class=\"format-row\">\n <label>Background</label>\n <input type=\"color\" class=\"color-input\"\n [value]=\"formatEditingColumn.format?.cellStyle?.backgroundColor || '#ffffff'\"\n (input)=\"updateCellColor('backgroundColor', $any($event.target).value)\" />\n </div>\n </div>\n\n <!-- Clear Format Button -->\n <div class=\"format-actions\">\n <button class=\"clear-format-btn\" (click)=\"clearColumnFormat(formatEditingColumn); closeFormatEditor()\">\n <i class=\"fa-solid fa-eraser\"></i>\n Clear Formatting\n </button>\n </div>\n </div>\n }\n\n <!-- Filters Tab -->\n @if (activeTab === 'filters') {\n <div class=\"tab-content\">\n <!-- Filter Mode Selection -->\n <div class=\"filter-mode-selector\">\n <button\n class=\"filter-mode-btn\"\n [class.active]=\"filterMode === 'smart'\"\n (click)=\"setFilterMode('smart')\"\n [disabled]=\"!canEdit\">\n <div class=\"mode-icon\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n </div>\n <div class=\"mode-content\">\n <span class=\"mode-title\">Smart Filter</span>\n <span class=\"mode-subtitle\">Use AI to filter with natural language</span>\n </div>\n @if (filterMode === 'smart') {\n <i class=\"fa-solid fa-check mode-check\"></i>\n }\n </button>\n <button\n class=\"filter-mode-btn\"\n [class.active]=\"filterMode === 'traditional'\"\n (click)=\"setFilterMode('traditional')\"\n [disabled]=\"!canEdit\">\n <div class=\"mode-icon\">\n <i class=\"fa-solid fa-sliders\"></i>\n </div>\n <div class=\"mode-content\">\n <span class=\"mode-title\">Traditional Filter</span>\n <span class=\"mode-subtitle\">Build filters with field/operator/value</span>\n </div>\n @if (filterMode === 'traditional') {\n <i class=\"fa-solid fa-check mode-check\"></i>\n }\n </button>\n </div>\n\n <!-- Smart Filter Section -->\n @if (filterMode === 'smart') {\n <div class=\"config-section smart-filter-section\">\n <div class=\"smart-filter-input-container\">\n <div class=\"smart-filter-icon\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n </div>\n <textarea\n id=\"smartFilterPrompt\"\n class=\"smart-filter-textarea\"\n placeholder=\"Describe what you're looking for...\"\n [(ngModel)]=\"smartFilterPrompt\"\n [disabled]=\"!canEdit\"\n rows=\"3\"\n ></textarea>\n </div>\n\n @if (smartFilterExplanation) {\n <div class=\"smart-filter-explanation\">\n <i class=\"fa-solid fa-robot\"></i>\n <span>{{ smartFilterExplanation }}</span>\n </div>\n }\n\n <!-- Example Prompts -->\n <div class=\"smart-filter-examples\">\n <div class=\"examples-header\">\n <i class=\"fa-solid fa-lightbulb\"></i>\n <span>Try these examples:</span>\n </div>\n <div class=\"example-chips\">\n <button\n class=\"example-chip\"\n (click)=\"applySmartFilterExample('Show records created in the last 30 days')\"\n [disabled]=\"!canEdit\">\n <i class=\"fa-regular fa-calendar\"></i>\n Last 30 days\n </button>\n <button\n class=\"example-chip\"\n (click)=\"applySmartFilterExample('Active records only')\"\n [disabled]=\"!canEdit\">\n <i class=\"fa-solid fa-circle-check\"></i>\n Active only\n </button>\n <button\n class=\"example-chip\"\n (click)=\"applySmartFilterExample('Records with high priority')\"\n [disabled]=\"!canEdit\">\n <i class=\"fa-solid fa-star\"></i>\n High priority\n </button>\n <button\n class=\"example-chip\"\n (click)=\"applySmartFilterExample('Records modified this week')\"\n [disabled]=\"!canEdit\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Modified this week\n </button>\n </div>\n </div>\n\n <div class=\"smart-filter-tip\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>The AI will interpret your description and create the appropriate filter when you save the view.</span>\n </div>\n </div>\n }\n\n <!-- Traditional Filter Section -->\n @if (filterMode === 'traditional') {\n <div class=\"config-section traditional-filter-section\">\n <div class=\"filter-summary-container\">\n <div class=\"filter-summary\">\n <div class=\"summary-info\">\n @if (getFilterCount() > 0) {\n <span class=\"filter-badge\">{{ getFilterCount() }}</span>\n <span class=\"summary-text\">{{ getFilterSummary() }}</span>\n } @else {\n <span class=\"summary-text no-filters\">No filters configured</span>\n }\n </div>\n <div class=\"summary-actions\">\n @if (getFilterCount() > 0 && canEdit) {\n <button\n class=\"summary-btn clear-btn\"\n (click)=\"clearFilters()\"\n title=\"Clear all filters\">\n <i class=\"fa-solid fa-times\"></i>\n Clear\n </button>\n }\n <button\n class=\"summary-btn edit-btn primary\"\n (click)=\"openFilterDialog()\"\n [disabled]=\"!canEdit && getFilterCount() === 0\"\n title=\"Edit filters\">\n <i class=\"fa-solid fa-pen\"></i>\n {{ getFilterCount() > 0 ? 'Edit Filters' : 'Add Filters' }}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"traditional-filter-tip\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Build precise filters by selecting fields, operators, and values. Use groups for complex AND/OR logic.</span>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Settings Tab -->\n @if (activeTab === 'settings') {\n <div class=\"tab-content\">\n <!-- View Name & Description -->\n <div class=\"config-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>View Details</span>\n </div>\n <div class=\"form-group\">\n <label for=\"viewName\">Name</label>\n <input\n id=\"viewName\"\n type=\"text\"\n class=\"form-input\"\n placeholder=\"Enter view name...\"\n [(ngModel)]=\"viewName\"\n [disabled]=\"!canEdit\"\n />\n </div>\n <div class=\"form-group\">\n <label for=\"viewDescription\">Description</label>\n <textarea\n id=\"viewDescription\"\n class=\"form-input form-textarea\"\n placeholder=\"Describe this view...\"\n [(ngModel)]=\"viewDescription\"\n [disabled]=\"!canEdit\"\n rows=\"3\"\n ></textarea>\n </div>\n </div>\n\n <!-- Sharing -->\n <div class=\"config-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-share-alt\"></i>\n <span>Sharing</span>\n </div>\n <label class=\"checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"isShared\"\n [disabled]=\"!canEdit\"\n />\n <span class=\"checkbox-text\">\n <strong>Share with others</strong>\n <small>Allow other users to use this view</small>\n </span>\n </label>\n </div>\n\n <!-- Danger Zone -->\n @if (viewEntity && canDelete) {\n <div class=\"config-section danger-zone\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>Danger Zone</span>\n </div>\n <button class=\"delete-btn\" (click)=\"onDelete()\">\n <i class=\"fa-solid fa-trash\"></i>\n <span>Delete View</span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Panel Footer -->\n <div class=\"panel-footer\">\n <!-- Action buttons on LEFT -->\n <div class=\"footer-left\">\n @if (viewEntity && canEdit) {\n <!-- Editing an existing saved view -->\n <button\n class=\"footer-btn save-btn primary\"\n (click)=\"onSave()\"\n [disabled]=\"isSaving || !viewName\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n }\n {{ isSaving ? 'Saving...' : 'Save' }}\n </button>\n }\n @if (!viewEntity) {\n <!-- Default/Dynamic view - Save to user settings -->\n <button\n class=\"footer-btn save-btn primary\"\n (click)=\"onSaveDefaults()\"\n [disabled]=\"isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n }\n {{ isSaving ? 'Saving...' : 'Save' }}\n </button>\n <!-- Save As New - creates a named view -->\n <button\n class=\"footer-btn save-as-btn\"\n (click)=\"onSaveAsNew()\"\n [disabled]=\"isSaving || !viewName\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-plus\"></i>\n }\n {{ isSaving ? 'Creating...' : 'Save As New' }}\n </button>\n }\n @if (viewEntity && canEdit) {\n <!-- Save As New for existing view -->\n <button\n class=\"footer-btn save-as-btn\"\n (click)=\"onSaveAsNew()\"\n [disabled]=\"isSaving\">\n @if (isSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-plus\"></i>\n }\n Save As New\n </button>\n }\n </div>\n <!-- Cancel button on RIGHT -->\n <button class=\"footer-btn cancel-btn\" (click)=\"onClose()\">\n Cancel\n </button>\n </div>\n</div>\n", styles: ["/* Backdrop */\n.panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.3);\n z-index: 1000;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Sliding Panel */\n.config-panel {\n position: fixed;\n top: 0;\n right: 0;\n width: 400px;\n min-width: 320px;\n max-width: min(800px, 100vw);\n height: 100%;\n background: white;\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.25s ease, width 0s;\n}\n\n.config-panel.open {\n transform: translateX(0);\n}\n\n.config-panel.resizing {\n transition: none;\n user-select: none;\n}\n\n/* Resize Handle */\n.resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.resize-handle:hover,\n.config-panel.resizing .resize-handle {\n background: linear-gradient(90deg, rgba(25, 118, 210, 0.1) 0%, transparent 100%);\n}\n\n.resize-grip {\n width: 3px;\n height: 40px;\n background: #cbd5e1;\n border-radius: 3px;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n\n.resize-handle:hover .resize-grip,\n.config-panel.resizing .resize-grip {\n opacity: 1;\n background: #1976d2;\n}\n\n/* Panel Header */\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.header-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 16px;\n font-weight: 600;\n color: #333;\n}\n\n.header-title i {\n color: #1976d2;\n}\n\n.close-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.close-btn:hover {\n background: #e0e0e0;\n color: #333;\n}\n\n/* Tab Navigation */\n.tab-nav {\n display: flex;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.tab-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 16px;\n border: none;\n background: transparent;\n color: #666;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n border-bottom: 2px solid transparent;\n}\n\n.tab-btn:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n.tab-btn.active {\n color: #1976d2;\n border-bottom-color: #1976d2;\n background: transparent;\n}\n\n.tab-btn i {\n font-size: 12px;\n}\n\n/* Panel Content */\n.panel-content {\n flex: 1;\n overflow: hidden;\n padding: 16px 0;\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.tab-content {\n padding: 0 20px;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Config Sections */\n.config-section {\n margin-bottom: 24px;\n}\n\n.section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-header i {\n color: #1976d2;\n font-size: 12px;\n}\n\n.column-count {\n margin-left: auto;\n background: #e3f2fd;\n color: #1976d2;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n}\n\n/* Sort Configuration */\n.sort-config {\n display: flex;\n gap: 8px;\n}\n\n.sort-field-select {\n flex: 1;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\n}\n\n.sort-field-select:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.sort-direction-toggle {\n display: flex;\n background: #f0f0f0;\n border-radius: 6px;\n padding: 2px;\n}\n\n.direction-btn {\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.direction-btn:hover {\n color: #333;\n}\n\n.direction-btn.active {\n background: white;\n color: #1976d2;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n/* Column Lists */\n.column-list {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: #fafafa;\n}\n\n.column-list.visible-columns {\n max-height: 300px;\n overflow-y: auto;\n}\n\n.column-list.hidden-columns {\n flex: 1;\n min-height: 100px;\n overflow-y: auto;\n}\n\n/* Hidden columns section should expand to fill available space */\n.config-section:last-child {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n margin-bottom: 0;\n}\n\n.column-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: white;\n border-bottom: 1px solid #f0f0f0;\n transition: background 0.1s ease;\n position: relative;\n}\n\n.column-item:last-child {\n border-bottom: none;\n}\n\n.column-item:hover {\n background: #f5f7fa;\n}\n\n.column-item.hidden {\n background: #fafafa;\n}\n\n.column-item.hidden:hover {\n background: #f0f0f0;\n}\n\n/* ========================================\n DRAG & DROP INDICATOR STYLES\n ======================================== */\n\n/* Drop indicator line element - shows where the column will be placed */\n.drop-indicator {\n height: 3px;\n background: linear-gradient(90deg, #1976d2 0%, #42a5f5 50%, #1976d2 100%);\n border-radius: 2px;\n margin: 0 12px;\n box-shadow: 0 0 8px rgba(25, 118, 210, 0.5);\n animation: dropIndicatorPulse 0.8s ease-in-out infinite;\n}\n\n@keyframes dropIndicatorPulse {\n 0%, 100% { opacity: 1; transform: scaleX(1); }\n 50% { opacity: 0.7; transform: scaleX(0.98); }\n}\n\n/* Highlight the column being dragged */\n.column-item.dragging {\n opacity: 0.5;\n background: #e3f2fd;\n}\n\n/* Visual feedback during drag over */\n.column-item.drag-over {\n background: #f5f7fa;\n}\n\n.drag-handle {\n cursor: grab;\n color: #999;\n padding: 4px;\n transition: color 0.15s ease;\n}\n\n.drag-handle:hover {\n color: #666;\n}\n\n.drag-handle:active {\n cursor: grabbing;\n color: #1976d2;\n}\n\n.column-name {\n flex: 1;\n font-size: 14px;\n color: #333;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.column-name .format-indicator {\n font-size: 10px;\n color: #1976d2;\n opacity: 0.7;\n}\n\n.column-name .alias-indicator {\n font-size: 10px;\n color: #7b1fa2;\n opacity: 0.8;\n}\n\n.column-actions {\n display: flex;\n gap: 4px;\n}\n\n.action-btn {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #999;\n transition: all 0.15s ease;\n}\n\n.action-btn:hover:not(:disabled) {\n background: #e0e0e0;\n color: #333;\n}\n\n.action-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.action-btn.hide-btn:hover {\n background: #ffebee;\n color: #c62828;\n}\n\n.action-btn.show-btn:hover {\n background: #e8f5e9;\n color: #2e7d32;\n}\n\n.action-btn.format-btn:hover {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.action-btn.format-btn.has-format {\n color: #1976d2;\n background: #e3f2fd;\n}\n\n.empty-list {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 20px;\n color: #999;\n font-size: 13px;\n}\n\n/* Column Search */\n.column-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n margin-bottom: 8px;\n}\n\n.column-search i {\n color: #999;\n font-size: 12px;\n}\n\n.column-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 14px;\n}\n\n/* ========================================\n COLUMN FORMAT EDITOR SUB-PANEL\n ======================================== */\n\n.format-editor-panel {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: white;\n z-index: 100;\n display: flex;\n flex-direction: column;\n animation: slideInFromRight 0.2s ease;\n}\n\n@keyframes slideInFromRight {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n.format-editor-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.format-back-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.format-back-btn:hover {\n background: #e0e0e0;\n color: #333;\n}\n\n.format-header-title {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.format-header-title span:first-child {\n font-size: 14px;\n font-weight: 600;\n color: #333;\n}\n\n.format-header-title span:last-child {\n font-size: 12px;\n color: #666;\n}\n\n.format-editor-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n/* Format Preview Section */\n.format-preview-section {\n margin-bottom: 24px;\n padding: 16px;\n background: linear-gradient(135deg, #f8fafc 0%, #f1f5f9 100%);\n border: 1px solid #e2e8f0;\n border-radius: 12px;\n}\n\n.preview-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 12px;\n font-weight: 600;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.preview-header i {\n color: #3b82f6;\n}\n\n.preview-samples {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.preview-sample {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.preview-label {\n font-size: 12px;\n color: #94a3b8;\n min-width: 60px;\n}\n\n.preview-value {\n flex: 1;\n font-size: 14px;\n font-family: 'SF Mono', 'Monaco', monospace;\n color: #1e293b;\n}\n\n/* Format Type Selection */\n.format-type-section {\n margin-bottom: 24px;\n}\n\n.format-type-section .section-label {\n display: block;\n margin-bottom: 10px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n}\n\n.format-type-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 8px;\n}\n\n.format-type-btn {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: 12px 8px;\n border: 2px solid #e5e7eb;\n border-radius: 10px;\n background: white;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.format-type-btn:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n}\n\n.format-type-btn.active {\n border-color: #3b82f6;\n background: #eff6ff;\n}\n\n.format-type-btn i {\n font-size: 18px;\n color: #64748b;\n}\n\n.format-type-btn.active i {\n color: #3b82f6;\n}\n\n.format-type-btn span {\n font-size: 11px;\n font-weight: 500;\n color: #64748b;\n}\n\n.format-type-btn.active span {\n color: #1d4ed8;\n}\n\n/* Format Options Section */\n.format-options-section {\n margin-bottom: 24px;\n}\n\n.format-options-section .section-label {\n display: block;\n margin-bottom: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n}\n\n.format-option-group {\n margin-bottom: 16px;\n}\n\n.format-option-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n}\n\n.format-option-group input,\n.format-option-group select {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.15s ease;\n}\n\n.format-option-group input:focus,\n.format-option-group select:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.format-option-row {\n display: flex;\n gap: 12px;\n}\n\n.format-option-row .format-option-group {\n flex: 1;\n}\n\n.format-checkbox {\n display: flex;\n align-items: center;\n gap: 10px;\n cursor: pointer;\n}\n\n.format-checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n}\n\n.format-checkbox span {\n font-size: 14px;\n color: #333;\n}\n\n/* Alignment Options */\n.alignment-options {\n display: flex;\n gap: 8px;\n}\n\n.align-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 10px;\n border: 2px solid #e5e7eb;\n border-radius: 8px;\n background: white;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.align-btn:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n}\n\n.align-btn.active {\n border-color: #3b82f6;\n background: #eff6ff;\n color: #3b82f6;\n}\n\n.align-btn i {\n font-size: 16px;\n color: #64748b;\n}\n\n.align-btn.active i {\n color: #3b82f6;\n}\n\n/* Style Section */\n.style-section {\n margin-bottom: 24px;\n}\n\n.style-section .section-label {\n display: block;\n margin-bottom: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n}\n\n.style-toggle-group {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.style-toggle-btn {\n width: 40px;\n height: 40px;\n border: 2px solid #e5e7eb;\n border-radius: 8px;\n background: white;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.style-toggle-btn:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n}\n\n.style-toggle-btn.active {\n border-color: #3b82f6;\n background: #eff6ff;\n}\n\n.style-toggle-btn i {\n font-size: 16px;\n color: #64748b;\n}\n\n.style-toggle-btn.active i {\n color: #3b82f6;\n}\n\n.color-picker-row {\n display: flex;\n gap: 12px;\n align-items: center;\n}\n\n.color-picker-group {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.color-picker-group label {\n font-size: 13px;\n color: #64748b;\n min-width: 80px;\n}\n\n.color-picker-group input[type=\"color\"] {\n width: 40px;\n height: 32px;\n padding: 2px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.color-clear-btn {\n width: 32px;\n height: 32px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n background: white;\n cursor: pointer;\n color: #999;\n transition: all 0.15s ease;\n}\n\n.color-clear-btn:hover {\n background: #f5f5f5;\n color: #666;\n}\n\n/* Format Editor Footer */\n.format-editor-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.format-footer-left {\n display: flex;\n gap: 8px;\n}\n\n.format-footer-right {\n display: flex;\n gap: 8px;\n}\n\n.format-footer-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.format-footer-btn:hover:not(:disabled) {\n background: #f0f0f0;\n border-color: #ccc;\n}\n\n.format-footer-btn.primary {\n background: #1976d2;\n border-color: #1976d2;\n color: white;\n}\n\n.format-footer-btn.primary:hover:not(:disabled) {\n background: #1565c0;\n border-color: #1565c0;\n}\n\n.format-footer-btn.danger {\n color: #c62828;\n border-color: #c62828;\n}\n\n.format-footer-btn.danger:hover:not(:disabled) {\n background: #c62828;\n color: white;\n}\n\n/* Filter Summary Container */\n.filter-summary-container {\n padding: 4px 0;\n}\n\n.filter-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: #f5f7fa;\n border-radius: 8px;\n border: 1px solid #e8e8e8;\n}\n\n.summary-info {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-badge {\n background: #1976d2;\n color: white;\n font-size: 12px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n min-width: 20px;\n text-align: center;\n}\n\n.summary-text {\n font-size: 14px;\n color: #333;\n}\n\n.summary-text.no-filters {\n color: #999;\n}\n\n.summary-actions {\n display: flex;\n gap: 8px;\n}\n\n.summary-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.summary-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.summary-btn i {\n font-size: 11px;\n}\n\n.summary-btn.clear-btn {\n background: transparent;\n color: #c62828;\n border: 1px solid #e0e0e0;\n}\n\n.summary-btn.clear-btn:hover:not(:disabled) {\n background: #ffebee;\n border-color: #c62828;\n}\n\n.summary-btn.edit-btn {\n background: #1976d2;\n color: white;\n}\n\n.summary-btn.edit-btn:hover:not(:disabled) {\n background: #1565c0;\n}\n\n/* ========================================\n FILTER MODE SELECTOR\n ======================================== */\n\n.filter-mode-selector {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n}\n\n.filter-mode-btn {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 16px;\n border: 2px solid #e5e7eb;\n border-radius: 12px;\n background: white;\n cursor: pointer;\n transition: all 0.2s ease;\n text-align: left;\n}\n\n.filter-mode-btn:hover:not(:disabled) {\n border-color: #d1d5db;\n background: #f9fafb;\n}\n\n.filter-mode-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.filter-mode-btn.active {\n border-color: #3b82f6;\n background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);\n}\n\n.filter-mode-btn .mode-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 10px;\n background: #f3f4f6;\n color: #6b7280;\n font-size: 16px;\n flex-shrink: 0;\n transition: all 0.2s ease;\n}\n\n.filter-mode-btn.active .mode-icon {\n background: #3b82f6;\n color: white;\n}\n\n.filter-mode-btn .mode-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.filter-mode-btn .mode-title {\n font-size: 14px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.filter-mode-btn .mode-subtitle {\n font-size: 12px;\n color: #6b7280;\n}\n\n.filter-mode-btn.active .mode-title {\n color: #1d4ed8;\n}\n\n.filter-mode-btn .mode-check {\n color: #3b82f6;\n font-size: 16px;\n flex-shrink: 0;\n}\n\n/* ========================================\n SMART FILTER SECTION\n ======================================== */\n\n.smart-filter-section {\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.smart-filter-input-container {\n display: flex;\n gap: 12px;\n padding: 16px;\n background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);\n border: 1px solid #bae6fd;\n border-radius: 12px;\n margin-bottom: 16px;\n}\n\n.smart-filter-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #3b82f6 0%, #6366f1 100%);\n border-radius: 10px;\n color: white;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.smart-filter-input-container .smart-filter-textarea {\n flex: 1;\n border: none;\n background: white;\n border-radius: 8px;\n padding: 12px;\n font-size: 14px;\n line-height: 1.5;\n resize: none;\n min-height: 60px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.smart-filter-input-container .smart-filter-textarea:focus {\n outline: none;\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3), 0 1px 3px rgba(0, 0, 0, 0.08);\n}\n\n.smart-filter-input-container .smart-filter-textarea::placeholder {\n color: #9ca3af;\n}\n\n.smart-filter-explanation {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 12px;\n background: #e3f2fd;\n border-radius: 6px;\n margin-bottom: 12px;\n font-size: 13px;\n color: #1565c0;\n}\n\n.smart-filter-explanation i {\n color: #1976d2;\n font-size: 14px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n/* Smart Filter Examples */\n.smart-filter-examples {\n margin-bottom: 16px;\n}\n\n.examples-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 10px;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n}\n\n.examples-header i {\n color: #f59e0b;\n}\n\n.example-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.example-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n border: 1px solid #e5e7eb;\n border-radius: 20px;\n background: white;\n font-size: 12px;\n font-weight: 500;\n color: #4b5563;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.example-chip:hover:not(:disabled) {\n border-color: #3b82f6;\n background: #eff6ff;\n color: #1d4ed8;\n}\n\n.example-chip:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.example-chip i {\n font-size: 11px;\n color: #9ca3af;\n}\n\n.example-chip:hover:not(:disabled) i {\n color: #3b82f6;\n}\n\n/* Smart Filter Tip */\n.smart-filter-tip {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 14px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 12px;\n color: #64748b;\n line-height: 1.5;\n}\n\n.smart-filter-tip i {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n/* ========================================\n TRADITIONAL FILTER SECTION\n ======================================== */\n\n.traditional-filter-section {\n padding: 0;\n border: none;\n background: transparent;\n}\n\n.traditional-filter-tip {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 12px 14px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font-size: 12px;\n color: #64748b;\n line-height: 1.5;\n margin-top: 12px;\n}\n\n.traditional-filter-tip i {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n.summary-btn.edit-btn.primary {\n background: #3b82f6;\n color: white;\n border-color: #3b82f6;\n}\n\n.summary-btn.edit-btn.primary:hover:not(:disabled) {\n background: #2563eb;\n border-color: #2563eb;\n}\n\n/* Form Elements */\n.form-group {\n margin-bottom: 16px;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n}\n\n.form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n transition: border-color 0.15s ease;\n}\n\n.form-input:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.form-input:disabled {\n background: #f5f5f5;\n color: #999;\n}\n\n.form-textarea {\n resize: vertical;\n min-height: 80px;\n}\n\n/* Checkbox */\n.checkbox-label {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n cursor: pointer;\n}\n\n.checkbox-label input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n margin-top: 2px;\n cursor: pointer;\n}\n\n.checkbox-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-text strong {\n font-size: 14px;\n color: #333;\n}\n\n.checkbox-text small {\n font-size: 12px;\n color: #666;\n}\n\n/* Danger Zone */\n.danger-zone {\n padding-top: 16px;\n border-top: 1px solid #ffcdd2;\n}\n\n.danger-zone .section-header {\n color: #c62828;\n}\n\n.danger-zone .section-header i {\n color: #c62828;\n}\n\n.delete-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n padding: 10px 16px;\n border: 1px solid #c62828;\n background: transparent;\n border-radius: 6px;\n color: #c62828;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.delete-btn:hover {\n background: #c62828;\n color: white;\n}\n\n/* Panel Footer */\n.panel-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n flex-shrink: 0;\n}\n\n.footer-left {\n display: flex;\n gap: 8px;\n}\n\n.footer-right {\n display: flex;\n gap: 8px;\n}\n\n.footer-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 16px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.footer-btn:hover:not(:disabled) {\n background: #f0f0f0;\n border-color: #ccc;\n}\n\n.footer-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.footer-btn.primary {\n background: #1976d2;\n border-color: #1976d2;\n color: white;\n}\n\n.footer-btn.primary:hover:not(:disabled) {\n background: #1565c0;\n border-color: #1565c0;\n}\n\n.footer-btn i {\n font-size: 12px;\n}\n\n/* ========================================\n FORMAT EDITOR INLINE STYLES\n ======================================== */\n\n.format-editor {\n padding: 0 20px;\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow-y: auto;\n}\n\n.format-editor .format-editor-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 0 16px 0;\n border-bottom: 1px solid #e0e0e0;\n margin-bottom: 16px;\n}\n\n.format-editor .back-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.format-editor .back-btn:hover {\n background: #e0e0e0;\n color: #333;\n}\n\n.format-editor .format-editor-title {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n}\n\n/* Preview Table */\n.format-editor .preview-table {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-top: 12px;\n}\n\n.format-editor .preview-header-cell {\n padding: 10px 14px;\n background: #f1f5f9;\n border-radius: 6px;\n font-weight: 600;\n font-size: 13px;\n color: #333;\n}\n\n.format-editor .preview-cell {\n padding: 8px 14px;\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 4px;\n font-size: 14px;\n color: #333;\n}\n\n/* Format Section */\n.format-section {\n margin-bottom: 20px;\n padding-bottom: 16px;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.format-section:last-child {\n border-bottom: none;\n}\n\n.format-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n font-weight: 600;\n color: #333;\n}\n\n.format-section-header i {\n color: #1976d2;\n font-size: 12px;\n}\n\n/* Format Row */\n.format-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 10px;\n}\n\n.format-row:last-child {\n margin-bottom: 0;\n}\n\n.format-row label {\n font-size: 13px;\n color: #555;\n flex-shrink: 0;\n}\n\n/* Format Inputs */\n.format-select {\n flex: 1;\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\n min-width: 120px;\n}\n\n.format-select:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.format-input {\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n}\n\n.format-input:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.format-input.small {\n width: 80px;\n}\n\n/* Alias Info Row */\n.format-row.alias-info {\n justify-content: flex-start;\n gap: 8px;\n}\n\n.format-row.alias-info .muted-text {\n color: #888;\n font-size: 12px;\n}\n\n.clear-alias-btn {\n width: 20px;\n height: 20px;\n border: none;\n background: #f0f0f0;\n border-radius: 50%;\n color: #888;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n transition: all 0.15s ease;\n}\n\n.clear-alias-btn:hover {\n background: #e0e0e0;\n color: #c62828;\n}\n\n/* Color Input */\n.color-input {\n width: 50px;\n height: 32px;\n padding: 2px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n background: white;\n}\n\n.color-input:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n/* Alignment Toggle */\n.alignment-toggle {\n display: flex;\n gap: 8px;\n}\n\n.align-btn {\n width: 40px;\n height: 36px;\n border: 2px solid #e5e7eb;\n border-radius: 6px;\n background: white;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.align-btn:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n}\n\n.align-btn.active {\n border-color: #1976d2;\n background: #e3f2fd;\n}\n\n.align-btn i {\n font-size: 14px;\n color: #64748b;\n}\n\n.align-btn.active i {\n color: #1976d2;\n}\n\n/* Style Buttons */\n.style-buttons {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.style-btn {\n width: 36px;\n height: 36px;\n border: 2px solid #e5e7eb;\n border-radius: 6px;\n background: white;\n cursor: pointer;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.style-btn:hover {\n border-color: #cbd5e1;\n background: #f8fafc;\n}\n\n.style-btn.active {\n border-color: #1976d2;\n background: #e3f2fd;\n}\n\n.style-btn i {\n font-size: 14px;\n color: #64748b;\n}\n\n.style-btn.active i {\n color: #1976d2;\n}\n\n/* Collapsible Format Sections */\n.format-section-collapsible {\n margin-bottom: 12px;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.format-section-collapsible summary {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px;\n background: #f8fafc;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n list-style: none;\n}\n\n.format-section-collapsible summary::-webkit-details-marker {\n display: none;\n}\n\n.format-section-collapsible summary::before {\n content: '\\f054';\n font-family: 'Font Awesome 6 Free';\n font-weight: 900;\n font-size: 10px;\n color: #999;\n transition: transform 0.2s ease;\n}\n\n.format-section-collapsible[open] summary::before {\n transform: rotate(90deg);\n}\n\n.format-section-collapsible summary i {\n color: #1976d2;\n font-size: 12px;\n}\n\n.format-section-collapsible summary span {\n flex: 1;\n}\n\n.format-section-content {\n padding: 14px;\n background: white;\n border-top: 1px solid #e0e0e0;\n}\n\n/* Format Actions */\n.format-actions {\n margin-top: 20px;\n padding-top: 16px;\n border-top: 1px solid #e0e0e0;\n}\n\n.clear-format-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n width: 100%;\n padding: 10px 16px;\n border: 1px solid #e0e0e0;\n background: white;\n border-radius: 6px;\n color: #666;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.clear-format-btn:hover {\n background: #fff5f5;\n border-color: #f87171;\n color: #dc2626;\n}\n\n.clear-format-btn i {\n font-size: 12px;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .config-panel {\n width: 100% !important;\n max-width: 100vw !important;\n }\n\n /* Hide resize handle on mobile - panel is full width */\n .resize-handle {\n display: none;\n }\n\n .tab-btn span {\n display: none;\n }\n\n .tab-btn {\n padding: 14px;\n }\n\n .tab-btn i {\n font-size: 16px;\n }\n\n .format-type-grid {\n grid-template-columns: repeat(3, 1fr);\n }\n}\n\n/* Medium screens - limit max resize width */\n@media (min-width: 769px) and (max-width: 1200px) {\n .config-panel {\n max-width: min(600px, 80vw);\n }\n}\n"] }]
1977
+ }], () => [{ type: i0.ChangeDetectorRef }], { entity: [{
1978
+ type: Input
1979
+ }], viewEntity: [{
1980
+ type: Input
1981
+ }], isOpen: [{
1982
+ type: Input
1983
+ }], currentGridState: [{
1984
+ type: Input
1985
+ }], sampleData: [{
1986
+ type: Input
1987
+ }], close: [{
1988
+ type: Output
1989
+ }], save: [{
1990
+ type: Output
1991
+ }], saveDefaults: [{
1992
+ type: Output
1993
+ }], delete: [{
1994
+ type: Output
1995
+ }], openFilterDialogRequest: [{
1996
+ type: Output
1997
+ }], externalFilterState: [{
1998
+ type: Input
1999
+ }], isSaving: [{
2000
+ type: Input
2001
+ }], handleEscape: [{
2002
+ type: HostListener,
2003
+ args: ['document:keydown.escape']
2004
+ }] }); })();
2005
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ViewConfigPanelComponent, { className: "ViewConfigPanelComponent" }); })();
2006
+ //# sourceMappingURL=view-config-panel.component.js.map