@memberjunction/ng-entity-viewer 4.3.1 → 5.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.
- package/dist/lib/confirm-dialog/confirm-dialog.component.d.ts +84 -0
- package/dist/lib/confirm-dialog/confirm-dialog.component.d.ts.map +1 -0
- package/dist/lib/confirm-dialog/confirm-dialog.component.js +166 -0
- package/dist/lib/confirm-dialog/confirm-dialog.component.js.map +1 -0
- package/dist/lib/duplicate-view-dialog/duplicate-view-dialog.component.d.ts +44 -0
- package/dist/lib/duplicate-view-dialog/duplicate-view-dialog.component.d.ts.map +1 -0
- package/dist/lib/duplicate-view-dialog/duplicate-view-dialog.component.js +182 -0
- package/dist/lib/duplicate-view-dialog/duplicate-view-dialog.component.js.map +1 -0
- package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts +1 -1
- package/dist/lib/entity-data-grid/entity-data-grid.component.js +2 -2
- package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -1
- package/dist/lib/entity-grid/entity-grid.component.d.ts +216 -0
- package/dist/lib/entity-grid/entity-grid.component.d.ts.map +1 -0
- package/dist/lib/entity-grid/entity-grid.component.js +676 -0
- package/dist/lib/entity-grid/entity-grid.component.js.map +1 -0
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.d.ts +94 -0
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.d.ts.map +1 -0
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.js +362 -0
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.js.map +1 -0
- package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.d.ts +37 -0
- package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.d.ts.map +1 -0
- package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.js +100 -0
- package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.js.map +1 -0
- package/dist/lib/types.d.ts +41 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +0 -3
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/view-config-panel/view-config-panel.component.d.ts +63 -4
- package/dist/lib/view-config-panel/view-config-panel.component.d.ts.map +1 -1
- package/dist/lib/view-config-panel/view-config-panel.component.js +692 -557
- package/dist/lib/view-config-panel/view-config-panel.component.js.map +1 -1
- package/dist/lib/view-header/view-header.component.d.ts +86 -0
- package/dist/lib/view-header/view-header.component.d.ts.map +1 -0
- package/dist/lib/view-header/view-header.component.js +216 -0
- package/dist/lib/view-header/view-header.component.js.map +1 -0
- package/dist/module.d.ts +12 -7
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +29 -4
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +5 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +10 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +9 -9
|
@@ -5,12 +5,13 @@ import { createEmptyFilter } from '@memberjunction/ng-filter-builder';
|
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
import * as i1 from "@angular/forms";
|
|
7
7
|
import * as i2 from "../aggregate-setup-dialog/aggregate-setup-dialog.component";
|
|
8
|
+
import * as i3 from "../confirm-dialog/confirm-dialog.component";
|
|
8
9
|
const _forTrack0 = ($index, $item) => $item.fieldId;
|
|
9
10
|
const _forTrack1 = ($index, $item) => $item.ID;
|
|
10
11
|
const _forTrack2 = ($index, $item) => $item.id;
|
|
11
12
|
function ViewConfigPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
12
13
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
13
|
-
i0.ɵɵelementStart(0, "div",
|
|
14
|
+
i0.ɵɵelementStart(0, "div", 28);
|
|
14
15
|
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()); });
|
|
15
16
|
i0.ɵɵelementEnd();
|
|
16
17
|
} }
|
|
@@ -52,141 +53,155 @@ function ViewConfigPanelComponent_Conditional_25_Template(rf, ctx) { if (rf & 1)
|
|
|
52
53
|
i0.ɵɵadvance();
|
|
53
54
|
i0.ɵɵtextInterpolate(ctx_r1.enabledAggregatesCount);
|
|
54
55
|
} }
|
|
55
|
-
function
|
|
56
|
+
function ViewConfigPanelComponent_Conditional_26_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
56
57
|
i0.ɵɵelementStart(0, "span");
|
|
57
58
|
i0.ɵɵtext(1, "Settings");
|
|
58
59
|
i0.ɵɵelementEnd();
|
|
59
60
|
} }
|
|
60
|
-
function
|
|
61
|
-
i0.ɵɵ
|
|
61
|
+
function ViewConfigPanelComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
62
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
63
|
+
i0.ɵɵelementStart(0, "button", 10);
|
|
64
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_26_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setActiveTab("settings")); });
|
|
65
|
+
i0.ɵɵelement(1, "i", 29);
|
|
66
|
+
i0.ɵɵconditionalCreate(2, ViewConfigPanelComponent_Conditional_26_Conditional_2_Template, 2, 0, "span");
|
|
67
|
+
i0.ɵɵelementEnd();
|
|
68
|
+
} if (rf & 2) {
|
|
69
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
70
|
+
i0.ɵɵclassProp("active", ctx_r1.activeTab === "settings");
|
|
71
|
+
i0.ɵɵproperty("title", ctx_r1.isIconOnlyMode ? "Settings" : "");
|
|
72
|
+
i0.ɵɵadvance(2);
|
|
73
|
+
i0.ɵɵconditional(!ctx_r1.isIconOnlyMode ? 2 : -1);
|
|
62
74
|
} }
|
|
63
|
-
function
|
|
64
|
-
i0.ɵɵelement(0, "
|
|
75
|
+
function ViewConfigPanelComponent_Conditional_28_For_10_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
76
|
+
i0.ɵɵelement(0, "div", 40);
|
|
77
|
+
} }
|
|
78
|
+
function ViewConfigPanelComponent_Conditional_28_For_10_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
79
|
+
i0.ɵɵelement(0, "i", 45);
|
|
65
80
|
} if (rf & 2) {
|
|
66
|
-
const
|
|
67
|
-
i0.ɵɵproperty("title", i0.ɵɵinterpolate1("Custom name: ",
|
|
81
|
+
const column_r5 = i0.ɵɵnextContext().$implicit;
|
|
82
|
+
i0.ɵɵproperty("title", i0.ɵɵinterpolate1("Custom name: ", column_r5.userDisplayName));
|
|
68
83
|
} }
|
|
69
|
-
function
|
|
70
|
-
i0.ɵɵelement(0, "i",
|
|
84
|
+
function ViewConfigPanelComponent_Conditional_28_For_10_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
85
|
+
i0.ɵɵelement(0, "i", 46);
|
|
71
86
|
} }
|
|
72
|
-
function
|
|
73
|
-
i0.ɵɵelement(0, "div",
|
|
87
|
+
function ViewConfigPanelComponent_Conditional_28_For_10_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
88
|
+
i0.ɵɵelement(0, "div", 40);
|
|
74
89
|
} }
|
|
75
|
-
function
|
|
76
|
-
const
|
|
77
|
-
i0.ɵɵconditionalCreate(0,
|
|
78
|
-
i0.ɵɵelementStart(1, "div",
|
|
79
|
-
i0.ɵɵlistener("dragstart", function
|
|
80
|
-
i0.ɵɵelementStart(2, "div",
|
|
81
|
-
i0.ɵɵelement(3, "i",
|
|
82
|
-
i0.ɵɵelementEnd();
|
|
83
|
-
i0.ɵɵelementStart(4, "span",
|
|
90
|
+
function ViewConfigPanelComponent_Conditional_28_For_10_Template(rf, ctx) { if (rf & 1) {
|
|
91
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
92
|
+
i0.ɵɵconditionalCreate(0, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_0_Template, 1, 0, "div", 40);
|
|
93
|
+
i0.ɵɵelementStart(1, "div", 41);
|
|
94
|
+
i0.ɵɵlistener("dragstart", function ViewConfigPanelComponent_Conditional_28_For_10_Template_div_dragstart_1_listener($event) { const column_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragStart($event, column_r5)); })("dragover", function ViewConfigPanelComponent_Conditional_28_For_10_Template_div_dragover_1_listener($event) { const column_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragOver($event, column_r5)); })("dragleave", function ViewConfigPanelComponent_Conditional_28_For_10_Template_div_dragleave_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragLeave($event)); })("drop", function ViewConfigPanelComponent_Conditional_28_For_10_Template_div_drop_1_listener($event) { const column_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDrop($event, column_r5)); })("dragend", function ViewConfigPanelComponent_Conditional_28_For_10_Template_div_dragend_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDragEnd($event)); });
|
|
95
|
+
i0.ɵɵelementStart(2, "div", 42);
|
|
96
|
+
i0.ɵɵelement(3, "i", 43);
|
|
97
|
+
i0.ɵɵelementEnd();
|
|
98
|
+
i0.ɵɵelementStart(4, "span", 44);
|
|
84
99
|
i0.ɵɵtext(5);
|
|
85
|
-
i0.ɵɵconditionalCreate(6,
|
|
86
|
-
i0.ɵɵconditionalCreate(7,
|
|
100
|
+
i0.ɵɵconditionalCreate(6, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_6_Template, 1, 2, "i", 45);
|
|
101
|
+
i0.ɵɵconditionalCreate(7, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_7_Template, 1, 0, "i", 46);
|
|
87
102
|
i0.ɵɵelementEnd();
|
|
88
|
-
i0.ɵɵelementStart(8, "div",
|
|
89
|
-
i0.ɵɵlistener("click", function
|
|
90
|
-
i0.ɵɵelement(10, "i",
|
|
103
|
+
i0.ɵɵelementStart(8, "div", 47)(9, "button", 48);
|
|
104
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_28_For_10_Template_button_click_9_listener() { const column_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openFormatEditor(column_r5)); });
|
|
105
|
+
i0.ɵɵelement(10, "i", 49);
|
|
91
106
|
i0.ɵɵelementEnd();
|
|
92
|
-
i0.ɵɵelementStart(11, "button",
|
|
93
|
-
i0.ɵɵlistener("click", function
|
|
94
|
-
i0.ɵɵelement(12, "i",
|
|
107
|
+
i0.ɵɵelementStart(11, "button", 50);
|
|
108
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_28_For_10_Template_button_click_11_listener() { const column_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.moveColumnUp(column_r5)); });
|
|
109
|
+
i0.ɵɵelement(12, "i", 51);
|
|
95
110
|
i0.ɵɵelementEnd();
|
|
96
|
-
i0.ɵɵelementStart(13, "button",
|
|
97
|
-
i0.ɵɵlistener("click", function
|
|
98
|
-
i0.ɵɵelement(14, "i",
|
|
111
|
+
i0.ɵɵelementStart(13, "button", 52);
|
|
112
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_28_For_10_Template_button_click_13_listener() { const column_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.moveColumnDown(column_r5)); });
|
|
113
|
+
i0.ɵɵelement(14, "i", 53);
|
|
99
114
|
i0.ɵɵelementEnd();
|
|
100
|
-
i0.ɵɵelementStart(15, "button",
|
|
101
|
-
i0.ɵɵlistener("click", function
|
|
102
|
-
i0.ɵɵelement(16, "i",
|
|
115
|
+
i0.ɵɵelementStart(15, "button", 54);
|
|
116
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_28_For_10_Template_button_click_15_listener() { const column_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleColumnVisibility(column_r5)); });
|
|
117
|
+
i0.ɵɵelement(16, "i", 36);
|
|
103
118
|
i0.ɵɵelementEnd()()();
|
|
104
|
-
i0.ɵɵconditionalCreate(17,
|
|
119
|
+
i0.ɵɵconditionalCreate(17, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_17_Template, 1, 0, "div", 40);
|
|
105
120
|
} if (rf & 2) {
|
|
106
|
-
const
|
|
107
|
-
const ɵ$
|
|
121
|
+
const column_r5 = ctx.$implicit;
|
|
122
|
+
const ɵ$index_93_r6 = ctx.$index;
|
|
108
123
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
109
|
-
i0.ɵɵconditional(ctx_r1.isDropBefore(
|
|
124
|
+
i0.ɵɵconditional(ctx_r1.isDropBefore(column_r5) ? 0 : -1);
|
|
110
125
|
i0.ɵɵadvance();
|
|
111
|
-
i0.ɵɵclassProp("dragging", ctx_r1.draggedColumn ===
|
|
126
|
+
i0.ɵɵclassProp("dragging", ctx_r1.draggedColumn === column_r5)("drop-target", ctx_r1.dropTargetColumn === column_r5);
|
|
112
127
|
i0.ɵɵadvance(4);
|
|
113
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
128
|
+
i0.ɵɵtextInterpolate1(" ", column_r5.userDisplayName || column_r5.displayName, " ");
|
|
114
129
|
i0.ɵɵadvance();
|
|
115
|
-
i0.ɵɵconditional(
|
|
130
|
+
i0.ɵɵconditional(column_r5.userDisplayName ? 6 : -1);
|
|
116
131
|
i0.ɵɵadvance();
|
|
117
|
-
i0.ɵɵconditional(ctx_r1.hasCustomFormat(
|
|
132
|
+
i0.ɵɵconditional(ctx_r1.hasCustomFormat(column_r5) ? 7 : -1);
|
|
118
133
|
i0.ɵɵadvance(4);
|
|
119
|
-
i0.ɵɵproperty("disabled", ɵ$
|
|
134
|
+
i0.ɵɵproperty("disabled", ɵ$index_93_r6 === 0);
|
|
120
135
|
i0.ɵɵadvance(2);
|
|
121
|
-
i0.ɵɵproperty("disabled", ɵ$
|
|
136
|
+
i0.ɵɵproperty("disabled", ɵ$index_93_r6 === ctx_r1.visibleColumns.length - 1);
|
|
122
137
|
i0.ɵɵadvance(4);
|
|
123
|
-
i0.ɵɵconditional(ctx_r1.isDropAfter(
|
|
138
|
+
i0.ɵɵconditional(ctx_r1.isDropAfter(column_r5) && ɵ$index_93_r6 === ctx_r1.visibleColumns.length - 1 ? 17 : -1);
|
|
124
139
|
} }
|
|
125
|
-
function
|
|
126
|
-
i0.ɵɵelementStart(0, "div",
|
|
127
|
-
i0.ɵɵelement(1, "i",
|
|
140
|
+
function ViewConfigPanelComponent_Conditional_28_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
+
i0.ɵɵelementStart(0, "div", 35);
|
|
142
|
+
i0.ɵɵelement(1, "i", 55);
|
|
128
143
|
i0.ɵɵelementStart(2, "span");
|
|
129
144
|
i0.ɵɵtext(3, "No columns visible. Add columns from below.");
|
|
130
145
|
i0.ɵɵelementEnd()();
|
|
131
146
|
} }
|
|
132
|
-
function
|
|
133
|
-
const
|
|
134
|
-
i0.ɵɵelementStart(0, "div",
|
|
135
|
-
i0.ɵɵelement(1, "i",
|
|
136
|
-
i0.ɵɵelementStart(2, "input",
|
|
137
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
147
|
+
function ViewConfigPanelComponent_Conditional_28_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
148
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
149
|
+
i0.ɵɵelementStart(0, "div", 37);
|
|
150
|
+
i0.ɵɵelement(1, "i", 56);
|
|
151
|
+
i0.ɵɵelementStart(2, "input", 57);
|
|
152
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_28_Conditional_19_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.columnSearchText, $event) || (ctx_r1.columnSearchText = $event); return i0.ɵɵresetView($event); });
|
|
138
153
|
i0.ɵɵelementEnd()();
|
|
139
154
|
} if (rf & 2) {
|
|
140
155
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
141
156
|
i0.ɵɵadvance(2);
|
|
142
157
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.columnSearchText);
|
|
143
158
|
} }
|
|
144
|
-
function
|
|
145
|
-
const
|
|
146
|
-
i0.ɵɵelementStart(0, "div",
|
|
159
|
+
function ViewConfigPanelComponent_Conditional_28_For_22_Template(rf, ctx) { if (rf & 1) {
|
|
160
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
161
|
+
i0.ɵɵelementStart(0, "div", 39)(1, "span", 44);
|
|
147
162
|
i0.ɵɵtext(2);
|
|
148
163
|
i0.ɵɵelementEnd();
|
|
149
|
-
i0.ɵɵelementStart(3, "button",
|
|
150
|
-
i0.ɵɵlistener("click", function
|
|
151
|
-
i0.ɵɵelement(4, "i",
|
|
164
|
+
i0.ɵɵelementStart(3, "button", 58);
|
|
165
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_28_For_22_Template_button_click_3_listener() { const column_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleColumnVisibility(column_r9)); });
|
|
166
|
+
i0.ɵɵelement(4, "i", 59);
|
|
152
167
|
i0.ɵɵelementEnd()();
|
|
153
168
|
} if (rf & 2) {
|
|
154
|
-
const
|
|
169
|
+
const column_r9 = ctx.$implicit;
|
|
155
170
|
i0.ɵɵadvance(2);
|
|
156
|
-
i0.ɵɵtextInterpolate(
|
|
171
|
+
i0.ɵɵtextInterpolate(column_r9.displayName);
|
|
157
172
|
} }
|
|
158
|
-
function
|
|
159
|
-
i0.ɵɵelementStart(0, "div",
|
|
160
|
-
i0.ɵɵelement(1, "i",
|
|
173
|
+
function ViewConfigPanelComponent_Conditional_28_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
174
|
+
i0.ɵɵelementStart(0, "div", 35);
|
|
175
|
+
i0.ɵɵelement(1, "i", 60);
|
|
161
176
|
i0.ɵɵelementStart(2, "span");
|
|
162
177
|
i0.ɵɵtext(3, "All columns are visible");
|
|
163
178
|
i0.ɵɵelementEnd()();
|
|
164
179
|
} }
|
|
165
|
-
function
|
|
166
|
-
i0.ɵɵelementStart(0, "div", 18)(1, "div",
|
|
167
|
-
i0.ɵɵelement(3, "i",
|
|
180
|
+
function ViewConfigPanelComponent_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
181
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 30)(2, "div", 31);
|
|
182
|
+
i0.ɵɵelement(3, "i", 32);
|
|
168
183
|
i0.ɵɵelementStart(4, "span");
|
|
169
184
|
i0.ɵɵtext(5, "Visible Columns");
|
|
170
185
|
i0.ɵɵelementEnd();
|
|
171
|
-
i0.ɵɵelementStart(6, "span",
|
|
186
|
+
i0.ɵɵelementStart(6, "span", 33);
|
|
172
187
|
i0.ɵɵtext(7);
|
|
173
188
|
i0.ɵɵelementEnd()();
|
|
174
|
-
i0.ɵɵelementStart(8, "div",
|
|
175
|
-
i0.ɵɵrepeaterCreate(9,
|
|
176
|
-
i0.ɵɵconditionalCreate(11,
|
|
189
|
+
i0.ɵɵelementStart(8, "div", 34);
|
|
190
|
+
i0.ɵɵrepeaterCreate(9, ViewConfigPanelComponent_Conditional_28_For_10_Template, 18, 11, null, null, _forTrack0);
|
|
191
|
+
i0.ɵɵconditionalCreate(11, ViewConfigPanelComponent_Conditional_28_Conditional_11_Template, 4, 0, "div", 35);
|
|
177
192
|
i0.ɵɵelementEnd()();
|
|
178
|
-
i0.ɵɵelementStart(12, "div",
|
|
179
|
-
i0.ɵɵelement(14, "i",
|
|
193
|
+
i0.ɵɵelementStart(12, "div", 30)(13, "div", 31);
|
|
194
|
+
i0.ɵɵelement(14, "i", 36);
|
|
180
195
|
i0.ɵɵelementStart(15, "span");
|
|
181
196
|
i0.ɵɵtext(16, "Hidden Columns");
|
|
182
197
|
i0.ɵɵelementEnd();
|
|
183
|
-
i0.ɵɵelementStart(17, "span",
|
|
198
|
+
i0.ɵɵelementStart(17, "span", 33);
|
|
184
199
|
i0.ɵɵtext(18);
|
|
185
200
|
i0.ɵɵelementEnd()();
|
|
186
|
-
i0.ɵɵconditionalCreate(19,
|
|
187
|
-
i0.ɵɵelementStart(20, "div",
|
|
188
|
-
i0.ɵɵrepeaterCreate(21,
|
|
189
|
-
i0.ɵɵconditionalCreate(23,
|
|
201
|
+
i0.ɵɵconditionalCreate(19, ViewConfigPanelComponent_Conditional_28_Conditional_19_Template, 3, 1, "div", 37);
|
|
202
|
+
i0.ɵɵelementStart(20, "div", 38);
|
|
203
|
+
i0.ɵɵrepeaterCreate(21, ViewConfigPanelComponent_Conditional_28_For_22_Template, 5, 1, "div", 39, _forTrack0);
|
|
204
|
+
i0.ɵɵconditionalCreate(23, ViewConfigPanelComponent_Conditional_28_Conditional_23_Template, 4, 0, "div", 35);
|
|
190
205
|
i0.ɵɵelementEnd()()();
|
|
191
206
|
} if (rf & 2) {
|
|
192
207
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -205,13 +220,13 @@ function ViewConfigPanelComponent_Conditional_30_Template(rf, ctx) { if (rf & 1)
|
|
|
205
220
|
i0.ɵɵadvance(2);
|
|
206
221
|
i0.ɵɵconditional(ctx_r1.hiddenColumns.length === 0 ? 23 : -1);
|
|
207
222
|
} }
|
|
208
|
-
function
|
|
209
|
-
const
|
|
210
|
-
i0.ɵɵelementStart(0, "div",
|
|
223
|
+
function ViewConfigPanelComponent_Conditional_29_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
224
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
225
|
+
i0.ɵɵelementStart(0, "div", 70)(1, "small", 106);
|
|
211
226
|
i0.ɵɵtext(2);
|
|
212
227
|
i0.ɵɵelementEnd();
|
|
213
|
-
i0.ɵɵelementStart(3, "button",
|
|
214
|
-
i0.ɵɵlistener("click", function
|
|
228
|
+
i0.ɵɵelementStart(3, "button", 107);
|
|
229
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Conditional_16_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.formatEditingColumn.userDisplayName = undefined); });
|
|
215
230
|
i0.ɵɵelement(4, "i", 8);
|
|
216
231
|
i0.ɵɵelementEnd()();
|
|
217
232
|
} if (rf & 2) {
|
|
@@ -219,40 +234,40 @@ function ViewConfigPanelComponent_Conditional_31_Conditional_16_Template(rf, ctx
|
|
|
219
234
|
i0.ɵɵadvance(2);
|
|
220
235
|
i0.ɵɵtextInterpolate1("Original: ", ctx_r1.formatEditingColumn.displayName);
|
|
221
236
|
} }
|
|
222
|
-
function
|
|
223
|
-
i0.ɵɵelementStart(0, "div",
|
|
237
|
+
function ViewConfigPanelComponent_Conditional_29_For_26_Template(rf, ctx) { if (rf & 1) {
|
|
238
|
+
i0.ɵɵelementStart(0, "div", 108);
|
|
224
239
|
i0.ɵɵtext(1);
|
|
225
240
|
i0.ɵɵelementEnd();
|
|
226
241
|
} if (rf & 2) {
|
|
227
|
-
const
|
|
242
|
+
const value_r12 = ctx.$implicit;
|
|
228
243
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
229
244
|
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);
|
|
230
245
|
i0.ɵɵadvance();
|
|
231
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatPreviewValue(
|
|
246
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatPreviewValue(value_r12, ctx_r1.formatEditingColumn.format), " ");
|
|
232
247
|
} }
|
|
233
|
-
function
|
|
234
|
-
const
|
|
235
|
-
i0.ɵɵelementStart(0, "div",
|
|
248
|
+
function ViewConfigPanelComponent_Conditional_29_Conditional_49_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
249
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
250
|
+
i0.ɵɵelementStart(0, "div", 68)(1, "label");
|
|
236
251
|
i0.ɵɵtext(2, "Currency");
|
|
237
252
|
i0.ɵɵelementEnd();
|
|
238
|
-
i0.ɵɵelementStart(3, "select",
|
|
239
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
240
|
-
i0.ɵɵelementStart(4, "option",
|
|
253
|
+
i0.ɵɵelementStart(3, "select", 77);
|
|
254
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_29_Conditional_49_Conditional_9_Template_select_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.currencyCode, $event) || (ctx_r1.formatEditingColumn.format.currencyCode = $event); return i0.ɵɵresetView($event); });
|
|
255
|
+
i0.ɵɵelementStart(4, "option", 112);
|
|
241
256
|
i0.ɵɵtext(5, "USD ($)");
|
|
242
257
|
i0.ɵɵelementEnd();
|
|
243
|
-
i0.ɵɵelementStart(6, "option",
|
|
258
|
+
i0.ɵɵelementStart(6, "option", 113);
|
|
244
259
|
i0.ɵɵtext(7, "EUR (\u20AC)");
|
|
245
260
|
i0.ɵɵelementEnd();
|
|
246
|
-
i0.ɵɵelementStart(8, "option",
|
|
261
|
+
i0.ɵɵelementStart(8, "option", 114);
|
|
247
262
|
i0.ɵɵtext(9, "GBP (\u00A3)");
|
|
248
263
|
i0.ɵɵelementEnd();
|
|
249
|
-
i0.ɵɵelementStart(10, "option",
|
|
264
|
+
i0.ɵɵelementStart(10, "option", 115);
|
|
250
265
|
i0.ɵɵtext(11, "JPY (\u00A5)");
|
|
251
266
|
i0.ɵɵelementEnd();
|
|
252
|
-
i0.ɵɵelementStart(12, "option",
|
|
267
|
+
i0.ɵɵelementStart(12, "option", 116);
|
|
253
268
|
i0.ɵɵtext(13, "CAD ($)");
|
|
254
269
|
i0.ɵɵelementEnd();
|
|
255
|
-
i0.ɵɵelementStart(14, "option",
|
|
270
|
+
i0.ɵɵelementStart(14, "option", 117);
|
|
256
271
|
i0.ɵɵtext(15, "AUD ($)");
|
|
257
272
|
i0.ɵɵelementEnd()()();
|
|
258
273
|
} if (rf & 2) {
|
|
@@ -260,25 +275,25 @@ function ViewConfigPanelComponent_Conditional_31_Conditional_49_Conditional_9_Te
|
|
|
260
275
|
i0.ɵɵadvance(3);
|
|
261
276
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.currencyCode);
|
|
262
277
|
} }
|
|
263
|
-
function
|
|
264
|
-
const
|
|
265
|
-
i0.ɵɵelementStart(0, "div",
|
|
266
|
-
i0.ɵɵelement(2, "i",
|
|
278
|
+
function ViewConfigPanelComponent_Conditional_29_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
279
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
280
|
+
i0.ɵɵelementStart(0, "div", 65)(1, "div", 66);
|
|
281
|
+
i0.ɵɵelement(2, "i", 109);
|
|
267
282
|
i0.ɵɵelementStart(3, "span");
|
|
268
283
|
i0.ɵɵtext(4, "Number Options");
|
|
269
284
|
i0.ɵɵelementEnd()();
|
|
270
|
-
i0.ɵɵelementStart(5, "div",
|
|
285
|
+
i0.ɵɵelementStart(5, "div", 68)(6, "label");
|
|
271
286
|
i0.ɵɵtext(7, "Decimal Places");
|
|
272
287
|
i0.ɵɵelementEnd();
|
|
273
|
-
i0.ɵɵelementStart(8, "input",
|
|
274
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
288
|
+
i0.ɵɵelementStart(8, "input", 110);
|
|
289
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_29_Conditional_49_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.decimals, $event) || (ctx_r1.formatEditingColumn.format.decimals = $event); return i0.ɵɵresetView($event); });
|
|
275
290
|
i0.ɵɵelementEnd()();
|
|
276
|
-
i0.ɵɵconditionalCreate(9,
|
|
277
|
-
i0.ɵɵelementStart(10, "div",
|
|
291
|
+
i0.ɵɵconditionalCreate(9, ViewConfigPanelComponent_Conditional_29_Conditional_49_Conditional_9_Template, 16, 1, "div", 68);
|
|
292
|
+
i0.ɵɵelementStart(10, "div", 68)(11, "label");
|
|
278
293
|
i0.ɵɵtext(12, "Thousands Separator");
|
|
279
294
|
i0.ɵɵelementEnd();
|
|
280
|
-
i0.ɵɵelementStart(13, "input",
|
|
281
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
295
|
+
i0.ɵɵelementStart(13, "input", 111);
|
|
296
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_29_Conditional_49_Template_input_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.thousandsSeparator, $event) || (ctx_r1.formatEditingColumn.format.thousandsSeparator = $event); return i0.ɵɵresetView($event); });
|
|
282
297
|
i0.ɵɵelementEnd()()();
|
|
283
298
|
} if (rf & 2) {
|
|
284
299
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -289,34 +304,34 @@ function ViewConfigPanelComponent_Conditional_31_Conditional_49_Template(rf, ctx
|
|
|
289
304
|
i0.ɵɵadvance(4);
|
|
290
305
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.thousandsSeparator);
|
|
291
306
|
} }
|
|
292
|
-
function
|
|
293
|
-
const
|
|
294
|
-
i0.ɵɵelementStart(0, "div",
|
|
295
|
-
i0.ɵɵelement(2, "i",
|
|
307
|
+
function ViewConfigPanelComponent_Conditional_29_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
308
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
309
|
+
i0.ɵɵelementStart(0, "div", 65)(1, "div", 66);
|
|
310
|
+
i0.ɵɵelement(2, "i", 118);
|
|
296
311
|
i0.ɵɵelementStart(3, "span");
|
|
297
312
|
i0.ɵɵtext(4, "Date Options");
|
|
298
313
|
i0.ɵɵelementEnd()();
|
|
299
|
-
i0.ɵɵelementStart(5, "div",
|
|
314
|
+
i0.ɵɵelementStart(5, "div", 68)(6, "label");
|
|
300
315
|
i0.ɵɵtext(7, "Format");
|
|
301
316
|
i0.ɵɵelementEnd();
|
|
302
|
-
i0.ɵɵelementStart(8, "select",
|
|
303
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
304
|
-
i0.ɵɵelementStart(9, "option",
|
|
317
|
+
i0.ɵɵelementStart(8, "select", 77);
|
|
318
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_29_Conditional_50_Template_select_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.dateFormat, $event) || (ctx_r1.formatEditingColumn.format.dateFormat = $event); return i0.ɵɵresetView($event); });
|
|
319
|
+
i0.ɵɵelementStart(9, "option", 119);
|
|
305
320
|
i0.ɵɵtext(10, "Short (1/15/25)");
|
|
306
321
|
i0.ɵɵelementEnd();
|
|
307
|
-
i0.ɵɵelementStart(11, "option",
|
|
322
|
+
i0.ɵɵelementStart(11, "option", 120);
|
|
308
323
|
i0.ɵɵtext(12, "Short + Day (Wed, 1/15/25)");
|
|
309
324
|
i0.ɵɵelementEnd();
|
|
310
|
-
i0.ɵɵelementStart(13, "option",
|
|
325
|
+
i0.ɵɵelementStart(13, "option", 121);
|
|
311
326
|
i0.ɵɵtext(14, "Medium (Jan 15, 2025)");
|
|
312
327
|
i0.ɵɵelementEnd();
|
|
313
|
-
i0.ɵɵelementStart(15, "option",
|
|
328
|
+
i0.ɵɵelementStart(15, "option", 122);
|
|
314
329
|
i0.ɵɵtext(16, "Medium + Day (Wed, Jan 15, 2025)");
|
|
315
330
|
i0.ɵɵelementEnd();
|
|
316
|
-
i0.ɵɵelementStart(17, "option",
|
|
331
|
+
i0.ɵɵelementStart(17, "option", 123);
|
|
317
332
|
i0.ɵɵtext(18, "Long (January 15, 2025)");
|
|
318
333
|
i0.ɵɵelementEnd();
|
|
319
|
-
i0.ɵɵelementStart(19, "option",
|
|
334
|
+
i0.ɵɵelementStart(19, "option", 124);
|
|
320
335
|
i0.ɵɵtext(20, "Long + Day (Wednesday, January 15, 2025)");
|
|
321
336
|
i0.ɵɵelementEnd()()()();
|
|
322
337
|
} if (rf & 2) {
|
|
@@ -324,37 +339,37 @@ function ViewConfigPanelComponent_Conditional_31_Conditional_50_Template(rf, ctx
|
|
|
324
339
|
i0.ɵɵadvance(8);
|
|
325
340
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.dateFormat);
|
|
326
341
|
} }
|
|
327
|
-
function
|
|
328
|
-
const
|
|
329
|
-
i0.ɵɵelementStart(0, "div",
|
|
330
|
-
i0.ɵɵelement(2, "i",
|
|
342
|
+
function ViewConfigPanelComponent_Conditional_29_Conditional_51_Template(rf, ctx) { if (rf & 1) {
|
|
343
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
344
|
+
i0.ɵɵelementStart(0, "div", 65)(1, "div", 66);
|
|
345
|
+
i0.ɵɵelement(2, "i", 125);
|
|
331
346
|
i0.ɵɵelementStart(3, "span");
|
|
332
347
|
i0.ɵɵtext(4, "Boolean Options");
|
|
333
348
|
i0.ɵɵelementEnd()();
|
|
334
|
-
i0.ɵɵelementStart(5, "div",
|
|
349
|
+
i0.ɵɵelementStart(5, "div", 68)(6, "label");
|
|
335
350
|
i0.ɵɵtext(7, "True Label");
|
|
336
351
|
i0.ɵɵelementEnd();
|
|
337
|
-
i0.ɵɵelementStart(8, "input",
|
|
338
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
352
|
+
i0.ɵɵelementStart(8, "input", 126);
|
|
353
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_29_Conditional_51_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.trueLabel, $event) || (ctx_r1.formatEditingColumn.format.trueLabel = $event); return i0.ɵɵresetView($event); });
|
|
339
354
|
i0.ɵɵelementEnd()();
|
|
340
|
-
i0.ɵɵelementStart(9, "div",
|
|
355
|
+
i0.ɵɵelementStart(9, "div", 68)(10, "label");
|
|
341
356
|
i0.ɵɵtext(11, "False Label");
|
|
342
357
|
i0.ɵɵelementEnd();
|
|
343
|
-
i0.ɵɵelementStart(12, "input",
|
|
344
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
358
|
+
i0.ɵɵelementStart(12, "input", 127);
|
|
359
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_29_Conditional_51_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.falseLabel, $event) || (ctx_r1.formatEditingColumn.format.falseLabel = $event); return i0.ɵɵresetView($event); });
|
|
345
360
|
i0.ɵɵelementEnd()();
|
|
346
|
-
i0.ɵɵelementStart(13, "div",
|
|
361
|
+
i0.ɵɵelementStart(13, "div", 68)(14, "label");
|
|
347
362
|
i0.ɵɵtext(15, "Display As");
|
|
348
363
|
i0.ɵɵelementEnd();
|
|
349
|
-
i0.ɵɵelementStart(16, "select",
|
|
350
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
351
|
-
i0.ɵɵelementStart(17, "option",
|
|
364
|
+
i0.ɵɵelementStart(16, "select", 77);
|
|
365
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_29_Conditional_51_Template_select_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.booleanDisplay, $event) || (ctx_r1.formatEditingColumn.format.booleanDisplay = $event); return i0.ɵɵresetView($event); });
|
|
366
|
+
i0.ɵɵelementStart(17, "option", 79);
|
|
352
367
|
i0.ɵɵtext(18, "Text");
|
|
353
368
|
i0.ɵɵelementEnd();
|
|
354
|
-
i0.ɵɵelementStart(19, "option",
|
|
369
|
+
i0.ɵɵelementStart(19, "option", 128);
|
|
355
370
|
i0.ɵɵtext(20, "Checkbox");
|
|
356
371
|
i0.ɵɵelementEnd();
|
|
357
|
-
i0.ɵɵelementStart(21, "option",
|
|
372
|
+
i0.ɵɵelementStart(21, "option", 129);
|
|
358
373
|
i0.ɵɵtext(22, "Icon");
|
|
359
374
|
i0.ɵɵelementEnd()()()();
|
|
360
375
|
} if (rf & 2) {
|
|
@@ -366,150 +381,150 @@ function ViewConfigPanelComponent_Conditional_31_Conditional_51_Template(rf, ctx
|
|
|
366
381
|
i0.ɵɵadvance(4);
|
|
367
382
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formatEditingColumn.format.booleanDisplay);
|
|
368
383
|
} }
|
|
369
|
-
function
|
|
370
|
-
const
|
|
371
|
-
i0.ɵɵelementStart(0, "div", 19)(1, "div",
|
|
372
|
-
i0.ɵɵlistener("click", function
|
|
373
|
-
i0.ɵɵelement(3, "i",
|
|
384
|
+
function ViewConfigPanelComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
385
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
386
|
+
i0.ɵɵelementStart(0, "div", 19)(1, "div", 61)(2, "button", 62);
|
|
387
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeFormatEditor()); });
|
|
388
|
+
i0.ɵɵelement(3, "i", 63);
|
|
374
389
|
i0.ɵɵelementEnd();
|
|
375
|
-
i0.ɵɵelementStart(4, "div",
|
|
390
|
+
i0.ɵɵelementStart(4, "div", 64)(5, "span");
|
|
376
391
|
i0.ɵɵtext(6);
|
|
377
392
|
i0.ɵɵelementEnd()()();
|
|
378
|
-
i0.ɵɵelementStart(7, "div",
|
|
379
|
-
i0.ɵɵelement(9, "i",
|
|
393
|
+
i0.ɵɵelementStart(7, "div", 65)(8, "div", 66);
|
|
394
|
+
i0.ɵɵelement(9, "i", 67);
|
|
380
395
|
i0.ɵɵelementStart(10, "span");
|
|
381
396
|
i0.ɵɵtext(11, "Column Name");
|
|
382
397
|
i0.ɵɵelementEnd()();
|
|
383
|
-
i0.ɵɵelementStart(12, "div",
|
|
398
|
+
i0.ɵɵelementStart(12, "div", 68)(13, "label");
|
|
384
399
|
i0.ɵɵtext(14, "Display As");
|
|
385
400
|
i0.ɵɵelementEnd();
|
|
386
|
-
i0.ɵɵelementStart(15, "input",
|
|
387
|
-
i0.ɵɵlistener("input", function
|
|
401
|
+
i0.ɵɵelementStart(15, "input", 69);
|
|
402
|
+
i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_29_Template_input_input_15_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.updateUserDisplayName($event.target.value)); });
|
|
388
403
|
i0.ɵɵelementEnd()();
|
|
389
|
-
i0.ɵɵconditionalCreate(16,
|
|
404
|
+
i0.ɵɵconditionalCreate(16, ViewConfigPanelComponent_Conditional_29_Conditional_16_Template, 5, 1, "div", 70);
|
|
390
405
|
i0.ɵɵelementEnd();
|
|
391
|
-
i0.ɵɵelementStart(17, "div",
|
|
392
|
-
i0.ɵɵelement(19, "i",
|
|
406
|
+
i0.ɵɵelementStart(17, "div", 71)(18, "div", 72);
|
|
407
|
+
i0.ɵɵelement(19, "i", 32);
|
|
393
408
|
i0.ɵɵelementStart(20, "span");
|
|
394
409
|
i0.ɵɵtext(21, "Preview");
|
|
395
410
|
i0.ɵɵelementEnd()();
|
|
396
|
-
i0.ɵɵelementStart(22, "div",
|
|
411
|
+
i0.ɵɵelementStart(22, "div", 73)(23, "div", 74);
|
|
397
412
|
i0.ɵɵtext(24);
|
|
398
413
|
i0.ɵɵelementEnd();
|
|
399
|
-
i0.ɵɵrepeaterCreate(25,
|
|
414
|
+
i0.ɵɵrepeaterCreate(25, ViewConfigPanelComponent_Conditional_29_For_26_Template, 2, 13, "div", 75, i0.ɵɵrepeaterTrackByIndex);
|
|
400
415
|
i0.ɵɵelementEnd()();
|
|
401
|
-
i0.ɵɵelementStart(27, "div",
|
|
402
|
-
i0.ɵɵelement(29, "i",
|
|
416
|
+
i0.ɵɵelementStart(27, "div", 65)(28, "div", 66);
|
|
417
|
+
i0.ɵɵelement(29, "i", 76);
|
|
403
418
|
i0.ɵɵelementStart(30, "span");
|
|
404
419
|
i0.ɵɵtext(31, "Format Type");
|
|
405
420
|
i0.ɵɵelementEnd()();
|
|
406
|
-
i0.ɵɵelementStart(32, "select",
|
|
407
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
408
|
-
i0.ɵɵelementStart(33, "option",
|
|
421
|
+
i0.ɵɵelementStart(32, "select", 77);
|
|
422
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_29_Template_select_ngModelChange_32_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.formatEditingColumn.format.type, $event) || (ctx_r1.formatEditingColumn.format.type = $event); return i0.ɵɵresetView($event); });
|
|
423
|
+
i0.ɵɵelementStart(33, "option", 78);
|
|
409
424
|
i0.ɵɵtext(34, "Auto (Smart Default)");
|
|
410
425
|
i0.ɵɵelementEnd();
|
|
411
|
-
i0.ɵɵelementStart(35, "option",
|
|
426
|
+
i0.ɵɵelementStart(35, "option", 79);
|
|
412
427
|
i0.ɵɵtext(36, "Text");
|
|
413
428
|
i0.ɵɵelementEnd();
|
|
414
|
-
i0.ɵɵelementStart(37, "option",
|
|
429
|
+
i0.ɵɵelementStart(37, "option", 80);
|
|
415
430
|
i0.ɵɵtext(38, "Number");
|
|
416
431
|
i0.ɵɵelementEnd();
|
|
417
|
-
i0.ɵɵelementStart(39, "option",
|
|
432
|
+
i0.ɵɵelementStart(39, "option", 81);
|
|
418
433
|
i0.ɵɵtext(40, "Currency");
|
|
419
434
|
i0.ɵɵelementEnd();
|
|
420
|
-
i0.ɵɵelementStart(41, "option",
|
|
435
|
+
i0.ɵɵelementStart(41, "option", 82);
|
|
421
436
|
i0.ɵɵtext(42, "Percent");
|
|
422
437
|
i0.ɵɵelementEnd();
|
|
423
|
-
i0.ɵɵelementStart(43, "option",
|
|
438
|
+
i0.ɵɵelementStart(43, "option", 83);
|
|
424
439
|
i0.ɵɵtext(44, "Date");
|
|
425
440
|
i0.ɵɵelementEnd();
|
|
426
|
-
i0.ɵɵelementStart(45, "option",
|
|
441
|
+
i0.ɵɵelementStart(45, "option", 84);
|
|
427
442
|
i0.ɵɵtext(46, "Date & Time");
|
|
428
443
|
i0.ɵɵelementEnd();
|
|
429
|
-
i0.ɵɵelementStart(47, "option",
|
|
444
|
+
i0.ɵɵelementStart(47, "option", 85);
|
|
430
445
|
i0.ɵɵtext(48, "Boolean");
|
|
431
446
|
i0.ɵɵelementEnd()()();
|
|
432
|
-
i0.ɵɵconditionalCreate(49,
|
|
433
|
-
i0.ɵɵconditionalCreate(50,
|
|
434
|
-
i0.ɵɵconditionalCreate(51,
|
|
435
|
-
i0.ɵɵelementStart(52, "div",
|
|
436
|
-
i0.ɵɵelement(54, "i",
|
|
447
|
+
i0.ɵɵconditionalCreate(49, ViewConfigPanelComponent_Conditional_29_Conditional_49_Template, 14, 3, "div", 65);
|
|
448
|
+
i0.ɵɵconditionalCreate(50, ViewConfigPanelComponent_Conditional_29_Conditional_50_Template, 21, 1, "div", 65);
|
|
449
|
+
i0.ɵɵconditionalCreate(51, ViewConfigPanelComponent_Conditional_29_Conditional_51_Template, 23, 3, "div", 65);
|
|
450
|
+
i0.ɵɵelementStart(52, "div", 65)(53, "div", 66);
|
|
451
|
+
i0.ɵɵelement(54, "i", 86);
|
|
437
452
|
i0.ɵɵelementStart(55, "span");
|
|
438
453
|
i0.ɵɵtext(56, "Alignment");
|
|
439
454
|
i0.ɵɵelementEnd()();
|
|
440
|
-
i0.ɵɵelementStart(57, "div",
|
|
441
|
-
i0.ɵɵlistener("click", function
|
|
442
|
-
i0.ɵɵelement(59, "i",
|
|
455
|
+
i0.ɵɵelementStart(57, "div", 87)(58, "button", 88);
|
|
456
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_58_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.formatEditingColumn.format.align = "left"); });
|
|
457
|
+
i0.ɵɵelement(59, "i", 86);
|
|
443
458
|
i0.ɵɵelementEnd();
|
|
444
|
-
i0.ɵɵelementStart(60, "button",
|
|
445
|
-
i0.ɵɵlistener("click", function
|
|
446
|
-
i0.ɵɵelement(61, "i",
|
|
459
|
+
i0.ɵɵelementStart(60, "button", 89);
|
|
460
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_60_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.formatEditingColumn.format.align = "center"); });
|
|
461
|
+
i0.ɵɵelement(61, "i", 90);
|
|
447
462
|
i0.ɵɵelementEnd();
|
|
448
|
-
i0.ɵɵelementStart(62, "button",
|
|
449
|
-
i0.ɵɵlistener("click", function
|
|
450
|
-
i0.ɵɵelement(63, "i",
|
|
463
|
+
i0.ɵɵelementStart(62, "button", 91);
|
|
464
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_62_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.formatEditingColumn.format.align = "right"); });
|
|
465
|
+
i0.ɵɵelement(63, "i", 92);
|
|
451
466
|
i0.ɵɵelementEnd()()();
|
|
452
|
-
i0.ɵɵelementStart(64, "div",
|
|
453
|
-
i0.ɵɵelement(66, "i",
|
|
467
|
+
i0.ɵɵelementStart(64, "div", 65)(65, "div", 66);
|
|
468
|
+
i0.ɵɵelement(66, "i", 93);
|
|
454
469
|
i0.ɵɵelementStart(67, "span");
|
|
455
470
|
i0.ɵɵtext(68, "Header Style");
|
|
456
471
|
i0.ɵɵelementEnd()();
|
|
457
|
-
i0.ɵɵelementStart(69, "div",
|
|
458
|
-
i0.ɵɵlistener("click", function
|
|
459
|
-
i0.ɵɵelement(71, "i",
|
|
472
|
+
i0.ɵɵelementStart(69, "div", 94)(70, "button", 95);
|
|
473
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_70_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleHeaderStyle("bold")); });
|
|
474
|
+
i0.ɵɵelement(71, "i", 96);
|
|
460
475
|
i0.ɵɵelementEnd();
|
|
461
|
-
i0.ɵɵelementStart(72, "button",
|
|
462
|
-
i0.ɵɵlistener("click", function
|
|
463
|
-
i0.ɵɵelement(73, "i",
|
|
476
|
+
i0.ɵɵelementStart(72, "button", 97);
|
|
477
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_72_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleHeaderStyle("italic")); });
|
|
478
|
+
i0.ɵɵelement(73, "i", 98);
|
|
464
479
|
i0.ɵɵelementEnd();
|
|
465
|
-
i0.ɵɵelementStart(74, "button",
|
|
466
|
-
i0.ɵɵlistener("click", function
|
|
467
|
-
i0.ɵɵelement(75, "i",
|
|
480
|
+
i0.ɵɵelementStart(74, "button", 99);
|
|
481
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_74_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleHeaderStyle("underline")); });
|
|
482
|
+
i0.ɵɵelement(75, "i", 100);
|
|
468
483
|
i0.ɵɵelementEnd()();
|
|
469
|
-
i0.ɵɵelementStart(76, "div",
|
|
484
|
+
i0.ɵɵelementStart(76, "div", 68)(77, "label");
|
|
470
485
|
i0.ɵɵtext(78, "Text Color");
|
|
471
486
|
i0.ɵɵelementEnd();
|
|
472
|
-
i0.ɵɵelementStart(79, "input",
|
|
473
|
-
i0.ɵɵlistener("input", function
|
|
487
|
+
i0.ɵɵelementStart(79, "input", 101);
|
|
488
|
+
i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_29_Template_input_input_79_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.updateHeaderColor("color", $event.target.value)); });
|
|
474
489
|
i0.ɵɵelementEnd()();
|
|
475
|
-
i0.ɵɵelementStart(80, "div",
|
|
490
|
+
i0.ɵɵelementStart(80, "div", 68)(81, "label");
|
|
476
491
|
i0.ɵɵtext(82, "Background");
|
|
477
492
|
i0.ɵɵelementEnd();
|
|
478
|
-
i0.ɵɵelementStart(83, "input",
|
|
479
|
-
i0.ɵɵlistener("input", function
|
|
493
|
+
i0.ɵɵelementStart(83, "input", 101);
|
|
494
|
+
i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_29_Template_input_input_83_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.updateHeaderColor("backgroundColor", $event.target.value)); });
|
|
480
495
|
i0.ɵɵelementEnd()()();
|
|
481
|
-
i0.ɵɵelementStart(84, "div",
|
|
482
|
-
i0.ɵɵelement(86, "i",
|
|
496
|
+
i0.ɵɵelementStart(84, "div", 65)(85, "div", 66);
|
|
497
|
+
i0.ɵɵelement(86, "i", 102);
|
|
483
498
|
i0.ɵɵelementStart(87, "span");
|
|
484
499
|
i0.ɵɵtext(88, "Cell Style");
|
|
485
500
|
i0.ɵɵelementEnd()();
|
|
486
|
-
i0.ɵɵelementStart(89, "div",
|
|
487
|
-
i0.ɵɵlistener("click", function
|
|
488
|
-
i0.ɵɵelement(91, "i",
|
|
501
|
+
i0.ɵɵelementStart(89, "div", 94)(90, "button", 95);
|
|
502
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_90_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleCellStyle("bold")); });
|
|
503
|
+
i0.ɵɵelement(91, "i", 96);
|
|
489
504
|
i0.ɵɵelementEnd();
|
|
490
|
-
i0.ɵɵelementStart(92, "button",
|
|
491
|
-
i0.ɵɵlistener("click", function
|
|
492
|
-
i0.ɵɵelement(93, "i",
|
|
505
|
+
i0.ɵɵelementStart(92, "button", 97);
|
|
506
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_92_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleCellStyle("italic")); });
|
|
507
|
+
i0.ɵɵelement(93, "i", 98);
|
|
493
508
|
i0.ɵɵelementEnd();
|
|
494
|
-
i0.ɵɵelementStart(94, "button",
|
|
495
|
-
i0.ɵɵlistener("click", function
|
|
496
|
-
i0.ɵɵelement(95, "i",
|
|
509
|
+
i0.ɵɵelementStart(94, "button", 99);
|
|
510
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_94_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleCellStyle("underline")); });
|
|
511
|
+
i0.ɵɵelement(95, "i", 100);
|
|
497
512
|
i0.ɵɵelementEnd()();
|
|
498
|
-
i0.ɵɵelementStart(96, "div",
|
|
513
|
+
i0.ɵɵelementStart(96, "div", 68)(97, "label");
|
|
499
514
|
i0.ɵɵtext(98, "Text Color");
|
|
500
515
|
i0.ɵɵelementEnd();
|
|
501
|
-
i0.ɵɵelementStart(99, "input",
|
|
502
|
-
i0.ɵɵlistener("input", function
|
|
516
|
+
i0.ɵɵelementStart(99, "input", 101);
|
|
517
|
+
i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_29_Template_input_input_99_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.updateCellColor("color", $event.target.value)); });
|
|
503
518
|
i0.ɵɵelementEnd()();
|
|
504
|
-
i0.ɵɵelementStart(100, "div",
|
|
519
|
+
i0.ɵɵelementStart(100, "div", 68)(101, "label");
|
|
505
520
|
i0.ɵɵtext(102, "Background");
|
|
506
521
|
i0.ɵɵelementEnd();
|
|
507
|
-
i0.ɵɵelementStart(103, "input",
|
|
508
|
-
i0.ɵɵlistener("input", function
|
|
522
|
+
i0.ɵɵelementStart(103, "input", 101);
|
|
523
|
+
i0.ɵɵlistener("input", function ViewConfigPanelComponent_Conditional_29_Template_input_input_103_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.updateCellColor("backgroundColor", $event.target.value)); });
|
|
509
524
|
i0.ɵɵelementEnd()()();
|
|
510
|
-
i0.ɵɵelementStart(104, "div",
|
|
511
|
-
i0.ɵɵlistener("click", function
|
|
512
|
-
i0.ɵɵelement(106, "i",
|
|
525
|
+
i0.ɵɵelementStart(104, "div", 103)(105, "button", 104);
|
|
526
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_29_Template_button_click_105_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(); ctx_r1.clearColumnFormat(ctx_r1.formatEditingColumn); return i0.ɵɵresetView(ctx_r1.closeFormatEditor()); });
|
|
527
|
+
i0.ɵɵelement(106, "i", 105);
|
|
513
528
|
i0.ɵɵtext(107, " Clear Formatting ");
|
|
514
529
|
i0.ɵɵelementEnd()()();
|
|
515
530
|
} if (rf & 2) {
|
|
@@ -561,88 +576,88 @@ function ViewConfigPanelComponent_Conditional_31_Template(rf, ctx) { if (rf & 1)
|
|
|
561
576
|
i0.ɵɵadvance(4);
|
|
562
577
|
i0.ɵɵproperty("value", (ctx_r1.formatEditingColumn.format == null ? null : ctx_r1.formatEditingColumn.format.cellStyle == null ? null : ctx_r1.formatEditingColumn.format.cellStyle.backgroundColor) || "#ffffff");
|
|
563
578
|
} }
|
|
564
|
-
function
|
|
565
|
-
i0.ɵɵelement(0, "div",
|
|
579
|
+
function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
580
|
+
i0.ɵɵelement(0, "div", 137);
|
|
566
581
|
} }
|
|
567
|
-
function
|
|
568
|
-
i0.ɵɵelementStart(0, "option",
|
|
582
|
+
function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
583
|
+
i0.ɵɵelementStart(0, "option", 142);
|
|
569
584
|
i0.ɵɵtext(1);
|
|
570
585
|
i0.ɵɵelementEnd();
|
|
571
586
|
} if (rf & 2) {
|
|
572
|
-
const
|
|
573
|
-
i0.ɵɵproperty("value",
|
|
587
|
+
const field_r20 = ctx.$implicit;
|
|
588
|
+
i0.ɵɵproperty("value", field_r20.Name);
|
|
574
589
|
i0.ɵɵadvance();
|
|
575
|
-
i0.ɵɵtextInterpolate(
|
|
590
|
+
i0.ɵɵtextInterpolate(field_r20.DisplayNameOrName);
|
|
576
591
|
} }
|
|
577
|
-
function
|
|
578
|
-
i0.ɵɵelement(0, "div",
|
|
592
|
+
function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
593
|
+
i0.ɵɵelement(0, "div", 137);
|
|
579
594
|
} }
|
|
580
|
-
function
|
|
581
|
-
const
|
|
582
|
-
i0.ɵɵconditionalCreate(0,
|
|
583
|
-
i0.ɵɵelementStart(1, "div",
|
|
584
|
-
i0.ɵɵlistener("dragstart", function
|
|
585
|
-
i0.ɵɵelementStart(2, "div",
|
|
595
|
+
function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
596
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
597
|
+
i0.ɵɵconditionalCreate(0, ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Conditional_0_Template, 1, 0, "div", 137);
|
|
598
|
+
i0.ɵɵelementStart(1, "div", 138);
|
|
599
|
+
i0.ɵɵlistener("dragstart", function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template_div_dragstart_1_listener($event) { const sortItem_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onSortDragStart($event, sortItem_r19)); })("dragover", function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template_div_dragover_1_listener($event) { const sortItem_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onSortDragOver($event, sortItem_r19)); })("dragleave", function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template_div_dragleave_1_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onSortDragLeave($event)); })("drop", function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template_div_drop_1_listener($event) { const sortItem_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onSortDrop($event, sortItem_r19)); })("dragend", function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template_div_dragend_1_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onSortDragEnd($event)); });
|
|
600
|
+
i0.ɵɵelementStart(2, "div", 139);
|
|
586
601
|
i0.ɵɵtext(3);
|
|
587
602
|
i0.ɵɵelementEnd();
|
|
588
|
-
i0.ɵɵelementStart(4, "div",
|
|
589
|
-
i0.ɵɵelement(5, "i",
|
|
603
|
+
i0.ɵɵelementStart(4, "div", 140);
|
|
604
|
+
i0.ɵɵelement(5, "i", 43);
|
|
590
605
|
i0.ɵɵelementEnd();
|
|
591
|
-
i0.ɵɵelementStart(6, "select",
|
|
592
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
593
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
594
|
-
i0.ɵɵrepeaterCreate(7,
|
|
606
|
+
i0.ɵɵelementStart(6, "select", 141);
|
|
607
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template_select_ngModelChange_6_listener($event) { const sortItem_r19 = i0.ɵɵrestoreView(_r18).$implicit; i0.ɵɵtwoWayBindingSet(sortItem_r19.field, $event) || (sortItem_r19.field = $event); return i0.ɵɵresetView($event); });
|
|
608
|
+
i0.ɵɵlistener("ngModelChange", function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template_select_ngModelChange_6_listener($event) { const sortItem_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onSortFieldChange(sortItem_r19, $event)); });
|
|
609
|
+
i0.ɵɵrepeaterCreate(7, ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_For_8_Template, 2, 2, "option", 142, _forTrack1);
|
|
595
610
|
i0.ɵɵelementEnd();
|
|
596
|
-
i0.ɵɵelementStart(9, "div",
|
|
597
|
-
i0.ɵɵlistener("click", function
|
|
598
|
-
i0.ɵɵelement(11, "i",
|
|
611
|
+
i0.ɵɵelementStart(9, "div", 143)(10, "button", 144);
|
|
612
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template_button_click_10_listener() { const sortItem_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onSortDirectionChange(sortItem_r19, "asc")); });
|
|
613
|
+
i0.ɵɵelement(11, "i", 145);
|
|
599
614
|
i0.ɵɵelementEnd();
|
|
600
|
-
i0.ɵɵelementStart(12, "button",
|
|
601
|
-
i0.ɵɵlistener("click", function
|
|
602
|
-
i0.ɵɵelement(13, "i",
|
|
615
|
+
i0.ɵɵelementStart(12, "button", 146);
|
|
616
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template_button_click_12_listener() { const sortItem_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onSortDirectionChange(sortItem_r19, "desc")); });
|
|
617
|
+
i0.ɵɵelement(13, "i", 147);
|
|
603
618
|
i0.ɵɵelementEnd()();
|
|
604
|
-
i0.ɵɵelementStart(14, "button",
|
|
605
|
-
i0.ɵɵlistener("click", function
|
|
619
|
+
i0.ɵɵelementStart(14, "button", 148);
|
|
620
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template_button_click_14_listener() { const sortItem_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.removeSortLevel(sortItem_r19)); });
|
|
606
621
|
i0.ɵɵelement(15, "i", 8);
|
|
607
622
|
i0.ɵɵelementEnd()();
|
|
608
|
-
i0.ɵɵconditionalCreate(16,
|
|
623
|
+
i0.ɵɵconditionalCreate(16, ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Conditional_16_Template, 1, 0, "div", 137);
|
|
609
624
|
} if (rf & 2) {
|
|
610
|
-
const
|
|
611
|
-
const ɵ$
|
|
625
|
+
const sortItem_r19 = ctx.$implicit;
|
|
626
|
+
const ɵ$index_522_r21 = ctx.$index;
|
|
612
627
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
613
|
-
i0.ɵɵconditional(ctx_r1.isSortDropBefore(
|
|
628
|
+
i0.ɵɵconditional(ctx_r1.isSortDropBefore(sortItem_r19) ? 0 : -1);
|
|
614
629
|
i0.ɵɵadvance();
|
|
615
|
-
i0.ɵɵclassProp("dragging", ctx_r1.draggedSortItem ===
|
|
630
|
+
i0.ɵɵclassProp("dragging", ctx_r1.draggedSortItem === sortItem_r19)("drop-target", ctx_r1.dropTargetSortItem === sortItem_r19);
|
|
616
631
|
i0.ɵɵadvance(2);
|
|
617
|
-
i0.ɵɵtextInterpolate(ɵ$
|
|
632
|
+
i0.ɵɵtextInterpolate(ɵ$index_522_r21 + 1);
|
|
618
633
|
i0.ɵɵadvance(3);
|
|
619
|
-
i0.ɵɵtwoWayProperty("ngModel",
|
|
634
|
+
i0.ɵɵtwoWayProperty("ngModel", sortItem_r19.field);
|
|
620
635
|
i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
|
|
621
636
|
i0.ɵɵadvance();
|
|
622
637
|
i0.ɵɵrepeater(ctx_r1.sortableFields);
|
|
623
638
|
i0.ɵɵadvance(3);
|
|
624
|
-
i0.ɵɵclassProp("active",
|
|
639
|
+
i0.ɵɵclassProp("active", sortItem_r19.direction === "asc");
|
|
625
640
|
i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
|
|
626
641
|
i0.ɵɵadvance(2);
|
|
627
|
-
i0.ɵɵclassProp("active",
|
|
642
|
+
i0.ɵɵclassProp("active", sortItem_r19.direction === "desc");
|
|
628
643
|
i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
|
|
629
644
|
i0.ɵɵadvance(2);
|
|
630
645
|
i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
|
|
631
646
|
i0.ɵɵadvance(2);
|
|
632
|
-
i0.ɵɵconditional(ctx_r1.isSortDropAfter(
|
|
647
|
+
i0.ɵɵconditional(ctx_r1.isSortDropAfter(sortItem_r19) && ɵ$index_522_r21 === ctx_r1.sortItems.length - 1 ? 16 : -1);
|
|
633
648
|
} }
|
|
634
|
-
function
|
|
635
|
-
i0.ɵɵelementStart(0, "div",
|
|
636
|
-
i0.ɵɵelement(1, "i",
|
|
649
|
+
function ViewConfigPanelComponent_Conditional_30_Conditional_9_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
650
|
+
i0.ɵɵelementStart(0, "div", 136);
|
|
651
|
+
i0.ɵɵelement(1, "i", 55);
|
|
637
652
|
i0.ɵɵelementStart(2, "span");
|
|
638
653
|
i0.ɵɵtext(3, "Drag items to change priority. Records sort by first level, then second, etc.");
|
|
639
654
|
i0.ɵɵelementEnd()();
|
|
640
655
|
} }
|
|
641
|
-
function
|
|
642
|
-
i0.ɵɵelementStart(0, "div",
|
|
643
|
-
i0.ɵɵrepeaterCreate(1,
|
|
656
|
+
function ViewConfigPanelComponent_Conditional_30_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
657
|
+
i0.ɵɵelementStart(0, "div", 135);
|
|
658
|
+
i0.ɵɵrepeaterCreate(1, ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template, 17, 16, null, null, i0.ɵɵrepeaterTrackByIndex);
|
|
644
659
|
i0.ɵɵelementEnd();
|
|
645
|
-
i0.ɵɵconditionalCreate(3,
|
|
660
|
+
i0.ɵɵconditionalCreate(3, ViewConfigPanelComponent_Conditional_30_Conditional_9_Conditional_3_Template, 4, 0, "div", 136);
|
|
646
661
|
} if (rf & 2) {
|
|
647
662
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
648
663
|
i0.ɵɵadvance();
|
|
@@ -650,28 +665,28 @@ function ViewConfigPanelComponent_Conditional_32_Conditional_9_Template(rf, ctx)
|
|
|
650
665
|
i0.ɵɵadvance(2);
|
|
651
666
|
i0.ɵɵconditional(ctx_r1.sortItems.length > 1 ? 3 : -1);
|
|
652
667
|
} }
|
|
653
|
-
function
|
|
654
|
-
i0.ɵɵelementStart(0, "div",
|
|
668
|
+
function ViewConfigPanelComponent_Conditional_30_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
669
|
+
i0.ɵɵelementStart(0, "div", 134);
|
|
655
670
|
i0.ɵɵelement(1, "i", 12);
|
|
656
671
|
i0.ɵɵelementStart(2, "span");
|
|
657
672
|
i0.ɵɵtext(3, "No sorting configured");
|
|
658
673
|
i0.ɵɵelementEnd();
|
|
659
|
-
i0.ɵɵelementStart(4, "p",
|
|
674
|
+
i0.ɵɵelementStart(4, "p", 149);
|
|
660
675
|
i0.ɵɵtext(5, "Click \"Add Sort Level\" to define how records should be ordered");
|
|
661
676
|
i0.ɵɵelementEnd()();
|
|
662
677
|
} }
|
|
663
|
-
function
|
|
664
|
-
const
|
|
665
|
-
i0.ɵɵelementStart(0, "div", 18)(1, "div",
|
|
678
|
+
function ViewConfigPanelComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
679
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
680
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 130)(2, "div", 131)(3, "p", 132);
|
|
666
681
|
i0.ɵɵtext(4, " Define how records should be ordered. Add multiple levels to sort by secondary fields when values are equal. ");
|
|
667
682
|
i0.ɵɵelementEnd()();
|
|
668
|
-
i0.ɵɵelementStart(5, "button",
|
|
669
|
-
i0.ɵɵlistener("click", function
|
|
670
|
-
i0.ɵɵelement(6, "i",
|
|
683
|
+
i0.ɵɵelementStart(5, "button", 133);
|
|
684
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_30_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.addSortLevel()); });
|
|
685
|
+
i0.ɵɵelement(6, "i", 59);
|
|
671
686
|
i0.ɵɵelementStart(7, "span");
|
|
672
687
|
i0.ɵɵtext(8, "Add Sort Level");
|
|
673
688
|
i0.ɵɵelementEnd()();
|
|
674
|
-
i0.ɵɵconditionalCreate(9,
|
|
689
|
+
i0.ɵɵconditionalCreate(9, ViewConfigPanelComponent_Conditional_30_Conditional_9_Template, 4, 1)(10, ViewConfigPanelComponent_Conditional_30_Conditional_10_Template, 6, 0, "div", 134);
|
|
675
690
|
i0.ɵɵelementEnd()();
|
|
676
691
|
} if (rf & 2) {
|
|
677
692
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -680,15 +695,15 @@ function ViewConfigPanelComponent_Conditional_32_Template(rf, ctx) { if (rf & 1)
|
|
|
680
695
|
i0.ɵɵadvance(4);
|
|
681
696
|
i0.ɵɵconditional(ctx_r1.sortItems.length > 0 ? 9 : 10);
|
|
682
697
|
} }
|
|
683
|
-
function
|
|
684
|
-
i0.ɵɵelement(0, "i",
|
|
698
|
+
function ViewConfigPanelComponent_Conditional_31_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
699
|
+
i0.ɵɵelement(0, "i", 157);
|
|
685
700
|
} }
|
|
686
|
-
function
|
|
687
|
-
i0.ɵɵelement(0, "i",
|
|
701
|
+
function ViewConfigPanelComponent_Conditional_31_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
702
|
+
i0.ɵɵelement(0, "i", 157);
|
|
688
703
|
} }
|
|
689
|
-
function
|
|
690
|
-
i0.ɵɵelementStart(0, "div",
|
|
691
|
-
i0.ɵɵelement(1, "i",
|
|
704
|
+
function ViewConfigPanelComponent_Conditional_31_Conditional_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
705
|
+
i0.ɵɵelementStart(0, "div", 163);
|
|
706
|
+
i0.ɵɵelement(1, "i", 174);
|
|
692
707
|
i0.ɵɵelementStart(2, "span");
|
|
693
708
|
i0.ɵɵtext(3);
|
|
694
709
|
i0.ɵɵelementEnd()();
|
|
@@ -697,42 +712,42 @@ function ViewConfigPanelComponent_Conditional_33_Conditional_20_Conditional_5_Te
|
|
|
697
712
|
i0.ɵɵadvance(3);
|
|
698
713
|
i0.ɵɵtextInterpolate(ctx_r1.smartFilterExplanation);
|
|
699
714
|
} }
|
|
700
|
-
function
|
|
701
|
-
const
|
|
702
|
-
i0.ɵɵelementStart(0, "div",
|
|
703
|
-
i0.ɵɵelement(3, "i",
|
|
715
|
+
function ViewConfigPanelComponent_Conditional_31_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
716
|
+
const _r23 = i0.ɵɵgetCurrentView();
|
|
717
|
+
i0.ɵɵelementStart(0, "div", 158)(1, "div", 160)(2, "div", 161);
|
|
718
|
+
i0.ɵɵelement(3, "i", 153);
|
|
704
719
|
i0.ɵɵelementEnd();
|
|
705
|
-
i0.ɵɵelementStart(4, "textarea",
|
|
706
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
720
|
+
i0.ɵɵelementStart(4, "textarea", 162);
|
|
721
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_31_Conditional_20_Template_textarea_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.smartFilterPrompt, $event) || (ctx_r1.smartFilterPrompt = $event); return i0.ɵɵresetView($event); });
|
|
707
722
|
i0.ɵɵelementEnd()();
|
|
708
|
-
i0.ɵɵconditionalCreate(5,
|
|
709
|
-
i0.ɵɵelementStart(6, "div",
|
|
710
|
-
i0.ɵɵelement(8, "i",
|
|
723
|
+
i0.ɵɵconditionalCreate(5, ViewConfigPanelComponent_Conditional_31_Conditional_20_Conditional_5_Template, 4, 1, "div", 163);
|
|
724
|
+
i0.ɵɵelementStart(6, "div", 164)(7, "div", 165);
|
|
725
|
+
i0.ɵɵelement(8, "i", 166);
|
|
711
726
|
i0.ɵɵelementStart(9, "span");
|
|
712
727
|
i0.ɵɵtext(10, "Try these examples:");
|
|
713
728
|
i0.ɵɵelementEnd()();
|
|
714
|
-
i0.ɵɵelementStart(11, "div",
|
|
715
|
-
i0.ɵɵlistener("click", function
|
|
716
|
-
i0.ɵɵelement(13, "i",
|
|
729
|
+
i0.ɵɵelementStart(11, "div", 167)(12, "button", 168);
|
|
730
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_31_Conditional_20_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Show records created in the last 30 days")); });
|
|
731
|
+
i0.ɵɵelement(13, "i", 169);
|
|
717
732
|
i0.ɵɵtext(14, " Last 30 days ");
|
|
718
733
|
i0.ɵɵelementEnd();
|
|
719
|
-
i0.ɵɵelementStart(15, "button",
|
|
720
|
-
i0.ɵɵlistener("click", function
|
|
721
|
-
i0.ɵɵelement(16, "i",
|
|
734
|
+
i0.ɵɵelementStart(15, "button", 168);
|
|
735
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_31_Conditional_20_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Active records only")); });
|
|
736
|
+
i0.ɵɵelement(16, "i", 170);
|
|
722
737
|
i0.ɵɵtext(17, " Active only ");
|
|
723
738
|
i0.ɵɵelementEnd();
|
|
724
|
-
i0.ɵɵelementStart(18, "button",
|
|
725
|
-
i0.ɵɵlistener("click", function
|
|
726
|
-
i0.ɵɵelement(19, "i",
|
|
739
|
+
i0.ɵɵelementStart(18, "button", 168);
|
|
740
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_31_Conditional_20_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Records with high priority")); });
|
|
741
|
+
i0.ɵɵelement(19, "i", 171);
|
|
727
742
|
i0.ɵɵtext(20, " High priority ");
|
|
728
743
|
i0.ɵɵelementEnd();
|
|
729
|
-
i0.ɵɵelementStart(21, "button",
|
|
730
|
-
i0.ɵɵlistener("click", function
|
|
731
|
-
i0.ɵɵelement(22, "i",
|
|
744
|
+
i0.ɵɵelementStart(21, "button", 168);
|
|
745
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_31_Conditional_20_Template_button_click_21_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.applySmartFilterExample("Records modified this week")); });
|
|
746
|
+
i0.ɵɵelement(22, "i", 172);
|
|
732
747
|
i0.ɵɵtext(23, " Modified this week ");
|
|
733
748
|
i0.ɵɵelementEnd()()();
|
|
734
|
-
i0.ɵɵelementStart(24, "div",
|
|
735
|
-
i0.ɵɵelement(25, "i",
|
|
749
|
+
i0.ɵɵelementStart(24, "div", 173);
|
|
750
|
+
i0.ɵɵelement(25, "i", 55);
|
|
736
751
|
i0.ɵɵelementStart(26, "span");
|
|
737
752
|
i0.ɵɵtext(27, "The AI will interpret your description and create the appropriate filter when you save the view.");
|
|
738
753
|
i0.ɵɵelementEnd()()();
|
|
@@ -752,11 +767,11 @@ function ViewConfigPanelComponent_Conditional_33_Conditional_20_Template(rf, ctx
|
|
|
752
767
|
i0.ɵɵadvance(3);
|
|
753
768
|
i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
|
|
754
769
|
} }
|
|
755
|
-
function
|
|
756
|
-
i0.ɵɵelementStart(0, "span",
|
|
770
|
+
function ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
771
|
+
i0.ɵɵelementStart(0, "span", 184);
|
|
757
772
|
i0.ɵɵtext(1);
|
|
758
773
|
i0.ɵɵelementEnd();
|
|
759
|
-
i0.ɵɵelementStart(2, "span",
|
|
774
|
+
i0.ɵɵelementStart(2, "span", 185);
|
|
760
775
|
i0.ɵɵtext(3);
|
|
761
776
|
i0.ɵɵelementEnd();
|
|
762
777
|
} if (rf & 2) {
|
|
@@ -766,33 +781,33 @@ function ViewConfigPanelComponent_Conditional_33_Conditional_21_Conditional_4_Te
|
|
|
766
781
|
i0.ɵɵadvance(2);
|
|
767
782
|
i0.ɵɵtextInterpolate(ctx_r1.getFilterSummary());
|
|
768
783
|
} }
|
|
769
|
-
function
|
|
770
|
-
i0.ɵɵelementStart(0, "span",
|
|
784
|
+
function ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
785
|
+
i0.ɵɵelementStart(0, "span", 178);
|
|
771
786
|
i0.ɵɵtext(1, "No filters configured");
|
|
772
787
|
i0.ɵɵelementEnd();
|
|
773
788
|
} }
|
|
774
|
-
function
|
|
775
|
-
const
|
|
776
|
-
i0.ɵɵelementStart(0, "button",
|
|
777
|
-
i0.ɵɵlistener("click", function
|
|
789
|
+
function ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
790
|
+
const _r25 = i0.ɵɵgetCurrentView();
|
|
791
|
+
i0.ɵɵelementStart(0, "button", 186);
|
|
792
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.clearFilters()); });
|
|
778
793
|
i0.ɵɵelement(1, "i", 8);
|
|
779
794
|
i0.ɵɵtext(2, " Clear ");
|
|
780
795
|
i0.ɵɵelementEnd();
|
|
781
796
|
} }
|
|
782
|
-
function
|
|
783
|
-
const
|
|
784
|
-
i0.ɵɵelementStart(0, "div",
|
|
785
|
-
i0.ɵɵconditionalCreate(4,
|
|
786
|
-
i0.ɵɵelementEnd();
|
|
787
|
-
i0.ɵɵelementStart(6, "div",
|
|
788
|
-
i0.ɵɵconditionalCreate(7,
|
|
789
|
-
i0.ɵɵelementStart(8, "button",
|
|
790
|
-
i0.ɵɵlistener("click", function
|
|
791
|
-
i0.ɵɵelement(9, "i",
|
|
797
|
+
function ViewConfigPanelComponent_Conditional_31_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
798
|
+
const _r24 = i0.ɵɵgetCurrentView();
|
|
799
|
+
i0.ɵɵelementStart(0, "div", 159)(1, "div", 175)(2, "div", 176)(3, "div", 177);
|
|
800
|
+
i0.ɵɵconditionalCreate(4, ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_4_Template, 4, 2)(5, ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_5_Template, 2, 0, "span", 178);
|
|
801
|
+
i0.ɵɵelementEnd();
|
|
802
|
+
i0.ɵɵelementStart(6, "div", 179);
|
|
803
|
+
i0.ɵɵconditionalCreate(7, ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_7_Template, 3, 0, "button", 180);
|
|
804
|
+
i0.ɵɵelementStart(8, "button", 181);
|
|
805
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_31_Conditional_21_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openFilterDialog()); });
|
|
806
|
+
i0.ɵɵelement(9, "i", 182);
|
|
792
807
|
i0.ɵɵtext(10);
|
|
793
808
|
i0.ɵɵelementEnd()()()();
|
|
794
|
-
i0.ɵɵelementStart(11, "div",
|
|
795
|
-
i0.ɵɵelement(12, "i",
|
|
809
|
+
i0.ɵɵelementStart(11, "div", 183);
|
|
810
|
+
i0.ɵɵelement(12, "i", 55);
|
|
796
811
|
i0.ɵɵelementStart(13, "span");
|
|
797
812
|
i0.ɵɵtext(14, "Build precise filters by selecting fields, operators, and values. Use groups for complex AND/OR logic.");
|
|
798
813
|
i0.ɵɵelementEnd()()();
|
|
@@ -807,36 +822,36 @@ function ViewConfigPanelComponent_Conditional_33_Conditional_21_Template(rf, ctx
|
|
|
807
822
|
i0.ɵɵadvance(2);
|
|
808
823
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.getFilterCount() > 0 ? "Edit Filters" : "Add Filters", " ");
|
|
809
824
|
} }
|
|
810
|
-
function
|
|
811
|
-
const
|
|
812
|
-
i0.ɵɵelementStart(0, "div", 18)(1, "div",
|
|
813
|
-
i0.ɵɵlistener("click", function
|
|
814
|
-
i0.ɵɵelementStart(3, "div",
|
|
815
|
-
i0.ɵɵelement(4, "i",
|
|
825
|
+
function ViewConfigPanelComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
|
|
826
|
+
const _r22 = i0.ɵɵgetCurrentView();
|
|
827
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 150)(2, "button", 151);
|
|
828
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_31_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setFilterMode("smart")); });
|
|
829
|
+
i0.ɵɵelementStart(3, "div", 152);
|
|
830
|
+
i0.ɵɵelement(4, "i", 153);
|
|
816
831
|
i0.ɵɵelementEnd();
|
|
817
|
-
i0.ɵɵelementStart(5, "div",
|
|
832
|
+
i0.ɵɵelementStart(5, "div", 154)(6, "span", 155);
|
|
818
833
|
i0.ɵɵtext(7, "Smart Filter");
|
|
819
834
|
i0.ɵɵelementEnd();
|
|
820
|
-
i0.ɵɵelementStart(8, "span",
|
|
835
|
+
i0.ɵɵelementStart(8, "span", 156);
|
|
821
836
|
i0.ɵɵtext(9, "Use AI to filter with natural language");
|
|
822
837
|
i0.ɵɵelementEnd()();
|
|
823
|
-
i0.ɵɵconditionalCreate(10,
|
|
838
|
+
i0.ɵɵconditionalCreate(10, ViewConfigPanelComponent_Conditional_31_Conditional_10_Template, 1, 0, "i", 157);
|
|
824
839
|
i0.ɵɵelementEnd();
|
|
825
|
-
i0.ɵɵelementStart(11, "button",
|
|
826
|
-
i0.ɵɵlistener("click", function
|
|
827
|
-
i0.ɵɵelementStart(12, "div",
|
|
828
|
-
i0.ɵɵelement(13, "i",
|
|
840
|
+
i0.ɵɵelementStart(11, "button", 151);
|
|
841
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_31_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setFilterMode("traditional")); });
|
|
842
|
+
i0.ɵɵelementStart(12, "div", 152);
|
|
843
|
+
i0.ɵɵelement(13, "i", 109);
|
|
829
844
|
i0.ɵɵelementEnd();
|
|
830
|
-
i0.ɵɵelementStart(14, "div",
|
|
845
|
+
i0.ɵɵelementStart(14, "div", 154)(15, "span", 155);
|
|
831
846
|
i0.ɵɵtext(16, "Traditional Filter");
|
|
832
847
|
i0.ɵɵelementEnd();
|
|
833
|
-
i0.ɵɵelementStart(17, "span",
|
|
848
|
+
i0.ɵɵelementStart(17, "span", 156);
|
|
834
849
|
i0.ɵɵtext(18, "Build filters with field/operator/value");
|
|
835
850
|
i0.ɵɵelementEnd()();
|
|
836
|
-
i0.ɵɵconditionalCreate(19,
|
|
851
|
+
i0.ɵɵconditionalCreate(19, ViewConfigPanelComponent_Conditional_31_Conditional_19_Template, 1, 0, "i", 157);
|
|
837
852
|
i0.ɵɵelementEnd()();
|
|
838
|
-
i0.ɵɵconditionalCreate(20,
|
|
839
|
-
i0.ɵɵconditionalCreate(21,
|
|
853
|
+
i0.ɵɵconditionalCreate(20, ViewConfigPanelComponent_Conditional_31_Conditional_20_Template, 28, 7, "div", 158);
|
|
854
|
+
i0.ɵɵconditionalCreate(21, ViewConfigPanelComponent_Conditional_31_Conditional_21_Template, 15, 4, "div", 159);
|
|
840
855
|
i0.ɵɵelementEnd();
|
|
841
856
|
} if (rf & 2) {
|
|
842
857
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -855,85 +870,85 @@ function ViewConfigPanelComponent_Conditional_33_Template(rf, ctx) { if (rf & 1)
|
|
|
855
870
|
i0.ɵɵadvance();
|
|
856
871
|
i0.ɵɵconditional(ctx_r1.filterMode === "traditional" ? 21 : -1);
|
|
857
872
|
} }
|
|
858
|
-
function
|
|
859
|
-
i0.ɵɵelementStart(0, "span",
|
|
860
|
-
i0.ɵɵelement(1, "i",
|
|
873
|
+
function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
874
|
+
i0.ɵɵelementStart(0, "span", 205);
|
|
875
|
+
i0.ɵɵelement(1, "i", 153);
|
|
861
876
|
i0.ɵɵelementEnd();
|
|
862
877
|
} }
|
|
863
|
-
function
|
|
864
|
-
const
|
|
865
|
-
i0.ɵɵelementStart(0, "div",
|
|
878
|
+
function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
879
|
+
const _r27 = i0.ɵɵgetCurrentView();
|
|
880
|
+
i0.ɵɵelementStart(0, "div", 199)(1, "div", 200);
|
|
866
881
|
i0.ɵɵelement(2, "i");
|
|
867
882
|
i0.ɵɵelementEnd();
|
|
868
|
-
i0.ɵɵelementStart(3, "div",
|
|
883
|
+
i0.ɵɵelementStart(3, "div", 201)(4, "div", 202);
|
|
869
884
|
i0.ɵɵtext(5);
|
|
870
885
|
i0.ɵɵelementEnd();
|
|
871
|
-
i0.ɵɵelementStart(6, "div",
|
|
886
|
+
i0.ɵɵelementStart(6, "div", 203)(7, "span", 204);
|
|
872
887
|
i0.ɵɵelement(8, "i");
|
|
873
888
|
i0.ɵɵtext(9);
|
|
874
889
|
i0.ɵɵelementEnd();
|
|
875
|
-
i0.ɵɵconditionalCreate(10,
|
|
890
|
+
i0.ɵɵconditionalCreate(10, ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Conditional_10_Template, 2, 0, "span", 205);
|
|
876
891
|
i0.ɵɵelementEnd()();
|
|
877
|
-
i0.ɵɵelementStart(11, "div",
|
|
878
|
-
i0.ɵɵlistener("click", function
|
|
879
|
-
i0.ɵɵelement(13, "i",
|
|
892
|
+
i0.ɵɵelementStart(11, "div", 206)(12, "button", 207);
|
|
893
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template_button_click_12_listener() { const agg_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.moveAggregateUp(agg_r28)); });
|
|
894
|
+
i0.ɵɵelement(13, "i", 51);
|
|
880
895
|
i0.ɵɵelementEnd();
|
|
881
|
-
i0.ɵɵelementStart(14, "button",
|
|
882
|
-
i0.ɵɵlistener("click", function
|
|
883
|
-
i0.ɵɵelement(15, "i",
|
|
896
|
+
i0.ɵɵelementStart(14, "button", 208);
|
|
897
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template_button_click_14_listener() { const agg_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.moveAggregateDown(agg_r28)); });
|
|
898
|
+
i0.ɵɵelement(15, "i", 53);
|
|
884
899
|
i0.ɵɵelementEnd();
|
|
885
|
-
i0.ɵɵelementStart(16, "button",
|
|
886
|
-
i0.ɵɵlistener("click", function
|
|
900
|
+
i0.ɵɵelementStart(16, "button", 209);
|
|
901
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template_button_click_16_listener($event) { const agg_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleAggregateEnabled(agg_r28, $event)); });
|
|
887
902
|
i0.ɵɵelement(17, "i");
|
|
888
903
|
i0.ɵɵelementEnd();
|
|
889
|
-
i0.ɵɵelementStart(18, "button",
|
|
890
|
-
i0.ɵɵlistener("click", function
|
|
891
|
-
i0.ɵɵelement(19, "i",
|
|
904
|
+
i0.ɵɵelementStart(18, "button", 210);
|
|
905
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template_button_click_18_listener() { const agg_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.editAggregate(agg_r28)); });
|
|
906
|
+
i0.ɵɵelement(19, "i", 182);
|
|
892
907
|
i0.ɵɵelementEnd();
|
|
893
|
-
i0.ɵɵelementStart(20, "button",
|
|
894
|
-
i0.ɵɵlistener("click", function
|
|
895
|
-
i0.ɵɵelement(21, "i",
|
|
908
|
+
i0.ɵɵelementStart(20, "button", 211);
|
|
909
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template_button_click_20_listener() { const agg_r28 = i0.ɵɵrestoreView(_r27).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.removeAggregate(agg_r28)); });
|
|
910
|
+
i0.ɵɵelement(21, "i", 212);
|
|
896
911
|
i0.ɵɵelementEnd()()();
|
|
897
912
|
} if (rf & 2) {
|
|
898
|
-
const
|
|
899
|
-
const ɵ$
|
|
913
|
+
const agg_r28 = ctx.$implicit;
|
|
914
|
+
const ɵ$index_733_r29 = ctx.$index;
|
|
900
915
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
901
|
-
i0.ɵɵclassProp("disabled",
|
|
916
|
+
i0.ɵɵclassProp("disabled", agg_r28.enabled === false);
|
|
902
917
|
i0.ɵɵadvance(2);
|
|
903
|
-
i0.ɵɵclassMap(
|
|
918
|
+
i0.ɵɵclassMap(agg_r28.icon || "fa-solid fa-chart-simple");
|
|
904
919
|
i0.ɵɵadvance(3);
|
|
905
|
-
i0.ɵɵtextInterpolate(
|
|
920
|
+
i0.ɵɵtextInterpolate(agg_r28.label);
|
|
906
921
|
i0.ɵɵadvance(3);
|
|
907
|
-
i0.ɵɵclassMap(
|
|
922
|
+
i0.ɵɵclassMap(agg_r28.displayType === "card" ? "fa-solid fa-id-card" : "fa-solid fa-table-columns");
|
|
908
923
|
i0.ɵɵadvance();
|
|
909
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
924
|
+
i0.ɵɵtextInterpolate1(" ", agg_r28.displayType === "card" ? "Card" : "Column Footer", " ");
|
|
910
925
|
i0.ɵɵadvance();
|
|
911
|
-
i0.ɵɵconditional(
|
|
926
|
+
i0.ɵɵconditional(agg_r28.smartPrompt ? 10 : -1);
|
|
912
927
|
i0.ɵɵadvance(2);
|
|
913
|
-
i0.ɵɵproperty("disabled", ɵ$
|
|
928
|
+
i0.ɵɵproperty("disabled", ɵ$index_733_r29 === 0 || !ctx_r1.canEdit);
|
|
914
929
|
i0.ɵɵadvance(2);
|
|
915
|
-
i0.ɵɵproperty("disabled", ɵ$
|
|
930
|
+
i0.ɵɵproperty("disabled", ɵ$index_733_r29 === ctx_r1.aggregates.length - 1 || !ctx_r1.canEdit);
|
|
916
931
|
i0.ɵɵadvance(2);
|
|
917
|
-
i0.ɵɵclassProp("enabled",
|
|
918
|
-
i0.ɵɵproperty("disabled", !ctx_r1.canEdit)("title",
|
|
932
|
+
i0.ɵɵclassProp("enabled", agg_r28.enabled !== false);
|
|
933
|
+
i0.ɵɵproperty("disabled", !ctx_r1.canEdit)("title", agg_r28.enabled !== false ? "Disable" : "Enable");
|
|
919
934
|
i0.ɵɵadvance();
|
|
920
|
-
i0.ɵɵclassMap(
|
|
935
|
+
i0.ɵɵclassMap(agg_r28.enabled !== false ? "fa-solid fa-eye" : "fa-solid fa-eye-slash");
|
|
921
936
|
i0.ɵɵadvance();
|
|
922
937
|
i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
|
|
923
938
|
i0.ɵɵadvance(2);
|
|
924
939
|
i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
|
|
925
940
|
} }
|
|
926
|
-
function
|
|
927
|
-
i0.ɵɵelementStart(0, "div",
|
|
928
|
-
i0.ɵɵrepeaterCreate(1,
|
|
941
|
+
function ViewConfigPanelComponent_Conditional_32_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
942
|
+
i0.ɵɵelementStart(0, "div", 193);
|
|
943
|
+
i0.ɵɵrepeaterCreate(1, ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template, 22, 19, "div", 194, _forTrack2);
|
|
929
944
|
i0.ɵɵelementEnd();
|
|
930
|
-
i0.ɵɵelementStart(3, "div",
|
|
931
|
-
i0.ɵɵelement(5, "i",
|
|
945
|
+
i0.ɵɵelementStart(3, "div", 195)(4, "div", 196);
|
|
946
|
+
i0.ɵɵelement(5, "i", 197);
|
|
932
947
|
i0.ɵɵelementStart(6, "span");
|
|
933
948
|
i0.ɵɵtext(7);
|
|
934
949
|
i0.ɵɵelementEnd()();
|
|
935
|
-
i0.ɵɵelementStart(8, "div",
|
|
936
|
-
i0.ɵɵelement(9, "i",
|
|
950
|
+
i0.ɵɵelementStart(8, "div", 196);
|
|
951
|
+
i0.ɵɵelement(9, "i", 198);
|
|
937
952
|
i0.ɵɵelementStart(10, "span");
|
|
938
953
|
i0.ɵɵtext(11);
|
|
939
954
|
i0.ɵɵelementEnd()()();
|
|
@@ -946,30 +961,30 @@ function ViewConfigPanelComponent_Conditional_34_Conditional_9_Template(rf, ctx)
|
|
|
946
961
|
i0.ɵɵadvance(4);
|
|
947
962
|
i0.ɵɵtextInterpolate2("", ctx_r1.columnAggregates.length, " column footer", ctx_r1.columnAggregates.length !== 1 ? "s" : "");
|
|
948
963
|
} }
|
|
949
|
-
function
|
|
950
|
-
i0.ɵɵelementStart(0, "div",
|
|
964
|
+
function ViewConfigPanelComponent_Conditional_32_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
965
|
+
i0.ɵɵelementStart(0, "div", 191);
|
|
951
966
|
i0.ɵɵelement(1, "i", 15);
|
|
952
967
|
i0.ɵɵelementStart(2, "span");
|
|
953
968
|
i0.ɵɵtext(3, "No aggregates configured");
|
|
954
969
|
i0.ɵɵelementEnd();
|
|
955
|
-
i0.ɵɵelementStart(4, "p",
|
|
970
|
+
i0.ɵɵelementStart(4, "p", 213);
|
|
956
971
|
i0.ɵɵtext(5, "Click \"Add Aggregate\" to create summary calculations");
|
|
957
972
|
i0.ɵɵelementEnd()();
|
|
958
973
|
} }
|
|
959
|
-
function
|
|
960
|
-
const
|
|
961
|
-
i0.ɵɵelementStart(0, "div", 18)(1, "div",
|
|
974
|
+
function ViewConfigPanelComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
975
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
976
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 187)(2, "div", 188)(3, "p", 189);
|
|
962
977
|
i0.ɵɵtext(4, " Add summary calculations like totals, averages, and counts. Display them in cards or as column footers. ");
|
|
963
978
|
i0.ɵɵelementEnd()();
|
|
964
|
-
i0.ɵɵelementStart(5, "button",
|
|
965
|
-
i0.ɵɵlistener("click", function
|
|
966
|
-
i0.ɵɵelement(6, "i",
|
|
979
|
+
i0.ɵɵelementStart(5, "button", 190);
|
|
980
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_32_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openAddAggregateDialog()); });
|
|
981
|
+
i0.ɵɵelement(6, "i", 59);
|
|
967
982
|
i0.ɵɵelementStart(7, "span");
|
|
968
983
|
i0.ɵɵtext(8, "Add Aggregate");
|
|
969
984
|
i0.ɵɵelementEnd()();
|
|
970
|
-
i0.ɵɵconditionalCreate(9,
|
|
971
|
-
i0.ɵɵelementStart(11, "div",
|
|
972
|
-
i0.ɵɵelement(12, "i",
|
|
985
|
+
i0.ɵɵconditionalCreate(9, ViewConfigPanelComponent_Conditional_32_Conditional_9_Template, 12, 4)(10, ViewConfigPanelComponent_Conditional_32_Conditional_10_Template, 6, 0, "div", 191);
|
|
986
|
+
i0.ɵɵelementStart(11, "div", 192);
|
|
987
|
+
i0.ɵɵelement(12, "i", 55);
|
|
973
988
|
i0.ɵɵelementStart(13, "span");
|
|
974
989
|
i0.ɵɵtext(14, "Aggregates are calculated server-side for accuracy with filtered/paginated data.");
|
|
975
990
|
i0.ɵɵelementEnd()()()();
|
|
@@ -980,60 +995,70 @@ function ViewConfigPanelComponent_Conditional_34_Template(rf, ctx) { if (rf & 1)
|
|
|
980
995
|
i0.ɵɵadvance(4);
|
|
981
996
|
i0.ɵɵconditional(ctx_r1.aggregates.length > 0 ? 9 : 10);
|
|
982
997
|
} }
|
|
983
|
-
function
|
|
984
|
-
|
|
985
|
-
i0.ɵɵ
|
|
986
|
-
i0.ɵɵ
|
|
998
|
+
function ViewConfigPanelComponent_Conditional_33_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
999
|
+
i0.ɵɵelementStart(0, "span", 217);
|
|
1000
|
+
i0.ɵɵtext(1, "View name is required");
|
|
1001
|
+
i0.ɵɵelementEnd();
|
|
1002
|
+
} }
|
|
1003
|
+
function ViewConfigPanelComponent_Conditional_33_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
1004
|
+
const _r31 = i0.ɵɵgetCurrentView();
|
|
1005
|
+
i0.ɵɵelementStart(0, "div", 224)(1, "div", 31);
|
|
1006
|
+
i0.ɵɵelement(2, "i", 225);
|
|
987
1007
|
i0.ɵɵelementStart(3, "span");
|
|
988
1008
|
i0.ɵɵtext(4, "Danger Zone");
|
|
989
1009
|
i0.ɵɵelementEnd()();
|
|
990
|
-
i0.ɵɵelementStart(5, "button",
|
|
991
|
-
i0.ɵɵlistener("click", function
|
|
992
|
-
i0.ɵɵelement(6, "i",
|
|
1010
|
+
i0.ɵɵelementStart(5, "button", 226);
|
|
1011
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_33_Conditional_27_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onDelete()); });
|
|
1012
|
+
i0.ɵɵelement(6, "i", 212);
|
|
993
1013
|
i0.ɵɵelementStart(7, "span");
|
|
994
1014
|
i0.ɵɵtext(8, "Delete View");
|
|
995
1015
|
i0.ɵɵelementEnd()()();
|
|
996
1016
|
} }
|
|
997
|
-
function
|
|
998
|
-
const
|
|
999
|
-
i0.ɵɵelementStart(0, "div", 18)(1, "div",
|
|
1000
|
-
i0.ɵɵelement(3, "i",
|
|
1017
|
+
function ViewConfigPanelComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
1018
|
+
const _r30 = i0.ɵɵgetCurrentView();
|
|
1019
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 30)(2, "div", 31);
|
|
1020
|
+
i0.ɵɵelement(3, "i", 55);
|
|
1001
1021
|
i0.ɵɵelementStart(4, "span");
|
|
1002
1022
|
i0.ɵɵtext(5, "View Details");
|
|
1003
1023
|
i0.ɵɵelementEnd()();
|
|
1004
|
-
i0.ɵɵelementStart(6, "div",
|
|
1024
|
+
i0.ɵɵelementStart(6, "div", 214)(7, "label", 215);
|
|
1005
1025
|
i0.ɵɵtext(8, "Name");
|
|
1006
1026
|
i0.ɵɵelementEnd();
|
|
1007
|
-
i0.ɵɵelementStart(9, "input",
|
|
1008
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
1009
|
-
i0.ɵɵelementEnd()();
|
|
1010
|
-
i0.ɵɵelementStart(10, "div", 211)(11, "label", 214);
|
|
1011
|
-
i0.ɵɵtext(12, "Description");
|
|
1027
|
+
i0.ɵɵelementStart(9, "input", 216);
|
|
1028
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_33_Template_input_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.viewName, $event) || (ctx_r1.viewName = $event); return i0.ɵɵresetView($event); });
|
|
1012
1029
|
i0.ɵɵelementEnd();
|
|
1013
|
-
i0.ɵɵ
|
|
1014
|
-
i0.ɵɵ
|
|
1030
|
+
i0.ɵɵconditionalCreate(10, ViewConfigPanelComponent_Conditional_33_Conditional_10_Template, 2, 0, "span", 217);
|
|
1031
|
+
i0.ɵɵelementEnd();
|
|
1032
|
+
i0.ɵɵelementStart(11, "div", 214)(12, "label", 218);
|
|
1033
|
+
i0.ɵɵtext(13, "Description");
|
|
1034
|
+
i0.ɵɵelementEnd();
|
|
1035
|
+
i0.ɵɵelementStart(14, "textarea", 219);
|
|
1036
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_33_Template_textarea_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.viewDescription, $event) || (ctx_r1.viewDescription = $event); return i0.ɵɵresetView($event); });
|
|
1015
1037
|
i0.ɵɵelementEnd()()();
|
|
1016
|
-
i0.ɵɵelementStart(
|
|
1017
|
-
i0.ɵɵelement(
|
|
1018
|
-
i0.ɵɵelementStart(
|
|
1019
|
-
i0.ɵɵtext(
|
|
1038
|
+
i0.ɵɵelementStart(15, "div", 30)(16, "div", 31);
|
|
1039
|
+
i0.ɵɵelement(17, "i", 220);
|
|
1040
|
+
i0.ɵɵelementStart(18, "span");
|
|
1041
|
+
i0.ɵɵtext(19, "Sharing");
|
|
1020
1042
|
i0.ɵɵelementEnd()();
|
|
1021
|
-
i0.ɵɵelementStart(
|
|
1022
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
1043
|
+
i0.ɵɵelementStart(20, "label", 221)(21, "input", 222);
|
|
1044
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ViewConfigPanelComponent_Conditional_33_Template_input_ngModelChange_21_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.isShared, $event) || (ctx_r1.isShared = $event); return i0.ɵɵresetView($event); });
|
|
1023
1045
|
i0.ɵɵelementEnd();
|
|
1024
|
-
i0.ɵɵelementStart(
|
|
1025
|
-
i0.ɵɵtext(
|
|
1046
|
+
i0.ɵɵelementStart(22, "span", 223)(23, "strong");
|
|
1047
|
+
i0.ɵɵtext(24, "Share with others");
|
|
1026
1048
|
i0.ɵɵelementEnd();
|
|
1027
|
-
i0.ɵɵelementStart(
|
|
1028
|
-
i0.ɵɵtext(
|
|
1049
|
+
i0.ɵɵelementStart(25, "small");
|
|
1050
|
+
i0.ɵɵtext(26, "Allow other users to use this view");
|
|
1029
1051
|
i0.ɵɵelementEnd()()()();
|
|
1030
|
-
i0.ɵɵconditionalCreate(
|
|
1052
|
+
i0.ɵɵconditionalCreate(27, ViewConfigPanelComponent_Conditional_33_Conditional_27_Template, 9, 0, "div", 224);
|
|
1031
1053
|
i0.ɵɵelementEnd();
|
|
1032
1054
|
} if (rf & 2) {
|
|
1033
1055
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
1034
1056
|
i0.ɵɵadvance(9);
|
|
1057
|
+
i0.ɵɵclassProp("invalid", !ctx_r1.viewName || !ctx_r1.viewName.trim());
|
|
1035
1058
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.viewName);
|
|
1036
1059
|
i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
|
|
1060
|
+
i0.ɵɵadvance();
|
|
1061
|
+
i0.ɵɵconditional(!ctx_r1.viewName || !ctx_r1.viewName.trim() ? 10 : -1);
|
|
1037
1062
|
i0.ɵɵadvance(4);
|
|
1038
1063
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.viewDescription);
|
|
1039
1064
|
i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
|
|
@@ -1041,85 +1066,56 @@ function ViewConfigPanelComponent_Conditional_35_Template(rf, ctx) { if (rf & 1)
|
|
|
1041
1066
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.isShared);
|
|
1042
1067
|
i0.ɵɵproperty("disabled", !ctx_r1.canEdit);
|
|
1043
1068
|
i0.ɵɵadvance(6);
|
|
1044
|
-
i0.ɵɵconditional(ctx_r1.viewEntity && ctx_r1.canDelete ?
|
|
1045
|
-
} }
|
|
1046
|
-
function ViewConfigPanelComponent_Conditional_38_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1047
|
-
i0.ɵɵelement(0, "i", 224);
|
|
1069
|
+
i0.ɵɵconditional(ctx_r1.viewEntity && ctx_r1.canDelete ? 27 : -1);
|
|
1048
1070
|
} }
|
|
1049
|
-
function
|
|
1050
|
-
i0.ɵɵ
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
i0.ɵɵ
|
|
1055
|
-
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSave()); });
|
|
1056
|
-
i0.ɵɵconditionalCreate(1, ViewConfigPanelComponent_Conditional_38_Conditional_1_Template, 1, 0, "i", 224)(2, ViewConfigPanelComponent_Conditional_38_Conditional_2_Template, 1, 0, "i", 225);
|
|
1057
|
-
i0.ɵɵtext(3);
|
|
1058
|
-
i0.ɵɵelementEnd();
|
|
1059
|
-
} if (rf & 2) {
|
|
1060
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
1061
|
-
i0.ɵɵproperty("disabled", ctx_r1.isSaving || !ctx_r1.viewName);
|
|
1062
|
-
i0.ɵɵadvance();
|
|
1063
|
-
i0.ɵɵconditional(ctx_r1.isSaving ? 1 : 2);
|
|
1064
|
-
i0.ɵɵadvance(2);
|
|
1065
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Saving..." : "Save", " ");
|
|
1066
|
-
} }
|
|
1067
|
-
function ViewConfigPanelComponent_Conditional_39_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1068
|
-
i0.ɵɵelement(0, "i", 224);
|
|
1069
|
-
} }
|
|
1070
|
-
function ViewConfigPanelComponent_Conditional_39_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1071
|
-
i0.ɵɵelement(0, "i", 225);
|
|
1071
|
+
function ViewConfigPanelComponent_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
1072
|
+
i0.ɵɵelementStart(0, "div", 20);
|
|
1073
|
+
i0.ɵɵelement(1, "i", 225);
|
|
1074
|
+
i0.ɵɵelementStart(2, "span");
|
|
1075
|
+
i0.ɵɵtext(3, "At least one column must be visible");
|
|
1076
|
+
i0.ɵɵelementEnd()();
|
|
1072
1077
|
} }
|
|
1073
|
-
function
|
|
1074
|
-
i0.ɵɵelement(0, "i",
|
|
1078
|
+
function ViewConfigPanelComponent_Conditional_37_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1079
|
+
i0.ɵɵelement(0, "i", 228);
|
|
1075
1080
|
} }
|
|
1076
|
-
function
|
|
1077
|
-
i0.ɵɵelement(0, "i",
|
|
1081
|
+
function ViewConfigPanelComponent_Conditional_37_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1082
|
+
i0.ɵɵelement(0, "i", 229);
|
|
1078
1083
|
} }
|
|
1079
|
-
function
|
|
1084
|
+
function ViewConfigPanelComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
1080
1085
|
const _r32 = i0.ɵɵgetCurrentView();
|
|
1081
|
-
i0.ɵɵelementStart(0, "button",
|
|
1082
|
-
i0.ɵɵlistener("click", function
|
|
1083
|
-
i0.ɵɵconditionalCreate(1,
|
|
1086
|
+
i0.ɵɵelementStart(0, "button", 227);
|
|
1087
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_37_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSave()); });
|
|
1088
|
+
i0.ɵɵconditionalCreate(1, ViewConfigPanelComponent_Conditional_37_Conditional_1_Template, 1, 0, "i", 228)(2, ViewConfigPanelComponent_Conditional_37_Conditional_2_Template, 1, 0, "i", 229);
|
|
1084
1089
|
i0.ɵɵtext(3);
|
|
1085
1090
|
i0.ɵɵelementEnd();
|
|
1086
|
-
i0.ɵɵelementStart(4, "button", 226);
|
|
1087
|
-
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_39_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r32); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveAsNew()); });
|
|
1088
|
-
i0.ɵɵconditionalCreate(5, ViewConfigPanelComponent_Conditional_39_Conditional_5_Template, 1, 0, "i", 224)(6, ViewConfigPanelComponent_Conditional_39_Conditional_6_Template, 1, 0, "i", 56);
|
|
1089
|
-
i0.ɵɵtext(7);
|
|
1090
|
-
i0.ɵɵelementEnd();
|
|
1091
1091
|
} if (rf & 2) {
|
|
1092
1092
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
1093
|
-
i0.ɵɵproperty("disabled", ctx_r1.isSaving);
|
|
1093
|
+
i0.ɵɵproperty("disabled", ctx_r1.isSaving || !ctx_r1.IsValid);
|
|
1094
1094
|
i0.ɵɵadvance();
|
|
1095
1095
|
i0.ɵɵconditional(ctx_r1.isSaving ? 1 : 2);
|
|
1096
1096
|
i0.ɵɵadvance(2);
|
|
1097
1097
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Saving..." : "Save", " ");
|
|
1098
|
-
i0.ɵɵadvance();
|
|
1099
|
-
i0.ɵɵproperty("disabled", ctx_r1.isSaving || !ctx_r1.viewName);
|
|
1100
|
-
i0.ɵɵadvance();
|
|
1101
|
-
i0.ɵɵconditional(ctx_r1.isSaving ? 5 : 6);
|
|
1102
|
-
i0.ɵɵadvance(2);
|
|
1103
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Creating..." : "Save As New", " ");
|
|
1104
1098
|
} }
|
|
1105
|
-
function
|
|
1106
|
-
i0.ɵɵelement(0, "i",
|
|
1099
|
+
function ViewConfigPanelComponent_Conditional_38_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1100
|
+
i0.ɵɵelement(0, "i", 228);
|
|
1107
1101
|
} }
|
|
1108
|
-
function
|
|
1109
|
-
i0.ɵɵelement(0, "i",
|
|
1102
|
+
function ViewConfigPanelComponent_Conditional_38_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1103
|
+
i0.ɵɵelement(0, "i", 229);
|
|
1110
1104
|
} }
|
|
1111
|
-
function
|
|
1105
|
+
function ViewConfigPanelComponent_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
1112
1106
|
const _r33 = i0.ɵɵgetCurrentView();
|
|
1113
|
-
i0.ɵɵelementStart(0, "button",
|
|
1114
|
-
i0.ɵɵlistener("click", function
|
|
1115
|
-
i0.ɵɵconditionalCreate(1,
|
|
1116
|
-
i0.ɵɵtext(3
|
|
1107
|
+
i0.ɵɵelementStart(0, "button", 227);
|
|
1108
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r33); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveDefaults()); });
|
|
1109
|
+
i0.ɵɵconditionalCreate(1, ViewConfigPanelComponent_Conditional_38_Conditional_1_Template, 1, 0, "i", 228)(2, ViewConfigPanelComponent_Conditional_38_Conditional_2_Template, 1, 0, "i", 229);
|
|
1110
|
+
i0.ɵɵtext(3);
|
|
1117
1111
|
i0.ɵɵelementEnd();
|
|
1118
1112
|
} if (rf & 2) {
|
|
1119
1113
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
1120
1114
|
i0.ɵɵproperty("disabled", ctx_r1.isSaving);
|
|
1121
1115
|
i0.ɵɵadvance();
|
|
1122
1116
|
i0.ɵɵconditional(ctx_r1.isSaving ? 1 : 2);
|
|
1117
|
+
i0.ɵɵadvance(2);
|
|
1118
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.isSaving ? "Saving..." : "Save", " ");
|
|
1123
1119
|
} }
|
|
1124
1120
|
/**
|
|
1125
1121
|
* ViewConfigPanelComponent - Sliding panel for configuring view settings
|
|
@@ -1180,6 +1176,14 @@ export class ViewConfigPanelComponent {
|
|
|
1180
1176
|
* Filter state from external dialog (set by parent after dialog closes)
|
|
1181
1177
|
*/
|
|
1182
1178
|
externalFilterState = null;
|
|
1179
|
+
/**
|
|
1180
|
+
* When true, auto-focus on Settings tab when panel opens (BUG-011: forward saveAsNew intent)
|
|
1181
|
+
*/
|
|
1182
|
+
DefaultSaveAsNew = false;
|
|
1183
|
+
/**
|
|
1184
|
+
* Emitted when user wants to duplicate the current view (F-005)
|
|
1185
|
+
*/
|
|
1186
|
+
duplicate = new EventEmitter();
|
|
1183
1187
|
// Form state
|
|
1184
1188
|
viewName = '';
|
|
1185
1189
|
viewDescription = '';
|
|
@@ -1213,6 +1217,14 @@ export class ViewConfigPanelComponent {
|
|
|
1213
1217
|
aggregates = [];
|
|
1214
1218
|
showAggregateDialog = false;
|
|
1215
1219
|
editingAggregate = null;
|
|
1220
|
+
// Saved filter state for mode switching (BUG-006: preserve both modes' data)
|
|
1221
|
+
savedSmartFilterPrompt = '';
|
|
1222
|
+
savedTraditionalFilter = createEmptyFilter();
|
|
1223
|
+
// Filter mode switch confirmation (BUG-006)
|
|
1224
|
+
showFilterModeSwitchConfirm = false;
|
|
1225
|
+
pendingFilterModeSwitch = null;
|
|
1226
|
+
// Local saving guard (BUG-003: race condition on double-click)
|
|
1227
|
+
_localSaving = false;
|
|
1216
1228
|
// UI state
|
|
1217
1229
|
activeTab = 'columns';
|
|
1218
1230
|
isSaving = false;
|
|
@@ -1335,15 +1347,24 @@ export class ViewConfigPanelComponent {
|
|
|
1335
1347
|
ngOnChanges(changes) {
|
|
1336
1348
|
// Reset to first tab and clear search when panel opens
|
|
1337
1349
|
if (changes['isOpen'] && this.isOpen) {
|
|
1338
|
-
|
|
1350
|
+
// BUG-011: If DefaultSaveAsNew is set, open on Settings tab with name focused
|
|
1351
|
+
this.activeTab = this.DefaultSaveAsNew ? 'settings' : 'columns';
|
|
1339
1352
|
this.columnSearchText = '';
|
|
1340
1353
|
this.formatEditingColumn = null;
|
|
1354
|
+
this._localSaving = false;
|
|
1341
1355
|
// Also close any open aggregate dialog
|
|
1342
1356
|
this.showAggregateDialog = false;
|
|
1343
1357
|
this.editingAggregate = null;
|
|
1358
|
+
// Close filter mode switch confirm
|
|
1359
|
+
this.showFilterModeSwitchConfirm = false;
|
|
1360
|
+
this.pendingFilterModeSwitch = null;
|
|
1344
1361
|
// Re-initialize from entity to get fresh state
|
|
1345
1362
|
this.initializeFromEntity();
|
|
1346
1363
|
}
|
|
1364
|
+
// BUG-003: Reset local saving guard when isSaving transitions from true to false
|
|
1365
|
+
if (changes['isSaving'] && !this.isSaving && changes['isSaving'].previousValue === true) {
|
|
1366
|
+
this._localSaving = false;
|
|
1367
|
+
}
|
|
1347
1368
|
if (changes['entity'] || changes['viewEntity'] || changes['currentGridState']) {
|
|
1348
1369
|
this.initializeFromEntity();
|
|
1349
1370
|
}
|
|
@@ -2221,13 +2242,58 @@ export class ViewConfigPanelComponent {
|
|
|
2221
2242
|
hasActiveFilters() {
|
|
2222
2243
|
return this.filterState?.filters?.length > 0;
|
|
2223
2244
|
}
|
|
2245
|
+
// ========================================
|
|
2246
|
+
// VALIDATION (BUG-004)
|
|
2247
|
+
// ========================================
|
|
2248
|
+
/**
|
|
2249
|
+
* Get validation errors for the current form state
|
|
2250
|
+
*/
|
|
2251
|
+
get ValidationErrors() {
|
|
2252
|
+
const errors = [];
|
|
2253
|
+
if (!this.viewName || !this.viewName.trim()) {
|
|
2254
|
+
errors.push('View name is required');
|
|
2255
|
+
}
|
|
2256
|
+
if (this.visibleColumns.length === 0) {
|
|
2257
|
+
errors.push('At least one column must be visible');
|
|
2258
|
+
}
|
|
2259
|
+
return errors;
|
|
2260
|
+
}
|
|
2261
|
+
/**
|
|
2262
|
+
* Whether the form is valid for saving
|
|
2263
|
+
*/
|
|
2264
|
+
get IsValid() {
|
|
2265
|
+
return this.ValidationErrors.length === 0;
|
|
2266
|
+
}
|
|
2267
|
+
/**
|
|
2268
|
+
* Whether the form is valid for save-as-new (name can default to 'New View')
|
|
2269
|
+
*/
|
|
2270
|
+
get IsValidForSaveAsNew() {
|
|
2271
|
+
return this.visibleColumns.length > 0;
|
|
2272
|
+
}
|
|
2273
|
+
/**
|
|
2274
|
+
* Build a ViewConfigSummary for quick-save preview (F-003)
|
|
2275
|
+
*/
|
|
2276
|
+
BuildSummary() {
|
|
2277
|
+
return {
|
|
2278
|
+
ColumnCount: this.visibleColumns.length,
|
|
2279
|
+
FilterCount: this.filterMode === 'traditional' ? this.getFilterCount() : 0,
|
|
2280
|
+
SortCount: this.sortItems.length,
|
|
2281
|
+
SmartFilterActive: this.smartFilterEnabled && !!this.smartFilterPrompt.trim(),
|
|
2282
|
+
SmartFilterPrompt: this.smartFilterPrompt,
|
|
2283
|
+
AggregateCount: this.aggregates.filter(a => a.enabled !== false).length
|
|
2284
|
+
};
|
|
2285
|
+
}
|
|
2224
2286
|
/**
|
|
2225
2287
|
* Save the view
|
|
2226
2288
|
*/
|
|
2227
2289
|
onSave() {
|
|
2228
|
-
// Guard against double-clicks
|
|
2229
|
-
if (this.isSaving)
|
|
2290
|
+
// BUG-003: Guard against double-clicks with local flag
|
|
2291
|
+
if (this.isSaving || this._localSaving)
|
|
2292
|
+
return;
|
|
2293
|
+
// BUG-004: Validate before saving
|
|
2294
|
+
if (!this.IsValid)
|
|
2230
2295
|
return;
|
|
2296
|
+
this._localSaving = true;
|
|
2231
2297
|
this.save.emit({
|
|
2232
2298
|
name: this.viewName,
|
|
2233
2299
|
description: this.viewDescription,
|
|
@@ -2247,9 +2313,13 @@ export class ViewConfigPanelComponent {
|
|
|
2247
2313
|
* Save as a new view
|
|
2248
2314
|
*/
|
|
2249
2315
|
onSaveAsNew() {
|
|
2250
|
-
// Guard against double-clicks
|
|
2251
|
-
if (this.isSaving)
|
|
2316
|
+
// BUG-003: Guard against double-clicks with local flag
|
|
2317
|
+
if (this.isSaving || this._localSaving)
|
|
2318
|
+
return;
|
|
2319
|
+
// BUG-004: Validate (name defaults to 'New View' if empty)
|
|
2320
|
+
if (!this.IsValidForSaveAsNew)
|
|
2252
2321
|
return;
|
|
2322
|
+
this._localSaving = true;
|
|
2253
2323
|
this.save.emit({
|
|
2254
2324
|
name: this.viewName || 'New View',
|
|
2255
2325
|
description: this.viewDescription,
|
|
@@ -2270,9 +2340,10 @@ export class ViewConfigPanelComponent {
|
|
|
2270
2340
|
* Used for dynamic/default views that don't have a stored view entity
|
|
2271
2341
|
*/
|
|
2272
2342
|
onSaveDefaults() {
|
|
2273
|
-
// Guard against double-clicks
|
|
2274
|
-
if (this.isSaving)
|
|
2343
|
+
// BUG-003: Guard against double-clicks with local flag
|
|
2344
|
+
if (this.isSaving || this._localSaving)
|
|
2275
2345
|
return;
|
|
2346
|
+
this._localSaving = true;
|
|
2276
2347
|
this.saveDefaults.emit({
|
|
2277
2348
|
name: 'Default',
|
|
2278
2349
|
description: '',
|
|
@@ -2288,13 +2359,34 @@ export class ViewConfigPanelComponent {
|
|
|
2288
2359
|
aggregatesConfig: this.buildAggregatesConfig()
|
|
2289
2360
|
});
|
|
2290
2361
|
}
|
|
2362
|
+
// Delete confirmation state
|
|
2363
|
+
showDeleteConfirm = false;
|
|
2291
2364
|
/**
|
|
2292
|
-
* Delete the view
|
|
2365
|
+
* Delete the view - shows confirmation dialog
|
|
2293
2366
|
*/
|
|
2294
2367
|
onDelete() {
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2368
|
+
this.showDeleteConfirm = true;
|
|
2369
|
+
this.cdr.detectChanges();
|
|
2370
|
+
}
|
|
2371
|
+
/**
|
|
2372
|
+
* Confirmed delete from dialog
|
|
2373
|
+
*/
|
|
2374
|
+
OnDeleteConfirmed() {
|
|
2375
|
+
this.showDeleteConfirm = false;
|
|
2376
|
+
this.delete.emit();
|
|
2377
|
+
}
|
|
2378
|
+
/**
|
|
2379
|
+
* Cancelled delete from dialog
|
|
2380
|
+
*/
|
|
2381
|
+
OnDeleteCancelled() {
|
|
2382
|
+
this.showDeleteConfirm = false;
|
|
2383
|
+
this.cdr.detectChanges();
|
|
2384
|
+
}
|
|
2385
|
+
/**
|
|
2386
|
+
* Duplicate the current view (F-005)
|
|
2387
|
+
*/
|
|
2388
|
+
OnDuplicate() {
|
|
2389
|
+
this.duplicate.emit();
|
|
2298
2390
|
}
|
|
2299
2391
|
/**
|
|
2300
2392
|
* Set the active tab
|
|
@@ -2306,22 +2398,73 @@ export class ViewConfigPanelComponent {
|
|
|
2306
2398
|
}
|
|
2307
2399
|
/**
|
|
2308
2400
|
* Set the filter mode (smart or traditional)
|
|
2309
|
-
*
|
|
2401
|
+
* BUG-006: Shows confirmation when switching if active mode has data
|
|
2310
2402
|
*/
|
|
2311
2403
|
setFilterMode(mode) {
|
|
2312
2404
|
if (this.filterMode === mode)
|
|
2313
2405
|
return;
|
|
2406
|
+
// Check if current mode has data that would be lost
|
|
2407
|
+
const currentModeHasData = this.currentFilterModeHasData();
|
|
2408
|
+
if (currentModeHasData) {
|
|
2409
|
+
// Show confirmation dialog before switching
|
|
2410
|
+
this.pendingFilterModeSwitch = mode;
|
|
2411
|
+
this.showFilterModeSwitchConfirm = true;
|
|
2412
|
+
this.cdr.detectChanges();
|
|
2413
|
+
return;
|
|
2414
|
+
}
|
|
2415
|
+
this.applyFilterModeSwitch(mode);
|
|
2416
|
+
}
|
|
2417
|
+
/**
|
|
2418
|
+
* Check if the current filter mode has user-entered data
|
|
2419
|
+
*/
|
|
2420
|
+
currentFilterModeHasData() {
|
|
2421
|
+
if (this.filterMode === 'smart') {
|
|
2422
|
+
return !!this.smartFilterPrompt.trim();
|
|
2423
|
+
}
|
|
2424
|
+
else {
|
|
2425
|
+
return this.getFilterCount() > 0;
|
|
2426
|
+
}
|
|
2427
|
+
}
|
|
2428
|
+
/**
|
|
2429
|
+
* Confirm the filter mode switch (called from ConfirmDialog)
|
|
2430
|
+
*/
|
|
2431
|
+
OnFilterModeSwitchConfirmed() {
|
|
2432
|
+
if (this.pendingFilterModeSwitch) {
|
|
2433
|
+
this.applyFilterModeSwitch(this.pendingFilterModeSwitch);
|
|
2434
|
+
}
|
|
2435
|
+
this.showFilterModeSwitchConfirm = false;
|
|
2436
|
+
this.pendingFilterModeSwitch = null;
|
|
2437
|
+
}
|
|
2438
|
+
/**
|
|
2439
|
+
* Cancel the filter mode switch (called from ConfirmDialog)
|
|
2440
|
+
*/
|
|
2441
|
+
OnFilterModeSwitchCancelled() {
|
|
2442
|
+
this.showFilterModeSwitchConfirm = false;
|
|
2443
|
+
this.pendingFilterModeSwitch = null;
|
|
2444
|
+
}
|
|
2445
|
+
/**
|
|
2446
|
+
* Apply the filter mode switch - saves current mode data and restores target mode data
|
|
2447
|
+
*/
|
|
2448
|
+
applyFilterModeSwitch(mode) {
|
|
2449
|
+
// Save current mode's data before switching
|
|
2450
|
+
if (this.filterMode === 'smart') {
|
|
2451
|
+
this.savedSmartFilterPrompt = this.smartFilterPrompt;
|
|
2452
|
+
}
|
|
2453
|
+
else {
|
|
2454
|
+
this.savedTraditionalFilter = this.filterState;
|
|
2455
|
+
}
|
|
2314
2456
|
this.filterMode = mode;
|
|
2315
|
-
//
|
|
2457
|
+
// Restore target mode's saved data or clear
|
|
2316
2458
|
if (mode === 'smart') {
|
|
2317
2459
|
this.smartFilterEnabled = true;
|
|
2460
|
+
this.smartFilterPrompt = this.savedSmartFilterPrompt;
|
|
2318
2461
|
this.filterState = createEmptyFilter();
|
|
2319
2462
|
}
|
|
2320
|
-
// When switching to traditional mode, disable smart filter and clear its prompt
|
|
2321
2463
|
else {
|
|
2322
2464
|
this.smartFilterEnabled = false;
|
|
2323
2465
|
this.smartFilterPrompt = '';
|
|
2324
2466
|
this.smartFilterExplanation = '';
|
|
2467
|
+
this.filterState = this.savedTraditionalFilter;
|
|
2325
2468
|
}
|
|
2326
2469
|
this.cdr.detectChanges();
|
|
2327
2470
|
}
|
|
@@ -2457,7 +2600,7 @@ export class ViewConfigPanelComponent {
|
|
|
2457
2600
|
}
|
|
2458
2601
|
}
|
|
2459
2602
|
/**
|
|
2460
|
-
* Toggle aggregate enabled state
|
|
2603
|
+
* Toggle aggregate enabled state (BUG-012: immutable update, no excessive logging)
|
|
2461
2604
|
*/
|
|
2462
2605
|
toggleAggregateEnabled(aggregate, event) {
|
|
2463
2606
|
// Stop event propagation to prevent any parent handlers
|
|
@@ -2465,44 +2608,28 @@ export class ViewConfigPanelComponent {
|
|
|
2465
2608
|
event.preventDefault();
|
|
2466
2609
|
event.stopPropagation();
|
|
2467
2610
|
}
|
|
2468
|
-
|
|
2469
|
-
aggregateId: aggregate.id,
|
|
2470
|
-
aggregateLabel: aggregate.label,
|
|
2471
|
-
currentEnabled: aggregate.enabled,
|
|
2472
|
-
allAggregates: this.aggregates.map(a => ({ id: a.id, label: a.label, enabled: a.enabled }))
|
|
2473
|
-
});
|
|
2474
|
-
// Try to find by ID first, fall back to object reference if ID is missing
|
|
2611
|
+
// Find by ID first, fall back to object reference or label
|
|
2475
2612
|
let index = -1;
|
|
2476
2613
|
if (aggregate.id) {
|
|
2477
2614
|
index = this.aggregates.findIndex(a => a.id === aggregate.id);
|
|
2478
2615
|
}
|
|
2479
|
-
// Fallback: find by object reference or label
|
|
2480
2616
|
if (index < 0) {
|
|
2481
2617
|
index = this.aggregates.indexOf(aggregate);
|
|
2482
2618
|
}
|
|
2483
2619
|
if (index < 0 && aggregate.label) {
|
|
2484
2620
|
index = this.aggregates.findIndex(a => a.label === aggregate.label && a.expression === aggregate.expression);
|
|
2485
2621
|
}
|
|
2486
|
-
console.log('[ViewConfigPanel] Found index:', index, 'in array of length:', this.aggregates.length);
|
|
2487
2622
|
if (index >= 0) {
|
|
2488
|
-
// Create a new object with toggled enabled state to ensure change detection
|
|
2489
|
-
const currentEnabled = this.aggregates[index].enabled;
|
|
2490
|
-
const newEnabledState = currentEnabled === false ? true : false;
|
|
2491
|
-
console.log('[ViewConfigPanel] Toggling from', currentEnabled, 'to', newEnabledState);
|
|
2492
2623
|
const updatedAggregate = {
|
|
2493
2624
|
...this.aggregates[index],
|
|
2494
|
-
enabled:
|
|
2625
|
+
enabled: this.aggregates[index].enabled === false
|
|
2495
2626
|
};
|
|
2496
2627
|
// Replace entire array to trigger change detection
|
|
2497
2628
|
const newAggregates = [...this.aggregates];
|
|
2498
2629
|
newAggregates[index] = updatedAggregate;
|
|
2499
2630
|
this.aggregates = newAggregates;
|
|
2500
|
-
console.log('[ViewConfigPanel] After toggle, aggregates:', this.aggregates.map(a => ({ id: a.id, label: a.label, enabled: a.enabled })));
|
|
2501
2631
|
this.cdr.detectChanges();
|
|
2502
2632
|
}
|
|
2503
|
-
else {
|
|
2504
|
-
console.error('[ViewConfigPanel] Could not find aggregate in array:', aggregate);
|
|
2505
|
-
}
|
|
2506
2633
|
}
|
|
2507
2634
|
/**
|
|
2508
2635
|
* Move aggregate up in order
|
|
@@ -2562,7 +2689,7 @@ export class ViewConfigPanelComponent {
|
|
|
2562
2689
|
static ɵfac = function ViewConfigPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ViewConfigPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
2563
2690
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ViewConfigPanelComponent, selectors: [["mj-view-config-panel"]], hostBindings: function ViewConfigPanelComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
2564
2691
|
i0.ɵɵlistener("keydown.escape", function ViewConfigPanelComponent_keydown_escape_HostBindingHandler() { return ctx.handleEscape(); }, i0.ɵɵresolveDocument);
|
|
2565
|
-
} }, 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" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 44, vars:
|
|
2692
|
+
} }, inputs: { entity: "entity", viewEntity: "viewEntity", isOpen: "isOpen", currentGridState: "currentGridState", sampleData: "sampleData", externalFilterState: "externalFilterState", DefaultSaveAsNew: "DefaultSaveAsNew", isSaving: "isSaving" }, outputs: { close: "close", save: "save", saveDefaults: "saveDefaults", delete: "delete", openFilterDialogRequest: "openFilterDialogRequest", duplicate: "duplicate" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 44, vars: 45, 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", "title"], [1, "fa-solid", "fa-columns"], [1, "fa-solid", "fa-arrow-up-wide-short"], [1, "tab-badge"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-chart-simple"], [1, "tab-btn", 3, "active", "title"], [1, "panel-content"], [1, "tab-content"], [1, "format-editor"], [1, "validation-banner"], [1, "panel-footer"], [1, "footer-left"], [1, "footer-btn", "save-btn", "primary", 3, "disabled"], [1, "footer-btn", "cancel-btn", 3, "click"], [3, "Close", "Save", "Entity", "Aggregate", "IsOpen"], ["Title", "Delete View", "DetailMessage", "This action cannot be undone. All users who have access to this view will lose it.", "ConfirmText", "Delete", "ConfirmStyle", "danger", "Icon", "fa-solid fa-trash", 3, "Confirmed", "Cancelled", "IsOpen", "Message"], ["Title", "Switch Filter Mode", "DetailMessage", "You can switch back later, but the current filter data will be lost.", "ConfirmText", "Switch", "ConfirmStyle", "primary", "Icon", "fa-solid fa-exchange-alt", 3, "Confirmed", "Cancelled", "IsOpen", "Message"], [1, "panel-backdrop", 3, "click"], [1, "fa-solid", "fa-cog"], [1, "config-section"], [1, "section-header"], [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"], [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, "config-section", "sorting-section"], [1, "sorting-header"], [1, "sorting-description"], ["title", "Add another sort level", 1, "add-sort-btn", 3, "click", "disabled"], [1, "sort-empty-state"], [1, "sort-items-list"], [1, "sort-hint"], [1, "sort-drop-indicator"], ["draggable", "true", 1, "sort-item", 3, "dragstart", "dragover", "dragleave", "drop", "dragend"], [1, "sort-priority-badge"], ["title", "Drag to reorder", 1, "sort-drag-handle"], [1, "sort-field-dropdown", 3, "ngModelChange", "ngModel", "disabled"], [3, "value"], [1, "sort-direction-toggle"], ["title", "Ascending (A-Z, 1-9)", 1, "direction-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-arrow-up"], ["title", "Descending (Z-A, 9-1)", 1, "direction-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-arrow-down"], ["title", "Remove sort level", 1, "sort-remove-btn", 3, "click", "disabled"], [1, "sort-empty-hint"], [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, "config-section", "aggregates-section"], [1, "aggregates-header"], [1, "aggregates-description"], ["title", "Add a new aggregate", 1, "add-aggregate-btn", 3, "click", "disabled"], [1, "aggregates-empty-state"], [1, "aggregates-tip"], [1, "aggregates-list"], [1, "aggregate-item", 3, "disabled"], [1, "aggregates-summary"], [1, "summary-item"], [1, "fa-solid", "fa-id-card"], [1, "fa-solid", "fa-table-columns"], [1, "aggregate-item"], [1, "agg-icon"], [1, "agg-content"], [1, "agg-label"], [1, "agg-details"], [1, "agg-type"], ["title", "AI-generated", 1, "agg-smart-badge"], [1, "agg-actions"], ["title", "Move up", 1, "agg-action-btn", 3, "click", "disabled"], ["title", "Move down", 1, "agg-action-btn", 3, "click", "disabled"], [1, "agg-action-btn", "toggle-btn", 3, "click", "disabled", "title"], ["title", "Edit", 1, "agg-action-btn", "edit-btn", 3, "click", "disabled"], ["title", "Remove", 1, "agg-action-btn", "remove-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-trash"], [1, "empty-hint"], [1, "form-group"], ["for", "viewName"], ["id", "viewName", "type", "text", "placeholder", "Enter view name...", 1, "form-input", 3, "ngModelChange", "ngModel", "disabled"], [1, "validation-error"], ["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, "footer-btn", "save-btn", "primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-save"]], template: function ViewConfigPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2566
2693
|
i0.ɵɵconditionalCreate(0, ViewConfigPanelComponent_Conditional_0_Template, 1, 0, "div", 0);
|
|
2567
2694
|
i0.ɵɵelementStart(1, "div", 1)(2, "div", 2);
|
|
2568
2695
|
i0.ɵɵlistener("mousedown", function ViewConfigPanelComponent_Template_div_mousedown_2_listener($event) { return ctx.onResizeStart($event); });
|
|
@@ -2599,30 +2726,33 @@ export class ViewConfigPanelComponent {
|
|
|
2599
2726
|
i0.ɵɵconditionalCreate(24, ViewConfigPanelComponent_Conditional_24_Template, 2, 0, "span");
|
|
2600
2727
|
i0.ɵɵconditionalCreate(25, ViewConfigPanelComponent_Conditional_25_Template, 2, 1, "span", 13);
|
|
2601
2728
|
i0.ɵɵelementEnd();
|
|
2602
|
-
i0.ɵɵ
|
|
2603
|
-
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_26_listener() { return ctx.setActiveTab("settings"); });
|
|
2604
|
-
i0.ɵɵelement(27, "i", 16);
|
|
2605
|
-
i0.ɵɵconditionalCreate(28, ViewConfigPanelComponent_Conditional_28_Template, 2, 0, "span");
|
|
2606
|
-
i0.ɵɵelementEnd()();
|
|
2607
|
-
i0.ɵɵelementStart(29, "div", 17);
|
|
2608
|
-
i0.ɵɵconditionalCreate(30, ViewConfigPanelComponent_Conditional_30_Template, 24, 5, "div", 18);
|
|
2609
|
-
i0.ɵɵconditionalCreate(31, ViewConfigPanelComponent_Conditional_31_Template, 108, 41, "div", 19);
|
|
2610
|
-
i0.ɵɵconditionalCreate(32, ViewConfigPanelComponent_Conditional_32_Template, 11, 2, "div", 18);
|
|
2611
|
-
i0.ɵɵconditionalCreate(33, ViewConfigPanelComponent_Conditional_33_Template, 22, 10, "div", 18);
|
|
2612
|
-
i0.ɵɵconditionalCreate(34, ViewConfigPanelComponent_Conditional_34_Template, 15, 2, "div", 18);
|
|
2613
|
-
i0.ɵɵconditionalCreate(35, ViewConfigPanelComponent_Conditional_35_Template, 27, 7, "div", 18);
|
|
2729
|
+
i0.ɵɵconditionalCreate(26, ViewConfigPanelComponent_Conditional_26_Template, 3, 4, "button", 16);
|
|
2614
2730
|
i0.ɵɵelementEnd();
|
|
2615
|
-
i0.ɵɵelementStart(
|
|
2616
|
-
i0.ɵɵconditionalCreate(
|
|
2617
|
-
i0.ɵɵconditionalCreate(
|
|
2618
|
-
i0.ɵɵconditionalCreate(
|
|
2731
|
+
i0.ɵɵelementStart(27, "div", 17);
|
|
2732
|
+
i0.ɵɵconditionalCreate(28, ViewConfigPanelComponent_Conditional_28_Template, 24, 5, "div", 18);
|
|
2733
|
+
i0.ɵɵconditionalCreate(29, ViewConfigPanelComponent_Conditional_29_Template, 108, 41, "div", 19);
|
|
2734
|
+
i0.ɵɵconditionalCreate(30, ViewConfigPanelComponent_Conditional_30_Template, 11, 2, "div", 18);
|
|
2735
|
+
i0.ɵɵconditionalCreate(31, ViewConfigPanelComponent_Conditional_31_Template, 22, 10, "div", 18);
|
|
2736
|
+
i0.ɵɵconditionalCreate(32, ViewConfigPanelComponent_Conditional_32_Template, 15, 2, "div", 18);
|
|
2737
|
+
i0.ɵɵconditionalCreate(33, ViewConfigPanelComponent_Conditional_33_Template, 28, 10, "div", 18);
|
|
2619
2738
|
i0.ɵɵelementEnd();
|
|
2620
|
-
i0.ɵɵ
|
|
2621
|
-
i0.ɵɵ
|
|
2622
|
-
i0.ɵɵ
|
|
2739
|
+
i0.ɵɵconditionalCreate(34, ViewConfigPanelComponent_Conditional_34_Template, 4, 0, "div", 20);
|
|
2740
|
+
i0.ɵɵelementStart(35, "div", 21)(36, "div", 22);
|
|
2741
|
+
i0.ɵɵconditionalCreate(37, ViewConfigPanelComponent_Conditional_37_Template, 4, 3, "button", 23);
|
|
2742
|
+
i0.ɵɵconditionalCreate(38, ViewConfigPanelComponent_Conditional_38_Template, 4, 3, "button", 23);
|
|
2743
|
+
i0.ɵɵelementEnd();
|
|
2744
|
+
i0.ɵɵelementStart(39, "button", 24);
|
|
2745
|
+
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Template_button_click_39_listener() { return ctx.onClose(); });
|
|
2746
|
+
i0.ɵɵtext(40, " Cancel ");
|
|
2623
2747
|
i0.ɵɵelementEnd()()();
|
|
2624
|
-
i0.ɵɵelementStart(
|
|
2625
|
-
i0.ɵɵlistener("Close", function
|
|
2748
|
+
i0.ɵɵelementStart(41, "mj-aggregate-setup-dialog", 25);
|
|
2749
|
+
i0.ɵɵlistener("Close", function ViewConfigPanelComponent_Template_mj_aggregate_setup_dialog_Close_41_listener() { return ctx.closeAggregateDialog(); })("Save", function ViewConfigPanelComponent_Template_mj_aggregate_setup_dialog_Save_41_listener($event) { return ctx.onAggregateSave($event); });
|
|
2750
|
+
i0.ɵɵelementEnd();
|
|
2751
|
+
i0.ɵɵelementStart(42, "mj-ev-confirm-dialog", 26);
|
|
2752
|
+
i0.ɵɵlistener("Confirmed", function ViewConfigPanelComponent_Template_mj_ev_confirm_dialog_Confirmed_42_listener() { return ctx.OnDeleteConfirmed(); })("Cancelled", function ViewConfigPanelComponent_Template_mj_ev_confirm_dialog_Cancelled_42_listener() { return ctx.OnDeleteCancelled(); });
|
|
2753
|
+
i0.ɵɵelementEnd();
|
|
2754
|
+
i0.ɵɵelementStart(43, "mj-ev-confirm-dialog", 27);
|
|
2755
|
+
i0.ɵɵlistener("Confirmed", function ViewConfigPanelComponent_Template_mj_ev_confirm_dialog_Confirmed_43_listener() { return ctx.OnFilterModeSwitchConfirmed(); })("Cancelled", function ViewConfigPanelComponent_Template_mj_ev_confirm_dialog_Cancelled_43_listener() { return ctx.OnFilterModeSwitchCancelled(); });
|
|
2626
2756
|
i0.ɵɵelementEnd();
|
|
2627
2757
|
} if (rf & 2) {
|
|
2628
2758
|
i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
|
|
@@ -2658,35 +2788,36 @@ export class ViewConfigPanelComponent {
|
|
|
2658
2788
|
i0.ɵɵadvance();
|
|
2659
2789
|
i0.ɵɵconditional(ctx.enabledAggregatesCount > 0 ? 25 : -1);
|
|
2660
2790
|
i0.ɵɵadvance();
|
|
2661
|
-
i0.ɵɵ
|
|
2662
|
-
i0.ɵɵproperty("title", ctx.isIconOnlyMode ? "Settings" : "");
|
|
2791
|
+
i0.ɵɵconditional(ctx.viewEntity ? 26 : -1);
|
|
2663
2792
|
i0.ɵɵadvance(2);
|
|
2664
|
-
i0.ɵɵconditional(!ctx.
|
|
2665
|
-
i0.ɵɵadvance(2);
|
|
2666
|
-
i0.ɵɵconditional(ctx.activeTab === "columns" && !ctx.formatEditingColumn ? 30 : -1);
|
|
2793
|
+
i0.ɵɵconditional(ctx.activeTab === "columns" && !ctx.formatEditingColumn ? 28 : -1);
|
|
2667
2794
|
i0.ɵɵadvance();
|
|
2668
|
-
i0.ɵɵconditional(ctx.activeTab === "columns" && ctx.formatEditingColumn ?
|
|
2795
|
+
i0.ɵɵconditional(ctx.activeTab === "columns" && ctx.formatEditingColumn ? 29 : -1);
|
|
2669
2796
|
i0.ɵɵadvance();
|
|
2670
|
-
i0.ɵɵconditional(ctx.activeTab === "sorting" ?
|
|
2797
|
+
i0.ɵɵconditional(ctx.activeTab === "sorting" ? 30 : -1);
|
|
2671
2798
|
i0.ɵɵadvance();
|
|
2672
|
-
i0.ɵɵconditional(ctx.activeTab === "filters" ?
|
|
2799
|
+
i0.ɵɵconditional(ctx.activeTab === "filters" ? 31 : -1);
|
|
2673
2800
|
i0.ɵɵadvance();
|
|
2674
|
-
i0.ɵɵconditional(ctx.activeTab === "aggregates" ?
|
|
2801
|
+
i0.ɵɵconditional(ctx.activeTab === "aggregates" ? 32 : -1);
|
|
2675
2802
|
i0.ɵɵadvance();
|
|
2676
|
-
i0.ɵɵconditional(ctx.activeTab === "settings" ?
|
|
2677
|
-
i0.ɵɵadvance(3);
|
|
2678
|
-
i0.ɵɵconditional(ctx.viewEntity && ctx.canEdit ? 38 : -1);
|
|
2803
|
+
i0.ɵɵconditional(ctx.activeTab === "settings" ? 33 : -1);
|
|
2679
2804
|
i0.ɵɵadvance();
|
|
2680
|
-
i0.ɵɵconditional(
|
|
2805
|
+
i0.ɵɵconditional(ctx.ValidationErrors.length > 0 && ctx.visibleColumns.length === 0 ? 34 : -1);
|
|
2806
|
+
i0.ɵɵadvance(3);
|
|
2807
|
+
i0.ɵɵconditional(ctx.viewEntity && ctx.canEdit ? 37 : -1);
|
|
2681
2808
|
i0.ɵɵadvance();
|
|
2682
|
-
i0.ɵɵconditional(ctx.viewEntity
|
|
2809
|
+
i0.ɵɵconditional(!ctx.viewEntity ? 38 : -1);
|
|
2683
2810
|
i0.ɵɵadvance(3);
|
|
2684
2811
|
i0.ɵɵproperty("Entity", ctx.entity)("Aggregate", ctx.editingAggregate)("IsOpen", ctx.showAggregateDialog);
|
|
2685
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.AggregateSetupDialogComponent], 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: 450px;\n min-width: 360px;\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.tab-badge[_ngcontent-%COMP%] {\n background: #1976d2;\n color: white;\n font-size: 10px;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 8px;\n margin-left: 4px;\n}\n\n\n\n.tab-nav.icon-only[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n padding: 12px 8px;\n gap: 4px;\n}\n\n.tab-nav.icon-only[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.tab-nav.icon-only[_ngcontent-%COMP%] .tab-badge[_ngcontent-%COMP%] {\n margin-left: 0;\n padding: 2px 4px;\n font-size: 9px;\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\n\n\n.add-sort-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: transparent;\n color: #666;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n width: 100%;\n justify-content: center;\n margin-bottom: 12px;\n}\n\n.add-sort-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #1976d2;\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.add-sort-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.add-sort-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.sort-items-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n\n\n.sort-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n transition: all 0.15s ease;\n}\n\n.sort-item[_ngcontent-%COMP%]:hover {\n border-color: #bdbdbd;\n background: #fafafa;\n}\n\n.sort-item.dragging[_ngcontent-%COMP%] {\n opacity: 0.5;\n background: #e3f2fd;\n border-color: #1976d2;\n}\n\n.sort-item.drop-target[_ngcontent-%COMP%] {\n border-color: #1976d2;\n}\n\n\n\n.sort-priority-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 6px;\n font-size: 12px;\n font-weight: 700;\n color: white;\n background: linear-gradient(135deg, #1976d2 0%, #42a5f5 100%);\n border-radius: 12px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n flex-shrink: 0;\n}\n\n\n\n.sort-drag-handle[_ngcontent-%COMP%] {\n color: #bdbdbd;\n cursor: grab;\n padding: 4px;\n transition: color 0.15s ease;\n flex-shrink: 0;\n}\n\n.sort-drag-handle[_ngcontent-%COMP%]:hover {\n color: #757575;\n}\n\n.sort-item.dragging[_ngcontent-%COMP%] .sort-drag-handle[_ngcontent-%COMP%] {\n cursor: grabbing;\n color: #1976d2;\n}\n\n\n\n.sort-field-dropdown[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 120px;\n padding: 8px 10px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 13px;\n background: white;\n cursor: pointer;\n}\n\n.sort-field-dropdown[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.sort-field-dropdown[_ngcontent-%COMP%]:disabled {\n background: #f5f5f5;\n color: #999;\n cursor: not-allowed;\n}\n\n\n\n.sort-remove-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #bdbdbd;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.sort-remove-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #ffebee;\n color: #c62828;\n}\n\n.sort-remove-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n\n\n.sort-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%_sortDropIndicatorPulse 0.8s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_sortDropIndicatorPulse {\n 0%, 100% { opacity: 1; transform: scaleX(1); }\n 50% { opacity: 0.7; transform: scaleX(0.98); }\n}\n\n\n\n.sort-hint[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 10px 12px;\n background: #f5f7fa;\n border-radius: 6px;\n font-size: 12px;\n color: #666;\n}\n\n.sort-hint[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n\n\n.sorting-section[_ngcontent-%COMP%] {\n padding-top: 0;\n}\n\n.sorting-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.sorting-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n margin: 0;\n}\n\n\n\n.sort-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px 20px;\n color: #999;\n font-size: 14px;\n text-align: center;\n}\n\n.sort-empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: 8px;\n}\n\n.sort-empty-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #bbb;\n margin: 0;\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\n\n\n.aggregates-section[_ngcontent-%COMP%] {\n padding-top: 0;\n}\n\n.aggregates-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.aggregates-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n margin: 0;\n}\n\n\n\n.add-aggregate-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: transparent;\n color: #666;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n width: 100%;\n justify-content: center;\n margin-bottom: 16px;\n}\n\n.add-aggregate-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #1976d2;\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.add-aggregate-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.add-aggregate-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.aggregates-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n}\n\n\n\n.aggregate-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n transition: all 0.15s ease;\n}\n\n.aggregate-item[_ngcontent-%COMP%]:hover {\n border-color: #bdbdbd;\n background: #fafafa;\n}\n\n.aggregate-item.disabled[_ngcontent-%COMP%] {\n opacity: 0.6;\n background: #f5f5f5;\n}\n\n\n\n.agg-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);\n border-radius: 8px;\n color: #1976d2;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.aggregate-item.disabled[_ngcontent-%COMP%] .agg-icon[_ngcontent-%COMP%] {\n background: #f0f0f0;\n color: #999;\n}\n\n\n\n.agg-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.agg-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 2px;\n}\n\n.aggregate-item.disabled[_ngcontent-%COMP%] .agg-label[_ngcontent-%COMP%] {\n color: #888;\n}\n\n.agg-details[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #888;\n}\n\n.agg-type[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.agg-type[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.agg-smart-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 2px 6px;\n background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);\n border-radius: 4px;\n color: #3b82f6;\n font-size: 10px;\n}\n\n\n\n.agg-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.agg-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 display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.agg-action-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #e0e0e0;\n color: #333;\n}\n\n.agg-action-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.agg-action-btn.toggle-btn.enabled[_ngcontent-%COMP%] {\n color: #2e7d32;\n}\n\n.agg-action-btn.toggle-btn[_ngcontent-%COMP%]:not(.enabled) {\n color: #bdbdbd;\n}\n\n.agg-action-btn.edit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.agg-action-btn.remove-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #ffebee;\n color: #c62828;\n}\n\n\n\n.aggregates-summary[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 12px 14px;\n background: #f5f7fa;\n border-radius: 6px;\n margin-bottom: 16px;\n}\n\n.summary-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #666;\n}\n\n.summary-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n font-size: 11px;\n}\n\n\n\n.aggregates-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px 20px;\n color: #999;\n font-size: 14px;\n text-align: center;\n}\n\n.aggregates-empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: 8px;\n}\n\n.empty-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #bbb;\n margin: 0;\n}\n\n\n\n.aggregates-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.aggregates-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\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}"] });
|
|
2812
|
+
i0.ɵɵadvance();
|
|
2813
|
+
i0.ɵɵproperty("IsOpen", ctx.showDeleteConfirm)("Message", "Are you sure you want to delete '" + ctx.viewName + "'?");
|
|
2814
|
+
i0.ɵɵadvance();
|
|
2815
|
+
i0.ɵɵproperty("IsOpen", ctx.showFilterModeSwitchConfirm)("Message", ctx.filterMode === "smart" ? "Switching to Traditional mode will clear your smart filter prompt." : "Switching to Smart mode will clear your traditional filter rules.");
|
|
2816
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.AggregateSetupDialogComponent, i3.ConfirmDialogComponent], 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: 450px;\n min-width: 360px;\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.tab-badge[_ngcontent-%COMP%] {\n background: #1976d2;\n color: white;\n font-size: 10px;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 8px;\n margin-left: 4px;\n}\n\n\n\n.tab-nav.icon-only[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n padding: 12px 8px;\n gap: 4px;\n}\n\n.tab-nav.icon-only[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.tab-nav.icon-only[_ngcontent-%COMP%] .tab-badge[_ngcontent-%COMP%] {\n margin-left: 0;\n padding: 2px 4px;\n font-size: 9px;\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\n\n\n.add-sort-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: transparent;\n color: #666;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n width: 100%;\n justify-content: center;\n margin-bottom: 12px;\n}\n\n.add-sort-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #1976d2;\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.add-sort-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.add-sort-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.sort-items-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n\n\n.sort-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n transition: all 0.15s ease;\n}\n\n.sort-item[_ngcontent-%COMP%]:hover {\n border-color: #bdbdbd;\n background: #fafafa;\n}\n\n.sort-item.dragging[_ngcontent-%COMP%] {\n opacity: 0.5;\n background: #e3f2fd;\n border-color: #1976d2;\n}\n\n.sort-item.drop-target[_ngcontent-%COMP%] {\n border-color: #1976d2;\n}\n\n\n\n.sort-priority-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 6px;\n font-size: 12px;\n font-weight: 700;\n color: white;\n background: linear-gradient(135deg, #1976d2 0%, #42a5f5 100%);\n border-radius: 12px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n flex-shrink: 0;\n}\n\n\n\n.sort-drag-handle[_ngcontent-%COMP%] {\n color: #bdbdbd;\n cursor: grab;\n padding: 4px;\n transition: color 0.15s ease;\n flex-shrink: 0;\n}\n\n.sort-drag-handle[_ngcontent-%COMP%]:hover {\n color: #757575;\n}\n\n.sort-item.dragging[_ngcontent-%COMP%] .sort-drag-handle[_ngcontent-%COMP%] {\n cursor: grabbing;\n color: #1976d2;\n}\n\n\n\n.sort-field-dropdown[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 120px;\n padding: 8px 10px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 13px;\n background: white;\n cursor: pointer;\n}\n\n.sort-field-dropdown[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.sort-field-dropdown[_ngcontent-%COMP%]:disabled {\n background: #f5f5f5;\n color: #999;\n cursor: not-allowed;\n}\n\n\n\n.sort-remove-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #bdbdbd;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.sort-remove-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #ffebee;\n color: #c62828;\n}\n\n.sort-remove-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n\n\n.sort-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%_sortDropIndicatorPulse 0.8s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_sortDropIndicatorPulse {\n 0%, 100% { opacity: 1; transform: scaleX(1); }\n 50% { opacity: 0.7; transform: scaleX(0.98); }\n}\n\n\n\n.sort-hint[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 10px 12px;\n background: #f5f7fa;\n border-radius: 6px;\n font-size: 12px;\n color: #666;\n}\n\n.sort-hint[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n\n\n.sorting-section[_ngcontent-%COMP%] {\n padding-top: 0;\n}\n\n.sorting-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.sorting-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n margin: 0;\n}\n\n\n\n.sort-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px 20px;\n color: #999;\n font-size: 14px;\n text-align: center;\n}\n\n.sort-empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: 8px;\n}\n\n.sort-empty-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #bbb;\n margin: 0;\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 gap: 8px;\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\n\n\n.aggregates-section[_ngcontent-%COMP%] {\n padding-top: 0;\n}\n\n.aggregates-header[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.aggregates-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n margin: 0;\n}\n\n\n\n.add-aggregate-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: transparent;\n color: #666;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n width: 100%;\n justify-content: center;\n margin-bottom: 16px;\n}\n\n.add-aggregate-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: #1976d2;\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.add-aggregate-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.add-aggregate-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.aggregates-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n}\n\n\n\n.aggregate-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n transition: all 0.15s ease;\n}\n\n.aggregate-item[_ngcontent-%COMP%]:hover {\n border-color: #bdbdbd;\n background: #fafafa;\n}\n\n.aggregate-item.disabled[_ngcontent-%COMP%] {\n opacity: 0.6;\n background: #f5f5f5;\n}\n\n\n\n.agg-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);\n border-radius: 8px;\n color: #1976d2;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.aggregate-item.disabled[_ngcontent-%COMP%] .agg-icon[_ngcontent-%COMP%] {\n background: #f0f0f0;\n color: #999;\n}\n\n\n\n.agg-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.agg-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 2px;\n}\n\n.aggregate-item.disabled[_ngcontent-%COMP%] .agg-label[_ngcontent-%COMP%] {\n color: #888;\n}\n\n.agg-details[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #888;\n}\n\n.agg-type[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.agg-type[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.agg-smart-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 2px 6px;\n background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);\n border-radius: 4px;\n color: #3b82f6;\n font-size: 10px;\n}\n\n\n\n.agg-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.agg-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 display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.agg-action-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #e0e0e0;\n color: #333;\n}\n\n.agg-action-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.agg-action-btn.toggle-btn.enabled[_ngcontent-%COMP%] {\n color: #2e7d32;\n}\n\n.agg-action-btn.toggle-btn[_ngcontent-%COMP%]:not(.enabled) {\n color: #bdbdbd;\n}\n\n.agg-action-btn.edit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.agg-action-btn.remove-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #ffebee;\n color: #c62828;\n}\n\n\n\n.aggregates-summary[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 12px 14px;\n background: #f5f7fa;\n border-radius: 6px;\n margin-bottom: 16px;\n}\n\n.summary-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #666;\n}\n\n.summary-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n font-size: 11px;\n}\n\n\n\n.aggregates-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px 20px;\n color: #999;\n font-size: 14px;\n text-align: center;\n}\n\n.aggregates-empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: 8px;\n}\n\n.empty-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #bbb;\n margin: 0;\n}\n\n\n\n.aggregates-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.aggregates-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\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}\n\n\n\n.form-input.invalid[_ngcontent-%COMP%] {\n border-color: #ef4444;\n}\n\n.validation-error[_ngcontent-%COMP%] {\n display: block;\n font-size: 12px;\n color: #ef4444;\n margin-top: 4px;\n}\n\n.validation-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: #fef2f2;\n border-top: 1px solid #fecaca;\n color: #dc2626;\n font-size: 13px;\n}\n\n.validation-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n\n\n.footer-btn.duplicate-btn[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #374151;\n border: 1px solid #d1d5db;\n}\n\n.footer-btn.duplicate-btn[_ngcontent-%COMP%]:hover {\n background: #e5e7eb;\n border-color: #9ca3af;\n}"] });
|
|
2686
2817
|
}
|
|
2687
2818
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ViewConfigPanelComponent, [{
|
|
2688
2819
|
type: Component,
|
|
2689
|
-
args: [{ standalone: false, 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\" [class.icon-only]=\"isIconOnlyMode\">\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'columns'\"\n (click)=\"setActiveTab('columns')\"\n [title]=\"isIconOnlyMode ? 'Columns' : ''\">\n <i class=\"fa-solid fa-columns\"></i>\n @if (!isIconOnlyMode) {\n <span>Columns</span>\n }\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'sorting'\"\n (click)=\"setActiveTab('sorting')\"\n [title]=\"isIconOnlyMode ? 'Sorting' + (sortItems.length > 0 ? ' (' + sortItems.length + ')' : '') : ''\">\n <i class=\"fa-solid fa-arrow-up-wide-short\"></i>\n @if (!isIconOnlyMode) {\n <span>Sorting</span>\n }\n @if (sortItems.length > 0) {\n <span class=\"tab-badge\">{{ sortItems.length }}</span>\n }\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'filters'\"\n (click)=\"setActiveTab('filters')\"\n [title]=\"isIconOnlyMode ? 'Filters' : ''\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (!isIconOnlyMode) {\n <span>Filters</span>\n }\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'aggregates'\"\n (click)=\"setActiveTab('aggregates')\"\n [title]=\"isIconOnlyMode ? 'Aggregates' + (enabledAggregatesCount > 0 ? ' (' + enabledAggregatesCount + ')' : '') : ''\">\n <i class=\"fa-solid fa-chart-simple\"></i>\n @if (!isIconOnlyMode) {\n <span>Aggregates</span>\n }\n @if (enabledAggregatesCount > 0) {\n <span class=\"tab-badge\">{{ enabledAggregatesCount }}</span>\n }\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'settings'\"\n (click)=\"setActiveTab('settings')\"\n [title]=\"isIconOnlyMode ? 'Settings' : ''\">\n <i class=\"fa-solid fa-cog\"></i>\n @if (!isIconOnlyMode) {\n <span>Settings</span>\n }\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 <!-- 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 <!-- Sorting Tab -->\n @if (activeTab === 'sorting') {\n <div class=\"tab-content\">\n <div class=\"config-section sorting-section\">\n <div class=\"sorting-header\">\n <p class=\"sorting-description\">\n Define how records should be ordered. Add multiple levels to sort by secondary fields when values are equal.\n </p>\n </div>\n\n <!-- Add Sort Button -->\n <button\n class=\"add-sort-btn\"\n (click)=\"addSortLevel()\"\n [disabled]=\"!canEdit || sortItems.length >= sortableFields.length\"\n title=\"Add another sort level\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Add Sort Level</span>\n </button>\n\n <!-- Sort Items List -->\n @if (sortItems.length > 0) {\n <div class=\"sort-items-list\">\n @for (sortItem of sortItems; track $index; let i = $index) {\n <!-- Drop indicator before -->\n @if (isSortDropBefore(sortItem)) {\n <div class=\"sort-drop-indicator\"></div>\n }\n <div\n class=\"sort-item\"\n [class.dragging]=\"draggedSortItem === sortItem\"\n [class.drop-target]=\"dropTargetSortItem === sortItem\"\n draggable=\"true\"\n (dragstart)=\"onSortDragStart($event, sortItem)\"\n (dragover)=\"onSortDragOver($event, sortItem)\"\n (dragleave)=\"onSortDragLeave($event)\"\n (drop)=\"onSortDrop($event, sortItem)\"\n (dragend)=\"onSortDragEnd($event)\">\n <!-- Priority Badge -->\n <div class=\"sort-priority-badge\">{{ i + 1 }}</div>\n <!-- Drag Handle -->\n <div class=\"sort-drag-handle\" title=\"Drag to reorder\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </div>\n <!-- Field Dropdown -->\n <select\n class=\"sort-field-dropdown\"\n [(ngModel)]=\"sortItem.field\"\n (ngModelChange)=\"onSortFieldChange(sortItem, $event)\"\n [disabled]=\"!canEdit\">\n @for (field of sortableFields; track field.ID) {\n <option [value]=\"field.Name\">{{ field.DisplayNameOrName }}</option>\n }\n </select>\n <!-- Direction Toggle -->\n <div class=\"sort-direction-toggle\">\n <button\n class=\"direction-btn\"\n [class.active]=\"sortItem.direction === 'asc'\"\n (click)=\"onSortDirectionChange(sortItem, 'asc')\"\n [disabled]=\"!canEdit\"\n title=\"Ascending (A-Z, 1-9)\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n </button>\n <button\n class=\"direction-btn\"\n [class.active]=\"sortItem.direction === 'desc'\"\n (click)=\"onSortDirectionChange(sortItem, 'desc')\"\n [disabled]=\"!canEdit\"\n title=\"Descending (Z-A, 9-1)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n </button>\n </div>\n <!-- Remove Button -->\n <button\n class=\"sort-remove-btn\"\n (click)=\"removeSortLevel(sortItem)\"\n [disabled]=\"!canEdit\"\n title=\"Remove sort level\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Drop indicator after (only for last item) -->\n @if (isSortDropAfter(sortItem) && i === sortItems.length - 1) {\n <div class=\"sort-drop-indicator\"></div>\n }\n }\n </div>\n <!-- Multi-sort hint -->\n @if (sortItems.length > 1) {\n <div class=\"sort-hint\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Drag items to change priority. Records sort by first level, then second, etc.</span>\n </div>\n }\n } @else {\n <div class=\"sort-empty-state\">\n <i class=\"fa-solid fa-arrow-up-wide-short\"></i>\n <span>No sorting configured</span>\n <p class=\"sort-empty-hint\">Click \"Add Sort Level\" to define how records should be ordered</p>\n </div>\n }\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 <!-- Aggregates Tab -->\n @if (activeTab === 'aggregates') {\n <div class=\"tab-content\">\n <div class=\"config-section aggregates-section\">\n <div class=\"aggregates-header\">\n <p class=\"aggregates-description\">\n Add summary calculations like totals, averages, and counts. Display them in cards or as column footers.\n </p>\n </div>\n\n <!-- Add Aggregate Button -->\n <button\n class=\"add-aggregate-btn\"\n (click)=\"openAddAggregateDialog()\"\n [disabled]=\"!canEdit\"\n title=\"Add a new aggregate\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Add Aggregate</span>\n </button>\n\n <!-- Aggregates List -->\n @if (aggregates.length > 0) {\n <div class=\"aggregates-list\">\n @for (agg of aggregates; track agg.id; let i = $index) {\n <div class=\"aggregate-item\" [class.disabled]=\"agg.enabled === false\">\n <!-- Icon -->\n <div class=\"agg-icon\">\n <i [class]=\"agg.icon || 'fa-solid fa-chart-simple'\"></i>\n </div>\n\n <!-- Content -->\n <div class=\"agg-content\">\n <div class=\"agg-label\">{{ agg.label }}</div>\n <div class=\"agg-details\">\n <span class=\"agg-type\">\n <i [class]=\"agg.displayType === 'card' ? 'fa-solid fa-id-card' : 'fa-solid fa-table-columns'\"></i>\n {{ agg.displayType === 'card' ? 'Card' : 'Column Footer' }}\n </span>\n @if (agg.smartPrompt) {\n <span class=\"agg-smart-badge\" title=\"AI-generated\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n </span>\n }\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"agg-actions\">\n <button\n class=\"agg-action-btn\"\n [disabled]=\"i === 0 || !canEdit\"\n (click)=\"moveAggregateUp(agg)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button\n class=\"agg-action-btn\"\n [disabled]=\"i === aggregates.length - 1 || !canEdit\"\n (click)=\"moveAggregateDown(agg)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n <button\n class=\"agg-action-btn toggle-btn\"\n [class.enabled]=\"agg.enabled !== false\"\n (click)=\"toggleAggregateEnabled(agg, $event)\"\n [disabled]=\"!canEdit\"\n [title]=\"agg.enabled !== false ? 'Disable' : 'Enable'\">\n <i [class]=\"agg.enabled !== false ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'\"></i>\n </button>\n <button\n class=\"agg-action-btn edit-btn\"\n (click)=\"editAggregate(agg)\"\n [disabled]=\"!canEdit\"\n title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button\n class=\"agg-action-btn remove-btn\"\n (click)=\"removeAggregate(agg)\"\n [disabled]=\"!canEdit\"\n title=\"Remove\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Summary -->\n <div class=\"aggregates-summary\">\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-id-card\"></i>\n <span>{{ cardAggregates.length }} card{{ cardAggregates.length !== 1 ? 's' : '' }}</span>\n </div>\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-table-columns\"></i>\n <span>{{ columnAggregates.length }} column footer{{ columnAggregates.length !== 1 ? 's' : '' }}</span>\n </div>\n </div>\n } @else {\n <div class=\"aggregates-empty-state\">\n <i class=\"fa-solid fa-chart-simple\"></i>\n <span>No aggregates configured</span>\n <p class=\"empty-hint\">Click \"Add Aggregate\" to create summary calculations</p>\n </div>\n }\n\n <!-- Info Tip -->\n <div class=\"aggregates-tip\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Aggregates are calculated server-side for accuracy with filtered/paginated data.</span>\n </div>\n </div>\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\n<!-- Aggregate Setup Dialog -->\n<mj-aggregate-setup-dialog\n [Entity]=\"entity\"\n [Aggregate]=\"editingAggregate\"\n [IsOpen]=\"showAggregateDialog\"\n (Close)=\"closeAggregateDialog()\"\n (Save)=\"onAggregateSave($event)\">\n</mj-aggregate-setup-dialog>\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: 450px;\n min-width: 360px;\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.tab-badge {\n background: #1976d2;\n color: white;\n font-size: 10px;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 8px;\n margin-left: 4px;\n}\n\n/* Icon-only mode for narrow panels */\n.tab-nav.icon-only .tab-btn {\n padding: 12px 8px;\n gap: 4px;\n}\n\n.tab-nav.icon-only .tab-btn i {\n font-size: 14px;\n}\n\n.tab-nav.icon-only .tab-badge {\n margin-left: 0;\n padding: 2px 4px;\n font-size: 9px;\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/* ========================================\n MULTI-SORT CONFIGURATION\n ======================================== */\n\n.add-sort-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: transparent;\n color: #666;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n width: 100%;\n justify-content: center;\n margin-bottom: 12px;\n}\n\n.add-sort-btn:hover:not(:disabled) {\n border-color: #1976d2;\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.add-sort-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.add-sort-btn i {\n font-size: 12px;\n}\n\n/* Sort Items List */\n.sort-items-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n/* Sort Item */\n.sort-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n transition: all 0.15s ease;\n}\n\n.sort-item:hover {\n border-color: #bdbdbd;\n background: #fafafa;\n}\n\n.sort-item.dragging {\n opacity: 0.5;\n background: #e3f2fd;\n border-color: #1976d2;\n}\n\n.sort-item.drop-target {\n border-color: #1976d2;\n}\n\n/* Priority Badge */\n.sort-priority-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 6px;\n font-size: 12px;\n font-weight: 700;\n color: white;\n background: linear-gradient(135deg, #1976d2 0%, #42a5f5 100%);\n border-radius: 12px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n flex-shrink: 0;\n}\n\n/* Drag Handle */\n.sort-drag-handle {\n color: #bdbdbd;\n cursor: grab;\n padding: 4px;\n transition: color 0.15s ease;\n flex-shrink: 0;\n}\n\n.sort-drag-handle:hover {\n color: #757575;\n}\n\n.sort-item.dragging .sort-drag-handle {\n cursor: grabbing;\n color: #1976d2;\n}\n\n/* Sort Field Dropdown */\n.sort-field-dropdown {\n flex: 1;\n min-width: 120px;\n padding: 8px 10px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 13px;\n background: white;\n cursor: pointer;\n}\n\n.sort-field-dropdown:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.sort-field-dropdown:disabled {\n background: #f5f5f5;\n color: #999;\n cursor: not-allowed;\n}\n\n/* Sort Remove Button */\n.sort-remove-btn {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #bdbdbd;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.sort-remove-btn:hover:not(:disabled) {\n background: #ffebee;\n color: #c62828;\n}\n\n.sort-remove-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n/* Sort Drop Indicator */\n.sort-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: sortDropIndicatorPulse 0.8s ease-in-out infinite;\n}\n\n@keyframes sortDropIndicatorPulse {\n 0%, 100% { opacity: 1; transform: scaleX(1); }\n 50% { opacity: 0.7; transform: scaleX(0.98); }\n}\n\n/* Sort Hint */\n.sort-hint {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 10px 12px;\n background: #f5f7fa;\n border-radius: 6px;\n font-size: 12px;\n color: #666;\n}\n\n.sort-hint i {\n color: #1976d2;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n/* Sorting Section Styles */\n.sorting-section {\n padding-top: 0;\n}\n\n.sorting-header {\n margin-bottom: 16px;\n}\n\n.sorting-description {\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n margin: 0;\n}\n\n/* Sort Empty State */\n.sort-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px 20px;\n color: #999;\n font-size: 14px;\n text-align: center;\n}\n\n.sort-empty-state i {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: 8px;\n}\n\n.sort-empty-hint {\n font-size: 12px;\n color: #bbb;\n margin: 0;\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/* ========================================\n AGGREGATES TAB STYLES\n ======================================== */\n\n.aggregates-section {\n padding-top: 0;\n}\n\n.aggregates-header {\n margin-bottom: 16px;\n}\n\n.aggregates-description {\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n margin: 0;\n}\n\n/* Add Aggregate Button */\n.add-aggregate-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: transparent;\n color: #666;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n width: 100%;\n justify-content: center;\n margin-bottom: 16px;\n}\n\n.add-aggregate-btn:hover:not(:disabled) {\n border-color: #1976d2;\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.add-aggregate-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.add-aggregate-btn i {\n font-size: 12px;\n}\n\n/* Aggregates List */\n.aggregates-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n}\n\n/* Aggregate Item */\n.aggregate-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n transition: all 0.15s ease;\n}\n\n.aggregate-item:hover {\n border-color: #bdbdbd;\n background: #fafafa;\n}\n\n.aggregate-item.disabled {\n opacity: 0.6;\n background: #f5f5f5;\n}\n\n/* Aggregate Icon */\n.agg-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);\n border-radius: 8px;\n color: #1976d2;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.aggregate-item.disabled .agg-icon {\n background: #f0f0f0;\n color: #999;\n}\n\n/* Aggregate Content */\n.agg-content {\n flex: 1;\n min-width: 0;\n}\n\n.agg-label {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 2px;\n}\n\n.aggregate-item.disabled .agg-label {\n color: #888;\n}\n\n.agg-details {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #888;\n}\n\n.agg-type {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.agg-type i {\n font-size: 10px;\n}\n\n.agg-smart-badge {\n display: flex;\n align-items: center;\n padding: 2px 6px;\n background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);\n border-radius: 4px;\n color: #3b82f6;\n font-size: 10px;\n}\n\n/* Aggregate Actions */\n.agg-actions {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.agg-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 display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.agg-action-btn:hover:not(:disabled) {\n background: #e0e0e0;\n color: #333;\n}\n\n.agg-action-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.agg-action-btn.toggle-btn.enabled {\n color: #2e7d32;\n}\n\n.agg-action-btn.toggle-btn:not(.enabled) {\n color: #bdbdbd;\n}\n\n.agg-action-btn.edit-btn:hover:not(:disabled) {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.agg-action-btn.remove-btn:hover:not(:disabled) {\n background: #ffebee;\n color: #c62828;\n}\n\n/* Aggregates Summary */\n.aggregates-summary {\n display: flex;\n gap: 16px;\n padding: 12px 14px;\n background: #f5f7fa;\n border-radius: 6px;\n margin-bottom: 16px;\n}\n\n.summary-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #666;\n}\n\n.summary-item i {\n color: #1976d2;\n font-size: 11px;\n}\n\n/* Aggregates Empty State */\n.aggregates-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px 20px;\n color: #999;\n font-size: 14px;\n text-align: center;\n}\n\n.aggregates-empty-state i {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: 8px;\n}\n\n.empty-hint {\n font-size: 12px;\n color: #bbb;\n margin: 0;\n}\n\n/* Aggregates Tip */\n.aggregates-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.aggregates-tip i {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\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"] }]
|
|
2820
|
+
args: [{ standalone: false, 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\" [class.icon-only]=\"isIconOnlyMode\">\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'columns'\"\n (click)=\"setActiveTab('columns')\"\n [title]=\"isIconOnlyMode ? 'Columns' : ''\">\n <i class=\"fa-solid fa-columns\"></i>\n @if (!isIconOnlyMode) {\n <span>Columns</span>\n }\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'sorting'\"\n (click)=\"setActiveTab('sorting')\"\n [title]=\"isIconOnlyMode ? 'Sorting' + (sortItems.length > 0 ? ' (' + sortItems.length + ')' : '') : ''\">\n <i class=\"fa-solid fa-arrow-up-wide-short\"></i>\n @if (!isIconOnlyMode) {\n <span>Sorting</span>\n }\n @if (sortItems.length > 0) {\n <span class=\"tab-badge\">{{ sortItems.length }}</span>\n }\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'filters'\"\n (click)=\"setActiveTab('filters')\"\n [title]=\"isIconOnlyMode ? 'Filters' : ''\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (!isIconOnlyMode) {\n <span>Filters</span>\n }\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'aggregates'\"\n (click)=\"setActiveTab('aggregates')\"\n [title]=\"isIconOnlyMode ? 'Aggregates' + (enabledAggregatesCount > 0 ? ' (' + enabledAggregatesCount + ')' : '') : ''\">\n <i class=\"fa-solid fa-chart-simple\"></i>\n @if (!isIconOnlyMode) {\n <span>Aggregates</span>\n }\n @if (enabledAggregatesCount > 0) {\n <span class=\"tab-badge\">{{ enabledAggregatesCount }}</span>\n }\n </button>\n @if (viewEntity) {\n <button\n class=\"tab-btn\"\n [class.active]=\"activeTab === 'settings'\"\n (click)=\"setActiveTab('settings')\"\n [title]=\"isIconOnlyMode ? 'Settings' : ''\">\n <i class=\"fa-solid fa-cog\"></i>\n @if (!isIconOnlyMode) {\n <span>Settings</span>\n }\n </button>\n }\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 <!-- 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 <!-- Sorting Tab -->\n @if (activeTab === 'sorting') {\n <div class=\"tab-content\">\n <div class=\"config-section sorting-section\">\n <div class=\"sorting-header\">\n <p class=\"sorting-description\">\n Define how records should be ordered. Add multiple levels to sort by secondary fields when values are equal.\n </p>\n </div>\n\n <!-- Add Sort Button -->\n <button\n class=\"add-sort-btn\"\n (click)=\"addSortLevel()\"\n [disabled]=\"!canEdit || sortItems.length >= sortableFields.length\"\n title=\"Add another sort level\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Add Sort Level</span>\n </button>\n\n <!-- Sort Items List -->\n @if (sortItems.length > 0) {\n <div class=\"sort-items-list\">\n @for (sortItem of sortItems; track $index; let i = $index) {\n <!-- Drop indicator before -->\n @if (isSortDropBefore(sortItem)) {\n <div class=\"sort-drop-indicator\"></div>\n }\n <div\n class=\"sort-item\"\n [class.dragging]=\"draggedSortItem === sortItem\"\n [class.drop-target]=\"dropTargetSortItem === sortItem\"\n draggable=\"true\"\n (dragstart)=\"onSortDragStart($event, sortItem)\"\n (dragover)=\"onSortDragOver($event, sortItem)\"\n (dragleave)=\"onSortDragLeave($event)\"\n (drop)=\"onSortDrop($event, sortItem)\"\n (dragend)=\"onSortDragEnd($event)\">\n <!-- Priority Badge -->\n <div class=\"sort-priority-badge\">{{ i + 1 }}</div>\n <!-- Drag Handle -->\n <div class=\"sort-drag-handle\" title=\"Drag to reorder\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </div>\n <!-- Field Dropdown -->\n <select\n class=\"sort-field-dropdown\"\n [(ngModel)]=\"sortItem.field\"\n (ngModelChange)=\"onSortFieldChange(sortItem, $event)\"\n [disabled]=\"!canEdit\">\n @for (field of sortableFields; track field.ID) {\n <option [value]=\"field.Name\">{{ field.DisplayNameOrName }}</option>\n }\n </select>\n <!-- Direction Toggle -->\n <div class=\"sort-direction-toggle\">\n <button\n class=\"direction-btn\"\n [class.active]=\"sortItem.direction === 'asc'\"\n (click)=\"onSortDirectionChange(sortItem, 'asc')\"\n [disabled]=\"!canEdit\"\n title=\"Ascending (A-Z, 1-9)\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n </button>\n <button\n class=\"direction-btn\"\n [class.active]=\"sortItem.direction === 'desc'\"\n (click)=\"onSortDirectionChange(sortItem, 'desc')\"\n [disabled]=\"!canEdit\"\n title=\"Descending (Z-A, 9-1)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n </button>\n </div>\n <!-- Remove Button -->\n <button\n class=\"sort-remove-btn\"\n (click)=\"removeSortLevel(sortItem)\"\n [disabled]=\"!canEdit\"\n title=\"Remove sort level\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Drop indicator after (only for last item) -->\n @if (isSortDropAfter(sortItem) && i === sortItems.length - 1) {\n <div class=\"sort-drop-indicator\"></div>\n }\n }\n </div>\n <!-- Multi-sort hint -->\n @if (sortItems.length > 1) {\n <div class=\"sort-hint\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Drag items to change priority. Records sort by first level, then second, etc.</span>\n </div>\n }\n } @else {\n <div class=\"sort-empty-state\">\n <i class=\"fa-solid fa-arrow-up-wide-short\"></i>\n <span>No sorting configured</span>\n <p class=\"sort-empty-hint\">Click \"Add Sort Level\" to define how records should be ordered</p>\n </div>\n }\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 <!-- Aggregates Tab -->\n @if (activeTab === 'aggregates') {\n <div class=\"tab-content\">\n <div class=\"config-section aggregates-section\">\n <div class=\"aggregates-header\">\n <p class=\"aggregates-description\">\n Add summary calculations like totals, averages, and counts. Display them in cards or as column footers.\n </p>\n </div>\n\n <!-- Add Aggregate Button -->\n <button\n class=\"add-aggregate-btn\"\n (click)=\"openAddAggregateDialog()\"\n [disabled]=\"!canEdit\"\n title=\"Add a new aggregate\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Add Aggregate</span>\n </button>\n\n <!-- Aggregates List -->\n @if (aggregates.length > 0) {\n <div class=\"aggregates-list\">\n @for (agg of aggregates; track agg.id; let i = $index) {\n <div class=\"aggregate-item\" [class.disabled]=\"agg.enabled === false\">\n <!-- Icon -->\n <div class=\"agg-icon\">\n <i [class]=\"agg.icon || 'fa-solid fa-chart-simple'\"></i>\n </div>\n\n <!-- Content -->\n <div class=\"agg-content\">\n <div class=\"agg-label\">{{ agg.label }}</div>\n <div class=\"agg-details\">\n <span class=\"agg-type\">\n <i [class]=\"agg.displayType === 'card' ? 'fa-solid fa-id-card' : 'fa-solid fa-table-columns'\"></i>\n {{ agg.displayType === 'card' ? 'Card' : 'Column Footer' }}\n </span>\n @if (agg.smartPrompt) {\n <span class=\"agg-smart-badge\" title=\"AI-generated\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n </span>\n }\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"agg-actions\">\n <button\n class=\"agg-action-btn\"\n [disabled]=\"i === 0 || !canEdit\"\n (click)=\"moveAggregateUp(agg)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button\n class=\"agg-action-btn\"\n [disabled]=\"i === aggregates.length - 1 || !canEdit\"\n (click)=\"moveAggregateDown(agg)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n <button\n class=\"agg-action-btn toggle-btn\"\n [class.enabled]=\"agg.enabled !== false\"\n (click)=\"toggleAggregateEnabled(agg, $event)\"\n [disabled]=\"!canEdit\"\n [title]=\"agg.enabled !== false ? 'Disable' : 'Enable'\">\n <i [class]=\"agg.enabled !== false ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'\"></i>\n </button>\n <button\n class=\"agg-action-btn edit-btn\"\n (click)=\"editAggregate(agg)\"\n [disabled]=\"!canEdit\"\n title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button\n class=\"agg-action-btn remove-btn\"\n (click)=\"removeAggregate(agg)\"\n [disabled]=\"!canEdit\"\n title=\"Remove\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Summary -->\n <div class=\"aggregates-summary\">\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-id-card\"></i>\n <span>{{ cardAggregates.length }} card{{ cardAggregates.length !== 1 ? 's' : '' }}</span>\n </div>\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-table-columns\"></i>\n <span>{{ columnAggregates.length }} column footer{{ columnAggregates.length !== 1 ? 's' : '' }}</span>\n </div>\n </div>\n } @else {\n <div class=\"aggregates-empty-state\">\n <i class=\"fa-solid fa-chart-simple\"></i>\n <span>No aggregates configured</span>\n <p class=\"empty-hint\">Click \"Add Aggregate\" to create summary calculations</p>\n </div>\n }\n\n <!-- Info Tip -->\n <div class=\"aggregates-tip\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>Aggregates are calculated server-side for accuracy with filtered/paginated data.</span>\n </div>\n </div>\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 [class.invalid]=\"!viewName || !viewName.trim()\"\n placeholder=\"Enter view name...\"\n [(ngModel)]=\"viewName\"\n [disabled]=\"!canEdit\"\n />\n @if (!viewName || !viewName.trim()) {\n <span class=\"validation-error\">View name is required</span>\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 <!-- Validation Errors Banner -->\n @if (ValidationErrors.length > 0 && visibleColumns.length === 0) {\n <div class=\"validation-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n <span>At least one column must be visible</span>\n </div>\n }\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 || !IsValid\">\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 }\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\n<!-- Aggregate Setup Dialog -->\n<mj-aggregate-setup-dialog\n [Entity]=\"entity\"\n [Aggregate]=\"editingAggregate\"\n [IsOpen]=\"showAggregateDialog\"\n (Close)=\"closeAggregateDialog()\"\n (Save)=\"onAggregateSave($event)\">\n</mj-aggregate-setup-dialog>\n\n<!-- Delete Confirmation Dialog -->\n<mj-ev-confirm-dialog\n [IsOpen]=\"showDeleteConfirm\"\n Title=\"Delete View\"\n [Message]=\"'Are you sure you want to delete \\'' + viewName + '\\'?'\"\n DetailMessage=\"This action cannot be undone. All users who have access to this view will lose it.\"\n ConfirmText=\"Delete\"\n ConfirmStyle=\"danger\"\n Icon=\"fa-solid fa-trash\"\n (Confirmed)=\"OnDeleteConfirmed()\"\n (Cancelled)=\"OnDeleteCancelled()\">\n</mj-ev-confirm-dialog>\n\n<!-- Filter Mode Switch Confirmation Dialog (BUG-006) -->\n<mj-ev-confirm-dialog\n [IsOpen]=\"showFilterModeSwitchConfirm\"\n Title=\"Switch Filter Mode\"\n [Message]=\"filterMode === 'smart' ? 'Switching to Traditional mode will clear your smart filter prompt.' : 'Switching to Smart mode will clear your traditional filter rules.'\"\n DetailMessage=\"You can switch back later, but the current filter data will be lost.\"\n ConfirmText=\"Switch\"\n ConfirmStyle=\"primary\"\n Icon=\"fa-solid fa-exchange-alt\"\n (Confirmed)=\"OnFilterModeSwitchConfirmed()\"\n (Cancelled)=\"OnFilterModeSwitchCancelled()\">\n</mj-ev-confirm-dialog>\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: 450px;\n min-width: 360px;\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.tab-badge {\n background: #1976d2;\n color: white;\n font-size: 10px;\n font-weight: 600;\n padding: 2px 6px;\n border-radius: 8px;\n margin-left: 4px;\n}\n\n/* Icon-only mode for narrow panels */\n.tab-nav.icon-only .tab-btn {\n padding: 12px 8px;\n gap: 4px;\n}\n\n.tab-nav.icon-only .tab-btn i {\n font-size: 14px;\n}\n\n.tab-nav.icon-only .tab-badge {\n margin-left: 0;\n padding: 2px 4px;\n font-size: 9px;\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/* ========================================\n MULTI-SORT CONFIGURATION\n ======================================== */\n\n.add-sort-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: transparent;\n color: #666;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n width: 100%;\n justify-content: center;\n margin-bottom: 12px;\n}\n\n.add-sort-btn:hover:not(:disabled) {\n border-color: #1976d2;\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.add-sort-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.add-sort-btn i {\n font-size: 12px;\n}\n\n/* Sort Items List */\n.sort-items-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n/* Sort Item */\n.sort-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n transition: all 0.15s ease;\n}\n\n.sort-item:hover {\n border-color: #bdbdbd;\n background: #fafafa;\n}\n\n.sort-item.dragging {\n opacity: 0.5;\n background: #e3f2fd;\n border-color: #1976d2;\n}\n\n.sort-item.drop-target {\n border-color: #1976d2;\n}\n\n/* Priority Badge */\n.sort-priority-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 6px;\n font-size: 12px;\n font-weight: 700;\n color: white;\n background: linear-gradient(135deg, #1976d2 0%, #42a5f5 100%);\n border-radius: 12px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n flex-shrink: 0;\n}\n\n/* Drag Handle */\n.sort-drag-handle {\n color: #bdbdbd;\n cursor: grab;\n padding: 4px;\n transition: color 0.15s ease;\n flex-shrink: 0;\n}\n\n.sort-drag-handle:hover {\n color: #757575;\n}\n\n.sort-item.dragging .sort-drag-handle {\n cursor: grabbing;\n color: #1976d2;\n}\n\n/* Sort Field Dropdown */\n.sort-field-dropdown {\n flex: 1;\n min-width: 120px;\n padding: 8px 10px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 13px;\n background: white;\n cursor: pointer;\n}\n\n.sort-field-dropdown:focus {\n outline: none;\n border-color: #1976d2;\n}\n\n.sort-field-dropdown:disabled {\n background: #f5f5f5;\n color: #999;\n cursor: not-allowed;\n}\n\n/* Sort Remove Button */\n.sort-remove-btn {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: #bdbdbd;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.sort-remove-btn:hover:not(:disabled) {\n background: #ffebee;\n color: #c62828;\n}\n\n.sort-remove-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n/* Sort Drop Indicator */\n.sort-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: sortDropIndicatorPulse 0.8s ease-in-out infinite;\n}\n\n@keyframes sortDropIndicatorPulse {\n 0%, 100% { opacity: 1; transform: scaleX(1); }\n 50% { opacity: 0.7; transform: scaleX(0.98); }\n}\n\n/* Sort Hint */\n.sort-hint {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 10px 12px;\n background: #f5f7fa;\n border-radius: 6px;\n font-size: 12px;\n color: #666;\n}\n\n.sort-hint i {\n color: #1976d2;\n margin-top: 1px;\n flex-shrink: 0;\n}\n\n/* Sorting Section Styles */\n.sorting-section {\n padding-top: 0;\n}\n\n.sorting-header {\n margin-bottom: 16px;\n}\n\n.sorting-description {\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n margin: 0;\n}\n\n/* Sort Empty State */\n.sort-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px 20px;\n color: #999;\n font-size: 14px;\n text-align: center;\n}\n\n.sort-empty-state i {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: 8px;\n}\n\n.sort-empty-hint {\n font-size: 12px;\n color: #bbb;\n margin: 0;\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 gap: 8px;\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/* ========================================\n AGGREGATES TAB STYLES\n ======================================== */\n\n.aggregates-section {\n padding-top: 0;\n}\n\n.aggregates-header {\n margin-bottom: 16px;\n}\n\n.aggregates-description {\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n margin: 0;\n}\n\n/* Add Aggregate Button */\n.add-aggregate-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border: 1px dashed #ccc;\n border-radius: 8px;\n background: transparent;\n color: #666;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n width: 100%;\n justify-content: center;\n margin-bottom: 16px;\n}\n\n.add-aggregate-btn:hover:not(:disabled) {\n border-color: #1976d2;\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.add-aggregate-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.add-aggregate-btn i {\n font-size: 12px;\n}\n\n/* Aggregates List */\n.aggregates-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 16px;\n}\n\n/* Aggregate Item */\n.aggregate-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 14px;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n transition: all 0.15s ease;\n}\n\n.aggregate-item:hover {\n border-color: #bdbdbd;\n background: #fafafa;\n}\n\n.aggregate-item.disabled {\n opacity: 0.6;\n background: #f5f5f5;\n}\n\n/* Aggregate Icon */\n.agg-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);\n border-radius: 8px;\n color: #1976d2;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.aggregate-item.disabled .agg-icon {\n background: #f0f0f0;\n color: #999;\n}\n\n/* Aggregate Content */\n.agg-content {\n flex: 1;\n min-width: 0;\n}\n\n.agg-label {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 2px;\n}\n\n.aggregate-item.disabled .agg-label {\n color: #888;\n}\n\n.agg-details {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n color: #888;\n}\n\n.agg-type {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.agg-type i {\n font-size: 10px;\n}\n\n.agg-smart-badge {\n display: flex;\n align-items: center;\n padding: 2px 6px;\n background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%);\n border-radius: 4px;\n color: #3b82f6;\n font-size: 10px;\n}\n\n/* Aggregate Actions */\n.agg-actions {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.agg-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 display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.agg-action-btn:hover:not(:disabled) {\n background: #e0e0e0;\n color: #333;\n}\n\n.agg-action-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.agg-action-btn.toggle-btn.enabled {\n color: #2e7d32;\n}\n\n.agg-action-btn.toggle-btn:not(.enabled) {\n color: #bdbdbd;\n}\n\n.agg-action-btn.edit-btn:hover:not(:disabled) {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.agg-action-btn.remove-btn:hover:not(:disabled) {\n background: #ffebee;\n color: #c62828;\n}\n\n/* Aggregates Summary */\n.aggregates-summary {\n display: flex;\n gap: 16px;\n padding: 12px 14px;\n background: #f5f7fa;\n border-radius: 6px;\n margin-bottom: 16px;\n}\n\n.summary-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: #666;\n}\n\n.summary-item i {\n color: #1976d2;\n font-size: 11px;\n}\n\n/* Aggregates Empty State */\n.aggregates-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 40px 20px;\n color: #999;\n font-size: 14px;\n text-align: center;\n}\n\n.aggregates-empty-state i {\n font-size: 48px;\n opacity: 0.4;\n margin-bottom: 8px;\n}\n\n.empty-hint {\n font-size: 12px;\n color: #bbb;\n margin: 0;\n}\n\n/* Aggregates Tip */\n.aggregates-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.aggregates-tip i {\n color: #94a3b8;\n margin-top: 1px;\n flex-shrink: 0;\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\n/* Validation Styles (BUG-004) */\n.form-input.invalid {\n border-color: #ef4444;\n}\n\n.validation-error {\n display: block;\n font-size: 12px;\n color: #ef4444;\n margin-top: 4px;\n}\n\n.validation-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: #fef2f2;\n border-top: 1px solid #fecaca;\n color: #dc2626;\n font-size: 13px;\n}\n\n.validation-banner i {\n flex-shrink: 0;\n}\n\n/* Duplicate Button (F-005) */\n.footer-btn.duplicate-btn {\n background: #f3f4f6;\n color: #374151;\n border: 1px solid #d1d5db;\n}\n\n.footer-btn.duplicate-btn:hover {\n background: #e5e7eb;\n border-color: #9ca3af;\n}\n"] }]
|
|
2690
2821
|
}], () => [{ type: i0.ChangeDetectorRef }], { entity: [{
|
|
2691
2822
|
type: Input
|
|
2692
2823
|
}], viewEntity: [{
|
|
@@ -2709,11 +2840,15 @@ export class ViewConfigPanelComponent {
|
|
|
2709
2840
|
type: Output
|
|
2710
2841
|
}], externalFilterState: [{
|
|
2711
2842
|
type: Input
|
|
2843
|
+
}], DefaultSaveAsNew: [{
|
|
2844
|
+
type: Input
|
|
2845
|
+
}], duplicate: [{
|
|
2846
|
+
type: Output
|
|
2712
2847
|
}], isSaving: [{
|
|
2713
2848
|
type: Input
|
|
2714
2849
|
}], handleEscape: [{
|
|
2715
2850
|
type: HostListener,
|
|
2716
2851
|
args: ['document:keydown.escape']
|
|
2717
2852
|
}] }); })();
|
|
2718
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ViewConfigPanelComponent, { className: "ViewConfigPanelComponent", filePath: "src/lib/view-config-panel/view-config-panel.component.ts", lineNumber:
|
|
2853
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ViewConfigPanelComponent, { className: "ViewConfigPanelComponent", filePath: "src/lib/view-config-panel/view-config-panel.component.ts", lineNumber: 90 }); })();
|
|
2719
2854
|
//# sourceMappingURL=view-config-panel.component.js.map
|