@memberjunction/ng-entity-viewer 6.2.0-edge.0 → 6.2.0-edge.1
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-setup-dialog/aggregate-setup-dialog.component.d.ts +22 -0
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.d.ts.map +1 -1
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.js +57 -13
- package/dist/lib/aggregate-setup-dialog/aggregate-setup-dialog.component.js.map +1 -1
- package/dist/lib/entity-cards/entity-cards.component.d.ts +67 -5
- package/dist/lib/entity-cards/entity-cards.component.d.ts.map +1 -1
- package/dist/lib/entity-cards/entity-cards.component.js +202 -71
- package/dist/lib/entity-cards/entity-cards.component.js.map +1 -1
- package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts +159 -16
- 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 +446 -147
- package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -1
- package/dist/lib/entity-data-grid/events/grid-events.js +67 -67
- package/dist/lib/entity-data-grid/events/grid-events.js.map +1 -1
- package/dist/lib/entity-record-detail-panel/entity-record-detail-panel.component.d.ts +112 -8
- 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 +245 -61
- 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 +6 -0
- package/dist/lib/entity-viewer/entity-viewer.component.d.ts.map +1 -1
- package/dist/lib/entity-viewer/entity-viewer.component.js +28 -9
- package/dist/lib/entity-viewer/entity-viewer.component.js.map +1 -1
- package/dist/lib/pill/pill.component.d.ts +13 -3
- package/dist/lib/pill/pill.component.d.ts.map +1 -1
- package/dist/lib/pill/pill.component.js +34 -10
- package/dist/lib/pill/pill.component.js.map +1 -1
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.d.ts +29 -3
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.d.ts.map +1 -1
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.js +173 -114
- package/dist/lib/quick-save-dialog/quick-save-dialog.component.js.map +1 -1
- package/dist/lib/recycle-bin/recycle-bin.component.d.ts +4 -0
- package/dist/lib/recycle-bin/recycle-bin.component.d.ts.map +1 -1
- package/dist/lib/recycle-bin/recycle-bin.component.js +10 -2
- package/dist/lib/recycle-bin/recycle-bin.component.js.map +1 -1
- package/dist/lib/utils/highlight.util.d.ts +6 -0
- package/dist/lib/utils/highlight.util.d.ts.map +1 -1
- package/dist/lib/utils/highlight.util.js +23 -11
- package/dist/lib/utils/highlight.util.js.map +1 -1
- package/dist/lib/utils/record.util.d.ts +10 -0
- package/dist/lib/utils/record.util.d.ts.map +1 -1
- package/dist/lib/utils/record.util.js +20 -4
- package/dist/lib/utils/record.util.js.map +1 -1
- package/dist/lib/view-config-panel/view-config-panel.component.d.ts +17 -1
- package/dist/lib/view-config-panel/view-config-panel.component.d.ts.map +1 -1
- package/dist/lib/view-config-panel/view-config-panel.component.js +39 -6
- package/dist/lib/view-config-panel/view-config-panel.component.js.map +1 -1
- package/dist/lib/view-selector/view-selector.component.js +2 -2
- package/dist/lib/view-types/renderers/cards-view-renderer.component.d.ts +15 -3
- package/dist/lib/view-types/renderers/cards-view-renderer.component.d.ts.map +1 -1
- package/dist/lib/view-types/renderers/cards-view-renderer.component.js +33 -5
- package/dist/lib/view-types/renderers/cards-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/renderers/grid-view-renderer.component.d.ts +70 -2
- 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 +155 -33
- 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 +16 -2
- 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 +37 -9
- package/dist/lib/view-types/renderers/map-view-renderer.component.js.map +1 -1
- package/dist/lib/view-types/view-type.contracts.d.ts +8 -0
- package/dist/lib/view-types/view-type.contracts.d.ts.map +1 -1
- package/dist/lib/view-types/view-type.contracts.js.map +1 -1
- package/dist/lib/view-workspace/view-workspace.component.d.ts +243 -25
- package/dist/lib/view-workspace/view-workspace.component.d.ts.map +1 -1
- package/dist/lib/view-workspace/view-workspace.component.js +631 -180
- package/dist/lib/view-workspace/view-workspace.component.js.map +1 -1
- package/package.json +21 -20
|
@@ -1,147 +1,148 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "@angular/forms";
|
|
4
|
+
const _c0 = ["nameInput"];
|
|
4
5
|
function QuickSaveDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
5
|
-
const
|
|
6
|
-
i0.ɵɵelementStart(0, "div",
|
|
7
|
-
i0.ɵɵlistener("click", function QuickSaveDialogComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(
|
|
6
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
7
|
+
i0.ɵɵelementStart(0, "div", 27);
|
|
8
|
+
i0.ɵɵlistener("click", function QuickSaveDialogComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnClose()); });
|
|
8
9
|
i0.ɵɵelementEnd();
|
|
9
10
|
} }
|
|
10
11
|
function QuickSaveDialogComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
11
|
-
i0.ɵɵelementStart(0, "span",
|
|
12
|
+
i0.ɵɵelementStart(0, "span", 6);
|
|
12
13
|
i0.ɵɵtext(1);
|
|
13
14
|
i0.ɵɵelementEnd();
|
|
14
15
|
} if (rf & 2) {
|
|
15
|
-
const
|
|
16
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
16
17
|
i0.ɵɵadvance();
|
|
17
|
-
i0.ɵɵtextInterpolate(
|
|
18
|
+
i0.ɵɵtextInterpolate(ctx_r2.EntityName);
|
|
18
19
|
} }
|
|
19
|
-
function
|
|
20
|
-
i0.ɵɵelementStart(0, "span",
|
|
20
|
+
function QuickSaveDialogComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
+
i0.ɵɵelementStart(0, "span", 13);
|
|
21
22
|
i0.ɵɵtext(1, "Name is required");
|
|
22
23
|
i0.ɵɵelementEnd();
|
|
23
24
|
} }
|
|
24
|
-
function
|
|
25
|
-
i0.ɵɵelementStart(0, "div",
|
|
26
|
-
i0.ɵɵelement(1, "i",
|
|
25
|
+
function QuickSaveDialogComponent_Conditional_30_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
26
|
+
i0.ɵɵelementStart(0, "div", 31);
|
|
27
|
+
i0.ɵɵelement(1, "i", 34);
|
|
27
28
|
i0.ɵɵelementStart(2, "span");
|
|
28
29
|
i0.ɵɵtext(3);
|
|
29
30
|
i0.ɵɵelementEnd()();
|
|
30
31
|
} if (rf & 2) {
|
|
31
|
-
const
|
|
32
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
32
33
|
i0.ɵɵadvance(3);
|
|
33
|
-
i0.ɵɵtextInterpolate2("",
|
|
34
|
+
i0.ɵɵtextInterpolate2("", ctx_r2.Summary.SortCount, " sort level", ctx_r2.Summary.SortCount !== 1 ? "s" : "");
|
|
34
35
|
} }
|
|
35
|
-
function
|
|
36
|
-
i0.ɵɵelementStart(0, "div",
|
|
37
|
-
i0.ɵɵelement(1, "i",
|
|
36
|
+
function QuickSaveDialogComponent_Conditional_30_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
+
i0.ɵɵelementStart(0, "div", 33);
|
|
38
|
+
i0.ɵɵelement(1, "i", 35);
|
|
38
39
|
i0.ɵɵelementStart(2, "span");
|
|
39
40
|
i0.ɵɵtext(3);
|
|
40
41
|
i0.ɵɵelementEnd()();
|
|
41
42
|
} if (rf & 2) {
|
|
42
|
-
const
|
|
43
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
43
44
|
i0.ɵɵadvance(3);
|
|
44
|
-
i0.ɵɵtextInterpolate1("Smart filter: \"",
|
|
45
|
+
i0.ɵɵtextInterpolate1("Smart filter: \"", ctx_r2.Summary.SmartFilterPrompt, "\"");
|
|
45
46
|
} }
|
|
46
|
-
function
|
|
47
|
-
i0.ɵɵelementStart(0, "div",
|
|
48
|
-
i0.ɵɵelement(1, "i",
|
|
47
|
+
function QuickSaveDialogComponent_Conditional_30_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
i0.ɵɵelementStart(0, "div", 31);
|
|
49
|
+
i0.ɵɵelement(1, "i", 36);
|
|
49
50
|
i0.ɵɵelementStart(2, "span");
|
|
50
51
|
i0.ɵɵtext(3);
|
|
51
52
|
i0.ɵɵelementEnd()();
|
|
52
53
|
} if (rf & 2) {
|
|
53
|
-
const
|
|
54
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
54
55
|
i0.ɵɵadvance(3);
|
|
55
|
-
i0.ɵɵtextInterpolate2("",
|
|
56
|
+
i0.ɵɵtextInterpolate2("", ctx_r2.Summary.FilterCount, " filter", ctx_r2.Summary.FilterCount !== 1 ? "s" : "");
|
|
56
57
|
} }
|
|
57
|
-
function
|
|
58
|
-
i0.ɵɵelementStart(0, "div",
|
|
59
|
-
i0.ɵɵelement(1, "i",
|
|
58
|
+
function QuickSaveDialogComponent_Conditional_30_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
59
|
+
i0.ɵɵelementStart(0, "div", 31);
|
|
60
|
+
i0.ɵɵelement(1, "i", 37);
|
|
60
61
|
i0.ɵɵelementStart(2, "span");
|
|
61
62
|
i0.ɵɵtext(3);
|
|
62
63
|
i0.ɵɵelementEnd()();
|
|
63
64
|
} if (rf & 2) {
|
|
64
|
-
const
|
|
65
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
65
66
|
i0.ɵɵadvance(3);
|
|
66
|
-
i0.ɵɵtextInterpolate2("",
|
|
67
|
+
i0.ɵɵtextInterpolate2("", ctx_r2.Summary.AggregateCount, " aggregate", ctx_r2.Summary.AggregateCount !== 1 ? "s" : "");
|
|
67
68
|
} }
|
|
68
|
-
function
|
|
69
|
-
i0.ɵɵelementStart(0, "div",
|
|
70
|
-
i0.ɵɵelement(2, "i",
|
|
69
|
+
function QuickSaveDialogComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
|
|
70
|
+
i0.ɵɵelementStart(0, "div", 20)(1, "div", 28);
|
|
71
|
+
i0.ɵɵelement(2, "i", 29);
|
|
71
72
|
i0.ɵɵelementStart(3, "span");
|
|
72
73
|
i0.ɵɵtext(4, "View includes:");
|
|
73
74
|
i0.ɵɵelementEnd()();
|
|
74
|
-
i0.ɵɵelementStart(5, "div",
|
|
75
|
-
i0.ɵɵelement(7, "i",
|
|
75
|
+
i0.ɵɵelementStart(5, "div", 30)(6, "div", 31);
|
|
76
|
+
i0.ɵɵelement(7, "i", 32);
|
|
76
77
|
i0.ɵɵelementStart(8, "span");
|
|
77
78
|
i0.ɵɵtext(9);
|
|
78
79
|
i0.ɵɵelementEnd()();
|
|
79
|
-
i0.ɵɵconditionalCreate(10,
|
|
80
|
-
i0.ɵɵconditionalCreate(11,
|
|
81
|
-
i0.ɵɵconditionalCreate(12,
|
|
82
|
-
i0.ɵɵconditionalCreate(13,
|
|
80
|
+
i0.ɵɵconditionalCreate(10, QuickSaveDialogComponent_Conditional_30_Conditional_10_Template, 4, 2, "div", 31);
|
|
81
|
+
i0.ɵɵconditionalCreate(11, QuickSaveDialogComponent_Conditional_30_Conditional_11_Template, 4, 1, "div", 33);
|
|
82
|
+
i0.ɵɵconditionalCreate(12, QuickSaveDialogComponent_Conditional_30_Conditional_12_Template, 4, 2, "div", 31);
|
|
83
|
+
i0.ɵɵconditionalCreate(13, QuickSaveDialogComponent_Conditional_30_Conditional_13_Template, 4, 2, "div", 31);
|
|
83
84
|
i0.ɵɵelementEnd()();
|
|
84
85
|
} if (rf & 2) {
|
|
85
|
-
const
|
|
86
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
86
87
|
i0.ɵɵadvance(9);
|
|
87
|
-
i0.ɵɵtextInterpolate2("",
|
|
88
|
+
i0.ɵɵtextInterpolate2("", ctx_r2.Summary.ColumnCount, " column", ctx_r2.Summary.ColumnCount !== 1 ? "s" : "");
|
|
88
89
|
i0.ɵɵadvance();
|
|
89
|
-
i0.ɵɵconditional(
|
|
90
|
+
i0.ɵɵconditional(ctx_r2.Summary.SortCount > 0 ? 10 : -1);
|
|
90
91
|
i0.ɵɵadvance();
|
|
91
|
-
i0.ɵɵconditional(
|
|
92
|
+
i0.ɵɵconditional(ctx_r2.Summary.SmartFilterActive ? 11 : -1);
|
|
92
93
|
i0.ɵɵadvance();
|
|
93
|
-
i0.ɵɵconditional(
|
|
94
|
+
i0.ɵɵconditional(ctx_r2.Summary.FilterCount > 0 ? 12 : -1);
|
|
94
95
|
i0.ɵɵadvance();
|
|
95
|
-
i0.ɵɵconditional(
|
|
96
|
+
i0.ɵɵconditional(ctx_r2.Summary.AggregateCount > 0 ? 13 : -1);
|
|
96
97
|
} }
|
|
97
|
-
function
|
|
98
|
-
i0.ɵɵelement(0, "i", 38);
|
|
99
|
-
} }
|
|
100
|
-
function QuickSaveDialogComponent_Conditional_36_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
98
|
+
function QuickSaveDialogComponent_Conditional_37_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
101
99
|
i0.ɵɵelement(0, "i", 39);
|
|
102
100
|
} }
|
|
103
|
-
function
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
101
|
+
function QuickSaveDialogComponent_Conditional_37_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
102
|
+
i0.ɵɵelement(0, "i", 40);
|
|
103
|
+
} }
|
|
104
|
+
function QuickSaveDialogComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
|
|
105
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
106
|
+
i0.ɵɵelementStart(0, "button", 38);
|
|
107
|
+
i0.ɵɵlistener("click", function QuickSaveDialogComponent_Conditional_37_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnSave(false)); });
|
|
108
|
+
i0.ɵɵconditionalCreate(1, QuickSaveDialogComponent_Conditional_37_Conditional_1_Template, 1, 0, "i", 39)(2, QuickSaveDialogComponent_Conditional_37_Conditional_2_Template, 1, 0, "i", 40);
|
|
108
109
|
i0.ɵɵtext(3);
|
|
109
110
|
i0.ɵɵelementEnd();
|
|
110
|
-
i0.ɵɵelementStart(4, "button",
|
|
111
|
-
i0.ɵɵlistener("click", function
|
|
112
|
-
i0.ɵɵelement(5, "i",
|
|
111
|
+
i0.ɵɵelementStart(4, "button", 41);
|
|
112
|
+
i0.ɵɵlistener("click", function QuickSaveDialogComponent_Conditional_37_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnSave(true)); });
|
|
113
|
+
i0.ɵɵelement(5, "i", 42);
|
|
113
114
|
i0.ɵɵtext(6, " Save As New ");
|
|
114
115
|
i0.ɵɵelementEnd();
|
|
115
116
|
} if (rf & 2) {
|
|
116
|
-
const
|
|
117
|
-
i0.ɵɵproperty("disabled", !
|
|
117
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
118
|
+
i0.ɵɵproperty("disabled", !ctx_r2.Name.trim() || ctx_r2.IsSaving);
|
|
118
119
|
i0.ɵɵadvance();
|
|
119
|
-
i0.ɵɵconditional(
|
|
120
|
+
i0.ɵɵconditional(ctx_r2.IsSaving ? 1 : 2);
|
|
120
121
|
i0.ɵɵadvance(2);
|
|
121
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
122
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.IsSaving ? "Saving..." : "Update", " ");
|
|
122
123
|
i0.ɵɵadvance();
|
|
123
|
-
i0.ɵɵproperty("disabled", !
|
|
124
|
+
i0.ɵɵproperty("disabled", !ctx_r2.Name.trim() || ctx_r2.IsSaving);
|
|
124
125
|
} }
|
|
125
|
-
function
|
|
126
|
-
i0.ɵɵelement(0, "i",
|
|
126
|
+
function QuickSaveDialogComponent_Conditional_38_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
127
|
+
i0.ɵɵelement(0, "i", 39);
|
|
127
128
|
} }
|
|
128
|
-
function
|
|
129
|
-
i0.ɵɵelement(0, "i",
|
|
129
|
+
function QuickSaveDialogComponent_Conditional_38_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
130
|
+
i0.ɵɵelement(0, "i", 42);
|
|
130
131
|
} }
|
|
131
|
-
function
|
|
132
|
-
const
|
|
133
|
-
i0.ɵɵelementStart(0, "button",
|
|
134
|
-
i0.ɵɵlistener("click", function
|
|
135
|
-
i0.ɵɵconditionalCreate(1,
|
|
132
|
+
function QuickSaveDialogComponent_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
133
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
134
|
+
i0.ɵɵelementStart(0, "button", 38);
|
|
135
|
+
i0.ɵɵlistener("click", function QuickSaveDialogComponent_Conditional_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnSave(true)); });
|
|
136
|
+
i0.ɵɵconditionalCreate(1, QuickSaveDialogComponent_Conditional_38_Conditional_1_Template, 1, 0, "i", 39)(2, QuickSaveDialogComponent_Conditional_38_Conditional_2_Template, 1, 0, "i", 42);
|
|
136
137
|
i0.ɵɵtext(3);
|
|
137
138
|
i0.ɵɵelementEnd();
|
|
138
139
|
} if (rf & 2) {
|
|
139
|
-
const
|
|
140
|
-
i0.ɵɵproperty("disabled", !
|
|
140
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
141
|
+
i0.ɵɵproperty("disabled", !ctx_r2.Name.trim() || ctx_r2.IsSaving);
|
|
141
142
|
i0.ɵɵadvance();
|
|
142
|
-
i0.ɵɵconditional(
|
|
143
|
+
i0.ɵɵconditional(ctx_r2.IsSaving ? 1 : 2);
|
|
143
144
|
i0.ɵɵadvance(2);
|
|
144
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
145
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.IsSaving ? "Saving..." : "Create View", " ");
|
|
145
146
|
} }
|
|
146
147
|
/**
|
|
147
148
|
* QuickSaveDialogComponent - Focused modal for saving views quickly
|
|
@@ -194,6 +195,13 @@ export class QuickSaveDialogComponent {
|
|
|
194
195
|
* Whether to default to Save As New mode (no longer used for toggle, kept for API compat)
|
|
195
196
|
*/
|
|
196
197
|
DefaultSaveAsNew = false;
|
|
198
|
+
/**
|
|
199
|
+
* Name to pre-fill when creating a NEW view, so the user can accept it with a single click.
|
|
200
|
+
* The field is focused and its text selected on open, so typing replaces it outright.
|
|
201
|
+
*
|
|
202
|
+
* Ignored when {@link ViewEntity} is set — an existing view's own name always wins.
|
|
203
|
+
*/
|
|
204
|
+
SuggestedName = '';
|
|
197
205
|
/**
|
|
198
206
|
* Emitted when the user saves
|
|
199
207
|
*/
|
|
@@ -207,17 +215,39 @@ export class QuickSaveDialogComponent {
|
|
|
207
215
|
* Carries the partially-filled form data so the config panel can continue the flow.
|
|
208
216
|
*/
|
|
209
217
|
OpenAdvanced = new EventEmitter();
|
|
218
|
+
/** The name input, focused and selected whenever the dialog opens. */
|
|
219
|
+
nameInput;
|
|
210
220
|
// Form state
|
|
211
221
|
Name = '';
|
|
212
222
|
Description = '';
|
|
213
223
|
IsShared = false;
|
|
214
224
|
NameTouched = false;
|
|
225
|
+
/**
|
|
226
|
+
* True when the dialog opened before the view existed, so the focus has to wait for
|
|
227
|
+
* `ngAfterViewInit`. The panel is always in the DOM (only `[class.open]` toggles), so after
|
|
228
|
+
* the first render the ViewChild is resolved and opening can focus synchronously.
|
|
229
|
+
*/
|
|
230
|
+
focusPending = false;
|
|
231
|
+
viewReady = false;
|
|
215
232
|
constructor(cdr) {
|
|
216
233
|
this.cdr = cdr;
|
|
217
234
|
}
|
|
218
235
|
ngOnChanges(changes) {
|
|
219
236
|
if (changes['IsOpen'] && this.IsOpen) {
|
|
220
237
|
this.initializeForm();
|
|
238
|
+
if (this.viewReady) {
|
|
239
|
+
this.focusNameField();
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
this.focusPending = true;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
ngAfterViewInit() {
|
|
247
|
+
this.viewReady = true;
|
|
248
|
+
if (this.focusPending) {
|
|
249
|
+
this.focusPending = false;
|
|
250
|
+
this.focusNameField();
|
|
221
251
|
}
|
|
222
252
|
}
|
|
223
253
|
/**
|
|
@@ -231,12 +261,30 @@ export class QuickSaveDialogComponent {
|
|
|
231
261
|
this.IsShared = this.ViewEntity.IsShared;
|
|
232
262
|
}
|
|
233
263
|
else {
|
|
234
|
-
this.Name = '';
|
|
264
|
+
this.Name = this.SuggestedName || '';
|
|
235
265
|
this.Description = '';
|
|
236
266
|
this.IsShared = false;
|
|
237
267
|
}
|
|
238
268
|
this.cdr.detectChanges();
|
|
239
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Put the cursor in the name field with its text selected: one click accepts a suggested
|
|
272
|
+
* name, one keystroke replaces it.
|
|
273
|
+
*
|
|
274
|
+
* Deferred by a microtask because `ngModel` writes the seeded value to the element on one of
|
|
275
|
+
* its own — selecting first would select an empty field and leave the caret at the end once
|
|
276
|
+
* the value landed.
|
|
277
|
+
*/
|
|
278
|
+
focusNameField() {
|
|
279
|
+
queueMicrotask(() => {
|
|
280
|
+
const input = this.nameInput?.nativeElement;
|
|
281
|
+
if (!input || !this.IsOpen) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
input.focus();
|
|
285
|
+
input.select();
|
|
286
|
+
});
|
|
287
|
+
}
|
|
240
288
|
/**
|
|
241
289
|
* Handle save button click
|
|
242
290
|
* @param saveAsNew - true to create a new view, false to update existing
|
|
@@ -268,57 +316,63 @@ export class QuickSaveDialogComponent {
|
|
|
268
316
|
});
|
|
269
317
|
}
|
|
270
318
|
static ɵfac = function QuickSaveDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || QuickSaveDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
271
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QuickSaveDialogComponent, selectors: [["mj-quick-save-dialog"]],
|
|
272
|
-
i0.ɵɵ
|
|
273
|
-
|
|
274
|
-
|
|
319
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QuickSaveDialogComponent, selectors: [["mj-quick-save-dialog"]], viewQuery: function QuickSaveDialogComponent_Query(rf, ctx) { if (rf & 1) {
|
|
320
|
+
i0.ɵɵviewQuery(_c0, 5);
|
|
321
|
+
} if (rf & 2) {
|
|
322
|
+
let _t;
|
|
323
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.nameInput = _t.first);
|
|
324
|
+
} }, inputs: { IsOpen: "IsOpen", ViewEntity: "ViewEntity", EntityName: "EntityName", Summary: "Summary", IsSaving: "IsSaving", DefaultSaveAsNew: "DefaultSaveAsNew", SuggestedName: "SuggestedName" }, outputs: { Save: "Save", Close: "Close", OpenAdvanced: "OpenAdvanced" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 41, vars: 12, consts: [["nameInput", ""], [1, "dialog-backdrop"], [1, "dialog-panel"], [1, "dialog-header"], [1, "header-title"], [1, "fa-solid", "fa-bookmark"], [1, "entity-badge"], ["title", "Close", "aria-label", "Close dialog", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "dialog-content"], [1, "form-group"], ["for", "quickSaveName"], ["id", "quickSaveName", "type", "text", "placeholder", "e.g., Active West Coast Contacts", 1, "form-input", 3, "ngModelChange", "blur", "keydown.enter", "ngModel"], [1, "validation-error"], ["for", "quickSaveDescription"], [1, "optional"], ["id", "quickSaveDescription", "placeholder", "What does this view show?", "rows", "2", 1, "form-input", "form-textarea", 3, "ngModelChange", "ngModel"], [1, "checkbox-label"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "checkbox-text"], [1, "summary-section"], [1, "advanced-link", 3, "click"], [1, "fa-solid", "fa-sliders"], [1, "dialog-footer"], [1, "footer-actions"], [1, "btn", "btn-primary", 3, "disabled"], [1, "btn", "btn-cancel", 3, "click"], [1, "dialog-backdrop", 3, "click"], [1, "summary-header"], [1, "fa-solid", "fa-list-check"], [1, "summary-items"], [1, "summary-item"], [1, "fa-solid", "fa-columns"], [1, "summary-item", "smart-filter"], [1, "fa-solid", "fa-arrow-up-wide-short"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-chart-simple"], [1, "btn", "btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-save"], [1, "btn", "btn-secondary", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"]], template: function QuickSaveDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
325
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
326
|
+
i0.ɵɵconditionalCreate(0, QuickSaveDialogComponent_Conditional_0_Template, 1, 0, "div", 1);
|
|
327
|
+
i0.ɵɵelementStart(1, "div", 2)(2, "div", 3)(3, "div", 4);
|
|
328
|
+
i0.ɵɵelement(4, "i", 5);
|
|
275
329
|
i0.ɵɵelementStart(5, "span");
|
|
276
330
|
i0.ɵɵtext(6, "Save View");
|
|
277
331
|
i0.ɵɵelementEnd()();
|
|
278
|
-
i0.ɵɵconditionalCreate(7, QuickSaveDialogComponent_Conditional_7_Template, 2, 1, "span",
|
|
279
|
-
i0.ɵɵelementStart(8, "button",
|
|
332
|
+
i0.ɵɵconditionalCreate(7, QuickSaveDialogComponent_Conditional_7_Template, 2, 1, "span", 6);
|
|
333
|
+
i0.ɵɵelementStart(8, "button", 7);
|
|
280
334
|
i0.ɵɵlistener("click", function QuickSaveDialogComponent_Template_button_click_8_listener() { return ctx.OnClose(); });
|
|
281
|
-
i0.ɵɵelement(9, "i",
|
|
335
|
+
i0.ɵɵelement(9, "i", 8);
|
|
282
336
|
i0.ɵɵelementEnd()();
|
|
283
|
-
i0.ɵɵelementStart(10, "div",
|
|
337
|
+
i0.ɵɵelementStart(10, "div", 9)(11, "div", 10)(12, "label", 11);
|
|
284
338
|
i0.ɵɵtext(13, "View Name");
|
|
285
339
|
i0.ɵɵelementEnd();
|
|
286
|
-
i0.ɵɵelementStart(14, "input",
|
|
287
|
-
i0.ɵɵtwoWayListener("ngModelChange", function QuickSaveDialogComponent_Template_input_ngModelChange_14_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.Name, $event) || (ctx.Name = $event); return $event; });
|
|
340
|
+
i0.ɵɵelementStart(14, "input", 12, 0);
|
|
341
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QuickSaveDialogComponent_Template_input_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.Name, $event) || (ctx.Name = $event); return i0.ɵɵresetView($event); });
|
|
288
342
|
i0.ɵɵlistener("blur", function QuickSaveDialogComponent_Template_input_blur_14_listener() { return ctx.NameTouched = true; })("keydown.enter", function QuickSaveDialogComponent_Template_input_keydown_enter_14_listener() { return ctx.OnSave(false); });
|
|
289
343
|
i0.ɵɵelementEnd();
|
|
290
|
-
i0.ɵɵconditionalCreate(
|
|
344
|
+
i0.ɵɵconditionalCreate(16, QuickSaveDialogComponent_Conditional_16_Template, 2, 0, "span", 13);
|
|
291
345
|
i0.ɵɵelementEnd();
|
|
292
|
-
i0.ɵɵelementStart(
|
|
293
|
-
i0.ɵɵtext(
|
|
294
|
-
i0.ɵɵelementStart(
|
|
295
|
-
i0.ɵɵtext(
|
|
346
|
+
i0.ɵɵelementStart(17, "div", 10)(18, "label", 14);
|
|
347
|
+
i0.ɵɵtext(19, "Description ");
|
|
348
|
+
i0.ɵɵelementStart(20, "span", 15);
|
|
349
|
+
i0.ɵɵtext(21, "(optional)");
|
|
296
350
|
i0.ɵɵelementEnd()();
|
|
297
|
-
i0.ɵɵelementStart(
|
|
298
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
351
|
+
i0.ɵɵelementStart(22, "textarea", 16);
|
|
352
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QuickSaveDialogComponent_Template_textarea_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.Description, $event) || (ctx.Description = $event); return i0.ɵɵresetView($event); });
|
|
299
353
|
i0.ɵɵelementEnd()();
|
|
300
|
-
i0.ɵɵelementStart(
|
|
301
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
354
|
+
i0.ɵɵelementStart(23, "label", 17)(24, "input", 18);
|
|
355
|
+
i0.ɵɵtwoWayListener("ngModelChange", function QuickSaveDialogComponent_Template_input_ngModelChange_24_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.IsShared, $event) || (ctx.IsShared = $event); return i0.ɵɵresetView($event); });
|
|
302
356
|
i0.ɵɵelementEnd();
|
|
303
|
-
i0.ɵɵelementStart(
|
|
304
|
-
i0.ɵɵtext(
|
|
357
|
+
i0.ɵɵelementStart(25, "span", 19)(26, "strong");
|
|
358
|
+
i0.ɵɵtext(27, "Share with others");
|
|
305
359
|
i0.ɵɵelementEnd();
|
|
306
|
-
i0.ɵɵelementStart(
|
|
307
|
-
i0.ɵɵtext(
|
|
360
|
+
i0.ɵɵelementStart(28, "small");
|
|
361
|
+
i0.ɵɵtext(29, "Allow other users to use this view");
|
|
308
362
|
i0.ɵɵelementEnd()()();
|
|
309
|
-
i0.ɵɵconditionalCreate(
|
|
310
|
-
i0.ɵɵelementStart(
|
|
311
|
-
i0.ɵɵlistener("click", function
|
|
312
|
-
i0.ɵɵelement(
|
|
313
|
-
i0.ɵɵelementStart(
|
|
314
|
-
i0.ɵɵtext(
|
|
363
|
+
i0.ɵɵconditionalCreate(30, QuickSaveDialogComponent_Conditional_30_Template, 14, 6, "div", 20);
|
|
364
|
+
i0.ɵɵelementStart(31, "button", 21);
|
|
365
|
+
i0.ɵɵlistener("click", function QuickSaveDialogComponent_Template_button_click_31_listener() { return ctx.OnOpenAdvanced(); });
|
|
366
|
+
i0.ɵɵelement(32, "i", 22);
|
|
367
|
+
i0.ɵɵelementStart(33, "span");
|
|
368
|
+
i0.ɵɵtext(34, "Customize columns, filters & sorting...");
|
|
315
369
|
i0.ɵɵelementEnd()()();
|
|
316
|
-
i0.ɵɵelementStart(
|
|
317
|
-
i0.ɵɵconditionalCreate(
|
|
370
|
+
i0.ɵɵelementStart(35, "div", 23)(36, "div", 24);
|
|
371
|
+
i0.ɵɵconditionalCreate(37, QuickSaveDialogComponent_Conditional_37_Template, 7, 4)(38, QuickSaveDialogComponent_Conditional_38_Template, 4, 3, "button", 25);
|
|
318
372
|
i0.ɵɵelementEnd();
|
|
319
|
-
i0.ɵɵelementStart(
|
|
320
|
-
i0.ɵɵlistener("click", function
|
|
321
|
-
i0.ɵɵtext(
|
|
373
|
+
i0.ɵɵelementStart(39, "button", 26);
|
|
374
|
+
i0.ɵɵlistener("click", function QuickSaveDialogComponent_Template_button_click_39_listener() { return ctx.OnClose(); });
|
|
375
|
+
i0.ɵɵtext(40, " Cancel ");
|
|
322
376
|
i0.ɵɵelementEnd()()();
|
|
323
377
|
} if (rf & 2) {
|
|
324
378
|
i0.ɵɵconditional(ctx.IsOpen ? 0 : -1);
|
|
@@ -329,21 +383,21 @@ export class QuickSaveDialogComponent {
|
|
|
329
383
|
i0.ɵɵadvance(7);
|
|
330
384
|
i0.ɵɵclassProp("invalid", ctx.NameTouched && !ctx.Name.trim());
|
|
331
385
|
i0.ɵɵtwoWayProperty("ngModel", ctx.Name);
|
|
332
|
-
i0.ɵɵadvance();
|
|
333
|
-
i0.ɵɵconditional(ctx.NameTouched && !ctx.Name.trim() ?
|
|
386
|
+
i0.ɵɵadvance(2);
|
|
387
|
+
i0.ɵɵconditional(ctx.NameTouched && !ctx.Name.trim() ? 16 : -1);
|
|
334
388
|
i0.ɵɵadvance(6);
|
|
335
389
|
i0.ɵɵtwoWayProperty("ngModel", ctx.Description);
|
|
336
390
|
i0.ɵɵadvance(2);
|
|
337
391
|
i0.ɵɵtwoWayProperty("ngModel", ctx.IsShared);
|
|
338
392
|
i0.ɵɵadvance(6);
|
|
339
|
-
i0.ɵɵconditional(ctx.Summary ?
|
|
393
|
+
i0.ɵɵconditional(ctx.Summary ? 30 : -1);
|
|
340
394
|
i0.ɵɵadvance(7);
|
|
341
|
-
i0.ɵɵconditional(ctx.ViewEntity ?
|
|
395
|
+
i0.ɵɵconditional(ctx.ViewEntity ? 37 : 38);
|
|
342
396
|
} }, dependencies: [i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["\n.dialog-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.4);\n z-index: 2000;\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.dialog-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n width: 480px;\n max-width: calc(100vw - 40px);\n max-height: calc(100vh - 60px);\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 2001;\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n\n.dialog-panel.open[_ngcontent-%COMP%] {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n}\n\n\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 18px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n border-radius: 16px 16px 0 0;\n}\n\n.header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 17px;\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 font-size: 18px;\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-sunken);\n color: var(--mj-text-primary);\n}\n\n\n.entity-badge[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 3px 10px;\n border-radius: 12px;\n margin-left: auto;\n margin-right: 8px;\n}\n\n\n.dialog-content[_ngcontent-%COMP%] {\n padding: 20px 24px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-group[_ngcontent-%COMP%] .optional[_ngcontent-%COMP%] {\n font-weight: 400;\n color: var(--mj-text-disabled);\n}\n\n.form-input[_ngcontent-%COMP%] {\n padding: 9px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n transition: border-color 0.15s ease;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\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 font-family: inherit;\n min-height: 50px;\n}\n\n.validation-error[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-status-error);\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-disabled);\n}\n\n\n.summary-section[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px;\n}\n\n.summary-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin-bottom: 10px;\n}\n\n.summary-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.summary-items[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.summary-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.summary-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n width: 16px;\n text-align: center;\n font-size: 12px;\n}\n\n.summary-item.smart-filter[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.summary-item.smart-filter[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n.advanced-link[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: none;\n background: none;\n color: var(--mj-brand-primary);\n font-size: 13px;\n cursor: pointer;\n transition: color 0.15s ease;\n}\n\n.advanced-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-color-info-600);\n text-decoration: underline;\n}\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n border-radius: 0 0 16px 16px;\n}\n\n.footer-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n\n.btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 9px 20px;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-color-info-600);\n}\n\n.btn-primary[_ngcontent-%COMP%]:disabled {\n background: color-mix(in srgb, var(--mj-brand-primary) 50%, var(--mj-bg-surface));\n cursor: not-allowed;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-strong);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-cancel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.btn-cancel[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-active);\n}"] });
|
|
343
397
|
}
|
|
344
398
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QuickSaveDialogComponent, [{
|
|
345
399
|
type: Component,
|
|
346
|
-
args: [{ standalone: false, selector: 'mj-quick-save-dialog', template: "<!-- Dialog Backdrop -->\n@if (IsOpen) {\n <div class=\"dialog-backdrop\" (click)=\"OnClose()\"></div>\n}\n\n<!-- Dialog Panel -->\n<div class=\"dialog-panel\" [class.open]=\"IsOpen\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-bookmark\"></i>\n <span>Save View</span>\n </div>\n @if (EntityName) {\n <span class=\"entity-badge\">{{ EntityName }}</span>\n }\n <button class=\"close-btn\" (click)=\"OnClose()\" title=\"Close\" aria-label=\"Close dialog\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"dialog-content\">\n <!-- Name Field -->\n <div class=\"form-group\">\n <label for=\"quickSaveName\">View Name</label>\n <input\n id=\"quickSaveName\"\n type=\"text\"\n class=\"form-input\"\n [class.invalid]=\"NameTouched && !Name.trim()\"\n placeholder=\"e.g., Active West Coast Contacts\"\n [(ngModel)]=\"Name\"\n (blur)=\"NameTouched = true\"\n (keydown.enter)=\"OnSave(false)\"\n />\n @if (NameTouched && !Name.trim()) {\n <span class=\"validation-error\">Name is required</span>\n }\n </div>\n\n <!-- Description Field -->\n <div class=\"form-group\">\n <label for=\"quickSaveDescription\">Description <span class=\"optional\">(optional)</span></label>\n <textarea\n id=\"quickSaveDescription\"\n class=\"form-input form-textarea\"\n placeholder=\"What does this view show?\"\n [(ngModel)]=\"Description\"\n rows=\"2\"\n ></textarea>\n </div>\n\n <!-- Share Toggle -->\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"IsShared\" />\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\n <!-- View Summary Preview -->\n @if (Summary) {\n <div class=\"summary-section\">\n <div class=\"summary-header\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span>View includes:</span>\n </div>\n <div class=\"summary-items\">\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-columns\"></i>\n <span>{{ Summary.ColumnCount }} column{{ Summary.ColumnCount !== 1 ? 's' : '' }}</span>\n </div>\n @if (Summary.SortCount > 0) {\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-arrow-up-wide-short\"></i>\n <span>{{ Summary.SortCount }} sort level{{ Summary.SortCount !== 1 ? 's' : '' }}</span>\n </div>\n }\n @if (Summary.SmartFilterActive) {\n <div class=\"summary-item smart-filter\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span>Smart filter: \"{{ Summary.SmartFilterPrompt }}\"</span>\n </div>\n }\n @if (Summary.FilterCount > 0) {\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>{{ Summary.FilterCount }} filter{{ Summary.FilterCount !== 1 ? 's' : '' }}</span>\n </div>\n }\n @if (Summary.AggregateCount > 0) {\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-chart-simple\"></i>\n <span>{{ Summary.AggregateCount }} aggregate{{ Summary.AggregateCount !== 1 ? 's' : '' }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Advanced Link -->\n <button class=\"advanced-link\" (click)=\"OnOpenAdvanced()\">\n <i class=\"fa-solid fa-sliders\"></i>\n <span>Customize columns, filters & sorting...</span>\n </button>\n </div>\n\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-actions\">\n @if (ViewEntity) {\n <!-- Existing view: Update + Save As New -->\n <button\n class=\"btn btn-primary\"\n (click)=\"OnSave(false)\"\n [disabled]=\"!Name.trim() || 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...' : 'Update' }}\n </button>\n <button\n class=\"btn btn-secondary\"\n (click)=\"OnSave(true)\"\n [disabled]=\"!Name.trim() || IsSaving\">\n <i class=\"fa-solid fa-plus\"></i>\n Save As New\n </button>\n } @else {\n <!-- New view: Create -->\n <button\n class=\"btn btn-primary\"\n (click)=\"OnSave(true)\"\n [disabled]=\"!Name.trim() || IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-plus\"></i>\n }\n {{ IsSaving ? 'Saving...' : 'Create View' }}\n </button>\n }\n </div>\n <button class=\"btn btn-cancel\" (click)=\"OnClose()\">\n Cancel\n </button>\n </div>\n</div>\n", styles: ["/* Dialog Backdrop */\n.dialog-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 2000;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Dialog Panel */\n.dialog-panel {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n width: 480px;\n max-width: calc(100vw - 40px);\n max-height: calc(100vh - 60px);\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 2001;\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n\n.dialog-panel.open {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n}\n\n/* Dialog Header */\n.dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 18px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n border-radius: 16px 16px 0 0;\n}\n\n.header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 17px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.header-title i {\n color: var(--mj-brand-primary);\n font-size: 18px;\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-sunken);\n color: var(--mj-text-primary);\n}\n\n/* Entity Badge */\n.entity-badge {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 3px 10px;\n border-radius: 12px;\n margin-left: auto;\n margin-right: 8px;\n}\n\n/* Dialog Content */\n.dialog-content {\n padding: 20px 24px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* Form Groups */\n.form-group {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.form-group label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-group .optional {\n font-weight: 400;\n color: var(--mj-text-disabled);\n}\n\n.form-input {\n padding: 9px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n transition: border-color 0.15s ease;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.form-input.invalid {\n border-color: var(--mj-status-error);\n}\n\n.form-textarea {\n resize: vertical;\n font-family: inherit;\n min-height: 50px;\n}\n\n.validation-error {\n font-size: 12px;\n color: var(--mj-status-error);\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-disabled);\n}\n\n/* Summary Section */\n.summary-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px;\n}\n\n.summary-header {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin-bottom: 10px;\n}\n\n.summary-header i {\n color: var(--mj-brand-primary);\n}\n\n.summary-items {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.summary-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.summary-item i {\n color: var(--mj-text-muted);\n width: 16px;\n text-align: center;\n font-size: 12px;\n}\n\n.summary-item.smart-filter {\n color: var(--mj-brand-primary);\n}\n\n.summary-item.smart-filter i {\n color: var(--mj-brand-primary);\n}\n\n/* Advanced Link */\n.advanced-link {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: none;\n background: none;\n color: var(--mj-brand-primary);\n font-size: 13px;\n cursor: pointer;\n transition: color 0.15s ease;\n}\n\n.advanced-link:hover {\n color: var(--mj-color-info-600);\n text-decoration: underline;\n}\n\n/* Dialog Footer */\n.dialog-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n border-radius: 0 0 16px 16px;\n}\n\n.footer-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* Buttons */\n.btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 9px 20px;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.btn-primary:hover:not(:disabled) {\n background: var(--mj-color-info-600);\n}\n\n.btn-primary:disabled {\n background: color-mix(in srgb, var(--mj-brand-primary) 50%, var(--mj-bg-surface));\n cursor: not-allowed;\n}\n\n.btn-secondary {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-strong);\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\n}\n\n.btn-secondary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-cancel {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.btn-cancel:hover {\n background: var(--mj-bg-surface-active);\n}\n"] }]
|
|
400
|
+
args: [{ standalone: false, selector: 'mj-quick-save-dialog', template: "<!-- Dialog Backdrop -->\n@if (IsOpen) {\n <div class=\"dialog-backdrop\" (click)=\"OnClose()\"></div>\n}\n\n<!-- Dialog Panel -->\n<div class=\"dialog-panel\" [class.open]=\"IsOpen\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-bookmark\"></i>\n <span>Save View</span>\n </div>\n @if (EntityName) {\n <span class=\"entity-badge\">{{ EntityName }}</span>\n }\n <button class=\"close-btn\" (click)=\"OnClose()\" title=\"Close\" aria-label=\"Close dialog\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"dialog-content\">\n <!-- Name Field -->\n <div class=\"form-group\">\n <label for=\"quickSaveName\">View Name</label>\n <input\n #nameInput\n id=\"quickSaveName\"\n type=\"text\"\n class=\"form-input\"\n [class.invalid]=\"NameTouched && !Name.trim()\"\n placeholder=\"e.g., Active West Coast Contacts\"\n [(ngModel)]=\"Name\"\n (blur)=\"NameTouched = true\"\n (keydown.enter)=\"OnSave(false)\"\n />\n @if (NameTouched && !Name.trim()) {\n <span class=\"validation-error\">Name is required</span>\n }\n </div>\n\n <!-- Description Field -->\n <div class=\"form-group\">\n <label for=\"quickSaveDescription\">Description <span class=\"optional\">(optional)</span></label>\n <textarea\n id=\"quickSaveDescription\"\n class=\"form-input form-textarea\"\n placeholder=\"What does this view show?\"\n [(ngModel)]=\"Description\"\n rows=\"2\"\n ></textarea>\n </div>\n\n <!-- Share Toggle -->\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"IsShared\" />\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\n <!-- View Summary Preview -->\n @if (Summary) {\n <div class=\"summary-section\">\n <div class=\"summary-header\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span>View includes:</span>\n </div>\n <div class=\"summary-items\">\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-columns\"></i>\n <span>{{ Summary.ColumnCount }} column{{ Summary.ColumnCount !== 1 ? 's' : '' }}</span>\n </div>\n @if (Summary.SortCount > 0) {\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-arrow-up-wide-short\"></i>\n <span>{{ Summary.SortCount }} sort level{{ Summary.SortCount !== 1 ? 's' : '' }}</span>\n </div>\n }\n @if (Summary.SmartFilterActive) {\n <div class=\"summary-item smart-filter\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span>Smart filter: \"{{ Summary.SmartFilterPrompt }}\"</span>\n </div>\n }\n @if (Summary.FilterCount > 0) {\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>{{ Summary.FilterCount }} filter{{ Summary.FilterCount !== 1 ? 's' : '' }}</span>\n </div>\n }\n @if (Summary.AggregateCount > 0) {\n <div class=\"summary-item\">\n <i class=\"fa-solid fa-chart-simple\"></i>\n <span>{{ Summary.AggregateCount }} aggregate{{ Summary.AggregateCount !== 1 ? 's' : '' }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Advanced Link -->\n <button class=\"advanced-link\" (click)=\"OnOpenAdvanced()\">\n <i class=\"fa-solid fa-sliders\"></i>\n <span>Customize columns, filters & sorting...</span>\n </button>\n </div>\n\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-actions\">\n @if (ViewEntity) {\n <!-- Existing view: Update + Save As New -->\n <button\n class=\"btn btn-primary\"\n (click)=\"OnSave(false)\"\n [disabled]=\"!Name.trim() || 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...' : 'Update' }}\n </button>\n <button\n class=\"btn btn-secondary\"\n (click)=\"OnSave(true)\"\n [disabled]=\"!Name.trim() || IsSaving\">\n <i class=\"fa-solid fa-plus\"></i>\n Save As New\n </button>\n } @else {\n <!-- New view: Create -->\n <button\n class=\"btn btn-primary\"\n (click)=\"OnSave(true)\"\n [disabled]=\"!Name.trim() || IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-plus\"></i>\n }\n {{ IsSaving ? 'Saving...' : 'Create View' }}\n </button>\n }\n </div>\n <button class=\"btn btn-cancel\" (click)=\"OnClose()\">\n Cancel\n </button>\n </div>\n</div>\n", styles: ["/* Dialog Backdrop */\n.dialog-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 2000;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Dialog Panel */\n.dialog-panel {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n width: 480px;\n max-width: calc(100vw - 40px);\n max-height: calc(100vh - 60px);\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 2001;\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n\n.dialog-panel.open {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n}\n\n/* Dialog Header */\n.dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 18px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n border-radius: 16px 16px 0 0;\n}\n\n.header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 17px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.header-title i {\n color: var(--mj-brand-primary);\n font-size: 18px;\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-sunken);\n color: var(--mj-text-primary);\n}\n\n/* Entity Badge */\n.entity-badge {\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 3px 10px;\n border-radius: 12px;\n margin-left: auto;\n margin-right: 8px;\n}\n\n/* Dialog Content */\n.dialog-content {\n padding: 20px 24px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n/* Form Groups */\n.form-group {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.form-group label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-group .optional {\n font-weight: 400;\n color: var(--mj-text-disabled);\n}\n\n.form-input {\n padding: 9px 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 8px;\n font-size: 14px;\n color: var(--mj-text-primary);\n transition: border-color 0.15s ease;\n}\n\n.form-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.form-input.invalid {\n border-color: var(--mj-status-error);\n}\n\n.form-textarea {\n resize: vertical;\n font-family: inherit;\n min-height: 50px;\n}\n\n.validation-error {\n font-size: 12px;\n color: var(--mj-status-error);\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-disabled);\n}\n\n/* Summary Section */\n.summary-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 14px;\n}\n\n.summary-header {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin-bottom: 10px;\n}\n\n.summary-header i {\n color: var(--mj-brand-primary);\n}\n\n.summary-items {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.summary-item {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.summary-item i {\n color: var(--mj-text-muted);\n width: 16px;\n text-align: center;\n font-size: 12px;\n}\n\n.summary-item.smart-filter {\n color: var(--mj-brand-primary);\n}\n\n.summary-item.smart-filter i {\n color: var(--mj-brand-primary);\n}\n\n/* Advanced Link */\n.advanced-link {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: none;\n background: none;\n color: var(--mj-brand-primary);\n font-size: 13px;\n cursor: pointer;\n transition: color 0.15s ease;\n}\n\n.advanced-link:hover {\n color: var(--mj-color-info-600);\n text-decoration: underline;\n}\n\n/* Dialog Footer */\n.dialog-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n border-radius: 0 0 16px 16px;\n}\n\n.footer-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n/* Buttons */\n.btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 9px 20px;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.btn-primary:hover:not(:disabled) {\n background: var(--mj-color-info-600);\n}\n\n.btn-primary:disabled {\n background: color-mix(in srgb, var(--mj-brand-primary) 50%, var(--mj-bg-surface));\n cursor: not-allowed;\n}\n\n.btn-secondary {\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-strong);\n}\n\n.btn-secondary:hover:not(:disabled) {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-text-disabled);\n}\n\n.btn-secondary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-cancel {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.btn-cancel:hover {\n background: var(--mj-bg-surface-active);\n}\n"] }]
|
|
347
401
|
}], () => [{ type: i0.ChangeDetectorRef }], { IsOpen: [{
|
|
348
402
|
type: Input
|
|
349
403
|
}], ViewEntity: [{
|
|
@@ -356,12 +410,17 @@ export class QuickSaveDialogComponent {
|
|
|
356
410
|
type: Input
|
|
357
411
|
}], DefaultSaveAsNew: [{
|
|
358
412
|
type: Input
|
|
413
|
+
}], SuggestedName: [{
|
|
414
|
+
type: Input
|
|
359
415
|
}], Save: [{
|
|
360
416
|
type: Output
|
|
361
417
|
}], Close: [{
|
|
362
418
|
type: Output
|
|
363
419
|
}], OpenAdvanced: [{
|
|
364
420
|
type: Output
|
|
421
|
+
}], nameInput: [{
|
|
422
|
+
type: ViewChild,
|
|
423
|
+
args: ['nameInput']
|
|
365
424
|
}] }); })();
|
|
366
425
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QuickSaveDialogComponent, { className: "QuickSaveDialogComponent", filePath: "src/lib/quick-save-dialog/quick-save-dialog.component.ts", lineNumber: 36 }); })();
|
|
367
426
|
//# sourceMappingURL=quick-save-dialog.component.js.map
|