@memberjunction/ng-archive-manager 0.0.1 → 5.30.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/archive-config/archive-config-admin.component.d.ts +113 -0
- package/dist/lib/archive-config/archive-config-admin.component.d.ts.map +1 -0
- package/dist/lib/archive-config/archive-config-admin.component.js +735 -0
- package/dist/lib/archive-config/archive-config-admin.component.js.map +1 -0
- package/dist/lib/archive-manager.module.d.ts +14 -0
- package/dist/lib/archive-manager.module.d.ts.map +1 -0
- package/dist/lib/archive-manager.module.js +48 -0
- package/dist/lib/archive-manager.module.js.map +1 -0
- package/dist/lib/archive-restore/archive-restore-dialog.component.d.ts +82 -0
- package/dist/lib/archive-restore/archive-restore-dialog.component.d.ts.map +1 -0
- package/dist/lib/archive-restore/archive-restore-dialog.component.js +386 -0
- package/dist/lib/archive-restore/archive-restore-dialog.component.js.map +1 -0
- package/dist/lib/archive-run-viewer/archive-run-viewer.component.d.ts +81 -0
- package/dist/lib/archive-run-viewer/archive-run-viewer.component.d.ts.map +1 -0
- package/dist/lib/archive-run-viewer/archive-run-viewer.component.js +515 -0
- package/dist/lib/archive-run-viewer/archive-run-viewer.component.js.map +1 -0
- package/dist/lib/archive-status/archive-status-badge.component.d.ts +65 -0
- package/dist/lib/archive-status/archive-status-badge.component.d.ts.map +1 -0
- package/dist/lib/archive-status/archive-status-badge.component.js +172 -0
- package/dist/lib/archive-status/archive-status-badge.component.js.map +1 -0
- package/dist/lib/archive-types.d.ts +81 -0
- package/dist/lib/archive-types.d.ts.map +1 -0
- package/dist/lib/archive-types.js +8 -0
- package/dist/lib/archive-types.js.map +1 -0
- package/dist/public-api.d.ts +6 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +11 -0
- package/dist/public-api.js.map +1 -0
- package/package.json +42 -6
- package/README.md +0 -45
|
@@ -0,0 +1,735 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy, ChangeDetectorRef, inject, } from '@angular/core';
|
|
2
|
+
import { CompositeKey, Metadata, RunView } from '@memberjunction/core';
|
|
3
|
+
import { UUIDsEqual } from '@memberjunction/global';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/forms";
|
|
6
|
+
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
7
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
8
|
+
function ArchiveConfigAdminComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
9
|
+
i0.ɵɵelementStart(0, "div", 1);
|
|
10
|
+
i0.ɵɵelement(1, "mj-loading", 3);
|
|
11
|
+
i0.ɵɵelementEnd();
|
|
12
|
+
} }
|
|
13
|
+
function ArchiveConfigAdminComponent_Conditional_2_For_10_Template(rf, ctx) { if (rf & 1) {
|
|
14
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
15
|
+
i0.ɵɵelementStart(0, "div", 13);
|
|
16
|
+
i0.ɵɵlistener("click", function ArchiveConfigAdminComponent_Conditional_2_For_10_Template_div_click_0_listener() { const config_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SelectConfig(config_r4)); })("keydown.enter", function ArchiveConfigAdminComponent_Conditional_2_For_10_Template_div_keydown_enter_0_listener() { const config_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SelectConfig(config_r4)); });
|
|
17
|
+
i0.ɵɵelementStart(1, "div", 14)(2, "span", 15);
|
|
18
|
+
i0.ɵɵtext(3);
|
|
19
|
+
i0.ɵɵelementEnd();
|
|
20
|
+
i0.ɵɵelementStart(4, "span", 16);
|
|
21
|
+
i0.ɵɵtext(5);
|
|
22
|
+
i0.ɵɵelementEnd()();
|
|
23
|
+
i0.ɵɵelementStart(6, "div", 17)(7, "span");
|
|
24
|
+
i0.ɵɵelement(8, "i", 18);
|
|
25
|
+
i0.ɵɵtext(9);
|
|
26
|
+
i0.ɵɵelementEnd();
|
|
27
|
+
i0.ɵɵelementStart(10, "span");
|
|
28
|
+
i0.ɵɵelement(11, "i", 19);
|
|
29
|
+
i0.ɵɵtext(12);
|
|
30
|
+
i0.ɵɵelementEnd()();
|
|
31
|
+
i0.ɵɵelementStart(13, "div", 20)(14, "span", 21);
|
|
32
|
+
i0.ɵɵelement(15, "i", 22);
|
|
33
|
+
i0.ɵɵtext(16);
|
|
34
|
+
i0.ɵɵelementEnd()()();
|
|
35
|
+
} if (rf & 2) {
|
|
36
|
+
const config_r4 = ctx.$implicit;
|
|
37
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
38
|
+
i0.ɵɵclassProp("selected", ctx_r1.IsSelectedConfig(config_r4));
|
|
39
|
+
i0.ɵɵadvance(3);
|
|
40
|
+
i0.ɵɵtextInterpolate(config_r4.Name);
|
|
41
|
+
i0.ɵɵadvance();
|
|
42
|
+
i0.ɵɵclassProp("status-active", config_r4.Status === "Idle" || config_r4.Status === "Running")("status-inactive", config_r4.Status === "Disabled" || config_r4.Status === "Error");
|
|
43
|
+
i0.ɵɵadvance();
|
|
44
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.GetStatusLabel(config_r4.Status), " ");
|
|
45
|
+
i0.ɵɵadvance(4);
|
|
46
|
+
i0.ɵɵtextInterpolate1(" ", config_r4.StorageAccountName || "No storage");
|
|
47
|
+
i0.ɵɵadvance(3);
|
|
48
|
+
i0.ɵɵtextInterpolate1(" ", config_r4.RootPath);
|
|
49
|
+
i0.ɵɵadvance(4);
|
|
50
|
+
i0.ɵɵtextInterpolate1(" ", config_r4.DefaultMode);
|
|
51
|
+
} }
|
|
52
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
53
|
+
i0.ɵɵelementStart(0, "div", 10);
|
|
54
|
+
i0.ɵɵelement(1, "i", 23);
|
|
55
|
+
i0.ɵɵelementStart(2, "p");
|
|
56
|
+
i0.ɵɵtext(3, "No configurations found. Create one to get started.");
|
|
57
|
+
i0.ɵɵelementEnd()();
|
|
58
|
+
} }
|
|
59
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
60
|
+
i0.ɵɵelementStart(0, "div", 12);
|
|
61
|
+
i0.ɵɵelement(1, "i", 24);
|
|
62
|
+
i0.ɵɵelementStart(2, "p");
|
|
63
|
+
i0.ɵɵtext(3, "Select a configuration to view details");
|
|
64
|
+
i0.ɵɵelementEnd()();
|
|
65
|
+
} }
|
|
66
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
68
|
+
i0.ɵɵelement(1, "mj-loading", 27);
|
|
69
|
+
i0.ɵɵelementEnd();
|
|
70
|
+
} }
|
|
71
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_For_27_Template(rf, ctx) { if (rf & 1) {
|
|
72
|
+
i0.ɵɵelementStart(0, "option", 41);
|
|
73
|
+
i0.ɵɵtext(1);
|
|
74
|
+
i0.ɵɵelementEnd();
|
|
75
|
+
} if (rf & 2) {
|
|
76
|
+
const account_r6 = ctx.$implicit;
|
|
77
|
+
i0.ɵɵproperty("value", account_r6.ID);
|
|
78
|
+
i0.ɵɵadvance();
|
|
79
|
+
i0.ɵɵtextInterpolate(account_r6.Name);
|
|
80
|
+
} }
|
|
81
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_For_51_Template(rf, ctx) { if (rf & 1) {
|
|
82
|
+
i0.ɵɵelementStart(0, "option", 41);
|
|
83
|
+
i0.ɵɵtext(1);
|
|
84
|
+
i0.ɵɵelementEnd();
|
|
85
|
+
} if (rf & 2) {
|
|
86
|
+
const mode_r7 = ctx.$implicit;
|
|
87
|
+
i0.ɵɵproperty("value", mode_r7);
|
|
88
|
+
i0.ɵɵadvance();
|
|
89
|
+
i0.ɵɵtextInterpolate(mode_r7);
|
|
90
|
+
} }
|
|
91
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
92
|
+
i0.ɵɵelementStart(0, "option", 41);
|
|
93
|
+
i0.ɵɵtext(1);
|
|
94
|
+
i0.ɵɵelementEnd();
|
|
95
|
+
} if (rf & 2) {
|
|
96
|
+
const mode_r10 = ctx.$implicit;
|
|
97
|
+
i0.ɵɵproperty("value", mode_r10);
|
|
98
|
+
i0.ɵɵadvance();
|
|
99
|
+
i0.ɵɵtextInterpolate(mode_r10);
|
|
100
|
+
} }
|
|
101
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template(rf, ctx) { if (rf & 1) {
|
|
102
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
103
|
+
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "input", 61);
|
|
104
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_input_ngModelChange_2_listener($event) { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; i0.ɵɵtwoWayBindingSet(entity_r9.EntityName, $event) || (entity_r9.EntityName = $event); return i0.ɵɵresetView($event); });
|
|
105
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_input_ngModelChange_2_listener() { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnEntityChanged(entity_r9)); });
|
|
106
|
+
i0.ɵɵelementEnd()();
|
|
107
|
+
i0.ɵɵelementStart(3, "td")(4, "select", 62);
|
|
108
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_select_ngModelChange_4_listener($event) { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; i0.ɵɵtwoWayBindingSet(entity_r9.Mode, $event) || (entity_r9.Mode = $event); return i0.ɵɵresetView($event); });
|
|
109
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_select_ngModelChange_4_listener() { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnEntityChanged(entity_r9)); });
|
|
110
|
+
i0.ɵɵrepeaterCreate(5, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_For_6_Template, 2, 2, "option", 41, i0.ɵɵrepeaterTrackByIdentity);
|
|
111
|
+
i0.ɵɵelementEnd()();
|
|
112
|
+
i0.ɵɵelementStart(7, "td")(8, "input", 63);
|
|
113
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_input_ngModelChange_8_listener($event) { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; i0.ɵɵtwoWayBindingSet(entity_r9.RetentionDays, $event) || (entity_r9.RetentionDays = $event); return i0.ɵɵresetView($event); });
|
|
114
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_input_ngModelChange_8_listener() { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnEntityChanged(entity_r9)); });
|
|
115
|
+
i0.ɵɵelementEnd()();
|
|
116
|
+
i0.ɵɵelementStart(9, "td")(10, "input", 63);
|
|
117
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_input_ngModelChange_10_listener($event) { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; i0.ɵɵtwoWayBindingSet(entity_r9.BatchSize, $event) || (entity_r9.BatchSize = $event); return i0.ɵɵresetView($event); });
|
|
118
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_input_ngModelChange_10_listener() { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnEntityChanged(entity_r9)); });
|
|
119
|
+
i0.ɵɵelementEnd()();
|
|
120
|
+
i0.ɵɵelementStart(11, "td")(12, "input", 64);
|
|
121
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_input_ngModelChange_12_listener($event) { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; i0.ɵɵtwoWayBindingSet(entity_r9.DateField, $event) || (entity_r9.DateField = $event); return i0.ɵɵresetView($event); });
|
|
122
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_input_ngModelChange_12_listener() { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnEntityChanged(entity_r9)); });
|
|
123
|
+
i0.ɵɵelementEnd()();
|
|
124
|
+
i0.ɵɵelementStart(13, "td")(14, "input", 50);
|
|
125
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_input_ngModelChange_14_listener($event) { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; i0.ɵɵtwoWayBindingSet(entity_r9.IsActive, $event) || (entity_r9.IsActive = $event); return i0.ɵɵresetView($event); });
|
|
126
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_input_ngModelChange_14_listener() { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnEntityChanged(entity_r9)); });
|
|
127
|
+
i0.ɵɵelementEnd()();
|
|
128
|
+
i0.ɵɵelementStart(15, "td")(16, "button", 65);
|
|
129
|
+
i0.ɵɵlistener("click", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template_button_click_16_listener() { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.RemoveEntity(entity_r9)); });
|
|
130
|
+
i0.ɵɵelement(17, "i", 66);
|
|
131
|
+
i0.ɵɵelementEnd()()();
|
|
132
|
+
} if (rf & 2) {
|
|
133
|
+
const entity_r9 = ctx.$implicit;
|
|
134
|
+
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
135
|
+
i0.ɵɵadvance(2);
|
|
136
|
+
i0.ɵɵtwoWayProperty("ngModel", entity_r9.EntityName);
|
|
137
|
+
i0.ɵɵadvance(2);
|
|
138
|
+
i0.ɵɵtwoWayProperty("ngModel", entity_r9.Mode);
|
|
139
|
+
i0.ɵɵadvance();
|
|
140
|
+
i0.ɵɵrepeater(ctx_r1.ArchiveModes);
|
|
141
|
+
i0.ɵɵadvance(3);
|
|
142
|
+
i0.ɵɵtwoWayProperty("ngModel", entity_r9.RetentionDays);
|
|
143
|
+
i0.ɵɵadvance(2);
|
|
144
|
+
i0.ɵɵtwoWayProperty("ngModel", entity_r9.BatchSize);
|
|
145
|
+
i0.ɵɵadvance(2);
|
|
146
|
+
i0.ɵɵtwoWayProperty("ngModel", entity_r9.DateField);
|
|
147
|
+
i0.ɵɵadvance(2);
|
|
148
|
+
i0.ɵɵtwoWayProperty("ngModel", entity_r9.IsActive);
|
|
149
|
+
} }
|
|
150
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_Template(rf, ctx) { if (rf & 1) {
|
|
151
|
+
i0.ɵɵelementStart(0, "div", 54)(1, "table", 60)(2, "thead")(3, "tr")(4, "th");
|
|
152
|
+
i0.ɵɵtext(5, "Entity");
|
|
153
|
+
i0.ɵɵelementEnd();
|
|
154
|
+
i0.ɵɵelementStart(6, "th");
|
|
155
|
+
i0.ɵɵtext(7, "Mode");
|
|
156
|
+
i0.ɵɵelementEnd();
|
|
157
|
+
i0.ɵɵelementStart(8, "th");
|
|
158
|
+
i0.ɵɵtext(9, "Retention");
|
|
159
|
+
i0.ɵɵelementEnd();
|
|
160
|
+
i0.ɵɵelementStart(10, "th");
|
|
161
|
+
i0.ɵɵtext(11, "Batch");
|
|
162
|
+
i0.ɵɵelementEnd();
|
|
163
|
+
i0.ɵɵelementStart(12, "th");
|
|
164
|
+
i0.ɵɵtext(13, "Date Field");
|
|
165
|
+
i0.ɵɵelementEnd();
|
|
166
|
+
i0.ɵɵelementStart(14, "th");
|
|
167
|
+
i0.ɵɵtext(15, "Active");
|
|
168
|
+
i0.ɵɵelementEnd();
|
|
169
|
+
i0.ɵɵelement(16, "th");
|
|
170
|
+
i0.ɵɵelementEnd()();
|
|
171
|
+
i0.ɵɵelementStart(17, "tbody");
|
|
172
|
+
i0.ɵɵrepeaterCreate(18, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_For_19_Template, 18, 6, "tr", null, _forTrack0);
|
|
173
|
+
i0.ɵɵelementEnd()()();
|
|
174
|
+
} if (rf & 2) {
|
|
175
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
176
|
+
i0.ɵɵadvance(18);
|
|
177
|
+
i0.ɵɵrepeater(ctx_r1.ConfigEntities);
|
|
178
|
+
} }
|
|
179
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_66_Template(rf, ctx) { if (rf & 1) {
|
|
180
|
+
i0.ɵɵelementStart(0, "div", 55)(1, "p");
|
|
181
|
+
i0.ɵɵtext(2, "No entities configured. Click \"Add Entity\" to add one.");
|
|
182
|
+
i0.ɵɵelementEnd()();
|
|
183
|
+
} }
|
|
184
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_67_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
185
|
+
i0.ɵɵelement(0, "i", 68);
|
|
186
|
+
} }
|
|
187
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_67_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
188
|
+
i0.ɵɵelement(0, "i", 69);
|
|
189
|
+
} }
|
|
190
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_67_Template(rf, ctx) { if (rf & 1) {
|
|
191
|
+
i0.ɵɵelementStart(0, "div", 67);
|
|
192
|
+
i0.ɵɵconditionalCreate(1, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_67_Conditional_1_Template, 1, 0, "i", 68);
|
|
193
|
+
i0.ɵɵconditionalCreate(2, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_67_Conditional_2_Template, 1, 0, "i", 69);
|
|
194
|
+
i0.ɵɵtext(3);
|
|
195
|
+
i0.ɵɵelementEnd();
|
|
196
|
+
} if (rf & 2) {
|
|
197
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
198
|
+
i0.ɵɵclassProp("status-success", ctx_r1.StatusType === "success")("status-error", ctx_r1.StatusType === "error");
|
|
199
|
+
i0.ɵɵadvance();
|
|
200
|
+
i0.ɵɵconditional(ctx_r1.StatusType === "success" ? 1 : -1);
|
|
201
|
+
i0.ɵɵadvance();
|
|
202
|
+
i0.ɵɵconditional(ctx_r1.StatusType === "error" ? 2 : -1);
|
|
203
|
+
i0.ɵɵadvance();
|
|
204
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.StatusMessage, " ");
|
|
205
|
+
} }
|
|
206
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_70_Template(rf, ctx) { if (rf & 1) {
|
|
207
|
+
i0.ɵɵelement(0, "i", 70);
|
|
208
|
+
i0.ɵɵtext(1, " Saving... ");
|
|
209
|
+
} }
|
|
210
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_71_Template(rf, ctx) { if (rf & 1) {
|
|
211
|
+
i0.ɵɵelement(0, "i", 71);
|
|
212
|
+
i0.ɵɵtext(1, " Save ");
|
|
213
|
+
} }
|
|
214
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
215
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
216
|
+
i0.ɵɵelementStart(0, "div", 26)(1, "div", 28)(2, "div", 29)(3, "label", 30);
|
|
217
|
+
i0.ɵɵtext(4, "Name");
|
|
218
|
+
i0.ɵɵelementEnd();
|
|
219
|
+
i0.ɵɵelementStart(5, "input", 31);
|
|
220
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedConfig.Name, $event) || (ctx_r1.SelectedConfig.Name = $event); return i0.ɵɵresetView($event); });
|
|
221
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_ngModelChange_5_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnConfigFieldChanged()); });
|
|
222
|
+
i0.ɵɵelementEnd()();
|
|
223
|
+
i0.ɵɵelementStart(6, "div", 29)(7, "label");
|
|
224
|
+
i0.ɵɵtext(8, "Active");
|
|
225
|
+
i0.ɵɵelementEnd();
|
|
226
|
+
i0.ɵɵelementStart(9, "div", 32)(10, "input", 33);
|
|
227
|
+
i0.ɵɵlistener("change", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_change_10_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); ctx_r1.SelectedConfig.Status = ctx_r1.SelectedConfig.Status === "Idle" ? "Disabled" : "Idle"; return i0.ɵɵresetView(ctx_r1.OnConfigFieldChanged()); });
|
|
228
|
+
i0.ɵɵelementEnd()()();
|
|
229
|
+
i0.ɵɵelementStart(11, "div", 29)(12, "label", 34);
|
|
230
|
+
i0.ɵɵtext(13, "Description");
|
|
231
|
+
i0.ɵɵelementEnd();
|
|
232
|
+
i0.ɵɵelementStart(14, "textarea", 35);
|
|
233
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_textarea_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedConfig.Description, $event) || (ctx_r1.SelectedConfig.Description = $event); return i0.ɵɵresetView($event); });
|
|
234
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_textarea_ngModelChange_14_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnConfigFieldChanged()); });
|
|
235
|
+
i0.ɵɵelementEnd()()();
|
|
236
|
+
i0.ɵɵelementStart(15, "div", 28)(16, "h3");
|
|
237
|
+
i0.ɵɵelement(17, "i", 36);
|
|
238
|
+
i0.ɵɵtext(18, " Storage");
|
|
239
|
+
i0.ɵɵelementEnd();
|
|
240
|
+
i0.ɵɵelementStart(19, "div", 37)(20, "div", 29)(21, "label", 38);
|
|
241
|
+
i0.ɵɵtext(22, "Storage Account");
|
|
242
|
+
i0.ɵɵelementEnd();
|
|
243
|
+
i0.ɵɵelementStart(23, "select", 39);
|
|
244
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_select_ngModelChange_23_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedConfig.StorageAccountID, $event) || (ctx_r1.SelectedConfig.StorageAccountID = $event); return i0.ɵɵresetView($event); });
|
|
245
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_select_ngModelChange_23_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnConfigFieldChanged()); });
|
|
246
|
+
i0.ɵɵelementStart(24, "option", 40);
|
|
247
|
+
i0.ɵɵtext(25, "-- Select --");
|
|
248
|
+
i0.ɵɵelementEnd();
|
|
249
|
+
i0.ɵɵrepeaterCreate(26, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_For_27_Template, 2, 2, "option", 41, _forTrack0);
|
|
250
|
+
i0.ɵɵelementEnd()();
|
|
251
|
+
i0.ɵɵelementStart(28, "div", 29)(29, "label", 42);
|
|
252
|
+
i0.ɵɵtext(30, "Root Path");
|
|
253
|
+
i0.ɵɵelementEnd();
|
|
254
|
+
i0.ɵɵelementStart(31, "input", 43);
|
|
255
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_ngModelChange_31_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedConfig.RootPath, $event) || (ctx_r1.SelectedConfig.RootPath = $event); return i0.ɵɵresetView($event); });
|
|
256
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_ngModelChange_31_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnConfigFieldChanged()); });
|
|
257
|
+
i0.ɵɵelementEnd()()()();
|
|
258
|
+
i0.ɵɵelementStart(32, "div", 28)(33, "h3");
|
|
259
|
+
i0.ɵɵelement(34, "i", 22);
|
|
260
|
+
i0.ɵɵtext(35, " Defaults");
|
|
261
|
+
i0.ɵɵelementEnd();
|
|
262
|
+
i0.ɵɵelementStart(36, "div", 37)(37, "div", 29)(38, "label", 44);
|
|
263
|
+
i0.ɵɵtext(39, "Retention Days");
|
|
264
|
+
i0.ɵɵelementEnd();
|
|
265
|
+
i0.ɵɵelementStart(40, "input", 45);
|
|
266
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_ngModelChange_40_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedConfig.DefaultRetentionDays, $event) || (ctx_r1.SelectedConfig.DefaultRetentionDays = $event); return i0.ɵɵresetView($event); });
|
|
267
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_ngModelChange_40_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnConfigFieldChanged()); });
|
|
268
|
+
i0.ɵɵelementEnd()();
|
|
269
|
+
i0.ɵɵelementStart(41, "div", 29)(42, "label", 46);
|
|
270
|
+
i0.ɵɵtext(43, "Batch Size");
|
|
271
|
+
i0.ɵɵelementEnd();
|
|
272
|
+
i0.ɵɵelementStart(44, "input", 47);
|
|
273
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_ngModelChange_44_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedConfig.DefaultBatchSize, $event) || (ctx_r1.SelectedConfig.DefaultBatchSize = $event); return i0.ɵɵresetView($event); });
|
|
274
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_ngModelChange_44_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnConfigFieldChanged()); });
|
|
275
|
+
i0.ɵɵelementEnd()()();
|
|
276
|
+
i0.ɵɵelementStart(45, "div", 37)(46, "div", 29)(47, "label", 48);
|
|
277
|
+
i0.ɵɵtext(48, "Archive Mode");
|
|
278
|
+
i0.ɵɵelementEnd();
|
|
279
|
+
i0.ɵɵelementStart(49, "select", 49);
|
|
280
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_select_ngModelChange_49_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedConfig.DefaultMode, $event) || (ctx_r1.SelectedConfig.DefaultMode = $event); return i0.ɵɵresetView($event); });
|
|
281
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_select_ngModelChange_49_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnConfigFieldChanged()); });
|
|
282
|
+
i0.ɵɵrepeaterCreate(50, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_For_51_Template, 2, 2, "option", 41, i0.ɵɵrepeaterTrackByIdentity);
|
|
283
|
+
i0.ɵɵelementEnd()();
|
|
284
|
+
i0.ɵɵelementStart(52, "div", 29)(53, "label");
|
|
285
|
+
i0.ɵɵtext(54, "Archive Record Changes");
|
|
286
|
+
i0.ɵɵelementEnd();
|
|
287
|
+
i0.ɵɵelementStart(55, "div", 32)(56, "input", 50);
|
|
288
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_ngModelChange_56_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedConfig.ArchiveRelatedRecordChanges, $event) || (ctx_r1.SelectedConfig.ArchiveRelatedRecordChanges = $event); return i0.ɵɵresetView($event); });
|
|
289
|
+
i0.ɵɵlistener("ngModelChange", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_input_ngModelChange_56_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnConfigFieldChanged()); });
|
|
290
|
+
i0.ɵɵelementEnd()()()()();
|
|
291
|
+
i0.ɵɵelementStart(57, "div", 28)(58, "div", 51)(59, "h3");
|
|
292
|
+
i0.ɵɵelement(60, "i", 52);
|
|
293
|
+
i0.ɵɵtext(61, " Entities");
|
|
294
|
+
i0.ɵɵelementEnd();
|
|
295
|
+
i0.ɵɵelementStart(62, "button", 53);
|
|
296
|
+
i0.ɵɵlistener("click", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_button_click_62_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.AddEntity()); });
|
|
297
|
+
i0.ɵɵelement(63, "i", 7);
|
|
298
|
+
i0.ɵɵtext(64, " Add Entity ");
|
|
299
|
+
i0.ɵɵelementEnd()();
|
|
300
|
+
i0.ɵɵconditionalCreate(65, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_65_Template, 20, 0, "div", 54);
|
|
301
|
+
i0.ɵɵconditionalCreate(66, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_66_Template, 3, 0, "div", 55);
|
|
302
|
+
i0.ɵɵelementEnd();
|
|
303
|
+
i0.ɵɵconditionalCreate(67, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_67_Template, 4, 7, "div", 56);
|
|
304
|
+
i0.ɵɵelementStart(68, "div", 57)(69, "button", 58);
|
|
305
|
+
i0.ɵɵlistener("click", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_button_click_69_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.Save()); });
|
|
306
|
+
i0.ɵɵconditionalCreate(70, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_70_Template, 2, 0)(71, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Conditional_71_Template, 2, 0);
|
|
307
|
+
i0.ɵɵelementEnd();
|
|
308
|
+
i0.ɵɵelementStart(72, "button", 59);
|
|
309
|
+
i0.ɵɵlistener("click", function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template_button_click_72_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.Cancel()); });
|
|
310
|
+
i0.ɵɵtext(73, " Cancel ");
|
|
311
|
+
i0.ɵɵelementEnd()()();
|
|
312
|
+
} if (rf & 2) {
|
|
313
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
314
|
+
i0.ɵɵadvance(5);
|
|
315
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedConfig.Name);
|
|
316
|
+
i0.ɵɵadvance(5);
|
|
317
|
+
i0.ɵɵproperty("checked", ctx_r1.SelectedConfig.Status === "Idle");
|
|
318
|
+
i0.ɵɵadvance(4);
|
|
319
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedConfig.Description);
|
|
320
|
+
i0.ɵɵadvance(9);
|
|
321
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedConfig.StorageAccountID);
|
|
322
|
+
i0.ɵɵadvance(3);
|
|
323
|
+
i0.ɵɵrepeater(ctx_r1.StorageAccounts);
|
|
324
|
+
i0.ɵɵadvance(5);
|
|
325
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedConfig.RootPath);
|
|
326
|
+
i0.ɵɵadvance(9);
|
|
327
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedConfig.DefaultRetentionDays);
|
|
328
|
+
i0.ɵɵadvance(4);
|
|
329
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedConfig.DefaultBatchSize);
|
|
330
|
+
i0.ɵɵadvance(5);
|
|
331
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedConfig.DefaultMode);
|
|
332
|
+
i0.ɵɵadvance();
|
|
333
|
+
i0.ɵɵrepeater(ctx_r1.ArchiveModes);
|
|
334
|
+
i0.ɵɵadvance(6);
|
|
335
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedConfig.ArchiveRelatedRecordChanges);
|
|
336
|
+
i0.ɵɵadvance(9);
|
|
337
|
+
i0.ɵɵconditional(ctx_r1.ConfigEntities.length > 0 ? 65 : -1);
|
|
338
|
+
i0.ɵɵadvance();
|
|
339
|
+
i0.ɵɵconditional(ctx_r1.ConfigEntities.length === 0 ? 66 : -1);
|
|
340
|
+
i0.ɵɵadvance();
|
|
341
|
+
i0.ɵɵconditional(ctx_r1.StatusMessage ? 67 : -1);
|
|
342
|
+
i0.ɵɵadvance(2);
|
|
343
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
344
|
+
i0.ɵɵadvance();
|
|
345
|
+
i0.ɵɵconditional(ctx_r1.IsSaving ? 70 : 71);
|
|
346
|
+
i0.ɵɵadvance(2);
|
|
347
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSaving);
|
|
348
|
+
} }
|
|
349
|
+
function ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
350
|
+
i0.ɵɵconditionalCreate(0, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_0_Template, 2, 0, "div", 25);
|
|
351
|
+
i0.ɵɵconditionalCreate(1, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Conditional_1_Template, 74, 15, "div", 26);
|
|
352
|
+
} if (rf & 2) {
|
|
353
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
354
|
+
i0.ɵɵconditional(ctx_r1.IsDetailLoading ? 0 : -1);
|
|
355
|
+
i0.ɵɵadvance();
|
|
356
|
+
i0.ɵɵconditional(!ctx_r1.IsDetailLoading ? 1 : -1);
|
|
357
|
+
} }
|
|
358
|
+
function ArchiveConfigAdminComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
359
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
360
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "div", 4)(2, "div", 5)(3, "h2");
|
|
361
|
+
i0.ɵɵtext(4, "Archive Configurations");
|
|
362
|
+
i0.ɵɵelementEnd();
|
|
363
|
+
i0.ɵɵelementStart(5, "button", 6);
|
|
364
|
+
i0.ɵɵlistener("click", function ArchiveConfigAdminComponent_Conditional_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.AddConfiguration()); });
|
|
365
|
+
i0.ɵɵelement(6, "i", 7);
|
|
366
|
+
i0.ɵɵtext(7, " Add Configuration ");
|
|
367
|
+
i0.ɵɵelementEnd()();
|
|
368
|
+
i0.ɵɵelementStart(8, "div", 8);
|
|
369
|
+
i0.ɵɵrepeaterCreate(9, ArchiveConfigAdminComponent_Conditional_2_For_10_Template, 17, 11, "div", 9, _forTrack0);
|
|
370
|
+
i0.ɵɵconditionalCreate(11, ArchiveConfigAdminComponent_Conditional_2_Conditional_11_Template, 4, 0, "div", 10);
|
|
371
|
+
i0.ɵɵelementEnd()();
|
|
372
|
+
i0.ɵɵelementStart(12, "div", 11);
|
|
373
|
+
i0.ɵɵconditionalCreate(13, ArchiveConfigAdminComponent_Conditional_2_Conditional_13_Template, 4, 0, "div", 12);
|
|
374
|
+
i0.ɵɵconditionalCreate(14, ArchiveConfigAdminComponent_Conditional_2_Conditional_14_Template, 2, 2);
|
|
375
|
+
i0.ɵɵelementEnd()();
|
|
376
|
+
} if (rf & 2) {
|
|
377
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
378
|
+
i0.ɵɵadvance(9);
|
|
379
|
+
i0.ɵɵrepeater(ctx_r1.Configs);
|
|
380
|
+
i0.ɵɵadvance(2);
|
|
381
|
+
i0.ɵɵconditional(ctx_r1.Configs.length === 0 ? 11 : -1);
|
|
382
|
+
i0.ɵɵadvance(2);
|
|
383
|
+
i0.ɵɵconditional(!ctx_r1.SelectedConfig ? 13 : -1);
|
|
384
|
+
i0.ɵɵadvance();
|
|
385
|
+
i0.ɵɵconditional(ctx_r1.SelectedConfig ? 14 : -1);
|
|
386
|
+
} }
|
|
387
|
+
export class ArchiveConfigAdminComponent {
|
|
388
|
+
cdr = inject(ChangeDetectorRef);
|
|
389
|
+
/** All configurations */
|
|
390
|
+
Configs = [];
|
|
391
|
+
/** Currently selected configuration */
|
|
392
|
+
SelectedConfig = null;
|
|
393
|
+
/** Entities for the selected configuration */
|
|
394
|
+
ConfigEntities = [];
|
|
395
|
+
/** Available storage accounts for dropdown */
|
|
396
|
+
StorageAccounts = [];
|
|
397
|
+
/** Available archive modes */
|
|
398
|
+
ArchiveModes = ['StripFields', 'SoftDelete', 'HardDelete', 'ArchiveOnly'];
|
|
399
|
+
/** Whether the list is loading */
|
|
400
|
+
IsLoading = true;
|
|
401
|
+
/** Whether the detail panel is loading */
|
|
402
|
+
IsDetailLoading = false;
|
|
403
|
+
/** Whether a save operation is in progress */
|
|
404
|
+
IsSaving = false;
|
|
405
|
+
/** Status message for feedback */
|
|
406
|
+
StatusMessage = '';
|
|
407
|
+
/** Status type for styling */
|
|
408
|
+
StatusType = '';
|
|
409
|
+
destroyed = false;
|
|
410
|
+
ngOnInit() {
|
|
411
|
+
this.loadAllData();
|
|
412
|
+
}
|
|
413
|
+
ngOnDestroy() {
|
|
414
|
+
this.destroyed = true;
|
|
415
|
+
}
|
|
416
|
+
/** Select a configuration and load its entities */
|
|
417
|
+
async SelectConfig(config) {
|
|
418
|
+
this.SelectedConfig = { ...config };
|
|
419
|
+
this.clearStatus();
|
|
420
|
+
await this.loadConfigEntities(config.ID);
|
|
421
|
+
}
|
|
422
|
+
/** Check if a config is the currently selected one */
|
|
423
|
+
IsSelectedConfig(config) {
|
|
424
|
+
return UUIDsEqual(this.SelectedConfig?.ID, config.ID);
|
|
425
|
+
}
|
|
426
|
+
/** Add a new empty entity row */
|
|
427
|
+
AddEntity() {
|
|
428
|
+
if (!this.SelectedConfig)
|
|
429
|
+
return;
|
|
430
|
+
const newEntity = {
|
|
431
|
+
ID: `new-${Date.now()}`,
|
|
432
|
+
ArchiveConfigurationID: this.SelectedConfig.ID,
|
|
433
|
+
EntityName: '',
|
|
434
|
+
Mode: this.SelectedConfig.DefaultMode ?? 'StripFields',
|
|
435
|
+
RetentionDays: this.SelectedConfig.DefaultRetentionDays || 365,
|
|
436
|
+
BatchSize: this.SelectedConfig.DefaultBatchSize || 100,
|
|
437
|
+
DateField: '__mj_CreatedAt',
|
|
438
|
+
IsActive: true,
|
|
439
|
+
IsNew: true,
|
|
440
|
+
IsDirty: true,
|
|
441
|
+
};
|
|
442
|
+
this.ConfigEntities = [...this.ConfigEntities, newEntity];
|
|
443
|
+
this.cdr.markForCheck();
|
|
444
|
+
}
|
|
445
|
+
/** Remove an entity row */
|
|
446
|
+
RemoveEntity(entity) {
|
|
447
|
+
this.ConfigEntities = this.ConfigEntities.filter((e) => !UUIDsEqual(e.ID, entity.ID));
|
|
448
|
+
this.cdr.markForCheck();
|
|
449
|
+
}
|
|
450
|
+
/** Mark an entity as dirty when edited */
|
|
451
|
+
OnEntityChanged(entity) {
|
|
452
|
+
entity.IsDirty = true;
|
|
453
|
+
this.cdr.markForCheck();
|
|
454
|
+
}
|
|
455
|
+
/** Mark the selected config as dirty */
|
|
456
|
+
OnConfigFieldChanged() {
|
|
457
|
+
if (this.SelectedConfig) {
|
|
458
|
+
this.SelectedConfig.IsDirty = true;
|
|
459
|
+
this.cdr.markForCheck();
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/** Save the selected configuration and its entities */
|
|
463
|
+
async Save() {
|
|
464
|
+
if (!this.SelectedConfig)
|
|
465
|
+
return;
|
|
466
|
+
this.IsSaving = true;
|
|
467
|
+
this.clearStatus();
|
|
468
|
+
this.cdr.markForCheck();
|
|
469
|
+
try {
|
|
470
|
+
await this.saveConfiguration();
|
|
471
|
+
await this.saveConfigEntities();
|
|
472
|
+
this.setStatus('Configuration saved successfully.', 'success');
|
|
473
|
+
await this.refreshConfigList();
|
|
474
|
+
}
|
|
475
|
+
catch (err) {
|
|
476
|
+
const message = err instanceof Error ? err.message : 'Save failed. Please try again.';
|
|
477
|
+
this.setStatus(message, 'error');
|
|
478
|
+
}
|
|
479
|
+
finally {
|
|
480
|
+
this.IsSaving = false;
|
|
481
|
+
this.markForCheckIfAlive();
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
/** Cancel changes and reload the selected config */
|
|
485
|
+
async Cancel() {
|
|
486
|
+
if (!this.SelectedConfig)
|
|
487
|
+
return;
|
|
488
|
+
const configId = this.SelectedConfig.ID;
|
|
489
|
+
this.clearStatus();
|
|
490
|
+
const original = this.Configs.find((c) => UUIDsEqual(c.ID, configId));
|
|
491
|
+
if (original) {
|
|
492
|
+
this.SelectedConfig = { ...original };
|
|
493
|
+
await this.loadConfigEntities(configId);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
/** Add a new configuration */
|
|
497
|
+
AddConfiguration() {
|
|
498
|
+
const newConfig = {
|
|
499
|
+
ID: `new-${Date.now()}`,
|
|
500
|
+
Name: 'New Configuration',
|
|
501
|
+
Description: '',
|
|
502
|
+
Status: 'Disabled',
|
|
503
|
+
StorageAccountID: '',
|
|
504
|
+
StorageAccountName: '',
|
|
505
|
+
RootPath: '/archives',
|
|
506
|
+
DefaultRetentionDays: 365,
|
|
507
|
+
DefaultBatchSize: 100,
|
|
508
|
+
DefaultMode: 'StripFields',
|
|
509
|
+
ArchiveRelatedRecordChanges: false,
|
|
510
|
+
IsDirty: true,
|
|
511
|
+
};
|
|
512
|
+
this.Configs = [newConfig, ...this.Configs];
|
|
513
|
+
this.SelectConfig(newConfig);
|
|
514
|
+
}
|
|
515
|
+
/** Get a display label for the status */
|
|
516
|
+
GetStatusLabel(status) {
|
|
517
|
+
switch (status) {
|
|
518
|
+
case 'Idle': return 'Idle';
|
|
519
|
+
case 'Running': return 'Running';
|
|
520
|
+
case 'Error': return 'Error';
|
|
521
|
+
default: return 'Disabled';
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
/** Load all initial data using batched RunViews */
|
|
525
|
+
async loadAllData() {
|
|
526
|
+
this.IsLoading = true;
|
|
527
|
+
this.cdr.markForCheck();
|
|
528
|
+
try {
|
|
529
|
+
const rv = new RunView();
|
|
530
|
+
const [configResult, storageResult] = await rv.RunViews([
|
|
531
|
+
{
|
|
532
|
+
EntityName: 'MJ: Archive Configurations',
|
|
533
|
+
ExtraFilter: '',
|
|
534
|
+
OrderBy: 'Name',
|
|
535
|
+
ResultType: 'simple',
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
EntityName: 'MJ: File Storage Accounts',
|
|
539
|
+
ExtraFilter: '',
|
|
540
|
+
OrderBy: 'Name',
|
|
541
|
+
ResultType: 'simple',
|
|
542
|
+
Fields: ['ID', 'Name'],
|
|
543
|
+
},
|
|
544
|
+
]);
|
|
545
|
+
this.Configs = this.mapConfigRecords(configResult);
|
|
546
|
+
this.StorageAccounts = this.mapStorageAccounts(storageResult);
|
|
547
|
+
if (this.Configs.length > 0) {
|
|
548
|
+
await this.SelectConfig(this.Configs[0]);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
catch {
|
|
552
|
+
this.setStatus('Failed to load configurations.', 'error');
|
|
553
|
+
}
|
|
554
|
+
finally {
|
|
555
|
+
this.IsLoading = false;
|
|
556
|
+
this.markForCheckIfAlive();
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
/** Map raw config records to typed objects */
|
|
560
|
+
mapConfigRecords(result) {
|
|
561
|
+
if (!result.Success)
|
|
562
|
+
return [];
|
|
563
|
+
return result.Results.map((r) => ({
|
|
564
|
+
ID: String(r['ID'] ?? ''),
|
|
565
|
+
Name: String(r['Name'] ?? ''),
|
|
566
|
+
Description: String(r['Description'] ?? ''),
|
|
567
|
+
Status: r['Status'] ?? 'Disabled',
|
|
568
|
+
StorageAccountID: String(r['StorageAccountID'] ?? ''),
|
|
569
|
+
StorageAccountName: String(r['StorageAccount'] ?? ''),
|
|
570
|
+
RootPath: String(r['RootPath'] ?? ''),
|
|
571
|
+
DefaultRetentionDays: Number(r['DefaultRetentionDays'] ?? 365),
|
|
572
|
+
DefaultBatchSize: Number(r['DefaultBatchSize'] ?? 100),
|
|
573
|
+
DefaultMode: r['DefaultMode'] ?? 'StripFields',
|
|
574
|
+
ArchiveRelatedRecordChanges: Boolean(r['ArchiveRelatedRecordChanges']),
|
|
575
|
+
IsDirty: false,
|
|
576
|
+
}));
|
|
577
|
+
}
|
|
578
|
+
/** Map raw storage account records */
|
|
579
|
+
mapStorageAccounts(result) {
|
|
580
|
+
if (!result.Success)
|
|
581
|
+
return [];
|
|
582
|
+
return result.Results.map((r) => ({
|
|
583
|
+
ID: String(r['ID'] ?? ''),
|
|
584
|
+
Name: String(r['Name'] ?? ''),
|
|
585
|
+
}));
|
|
586
|
+
}
|
|
587
|
+
/** Load entities for a specific configuration */
|
|
588
|
+
async loadConfigEntities(configId) {
|
|
589
|
+
this.IsDetailLoading = true;
|
|
590
|
+
this.cdr.markForCheck();
|
|
591
|
+
try {
|
|
592
|
+
const rv = new RunView();
|
|
593
|
+
const escapedId = configId.replace(/'/g, "''");
|
|
594
|
+
const result = await rv.RunView({
|
|
595
|
+
EntityName: 'MJ: Archive Configuration Entities',
|
|
596
|
+
ExtraFilter: `ArchiveConfigurationID='${escapedId}'`,
|
|
597
|
+
OrderBy: 'Entity',
|
|
598
|
+
ResultType: 'simple',
|
|
599
|
+
});
|
|
600
|
+
this.ConfigEntities = this.mapEntityRecords(result);
|
|
601
|
+
}
|
|
602
|
+
catch {
|
|
603
|
+
this.ConfigEntities = [];
|
|
604
|
+
}
|
|
605
|
+
finally {
|
|
606
|
+
this.IsDetailLoading = false;
|
|
607
|
+
this.markForCheckIfAlive();
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
/** Map raw entity records to typed objects */
|
|
611
|
+
mapEntityRecords(result) {
|
|
612
|
+
if (!result.Success)
|
|
613
|
+
return [];
|
|
614
|
+
return result.Results.map((r) => ({
|
|
615
|
+
ID: String(r['ID'] ?? ''),
|
|
616
|
+
ArchiveConfigurationID: String(r['ArchiveConfigurationID'] ?? ''),
|
|
617
|
+
EntityName: String(r['Entity'] ?? ''),
|
|
618
|
+
Mode: r['Mode'] ?? 'StripFields',
|
|
619
|
+
RetentionDays: Number(r['RetentionDays'] ?? 365),
|
|
620
|
+
BatchSize: Number(r['BatchSize'] ?? 100),
|
|
621
|
+
DateField: String(r['DateField'] ?? '__mj_CreatedAt'),
|
|
622
|
+
IsActive: Boolean(r['IsActive']),
|
|
623
|
+
IsNew: false,
|
|
624
|
+
IsDirty: false,
|
|
625
|
+
}));
|
|
626
|
+
}
|
|
627
|
+
/** Save the configuration record using strongly-typed entity */
|
|
628
|
+
async saveConfiguration() {
|
|
629
|
+
if (!this.SelectedConfig?.IsDirty)
|
|
630
|
+
return;
|
|
631
|
+
const md = new Metadata();
|
|
632
|
+
const entity = await md.GetEntityObject('MJ: Archive Configurations');
|
|
633
|
+
if (!this.SelectedConfig.ID.startsWith('new-')) {
|
|
634
|
+
await entity.InnerLoad(CompositeKey.FromKeyValuePair('ID', this.SelectedConfig.ID));
|
|
635
|
+
}
|
|
636
|
+
else {
|
|
637
|
+
entity.NewRecord();
|
|
638
|
+
}
|
|
639
|
+
entity.Name = this.SelectedConfig.Name;
|
|
640
|
+
entity.Description = this.SelectedConfig.Description;
|
|
641
|
+
entity.Status = this.SelectedConfig.Status ?? 'Disabled';
|
|
642
|
+
if (this.SelectedConfig.StorageAccountID) {
|
|
643
|
+
entity.StorageAccountID = this.SelectedConfig.StorageAccountID;
|
|
644
|
+
}
|
|
645
|
+
entity.RootPath = this.SelectedConfig.RootPath;
|
|
646
|
+
entity.DefaultRetentionDays = this.SelectedConfig.DefaultRetentionDays;
|
|
647
|
+
entity.DefaultBatchSize = this.SelectedConfig.DefaultBatchSize;
|
|
648
|
+
entity.DefaultMode = this.SelectedConfig.DefaultMode ?? 'StripFields';
|
|
649
|
+
entity.ArchiveRelatedRecordChanges = this.SelectedConfig.ArchiveRelatedRecordChanges;
|
|
650
|
+
const saved = await entity.Save();
|
|
651
|
+
if (!saved) {
|
|
652
|
+
throw new Error('Failed to save configuration.');
|
|
653
|
+
}
|
|
654
|
+
// Update the ID if this was a new record
|
|
655
|
+
if (this.SelectedConfig.ID.startsWith('new-')) {
|
|
656
|
+
this.SelectedConfig.ID = entity.ID;
|
|
657
|
+
}
|
|
658
|
+
this.SelectedConfig.IsDirty = false;
|
|
659
|
+
}
|
|
660
|
+
/** Save all dirty/new entity records */
|
|
661
|
+
async saveConfigEntities() {
|
|
662
|
+
const dirtyEntities = this.ConfigEntities.filter((e) => e.IsDirty);
|
|
663
|
+
for (const configEntity of dirtyEntities) {
|
|
664
|
+
await this.saveConfigEntity(configEntity);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
/** Save a single config entity record using strongly-typed entity */
|
|
668
|
+
async saveConfigEntity(configEntity) {
|
|
669
|
+
const md = new Metadata();
|
|
670
|
+
const entity = await md.GetEntityObject('MJ: Archive Configuration Entities');
|
|
671
|
+
if (!configEntity.IsNew) {
|
|
672
|
+
await entity.InnerLoad(CompositeKey.FromKeyValuePair('ID', configEntity.ID));
|
|
673
|
+
}
|
|
674
|
+
else {
|
|
675
|
+
entity.NewRecord();
|
|
676
|
+
}
|
|
677
|
+
entity.ArchiveConfigurationID = configEntity.ArchiveConfigurationID;
|
|
678
|
+
entity.Mode = configEntity.Mode ?? null;
|
|
679
|
+
entity.RetentionDays = configEntity.RetentionDays;
|
|
680
|
+
entity.BatchSize = configEntity.BatchSize;
|
|
681
|
+
entity.DateField = configEntity.DateField;
|
|
682
|
+
entity.IsActive = configEntity.IsActive;
|
|
683
|
+
const saved = await entity.Save();
|
|
684
|
+
if (!saved) {
|
|
685
|
+
throw new Error(`Failed to save entity "${configEntity.EntityName}".`);
|
|
686
|
+
}
|
|
687
|
+
configEntity.IsDirty = false;
|
|
688
|
+
configEntity.IsNew = false;
|
|
689
|
+
}
|
|
690
|
+
/** Refresh the config list after a save */
|
|
691
|
+
async refreshConfigList() {
|
|
692
|
+
const rv = new RunView();
|
|
693
|
+
const result = await rv.RunView({
|
|
694
|
+
EntityName: 'MJ: Archive Configurations',
|
|
695
|
+
ExtraFilter: '',
|
|
696
|
+
OrderBy: 'Name',
|
|
697
|
+
ResultType: 'simple',
|
|
698
|
+
});
|
|
699
|
+
this.Configs = this.mapConfigRecords(result);
|
|
700
|
+
}
|
|
701
|
+
/** Set a status message */
|
|
702
|
+
setStatus(message, type) {
|
|
703
|
+
this.StatusMessage = message;
|
|
704
|
+
this.StatusType = type;
|
|
705
|
+
}
|
|
706
|
+
/** Clear status message */
|
|
707
|
+
clearStatus() {
|
|
708
|
+
this.StatusMessage = '';
|
|
709
|
+
this.StatusType = '';
|
|
710
|
+
}
|
|
711
|
+
/** Mark for check only if not destroyed */
|
|
712
|
+
markForCheckIfAlive() {
|
|
713
|
+
if (!this.destroyed) {
|
|
714
|
+
this.cdr.markForCheck();
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
static ɵfac = function ArchiveConfigAdminComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArchiveConfigAdminComponent)(); };
|
|
718
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArchiveConfigAdminComponent, selectors: [["mj-archive-config-admin"]], standalone: false, decls: 3, vars: 2, consts: [[1, "config-admin"], [1, "config-loading"], [1, "config-layout"], ["text", "Loading configurations..."], [1, "config-list-panel"], [1, "config-list-header"], [1, "btn", "btn-primary", "btn-sm", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "config-card-list"], ["tabindex", "0", "role", "button", 1, "config-card", 3, "selected"], [1, "config-empty"], [1, "config-detail-panel"], [1, "config-detail-placeholder"], ["tabindex", "0", "role", "button", 1, "config-card", 3, "click", "keydown.enter"], [1, "config-card-header"], [1, "config-card-name"], [1, "config-status-badge"], [1, "config-card-meta"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-folder"], [1, "config-card-date"], [1, "config-status-mode"], [1, "fa-solid", "fa-sliders"], [1, "fa-solid", "fa-folder-open"], [1, "fa-solid", "fa-hand-pointer"], [1, "config-detail-loading"], [1, "config-detail-content"], ["text", "Loading details...", "size", "small"], [1, "detail-section"], [1, "detail-field"], ["for", "config-name"], ["id", "config-name", "type", "text", 1, "detail-input", 3, "ngModelChange", "ngModel"], [1, "detail-checkbox"], ["type", "checkbox", 3, "change", "checked"], ["for", "config-desc"], ["id", "config-desc", "rows", "2", 1, "detail-input", "detail-textarea", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-hard-drive"], [1, "detail-row"], ["for", "config-storage"], ["id", "config-storage", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], ["for", "config-path"], ["id", "config-path", "type", "text", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["for", "config-retention"], ["id", "config-retention", "type", "number", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["for", "config-batch"], ["id", "config-batch", "type", "number", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["for", "config-mode"], ["id", "config-mode", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "detail-section-header"], [1, "fa-solid", "fa-table"], [1, "btn", "btn-sm", "btn-outline", 3, "click"], [1, "entity-table-wrapper"], [1, "entity-empty"], [1, "config-status", 3, "status-success", "status-error"], [1, "detail-actions"], [1, "btn", "btn-primary", 3, "click", "disabled"], [1, "btn", "btn-secondary", 3, "click", "disabled"], [1, "entity-table"], ["type", "text", "placeholder", "Entity name", 1, "entity-input", 3, "ngModelChange", "ngModel"], [1, "entity-input", 3, "ngModelChange", "ngModel"], ["type", "number", 1, "entity-input", "entity-input-sm", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "e.g. CreatedAt", 1, "entity-input", 3, "ngModelChange", "ngModel"], ["title", "Remove entity", "aria-label", "Remove entity", 1, "btn-icon", "btn-icon-danger", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "config-status"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-floppy-disk"]], template: function ArchiveConfigAdminComponent_Template(rf, ctx) { if (rf & 1) {
|
|
719
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
720
|
+
i0.ɵɵconditionalCreate(1, ArchiveConfigAdminComponent_Conditional_1_Template, 2, 0, "div", 1);
|
|
721
|
+
i0.ɵɵconditionalCreate(2, ArchiveConfigAdminComponent_Conditional_2_Template, 15, 3, "div", 2);
|
|
722
|
+
i0.ɵɵelementEnd();
|
|
723
|
+
} if (rf & 2) {
|
|
724
|
+
i0.ɵɵadvance();
|
|
725
|
+
i0.ɵɵconditional(ctx.IsLoading ? 1 : -1);
|
|
726
|
+
i0.ɵɵadvance();
|
|
727
|
+
i0.ɵɵconditional(!ctx.IsLoading ? 2 : -1);
|
|
728
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.LoadingComponent], styles: [".config-admin[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.config-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 60px;\n}\n\n\n\n.config-layout[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n\n\n.config-list-panel[_ngcontent-%COMP%] {\n width: 35%;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.config-list-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n\n h2 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n}\n\n.config-card-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n\n\n.config-card[_ngcontent-%COMP%] {\n padding: 12px 14px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n cursor: pointer;\n transition: border-color 0.15s ease, background 0.15s ease;\n\n &:hover {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface-hover);\n }\n\n &:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n }\n\n &.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n }\n}\n\n.config-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 6px;\n}\n\n.config-card-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-status-badge[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n}\n\n.status-active[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-inactive[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.config-card-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 14px;\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n\n i {\n margin-right: 4px;\n }\n}\n\n.config-card-date[_ngcontent-%COMP%] {\n margin-top: 6px;\n font-size: 0.73rem;\n color: var(--mj-text-muted);\n\n i {\n margin-right: 4px;\n }\n}\n\n.config-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-muted);\n text-align: center;\n\n i {\n font-size: 2rem;\n margin-bottom: 12px;\n }\n\n p {\n margin: 0;\n font-size: 0.85rem;\n }\n}\n\n\n\n.config-detail-panel[_ngcontent-%COMP%] {\n width: 65%;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n.config-detail-placeholder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n color: var(--mj-text-muted);\n\n i {\n font-size: 1.5rem;\n margin-bottom: 8px;\n }\n\n p {\n margin: 0;\n font-size: 0.85rem;\n }\n}\n\n.config-detail-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n}\n\n.config-detail-content[_ngcontent-%COMP%] {\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n\n\n.detail-section[_ngcontent-%COMP%] {\n h3 {\n margin: 0 0 12px;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n\n i {\n color: var(--mj-brand-primary);\n }\n }\n}\n\n.detail-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n\n h3 {\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom: none;\n }\n}\n\n.detail-row[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n margin-bottom: 10px;\n\n .detail-field {\n flex: 1;\n }\n}\n\n.detail-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-bottom: 10px;\n\n label {\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n }\n}\n\n.detail-input[_ngcontent-%COMP%] {\n padding: 7px 10px;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n outline: none;\n transition: border-color 0.15s ease;\n\n &:focus {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n}\n\n.detail-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n font-family: inherit;\n}\n\n.detail-checkbox[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding-top: 2px;\n\n input[type=\"checkbox\"] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n position: relative;\n\n &:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n\n &::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 6px;\n height: 10px;\n border: solid var(--mj-text-inverse, white);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n }\n\n &:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n }\n }\n}\n\n\n\n.entity-table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n\n.entity-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.82rem;\n\n th {\n padding: 8px 10px;\n text-align: left;\n font-weight: 600;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n }\n\n tr:last-child td {\n border-bottom: none;\n }\n}\n\n.entity-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 4px 6px;\n font-size: 0.82rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 3px;\n outline: none;\n\n &:focus {\n border-color: var(--mj-border-focus);\n }\n}\n\n.entity-input-sm[_ngcontent-%COMP%] {\n width: 70px;\n}\n\n\n\n.entity-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n position: relative;\n\n &:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n\n &::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 6px;\n height: 10px;\n border: solid var(--mj-text-inverse, white);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n }\n\n &:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n }\n}\n\n.entity-empty[_ngcontent-%COMP%] {\n text-align: center;\n padding: 20px;\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n border: 1px dashed var(--mj-border-default);\n border-radius: 6px;\n\n p {\n margin: 0;\n }\n}\n\n\n\n.config-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 0.85rem;\n\n i {\n font-size: 1rem;\n }\n}\n\n.status-success[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n\n\n.detail-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n\n\n.btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n font-size: 0.85rem;\n font-weight: 500;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: background 0.15s ease, opacity 0.15s ease;\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.btn-sm[_ngcontent-%COMP%] {\n padding: 5px 10px;\n font-size: 0.78rem;\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n\n &:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n &:active:not(:disabled) {\n background: var(--mj-brand-primary-active);\n }\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n\n &:hover:not(:disabled) {\n background: var(--mj-bg-surface-active);\n }\n}\n\n.btn-outline[_ngcontent-%COMP%] {\n background: transparent;\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n\n &:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n }\n}\n\n.btn-icon[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px 6px;\n border-radius: 4px;\n transition: color 0.15s ease, background 0.15s ease;\n}\n\n.btn-icon-danger[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n\n &:hover {\n color: var(--mj-status-error);\n background: var(--mj-status-error-bg);\n }\n}"], changeDetection: 0 });
|
|
729
|
+
}
|
|
730
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ArchiveConfigAdminComponent, [{
|
|
731
|
+
type: Component,
|
|
732
|
+
args: [{ standalone: false, selector: 'mj-archive-config-admin', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"config-admin\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configurations...\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n <div class=\"config-layout\">\n <!-- Left panel: Config list -->\n <div class=\"config-list-panel\">\n <div class=\"config-list-header\">\n <h2>Archive Configurations</h2>\n <button class=\"btn btn-primary btn-sm\" (click)=\"AddConfiguration()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Configuration\n </button>\n </div>\n\n <div class=\"config-card-list\">\n @for (config of Configs; track config.ID) {\n <div\n class=\"config-card\"\n [class.selected]=\"IsSelectedConfig(config)\"\n (click)=\"SelectConfig(config)\"\n (keydown.enter)=\"SelectConfig(config)\"\n tabindex=\"0\"\n role=\"button\">\n <div class=\"config-card-header\">\n <span class=\"config-card-name\">{{ config.Name }}</span>\n <span\n class=\"config-status-badge\"\n [class.status-active]=\"config.Status === 'Idle' || config.Status === 'Running'\"\n [class.status-inactive]=\"config.Status === 'Disabled' || config.Status === 'Error'\">\n {{ GetStatusLabel(config.Status) }}\n </span>\n </div>\n <div class=\"config-card-meta\">\n <span><i class=\"fa-solid fa-database\"></i> {{ config.StorageAccountName || 'No storage' }}</span>\n <span><i class=\"fa-solid fa-folder\"></i> {{ config.RootPath }}</span>\n </div>\n <div class=\"config-card-date\">\n <span class=\"config-status-mode\"><i class=\"fa-solid fa-sliders\"></i> {{ config.DefaultMode }}</span>\n </div>\n </div>\n }\n\n @if (Configs.length === 0) {\n <div class=\"config-empty\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No configurations found. Create one to get started.</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Right panel: Detail -->\n <div class=\"config-detail-panel\">\n @if (!SelectedConfig) {\n <div class=\"config-detail-placeholder\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a configuration to view details</p>\n </div>\n }\n\n @if (SelectedConfig) {\n @if (IsDetailLoading) {\n <div class=\"config-detail-loading\">\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n </div>\n }\n\n @if (!IsDetailLoading) {\n <div class=\"config-detail-content\">\n <!-- Header section -->\n <div class=\"detail-section\">\n <div class=\"detail-field\">\n <label for=\"config-name\">Name</label>\n <input\n id=\"config-name\"\n type=\"text\"\n [(ngModel)]=\"SelectedConfig.Name\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n <div class=\"detail-field\">\n <label>Active</label>\n <div class=\"detail-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"SelectedConfig.Status === 'Idle'\"\n (change)=\"SelectedConfig.Status = SelectedConfig.Status === 'Idle' ? 'Disabled' : 'Idle'; OnConfigFieldChanged()\" />\n </div>\n </div>\n <div class=\"detail-field\">\n <label for=\"config-desc\">Description</label>\n <textarea\n id=\"config-desc\"\n [(ngModel)]=\"SelectedConfig.Description\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input detail-textarea\"\n rows=\"2\"></textarea>\n </div>\n </div>\n\n <!-- Storage section -->\n <div class=\"detail-section\">\n <h3><i class=\"fa-solid fa-hard-drive\"></i> Storage</h3>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-storage\">Storage Account</label>\n <select\n id=\"config-storage\"\n [(ngModel)]=\"SelectedConfig.StorageAccountID\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\">\n <option value=\"\">-- Select --</option>\n @for (account of StorageAccounts; track account.ID) {\n <option [value]=\"account.ID\">{{ account.Name }}</option>\n }\n </select>\n </div>\n <div class=\"detail-field\">\n <label for=\"config-path\">Root Path</label>\n <input\n id=\"config-path\"\n type=\"text\"\n [(ngModel)]=\"SelectedConfig.RootPath\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n </div>\n </div>\n\n <!-- Defaults section -->\n <div class=\"detail-section\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Defaults</h3>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-retention\">Retention Days</label>\n <input\n id=\"config-retention\"\n type=\"number\"\n [(ngModel)]=\"SelectedConfig.DefaultRetentionDays\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n <div class=\"detail-field\">\n <label for=\"config-batch\">Batch Size</label>\n <input\n id=\"config-batch\"\n type=\"number\"\n [(ngModel)]=\"SelectedConfig.DefaultBatchSize\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-mode\">Archive Mode</label>\n <select\n id=\"config-mode\"\n [(ngModel)]=\"SelectedConfig.DefaultMode\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\">\n @for (mode of ArchiveModes; track mode) {\n <option [value]=\"mode\">{{ mode }}</option>\n }\n </select>\n </div>\n <div class=\"detail-field\">\n <label>Archive Record Changes</label>\n <div class=\"detail-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"SelectedConfig.ArchiveRelatedRecordChanges\"\n (ngModelChange)=\"OnConfigFieldChanged()\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- Entities section -->\n <div class=\"detail-section\">\n <div class=\"detail-section-header\">\n <h3><i class=\"fa-solid fa-table\"></i> Entities</h3>\n <button class=\"btn btn-sm btn-outline\" (click)=\"AddEntity()\">\n <i class=\"fa-solid fa-plus\"></i> Add Entity\n </button>\n </div>\n\n @if (ConfigEntities.length > 0) {\n <div class=\"entity-table-wrapper\">\n <table class=\"entity-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Mode</th>\n <th>Retention</th>\n <th>Batch</th>\n <th>Date Field</th>\n <th>Active</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (entity of ConfigEntities; track entity.ID) {\n <tr>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"entity.EntityName\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\"\n placeholder=\"Entity name\" />\n </td>\n <td>\n <select\n [(ngModel)]=\"entity.Mode\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\">\n @for (mode of ArchiveModes; track mode) {\n <option [value]=\"mode\">{{ mode }}</option>\n }\n </select>\n </td>\n <td>\n <input\n type=\"number\"\n [(ngModel)]=\"entity.RetentionDays\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input entity-input-sm\" />\n </td>\n <td>\n <input\n type=\"number\"\n [(ngModel)]=\"entity.BatchSize\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input entity-input-sm\" />\n </td>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"entity.DateField\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\"\n placeholder=\"e.g. CreatedAt\" />\n </td>\n <td>\n <input\n type=\"checkbox\"\n [(ngModel)]=\"entity.IsActive\"\n (ngModelChange)=\"OnEntityChanged(entity)\" />\n </td>\n <td>\n <button\n class=\"btn-icon btn-icon-danger\"\n (click)=\"RemoveEntity(entity)\"\n title=\"Remove entity\"\n aria-label=\"Remove entity\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @if (ConfigEntities.length === 0) {\n <div class=\"entity-empty\">\n <p>No entities configured. Click \"Add Entity\" to add one.</p>\n </div>\n }\n </div>\n\n <!-- Status message -->\n @if (StatusMessage) {\n <div class=\"config-status\" [class.status-success]=\"StatusType === 'success'\" [class.status-error]=\"StatusType === 'error'\">\n @if (StatusType === 'success') {\n <i class=\"fa-solid fa-circle-check\"></i>\n }\n @if (StatusType === 'error') {\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n }\n {{ StatusMessage }}\n </div>\n }\n\n <!-- Action bar (Save on LEFT per MJ convention) -->\n <div class=\"detail-actions\">\n <button\n class=\"btn btn-primary\"\n [disabled]=\"IsSaving\"\n (click)=\"Save()\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save\n }\n </button>\n <button class=\"btn btn-secondary\" [disabled]=\"IsSaving\" (click)=\"Cancel()\">\n Cancel\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n</div>\n", styles: [".config-admin {\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n/* Loading */\n.config-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 60px;\n}\n\n/* Layout: 35% / 65% split */\n.config-layout {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n/* Left panel: Config list */\n.config-list-panel {\n width: 35%;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.config-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n\n h2 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n}\n\n.config-card-list {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* Config card */\n.config-card {\n padding: 12px 14px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n cursor: pointer;\n transition: border-color 0.15s ease, background 0.15s ease;\n\n &:hover {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface-hover);\n }\n\n &:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n }\n\n &.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n }\n}\n\n.config-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 6px;\n}\n\n.config-card-name {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-status-badge {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n}\n\n.status-active {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-inactive {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.config-card-meta {\n display: flex;\n gap: 14px;\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n\n i {\n margin-right: 4px;\n }\n}\n\n.config-card-date {\n margin-top: 6px;\n font-size: 0.73rem;\n color: var(--mj-text-muted);\n\n i {\n margin-right: 4px;\n }\n}\n\n.config-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-muted);\n text-align: center;\n\n i {\n font-size: 2rem;\n margin-bottom: 12px;\n }\n\n p {\n margin: 0;\n font-size: 0.85rem;\n }\n}\n\n/* Right panel: Detail */\n.config-detail-panel {\n width: 65%;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n.config-detail-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n color: var(--mj-text-muted);\n\n i {\n font-size: 1.5rem;\n margin-bottom: 8px;\n }\n\n p {\n margin: 0;\n font-size: 0.85rem;\n }\n}\n\n.config-detail-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n}\n\n.config-detail-content {\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n/* Detail sections */\n.detail-section {\n h3 {\n margin: 0 0 12px;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n\n i {\n color: var(--mj-brand-primary);\n }\n }\n}\n\n.detail-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n\n h3 {\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom: none;\n }\n}\n\n.detail-row {\n display: flex;\n gap: 16px;\n margin-bottom: 10px;\n\n .detail-field {\n flex: 1;\n }\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-bottom: 10px;\n\n label {\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n }\n}\n\n.detail-input {\n padding: 7px 10px;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n outline: none;\n transition: border-color 0.15s ease;\n\n &:focus {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n}\n\n.detail-textarea {\n resize: vertical;\n font-family: inherit;\n}\n\n.detail-checkbox {\n display: flex;\n align-items: center;\n padding-top: 2px;\n\n input[type=\"checkbox\"] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n position: relative;\n\n &:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n\n &::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 6px;\n height: 10px;\n border: solid var(--mj-text-inverse, white);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n }\n\n &:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n }\n }\n}\n\n/* Entity table */\n.entity-table-wrapper {\n overflow-x: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n\n.entity-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.82rem;\n\n th {\n padding: 8px 10px;\n text-align: left;\n font-weight: 600;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n }\n\n tr:last-child td {\n border-bottom: none;\n }\n}\n\n.entity-input {\n width: 100%;\n padding: 4px 6px;\n font-size: 0.82rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 3px;\n outline: none;\n\n &:focus {\n border-color: var(--mj-border-focus);\n }\n}\n\n.entity-input-sm {\n width: 70px;\n}\n\n/* Checkbox styling within entity table */\n.entity-table td input[type=\"checkbox\"] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n position: relative;\n\n &:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n\n &::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 6px;\n height: 10px;\n border: solid var(--mj-text-inverse, white);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n }\n\n &:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n }\n}\n\n.entity-empty {\n text-align: center;\n padding: 20px;\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n border: 1px dashed var(--mj-border-default);\n border-radius: 6px;\n\n p {\n margin: 0;\n }\n}\n\n/* Status message */\n.config-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 0.85rem;\n\n i {\n font-size: 1rem;\n }\n}\n\n.status-success {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n/* Action bar */\n.detail-actions {\n display: flex;\n gap: 10px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n/* Buttons */\n.btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n font-size: 0.85rem;\n font-weight: 500;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: background 0.15s ease, opacity 0.15s ease;\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.btn-sm {\n padding: 5px 10px;\n font-size: 0.78rem;\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n\n &:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n &:active:not(:disabled) {\n background: var(--mj-brand-primary-active);\n }\n}\n\n.btn-secondary {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n\n &:hover:not(:disabled) {\n background: var(--mj-bg-surface-active);\n }\n}\n\n.btn-outline {\n background: transparent;\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n\n &:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n }\n}\n\n.btn-icon {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px 6px;\n border-radius: 4px;\n transition: color 0.15s ease, background 0.15s ease;\n}\n\n.btn-icon-danger {\n color: var(--mj-text-muted);\n\n &:hover {\n color: var(--mj-status-error);\n background: var(--mj-status-error-bg);\n }\n}\n"] }]
|
|
733
|
+
}], null, null); })();
|
|
734
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArchiveConfigAdminComponent, { className: "ArchiveConfigAdminComponent", filePath: "src/lib/archive-config/archive-config-admin.component.ts", lineNumber: 65 }); })();
|
|
735
|
+
//# sourceMappingURL=archive-config-admin.component.js.map
|