@memberjunction/ng-entity-viewer 5.42.0 → 5.44.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/aggregate-panel/aggregate-panel.component.d.ts +5 -0
- package/dist/lib/aggregate-panel/aggregate-panel.component.d.ts.map +1 -1
- package/dist/lib/aggregate-panel/aggregate-panel.component.js +45 -47
- package/dist/lib/aggregate-panel/aggregate-panel.component.js.map +1 -1
- package/dist/lib/entity-cards/entity-cards.component.js +7 -10
- package/dist/lib/entity-cards/entity-cards.component.js.map +1 -1
- package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts +42 -2
- package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts.map +1 -1
- package/dist/lib/entity-data-grid/entity-data-grid.component.js +256 -141
- package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -1
- package/dist/lib/entity-data-grid/models/grid-types.d.ts +8 -1
- package/dist/lib/entity-data-grid/models/grid-types.d.ts.map +1 -1
- package/dist/lib/entity-data-grid/models/grid-types.js.map +1 -1
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts +0 -4
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts.map +1 -1
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js +166 -207
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.js.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts +109 -5
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.js +287 -42
- package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -1
- package/dist/lib/recycle-bin/recycle-bin.component.js +21 -44
- package/dist/lib/recycle-bin/recycle-bin.component.js.map +1 -1
- package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.js +19 -20
- package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.js.map +1 -1
- package/dist/lib/view-config-panel/view-config-panel.component.js +268 -301
- package/dist/lib/view-config-panel/view-config-panel.component.js.map +1 -1
- package/dist/lib/view-selector/view-selector.component.d.ts +26 -1
- package/dist/lib/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/lib/view-selector/view-selector.component.js +118 -76
- package/dist/lib/view-selector/view-selector.component.js.map +1 -1
- package/dist/lib/view-types/descriptors/grid-view-type.d.ts +7 -0
- package/dist/lib/view-types/descriptors/grid-view-type.d.ts.map +1 -1
- package/dist/lib/view-types/descriptors/grid-view-type.js +7 -0
- package/dist/lib/view-types/descriptors/grid-view-type.js.map +1 -1
- package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts +24 -1
- package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/grid-view-renderer.component.js +39 -4
- package/dist/lib/view-types/renderers/grid-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/renderers/map-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/map-view-renderer.component.js +11 -14
- package/dist/lib/view-types/renderers/map-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/renderers/timeline-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/timeline-view-renderer.component.js +12 -14
- package/dist/lib/view-types/renderers/timeline-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/view-type.contracts.d.ts +44 -0
- package/dist/lib/view-types/view-type.contracts.d.ts.map +1 -1
- package/dist/lib/view-types/view-type.contracts.js +6 -0
- package/dist/lib/view-types/view-type.contracts.js.map +1 -1
- package/dist/lib/view-workspace/view-workspace.component.d.ts +32 -1
- package/dist/lib/view-workspace/view-workspace.component.d.ts.map +1 -1
- package/dist/lib/view-workspace/view-workspace.component.js +68 -7
- package/dist/lib/view-workspace/view-workspace.component.js.map +1 -1
- package/dist/module.d.ts +2 -1
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +20 -4
- package/dist/module.js.map +1 -1
- package/package.json +18 -15
- package/dist/__tests__/entity-cards-selection.test.d.ts +0 -2
- package/dist/__tests__/entity-cards-selection.test.d.ts.map +0 -1
- package/dist/__tests__/entity-cards-selection.test.js +0 -149
- package/dist/__tests__/entity-cards-selection.test.js.map +0 -1
- package/dist/__tests__/entity-cards-viewmodel.test.d.ts +0 -2
- package/dist/__tests__/entity-cards-viewmodel.test.d.ts.map +0 -1
- package/dist/__tests__/entity-cards-viewmodel.test.js +0 -208
- package/dist/__tests__/entity-cards-viewmodel.test.js.map +0 -1
- package/dist/__tests__/highlight.test.d.ts +0 -2
- package/dist/__tests__/highlight.test.d.ts.map +0 -1
- package/dist/__tests__/highlight.test.js +0 -67
- package/dist/__tests__/highlight.test.js.map +0 -1
- package/dist/__tests__/index.test.d.ts +0 -2
- package/dist/__tests__/index.test.d.ts.map +0 -1
- package/dist/__tests__/index.test.js +0 -7
- package/dist/__tests__/index.test.js.map +0 -1
- package/dist/__tests__/view-types.test.d.ts +0 -2
- package/dist/__tests__/view-types.test.d.ts.map +0 -1
- package/dist/__tests__/view-types.test.js +0 -102
- package/dist/__tests__/view-types.test.js.map +0 -1
|
@@ -4,8 +4,9 @@ import { DEFAULT_AGGREGATE_DISPLAY, UserInfoEngine } from '@memberjunction/core-
|
|
|
4
4
|
import { createEmptyFilter } from '@memberjunction/ng-filter-builder';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
import * as i1 from "@angular/forms";
|
|
7
|
-
import * as i2 from "
|
|
8
|
-
import * as i3 from "../
|
|
7
|
+
import * as i2 from "@memberjunction/ng-ui-components";
|
|
8
|
+
import * as i3 from "../aggregate-setup-dialog/aggregate-setup-dialog.component";
|
|
9
|
+
import * as i4 from "../confirm-dialog/confirm-dialog.component";
|
|
9
10
|
const _forTrack0 = ($index, $item) => $item.fieldId;
|
|
10
11
|
const _forTrack1 = ($index, $item) => $item.ID;
|
|
11
12
|
const _forTrack2 = ($index, $item) => $item.id;
|
|
@@ -73,50 +74,50 @@ function ViewConfigPanelComponent_Conditional_26_Template(rf, ctx) { if (rf & 1)
|
|
|
73
74
|
i0.ɵɵconditional(!ctx_r1.IsIconOnlyMode ? 2 : -1);
|
|
74
75
|
} }
|
|
75
76
|
function ViewConfigPanelComponent_Conditional_28_For_10_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
76
|
-
i0.ɵɵelement(0, "div",
|
|
77
|
+
i0.ɵɵelement(0, "div", 41);
|
|
77
78
|
} }
|
|
78
79
|
function ViewConfigPanelComponent_Conditional_28_For_10_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
79
|
-
i0.ɵɵelement(0, "i",
|
|
80
|
+
i0.ɵɵelement(0, "i", 46);
|
|
80
81
|
} if (rf & 2) {
|
|
81
82
|
const column_r5 = i0.ɵɵnextContext().$implicit;
|
|
82
83
|
i0.ɵɵproperty("title", i0.ɵɵinterpolate1("Custom name: ", column_r5.userDisplayName));
|
|
83
84
|
} }
|
|
84
85
|
function ViewConfigPanelComponent_Conditional_28_For_10_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
85
|
-
i0.ɵɵelement(0, "i",
|
|
86
|
+
i0.ɵɵelement(0, "i", 47);
|
|
86
87
|
} }
|
|
87
88
|
function ViewConfigPanelComponent_Conditional_28_For_10_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
88
|
-
i0.ɵɵelement(0, "div",
|
|
89
|
+
i0.ɵɵelement(0, "div", 41);
|
|
89
90
|
} }
|
|
90
91
|
function ViewConfigPanelComponent_Conditional_28_For_10_Template(rf, ctx) { if (rf & 1) {
|
|
91
92
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
92
|
-
i0.ɵɵconditionalCreate(0, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_0_Template, 1, 0, "div",
|
|
93
|
-
i0.ɵɵelementStart(1, "div",
|
|
93
|
+
i0.ɵɵconditionalCreate(0, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_0_Template, 1, 0, "div", 41);
|
|
94
|
+
i0.ɵɵelementStart(1, "div", 42);
|
|
94
95
|
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",
|
|
96
|
-
i0.ɵɵelement(3, "i",
|
|
96
|
+
i0.ɵɵelementStart(2, "div", 43);
|
|
97
|
+
i0.ɵɵelement(3, "i", 44);
|
|
97
98
|
i0.ɵɵelementEnd();
|
|
98
|
-
i0.ɵɵelementStart(4, "span",
|
|
99
|
+
i0.ɵɵelementStart(4, "span", 45);
|
|
99
100
|
i0.ɵɵtext(5);
|
|
100
|
-
i0.ɵɵconditionalCreate(6, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_6_Template, 1, 2, "i",
|
|
101
|
-
i0.ɵɵconditionalCreate(7, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_7_Template, 1, 0, "i",
|
|
101
|
+
i0.ɵɵconditionalCreate(6, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_6_Template, 1, 2, "i", 46);
|
|
102
|
+
i0.ɵɵconditionalCreate(7, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_7_Template, 1, 0, "i", 47);
|
|
102
103
|
i0.ɵɵelementEnd();
|
|
103
|
-
i0.ɵɵelementStart(8, "div",
|
|
104
|
+
i0.ɵɵelementStart(8, "div", 48)(9, "button", 49);
|
|
104
105
|
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",
|
|
106
|
+
i0.ɵɵelement(10, "i", 50);
|
|
106
107
|
i0.ɵɵelementEnd();
|
|
107
|
-
i0.ɵɵelementStart(11, "button",
|
|
108
|
+
i0.ɵɵelementStart(11, "button", 51);
|
|
108
109
|
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",
|
|
110
|
+
i0.ɵɵelement(12, "i", 52);
|
|
110
111
|
i0.ɵɵelementEnd();
|
|
111
|
-
i0.ɵɵelementStart(13, "button",
|
|
112
|
+
i0.ɵɵelementStart(13, "button", 53);
|
|
112
113
|
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",
|
|
114
|
+
i0.ɵɵelement(14, "i", 54);
|
|
114
115
|
i0.ɵɵelementEnd();
|
|
115
|
-
i0.ɵɵelementStart(15, "button",
|
|
116
|
+
i0.ɵɵelementStart(15, "button", 55);
|
|
116
117
|
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
118
|
i0.ɵɵelement(16, "i", 36);
|
|
118
119
|
i0.ɵɵelementEnd()()();
|
|
119
|
-
i0.ɵɵconditionalCreate(17, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_17_Template, 1, 0, "div",
|
|
120
|
+
i0.ɵɵconditionalCreate(17, ViewConfigPanelComponent_Conditional_28_For_10_Conditional_17_Template, 1, 0, "div", 41);
|
|
120
121
|
} if (rf & 2) {
|
|
121
122
|
const column_r5 = ctx.$implicit;
|
|
122
123
|
const ɵ$index_93_r6 = ctx.$index;
|
|
@@ -138,11 +139,7 @@ function ViewConfigPanelComponent_Conditional_28_For_10_Template(rf, ctx) { if (
|
|
|
138
139
|
i0.ɵɵconditional(ctx_r1.IsDropAfter(column_r5) && ɵ$index_93_r6 === ctx_r1.VisibleColumns.length - 1 ? 17 : -1);
|
|
139
140
|
} }
|
|
140
141
|
function ViewConfigPanelComponent_Conditional_28_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
-
i0.ɵɵ
|
|
142
|
-
i0.ɵɵelement(1, "i", 55);
|
|
143
|
-
i0.ɵɵelementStart(2, "span");
|
|
144
|
-
i0.ɵɵtext(3, "No columns visible. Add columns from below.");
|
|
145
|
-
i0.ɵɵelementEnd()();
|
|
142
|
+
i0.ɵɵelement(0, "mj-empty-state", 35);
|
|
146
143
|
} }
|
|
147
144
|
function ViewConfigPanelComponent_Conditional_28_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
148
145
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
@@ -158,7 +155,7 @@ function ViewConfigPanelComponent_Conditional_28_Conditional_19_Template(rf, ctx
|
|
|
158
155
|
} }
|
|
159
156
|
function ViewConfigPanelComponent_Conditional_28_For_22_Template(rf, ctx) { if (rf & 1) {
|
|
160
157
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
161
|
-
i0.ɵɵelementStart(0, "div", 39)(1, "span",
|
|
158
|
+
i0.ɵɵelementStart(0, "div", 39)(1, "span", 45);
|
|
162
159
|
i0.ɵɵtext(2);
|
|
163
160
|
i0.ɵɵelementEnd();
|
|
164
161
|
i0.ɵɵelementStart(3, "button", 58);
|
|
@@ -171,11 +168,7 @@ function ViewConfigPanelComponent_Conditional_28_For_22_Template(rf, ctx) { if (
|
|
|
171
168
|
i0.ɵɵtextInterpolate(column_r9.displayName);
|
|
172
169
|
} }
|
|
173
170
|
function ViewConfigPanelComponent_Conditional_28_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
174
|
-
i0.ɵɵ
|
|
175
|
-
i0.ɵɵelement(1, "i", 60);
|
|
176
|
-
i0.ɵɵelementStart(2, "span");
|
|
177
|
-
i0.ɵɵtext(3, "All columns are visible");
|
|
178
|
-
i0.ɵɵelementEnd()();
|
|
171
|
+
i0.ɵɵelement(0, "mj-empty-state", 40);
|
|
179
172
|
} }
|
|
180
173
|
function ViewConfigPanelComponent_Conditional_28_Template(rf, ctx) { if (rf & 1) {
|
|
181
174
|
i0.ɵɵelementStart(0, "div", 18)(1, "div", 30)(2, "div", 31);
|
|
@@ -188,7 +181,7 @@ function ViewConfigPanelComponent_Conditional_28_Template(rf, ctx) { if (rf & 1)
|
|
|
188
181
|
i0.ɵɵelementEnd()();
|
|
189
182
|
i0.ɵɵelementStart(8, "div", 34);
|
|
190
183
|
i0.ɵɵrepeaterCreate(9, ViewConfigPanelComponent_Conditional_28_For_10_Template, 18, 11, null, null, _forTrack0);
|
|
191
|
-
i0.ɵɵconditionalCreate(11, ViewConfigPanelComponent_Conditional_28_Conditional_11_Template,
|
|
184
|
+
i0.ɵɵconditionalCreate(11, ViewConfigPanelComponent_Conditional_28_Conditional_11_Template, 1, 0, "mj-empty-state", 35);
|
|
192
185
|
i0.ɵɵelementEnd()();
|
|
193
186
|
i0.ɵɵelementStart(12, "div", 30)(13, "div", 31);
|
|
194
187
|
i0.ɵɵelement(14, "i", 36);
|
|
@@ -201,7 +194,7 @@ function ViewConfigPanelComponent_Conditional_28_Template(rf, ctx) { if (rf & 1)
|
|
|
201
194
|
i0.ɵɵconditionalCreate(19, ViewConfigPanelComponent_Conditional_28_Conditional_19_Template, 3, 1, "div", 37);
|
|
202
195
|
i0.ɵɵelementStart(20, "div", 38);
|
|
203
196
|
i0.ɵɵrepeaterCreate(21, ViewConfigPanelComponent_Conditional_28_For_22_Template, 5, 1, "div", 39, _forTrack0);
|
|
204
|
-
i0.ɵɵconditionalCreate(23, ViewConfigPanelComponent_Conditional_28_Conditional_23_Template,
|
|
197
|
+
i0.ɵɵconditionalCreate(23, ViewConfigPanelComponent_Conditional_28_Conditional_23_Template, 1, 0, "mj-empty-state", 40);
|
|
205
198
|
i0.ɵɵelementEnd()()();
|
|
206
199
|
} if (rf & 2) {
|
|
207
200
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -222,10 +215,10 @@ function ViewConfigPanelComponent_Conditional_28_Template(rf, ctx) { if (rf & 1)
|
|
|
222
215
|
} }
|
|
223
216
|
function ViewConfigPanelComponent_Conditional_29_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
224
217
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
225
|
-
i0.ɵɵelementStart(0, "div",
|
|
218
|
+
i0.ɵɵelementStart(0, "div", 69)(1, "small", 105);
|
|
226
219
|
i0.ɵɵtext(2);
|
|
227
220
|
i0.ɵɵelementEnd();
|
|
228
|
-
i0.ɵɵelementStart(3, "button",
|
|
221
|
+
i0.ɵɵelementStart(3, "button", 106);
|
|
229
222
|
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); });
|
|
230
223
|
i0.ɵɵelement(4, "i", 8);
|
|
231
224
|
i0.ɵɵelementEnd()();
|
|
@@ -235,7 +228,7 @@ function ViewConfigPanelComponent_Conditional_29_Conditional_16_Template(rf, ctx
|
|
|
235
228
|
i0.ɵɵtextInterpolate1("Original: ", ctx_r1.FormatEditingColumn.displayName);
|
|
236
229
|
} }
|
|
237
230
|
function ViewConfigPanelComponent_Conditional_29_For_26_Template(rf, ctx) { if (rf & 1) {
|
|
238
|
-
i0.ɵɵelementStart(0, "div",
|
|
231
|
+
i0.ɵɵelementStart(0, "div", 107);
|
|
239
232
|
i0.ɵɵtext(1);
|
|
240
233
|
i0.ɵɵelementEnd();
|
|
241
234
|
} if (rf & 2) {
|
|
@@ -247,27 +240,27 @@ function ViewConfigPanelComponent_Conditional_29_For_26_Template(rf, ctx) { if (
|
|
|
247
240
|
} }
|
|
248
241
|
function ViewConfigPanelComponent_Conditional_29_Conditional_49_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
249
242
|
const _r14 = i0.ɵɵgetCurrentView();
|
|
250
|
-
i0.ɵɵelementStart(0, "div",
|
|
243
|
+
i0.ɵɵelementStart(0, "div", 67)(1, "label");
|
|
251
244
|
i0.ɵɵtext(2, "Currency");
|
|
252
245
|
i0.ɵɵelementEnd();
|
|
253
|
-
i0.ɵɵelementStart(3, "select",
|
|
246
|
+
i0.ɵɵelementStart(3, "select", 76);
|
|
254
247
|
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",
|
|
248
|
+
i0.ɵɵelementStart(4, "option", 111);
|
|
256
249
|
i0.ɵɵtext(5, "USD ($)");
|
|
257
250
|
i0.ɵɵelementEnd();
|
|
258
|
-
i0.ɵɵelementStart(6, "option",
|
|
251
|
+
i0.ɵɵelementStart(6, "option", 112);
|
|
259
252
|
i0.ɵɵtext(7, "EUR (\u20AC)");
|
|
260
253
|
i0.ɵɵelementEnd();
|
|
261
|
-
i0.ɵɵelementStart(8, "option",
|
|
254
|
+
i0.ɵɵelementStart(8, "option", 113);
|
|
262
255
|
i0.ɵɵtext(9, "GBP (\u00A3)");
|
|
263
256
|
i0.ɵɵelementEnd();
|
|
264
|
-
i0.ɵɵelementStart(10, "option",
|
|
257
|
+
i0.ɵɵelementStart(10, "option", 114);
|
|
265
258
|
i0.ɵɵtext(11, "JPY (\u00A5)");
|
|
266
259
|
i0.ɵɵelementEnd();
|
|
267
|
-
i0.ɵɵelementStart(12, "option",
|
|
260
|
+
i0.ɵɵelementStart(12, "option", 115);
|
|
268
261
|
i0.ɵɵtext(13, "CAD ($)");
|
|
269
262
|
i0.ɵɵelementEnd();
|
|
270
|
-
i0.ɵɵelementStart(14, "option",
|
|
263
|
+
i0.ɵɵelementStart(14, "option", 116);
|
|
271
264
|
i0.ɵɵtext(15, "AUD ($)");
|
|
272
265
|
i0.ɵɵelementEnd()()();
|
|
273
266
|
} if (rf & 2) {
|
|
@@ -277,22 +270,22 @@ function ViewConfigPanelComponent_Conditional_29_Conditional_49_Conditional_9_Te
|
|
|
277
270
|
} }
|
|
278
271
|
function ViewConfigPanelComponent_Conditional_29_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
279
272
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
280
|
-
i0.ɵɵelementStart(0, "div",
|
|
281
|
-
i0.ɵɵelement(2, "i",
|
|
273
|
+
i0.ɵɵelementStart(0, "div", 64)(1, "div", 65);
|
|
274
|
+
i0.ɵɵelement(2, "i", 108);
|
|
282
275
|
i0.ɵɵelementStart(3, "span");
|
|
283
276
|
i0.ɵɵtext(4, "Number Options");
|
|
284
277
|
i0.ɵɵelementEnd()();
|
|
285
|
-
i0.ɵɵelementStart(5, "div",
|
|
278
|
+
i0.ɵɵelementStart(5, "div", 67)(6, "label");
|
|
286
279
|
i0.ɵɵtext(7, "Decimal Places");
|
|
287
280
|
i0.ɵɵelementEnd();
|
|
288
|
-
i0.ɵɵelementStart(8, "input",
|
|
281
|
+
i0.ɵɵelementStart(8, "input", 109);
|
|
289
282
|
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); });
|
|
290
283
|
i0.ɵɵelementEnd()();
|
|
291
|
-
i0.ɵɵconditionalCreate(9, ViewConfigPanelComponent_Conditional_29_Conditional_49_Conditional_9_Template, 16, 1, "div",
|
|
292
|
-
i0.ɵɵelementStart(10, "div",
|
|
284
|
+
i0.ɵɵconditionalCreate(9, ViewConfigPanelComponent_Conditional_29_Conditional_49_Conditional_9_Template, 16, 1, "div", 67);
|
|
285
|
+
i0.ɵɵelementStart(10, "div", 67)(11, "label");
|
|
293
286
|
i0.ɵɵtext(12, "Thousands Separator");
|
|
294
287
|
i0.ɵɵelementEnd();
|
|
295
|
-
i0.ɵɵelementStart(13, "input",
|
|
288
|
+
i0.ɵɵelementStart(13, "input", 110);
|
|
296
289
|
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); });
|
|
297
290
|
i0.ɵɵelementEnd()()();
|
|
298
291
|
} if (rf & 2) {
|
|
@@ -306,32 +299,32 @@ function ViewConfigPanelComponent_Conditional_29_Conditional_49_Template(rf, ctx
|
|
|
306
299
|
} }
|
|
307
300
|
function ViewConfigPanelComponent_Conditional_29_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
308
301
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
309
|
-
i0.ɵɵelementStart(0, "div",
|
|
310
|
-
i0.ɵɵelement(2, "i",
|
|
302
|
+
i0.ɵɵelementStart(0, "div", 64)(1, "div", 65);
|
|
303
|
+
i0.ɵɵelement(2, "i", 117);
|
|
311
304
|
i0.ɵɵelementStart(3, "span");
|
|
312
305
|
i0.ɵɵtext(4, "Date Options");
|
|
313
306
|
i0.ɵɵelementEnd()();
|
|
314
|
-
i0.ɵɵelementStart(5, "div",
|
|
307
|
+
i0.ɵɵelementStart(5, "div", 67)(6, "label");
|
|
315
308
|
i0.ɵɵtext(7, "Format");
|
|
316
309
|
i0.ɵɵelementEnd();
|
|
317
|
-
i0.ɵɵelementStart(8, "select",
|
|
310
|
+
i0.ɵɵelementStart(8, "select", 76);
|
|
318
311
|
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",
|
|
312
|
+
i0.ɵɵelementStart(9, "option", 118);
|
|
320
313
|
i0.ɵɵtext(10, "Short (1/15/25)");
|
|
321
314
|
i0.ɵɵelementEnd();
|
|
322
|
-
i0.ɵɵelementStart(11, "option",
|
|
315
|
+
i0.ɵɵelementStart(11, "option", 119);
|
|
323
316
|
i0.ɵɵtext(12, "Short + Day (Wed, 1/15/25)");
|
|
324
317
|
i0.ɵɵelementEnd();
|
|
325
|
-
i0.ɵɵelementStart(13, "option",
|
|
318
|
+
i0.ɵɵelementStart(13, "option", 120);
|
|
326
319
|
i0.ɵɵtext(14, "Medium (Jan 15, 2025)");
|
|
327
320
|
i0.ɵɵelementEnd();
|
|
328
|
-
i0.ɵɵelementStart(15, "option",
|
|
321
|
+
i0.ɵɵelementStart(15, "option", 121);
|
|
329
322
|
i0.ɵɵtext(16, "Medium + Day (Wed, Jan 15, 2025)");
|
|
330
323
|
i0.ɵɵelementEnd();
|
|
331
|
-
i0.ɵɵelementStart(17, "option",
|
|
324
|
+
i0.ɵɵelementStart(17, "option", 122);
|
|
332
325
|
i0.ɵɵtext(18, "Long (January 15, 2025)");
|
|
333
326
|
i0.ɵɵelementEnd();
|
|
334
|
-
i0.ɵɵelementStart(19, "option",
|
|
327
|
+
i0.ɵɵelementStart(19, "option", 123);
|
|
335
328
|
i0.ɵɵtext(20, "Long + Day (Wednesday, January 15, 2025)");
|
|
336
329
|
i0.ɵɵelementEnd()()()();
|
|
337
330
|
} if (rf & 2) {
|
|
@@ -341,35 +334,35 @@ function ViewConfigPanelComponent_Conditional_29_Conditional_50_Template(rf, ctx
|
|
|
341
334
|
} }
|
|
342
335
|
function ViewConfigPanelComponent_Conditional_29_Conditional_51_Template(rf, ctx) { if (rf & 1) {
|
|
343
336
|
const _r16 = i0.ɵɵgetCurrentView();
|
|
344
|
-
i0.ɵɵelementStart(0, "div",
|
|
345
|
-
i0.ɵɵelement(2, "i",
|
|
337
|
+
i0.ɵɵelementStart(0, "div", 64)(1, "div", 65);
|
|
338
|
+
i0.ɵɵelement(2, "i", 124);
|
|
346
339
|
i0.ɵɵelementStart(3, "span");
|
|
347
340
|
i0.ɵɵtext(4, "Boolean Options");
|
|
348
341
|
i0.ɵɵelementEnd()();
|
|
349
|
-
i0.ɵɵelementStart(5, "div",
|
|
342
|
+
i0.ɵɵelementStart(5, "div", 67)(6, "label");
|
|
350
343
|
i0.ɵɵtext(7, "True Label");
|
|
351
344
|
i0.ɵɵelementEnd();
|
|
352
|
-
i0.ɵɵelementStart(8, "input",
|
|
345
|
+
i0.ɵɵelementStart(8, "input", 125);
|
|
353
346
|
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); });
|
|
354
347
|
i0.ɵɵelementEnd()();
|
|
355
|
-
i0.ɵɵelementStart(9, "div",
|
|
348
|
+
i0.ɵɵelementStart(9, "div", 67)(10, "label");
|
|
356
349
|
i0.ɵɵtext(11, "False Label");
|
|
357
350
|
i0.ɵɵelementEnd();
|
|
358
|
-
i0.ɵɵelementStart(12, "input",
|
|
351
|
+
i0.ɵɵelementStart(12, "input", 126);
|
|
359
352
|
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); });
|
|
360
353
|
i0.ɵɵelementEnd()();
|
|
361
|
-
i0.ɵɵelementStart(13, "div",
|
|
354
|
+
i0.ɵɵelementStart(13, "div", 67)(14, "label");
|
|
362
355
|
i0.ɵɵtext(15, "Display As");
|
|
363
356
|
i0.ɵɵelementEnd();
|
|
364
|
-
i0.ɵɵelementStart(16, "select",
|
|
357
|
+
i0.ɵɵelementStart(16, "select", 76);
|
|
365
358
|
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",
|
|
359
|
+
i0.ɵɵelementStart(17, "option", 78);
|
|
367
360
|
i0.ɵɵtext(18, "Text");
|
|
368
361
|
i0.ɵɵelementEnd();
|
|
369
|
-
i0.ɵɵelementStart(19, "option",
|
|
362
|
+
i0.ɵɵelementStart(19, "option", 127);
|
|
370
363
|
i0.ɵɵtext(20, "Checkbox");
|
|
371
364
|
i0.ɵɵelementEnd();
|
|
372
|
-
i0.ɵɵelementStart(21, "option",
|
|
365
|
+
i0.ɵɵelementStart(21, "option", 128);
|
|
373
366
|
i0.ɵɵtext(22, "Icon");
|
|
374
367
|
i0.ɵɵelementEnd()()()();
|
|
375
368
|
} if (rf & 2) {
|
|
@@ -383,148 +376,148 @@ function ViewConfigPanelComponent_Conditional_29_Conditional_51_Template(rf, ctx
|
|
|
383
376
|
} }
|
|
384
377
|
function ViewConfigPanelComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
|
|
385
378
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
386
|
-
i0.ɵɵelementStart(0, "div", 19)(1, "div",
|
|
379
|
+
i0.ɵɵelementStart(0, "div", 19)(1, "div", 60)(2, "button", 61);
|
|
387
380
|
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",
|
|
381
|
+
i0.ɵɵelement(3, "i", 62);
|
|
389
382
|
i0.ɵɵelementEnd();
|
|
390
|
-
i0.ɵɵelementStart(4, "div",
|
|
383
|
+
i0.ɵɵelementStart(4, "div", 63)(5, "span");
|
|
391
384
|
i0.ɵɵtext(6);
|
|
392
385
|
i0.ɵɵelementEnd()()();
|
|
393
|
-
i0.ɵɵelementStart(7, "div",
|
|
394
|
-
i0.ɵɵelement(9, "i",
|
|
386
|
+
i0.ɵɵelementStart(7, "div", 64)(8, "div", 65);
|
|
387
|
+
i0.ɵɵelement(9, "i", 66);
|
|
395
388
|
i0.ɵɵelementStart(10, "span");
|
|
396
389
|
i0.ɵɵtext(11, "Column Name");
|
|
397
390
|
i0.ɵɵelementEnd()();
|
|
398
|
-
i0.ɵɵelementStart(12, "div",
|
|
391
|
+
i0.ɵɵelementStart(12, "div", 67)(13, "label");
|
|
399
392
|
i0.ɵɵtext(14, "Display As");
|
|
400
393
|
i0.ɵɵelementEnd();
|
|
401
|
-
i0.ɵɵelementStart(15, "input",
|
|
394
|
+
i0.ɵɵelementStart(15, "input", 68);
|
|
402
395
|
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)); });
|
|
403
396
|
i0.ɵɵelementEnd()();
|
|
404
|
-
i0.ɵɵconditionalCreate(16, ViewConfigPanelComponent_Conditional_29_Conditional_16_Template, 5, 1, "div",
|
|
397
|
+
i0.ɵɵconditionalCreate(16, ViewConfigPanelComponent_Conditional_29_Conditional_16_Template, 5, 1, "div", 69);
|
|
405
398
|
i0.ɵɵelementEnd();
|
|
406
|
-
i0.ɵɵelementStart(17, "div",
|
|
399
|
+
i0.ɵɵelementStart(17, "div", 70)(18, "div", 71);
|
|
407
400
|
i0.ɵɵelement(19, "i", 32);
|
|
408
401
|
i0.ɵɵelementStart(20, "span");
|
|
409
402
|
i0.ɵɵtext(21, "Preview");
|
|
410
403
|
i0.ɵɵelementEnd()();
|
|
411
|
-
i0.ɵɵelementStart(22, "div",
|
|
404
|
+
i0.ɵɵelementStart(22, "div", 72)(23, "div", 73);
|
|
412
405
|
i0.ɵɵtext(24);
|
|
413
406
|
i0.ɵɵelementEnd();
|
|
414
|
-
i0.ɵɵrepeaterCreate(25, ViewConfigPanelComponent_Conditional_29_For_26_Template, 2, 13, "div",
|
|
407
|
+
i0.ɵɵrepeaterCreate(25, ViewConfigPanelComponent_Conditional_29_For_26_Template, 2, 13, "div", 74, i0.ɵɵrepeaterTrackByIndex);
|
|
415
408
|
i0.ɵɵelementEnd()();
|
|
416
|
-
i0.ɵɵelementStart(27, "div",
|
|
417
|
-
i0.ɵɵelement(29, "i",
|
|
409
|
+
i0.ɵɵelementStart(27, "div", 64)(28, "div", 65);
|
|
410
|
+
i0.ɵɵelement(29, "i", 75);
|
|
418
411
|
i0.ɵɵelementStart(30, "span");
|
|
419
412
|
i0.ɵɵtext(31, "Format Type");
|
|
420
413
|
i0.ɵɵelementEnd()();
|
|
421
|
-
i0.ɵɵelementStart(32, "select",
|
|
414
|
+
i0.ɵɵelementStart(32, "select", 76);
|
|
422
415
|
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",
|
|
416
|
+
i0.ɵɵelementStart(33, "option", 77);
|
|
424
417
|
i0.ɵɵtext(34, "Auto (Smart Default)");
|
|
425
418
|
i0.ɵɵelementEnd();
|
|
426
|
-
i0.ɵɵelementStart(35, "option",
|
|
419
|
+
i0.ɵɵelementStart(35, "option", 78);
|
|
427
420
|
i0.ɵɵtext(36, "Text");
|
|
428
421
|
i0.ɵɵelementEnd();
|
|
429
|
-
i0.ɵɵelementStart(37, "option",
|
|
422
|
+
i0.ɵɵelementStart(37, "option", 79);
|
|
430
423
|
i0.ɵɵtext(38, "Number");
|
|
431
424
|
i0.ɵɵelementEnd();
|
|
432
|
-
i0.ɵɵelementStart(39, "option",
|
|
425
|
+
i0.ɵɵelementStart(39, "option", 80);
|
|
433
426
|
i0.ɵɵtext(40, "Currency");
|
|
434
427
|
i0.ɵɵelementEnd();
|
|
435
|
-
i0.ɵɵelementStart(41, "option",
|
|
428
|
+
i0.ɵɵelementStart(41, "option", 81);
|
|
436
429
|
i0.ɵɵtext(42, "Percent");
|
|
437
430
|
i0.ɵɵelementEnd();
|
|
438
|
-
i0.ɵɵelementStart(43, "option",
|
|
431
|
+
i0.ɵɵelementStart(43, "option", 82);
|
|
439
432
|
i0.ɵɵtext(44, "Date");
|
|
440
433
|
i0.ɵɵelementEnd();
|
|
441
|
-
i0.ɵɵelementStart(45, "option",
|
|
434
|
+
i0.ɵɵelementStart(45, "option", 83);
|
|
442
435
|
i0.ɵɵtext(46, "Date & Time");
|
|
443
436
|
i0.ɵɵelementEnd();
|
|
444
|
-
i0.ɵɵelementStart(47, "option",
|
|
437
|
+
i0.ɵɵelementStart(47, "option", 84);
|
|
445
438
|
i0.ɵɵtext(48, "Boolean");
|
|
446
439
|
i0.ɵɵelementEnd()()();
|
|
447
|
-
i0.ɵɵconditionalCreate(49, ViewConfigPanelComponent_Conditional_29_Conditional_49_Template, 14, 3, "div",
|
|
448
|
-
i0.ɵɵconditionalCreate(50, ViewConfigPanelComponent_Conditional_29_Conditional_50_Template, 21, 1, "div",
|
|
449
|
-
i0.ɵɵconditionalCreate(51, ViewConfigPanelComponent_Conditional_29_Conditional_51_Template, 23, 3, "div",
|
|
450
|
-
i0.ɵɵelementStart(52, "div",
|
|
451
|
-
i0.ɵɵelement(54, "i",
|
|
440
|
+
i0.ɵɵconditionalCreate(49, ViewConfigPanelComponent_Conditional_29_Conditional_49_Template, 14, 3, "div", 64);
|
|
441
|
+
i0.ɵɵconditionalCreate(50, ViewConfigPanelComponent_Conditional_29_Conditional_50_Template, 21, 1, "div", 64);
|
|
442
|
+
i0.ɵɵconditionalCreate(51, ViewConfigPanelComponent_Conditional_29_Conditional_51_Template, 23, 3, "div", 64);
|
|
443
|
+
i0.ɵɵelementStart(52, "div", 64)(53, "div", 65);
|
|
444
|
+
i0.ɵɵelement(54, "i", 85);
|
|
452
445
|
i0.ɵɵelementStart(55, "span");
|
|
453
446
|
i0.ɵɵtext(56, "Alignment");
|
|
454
447
|
i0.ɵɵelementEnd()();
|
|
455
|
-
i0.ɵɵelementStart(57, "div",
|
|
448
|
+
i0.ɵɵelementStart(57, "div", 86)(58, "button", 87);
|
|
456
449
|
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",
|
|
450
|
+
i0.ɵɵelement(59, "i", 85);
|
|
458
451
|
i0.ɵɵelementEnd();
|
|
459
|
-
i0.ɵɵelementStart(60, "button",
|
|
452
|
+
i0.ɵɵelementStart(60, "button", 88);
|
|
460
453
|
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",
|
|
454
|
+
i0.ɵɵelement(61, "i", 89);
|
|
462
455
|
i0.ɵɵelementEnd();
|
|
463
|
-
i0.ɵɵelementStart(62, "button",
|
|
456
|
+
i0.ɵɵelementStart(62, "button", 90);
|
|
464
457
|
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",
|
|
458
|
+
i0.ɵɵelement(63, "i", 91);
|
|
466
459
|
i0.ɵɵelementEnd()()();
|
|
467
|
-
i0.ɵɵelementStart(64, "div",
|
|
468
|
-
i0.ɵɵelement(66, "i",
|
|
460
|
+
i0.ɵɵelementStart(64, "div", 64)(65, "div", 65);
|
|
461
|
+
i0.ɵɵelement(66, "i", 92);
|
|
469
462
|
i0.ɵɵelementStart(67, "span");
|
|
470
463
|
i0.ɵɵtext(68, "Header Style");
|
|
471
464
|
i0.ɵɵelementEnd()();
|
|
472
|
-
i0.ɵɵelementStart(69, "div",
|
|
465
|
+
i0.ɵɵelementStart(69, "div", 93)(70, "button", 94);
|
|
473
466
|
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",
|
|
467
|
+
i0.ɵɵelement(71, "i", 95);
|
|
475
468
|
i0.ɵɵelementEnd();
|
|
476
|
-
i0.ɵɵelementStart(72, "button",
|
|
469
|
+
i0.ɵɵelementStart(72, "button", 96);
|
|
477
470
|
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",
|
|
471
|
+
i0.ɵɵelement(73, "i", 97);
|
|
479
472
|
i0.ɵɵelementEnd();
|
|
480
|
-
i0.ɵɵelementStart(74, "button",
|
|
473
|
+
i0.ɵɵelementStart(74, "button", 98);
|
|
481
474
|
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",
|
|
475
|
+
i0.ɵɵelement(75, "i", 99);
|
|
483
476
|
i0.ɵɵelementEnd()();
|
|
484
|
-
i0.ɵɵelementStart(76, "div",
|
|
477
|
+
i0.ɵɵelementStart(76, "div", 67)(77, "label");
|
|
485
478
|
i0.ɵɵtext(78, "Text Color");
|
|
486
479
|
i0.ɵɵelementEnd();
|
|
487
|
-
i0.ɵɵelementStart(79, "input",
|
|
480
|
+
i0.ɵɵelementStart(79, "input", 100);
|
|
488
481
|
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)); });
|
|
489
482
|
i0.ɵɵelementEnd()();
|
|
490
|
-
i0.ɵɵelementStart(80, "div",
|
|
483
|
+
i0.ɵɵelementStart(80, "div", 67)(81, "label");
|
|
491
484
|
i0.ɵɵtext(82, "Background");
|
|
492
485
|
i0.ɵɵelementEnd();
|
|
493
|
-
i0.ɵɵelementStart(83, "input",
|
|
486
|
+
i0.ɵɵelementStart(83, "input", 100);
|
|
494
487
|
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)); });
|
|
495
488
|
i0.ɵɵelementEnd()()();
|
|
496
|
-
i0.ɵɵelementStart(84, "div",
|
|
497
|
-
i0.ɵɵelement(86, "i",
|
|
489
|
+
i0.ɵɵelementStart(84, "div", 64)(85, "div", 65);
|
|
490
|
+
i0.ɵɵelement(86, "i", 101);
|
|
498
491
|
i0.ɵɵelementStart(87, "span");
|
|
499
492
|
i0.ɵɵtext(88, "Cell Style");
|
|
500
493
|
i0.ɵɵelementEnd()();
|
|
501
|
-
i0.ɵɵelementStart(89, "div",
|
|
494
|
+
i0.ɵɵelementStart(89, "div", 93)(90, "button", 94);
|
|
502
495
|
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",
|
|
496
|
+
i0.ɵɵelement(91, "i", 95);
|
|
504
497
|
i0.ɵɵelementEnd();
|
|
505
|
-
i0.ɵɵelementStart(92, "button",
|
|
498
|
+
i0.ɵɵelementStart(92, "button", 96);
|
|
506
499
|
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",
|
|
500
|
+
i0.ɵɵelement(93, "i", 97);
|
|
508
501
|
i0.ɵɵelementEnd();
|
|
509
|
-
i0.ɵɵelementStart(94, "button",
|
|
502
|
+
i0.ɵɵelementStart(94, "button", 98);
|
|
510
503
|
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",
|
|
504
|
+
i0.ɵɵelement(95, "i", 99);
|
|
512
505
|
i0.ɵɵelementEnd()();
|
|
513
|
-
i0.ɵɵelementStart(96, "div",
|
|
506
|
+
i0.ɵɵelementStart(96, "div", 67)(97, "label");
|
|
514
507
|
i0.ɵɵtext(98, "Text Color");
|
|
515
508
|
i0.ɵɵelementEnd();
|
|
516
|
-
i0.ɵɵelementStart(99, "input",
|
|
509
|
+
i0.ɵɵelementStart(99, "input", 100);
|
|
517
510
|
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)); });
|
|
518
511
|
i0.ɵɵelementEnd()();
|
|
519
|
-
i0.ɵɵelementStart(100, "div",
|
|
512
|
+
i0.ɵɵelementStart(100, "div", 67)(101, "label");
|
|
520
513
|
i0.ɵɵtext(102, "Background");
|
|
521
514
|
i0.ɵɵelementEnd();
|
|
522
|
-
i0.ɵɵelementStart(103, "input",
|
|
515
|
+
i0.ɵɵelementStart(103, "input", 100);
|
|
523
516
|
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)); });
|
|
524
517
|
i0.ɵɵelementEnd()()();
|
|
525
|
-
i0.ɵɵelementStart(104, "div",
|
|
518
|
+
i0.ɵɵelementStart(104, "div", 102)(105, "button", 103);
|
|
526
519
|
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",
|
|
520
|
+
i0.ɵɵelement(106, "i", 104);
|
|
528
521
|
i0.ɵɵtext(107, " Clear Formatting ");
|
|
529
522
|
i0.ɵɵelementEnd()()();
|
|
530
523
|
} if (rf & 2) {
|
|
@@ -577,10 +570,10 @@ function ViewConfigPanelComponent_Conditional_29_Template(rf, ctx) { if (rf & 1)
|
|
|
577
570
|
i0.ɵɵproperty("value", (ctx_r1.FormatEditingColumn.format == null ? null : ctx_r1.FormatEditingColumn.format.cellStyle == null ? null : ctx_r1.FormatEditingColumn.format.cellStyle.backgroundColor) || "#ffffff");
|
|
578
571
|
} }
|
|
579
572
|
function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
580
|
-
i0.ɵɵelement(0, "div",
|
|
573
|
+
i0.ɵɵelement(0, "div", 136);
|
|
581
574
|
} }
|
|
582
575
|
function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
583
|
-
i0.ɵɵelementStart(0, "option",
|
|
576
|
+
i0.ɵɵelementStart(0, "option", 141);
|
|
584
577
|
i0.ɵɵtext(1);
|
|
585
578
|
i0.ɵɵelementEnd();
|
|
586
579
|
} if (rf & 2) {
|
|
@@ -590,46 +583,46 @@ function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_For_8_Templ
|
|
|
590
583
|
i0.ɵɵtextInterpolate(field_r20.DisplayNameOrName);
|
|
591
584
|
} }
|
|
592
585
|
function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
593
|
-
i0.ɵɵelement(0, "div",
|
|
586
|
+
i0.ɵɵelement(0, "div", 136);
|
|
594
587
|
} }
|
|
595
588
|
function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
596
589
|
const _r18 = i0.ɵɵgetCurrentView();
|
|
597
|
-
i0.ɵɵconditionalCreate(0, ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Conditional_0_Template, 1, 0, "div",
|
|
598
|
-
i0.ɵɵelementStart(1, "div",
|
|
590
|
+
i0.ɵɵconditionalCreate(0, ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Conditional_0_Template, 1, 0, "div", 136);
|
|
591
|
+
i0.ɵɵelementStart(1, "div", 137);
|
|
599
592
|
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",
|
|
593
|
+
i0.ɵɵelementStart(2, "div", 138);
|
|
601
594
|
i0.ɵɵtext(3);
|
|
602
595
|
i0.ɵɵelementEnd();
|
|
603
|
-
i0.ɵɵelementStart(4, "div",
|
|
604
|
-
i0.ɵɵelement(5, "i",
|
|
596
|
+
i0.ɵɵelementStart(4, "div", 139);
|
|
597
|
+
i0.ɵɵelement(5, "i", 44);
|
|
605
598
|
i0.ɵɵelementEnd();
|
|
606
|
-
i0.ɵɵelementStart(6, "select",
|
|
599
|
+
i0.ɵɵelementStart(6, "select", 140);
|
|
607
600
|
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
601
|
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",
|
|
602
|
+
i0.ɵɵrepeaterCreate(7, ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_For_8_Template, 2, 2, "option", 141, _forTrack1);
|
|
610
603
|
i0.ɵɵelementEnd();
|
|
611
|
-
i0.ɵɵelementStart(9, "div",
|
|
604
|
+
i0.ɵɵelementStart(9, "div", 142)(10, "button", 143);
|
|
612
605
|
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",
|
|
606
|
+
i0.ɵɵelement(11, "i", 144);
|
|
614
607
|
i0.ɵɵelementEnd();
|
|
615
|
-
i0.ɵɵelementStart(12, "button",
|
|
608
|
+
i0.ɵɵelementStart(12, "button", 145);
|
|
616
609
|
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",
|
|
610
|
+
i0.ɵɵelement(13, "i", 146);
|
|
618
611
|
i0.ɵɵelementEnd()();
|
|
619
|
-
i0.ɵɵelementStart(14, "button",
|
|
612
|
+
i0.ɵɵelementStart(14, "button", 147);
|
|
620
613
|
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)); });
|
|
621
614
|
i0.ɵɵelement(15, "i", 8);
|
|
622
615
|
i0.ɵɵelementEnd()();
|
|
623
|
-
i0.ɵɵconditionalCreate(16, ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Conditional_16_Template, 1, 0, "div",
|
|
616
|
+
i0.ɵɵconditionalCreate(16, ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Conditional_16_Template, 1, 0, "div", 136);
|
|
624
617
|
} if (rf & 2) {
|
|
625
618
|
const sortItem_r19 = ctx.$implicit;
|
|
626
|
-
const ɵ$
|
|
619
|
+
const ɵ$index_512_r21 = ctx.$index;
|
|
627
620
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
628
621
|
i0.ɵɵconditional(ctx_r1.IsSortDropBefore(sortItem_r19) ? 0 : -1);
|
|
629
622
|
i0.ɵɵadvance();
|
|
630
623
|
i0.ɵɵclassProp("dragging", ctx_r1.DraggedSortItem === sortItem_r19)("drop-target", ctx_r1.DropTargetSortItem === sortItem_r19);
|
|
631
624
|
i0.ɵɵadvance(2);
|
|
632
|
-
i0.ɵɵtextInterpolate(ɵ$
|
|
625
|
+
i0.ɵɵtextInterpolate(ɵ$index_512_r21 + 1);
|
|
633
626
|
i0.ɵɵadvance(3);
|
|
634
627
|
i0.ɵɵtwoWayProperty("ngModel", sortItem_r19.field);
|
|
635
628
|
i0.ɵɵproperty("disabled", !ctx_r1.CanEdit);
|
|
@@ -644,20 +637,18 @@ function ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template(rf
|
|
|
644
637
|
i0.ɵɵadvance(2);
|
|
645
638
|
i0.ɵɵproperty("disabled", !ctx_r1.CanEdit);
|
|
646
639
|
i0.ɵɵadvance(2);
|
|
647
|
-
i0.ɵɵconditional(ctx_r1.IsSortDropAfter(sortItem_r19) && ɵ$
|
|
640
|
+
i0.ɵɵconditional(ctx_r1.IsSortDropAfter(sortItem_r19) && ɵ$index_512_r21 === ctx_r1.SortItems.length - 1 ? 16 : -1);
|
|
648
641
|
} }
|
|
649
642
|
function ViewConfigPanelComponent_Conditional_30_Conditional_9_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
650
|
-
i0.ɵɵelementStart(0, "
|
|
651
|
-
i0.ɵɵ
|
|
652
|
-
i0.ɵɵ
|
|
653
|
-
i0.ɵɵtext(3, "Drag items to change priority. Records sort by first level, then second, etc.");
|
|
654
|
-
i0.ɵɵelementEnd()();
|
|
643
|
+
i0.ɵɵelementStart(0, "mj-alert", 135);
|
|
644
|
+
i0.ɵɵtext(1, "Drag items to change priority. Records sort by first level, then second, etc.");
|
|
645
|
+
i0.ɵɵelementEnd();
|
|
655
646
|
} }
|
|
656
647
|
function ViewConfigPanelComponent_Conditional_30_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
657
|
-
i0.ɵɵelementStart(0, "div",
|
|
648
|
+
i0.ɵɵelementStart(0, "div", 134);
|
|
658
649
|
i0.ɵɵrepeaterCreate(1, ViewConfigPanelComponent_Conditional_30_Conditional_9_For_2_Template, 17, 16, null, null, i0.ɵɵrepeaterTrackByIndex);
|
|
659
650
|
i0.ɵɵelementEnd();
|
|
660
|
-
i0.ɵɵconditionalCreate(3, ViewConfigPanelComponent_Conditional_30_Conditional_9_Conditional_3_Template,
|
|
651
|
+
i0.ɵɵconditionalCreate(3, ViewConfigPanelComponent_Conditional_30_Conditional_9_Conditional_3_Template, 2, 0, "mj-alert", 135);
|
|
661
652
|
} if (rf & 2) {
|
|
662
653
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
663
654
|
i0.ɵɵadvance();
|
|
@@ -666,27 +657,20 @@ function ViewConfigPanelComponent_Conditional_30_Conditional_9_Template(rf, ctx)
|
|
|
666
657
|
i0.ɵɵconditional(ctx_r1.SortItems.length > 1 ? 3 : -1);
|
|
667
658
|
} }
|
|
668
659
|
function ViewConfigPanelComponent_Conditional_30_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
669
|
-
i0.ɵɵ
|
|
670
|
-
i0.ɵɵelement(1, "i", 12);
|
|
671
|
-
i0.ɵɵelementStart(2, "span");
|
|
672
|
-
i0.ɵɵtext(3, "No sorting configured");
|
|
673
|
-
i0.ɵɵelementEnd();
|
|
674
|
-
i0.ɵɵelementStart(4, "p", 149);
|
|
675
|
-
i0.ɵɵtext(5, "Click \"Add Sort Level\" to define how records should be ordered");
|
|
676
|
-
i0.ɵɵelementEnd()();
|
|
660
|
+
i0.ɵɵelement(0, "mj-empty-state", 133);
|
|
677
661
|
} }
|
|
678
662
|
function ViewConfigPanelComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
679
663
|
const _r17 = i0.ɵɵgetCurrentView();
|
|
680
|
-
i0.ɵɵelementStart(0, "div", 18)(1, "div",
|
|
664
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 129)(2, "div", 130)(3, "p", 131);
|
|
681
665
|
i0.ɵɵtext(4, " Define how records should be ordered. Add multiple levels to sort by secondary fields when values are equal. ");
|
|
682
666
|
i0.ɵɵelementEnd()();
|
|
683
|
-
i0.ɵɵelementStart(5, "button",
|
|
667
|
+
i0.ɵɵelementStart(5, "button", 132);
|
|
684
668
|
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
669
|
i0.ɵɵelement(6, "i", 59);
|
|
686
670
|
i0.ɵɵelementStart(7, "span");
|
|
687
671
|
i0.ɵɵtext(8, "Add Sort Level");
|
|
688
672
|
i0.ɵɵelementEnd()();
|
|
689
|
-
i0.ɵɵconditionalCreate(9, ViewConfigPanelComponent_Conditional_30_Conditional_9_Template, 4, 1)(10, ViewConfigPanelComponent_Conditional_30_Conditional_10_Template,
|
|
673
|
+
i0.ɵɵconditionalCreate(9, ViewConfigPanelComponent_Conditional_30_Conditional_9_Template, 4, 1)(10, ViewConfigPanelComponent_Conditional_30_Conditional_10_Template, 1, 0, "mj-empty-state", 133);
|
|
690
674
|
i0.ɵɵelementEnd()();
|
|
691
675
|
} if (rf & 2) {
|
|
692
676
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -696,61 +680,57 @@ function ViewConfigPanelComponent_Conditional_30_Template(rf, ctx) { if (rf & 1)
|
|
|
696
680
|
i0.ɵɵconditional(ctx_r1.SortItems.length > 0 ? 9 : 10);
|
|
697
681
|
} }
|
|
698
682
|
function ViewConfigPanelComponent_Conditional_31_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
699
|
-
i0.ɵɵelement(0, "i",
|
|
683
|
+
i0.ɵɵelement(0, "i", 155);
|
|
700
684
|
} }
|
|
701
685
|
function ViewConfigPanelComponent_Conditional_31_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
702
|
-
i0.ɵɵelement(0, "i",
|
|
686
|
+
i0.ɵɵelement(0, "i", 155);
|
|
703
687
|
} }
|
|
704
688
|
function ViewConfigPanelComponent_Conditional_31_Conditional_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
705
|
-
i0.ɵɵelementStart(0, "
|
|
706
|
-
i0.ɵɵ
|
|
707
|
-
i0.ɵɵ
|
|
708
|
-
i0.ɵɵtext(3);
|
|
709
|
-
i0.ɵɵelementEnd()();
|
|
689
|
+
i0.ɵɵelementStart(0, "mj-alert", 161);
|
|
690
|
+
i0.ɵɵtext(1);
|
|
691
|
+
i0.ɵɵelementEnd();
|
|
710
692
|
} if (rf & 2) {
|
|
711
693
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
712
|
-
i0.ɵɵadvance(
|
|
694
|
+
i0.ɵɵadvance();
|
|
713
695
|
i0.ɵɵtextInterpolate(ctx_r1.SmartFilterExplanation);
|
|
714
696
|
} }
|
|
715
697
|
function ViewConfigPanelComponent_Conditional_31_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
716
698
|
const _r23 = i0.ɵɵgetCurrentView();
|
|
717
|
-
i0.ɵɵelementStart(0, "div",
|
|
718
|
-
i0.ɵɵelement(3, "i",
|
|
699
|
+
i0.ɵɵelementStart(0, "div", 156)(1, "div", 158)(2, "div", 159);
|
|
700
|
+
i0.ɵɵelement(3, "i", 151);
|
|
719
701
|
i0.ɵɵelementEnd();
|
|
720
|
-
i0.ɵɵelementStart(4, "textarea",
|
|
702
|
+
i0.ɵɵelementStart(4, "textarea", 160);
|
|
721
703
|
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); });
|
|
722
704
|
i0.ɵɵelementEnd()();
|
|
723
|
-
i0.ɵɵconditionalCreate(5, ViewConfigPanelComponent_Conditional_31_Conditional_20_Conditional_5_Template,
|
|
724
|
-
i0.ɵɵelementStart(6, "div",
|
|
725
|
-
i0.ɵɵelement(8, "i",
|
|
705
|
+
i0.ɵɵconditionalCreate(5, ViewConfigPanelComponent_Conditional_31_Conditional_20_Conditional_5_Template, 2, 1, "mj-alert", 161);
|
|
706
|
+
i0.ɵɵelementStart(6, "div", 162)(7, "div", 163);
|
|
707
|
+
i0.ɵɵelement(8, "i", 164);
|
|
726
708
|
i0.ɵɵelementStart(9, "span");
|
|
727
709
|
i0.ɵɵtext(10, "Try these examples:");
|
|
728
710
|
i0.ɵɵelementEnd()();
|
|
729
|
-
i0.ɵɵelementStart(11, "div",
|
|
711
|
+
i0.ɵɵelementStart(11, "div", 165)(12, "button", 166);
|
|
730
712
|
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",
|
|
713
|
+
i0.ɵɵelement(13, "i", 167);
|
|
732
714
|
i0.ɵɵtext(14, " Last 30 days ");
|
|
733
715
|
i0.ɵɵelementEnd();
|
|
734
|
-
i0.ɵɵelementStart(15, "button",
|
|
716
|
+
i0.ɵɵelementStart(15, "button", 166);
|
|
735
717
|
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",
|
|
718
|
+
i0.ɵɵelement(16, "i", 168);
|
|
737
719
|
i0.ɵɵtext(17, " Active only ");
|
|
738
720
|
i0.ɵɵelementEnd();
|
|
739
|
-
i0.ɵɵelementStart(18, "button",
|
|
721
|
+
i0.ɵɵelementStart(18, "button", 166);
|
|
740
722
|
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",
|
|
723
|
+
i0.ɵɵelement(19, "i", 169);
|
|
742
724
|
i0.ɵɵtext(20, " High priority ");
|
|
743
725
|
i0.ɵɵelementEnd();
|
|
744
|
-
i0.ɵɵelementStart(21, "button",
|
|
726
|
+
i0.ɵɵelementStart(21, "button", 166);
|
|
745
727
|
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",
|
|
728
|
+
i0.ɵɵelement(22, "i", 170);
|
|
747
729
|
i0.ɵɵtext(23, " Modified this week ");
|
|
748
730
|
i0.ɵɵelementEnd()()();
|
|
749
|
-
i0.ɵɵelementStart(24, "
|
|
750
|
-
i0.ɵɵ
|
|
751
|
-
i0.ɵɵ
|
|
752
|
-
i0.ɵɵtext(27, "The AI will interpret your description and create the appropriate filter when you save the view.");
|
|
753
|
-
i0.ɵɵelementEnd()()();
|
|
731
|
+
i0.ɵɵelementStart(24, "mj-alert", 171);
|
|
732
|
+
i0.ɵɵtext(25, "The AI will interpret your description and create the appropriate filter when you save the view.");
|
|
733
|
+
i0.ɵɵelementEnd()();
|
|
754
734
|
} if (rf & 2) {
|
|
755
735
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
756
736
|
i0.ɵɵadvance(4);
|
|
@@ -768,10 +748,10 @@ function ViewConfigPanelComponent_Conditional_31_Conditional_20_Template(rf, ctx
|
|
|
768
748
|
i0.ɵɵproperty("disabled", !ctx_r1.CanEdit);
|
|
769
749
|
} }
|
|
770
750
|
function ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
771
|
-
i0.ɵɵelementStart(0, "span",
|
|
751
|
+
i0.ɵɵelementStart(0, "span", 180);
|
|
772
752
|
i0.ɵɵtext(1);
|
|
773
753
|
i0.ɵɵelementEnd();
|
|
774
|
-
i0.ɵɵelementStart(2, "span",
|
|
754
|
+
i0.ɵɵelementStart(2, "span", 181);
|
|
775
755
|
i0.ɵɵtext(3);
|
|
776
756
|
i0.ɵɵelementEnd();
|
|
777
757
|
} if (rf & 2) {
|
|
@@ -782,13 +762,13 @@ function ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_4_Te
|
|
|
782
762
|
i0.ɵɵtextInterpolate(ctx_r1.GetFilterSummary());
|
|
783
763
|
} }
|
|
784
764
|
function ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
785
|
-
i0.ɵɵelementStart(0, "span",
|
|
765
|
+
i0.ɵɵelementStart(0, "span", 175);
|
|
786
766
|
i0.ɵɵtext(1, "No filters configured");
|
|
787
767
|
i0.ɵɵelementEnd();
|
|
788
768
|
} }
|
|
789
769
|
function ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
790
770
|
const _r25 = i0.ɵɵgetCurrentView();
|
|
791
|
-
i0.ɵɵelementStart(0, "button",
|
|
771
|
+
i0.ɵɵelementStart(0, "button", 182);
|
|
792
772
|
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()); });
|
|
793
773
|
i0.ɵɵelement(1, "i", 8);
|
|
794
774
|
i0.ɵɵtext(2, " Clear ");
|
|
@@ -796,21 +776,19 @@ function ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_7_Te
|
|
|
796
776
|
} }
|
|
797
777
|
function ViewConfigPanelComponent_Conditional_31_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
798
778
|
const _r24 = i0.ɵɵgetCurrentView();
|
|
799
|
-
i0.ɵɵelementStart(0, "div",
|
|
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",
|
|
779
|
+
i0.ɵɵelementStart(0, "div", 157)(1, "div", 172)(2, "div", 173)(3, "div", 174);
|
|
780
|
+
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", 175);
|
|
801
781
|
i0.ɵɵelementEnd();
|
|
802
|
-
i0.ɵɵelementStart(6, "div",
|
|
803
|
-
i0.ɵɵconditionalCreate(7, ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_7_Template, 3, 0, "button",
|
|
804
|
-
i0.ɵɵelementStart(8, "button",
|
|
782
|
+
i0.ɵɵelementStart(6, "div", 176);
|
|
783
|
+
i0.ɵɵconditionalCreate(7, ViewConfigPanelComponent_Conditional_31_Conditional_21_Conditional_7_Template, 3, 0, "button", 177);
|
|
784
|
+
i0.ɵɵelementStart(8, "button", 178);
|
|
805
785
|
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",
|
|
786
|
+
i0.ɵɵelement(9, "i", 179);
|
|
807
787
|
i0.ɵɵtext(10);
|
|
808
788
|
i0.ɵɵelementEnd()()()();
|
|
809
|
-
i0.ɵɵelementStart(11, "
|
|
810
|
-
i0.ɵɵ
|
|
811
|
-
i0.ɵɵ
|
|
812
|
-
i0.ɵɵtext(14, "Build precise filters by selecting fields, operators, and values. Use groups for complex AND/OR logic.");
|
|
813
|
-
i0.ɵɵelementEnd()()();
|
|
789
|
+
i0.ɵɵelementStart(11, "mj-alert", 171);
|
|
790
|
+
i0.ɵɵtext(12, "Build precise filters by selecting fields, operators, and values. Use groups for complex AND/OR logic.");
|
|
791
|
+
i0.ɵɵelementEnd()();
|
|
814
792
|
} if (rf & 2) {
|
|
815
793
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
816
794
|
i0.ɵɵadvance(4);
|
|
@@ -824,34 +802,34 @@ function ViewConfigPanelComponent_Conditional_31_Conditional_21_Template(rf, ctx
|
|
|
824
802
|
} }
|
|
825
803
|
function ViewConfigPanelComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
|
|
826
804
|
const _r22 = i0.ɵɵgetCurrentView();
|
|
827
|
-
i0.ɵɵelementStart(0, "div", 18)(1, "div",
|
|
805
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 148)(2, "button", 149);
|
|
828
806
|
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",
|
|
830
|
-
i0.ɵɵelement(4, "i",
|
|
807
|
+
i0.ɵɵelementStart(3, "div", 150);
|
|
808
|
+
i0.ɵɵelement(4, "i", 151);
|
|
831
809
|
i0.ɵɵelementEnd();
|
|
832
|
-
i0.ɵɵelementStart(5, "div",
|
|
810
|
+
i0.ɵɵelementStart(5, "div", 152)(6, "span", 153);
|
|
833
811
|
i0.ɵɵtext(7, "Smart Filter");
|
|
834
812
|
i0.ɵɵelementEnd();
|
|
835
|
-
i0.ɵɵelementStart(8, "span",
|
|
813
|
+
i0.ɵɵelementStart(8, "span", 154);
|
|
836
814
|
i0.ɵɵtext(9, "Use AI to filter with natural language");
|
|
837
815
|
i0.ɵɵelementEnd()();
|
|
838
|
-
i0.ɵɵconditionalCreate(10, ViewConfigPanelComponent_Conditional_31_Conditional_10_Template, 1, 0, "i",
|
|
816
|
+
i0.ɵɵconditionalCreate(10, ViewConfigPanelComponent_Conditional_31_Conditional_10_Template, 1, 0, "i", 155);
|
|
839
817
|
i0.ɵɵelementEnd();
|
|
840
|
-
i0.ɵɵelementStart(11, "button",
|
|
818
|
+
i0.ɵɵelementStart(11, "button", 149);
|
|
841
819
|
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",
|
|
843
|
-
i0.ɵɵelement(13, "i",
|
|
820
|
+
i0.ɵɵelementStart(12, "div", 150);
|
|
821
|
+
i0.ɵɵelement(13, "i", 108);
|
|
844
822
|
i0.ɵɵelementEnd();
|
|
845
|
-
i0.ɵɵelementStart(14, "div",
|
|
823
|
+
i0.ɵɵelementStart(14, "div", 152)(15, "span", 153);
|
|
846
824
|
i0.ɵɵtext(16, "Traditional Filter");
|
|
847
825
|
i0.ɵɵelementEnd();
|
|
848
|
-
i0.ɵɵelementStart(17, "span",
|
|
826
|
+
i0.ɵɵelementStart(17, "span", 154);
|
|
849
827
|
i0.ɵɵtext(18, "Build filters with field/operator/value");
|
|
850
828
|
i0.ɵɵelementEnd()();
|
|
851
|
-
i0.ɵɵconditionalCreate(19, ViewConfigPanelComponent_Conditional_31_Conditional_19_Template, 1, 0, "i",
|
|
829
|
+
i0.ɵɵconditionalCreate(19, ViewConfigPanelComponent_Conditional_31_Conditional_19_Template, 1, 0, "i", 155);
|
|
852
830
|
i0.ɵɵelementEnd()();
|
|
853
|
-
i0.ɵɵconditionalCreate(20, ViewConfigPanelComponent_Conditional_31_Conditional_20_Template,
|
|
854
|
-
i0.ɵɵconditionalCreate(21, ViewConfigPanelComponent_Conditional_31_Conditional_21_Template,
|
|
831
|
+
i0.ɵɵconditionalCreate(20, ViewConfigPanelComponent_Conditional_31_Conditional_20_Template, 26, 7, "div", 156);
|
|
832
|
+
i0.ɵɵconditionalCreate(21, ViewConfigPanelComponent_Conditional_31_Conditional_21_Template, 13, 4, "div", 157);
|
|
855
833
|
i0.ɵɵelementEnd();
|
|
856
834
|
} if (rf & 2) {
|
|
857
835
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -871,47 +849,47 @@ function ViewConfigPanelComponent_Conditional_31_Template(rf, ctx) { if (rf & 1)
|
|
|
871
849
|
i0.ɵɵconditional(ctx_r1.FilterMode === "traditional" ? 21 : -1);
|
|
872
850
|
} }
|
|
873
851
|
function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
874
|
-
i0.ɵɵelementStart(0, "span",
|
|
875
|
-
i0.ɵɵelement(1, "i",
|
|
852
|
+
i0.ɵɵelementStart(0, "span", 200);
|
|
853
|
+
i0.ɵɵelement(1, "i", 151);
|
|
876
854
|
i0.ɵɵelementEnd();
|
|
877
855
|
} }
|
|
878
856
|
function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
879
857
|
const _r27 = i0.ɵɵgetCurrentView();
|
|
880
|
-
i0.ɵɵelementStart(0, "div",
|
|
858
|
+
i0.ɵɵelementStart(0, "div", 194)(1, "div", 195);
|
|
881
859
|
i0.ɵɵelement(2, "i");
|
|
882
860
|
i0.ɵɵelementEnd();
|
|
883
|
-
i0.ɵɵelementStart(3, "div",
|
|
861
|
+
i0.ɵɵelementStart(3, "div", 196)(4, "div", 197);
|
|
884
862
|
i0.ɵɵtext(5);
|
|
885
863
|
i0.ɵɵelementEnd();
|
|
886
|
-
i0.ɵɵelementStart(6, "div",
|
|
864
|
+
i0.ɵɵelementStart(6, "div", 198)(7, "span", 199);
|
|
887
865
|
i0.ɵɵelement(8, "i");
|
|
888
866
|
i0.ɵɵtext(9);
|
|
889
867
|
i0.ɵɵelementEnd();
|
|
890
|
-
i0.ɵɵconditionalCreate(10, ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Conditional_10_Template, 2, 0, "span",
|
|
868
|
+
i0.ɵɵconditionalCreate(10, ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Conditional_10_Template, 2, 0, "span", 200);
|
|
891
869
|
i0.ɵɵelementEnd()();
|
|
892
|
-
i0.ɵɵelementStart(11, "div",
|
|
870
|
+
i0.ɵɵelementStart(11, "div", 201)(12, "button", 202);
|
|
893
871
|
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",
|
|
872
|
+
i0.ɵɵelement(13, "i", 52);
|
|
895
873
|
i0.ɵɵelementEnd();
|
|
896
|
-
i0.ɵɵelementStart(14, "button",
|
|
874
|
+
i0.ɵɵelementStart(14, "button", 203);
|
|
897
875
|
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",
|
|
876
|
+
i0.ɵɵelement(15, "i", 54);
|
|
899
877
|
i0.ɵɵelementEnd();
|
|
900
|
-
i0.ɵɵelementStart(16, "button",
|
|
878
|
+
i0.ɵɵelementStart(16, "button", 204);
|
|
901
879
|
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)); });
|
|
902
880
|
i0.ɵɵelement(17, "i");
|
|
903
881
|
i0.ɵɵelementEnd();
|
|
904
|
-
i0.ɵɵelementStart(18, "button",
|
|
882
|
+
i0.ɵɵelementStart(18, "button", 205);
|
|
905
883
|
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",
|
|
884
|
+
i0.ɵɵelement(19, "i", 179);
|
|
907
885
|
i0.ɵɵelementEnd();
|
|
908
|
-
i0.ɵɵelementStart(20, "button",
|
|
886
|
+
i0.ɵɵelementStart(20, "button", 206);
|
|
909
887
|
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",
|
|
888
|
+
i0.ɵɵelement(21, "i", 207);
|
|
911
889
|
i0.ɵɵelementEnd()()();
|
|
912
890
|
} if (rf & 2) {
|
|
913
891
|
const agg_r28 = ctx.$implicit;
|
|
914
|
-
const ɵ$
|
|
892
|
+
const ɵ$index_699_r29 = ctx.$index;
|
|
915
893
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
916
894
|
i0.ɵɵclassProp("disabled", agg_r28.enabled === false);
|
|
917
895
|
i0.ɵɵadvance(2);
|
|
@@ -925,9 +903,9 @@ function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template(rf
|
|
|
925
903
|
i0.ɵɵadvance();
|
|
926
904
|
i0.ɵɵconditional(agg_r28.smartPrompt ? 10 : -1);
|
|
927
905
|
i0.ɵɵadvance(2);
|
|
928
|
-
i0.ɵɵproperty("disabled", ɵ$
|
|
906
|
+
i0.ɵɵproperty("disabled", ɵ$index_699_r29 === 0 || !ctx_r1.CanEdit);
|
|
929
907
|
i0.ɵɵadvance(2);
|
|
930
|
-
i0.ɵɵproperty("disabled", ɵ$
|
|
908
|
+
i0.ɵɵproperty("disabled", ɵ$index_699_r29 === ctx_r1.Aggregates.length - 1 || !ctx_r1.CanEdit);
|
|
931
909
|
i0.ɵɵadvance(2);
|
|
932
910
|
i0.ɵɵclassProp("enabled", agg_r28.enabled !== false);
|
|
933
911
|
i0.ɵɵproperty("disabled", !ctx_r1.CanEdit)("title", agg_r28.enabled !== false ? "Disable" : "Enable");
|
|
@@ -939,16 +917,16 @@ function ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template(rf
|
|
|
939
917
|
i0.ɵɵproperty("disabled", !ctx_r1.CanEdit);
|
|
940
918
|
} }
|
|
941
919
|
function ViewConfigPanelComponent_Conditional_32_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
942
|
-
i0.ɵɵelementStart(0, "div",
|
|
943
|
-
i0.ɵɵrepeaterCreate(1, ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template, 22, 19, "div",
|
|
920
|
+
i0.ɵɵelementStart(0, "div", 188);
|
|
921
|
+
i0.ɵɵrepeaterCreate(1, ViewConfigPanelComponent_Conditional_32_Conditional_9_For_2_Template, 22, 19, "div", 189, _forTrack2);
|
|
944
922
|
i0.ɵɵelementEnd();
|
|
945
|
-
i0.ɵɵelementStart(3, "div",
|
|
946
|
-
i0.ɵɵelement(5, "i",
|
|
923
|
+
i0.ɵɵelementStart(3, "div", 190)(4, "div", 191);
|
|
924
|
+
i0.ɵɵelement(5, "i", 192);
|
|
947
925
|
i0.ɵɵelementStart(6, "span");
|
|
948
926
|
i0.ɵɵtext(7);
|
|
949
927
|
i0.ɵɵelementEnd()();
|
|
950
|
-
i0.ɵɵelementStart(8, "div",
|
|
951
|
-
i0.ɵɵelement(9, "i",
|
|
928
|
+
i0.ɵɵelementStart(8, "div", 191);
|
|
929
|
+
i0.ɵɵelement(9, "i", 193);
|
|
952
930
|
i0.ɵɵelementStart(10, "span");
|
|
953
931
|
i0.ɵɵtext(11);
|
|
954
932
|
i0.ɵɵelementEnd()()();
|
|
@@ -962,32 +940,23 @@ function ViewConfigPanelComponent_Conditional_32_Conditional_9_Template(rf, ctx)
|
|
|
962
940
|
i0.ɵɵtextInterpolate2("", ctx_r1.ColumnAggregates.length, " column footer", ctx_r1.ColumnAggregates.length !== 1 ? "s" : "");
|
|
963
941
|
} }
|
|
964
942
|
function ViewConfigPanelComponent_Conditional_32_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
965
|
-
i0.ɵɵ
|
|
966
|
-
i0.ɵɵelement(1, "i", 15);
|
|
967
|
-
i0.ɵɵelementStart(2, "span");
|
|
968
|
-
i0.ɵɵtext(3, "No aggregates configured");
|
|
969
|
-
i0.ɵɵelementEnd();
|
|
970
|
-
i0.ɵɵelementStart(4, "p", 213);
|
|
971
|
-
i0.ɵɵtext(5, "Click \"Add Aggregate\" to create summary calculations");
|
|
972
|
-
i0.ɵɵelementEnd()();
|
|
943
|
+
i0.ɵɵelement(0, "mj-empty-state", 187);
|
|
973
944
|
} }
|
|
974
945
|
function ViewConfigPanelComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
975
946
|
const _r26 = i0.ɵɵgetCurrentView();
|
|
976
|
-
i0.ɵɵelementStart(0, "div", 18)(1, "div",
|
|
947
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 183)(2, "div", 184)(3, "p", 185);
|
|
977
948
|
i0.ɵɵtext(4, " Add summary calculations like totals, averages, and counts. Display them in cards or as column footers. ");
|
|
978
949
|
i0.ɵɵelementEnd()();
|
|
979
|
-
i0.ɵɵelementStart(5, "button",
|
|
950
|
+
i0.ɵɵelementStart(5, "button", 186);
|
|
980
951
|
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
952
|
i0.ɵɵelement(6, "i", 59);
|
|
982
953
|
i0.ɵɵelementStart(7, "span");
|
|
983
954
|
i0.ɵɵtext(8, "Add Aggregate");
|
|
984
955
|
i0.ɵɵelementEnd()();
|
|
985
|
-
i0.ɵɵconditionalCreate(9, ViewConfigPanelComponent_Conditional_32_Conditional_9_Template, 12, 4)(10, ViewConfigPanelComponent_Conditional_32_Conditional_10_Template,
|
|
986
|
-
i0.ɵɵelementStart(11, "
|
|
987
|
-
i0.ɵɵ
|
|
988
|
-
i0.ɵɵ
|
|
989
|
-
i0.ɵɵtext(14, "Aggregates are calculated server-side for accuracy with filtered/paginated data.");
|
|
990
|
-
i0.ɵɵelementEnd()()()();
|
|
956
|
+
i0.ɵɵconditionalCreate(9, ViewConfigPanelComponent_Conditional_32_Conditional_9_Template, 12, 4)(10, ViewConfigPanelComponent_Conditional_32_Conditional_10_Template, 1, 0, "mj-empty-state", 187);
|
|
957
|
+
i0.ɵɵelementStart(11, "mj-alert", 171);
|
|
958
|
+
i0.ɵɵtext(12, "Aggregates are calculated server-side for accuracy with filtered/paginated data.");
|
|
959
|
+
i0.ɵɵelementEnd()()();
|
|
991
960
|
} if (rf & 2) {
|
|
992
961
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
993
962
|
i0.ɵɵadvance(5);
|
|
@@ -996,20 +965,20 @@ function ViewConfigPanelComponent_Conditional_32_Template(rf, ctx) { if (rf & 1)
|
|
|
996
965
|
i0.ɵɵconditional(ctx_r1.Aggregates.length > 0 ? 9 : 10);
|
|
997
966
|
} }
|
|
998
967
|
function ViewConfigPanelComponent_Conditional_33_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
999
|
-
i0.ɵɵelementStart(0, "span",
|
|
968
|
+
i0.ɵɵelementStart(0, "span", 212);
|
|
1000
969
|
i0.ɵɵtext(1, "View name is required");
|
|
1001
970
|
i0.ɵɵelementEnd();
|
|
1002
971
|
} }
|
|
1003
972
|
function ViewConfigPanelComponent_Conditional_33_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
1004
973
|
const _r31 = i0.ɵɵgetCurrentView();
|
|
1005
|
-
i0.ɵɵelementStart(0, "div",
|
|
1006
|
-
i0.ɵɵelement(2, "i",
|
|
974
|
+
i0.ɵɵelementStart(0, "div", 219)(1, "div", 31);
|
|
975
|
+
i0.ɵɵelement(2, "i", 220);
|
|
1007
976
|
i0.ɵɵelementStart(3, "span");
|
|
1008
977
|
i0.ɵɵtext(4, "Danger Zone");
|
|
1009
978
|
i0.ɵɵelementEnd()();
|
|
1010
|
-
i0.ɵɵelementStart(5, "button",
|
|
979
|
+
i0.ɵɵelementStart(5, "button", 221);
|
|
1011
980
|
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",
|
|
981
|
+
i0.ɵɵelement(6, "i", 207);
|
|
1013
982
|
i0.ɵɵelementStart(7, "span");
|
|
1014
983
|
i0.ɵɵtext(8, "Delete View");
|
|
1015
984
|
i0.ɵɵelementEnd()()();
|
|
@@ -1017,39 +986,39 @@ function ViewConfigPanelComponent_Conditional_33_Conditional_27_Template(rf, ctx
|
|
|
1017
986
|
function ViewConfigPanelComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
1018
987
|
const _r30 = i0.ɵɵgetCurrentView();
|
|
1019
988
|
i0.ɵɵelementStart(0, "div", 18)(1, "div", 30)(2, "div", 31);
|
|
1020
|
-
i0.ɵɵelement(3, "i",
|
|
989
|
+
i0.ɵɵelement(3, "i", 208);
|
|
1021
990
|
i0.ɵɵelementStart(4, "span");
|
|
1022
991
|
i0.ɵɵtext(5, "View Details");
|
|
1023
992
|
i0.ɵɵelementEnd()();
|
|
1024
|
-
i0.ɵɵelementStart(6, "div",
|
|
993
|
+
i0.ɵɵelementStart(6, "div", 209)(7, "label", 210);
|
|
1025
994
|
i0.ɵɵtext(8, "Name");
|
|
1026
995
|
i0.ɵɵelementEnd();
|
|
1027
|
-
i0.ɵɵelementStart(9, "input",
|
|
996
|
+
i0.ɵɵelementStart(9, "input", 211);
|
|
1028
997
|
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); });
|
|
1029
998
|
i0.ɵɵelementEnd();
|
|
1030
|
-
i0.ɵɵconditionalCreate(10, ViewConfigPanelComponent_Conditional_33_Conditional_10_Template, 2, 0, "span",
|
|
999
|
+
i0.ɵɵconditionalCreate(10, ViewConfigPanelComponent_Conditional_33_Conditional_10_Template, 2, 0, "span", 212);
|
|
1031
1000
|
i0.ɵɵelementEnd();
|
|
1032
|
-
i0.ɵɵelementStart(11, "div",
|
|
1001
|
+
i0.ɵɵelementStart(11, "div", 209)(12, "label", 213);
|
|
1033
1002
|
i0.ɵɵtext(13, "Description");
|
|
1034
1003
|
i0.ɵɵelementEnd();
|
|
1035
|
-
i0.ɵɵelementStart(14, "textarea",
|
|
1004
|
+
i0.ɵɵelementStart(14, "textarea", 214);
|
|
1036
1005
|
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); });
|
|
1037
1006
|
i0.ɵɵelementEnd()()();
|
|
1038
1007
|
i0.ɵɵelementStart(15, "div", 30)(16, "div", 31);
|
|
1039
|
-
i0.ɵɵelement(17, "i",
|
|
1008
|
+
i0.ɵɵelement(17, "i", 215);
|
|
1040
1009
|
i0.ɵɵelementStart(18, "span");
|
|
1041
1010
|
i0.ɵɵtext(19, "Sharing");
|
|
1042
1011
|
i0.ɵɵelementEnd()();
|
|
1043
|
-
i0.ɵɵelementStart(20, "label",
|
|
1012
|
+
i0.ɵɵelementStart(20, "label", 216)(21, "input", 217);
|
|
1044
1013
|
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); });
|
|
1045
1014
|
i0.ɵɵelementEnd();
|
|
1046
|
-
i0.ɵɵelementStart(22, "span",
|
|
1015
|
+
i0.ɵɵelementStart(22, "span", 218)(23, "strong");
|
|
1047
1016
|
i0.ɵɵtext(24, "Share with others");
|
|
1048
1017
|
i0.ɵɵelementEnd();
|
|
1049
1018
|
i0.ɵɵelementStart(25, "small");
|
|
1050
1019
|
i0.ɵɵtext(26, "Allow other users to use this view");
|
|
1051
1020
|
i0.ɵɵelementEnd()()()();
|
|
1052
|
-
i0.ɵɵconditionalCreate(27, ViewConfigPanelComponent_Conditional_33_Conditional_27_Template, 9, 0, "div",
|
|
1021
|
+
i0.ɵɵconditionalCreate(27, ViewConfigPanelComponent_Conditional_33_Conditional_27_Template, 9, 0, "div", 219);
|
|
1053
1022
|
i0.ɵɵelementEnd();
|
|
1054
1023
|
} if (rf & 2) {
|
|
1055
1024
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -1069,23 +1038,21 @@ function ViewConfigPanelComponent_Conditional_33_Template(rf, ctx) { if (rf & 1)
|
|
|
1069
1038
|
i0.ɵɵconditional(ctx_r1.ViewEntity && ctx_r1.CanDelete ? 27 : -1);
|
|
1070
1039
|
} }
|
|
1071
1040
|
function ViewConfigPanelComponent_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
1072
|
-
i0.ɵɵelementStart(0, "
|
|
1073
|
-
i0.ɵɵ
|
|
1074
|
-
i0.ɵɵ
|
|
1075
|
-
i0.ɵɵtext(3, "At least one column must be visible");
|
|
1076
|
-
i0.ɵɵelementEnd()();
|
|
1041
|
+
i0.ɵɵelementStart(0, "mj-alert", 20);
|
|
1042
|
+
i0.ɵɵtext(1, "At least one column must be visible");
|
|
1043
|
+
i0.ɵɵelementEnd();
|
|
1077
1044
|
} }
|
|
1078
1045
|
function ViewConfigPanelComponent_Conditional_37_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1079
|
-
i0.ɵɵelement(0, "i",
|
|
1046
|
+
i0.ɵɵelement(0, "i", 223);
|
|
1080
1047
|
} }
|
|
1081
1048
|
function ViewConfigPanelComponent_Conditional_37_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1082
|
-
i0.ɵɵelement(0, "i",
|
|
1049
|
+
i0.ɵɵelement(0, "i", 224);
|
|
1083
1050
|
} }
|
|
1084
1051
|
function ViewConfigPanelComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
1085
1052
|
const _r32 = i0.ɵɵgetCurrentView();
|
|
1086
|
-
i0.ɵɵelementStart(0, "button",
|
|
1053
|
+
i0.ɵɵelementStart(0, "button", 222);
|
|
1087
1054
|
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",
|
|
1055
|
+
i0.ɵɵconditionalCreate(1, ViewConfigPanelComponent_Conditional_37_Conditional_1_Template, 1, 0, "i", 223)(2, ViewConfigPanelComponent_Conditional_37_Conditional_2_Template, 1, 0, "i", 224);
|
|
1089
1056
|
i0.ɵɵtext(3);
|
|
1090
1057
|
i0.ɵɵelementEnd();
|
|
1091
1058
|
} if (rf & 2) {
|
|
@@ -1097,16 +1064,16 @@ function ViewConfigPanelComponent_Conditional_37_Template(rf, ctx) { if (rf & 1)
|
|
|
1097
1064
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.IsSaving ? "Saving..." : "Save", " ");
|
|
1098
1065
|
} }
|
|
1099
1066
|
function ViewConfigPanelComponent_Conditional_38_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1100
|
-
i0.ɵɵelement(0, "i",
|
|
1067
|
+
i0.ɵɵelement(0, "i", 223);
|
|
1101
1068
|
} }
|
|
1102
1069
|
function ViewConfigPanelComponent_Conditional_38_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1103
1070
|
i0.ɵɵelement(0, "i", 59);
|
|
1104
1071
|
} }
|
|
1105
1072
|
function ViewConfigPanelComponent_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
1106
1073
|
const _r33 = i0.ɵɵgetCurrentView();
|
|
1107
|
-
i0.ɵɵelementStart(0, "button",
|
|
1074
|
+
i0.ɵɵelementStart(0, "button", 222);
|
|
1108
1075
|
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.OnSaveAsNew()); });
|
|
1109
|
-
i0.ɵɵconditionalCreate(1, ViewConfigPanelComponent_Conditional_38_Conditional_1_Template, 1, 0, "i",
|
|
1076
|
+
i0.ɵɵconditionalCreate(1, ViewConfigPanelComponent_Conditional_38_Conditional_1_Template, 1, 0, "i", 223)(2, ViewConfigPanelComponent_Conditional_38_Conditional_2_Template, 1, 0, "i", 59);
|
|
1110
1077
|
i0.ɵɵtext(3);
|
|
1111
1078
|
i0.ɵɵelementEnd();
|
|
1112
1079
|
} if (rf & 2) {
|
|
@@ -1118,16 +1085,16 @@ function ViewConfigPanelComponent_Conditional_38_Template(rf, ctx) { if (rf & 1)
|
|
|
1118
1085
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.IsSaving ? "Saving..." : "Create View", " ");
|
|
1119
1086
|
} }
|
|
1120
1087
|
function ViewConfigPanelComponent_Conditional_39_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1121
|
-
i0.ɵɵelement(0, "i",
|
|
1088
|
+
i0.ɵɵelement(0, "i", 223);
|
|
1122
1089
|
} }
|
|
1123
1090
|
function ViewConfigPanelComponent_Conditional_39_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1124
|
-
i0.ɵɵelement(0, "i",
|
|
1091
|
+
i0.ɵɵelement(0, "i", 224);
|
|
1125
1092
|
} }
|
|
1126
1093
|
function ViewConfigPanelComponent_Conditional_39_Template(rf, ctx) { if (rf & 1) {
|
|
1127
1094
|
const _r34 = i0.ɵɵgetCurrentView();
|
|
1128
|
-
i0.ɵɵelementStart(0, "button",
|
|
1095
|
+
i0.ɵɵelementStart(0, "button", 222);
|
|
1129
1096
|
i0.ɵɵlistener("click", function ViewConfigPanelComponent_Conditional_39_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r34); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSaveDefaults()); });
|
|
1130
|
-
i0.ɵɵconditionalCreate(1, ViewConfigPanelComponent_Conditional_39_Conditional_1_Template, 1, 0, "i",
|
|
1097
|
+
i0.ɵɵconditionalCreate(1, ViewConfigPanelComponent_Conditional_39_Conditional_1_Template, 1, 0, "i", 223)(2, ViewConfigPanelComponent_Conditional_39_Conditional_2_Template, 1, 0, "i", 224);
|
|
1131
1098
|
i0.ɵɵtext(3);
|
|
1132
1099
|
i0.ɵɵelementEnd();
|
|
1133
1100
|
} if (rf & 2) {
|
|
@@ -2724,7 +2691,7 @@ export class ViewConfigPanelComponent extends BaseAngularComponent {
|
|
|
2724
2691
|
static ɵfac = function ViewConfigPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ViewConfigPanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
2725
2692
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ViewConfigPanelComponent, selectors: [["mj-view-config-panel"]], hostBindings: function ViewConfigPanelComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
2726
2693
|
i0.ɵɵlistener("keydown.escape", function ViewConfigPanelComponent_keydown_escape_HostBindingHandler() { return ctx.HandleEscape(); }, i0.ɵɵresolveDocument);
|
|
2727
|
-
} }, inputs: { Entity: "Entity", ViewEntity: "ViewEntity", IsOpen: "IsOpen", CurrentGridState: "CurrentGridState", SampleData: "SampleData", ExternalFilterState: "ExternalFilterState", DefaultSaveAsNew: "DefaultSaveAsNew", PendingNewViewName: "PendingNewViewName", PendingNewViewDescription: "PendingNewViewDescription", PendingNewViewIsShared: "PendingNewViewIsShared", IsSaving: "IsSaving" }, outputs: { Close: "Close", Save: "Save", SaveDefaults: "SaveDefaults", Delete: "Delete", OpenFilterDialogRequest: "OpenFilterDialogRequest", Duplicate: "Duplicate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 45, vars: 46, 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", "aria-label", "Close panel", 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", "aria-label", "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) {
|
|
2694
|
+
} }, inputs: { Entity: "Entity", ViewEntity: "ViewEntity", IsOpen: "IsOpen", CurrentGridState: "CurrentGridState", SampleData: "SampleData", ExternalFilterState: "ExternalFilterState", DefaultSaveAsNew: "DefaultSaveAsNew", PendingNewViewName: "PendingNewViewName", PendingNewViewDescription: "PendingNewViewDescription", PendingNewViewIsShared: "PendingNewViewIsShared", IsSaving: "IsSaving" }, outputs: { Close: "Close", Save: "Save", SaveDefaults: "SaveDefaults", Delete: "Delete", OpenFilterDialogRequest: "OpenFilterDialogRequest", Duplicate: "Duplicate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 45, vars: 46, 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", "aria-label", "Close panel", 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"], ["Variant", "error", "Size", "sm", 1, "view-config-validation-pos"], [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"], ["Size", "compact", "Variant", "warning", "Title", "No columns visible. Add columns from below."], [1, "fa-solid", "fa-eye-slash"], [1, "column-search"], [1, "column-list", "hidden-columns"], [1, "column-item", "hidden"], ["Size", "compact", "Variant", "success", "Title", "All columns are visible"], [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-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, "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", "aria-label", "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"], ["Size", "compact", "Icon", "fa-solid fa-arrow-up-wide-short", "Title", "No sorting configured", "Message", "Click \"Add Sort Level\" to define how records should be ordered"], [1, "sort-items-list"], ["Variant", "info", "Size", "sm"], [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, "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"], ["Variant", "info", "Size", "sm", "Icon", "fa-solid fa-robot", 1, "view-config-alert-pos-mb"], [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"], ["Variant", "info", "Size", "sm", 1, "view-config-alert-pos"], [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, "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"], ["Size", "compact", "Icon", "fa-solid fa-chart-simple", "Title", "No aggregates configured", "Message", "Click \"Add Aggregate\" to create summary calculations"], [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, "fa-solid", "fa-info-circle"], [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) {
|
|
2728
2695
|
i0.ɵɵconditionalCreate(0, ViewConfigPanelComponent_Conditional_0_Template, 1, 0, "div", 0);
|
|
2729
2696
|
i0.ɵɵelementStart(1, "div", 1)(2, "div", 2);
|
|
2730
2697
|
i0.ɵɵlistener("mousedown", function ViewConfigPanelComponent_Template_div_mousedown_2_listener($event) { return ctx.OnResizeStart($event); });
|
|
@@ -2768,10 +2735,10 @@ export class ViewConfigPanelComponent extends BaseAngularComponent {
|
|
|
2768
2735
|
i0.ɵɵconditionalCreate(29, ViewConfigPanelComponent_Conditional_29_Template, 108, 41, "div", 19);
|
|
2769
2736
|
i0.ɵɵconditionalCreate(30, ViewConfigPanelComponent_Conditional_30_Template, 11, 2, "div", 18);
|
|
2770
2737
|
i0.ɵɵconditionalCreate(31, ViewConfigPanelComponent_Conditional_31_Template, 22, 10, "div", 18);
|
|
2771
|
-
i0.ɵɵconditionalCreate(32, ViewConfigPanelComponent_Conditional_32_Template,
|
|
2738
|
+
i0.ɵɵconditionalCreate(32, ViewConfigPanelComponent_Conditional_32_Template, 13, 2, "div", 18);
|
|
2772
2739
|
i0.ɵɵconditionalCreate(33, ViewConfigPanelComponent_Conditional_33_Template, 28, 10, "div", 18);
|
|
2773
2740
|
i0.ɵɵelementEnd();
|
|
2774
|
-
i0.ɵɵconditionalCreate(34, ViewConfigPanelComponent_Conditional_34_Template,
|
|
2741
|
+
i0.ɵɵconditionalCreate(34, ViewConfigPanelComponent_Conditional_34_Template, 2, 0, "mj-alert", 20);
|
|
2775
2742
|
i0.ɵɵelementStart(35, "div", 21)(36, "div", 22);
|
|
2776
2743
|
i0.ɵɵconditionalCreate(37, ViewConfigPanelComponent_Conditional_37_Template, 4, 3, "button", 23);
|
|
2777
2744
|
i0.ɵɵconditionalCreate(38, ViewConfigPanelComponent_Conditional_38_Template, 4, 3, "button", 23);
|
|
@@ -2851,11 +2818,11 @@ export class ViewConfigPanelComponent extends BaseAngularComponent {
|
|
|
2851
2818
|
i0.ɵɵproperty("IsOpen", ctx.ShowDeleteConfirm)("Message", "Are you sure you want to delete '" + ctx.ViewName + "'?");
|
|
2852
2819
|
i0.ɵɵadvance();
|
|
2853
2820
|
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.");
|
|
2854
|
-
} }, 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: 1200; \n\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: 60px;\n right: 0;\n width: 450px;\n min-width: 360px;\n max-width: min(800px, 100vw);\n height: calc(100% - 60px);\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n z-index: 1201; \n\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: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.resize-grip[_ngcontent-%COMP%] {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\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: var(--mj-brand-primary);\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 var(--mj-border-default);\n background: var(--mj-bg-surface-card);\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: var(--mj-text-primary);\n}\n\n.header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.close-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n\n\n.tab-nav[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\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 cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 500;\n transition: all 0.15s ease;\n position: relative;\n white-space: nowrap;\n}\n\n.tab-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.tab-btn.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.tab-btn.active[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 8px;\n right: 8px;\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 2px 2px 0 0;\n}\n\n.tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.tab-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n}\n\n\n\n.tab-nav.icon-only[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n padding: 12px 8px;\n}\n\n\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.tab-content[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n\n\n.config-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 0;\n margin-bottom: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.column-count[_ngcontent-%COMP%] {\n margin-left: auto;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 500;\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: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n margin-bottom: 8px;\n}\n\n.column-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\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: 13px;\n background: transparent;\n color: var(--mj-text-primary);\n}\n\n.column-search[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n\n\n.column-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n\n\n.column-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-radius: 8px;\n transition: background 0.15s ease;\n cursor: default;\n}\n\n.column-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.column-item.hidden[_ngcontent-%COMP%] {\n opacity: 0.7;\n}\n\n.column-item.hidden[_ngcontent-%COMP%]:hover {\n opacity: 1;\n}\n\n.column-item.dragging[_ngcontent-%COMP%] {\n opacity: 0.4;\n}\n\n.column-item.drop-target[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n\n.drop-indicator[_ngcontent-%COMP%] {\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 1px;\n margin: 0 10px;\n}\n\n\n\n.drag-handle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n cursor: grab;\n color: var(--mj-text-disabled);\n font-size: 12px;\n padding: 4px 2px;\n}\n\n.drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.column-item[_ngcontent-%COMP%]:hover .drag-handle[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.column-name[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.alias-indicator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-brand-primary);\n margin-left: 4px;\n}\n\n.format-indicator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-status-warning);\n margin-left: 4px;\n}\n\n\n\n.column-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.column-item[_ngcontent-%COMP%]:hover .column-actions[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.action-btn.show-btn[_ngcontent-%COMP%] {\n opacity: 0;\n}\n\n.column-item[_ngcontent-%COMP%]:hover .action-btn.show-btn[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.action-btn.show-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.action-btn.format-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning);\n}\n\n.action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.empty-list[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.empty-list[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n}\n\n\n\n.format-editor[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.format-editor-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.back-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.back-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n.format-editor-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.format-section[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\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: var(--mj-text-secondary);\n}\n\n.format-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.format-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0;\n}\n\n.format-row[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.format-row.alias-info[_ngcontent-%COMP%] {\n padding: 4px 0;\n}\n\n.muted-text[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.clear-alias-btn[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n transition: all 0.15s ease;\n}\n\n.clear-alias-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n}\n\n\n\n.format-input[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease;\n}\n\n.format-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.format-input.small[_ngcontent-%COMP%] {\n width: 60px;\n text-align: center;\n}\n\n.format-select[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n cursor: pointer;\n}\n\n.format-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n\n\n.color-input[_ngcontent-%COMP%] {\n width: 36px;\n height: 28px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n}\n\n\n\n.alignment-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n padding: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.align-btn[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.align-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.align-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n\n\n.style-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-bottom: 12px;\n}\n\n.style-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.style-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.style-btn.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.format-preview-section[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.preview-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: var(--mj-text-secondary);\n}\n\n.preview-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.preview-table[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.preview-header-cell[_ngcontent-%COMP%] {\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.preview-cell[_ngcontent-%COMP%] {\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.preview-cell[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n\n\n.format-actions[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.clear-format-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.clear-format-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n\n\n.sorting-section[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.sorting-header[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.sorting-description[_ngcontent-%COMP%], \n.aggregates-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n}\n\n\n\n.add-sort-btn[_ngcontent-%COMP%], \n.add-aggregate-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n width: 100%;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n background: transparent;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n margin-bottom: 12px;\n}\n\n.add-sort-btn[_ngcontent-%COMP%]:hover:not(:disabled), \n.add-aggregate-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.add-sort-btn[_ngcontent-%COMP%]:disabled, \n.add-aggregate-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.sort-items-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.sort-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n transition: all 0.15s ease;\n}\n\n.sort-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.sort-item.dragging[_ngcontent-%COMP%] {\n opacity: 0.4;\n}\n\n.sort-item.drop-target[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n\n\n.sort-drop-indicator[_ngcontent-%COMP%] {\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 1px;\n margin: 0 10px;\n}\n\n\n\n.sort-priority-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 6px;\n font-size: 11px;\n font-weight: 700;\n flex-shrink: 0;\n}\n\n\n\n.sort-drag-handle[_ngcontent-%COMP%] {\n cursor: grab;\n color: var(--mj-text-disabled);\n padding: 2px;\n font-size: 12px;\n}\n\n.sort-drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.sort-item[_ngcontent-%COMP%]:hover .sort-drag-handle[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.sort-field-dropdown[_ngcontent-%COMP%] {\n flex: 1;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n cursor: pointer;\n min-width: 0;\n}\n\n.sort-field-dropdown[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n\n\n.sort-direction-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n padding: 2px;\n gap: 2px;\n}\n\n.direction-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 5px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.direction-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n color: var(--mj-text-secondary);\n}\n\n.direction-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n.direction-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\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: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.sort-remove-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.sort-remove-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\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: var(--mj-bg-surface-card);\n border-radius: 8px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.sort-hint[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n margin-top: 1px;\n}\n\n\n\n.sort-empty-state[_ngcontent-%COMP%], \n.aggregates-empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n text-align: center;\n}\n\n.sort-empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.aggregates-empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n opacity: 0.4;\n}\n\n.sort-empty-state[_ngcontent-%COMP%] span[_ngcontent-%COMP%], \n.aggregates-empty-state[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n}\n\n.sort-empty-hint[_ngcontent-%COMP%], \n.empty-hint[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-disabled);\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: 12px;\n padding: 12px 14px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n transition: all 0.15s ease;\n text-align: left;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\n}\n\n.filter-mode-btn.active[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.filter-mode-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mode-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n font-size: 16px;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n.filter-mode-btn.active[_ngcontent-%COMP%] .mode-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.mode-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mode-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mode-subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.mode-check[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n\n\n.smart-filter-section[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.smart-filter-input-container[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n margin-bottom: 12px;\n}\n\n.smart-filter-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n padding-top: 4px;\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.smart-filter-textarea[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n outline: none;\n resize: vertical;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n min-height: 60px;\n}\n\n.smart-filter-textarea[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.smart-filter-textarea[_ngcontent-%COMP%]:disabled {\n color: var(--mj-text-muted);\n}\n\n\n\n.smart-filter-explanation[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n border-radius: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n color: var(--mj-brand-primary);\n}\n\n.smart-filter-explanation[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-top: 2px;\n}\n\n\n\n.smart-filter-examples[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.examples-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n}\n\n.examples-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.example-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.example-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.example-chip[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\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}\n\n\n\n.smart-filter-tip[_ngcontent-%COMP%], \n.traditional-filter-tip[_ngcontent-%COMP%], \n.aggregates-tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 12px;\n}\n\n.smart-filter-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.traditional-filter-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.aggregates-tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n margin-top: 1px;\n}\n\n\n\n.traditional-filter-section[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.filter-summary-container[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.filter-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\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 display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding: 0 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 11px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.summary-text[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.summary-text.no-filters[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-weight: 400;\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: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.summary-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\n}\n\n.summary-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.summary-btn.clear-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.summary-btn.primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.summary-btn.primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.aggregates-section[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.aggregates-header[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n\n\n.aggregates-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.aggregate-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n transition: all 0.15s ease;\n}\n\n.aggregate-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.aggregate-item.disabled[_ngcontent-%COMP%] {\n opacity: 0.5;\n}\n\n\n\n.agg-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 8px;\n color: var(--mj-brand-primary);\n font-size: 14px;\n flex-shrink: 0;\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: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.agg-details[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 2px;\n}\n\n.agg-type[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.agg-smart-badge[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n\n\n.agg-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.aggregate-item[_ngcontent-%COMP%]:hover .agg-actions[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.agg-action-btn[_ngcontent-%COMP%] {\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.agg-action-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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: var(--mj-brand-primary);\n}\n\n.agg-action-btn.remove-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.agg-action-btn.edit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n.aggregates-summary[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n margin-bottom: 12px;\n}\n\n.aggregates-summary[_ngcontent-%COMP%] .summary-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.aggregates-summary[_ngcontent-%COMP%] .summary-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\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: var(--mj-text-secondary);\n}\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.form-input.invalid[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 60px;\n font-family: inherit;\n}\n\n.validation-error[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-status-error);\n margin-top: 4px;\n}\n\n\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n margin-top: 3px;\n flex-shrink: 0;\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: 13px;\n color: var(--mj-text-primary);\n}\n\n.checkbox-text[_ngcontent-%COMP%] small[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.danger-zone[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.danger-zone[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.delete-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n border: 1px solid var(--mj-status-error);\n border-radius: 8px;\n background: var(--mj-status-error-bg);\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-error);\n transition: all 0.15s ease;\n}\n\n.delete-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n\n\n.validation-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--mj-status-error-bg);\n border-top: 1px solid var(--mj-status-error);\n font-size: 13px;\n color: var(--mj-status-error);\n flex-shrink: 0;\n}\n\n\n\n.panel-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.footer-left[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.footer-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 9px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.footer-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\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: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.footer-btn.primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.footer-btn.cancel-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.footer-btn.cancel-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-active);\n}\n\n\n\n@media (max-width: 480px) {\n .config-panel[_ngcontent-%COMP%] {\n width: 100vw;\n min-width: auto;\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
|
|
2821
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.MJEmptyStateComponent, i2.MJAlertComponent, i3.AggregateSetupDialogComponent, i4.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: 1200; \n\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: 60px;\n right: 0;\n width: 450px;\n min-width: 360px;\n max-width: min(800px, 100vw);\n height: calc(100% - 60px);\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n z-index: 1201; \n\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: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.resize-grip[_ngcontent-%COMP%] {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\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: var(--mj-brand-primary);\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 var(--mj-border-default);\n background: var(--mj-bg-surface-card);\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: var(--mj-text-primary);\n}\n\n.header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.close-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n\n\n.tab-nav[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\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 cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 500;\n transition: all 0.15s ease;\n position: relative;\n white-space: nowrap;\n}\n\n.tab-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.tab-btn.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.tab-btn.active[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 8px;\n right: 8px;\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 2px 2px 0 0;\n}\n\n.tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.tab-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n}\n\n\n\n.tab-nav.icon-only[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n padding: 12px 8px;\n}\n\n\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.tab-content[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n\n\n.config-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 0;\n margin-bottom: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.column-count[_ngcontent-%COMP%] {\n margin-left: auto;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 500;\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: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n margin-bottom: 8px;\n}\n\n.column-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\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: 13px;\n background: transparent;\n color: var(--mj-text-primary);\n}\n\n.column-search[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n\n\n.column-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n\n\n.column-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-radius: 8px;\n transition: background 0.15s ease;\n cursor: default;\n}\n\n.column-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.column-item.hidden[_ngcontent-%COMP%] {\n opacity: 0.7;\n}\n\n.column-item.hidden[_ngcontent-%COMP%]:hover {\n opacity: 1;\n}\n\n.column-item.dragging[_ngcontent-%COMP%] {\n opacity: 0.4;\n}\n\n.column-item.drop-target[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n\n\n.drop-indicator[_ngcontent-%COMP%] {\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 1px;\n margin: 0 10px;\n}\n\n\n\n.drag-handle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n cursor: grab;\n color: var(--mj-text-disabled);\n font-size: 12px;\n padding: 4px 2px;\n}\n\n.drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.column-item[_ngcontent-%COMP%]:hover .drag-handle[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.column-name[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.alias-indicator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-brand-primary);\n margin-left: 4px;\n}\n\n.format-indicator[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-status-warning);\n margin-left: 4px;\n}\n\n\n\n.column-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.column-item[_ngcontent-%COMP%]:hover .column-actions[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.action-btn.show-btn[_ngcontent-%COMP%] {\n opacity: 0;\n}\n\n.column-item[_ngcontent-%COMP%]:hover .action-btn.show-btn[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.action-btn.show-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.action-btn.format-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning);\n}\n\n.action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.format-editor[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.format-editor-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.back-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.back-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n.format-editor-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.format-section[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\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: var(--mj-text-secondary);\n}\n\n.format-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.format-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0;\n}\n\n.format-row[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.format-row.alias-info[_ngcontent-%COMP%] {\n padding: 4px 0;\n}\n\n.muted-text[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.clear-alias-btn[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n transition: all 0.15s ease;\n}\n\n.clear-alias-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n}\n\n\n\n.format-input[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease;\n}\n\n.format-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.format-input.small[_ngcontent-%COMP%] {\n width: 60px;\n text-align: center;\n}\n\n.format-select[_ngcontent-%COMP%] {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n cursor: pointer;\n}\n\n.format-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n\n\n.color-input[_ngcontent-%COMP%] {\n width: 36px;\n height: 28px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n}\n\n\n\n.alignment-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n padding: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.align-btn[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.align-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.align-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n\n\n.style-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-bottom: 12px;\n}\n\n.style-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.style-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.style-btn.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.format-preview-section[_ngcontent-%COMP%] {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.preview-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: var(--mj-text-secondary);\n}\n\n.preview-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.preview-table[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.preview-header-cell[_ngcontent-%COMP%] {\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.preview-cell[_ngcontent-%COMP%] {\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.preview-cell[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n\n\n.format-actions[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.clear-format-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.clear-format-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n\n\n.sorting-section[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.sorting-header[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.sorting-description[_ngcontent-%COMP%], \n.aggregates-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n}\n\n\n\n.add-sort-btn[_ngcontent-%COMP%], \n.add-aggregate-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n width: 100%;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n background: transparent;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n margin-bottom: 12px;\n}\n\n.add-sort-btn[_ngcontent-%COMP%]:hover:not(:disabled), \n.add-aggregate-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.add-sort-btn[_ngcontent-%COMP%]:disabled, \n.add-aggregate-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.sort-items-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.sort-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n transition: all 0.15s ease;\n}\n\n.sort-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.sort-item.dragging[_ngcontent-%COMP%] {\n opacity: 0.4;\n}\n\n.sort-item.drop-target[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n\n\n.sort-drop-indicator[_ngcontent-%COMP%] {\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 1px;\n margin: 0 10px;\n}\n\n\n\n.sort-priority-badge[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 6px;\n font-size: 11px;\n font-weight: 700;\n flex-shrink: 0;\n}\n\n\n\n.sort-drag-handle[_ngcontent-%COMP%] {\n cursor: grab;\n color: var(--mj-text-disabled);\n padding: 2px;\n font-size: 12px;\n}\n\n.sort-drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.sort-item[_ngcontent-%COMP%]:hover .sort-drag-handle[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.sort-field-dropdown[_ngcontent-%COMP%] {\n flex: 1;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n cursor: pointer;\n min-width: 0;\n}\n\n.sort-field-dropdown[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n\n\n.sort-direction-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n padding: 2px;\n gap: 2px;\n}\n\n.direction-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 5px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.direction-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n color: var(--mj-text-secondary);\n}\n\n.direction-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n.direction-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\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: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.sort-remove-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.sort-remove-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n\n\n\n\n.view-config-alert-pos[_ngcontent-%COMP%] { margin-top: 12px; }\n.view-config-alert-pos-mb[_ngcontent-%COMP%] { margin-bottom: 12px; }\n.view-config-validation-pos[_ngcontent-%COMP%] { margin: 0 16px 12px; }\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: 12px;\n padding: 12px 14px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n transition: all 0.15s ease;\n text-align: left;\n}\n\n.filter-mode-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\n}\n\n.filter-mode-btn.active[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.filter-mode-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mode-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n font-size: 16px;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n.filter-mode-btn.active[_ngcontent-%COMP%] .mode-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.mode-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mode-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mode-subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.mode-check[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n\n\n.smart-filter-section[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.smart-filter-input-container[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n margin-bottom: 12px;\n}\n\n.smart-filter-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n padding-top: 4px;\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.smart-filter-textarea[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n outline: none;\n resize: vertical;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n min-height: 60px;\n}\n\n.smart-filter-textarea[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.smart-filter-textarea[_ngcontent-%COMP%]:disabled {\n color: var(--mj-text-muted);\n}\n\n\n\n\n\n.smart-filter-examples[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.examples-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n}\n\n.examples-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.example-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.example-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.example-chip[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\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}\n\n\n\n.traditional-filter-section[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.filter-summary-container[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.filter-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\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 display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding: 0 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 11px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.summary-text[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.summary-text.no-filters[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-weight: 400;\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: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.summary-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\n}\n\n.summary-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.summary-btn.clear-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.summary-btn.primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.summary-btn.primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.aggregates-section[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.aggregates-header[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n\n\n.aggregates-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.aggregate-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n transition: all 0.15s ease;\n}\n\n.aggregate-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.aggregate-item.disabled[_ngcontent-%COMP%] {\n opacity: 0.5;\n}\n\n\n\n.agg-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 8px;\n color: var(--mj-brand-primary);\n font-size: 14px;\n flex-shrink: 0;\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: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.agg-details[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 2px;\n}\n\n.agg-type[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.agg-smart-badge[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n\n\n.agg-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.aggregate-item[_ngcontent-%COMP%]:hover .agg-actions[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.agg-action-btn[_ngcontent-%COMP%] {\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.agg-action-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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: var(--mj-brand-primary);\n}\n\n.agg-action-btn.remove-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.agg-action-btn.edit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n.aggregates-summary[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n margin-bottom: 12px;\n}\n\n.aggregates-summary[_ngcontent-%COMP%] .summary-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.aggregates-summary[_ngcontent-%COMP%] .summary-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\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: var(--mj-text-secondary);\n}\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.form-input.invalid[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 60px;\n font-family: inherit;\n}\n\n.validation-error[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-status-error);\n margin-top: 4px;\n}\n\n\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.checkbox-label[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n margin-top: 3px;\n flex-shrink: 0;\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: 13px;\n color: var(--mj-text-primary);\n}\n\n.checkbox-text[_ngcontent-%COMP%] small[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.danger-zone[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.danger-zone[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.delete-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n border: 1px solid var(--mj-status-error);\n border-radius: 8px;\n background: var(--mj-status-error-bg);\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-error);\n transition: all 0.15s ease;\n}\n\n.delete-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n\n\n.panel-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.footer-left[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.footer-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 9px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.footer-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\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: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.footer-btn.primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.footer-btn.cancel-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.footer-btn.cancel-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-active);\n}\n\n\n\n@media (max-width: 480px) {\n .config-panel[_ngcontent-%COMP%] {\n width: 100vw;\n min-width: auto;\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
|
|
2855
2822
|
}
|
|
2856
2823
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ViewConfigPanelComponent, [{
|
|
2857
2824
|
type: Component,
|
|
2858
|
-
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\" aria-label=\"Close panel\">\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 || DefaultSaveAsNew) {\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\" aria-label=\"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 && DefaultSaveAsNew) {\n <!-- Creating a new view (from quick Save dialog) -->\n <button\n class=\"footer-btn save-btn primary\"\n (click)=\"OnSaveAsNew()\"\n [disabled]=\"IsSaving || !IsValidForSaveAsNew\">\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 ? 'Saving...' : 'Create View' }}\n </button>\n }\n @if (!ViewEntity && !DefaultSaveAsNew) {\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: 1200; /* Above Leaflet map (1000), content-header (1100) */\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: 60px;\n right: 0;\n width: 450px;\n min-width: 360px;\n max-width: min(800px, 100vw);\n height: calc(100% - 60px);\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n z-index: 1201; /* Above backdrop (1200) */\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: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.resize-grip {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\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: var(--mj-brand-primary);\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 var(--mj-border-default);\n background: var(--mj-bg-surface-card);\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: var(--mj-text-primary);\n}\n\n.header-title i {\n color: var(--mj-brand-primary);\n}\n\n.close-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* Tab Navigation */\n.tab-nav {\n display: flex;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\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 cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 500;\n transition: all 0.15s ease;\n position: relative;\n white-space: nowrap;\n}\n\n.tab-btn:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.tab-btn.active {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.tab-btn.active::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 8px;\n right: 8px;\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 2px 2px 0 0;\n}\n\n.tab-btn i {\n font-size: 14px;\n}\n\n.tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n}\n\n/* Icon-only mode for narrow panel */\n.tab-nav.icon-only .tab-btn {\n padding: 12px 8px;\n}\n\n/* Panel Content */\n.panel-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.tab-content {\n padding: 16px;\n}\n\n/* Config Sections */\n.config-section {\n margin-bottom: 20px;\n}\n\n.section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 0;\n margin-bottom: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-header i {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.column-count {\n margin-left: auto;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 500;\n}\n\n/* Column Search */\n.column-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n margin-bottom: 8px;\n}\n\n.column-search i {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.column-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 13px;\n background: transparent;\n color: var(--mj-text-primary);\n}\n\n.column-search input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* Column List */\n.column-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n/* Column Item */\n.column-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-radius: 8px;\n transition: background 0.15s ease;\n cursor: default;\n}\n\n.column-item:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.column-item.hidden {\n opacity: 0.7;\n}\n\n.column-item.hidden:hover {\n opacity: 1;\n}\n\n.column-item.dragging {\n opacity: 0.4;\n}\n\n.column-item.drop-target {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n/* Drop Indicator */\n.drop-indicator {\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 1px;\n margin: 0 10px;\n}\n\n/* Drag Handle */\n.drag-handle {\n display: flex;\n align-items: center;\n cursor: grab;\n color: var(--mj-text-disabled);\n font-size: 12px;\n padding: 4px 2px;\n}\n\n.drag-handle:active {\n cursor: grabbing;\n}\n\n.column-item:hover .drag-handle {\n color: var(--mj-text-muted);\n}\n\n/* Column Name */\n.column-name {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.alias-indicator {\n font-size: 10px;\n color: var(--mj-brand-primary);\n margin-left: 4px;\n}\n\n.format-indicator {\n font-size: 10px;\n color: var(--mj-status-warning);\n margin-left: 4px;\n}\n\n/* Column Actions */\n.column-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.column-item:hover .column-actions {\n opacity: 1;\n}\n\n.action-btn {\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.action-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.action-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.action-btn.hide-btn:hover {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.action-btn.show-btn {\n opacity: 0;\n}\n\n.column-item:hover .action-btn.show-btn {\n opacity: 1;\n}\n\n.action-btn.show-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.action-btn.format-btn:hover {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning);\n}\n\n.action-btn i {\n font-size: 12px;\n}\n\n/* Empty List */\n.empty-list {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.empty-list i {\n color: var(--mj-text-disabled);\n}\n\n/* Format Editor */\n.format-editor {\n padding: 0;\n}\n\n.format-editor-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.back-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.back-btn:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n.format-editor-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* Format Sections */\n.format-section {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\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: var(--mj-text-secondary);\n}\n\n.format-section-header i {\n color: var(--mj-text-muted);\n}\n\n/* Format Rows */\n.format-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0;\n}\n\n.format-row label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.format-row.alias-info {\n padding: 4px 0;\n}\n\n.muted-text {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.clear-alias-btn {\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n transition: all 0.15s ease;\n}\n\n.clear-alias-btn:hover {\n color: var(--mj-status-error);\n}\n\n/* Format Input */\n.format-input {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease;\n}\n\n.format-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.format-input.small {\n width: 60px;\n text-align: center;\n}\n\n.format-select {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n cursor: pointer;\n}\n\n.format-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n/* Color Input */\n.color-input {\n width: 36px;\n height: 28px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n}\n\n/* Alignment Toggle */\n.alignment-toggle {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n padding: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.align-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.align-btn:hover {\n color: var(--mj-text-secondary);\n}\n\n.align-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n/* Style Buttons */\n.style-buttons {\n display: flex;\n gap: 4px;\n margin-bottom: 12px;\n}\n\n.style-btn {\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.style-btn:hover {\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.style-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* Format Preview */\n.format-preview-section {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.preview-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: var(--mj-text-secondary);\n}\n\n.preview-header i {\n color: var(--mj-text-muted);\n}\n\n.preview-table {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.preview-header-cell {\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.preview-cell {\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.preview-cell:last-child {\n border-bottom: none;\n}\n\n/* Format Actions */\n.format-actions {\n padding: 16px;\n}\n\n.clear-format-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.clear-format-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n/* Sorting Section */\n.sorting-section {\n padding: 0;\n}\n\n.sorting-header {\n margin-bottom: 12px;\n}\n\n.sorting-description,\n.aggregates-description {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n}\n\n/* Add Sort Button */\n.add-sort-btn,\n.add-aggregate-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n width: 100%;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n background: transparent;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n margin-bottom: 12px;\n}\n\n.add-sort-btn:hover:not(:disabled),\n.add-aggregate-btn:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.add-sort-btn:disabled,\n.add-aggregate-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Sort Items List */\n.sort-items-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.sort-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n transition: all 0.15s ease;\n}\n\n.sort-item:hover {\n border-color: var(--mj-border-strong);\n}\n\n.sort-item.dragging {\n opacity: 0.4;\n}\n\n.sort-item.drop-target {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n/* Sort Drop Indicator */\n.sort-drop-indicator {\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 1px;\n margin: 0 10px;\n}\n\n/* Sort Priority Badge */\n.sort-priority-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 6px;\n font-size: 11px;\n font-weight: 700;\n flex-shrink: 0;\n}\n\n/* Sort Drag Handle */\n.sort-drag-handle {\n cursor: grab;\n color: var(--mj-text-disabled);\n padding: 2px;\n font-size: 12px;\n}\n\n.sort-drag-handle:active {\n cursor: grabbing;\n}\n\n.sort-item:hover .sort-drag-handle {\n color: var(--mj-text-muted);\n}\n\n/* Sort Field Dropdown */\n.sort-field-dropdown {\n flex: 1;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n cursor: pointer;\n min-width: 0;\n}\n\n.sort-field-dropdown:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n/* Sort Direction Toggle */\n.sort-direction-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n padding: 2px;\n gap: 2px;\n}\n\n.direction-btn {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 5px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.direction-btn:hover:not(:disabled) {\n color: var(--mj-text-secondary);\n}\n\n.direction-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n.direction-btn:disabled {\n opacity: 0.3;\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: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.sort-remove-btn:hover:not(:disabled) {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.sort-remove-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\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: var(--mj-bg-surface-card);\n border-radius: 8px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.sort-hint i {\n color: var(--mj-text-disabled);\n margin-top: 1px;\n}\n\n/* Sort Empty State */\n.sort-empty-state,\n.aggregates-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 32px 16px;\n color: var(--mj-text-muted);\n text-align: center;\n}\n\n.sort-empty-state i,\n.aggregates-empty-state i {\n font-size: 32px;\n opacity: 0.4;\n}\n\n.sort-empty-state span,\n.aggregates-empty-state span {\n font-size: 14px;\n font-weight: 500;\n}\n\n.sort-empty-hint,\n.empty-hint {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-disabled);\n}\n\n/* Filter Mode Selector */\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: 12px;\n padding: 12px 14px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n transition: all 0.15s ease;\n text-align: left;\n}\n\n.filter-mode-btn:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\n}\n\n.filter-mode-btn.active {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.filter-mode-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mode-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n font-size: 16px;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n.filter-mode-btn.active .mode-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.mode-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mode-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mode-subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.mode-check {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n/* Smart Filter Section */\n.smart-filter-section {\n padding: 0;\n}\n\n.smart-filter-input-container {\n display: flex;\n gap: 12px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n margin-bottom: 12px;\n}\n\n.smart-filter-icon {\n display: flex;\n align-items: flex-start;\n padding-top: 4px;\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.smart-filter-textarea {\n flex: 1;\n border: none;\n outline: none;\n resize: vertical;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n min-height: 60px;\n}\n\n.smart-filter-textarea::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.smart-filter-textarea:disabled {\n color: var(--mj-text-muted);\n}\n\n/* Smart Filter Explanation */\n.smart-filter-explanation {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n border-radius: 8px;\n margin-bottom: 12px;\n font-size: 13px;\n color: var(--mj-brand-primary);\n}\n\n.smart-filter-explanation i {\n margin-top: 2px;\n}\n\n/* Smart Filter Examples */\n.smart-filter-examples {\n margin-bottom: 12px;\n}\n\n.examples-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n}\n\n.examples-header i {\n color: var(--mj-status-warning);\n}\n\n.example-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.example-chip {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.example-chip:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\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}\n\n/* Smart Filter Tip */\n.smart-filter-tip,\n.traditional-filter-tip,\n.aggregates-tip {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 12px;\n}\n\n.smart-filter-tip i,\n.traditional-filter-tip i,\n.aggregates-tip i {\n color: var(--mj-text-disabled);\n margin-top: 1px;\n}\n\n/* Traditional Filter Section */\n.traditional-filter-section {\n padding: 0;\n}\n\n.filter-summary-container {\n margin-bottom: 12px;\n}\n\n.filter-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n}\n\n.summary-info {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding: 0 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 11px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.summary-text {\n font-size: 13px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.summary-text.no-filters {\n color: var(--mj-text-muted);\n font-weight: 400;\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: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.summary-btn:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\n}\n\n.summary-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.summary-btn.clear-btn:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.summary-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.summary-btn.primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* Aggregates Section */\n.aggregates-section {\n padding: 0;\n}\n\n.aggregates-header {\n margin-bottom: 12px;\n}\n\n/* Aggregates List */\n.aggregates-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.aggregate-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n transition: all 0.15s ease;\n}\n\n.aggregate-item:hover {\n border-color: var(--mj-border-strong);\n}\n\n.aggregate-item.disabled {\n opacity: 0.5;\n}\n\n/* Aggregate Icon */\n.agg-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 8px;\n color: var(--mj-brand-primary);\n font-size: 14px;\n flex-shrink: 0;\n}\n\n/* Aggregate Content */\n.agg-content {\n flex: 1;\n min-width: 0;\n}\n\n.agg-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.agg-details {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 2px;\n}\n\n.agg-type {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.agg-smart-badge {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n/* Aggregate Actions */\n.agg-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.aggregate-item:hover .agg-actions {\n opacity: 1;\n}\n\n.agg-action-btn {\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.agg-action-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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: var(--mj-brand-primary);\n}\n\n.agg-action-btn.remove-btn:hover:not(:disabled) {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.agg-action-btn.edit-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* Aggregates Summary */\n.aggregates-summary {\n display: flex;\n gap: 16px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n margin-bottom: 12px;\n}\n\n.aggregates-summary .summary-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.aggregates-summary .summary-item i {\n color: var(--mj-text-disabled);\n}\n\n/* Settings Tab */\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: var(--mj-text-secondary);\n}\n\n.form-input {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.form-input.invalid {\n border-color: var(--mj-status-error);\n}\n\n.form-textarea {\n resize: vertical;\n min-height: 60px;\n font-family: inherit;\n}\n\n.validation-error {\n font-size: 12px;\n color: var(--mj-status-error);\n margin-top: 4px;\n}\n\n/* Checkbox */\n.checkbox-label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.checkbox-label input[type=\"checkbox\"] {\n margin-top: 3px;\n flex-shrink: 0;\n}\n\n.checkbox-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-text strong {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.checkbox-text small {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* Danger Zone */\n.danger-zone .section-header {\n color: var(--mj-status-error);\n}\n\n.danger-zone .section-header i {\n color: var(--mj-status-error);\n}\n\n.delete-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n border: 1px solid var(--mj-status-error);\n border-radius: 8px;\n background: var(--mj-status-error-bg);\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-error);\n transition: all 0.15s ease;\n}\n\n.delete-btn:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n/* Validation Banner */\n.validation-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--mj-status-error-bg);\n border-top: 1px solid var(--mj-status-error);\n font-size: 13px;\n color: var(--mj-status-error);\n flex-shrink: 0;\n}\n\n/* Panel Footer */\n.panel-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.footer-left {\n display: flex;\n gap: 8px;\n}\n\n.footer-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 9px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.footer-btn:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\n}\n\n.footer-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.footer-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.footer-btn.primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.footer-btn.cancel-btn {\n background: var(--mj-bg-surface-card);\n}\n\n.footer-btn.cancel-btn:hover {\n background: var(--mj-bg-surface-active);\n}\n\n/* Responsive */\n@media (max-width: 480px) {\n .config-panel {\n width: 100vw;\n min-width: auto;\n }\n\n .resize-handle {\n display: none;\n }\n}\n"] }]
|
|
2825
|
+
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\" aria-label=\"Close panel\">\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 || DefaultSaveAsNew) {\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 <mj-empty-state\n Size=\"compact\"\n Variant=\"warning\"\n Title=\"No columns visible. Add columns from below.\" />\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 <mj-empty-state\n Size=\"compact\"\n Variant=\"success\"\n Title=\"All columns are visible\" />\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\" aria-label=\"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 <mj-alert Variant=\"info\" Size=\"sm\">Drag items to change priority. Records sort by first level, then second, etc.</mj-alert>\n }\n } @else {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-arrow-up-wide-short\"\n Title=\"No sorting configured\"\n Message='Click \"Add Sort Level\" to define how records should be ordered' />\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 <mj-alert Variant=\"info\" Size=\"sm\" Icon=\"fa-solid fa-robot\" class=\"view-config-alert-pos-mb\">{{ SmartFilterExplanation }}</mj-alert>\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 <mj-alert Variant=\"info\" Size=\"sm\" class=\"view-config-alert-pos\">The AI will interpret your description and create the appropriate filter when you save the view.</mj-alert>\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 <mj-alert Variant=\"info\" Size=\"sm\" class=\"view-config-alert-pos\">Build precise filters by selecting fields, operators, and values. Use groups for complex AND/OR logic.</mj-alert>\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 <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-chart-simple\"\n Title=\"No aggregates configured\"\n Message='Click \"Add Aggregate\" to create summary calculations' />\n }\n\n <!-- Info Tip -->\n <mj-alert Variant=\"info\" Size=\"sm\" class=\"view-config-alert-pos\">Aggregates are calculated server-side for accuracy with filtered/paginated data.</mj-alert>\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 <mj-alert Variant=\"error\" Size=\"sm\" class=\"view-config-validation-pos\">At least one column must be visible</mj-alert>\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 && DefaultSaveAsNew) {\n <!-- Creating a new view (from quick Save dialog) -->\n <button\n class=\"footer-btn save-btn primary\"\n (click)=\"OnSaveAsNew()\"\n [disabled]=\"IsSaving || !IsValidForSaveAsNew\">\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 ? 'Saving...' : 'Create View' }}\n </button>\n }\n @if (!ViewEntity && !DefaultSaveAsNew) {\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: 1200; /* Above Leaflet map (1000), content-header (1100) */\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: 60px;\n right: 0;\n width: 450px;\n min-width: 360px;\n max-width: min(800px, 100vw);\n height: calc(100% - 60px);\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px rgba(0, 0, 0, 0.15);\n z-index: 1201; /* Above backdrop (1200) */\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: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.resize-grip {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\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: var(--mj-brand-primary);\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 var(--mj-border-default);\n background: var(--mj-bg-surface-card);\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: var(--mj-text-primary);\n}\n\n.header-title i {\n color: var(--mj-brand-primary);\n}\n\n.close-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* Tab Navigation */\n.tab-nav {\n display: flex;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\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 cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 500;\n transition: all 0.15s ease;\n position: relative;\n white-space: nowrap;\n}\n\n.tab-btn:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.tab-btn.active {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.tab-btn.active::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 8px;\n right: 8px;\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 2px 2px 0 0;\n}\n\n.tab-btn i {\n font-size: 14px;\n}\n\n.tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n}\n\n/* Icon-only mode for narrow panel */\n.tab-nav.icon-only .tab-btn {\n padding: 12px 8px;\n}\n\n/* Panel Content */\n.panel-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.tab-content {\n padding: 16px;\n}\n\n/* Config Sections */\n.config-section {\n margin-bottom: 20px;\n}\n\n.section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 0;\n margin-bottom: 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-header i {\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.column-count {\n margin-left: auto;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 12px;\n font-weight: 500;\n}\n\n/* Column Search */\n.column-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n margin-bottom: 8px;\n}\n\n.column-search i {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.column-search input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 13px;\n background: transparent;\n color: var(--mj-text-primary);\n}\n\n.column-search input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* Column List */\n.column-list {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n/* Column Item */\n.column-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n border-radius: 8px;\n transition: background 0.15s ease;\n cursor: default;\n}\n\n.column-item:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.column-item.hidden {\n opacity: 0.7;\n}\n\n.column-item.hidden:hover {\n opacity: 1;\n}\n\n.column-item.dragging {\n opacity: 0.4;\n}\n\n.column-item.drop-target {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n/* Drop Indicator */\n.drop-indicator {\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 1px;\n margin: 0 10px;\n}\n\n/* Drag Handle */\n.drag-handle {\n display: flex;\n align-items: center;\n cursor: grab;\n color: var(--mj-text-disabled);\n font-size: 12px;\n padding: 4px 2px;\n}\n\n.drag-handle:active {\n cursor: grabbing;\n}\n\n.column-item:hover .drag-handle {\n color: var(--mj-text-muted);\n}\n\n/* Column Name */\n.column-name {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.alias-indicator {\n font-size: 10px;\n color: var(--mj-brand-primary);\n margin-left: 4px;\n}\n\n.format-indicator {\n font-size: 10px;\n color: var(--mj-status-warning);\n margin-left: 4px;\n}\n\n/* Column Actions */\n.column-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.column-item:hover .column-actions {\n opacity: 1;\n}\n\n.action-btn {\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.action-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.action-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n.action-btn.hide-btn:hover {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.action-btn.show-btn {\n opacity: 0;\n}\n\n.column-item:hover .action-btn.show-btn {\n opacity: 1;\n}\n\n.action-btn.show-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.action-btn.format-btn:hover {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning);\n}\n\n.action-btn i {\n font-size: 12px;\n}\n\n/* Format Editor */\n.format-editor {\n padding: 0;\n}\n\n.format-editor-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.back-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.back-btn:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n.format-editor-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* Format Sections */\n.format-section {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\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: var(--mj-text-secondary);\n}\n\n.format-section-header i {\n color: var(--mj-text-muted);\n}\n\n/* Format Rows */\n.format-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0;\n}\n\n.format-row label {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.format-row.alias-info {\n padding: 4px 0;\n}\n\n.muted-text {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.clear-alias-btn {\n width: 24px;\n height: 24px;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n transition: all 0.15s ease;\n}\n\n.clear-alias-btn:hover {\n color: var(--mj-status-error);\n}\n\n/* Format Input */\n.format-input {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease;\n}\n\n.format-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.format-input.small {\n width: 60px;\n text-align: center;\n}\n\n.format-select {\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n cursor: pointer;\n}\n\n.format-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n/* Color Input */\n.color-input {\n width: 36px;\n height: 28px;\n padding: 2px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n background: var(--mj-bg-surface);\n}\n\n/* Alignment Toggle */\n.alignment-toggle {\n display: flex;\n gap: 4px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n padding: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.align-btn {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.align-btn:hover {\n color: var(--mj-text-secondary);\n}\n\n.align-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n/* Style Buttons */\n.style-buttons {\n display: flex;\n gap: 4px;\n margin-bottom: 12px;\n}\n\n.style-btn {\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.style-btn:hover {\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n}\n\n.style-btn.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* Format Preview */\n.format-preview-section {\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.preview-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: var(--mj-text-secondary);\n}\n\n.preview-header i {\n color: var(--mj-text-muted);\n}\n\n.preview-table {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n}\n\n.preview-header-cell {\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.preview-cell {\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.preview-cell:last-child {\n border-bottom: none;\n}\n\n/* Format Actions */\n.format-actions {\n padding: 16px;\n}\n\n.clear-format-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.clear-format-btn:hover {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n/* Sorting Section */\n.sorting-section {\n padding: 0;\n}\n\n.sorting-header {\n margin-bottom: 12px;\n}\n\n.sorting-description,\n.aggregates-description {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n}\n\n/* Add Sort Button */\n.add-sort-btn,\n.add-aggregate-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n width: 100%;\n border: 2px dashed var(--mj-border-default);\n border-radius: 10px;\n background: transparent;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n margin-bottom: 12px;\n}\n\n.add-sort-btn:hover:not(:disabled),\n.add-aggregate-btn:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.add-sort-btn:disabled,\n.add-aggregate-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Sort Items List */\n.sort-items-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.sort-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n transition: all 0.15s ease;\n}\n\n.sort-item:hover {\n border-color: var(--mj-border-strong);\n}\n\n.sort-item.dragging {\n opacity: 0.4;\n}\n\n.sort-item.drop-target {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n/* Sort Drop Indicator */\n.sort-drop-indicator {\n height: 2px;\n background: var(--mj-brand-primary);\n border-radius: 1px;\n margin: 0 10px;\n}\n\n/* Sort Priority Badge */\n.sort-priority-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 6px;\n font-size: 11px;\n font-weight: 700;\n flex-shrink: 0;\n}\n\n/* Sort Drag Handle */\n.sort-drag-handle {\n cursor: grab;\n color: var(--mj-text-disabled);\n padding: 2px;\n font-size: 12px;\n}\n\n.sort-drag-handle:active {\n cursor: grabbing;\n}\n\n.sort-item:hover .sort-drag-handle {\n color: var(--mj-text-muted);\n}\n\n/* Sort Field Dropdown */\n.sort-field-dropdown {\n flex: 1;\n padding: 6px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n cursor: pointer;\n min-width: 0;\n}\n\n.sort-field-dropdown:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n/* Sort Direction Toggle */\n.sort-direction-toggle {\n display: flex;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n padding: 2px;\n gap: 2px;\n}\n\n.direction-btn {\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 5px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.direction-btn:hover:not(:disabled) {\n color: var(--mj-text-secondary);\n}\n\n.direction-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n\n.direction-btn:disabled {\n opacity: 0.3;\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: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-disabled);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.sort-remove-btn:hover:not(:disabled) {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.sort-remove-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n/* Positioning-only helpers for migrated <mj-alert> callouts. Box chrome\n (bg/border/radius/padding/icon) is owned by the component; only the\n surrounding margins from the bespoke banners are preserved here. */\n.view-config-alert-pos { margin-top: 12px; }\n.view-config-alert-pos-mb { margin-bottom: 12px; }\n.view-config-validation-pos { margin: 0 16px 12px; }\n\n/* Filter Mode Selector */\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: 12px;\n padding: 12px 14px;\n border: 2px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n transition: all 0.15s ease;\n text-align: left;\n}\n\n.filter-mode-btn:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\n}\n\n.filter-mode-btn.active {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.filter-mode-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mode-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n font-size: 16px;\n color: var(--mj-text-muted);\n flex-shrink: 0;\n}\n\n.filter-mode-btn.active .mode-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.mode-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mode-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mode-subtitle {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.mode-check {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n/* Smart Filter Section */\n.smart-filter-section {\n padding: 0;\n}\n\n.smart-filter-input-container {\n display: flex;\n gap: 12px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n margin-bottom: 12px;\n}\n\n.smart-filter-icon {\n display: flex;\n align-items: flex-start;\n padding-top: 4px;\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.smart-filter-textarea {\n flex: 1;\n border: none;\n outline: none;\n resize: vertical;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n min-height: 60px;\n}\n\n.smart-filter-textarea::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.smart-filter-textarea:disabled {\n color: var(--mj-text-muted);\n}\n\n/* Smart Filter Explanation */\n/* Smart Filter Examples */\n.smart-filter-examples {\n margin-bottom: 12px;\n}\n\n.examples-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n}\n\n.examples-header i {\n color: var(--mj-status-warning);\n}\n\n.example-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.example-chip {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12px;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.example-chip:hover:not(:disabled) {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\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}\n\n/* Traditional Filter Section */\n.traditional-filter-section {\n padding: 0;\n}\n\n.filter-summary-container {\n margin-bottom: 12px;\n}\n\n.filter-summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 14px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n}\n\n.summary-info {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.filter-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding: 0 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 11px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.summary-text {\n font-size: 13px;\n color: var(--mj-text-primary);\n font-weight: 500;\n}\n\n.summary-text.no-filters {\n color: var(--mj-text-muted);\n font-weight: 400;\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: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.summary-btn:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\n}\n\n.summary-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.summary-btn.clear-btn:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n}\n\n.summary-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.summary-btn.primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* Aggregates Section */\n.aggregates-section {\n padding: 0;\n}\n\n.aggregates-header {\n margin-bottom: 12px;\n}\n\n/* Aggregates List */\n.aggregates-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.aggregate-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n transition: all 0.15s ease;\n}\n\n.aggregate-item:hover {\n border-color: var(--mj-border-strong);\n}\n\n.aggregate-item.disabled {\n opacity: 0.5;\n}\n\n/* Aggregate Icon */\n.agg-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 8px;\n color: var(--mj-brand-primary);\n font-size: 14px;\n flex-shrink: 0;\n}\n\n/* Aggregate Content */\n.agg-content {\n flex: 1;\n min-width: 0;\n}\n\n.agg-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.agg-details {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 2px;\n}\n\n.agg-type {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.agg-smart-badge {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n/* Aggregate Actions */\n.agg-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.aggregate-item:hover .agg-actions {\n opacity: 1;\n}\n\n.agg-action-btn {\n width: 26px;\n height: 26px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 12px;\n transition: all 0.15s ease;\n}\n\n.agg-action-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\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: var(--mj-brand-primary);\n}\n\n.agg-action-btn.remove-btn:hover:not(:disabled) {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.agg-action-btn.edit-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* Aggregates Summary */\n.aggregates-summary {\n display: flex;\n gap: 16px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n margin-bottom: 12px;\n}\n\n.aggregates-summary .summary-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.aggregates-summary .summary-item i {\n color: var(--mj-text-disabled);\n}\n\n/* Settings Tab */\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: var(--mj-text-secondary);\n}\n\n.form-input {\n width: 100%;\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n transition: border-color 0.15s ease;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.form-input.invalid {\n border-color: var(--mj-status-error);\n}\n\n.form-textarea {\n resize: vertical;\n min-height: 60px;\n font-family: inherit;\n}\n\n.validation-error {\n font-size: 12px;\n color: var(--mj-status-error);\n margin-top: 4px;\n}\n\n/* Checkbox */\n.checkbox-label {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n cursor: pointer;\n}\n\n.checkbox-label input[type=\"checkbox\"] {\n margin-top: 3px;\n flex-shrink: 0;\n}\n\n.checkbox-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.checkbox-text strong {\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.checkbox-text small {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* Danger Zone */\n.danger-zone .section-header {\n color: var(--mj-status-error);\n}\n\n.danger-zone .section-header i {\n color: var(--mj-status-error);\n}\n\n.delete-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n border: 1px solid var(--mj-status-error);\n border-radius: 8px;\n background: var(--mj-status-error-bg);\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-status-error);\n transition: all 0.15s ease;\n}\n\n.delete-btn:hover {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n/* Panel Footer */\n.panel-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n flex-shrink: 0;\n}\n\n.footer-left {\n display: flex;\n gap: 8px;\n}\n\n.footer-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 9px 18px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.footer-btn:hover:not(:disabled) {\n border-color: var(--mj-border-strong);\n}\n\n.footer-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.footer-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.footer-btn.primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.footer-btn.cancel-btn {\n background: var(--mj-bg-surface-card);\n}\n\n.footer-btn.cancel-btn:hover {\n background: var(--mj-bg-surface-active);\n}\n\n/* Responsive */\n@media (max-width: 480px) {\n .config-panel {\n width: 100vw;\n min-width: auto;\n }\n\n .resize-handle {\n display: none;\n }\n}\n"] }]
|
|
2859
2826
|
}], () => [{ type: i0.ChangeDetectorRef }], { Entity: [{
|
|
2860
2827
|
type: Input
|
|
2861
2828
|
}], ViewEntity: [{
|