@memberjunction/ng-dashboards 5.23.0 → 5.24.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/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +677 -5
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +6879 -1873
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +46 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +758 -491
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +19 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +410 -208
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +17 -17
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +1 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +1 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +1 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +1 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +411 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +4266 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +35 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +186 -13
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +1 -0
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +188 -165
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +75 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +601 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +93 -12
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +637 -107
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/index.d.ts +2 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +2 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/__tests__/analytics-resource.test.d.ts +2 -0
- package/dist/__tests__/analytics-resource.test.d.ts.map +1 -0
- package/dist/__tests__/analytics-resource.test.js +181 -0
- package/dist/__tests__/analytics-resource.test.js.map +1 -0
- package/dist/__tests__/scheduling.test.d.ts +2 -0
- package/dist/__tests__/scheduling.test.d.ts.map +1 -0
- package/dist/__tests__/scheduling.test.js +205 -0
- package/dist/__tests__/scheduling.test.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +18 -14
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +25 -5
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/entity-field-display.d.ts +44 -0
- package/dist/shared/entity-field-display.d.ts.map +1 -0
- package/dist/shared/entity-field-display.js +118 -0
- package/dist/shared/entity-field-display.js.map +1 -0
- package/package.json +47 -46
|
@@ -18,10 +18,11 @@ import { takeUntil } from 'rxjs/operators';
|
|
|
18
18
|
import { Metadata, RunView } from '@memberjunction/core';
|
|
19
19
|
import { KnowledgeHubMetadataEngine } from '@memberjunction/core-entities';
|
|
20
20
|
import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
|
|
21
|
-
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
21
|
+
import { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';
|
|
22
22
|
import { GraphQLAIClient } from '@memberjunction/graphql-dataprovider';
|
|
23
23
|
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
24
24
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
25
|
+
import { CronToHumanReadable } from '../autotagging/autotagging-pipeline-resource.component';
|
|
25
26
|
import * as i0 from "@angular/core";
|
|
26
27
|
import * as i1 from "@angular/forms";
|
|
27
28
|
import * as i2 from "@memberjunction/ng-code-editor";
|
|
@@ -83,7 +84,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
|
|
|
83
84
|
i0.ɵɵtextInterpolate1(" ", row_r6.Status, " ");
|
|
84
85
|
} }
|
|
85
86
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
86
|
-
i0.ɵɵelement(0, "i",
|
|
87
|
+
i0.ɵɵelement(0, "i", 57);
|
|
87
88
|
i0.ɵɵtext(1);
|
|
88
89
|
} if (rf & 2) {
|
|
89
90
|
const row_r6 = i0.ɵɵnextContext().$implicit;
|
|
@@ -91,7 +92,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_C
|
|
|
91
92
|
i0.ɵɵtextInterpolate1(" ", row_r6.PercentComplete > 0 ? row_r6.PercentComplete + "%" : "Sync", " ");
|
|
92
93
|
} }
|
|
93
94
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
94
|
-
i0.ɵɵelement(0, "i",
|
|
95
|
+
i0.ɵɵelement(0, "i", 58);
|
|
95
96
|
i0.ɵɵtext(1, " Sync ");
|
|
96
97
|
} }
|
|
97
98
|
function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -118,8 +119,12 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_T
|
|
|
118
119
|
i0.ɵɵconditionalCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_17_Template, 2, 1)(18, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Conditional_18_Template, 2, 0);
|
|
119
120
|
i0.ɵɵelementEnd();
|
|
120
121
|
i0.ɵɵelementStart(19, "button", 53);
|
|
121
|
-
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_19_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.
|
|
122
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_19_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenScheduleSyncDialog(row_r6.EntityDocumentID)); });
|
|
122
123
|
i0.ɵɵelement(20, "i", 54);
|
|
124
|
+
i0.ɵɵelementEnd();
|
|
125
|
+
i0.ɵɵelementStart(21, "button", 55);
|
|
126
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template_button_click_21_listener() { const row_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OpenEditPanel(row_r6.EntityDocumentID)); });
|
|
127
|
+
i0.ɵɵelement(22, "i", 56);
|
|
123
128
|
i0.ɵɵelementEnd()()();
|
|
124
129
|
} if (rf & 2) {
|
|
125
130
|
const row_r6 = ctx.$implicit;
|
|
@@ -163,7 +168,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_20_Template
|
|
|
163
168
|
i0.ɵɵtext(15, "Actions");
|
|
164
169
|
i0.ɵɵelementEnd()()();
|
|
165
170
|
i0.ɵɵelementStart(16, "tbody");
|
|
166
|
-
i0.ɵɵrepeaterCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template,
|
|
171
|
+
i0.ɵɵrepeaterCreate(17, VectorManagementResourceComponent_Conditional_1_Conditional_20_For_18_Template, 23, 13, "tr", null, _forTrack1);
|
|
167
172
|
i0.ɵɵelementEnd()()();
|
|
168
173
|
} if (rf & 2) {
|
|
169
174
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -184,7 +189,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_42_Template
|
|
|
184
189
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(5, 1, ctx_r2.EmbeddingModel.Dimensions));
|
|
185
190
|
} }
|
|
186
191
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template(rf, ctx) { if (rf & 1) {
|
|
187
|
-
i0.ɵɵelementStart(0, "option",
|
|
192
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
188
193
|
i0.ɵɵtext(1);
|
|
189
194
|
i0.ɵɵelementEnd();
|
|
190
195
|
} if (rf & 2) {
|
|
@@ -194,7 +199,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_T
|
|
|
194
199
|
i0.ɵɵtextInterpolate(model_r8.Name);
|
|
195
200
|
} }
|
|
196
201
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_Template(rf, ctx) { if (rf & 1) {
|
|
197
|
-
i0.ɵɵelementStart(0, "option",
|
|
202
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
198
203
|
i0.ɵɵtext(1);
|
|
199
204
|
i0.ɵɵelementEnd();
|
|
200
205
|
} if (rf & 2) {
|
|
@@ -204,7 +209,7 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_T
|
|
|
204
209
|
i0.ɵɵtextInterpolate(db_r9.Name);
|
|
205
210
|
} }
|
|
206
211
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
207
|
-
i0.ɵɵelementStart(0, "option",
|
|
212
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
208
213
|
i0.ɵɵtext(1);
|
|
209
214
|
i0.ɵɵelementEnd();
|
|
210
215
|
} if (rf & 2) {
|
|
@@ -215,12 +220,12 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditio
|
|
|
215
220
|
} }
|
|
216
221
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template(rf, ctx) { if (rf & 1) {
|
|
217
222
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
218
|
-
i0.ɵɵelementStart(0, "select",
|
|
223
|
+
i0.ɵɵelementStart(0, "select", 71);
|
|
219
224
|
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorIndexID, $event) || (ctx_r2.EditDocVectorIndexID = $event); return i0.ɵɵresetView($event); });
|
|
220
|
-
i0.ɵɵelementStart(1, "option",
|
|
225
|
+
i0.ɵɵelementStart(1, "option", 79);
|
|
221
226
|
i0.ɵɵtext(2, "Auto (create/find matching index)");
|
|
222
227
|
i0.ɵɵelementEnd();
|
|
223
|
-
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_For_4_Template, 2, 2, "option",
|
|
228
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_For_4_Template, 2, 2, "option", 72, _forTrack2);
|
|
224
229
|
i0.ɵɵelementEnd();
|
|
225
230
|
} if (rf & 2) {
|
|
226
231
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -229,88 +234,88 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditio
|
|
|
229
234
|
i0.ɵɵrepeater(ctx_r2.EditFilteredIndexes);
|
|
230
235
|
} }
|
|
231
236
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
232
|
-
i0.ɵɵelementStart(0, "span",
|
|
237
|
+
i0.ɵɵelementStart(0, "span", 74);
|
|
233
238
|
i0.ɵɵtext(1, " No indexes for this database \u2014 one will be created automatically on sync ");
|
|
234
239
|
i0.ɵɵelementEnd();
|
|
235
240
|
} }
|
|
236
241
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
237
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
242
|
+
i0.ɵɵelement(0, "mj-loading", 78);
|
|
238
243
|
} }
|
|
239
244
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template(rf, ctx) { if (rf & 1) {
|
|
240
245
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
241
|
-
i0.ɵɵelementStart(0, "button",
|
|
246
|
+
i0.ɵɵelementStart(0, "button", 80);
|
|
242
247
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveEditedDocument()); });
|
|
243
|
-
i0.ɵɵelement(1, "i",
|
|
248
|
+
i0.ɵɵelement(1, "i", 81);
|
|
244
249
|
i0.ɵɵtext(2, " Save Changes ");
|
|
245
250
|
i0.ɵɵelementEnd();
|
|
246
|
-
i0.ɵɵelementStart(3, "button",
|
|
251
|
+
i0.ɵɵelementStart(3, "button", 82);
|
|
247
252
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.DeleteEntityDocument()); });
|
|
248
|
-
i0.ɵɵelement(4, "i",
|
|
253
|
+
i0.ɵɵelement(4, "i", 83);
|
|
249
254
|
i0.ɵɵtext(5, " Delete ");
|
|
250
255
|
i0.ɵɵelementEnd();
|
|
251
|
-
i0.ɵɵelementStart(6, "button",
|
|
256
|
+
i0.ɵɵelementStart(6, "button", 84);
|
|
252
257
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
|
|
253
258
|
i0.ɵɵtext(7, " Cancel ");
|
|
254
259
|
i0.ɵɵelementEnd();
|
|
255
260
|
} }
|
|
256
261
|
function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
257
262
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
258
|
-
i0.ɵɵelementStart(0, "div",
|
|
263
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
259
264
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
|
|
260
|
-
i0.ɵɵelementStart(1, "div",
|
|
265
|
+
i0.ɵɵelementStart(1, "div", 60);
|
|
261
266
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r7); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
262
|
-
i0.ɵɵelementStart(2, "div",
|
|
263
|
-
i0.ɵɵelement(4, "i",
|
|
267
|
+
i0.ɵɵelementStart(2, "div", 61)(3, "h3", 62);
|
|
268
|
+
i0.ɵɵelement(4, "i", 56);
|
|
264
269
|
i0.ɵɵtext(5, " Edit Entity Document ");
|
|
265
270
|
i0.ɵɵelementEnd();
|
|
266
|
-
i0.ɵɵelementStart(6, "button",
|
|
271
|
+
i0.ɵɵelementStart(6, "button", 63);
|
|
267
272
|
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseEditPanel()); });
|
|
268
|
-
i0.ɵɵelement(7, "i",
|
|
273
|
+
i0.ɵɵelement(7, "i", 64);
|
|
269
274
|
i0.ɵɵelementEnd()();
|
|
270
|
-
i0.ɵɵelementStart(8, "div",
|
|
275
|
+
i0.ɵɵelementStart(8, "div", 65)(9, "div", 66)(10, "div", 67)(11, "label", 68);
|
|
271
276
|
i0.ɵɵtext(12, "Entity");
|
|
272
277
|
i0.ɵɵelementEnd();
|
|
273
|
-
i0.ɵɵelementStart(13, "span",
|
|
278
|
+
i0.ɵɵelementStart(13, "span", 69);
|
|
274
279
|
i0.ɵɵtext(14);
|
|
275
280
|
i0.ɵɵelementEnd()();
|
|
276
|
-
i0.ɵɵelementStart(15, "div",
|
|
281
|
+
i0.ɵɵelementStart(15, "div", 67)(16, "label", 68);
|
|
277
282
|
i0.ɵɵtext(17, "Document Name");
|
|
278
283
|
i0.ɵɵelementEnd();
|
|
279
|
-
i0.ɵɵelementStart(18, "input",
|
|
284
|
+
i0.ɵɵelementStart(18, "input", 70);
|
|
280
285
|
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocName, $event) || (ctx_r2.EditDocName = $event); return i0.ɵɵresetView($event); });
|
|
281
286
|
i0.ɵɵelementEnd()();
|
|
282
|
-
i0.ɵɵelementStart(19, "div",
|
|
287
|
+
i0.ɵɵelementStart(19, "div", 67)(20, "label", 68);
|
|
283
288
|
i0.ɵɵtext(21, "Embedding Model");
|
|
284
289
|
i0.ɵɵelementEnd();
|
|
285
|
-
i0.ɵɵelementStart(22, "select",
|
|
290
|
+
i0.ɵɵelementStart(22, "select", 71);
|
|
286
291
|
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_22_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocAIModelID, $event) || (ctx_r2.EditDocAIModelID = $event); return i0.ɵɵresetView($event); });
|
|
287
|
-
i0.ɵɵrepeaterCreate(23, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template, 2, 2, "option",
|
|
292
|
+
i0.ɵɵrepeaterCreate(23, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_24_Template, 2, 2, "option", 72, _forTrack2);
|
|
288
293
|
i0.ɵɵelementEnd()();
|
|
289
|
-
i0.ɵɵelementStart(25, "div",
|
|
294
|
+
i0.ɵɵelementStart(25, "div", 67)(26, "label", 68);
|
|
290
295
|
i0.ɵɵtext(27, "Vector Database");
|
|
291
296
|
i0.ɵɵelementEnd();
|
|
292
|
-
i0.ɵɵelementStart(28, "select",
|
|
297
|
+
i0.ɵɵelementStart(28, "select", 71);
|
|
293
298
|
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocVectorDBID, $event) || (ctx_r2.EditDocVectorDBID = $event); return i0.ɵɵresetView($event); });
|
|
294
|
-
i0.ɵɵrepeaterCreate(29, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_Template, 2, 2, "option",
|
|
299
|
+
i0.ɵɵrepeaterCreate(29, VectorManagementResourceComponent_Conditional_1_Conditional_55_For_30_Template, 2, 2, "option", 72, _forTrack2);
|
|
295
300
|
i0.ɵɵelementEnd()();
|
|
296
|
-
i0.ɵɵelementStart(31, "div",
|
|
301
|
+
i0.ɵɵelementStart(31, "div", 67)(32, "label", 68);
|
|
297
302
|
i0.ɵɵtext(33, "Vector Index");
|
|
298
303
|
i0.ɵɵelementEnd();
|
|
299
|
-
i0.ɵɵconditionalCreate(34, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template, 5, 1, "select",
|
|
304
|
+
i0.ɵɵconditionalCreate(34, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_34_Template, 5, 1, "select", 73)(35, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_35_Template, 2, 0, "span", 74);
|
|
300
305
|
i0.ɵɵelementEnd();
|
|
301
|
-
i0.ɵɵelementStart(36, "div",
|
|
306
|
+
i0.ɵɵelementStart(36, "div", 67)(37, "label", 68);
|
|
302
307
|
i0.ɵɵtext(38, "Status");
|
|
303
308
|
i0.ɵɵelementEnd();
|
|
304
|
-
i0.ɵɵelementStart(39, "select",
|
|
309
|
+
i0.ɵɵelementStart(39, "select", 71);
|
|
305
310
|
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template_select_ngModelChange_39_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.EditDocStatus, $event) || (ctx_r2.EditDocStatus = $event); return i0.ɵɵresetView($event); });
|
|
306
|
-
i0.ɵɵelementStart(40, "option",
|
|
311
|
+
i0.ɵɵelementStart(40, "option", 75);
|
|
307
312
|
i0.ɵɵtext(41, "Active");
|
|
308
313
|
i0.ɵɵelementEnd();
|
|
309
|
-
i0.ɵɵelementStart(42, "option",
|
|
314
|
+
i0.ɵɵelementStart(42, "option", 76);
|
|
310
315
|
i0.ɵɵtext(43, "Inactive");
|
|
311
316
|
i0.ɵɵelementEnd()()();
|
|
312
|
-
i0.ɵɵelementStart(44, "div",
|
|
313
|
-
i0.ɵɵconditionalCreate(45, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template, 1, 0, "mj-loading",
|
|
317
|
+
i0.ɵɵelementStart(44, "div", 77);
|
|
318
|
+
i0.ɵɵconditionalCreate(45, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_45_Template, 1, 0, "mj-loading", 78)(46, VectorManagementResourceComponent_Conditional_1_Conditional_55_Conditional_46_Template, 8, 0);
|
|
314
319
|
i0.ɵɵelementEnd()()()()();
|
|
315
320
|
} if (rf & 2) {
|
|
316
321
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -333,9 +338,82 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_55_Template
|
|
|
333
338
|
i0.ɵɵadvance(6);
|
|
334
339
|
i0.ɵɵconditional(ctx_r2.IsEditSaving || ctx_r2.IsEditDeleting ? 45 : 46);
|
|
335
340
|
} }
|
|
336
|
-
function
|
|
337
|
-
i0.ɵɵelement(0, "
|
|
338
|
-
|
|
341
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template(rf, ctx) { if (rf & 1) {
|
|
342
|
+
i0.ɵɵelement(0, "mj-loading", 78);
|
|
343
|
+
} }
|
|
344
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template(rf, ctx) { if (rf & 1) {
|
|
345
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
346
|
+
i0.ɵɵelementStart(0, "button", 80);
|
|
347
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SaveScheduleSync()); });
|
|
348
|
+
i0.ɵɵelement(1, "i", 91);
|
|
349
|
+
i0.ɵɵtext(2, " Create Schedule ");
|
|
350
|
+
i0.ɵɵelementEnd();
|
|
351
|
+
i0.ɵɵelementStart(3, "button", 84);
|
|
352
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
|
|
353
|
+
i0.ɵɵtext(4, " Cancel ");
|
|
354
|
+
i0.ɵɵelementEnd();
|
|
355
|
+
} }
|
|
356
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template(rf, ctx) { if (rf & 1) {
|
|
357
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
358
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
359
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
|
|
360
|
+
i0.ɵɵelementStart(1, "div", 85);
|
|
361
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
362
|
+
i0.ɵɵelementStart(2, "div", 61)(3, "h3", 62);
|
|
363
|
+
i0.ɵɵelement(4, "i", 54);
|
|
364
|
+
i0.ɵɵtext(5, " Schedule Vector Sync ");
|
|
365
|
+
i0.ɵɵelementEnd();
|
|
366
|
+
i0.ɵɵelementStart(6, "button", 63);
|
|
367
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseScheduleSyncDialog()); });
|
|
368
|
+
i0.ɵɵelement(7, "i", 64);
|
|
369
|
+
i0.ɵɵelementEnd()();
|
|
370
|
+
i0.ɵɵelementStart(8, "div", 65)(9, "div", 66)(10, "div", 67)(11, "label", 68);
|
|
371
|
+
i0.ɵɵtext(12, "Entity Document");
|
|
372
|
+
i0.ɵɵelementEnd();
|
|
373
|
+
i0.ɵɵelementStart(13, "span", 69);
|
|
374
|
+
i0.ɵɵtext(14);
|
|
375
|
+
i0.ɵɵelementEnd()();
|
|
376
|
+
i0.ɵɵelementStart(15, "div", 67)(16, "label", 68);
|
|
377
|
+
i0.ɵɵtext(17, "Action");
|
|
378
|
+
i0.ɵɵelementEnd();
|
|
379
|
+
i0.ɵɵelementStart(18, "span", 69);
|
|
380
|
+
i0.ɵɵtext(19, "__VectorizeEntity");
|
|
381
|
+
i0.ɵɵelementEnd()();
|
|
382
|
+
i0.ɵɵelementStart(20, "div", 67)(21, "label", 68);
|
|
383
|
+
i0.ɵɵtext(22, "Cron Expression");
|
|
384
|
+
i0.ɵɵelementEnd();
|
|
385
|
+
i0.ɵɵelementStart(23, "input", 86);
|
|
386
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_23_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncCron, $event) || (ctx_r2.ScheduleSyncCron = $event); return i0.ɵɵresetView($event); });
|
|
387
|
+
i0.ɵɵelementEnd();
|
|
388
|
+
i0.ɵɵelementStart(24, "div", 87);
|
|
389
|
+
i0.ɵɵelement(25, "i", 88);
|
|
390
|
+
i0.ɵɵtext(26);
|
|
391
|
+
i0.ɵɵelementEnd()();
|
|
392
|
+
i0.ɵɵelementStart(27, "div", 89)(28, "label", 68);
|
|
393
|
+
i0.ɵɵtext(29, "Enabled");
|
|
394
|
+
i0.ɵɵelementEnd();
|
|
395
|
+
i0.ɵɵelementStart(30, "input", 90);
|
|
396
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_56_Template_input_ngModelChange_30_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r2.ScheduleSyncEnabled, $event) || (ctx_r2.ScheduleSyncEnabled = $event); return i0.ɵɵresetView($event); });
|
|
397
|
+
i0.ɵɵelementEnd()();
|
|
398
|
+
i0.ɵɵelementStart(31, "div", 77);
|
|
399
|
+
i0.ɵɵconditionalCreate(32, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_32_Template, 1, 0, "mj-loading", 78)(33, VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditional_33_Template, 5, 0);
|
|
400
|
+
i0.ɵɵelementEnd()()()()();
|
|
401
|
+
} if (rf & 2) {
|
|
402
|
+
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
403
|
+
i0.ɵɵadvance(14);
|
|
404
|
+
i0.ɵɵtextInterpolate(ctx_r2.ScheduleSyncDocName);
|
|
405
|
+
i0.ɵɵadvance(9);
|
|
406
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ScheduleSyncCron);
|
|
407
|
+
i0.ɵɵadvance(3);
|
|
408
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r2.GetScheduleCronPreview(ctx_r2.ScheduleSyncCron), " ");
|
|
409
|
+
i0.ɵɵadvance(4);
|
|
410
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r2.ScheduleSyncEnabled);
|
|
411
|
+
i0.ɵɵadvance(2);
|
|
412
|
+
i0.ɵɵconditional(ctx_r2.ScheduleSyncSaving ? 32 : 33);
|
|
413
|
+
} }
|
|
414
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
415
|
+
i0.ɵɵelement(0, "i", 105);
|
|
416
|
+
i0.ɵɵelementStart(1, "span", 106);
|
|
339
417
|
i0.ɵɵtext(2);
|
|
340
418
|
i0.ɵɵelementEnd();
|
|
341
419
|
} if (rf & 2) {
|
|
@@ -343,42 +421,42 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
343
421
|
i0.ɵɵadvance(2);
|
|
344
422
|
i0.ɵɵtextInterpolate(ctx_r2.SuggestEntityName);
|
|
345
423
|
} }
|
|
346
|
-
function
|
|
347
|
-
i0.ɵɵelement(0, "i",
|
|
348
|
-
i0.ɵɵelementStart(1, "span",
|
|
424
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
425
|
+
i0.ɵɵelement(0, "i", 107);
|
|
426
|
+
i0.ɵɵelementStart(1, "span", 108);
|
|
349
427
|
i0.ɵɵtext(2, "Search and select an entity...");
|
|
350
428
|
i0.ɵɵelementEnd();
|
|
351
429
|
} }
|
|
352
|
-
function
|
|
353
|
-
const
|
|
354
|
-
i0.ɵɵelementStart(0, "button",
|
|
355
|
-
i0.ɵɵlistener("click", function
|
|
356
|
-
i0.ɵɵelement(1, "i",
|
|
430
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
431
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
432
|
+
i0.ɵɵelementStart(0, "button", 117);
|
|
433
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_For_5_Template_button_click_0_listener() { const entity_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r2 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r2.SelectEntity(entity_r19.Name)); });
|
|
434
|
+
i0.ɵɵelement(1, "i", 105);
|
|
357
435
|
i0.ɵɵtext(2);
|
|
358
436
|
i0.ɵɵelementEnd();
|
|
359
437
|
} if (rf & 2) {
|
|
360
|
-
const
|
|
438
|
+
const entity_r19 = ctx.$implicit;
|
|
361
439
|
const ctx_r2 = i0.ɵɵnextContext(6);
|
|
362
|
-
i0.ɵɵclassProp("entity-picker-item-selected",
|
|
440
|
+
i0.ɵɵclassProp("entity-picker-item-selected", entity_r19.Name === ctx_r2.SuggestEntityName);
|
|
363
441
|
i0.ɵɵadvance(2);
|
|
364
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
442
|
+
i0.ɵɵtextInterpolate1(" ", entity_r19.Name, " ");
|
|
365
443
|
} }
|
|
366
|
-
function
|
|
367
|
-
i0.ɵɵelementStart(0, "div",
|
|
368
|
-
i0.ɵɵelement(2, "i",
|
|
444
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
445
|
+
i0.ɵɵelementStart(0, "div", 112)(1, "div", 114);
|
|
446
|
+
i0.ɵɵelement(2, "i", 115);
|
|
369
447
|
i0.ɵɵtext(3);
|
|
370
448
|
i0.ɵɵelementEnd();
|
|
371
|
-
i0.ɵɵrepeaterCreate(4,
|
|
449
|
+
i0.ɵɵrepeaterCreate(4, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_For_5_Template, 3, 3, "button", 116, _forTrack2);
|
|
372
450
|
i0.ɵɵelementEnd();
|
|
373
451
|
} if (rf & 2) {
|
|
374
|
-
const
|
|
452
|
+
const group_r20 = ctx.$implicit;
|
|
375
453
|
i0.ɵɵadvance(3);
|
|
376
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
454
|
+
i0.ɵɵtextInterpolate1(" ", group_r20.SchemaName, " ");
|
|
377
455
|
i0.ɵɵadvance();
|
|
378
|
-
i0.ɵɵrepeater(
|
|
456
|
+
i0.ɵɵrepeater(group_r20.Entities);
|
|
379
457
|
} }
|
|
380
|
-
function
|
|
381
|
-
i0.ɵɵelementStart(0, "div",
|
|
458
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
459
|
+
i0.ɵɵelementStart(0, "div", 113);
|
|
382
460
|
i0.ɵɵtext(1);
|
|
383
461
|
i0.ɵɵelementEnd();
|
|
384
462
|
} if (rf & 2) {
|
|
@@ -386,17 +464,17 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
386
464
|
i0.ɵɵadvance();
|
|
387
465
|
i0.ɵɵtextInterpolate1(" No entities matching \"", ctx_r2.EntitySearchText, "\" ");
|
|
388
466
|
} }
|
|
389
|
-
function
|
|
390
|
-
const
|
|
391
|
-
i0.ɵɵelementStart(0, "div",
|
|
392
|
-
i0.ɵɵelement(2, "i",
|
|
393
|
-
i0.ɵɵelementStart(3, "input",
|
|
394
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
395
|
-
i0.ɵɵlistener("input", function
|
|
467
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
468
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
469
|
+
i0.ɵɵelementStart(0, "div", 97)(1, "div", 109);
|
|
470
|
+
i0.ɵɵelement(2, "i", 107);
|
|
471
|
+
i0.ɵɵelementStart(3, "input", 110);
|
|
472
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.EntitySearchText, $event) || (ctx_r2.EntitySearchText = $event); return i0.ɵɵresetView($event); });
|
|
473
|
+
i0.ɵɵlistener("input", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template_input_input_3_listener() { i0.ɵɵrestoreView(_r17); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.FilterEntities()); });
|
|
396
474
|
i0.ɵɵelementEnd()();
|
|
397
|
-
i0.ɵɵelementStart(4, "div",
|
|
398
|
-
i0.ɵɵrepeaterCreate(5,
|
|
399
|
-
i0.ɵɵconditionalCreate(7,
|
|
475
|
+
i0.ɵɵelementStart(4, "div", 111);
|
|
476
|
+
i0.ɵɵrepeaterCreate(5, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_For_6_Template, 6, 1, "div", 112, _forTrack3);
|
|
477
|
+
i0.ɵɵconditionalCreate(7, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Conditional_7_Template, 2, 1, "div", 113);
|
|
400
478
|
i0.ɵɵelementEnd()();
|
|
401
479
|
} if (rf & 2) {
|
|
402
480
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
@@ -407,17 +485,17 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
407
485
|
i0.ɵɵadvance(2);
|
|
408
486
|
i0.ɵɵconditional(ctx_r2.FilteredEntityGroups.length === 0 ? 7 : -1);
|
|
409
487
|
} }
|
|
410
|
-
function
|
|
411
|
-
i0.ɵɵelement(0, "i",
|
|
488
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
489
|
+
i0.ɵɵelement(0, "i", 57);
|
|
412
490
|
i0.ɵɵtext(1, " Generating with AI... ");
|
|
413
491
|
} }
|
|
414
|
-
function
|
|
492
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
415
493
|
i0.ɵɵelement(0, "i", 13);
|
|
416
494
|
i0.ɵɵtext(1, " Generate Template ");
|
|
417
495
|
} }
|
|
418
|
-
function
|
|
419
|
-
i0.ɵɵelementStart(0, "div",
|
|
420
|
-
i0.ɵɵelement(1, "i",
|
|
496
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
497
|
+
i0.ɵɵelementStart(0, "div", 104);
|
|
498
|
+
i0.ɵɵelement(1, "i", 118);
|
|
421
499
|
i0.ɵɵtext(2);
|
|
422
500
|
i0.ɵɵelementEnd();
|
|
423
501
|
} if (rf & 2) {
|
|
@@ -425,41 +503,41 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
425
503
|
i0.ɵɵadvance(2);
|
|
426
504
|
i0.ɵɵtextInterpolate1(" ", ctx_r2.SuggestionError, " ");
|
|
427
505
|
} }
|
|
428
|
-
function
|
|
429
|
-
const
|
|
430
|
-
i0.ɵɵelementStart(0, "div",
|
|
506
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
507
|
+
const _r16 = i0.ɵɵgetCurrentView();
|
|
508
|
+
i0.ɵɵelementStart(0, "div", 66)(1, "div", 67)(2, "label", 68);
|
|
431
509
|
i0.ɵɵtext(3, "Entity");
|
|
432
510
|
i0.ɵɵelementEnd();
|
|
433
|
-
i0.ɵɵelementStart(4, "div",
|
|
434
|
-
i0.ɵɵlistener("click", function
|
|
435
|
-
i0.ɵɵconditionalCreate(6,
|
|
436
|
-
i0.ɵɵelement(8, "i",
|
|
511
|
+
i0.ɵɵelementStart(4, "div", 94)(5, "button", 95);
|
|
512
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.ToggleEntityPicker()); });
|
|
513
|
+
i0.ɵɵconditionalCreate(6, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_6_Template, 3, 1)(7, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_7_Template, 3, 0);
|
|
514
|
+
i0.ɵɵelement(8, "i", 96);
|
|
437
515
|
i0.ɵɵelementEnd();
|
|
438
|
-
i0.ɵɵconditionalCreate(9,
|
|
516
|
+
i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_9_Template, 8, 2, "div", 97);
|
|
439
517
|
i0.ɵɵelementEnd()();
|
|
440
|
-
i0.ɵɵelementStart(10, "div",
|
|
518
|
+
i0.ɵɵelementStart(10, "div", 67)(11, "label", 68);
|
|
441
519
|
i0.ɵɵtext(12, "Use Case");
|
|
442
520
|
i0.ɵɵelementEnd();
|
|
443
|
-
i0.ɵɵelementStart(13, "div",
|
|
444
|
-
i0.ɵɵlistener("click", function
|
|
445
|
-
i0.ɵɵelement(15, "i",
|
|
521
|
+
i0.ɵɵelementStart(13, "div", 98)(14, "button", 99);
|
|
522
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "duplicate detection"); });
|
|
523
|
+
i0.ɵɵelement(15, "i", 100);
|
|
446
524
|
i0.ɵɵtext(16, " Duplicate Detection ");
|
|
447
525
|
i0.ɵɵelementEnd();
|
|
448
|
-
i0.ɵɵelementStart(17, "button",
|
|
449
|
-
i0.ɵɵlistener("click", function
|
|
450
|
-
i0.ɵɵelement(18, "i",
|
|
526
|
+
i0.ɵɵelementStart(17, "button", 99);
|
|
527
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "search"); });
|
|
528
|
+
i0.ɵɵelement(18, "i", 101);
|
|
451
529
|
i0.ɵɵtext(19, " Search ");
|
|
452
530
|
i0.ɵɵelementEnd();
|
|
453
|
-
i0.ɵɵelementStart(20, "button",
|
|
454
|
-
i0.ɵɵlistener("click", function
|
|
455
|
-
i0.ɵɵelement(21, "i",
|
|
531
|
+
i0.ɵɵelementStart(20, "button", 99);
|
|
532
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_20_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SuggestUseCase = "classification"); });
|
|
533
|
+
i0.ɵɵelement(21, "i", 102);
|
|
456
534
|
i0.ɵɵtext(22, " Classification ");
|
|
457
535
|
i0.ɵɵelementEnd()()();
|
|
458
|
-
i0.ɵɵelementStart(23, "button",
|
|
459
|
-
i0.ɵɵlistener("click", function
|
|
460
|
-
i0.ɵɵconditionalCreate(24,
|
|
536
|
+
i0.ɵɵelementStart(23, "button", 103);
|
|
537
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r16); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.RunSuggestion()); });
|
|
538
|
+
i0.ɵɵconditionalCreate(24, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_24_Template, 2, 0)(25, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_25_Template, 2, 0);
|
|
461
539
|
i0.ɵɵelementEnd();
|
|
462
|
-
i0.ɵɵconditionalCreate(26,
|
|
540
|
+
i0.ɵɵconditionalCreate(26, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Conditional_26_Template, 3, 1, "div", 104);
|
|
463
541
|
i0.ɵɵelementEnd();
|
|
464
542
|
} if (rf & 2) {
|
|
465
543
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -480,78 +558,78 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
480
558
|
i0.ɵɵadvance(2);
|
|
481
559
|
i0.ɵɵconditional(ctx_r2.SuggestionError ? 26 : -1);
|
|
482
560
|
} }
|
|
483
|
-
function
|
|
484
|
-
i0.ɵɵelementStart(0, "span",
|
|
561
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_11_Template(rf, ctx) { if (rf & 1) {
|
|
562
|
+
i0.ɵɵelementStart(0, "span", 124);
|
|
485
563
|
i0.ɵɵtext(1);
|
|
486
564
|
i0.ɵɵelementEnd();
|
|
487
565
|
} if (rf & 2) {
|
|
488
|
-
const
|
|
566
|
+
const field_r22 = ctx.$implicit;
|
|
489
567
|
i0.ɵɵadvance();
|
|
490
|
-
i0.ɵɵtextInterpolate(
|
|
568
|
+
i0.ɵɵtextInterpolate(field_r22);
|
|
491
569
|
} }
|
|
492
|
-
function
|
|
493
|
-
i0.ɵɵelementStart(0, "div",
|
|
570
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
571
|
+
i0.ɵɵelementStart(0, "div", 133)(1, "span", 134);
|
|
494
572
|
i0.ɵɵtext(2);
|
|
495
573
|
i0.ɵɵelementEnd();
|
|
496
|
-
i0.ɵɵelementStart(3, "span",
|
|
574
|
+
i0.ɵɵelementStart(3, "span", 135);
|
|
497
575
|
i0.ɵɵtext(4);
|
|
498
576
|
i0.ɵɵelementEnd()();
|
|
499
577
|
} if (rf & 2) {
|
|
500
|
-
const
|
|
578
|
+
const rel_r23 = ctx.$implicit;
|
|
501
579
|
i0.ɵɵadvance(2);
|
|
502
|
-
i0.ɵɵtextInterpolate(
|
|
580
|
+
i0.ɵɵtextInterpolate(rel_r23.name);
|
|
503
581
|
i0.ɵɵadvance(2);
|
|
504
|
-
i0.ɵɵtextInterpolate(
|
|
582
|
+
i0.ɵɵtextInterpolate(rel_r23.fields.join(", "));
|
|
505
583
|
} }
|
|
506
|
-
function
|
|
507
|
-
i0.ɵɵelementStart(0, "div",
|
|
584
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
585
|
+
i0.ɵɵelementStart(0, "div", 119)(1, "h4", 120);
|
|
508
586
|
i0.ɵɵtext(2, "Related Entities");
|
|
509
587
|
i0.ɵɵelementEnd();
|
|
510
|
-
i0.ɵɵrepeaterCreate(3,
|
|
588
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_For_4_Template, 5, 2, "div", 133, _forTrack4);
|
|
511
589
|
i0.ɵɵelementEnd();
|
|
512
590
|
} if (rf & 2) {
|
|
513
591
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
514
592
|
i0.ɵɵadvance(3);
|
|
515
593
|
i0.ɵɵrepeater(ctx_r2.SuggestionResult.selectedRelationships);
|
|
516
594
|
} }
|
|
517
|
-
function
|
|
518
|
-
i0.ɵɵelementStart(0, "option",
|
|
595
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_39_Template(rf, ctx) { if (rf & 1) {
|
|
596
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
519
597
|
i0.ɵɵtext(1);
|
|
520
598
|
i0.ɵɵelementEnd();
|
|
521
599
|
} if (rf & 2) {
|
|
522
|
-
const
|
|
523
|
-
i0.ɵɵproperty("value",
|
|
600
|
+
const model_r24 = ctx.$implicit;
|
|
601
|
+
i0.ɵɵproperty("value", model_r24.ID);
|
|
524
602
|
i0.ɵɵadvance();
|
|
525
|
-
i0.ɵɵtextInterpolate(
|
|
603
|
+
i0.ɵɵtextInterpolate(model_r24.Name);
|
|
526
604
|
} }
|
|
527
|
-
function
|
|
528
|
-
i0.ɵɵelementStart(0, "option",
|
|
605
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_45_Template(rf, ctx) { if (rf & 1) {
|
|
606
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
529
607
|
i0.ɵɵtext(1);
|
|
530
608
|
i0.ɵɵelementEnd();
|
|
531
609
|
} if (rf & 2) {
|
|
532
|
-
const
|
|
533
|
-
i0.ɵɵproperty("value",
|
|
610
|
+
const db_r25 = ctx.$implicit;
|
|
611
|
+
i0.ɵɵproperty("value", db_r25.ID);
|
|
534
612
|
i0.ɵɵadvance();
|
|
535
|
-
i0.ɵɵtextInterpolate(
|
|
613
|
+
i0.ɵɵtextInterpolate(db_r25.Name);
|
|
536
614
|
} }
|
|
537
|
-
function
|
|
538
|
-
i0.ɵɵelementStart(0, "option",
|
|
615
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
616
|
+
i0.ɵɵelementStart(0, "option", 72);
|
|
539
617
|
i0.ɵɵtext(1);
|
|
540
618
|
i0.ɵɵelementEnd();
|
|
541
619
|
} if (rf & 2) {
|
|
542
|
-
const
|
|
543
|
-
i0.ɵɵproperty("value",
|
|
620
|
+
const idx_r27 = ctx.$implicit;
|
|
621
|
+
i0.ɵɵproperty("value", idx_r27.ID);
|
|
544
622
|
i0.ɵɵadvance();
|
|
545
|
-
i0.ɵɵtextInterpolate(
|
|
623
|
+
i0.ɵɵtextInterpolate(idx_r27.Name);
|
|
546
624
|
} }
|
|
547
|
-
function
|
|
548
|
-
const
|
|
549
|
-
i0.ɵɵelementStart(0, "select",
|
|
550
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
551
|
-
i0.ɵɵelementStart(1, "option",
|
|
625
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
626
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
627
|
+
i0.ɵɵelementStart(0, "select", 71);
|
|
628
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_Template_select_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r2 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorIndexID, $event) || (ctx_r2.SelectedVectorIndexID = $event); return i0.ɵɵresetView($event); });
|
|
629
|
+
i0.ɵɵelementStart(1, "option", 79);
|
|
552
630
|
i0.ɵɵtext(2, "Auto (create/find matching index)");
|
|
553
631
|
i0.ɵɵelementEnd();
|
|
554
|
-
i0.ɵɵrepeaterCreate(3,
|
|
632
|
+
i0.ɵɵrepeaterCreate(3, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_For_4_Template, 2, 2, "option", 72, _forTrack2);
|
|
555
633
|
i0.ɵɵelementEnd();
|
|
556
634
|
} if (rf & 2) {
|
|
557
635
|
const ctx_r2 = i0.ɵɵnextContext(4);
|
|
@@ -559,93 +637,93 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
559
637
|
i0.ɵɵadvance(3);
|
|
560
638
|
i0.ɵɵrepeater(ctx_r2.FilteredIndexesForSelectedDB);
|
|
561
639
|
} }
|
|
562
|
-
function
|
|
563
|
-
i0.ɵɵelementStart(0, "span",
|
|
640
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
641
|
+
i0.ɵɵelementStart(0, "span", 74);
|
|
564
642
|
i0.ɵɵtext(1, " No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync ");
|
|
565
643
|
i0.ɵɵelementEnd();
|
|
566
644
|
} }
|
|
567
|
-
function
|
|
568
|
-
i0.ɵɵelementStart(0, "div",
|
|
569
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
645
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_52_Template(rf, ctx) { if (rf & 1) {
|
|
646
|
+
i0.ɵɵelementStart(0, "div", 132);
|
|
647
|
+
i0.ɵɵelement(1, "mj-loading", 78);
|
|
570
648
|
i0.ɵɵelementEnd();
|
|
571
649
|
} }
|
|
572
|
-
function
|
|
573
|
-
const
|
|
574
|
-
i0.ɵɵelementStart(0, "button",
|
|
575
|
-
i0.ɵɵlistener("click", function
|
|
576
|
-
i0.ɵɵelement(1, "i",
|
|
650
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template(rf, ctx) { if (rf & 1) {
|
|
651
|
+
const _r28 = i0.ɵɵgetCurrentView();
|
|
652
|
+
i0.ɵɵelementStart(0, "button", 80);
|
|
653
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.SaveAsEntityDocument()); });
|
|
654
|
+
i0.ɵɵelement(1, "i", 136);
|
|
577
655
|
i0.ɵɵtext(2, " Save as Entity Document ");
|
|
578
656
|
i0.ɵɵelementEnd();
|
|
579
|
-
i0.ɵɵelementStart(3, "button",
|
|
580
|
-
i0.ɵɵlistener("click", function
|
|
581
|
-
i0.ɵɵelement(4, "i",
|
|
657
|
+
i0.ɵɵelementStart(3, "button", 137);
|
|
658
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.ClearSuggestion()); });
|
|
659
|
+
i0.ɵɵelement(4, "i", 138);
|
|
582
660
|
i0.ɵɵtext(5, " Try Again ");
|
|
583
661
|
i0.ɵɵelementEnd();
|
|
584
|
-
i0.ɵɵelementStart(6, "button",
|
|
585
|
-
i0.ɵɵlistener("click", function
|
|
662
|
+
i0.ɵɵelementStart(6, "button", 84);
|
|
663
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r28); const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
|
|
586
664
|
i0.ɵɵtext(7, " Close ");
|
|
587
665
|
i0.ɵɵelementEnd();
|
|
588
666
|
} }
|
|
589
|
-
function
|
|
590
|
-
const
|
|
591
|
-
i0.ɵɵelementStart(0, "div",
|
|
667
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
668
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
669
|
+
i0.ɵɵelementStart(0, "div", 93)(1, "div", 119)(2, "h4", 120);
|
|
592
670
|
i0.ɵɵtext(3, "Suggested Template");
|
|
593
671
|
i0.ɵɵelementEnd();
|
|
594
|
-
i0.ɵɵelementStart(4, "div",
|
|
595
|
-
i0.ɵɵlistener("change", function
|
|
672
|
+
i0.ɵɵelementStart(4, "div", 121)(5, "mj-code-editor", 122);
|
|
673
|
+
i0.ɵɵlistener("change", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_mj_code_editor_change_5_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.OnTemplateChange($event)); });
|
|
596
674
|
i0.ɵɵelementEnd()()();
|
|
597
|
-
i0.ɵɵelementStart(6, "div",
|
|
675
|
+
i0.ɵɵelementStart(6, "div", 119)(7, "h4", 120);
|
|
598
676
|
i0.ɵɵtext(8, "Selected Fields");
|
|
599
677
|
i0.ɵɵelementEnd();
|
|
600
|
-
i0.ɵɵelementStart(9, "div",
|
|
601
|
-
i0.ɵɵrepeaterCreate(10,
|
|
678
|
+
i0.ɵɵelementStart(9, "div", 123);
|
|
679
|
+
i0.ɵɵrepeaterCreate(10, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_11_Template, 2, 1, "span", 124, i0.ɵɵrepeaterTrackByIdentity);
|
|
602
680
|
i0.ɵɵelementEnd()();
|
|
603
|
-
i0.ɵɵconditionalCreate(12,
|
|
604
|
-
i0.ɵɵelementStart(13, "div",
|
|
681
|
+
i0.ɵɵconditionalCreate(12, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_12_Template, 5, 0, "div", 119);
|
|
682
|
+
i0.ɵɵelementStart(13, "div", 125)(14, "div", 126)(15, "span", 127);
|
|
605
683
|
i0.ɵɵtext(16, "Potential Match");
|
|
606
684
|
i0.ɵɵelementEnd();
|
|
607
|
-
i0.ɵɵelementStart(17, "span",
|
|
685
|
+
i0.ɵɵelementStart(17, "span", 128);
|
|
608
686
|
i0.ɵɵtext(18);
|
|
609
687
|
i0.ɵɵelementEnd()();
|
|
610
|
-
i0.ɵɵelementStart(19, "div",
|
|
688
|
+
i0.ɵɵelementStart(19, "div", 126)(20, "span", 127);
|
|
611
689
|
i0.ɵɵtext(21, "Absolute Match");
|
|
612
690
|
i0.ɵɵelementEnd();
|
|
613
|
-
i0.ɵɵelementStart(22, "span",
|
|
691
|
+
i0.ɵɵelementStart(22, "span", 128);
|
|
614
692
|
i0.ɵɵtext(23);
|
|
615
693
|
i0.ɵɵelementEnd()()();
|
|
616
|
-
i0.ɵɵelementStart(24, "div",
|
|
694
|
+
i0.ɵɵelementStart(24, "div", 119)(25, "h4", 120);
|
|
617
695
|
i0.ɵɵtext(26, "Reasoning");
|
|
618
696
|
i0.ɵɵelementEnd();
|
|
619
|
-
i0.ɵɵelementStart(27, "p",
|
|
697
|
+
i0.ɵɵelementStart(27, "p", 129);
|
|
620
698
|
i0.ɵɵtext(28);
|
|
621
699
|
i0.ɵɵelementEnd()();
|
|
622
|
-
i0.ɵɵelementStart(29, "div",
|
|
700
|
+
i0.ɵɵelementStart(29, "div", 119)(30, "div", 67)(31, "label", 68);
|
|
623
701
|
i0.ɵɵtext(32, "Document Name");
|
|
624
702
|
i0.ɵɵelementEnd();
|
|
625
|
-
i0.ɵɵelementStart(33, "input",
|
|
626
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
703
|
+
i0.ɵɵelementStart(33, "input", 70);
|
|
704
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_input_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SaveDocumentName, $event) || (ctx_r2.SaveDocumentName = $event); return i0.ɵɵresetView($event); });
|
|
627
705
|
i0.ɵɵelementEnd()();
|
|
628
|
-
i0.ɵɵelementStart(34, "div",
|
|
706
|
+
i0.ɵɵelementStart(34, "div", 130)(35, "label", 68);
|
|
629
707
|
i0.ɵɵtext(36, "Embedding Model");
|
|
630
708
|
i0.ɵɵelementEnd();
|
|
631
|
-
i0.ɵɵelementStart(37, "select",
|
|
632
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
633
|
-
i0.ɵɵrepeaterCreate(38,
|
|
709
|
+
i0.ɵɵelementStart(37, "select", 71);
|
|
710
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_select_ngModelChange_37_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedEmbeddingModelID, $event) || (ctx_r2.SelectedEmbeddingModelID = $event); return i0.ɵɵresetView($event); });
|
|
711
|
+
i0.ɵɵrepeaterCreate(38, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_39_Template, 2, 2, "option", 72, _forTrack2);
|
|
634
712
|
i0.ɵɵelementEnd()();
|
|
635
|
-
i0.ɵɵelementStart(40, "div",
|
|
713
|
+
i0.ɵɵelementStart(40, "div", 130)(41, "label", 68);
|
|
636
714
|
i0.ɵɵtext(42, "Vector Database");
|
|
637
715
|
i0.ɵɵelementEnd();
|
|
638
|
-
i0.ɵɵelementStart(43, "select",
|
|
639
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
640
|
-
i0.ɵɵrepeaterCreate(44,
|
|
716
|
+
i0.ɵɵelementStart(43, "select", 71);
|
|
717
|
+
i0.ɵɵtwoWayListener("ngModelChange", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template_select_ngModelChange_43_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r2.SelectedVectorDBID, $event) || (ctx_r2.SelectedVectorDBID = $event); return i0.ɵɵresetView($event); });
|
|
718
|
+
i0.ɵɵrepeaterCreate(44, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_For_45_Template, 2, 2, "option", 72, _forTrack2);
|
|
641
719
|
i0.ɵɵelementEnd()();
|
|
642
|
-
i0.ɵɵelementStart(46, "div",
|
|
720
|
+
i0.ɵɵelementStart(46, "div", 130)(47, "label", 68);
|
|
643
721
|
i0.ɵɵtext(48, "Vector Index");
|
|
644
722
|
i0.ɵɵelementEnd();
|
|
645
|
-
i0.ɵɵconditionalCreate(49,
|
|
723
|
+
i0.ɵɵconditionalCreate(49, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_49_Template, 5, 1, "select", 73)(50, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_50_Template, 2, 0, "span", 74);
|
|
646
724
|
i0.ɵɵelementEnd()();
|
|
647
|
-
i0.ɵɵelementStart(51, "div",
|
|
648
|
-
i0.ɵɵconditionalCreate(52,
|
|
725
|
+
i0.ɵɵelementStart(51, "div", 131);
|
|
726
|
+
i0.ɵɵconditionalCreate(52, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_52_Template, 2, 0, "div", 132)(53, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Conditional_53_Template, 8, 0);
|
|
649
727
|
i0.ɵɵelementEnd()();
|
|
650
728
|
} if (rf & 2) {
|
|
651
729
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
@@ -676,22 +754,22 @@ function VectorManagementResourceComponent_Conditional_1_Conditional_56_Conditio
|
|
|
676
754
|
i0.ɵɵadvance(3);
|
|
677
755
|
i0.ɵɵconditional(ctx_r2.IsSavingDocument ? 52 : 53);
|
|
678
756
|
} }
|
|
679
|
-
function
|
|
680
|
-
const
|
|
681
|
-
i0.ɵɵelementStart(0, "div",
|
|
682
|
-
i0.ɵɵlistener("click", function
|
|
683
|
-
i0.ɵɵelementStart(1, "div",
|
|
684
|
-
i0.ɵɵlistener("click", function
|
|
685
|
-
i0.ɵɵelementStart(2, "div",
|
|
757
|
+
function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template(rf, ctx) { if (rf & 1) {
|
|
758
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
759
|
+
i0.ɵɵelementStart(0, "div", 59);
|
|
760
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
|
|
761
|
+
i0.ɵɵelementStart(1, "div", 92);
|
|
762
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r15); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
763
|
+
i0.ɵɵelementStart(2, "div", 61)(3, "h3", 62);
|
|
686
764
|
i0.ɵɵelement(4, "i", 13);
|
|
687
765
|
i0.ɵɵtext(5, " AI Document Suggestion ");
|
|
688
766
|
i0.ɵɵelementEnd();
|
|
689
|
-
i0.ɵɵelementStart(6, "button",
|
|
690
|
-
i0.ɵɵlistener("click", function
|
|
691
|
-
i0.ɵɵelement(7, "i",
|
|
767
|
+
i0.ɵɵelementStart(6, "button", 63);
|
|
768
|
+
i0.ɵɵlistener("click", function VectorManagementResourceComponent_Conditional_1_Conditional_57_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.CloseSuggestDialog()); });
|
|
769
|
+
i0.ɵɵelement(7, "i", 64);
|
|
692
770
|
i0.ɵɵelementEnd()();
|
|
693
|
-
i0.ɵɵelementStart(8, "div",
|
|
694
|
-
i0.ɵɵconditionalCreate(9,
|
|
771
|
+
i0.ɵɵelementStart(8, "div", 65);
|
|
772
|
+
i0.ɵɵconditionalCreate(9, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_9_Template, 27, 11, "div", 66)(10, VectorManagementResourceComponent_Conditional_1_Conditional_57_Conditional_10_Template, 54, 12, "div", 93);
|
|
695
773
|
i0.ɵɵelementEnd()()();
|
|
696
774
|
} if (rf & 2) {
|
|
697
775
|
const ctx_r2 = i0.ɵɵnextContext(2);
|
|
@@ -763,7 +841,8 @@ function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if
|
|
|
763
841
|
i0.ɵɵpipe(54, "number");
|
|
764
842
|
i0.ɵɵelementEnd()()()()();
|
|
765
843
|
i0.ɵɵconditionalCreate(55, VectorManagementResourceComponent_Conditional_1_Conditional_55_Template, 47, 7, "div", 38);
|
|
766
|
-
i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_Template,
|
|
844
|
+
i0.ɵɵconditionalCreate(56, VectorManagementResourceComponent_Conditional_1_Conditional_56_Template, 34, 5, "div", 38);
|
|
845
|
+
i0.ɵɵconditionalCreate(57, VectorManagementResourceComponent_Conditional_1_Conditional_57_Template, 11, 3, "div", 38);
|
|
767
846
|
} if (rf & 2) {
|
|
768
847
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
769
848
|
i0.ɵɵadvance();
|
|
@@ -787,14 +866,17 @@ function VectorManagementResourceComponent_Conditional_1_Template(rf, ctx) { if
|
|
|
787
866
|
i0.ɵɵadvance(2);
|
|
788
867
|
i0.ɵɵtextInterpolate1("", ctx_r2.StorageLabel, " of records vectorized");
|
|
789
868
|
i0.ɵɵadvance(2);
|
|
790
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54,
|
|
869
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(54, 15, ctx_r2.TotalVectors), " vectors stored ");
|
|
791
870
|
i0.ɵɵadvance(2);
|
|
792
871
|
i0.ɵɵconditional(ctx_r2.ShowEditPanel ? 55 : -1);
|
|
793
872
|
i0.ɵɵadvance();
|
|
794
|
-
i0.ɵɵconditional(ctx_r2.
|
|
873
|
+
i0.ɵɵconditional(ctx_r2.ShowScheduleSyncDialog ? 56 : -1);
|
|
874
|
+
i0.ɵɵadvance();
|
|
875
|
+
i0.ɵɵconditional(ctx_r2.ShowSuggestDialog ? 57 : -1);
|
|
795
876
|
} }
|
|
796
877
|
let VectorManagementResourceComponent = class VectorManagementResourceComponent extends BaseResourceComponent {
|
|
797
878
|
cdr = inject(ChangeDetectorRef);
|
|
879
|
+
navigationService = inject(NavigationService);
|
|
798
880
|
destroy$ = new Subject();
|
|
799
881
|
/** View mode: 'index' = Option A (shared index as hero, entity docs as children),
|
|
800
882
|
* 'operations' = Option C (operations monitoring with real-time sync status) */
|
|
@@ -911,6 +993,119 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
911
993
|
this.cdr.detectChanges();
|
|
912
994
|
}
|
|
913
995
|
}
|
|
996
|
+
// --- Schedule Sync Dialog ---
|
|
997
|
+
ShowScheduleSyncDialog = false;
|
|
998
|
+
ScheduleSyncSaving = false;
|
|
999
|
+
ScheduleSyncDocID = '';
|
|
1000
|
+
ScheduleSyncDocName = '';
|
|
1001
|
+
ScheduleSyncCron = '0 2 * * *';
|
|
1002
|
+
ScheduleSyncEnabled = true;
|
|
1003
|
+
/** Opens the schedule sync dialog for a specific entity document */
|
|
1004
|
+
OpenScheduleSyncDialog(entityDocumentId) {
|
|
1005
|
+
const doc = this.entityDocuments.find(d => UUIDsEqual(d.ID, entityDocumentId));
|
|
1006
|
+
if (!doc)
|
|
1007
|
+
return;
|
|
1008
|
+
this.ScheduleSyncDocID = doc.ID;
|
|
1009
|
+
this.ScheduleSyncDocName = doc.Entity || doc.Name;
|
|
1010
|
+
this.ScheduleSyncCron = '0 2 * * *';
|
|
1011
|
+
this.ScheduleSyncEnabled = true;
|
|
1012
|
+
this.ShowScheduleSyncDialog = true;
|
|
1013
|
+
this.cdr.detectChanges();
|
|
1014
|
+
}
|
|
1015
|
+
/** Closes the schedule sync dialog */
|
|
1016
|
+
CloseScheduleSyncDialog() {
|
|
1017
|
+
this.ShowScheduleSyncDialog = false;
|
|
1018
|
+
this.ScheduleSyncDocID = '';
|
|
1019
|
+
this.cdr.detectChanges();
|
|
1020
|
+
}
|
|
1021
|
+
/** Returns a human-readable description of a cron expression */
|
|
1022
|
+
GetScheduleCronPreview(cron) {
|
|
1023
|
+
return CronToHumanReadable(cron);
|
|
1024
|
+
}
|
|
1025
|
+
/** Saves a new ScheduledAction for vectorizing the selected entity document */
|
|
1026
|
+
async SaveScheduleSync() {
|
|
1027
|
+
if (this.ScheduleSyncSaving || !this.ScheduleSyncDocID)
|
|
1028
|
+
return;
|
|
1029
|
+
this.ScheduleSyncSaving = true;
|
|
1030
|
+
this.cdr.detectChanges();
|
|
1031
|
+
try {
|
|
1032
|
+
const actionID = await this.findVectorizeActionID();
|
|
1033
|
+
if (!actionID) {
|
|
1034
|
+
MJNotificationService.Instance.CreateSimpleNotification('Could not find the "__VectorizeEntity" action. Please check action configuration.', 'error', 5000);
|
|
1035
|
+
return;
|
|
1036
|
+
}
|
|
1037
|
+
const md = new Metadata();
|
|
1038
|
+
// Create ScheduledAction
|
|
1039
|
+
const scheduledAction = await md.GetEntityObject('MJ: Scheduled Actions');
|
|
1040
|
+
scheduledAction.NewRecord();
|
|
1041
|
+
scheduledAction.Name = `Vectorize: ${this.ScheduleSyncDocName}`;
|
|
1042
|
+
scheduledAction.Description = `Automated vectorization for entity document "${this.ScheduleSyncDocName}"`;
|
|
1043
|
+
scheduledAction.ActionID = actionID;
|
|
1044
|
+
scheduledAction.Type = 'Custom';
|
|
1045
|
+
scheduledAction.CronExpression = this.ScheduleSyncCron;
|
|
1046
|
+
scheduledAction.CustomCronExpression = this.ScheduleSyncCron;
|
|
1047
|
+
scheduledAction.Status = this.ScheduleSyncEnabled ? 'Active' : 'Disabled';
|
|
1048
|
+
scheduledAction.Timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
1049
|
+
const saved = await scheduledAction.Save();
|
|
1050
|
+
if (!saved) {
|
|
1051
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Failed to create schedule: ${scheduledAction.LatestResult?.Message ?? 'Unknown error'}`, 'error', 5000);
|
|
1052
|
+
return;
|
|
1053
|
+
}
|
|
1054
|
+
// Create param linking the entityDocumentID
|
|
1055
|
+
await this.createVectorizeScheduleParam(scheduledAction.ID, actionID, this.ScheduleSyncDocID);
|
|
1056
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Schedule created: ${CronToHumanReadable(this.ScheduleSyncCron)}`, 'success', 3000);
|
|
1057
|
+
this.CloseScheduleSyncDialog();
|
|
1058
|
+
}
|
|
1059
|
+
catch (error) {
|
|
1060
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
1061
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);
|
|
1062
|
+
}
|
|
1063
|
+
finally {
|
|
1064
|
+
this.ScheduleSyncSaving = false;
|
|
1065
|
+
this.cdr.detectChanges();
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
/** Find the __VectorizeEntity action ID */
|
|
1069
|
+
async findVectorizeActionID() {
|
|
1070
|
+
const rv = new RunView();
|
|
1071
|
+
const result = await rv.RunView({
|
|
1072
|
+
EntityName: 'Actions',
|
|
1073
|
+
ExtraFilter: `Name = '__VectorizeEntity'`,
|
|
1074
|
+
Fields: ['ID'],
|
|
1075
|
+
ResultType: 'simple',
|
|
1076
|
+
MaxRows: 1,
|
|
1077
|
+
});
|
|
1078
|
+
if (result.Success && result.Results.length > 0) {
|
|
1079
|
+
return result.Results[0].ID;
|
|
1080
|
+
}
|
|
1081
|
+
return null;
|
|
1082
|
+
}
|
|
1083
|
+
/** Create a ScheduledActionParam linking the entity document ID */
|
|
1084
|
+
async createVectorizeScheduleParam(scheduledActionID, actionID, entityDocumentID) {
|
|
1085
|
+
const rv = new RunView();
|
|
1086
|
+
const paramResult = await rv.RunView({
|
|
1087
|
+
EntityName: 'Action Params',
|
|
1088
|
+
ExtraFilter: `ActionID = '${actionID}' AND Name = 'entityDocumentID'`,
|
|
1089
|
+
Fields: ['ID', 'Name'],
|
|
1090
|
+
ResultType: 'simple',
|
|
1091
|
+
MaxRows: 1,
|
|
1092
|
+
});
|
|
1093
|
+
if (!paramResult.Success || paramResult.Results.length === 0) {
|
|
1094
|
+
console.warn('[VectorManagement] Could not find entityDocumentID action param');
|
|
1095
|
+
return;
|
|
1096
|
+
}
|
|
1097
|
+
const md = new Metadata();
|
|
1098
|
+
const param = await md.GetEntityObject('MJ: Scheduled Action Params');
|
|
1099
|
+
param.NewRecord();
|
|
1100
|
+
param.ScheduledActionID = scheduledActionID;
|
|
1101
|
+
param.ActionParamID = paramResult.Results[0].ID;
|
|
1102
|
+
param.ValueType = 'Static';
|
|
1103
|
+
param.Value = entityDocumentID;
|
|
1104
|
+
const saved = await param.Save();
|
|
1105
|
+
if (!saved) {
|
|
1106
|
+
console.warn('[VectorManagement] Failed to save schedule param:', param.LatestResult?.Message);
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
914
1109
|
// --- Suggest Document Dialog ---
|
|
915
1110
|
ShowSuggestDialog = false;
|
|
916
1111
|
IsSuggesting = false;
|
|
@@ -969,6 +1164,10 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
969
1164
|
// ================================================================
|
|
970
1165
|
async ngAfterViewInit() {
|
|
971
1166
|
await this.LoadData();
|
|
1167
|
+
this.navigationService.SetAgentContext(this, {
|
|
1168
|
+
TotalVectors: this.TotalVectors,
|
|
1169
|
+
KPICount: this.KPICards.length,
|
|
1170
|
+
});
|
|
972
1171
|
this.NotifyLoadComplete();
|
|
973
1172
|
}
|
|
974
1173
|
ngOnDestroy() {
|
|
@@ -1075,9 +1274,11 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1075
1274
|
if (idleTimer)
|
|
1076
1275
|
clearTimeout(idleTimer);
|
|
1077
1276
|
rxSub?.unsubscribe();
|
|
1078
|
-
// Use
|
|
1079
|
-
//
|
|
1080
|
-
Promise.resolve
|
|
1277
|
+
// Use setTimeout to defer state changes to the next macrotask,
|
|
1278
|
+
// avoiding ExpressionChangedAfterItHasBeenCheckedError.
|
|
1279
|
+
// (Promise.resolve microtasks run between Angular's check passes
|
|
1280
|
+
// and still trigger NG0100.)
|
|
1281
|
+
setTimeout(async () => {
|
|
1081
1282
|
this.removeSyncingId(entityDocumentId);
|
|
1082
1283
|
if (success) {
|
|
1083
1284
|
MJNotificationService.Instance.CreateSimpleNotification(`Vectorization complete for ${entityName}`, 'success', 3000);
|
|
@@ -1086,8 +1287,8 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1086
1287
|
else {
|
|
1087
1288
|
this.updateRowStatus(entityDocumentId, 'Error');
|
|
1088
1289
|
MJNotificationService.Instance.CreateSimpleNotification(`Vectorization failed for ${entityName}`, 'error', 5000);
|
|
1089
|
-
this.cdr.detectChanges();
|
|
1090
1290
|
}
|
|
1291
|
+
this.cdr.detectChanges();
|
|
1091
1292
|
});
|
|
1092
1293
|
};
|
|
1093
1294
|
// Reset idle timer on every event. When no events arrive for 5s,
|
|
@@ -1334,11 +1535,12 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1334
1535
|
// Private helpers
|
|
1335
1536
|
// ================================================================
|
|
1336
1537
|
async fetchAllData() {
|
|
1337
|
-
// Use
|
|
1538
|
+
// Use cached engine data — BaseEngine's entity-event auto-refresh handles
|
|
1539
|
+
// updates from saves/deletes on the entities it tracks.
|
|
1338
1540
|
const engine = KnowledgeHubMetadataEngine.Instance;
|
|
1339
1541
|
await engine.Config(false);
|
|
1340
1542
|
this.entityDocuments = engine.EntityDocuments;
|
|
1341
|
-
this.vectorDatabases =
|
|
1543
|
+
this.vectorDatabases = AIEngineBase.Instance.VectorDatabases;
|
|
1342
1544
|
this.vectorIndexes = engine.VectorIndexes;
|
|
1343
1545
|
// Entity Record Documents and AI Models are not cached in the engine —
|
|
1344
1546
|
// record documents are high-volume instance data, and AI models are loaded
|
|
@@ -1744,11 +1946,11 @@ let VectorManagementResourceComponent = class VectorManagementResourceComponent
|
|
|
1744
1946
|
};
|
|
1745
1947
|
}
|
|
1746
1948
|
static ɵfac = /*@__PURE__*/ (() => { let ɵVectorManagementResourceComponent_BaseFactory; return function VectorManagementResourceComponent_Factory(__ngFactoryType__) { return (ɵVectorManagementResourceComponent_BaseFactory || (ɵVectorManagementResourceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(VectorManagementResourceComponent)))(__ngFactoryType__ || VectorManagementResourceComponent); }; })();
|
|
1747
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]], inputs: { EmbeddedMode: "EmbeddedMode" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "vector-loading"], ["text", "Loading vector management data..."], [1, "vector-dashboard"], [1, "view-mode-toggle"], [1, "kpi-row"], [3, "data"], [1, "content-area"], [1, "sync-table-panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-table-list"], [1, "panel-actions"], ["title", "Use AI to suggest an Entity Document template", 1, "suggest-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "suggest-btn-text"], ["title", "Refresh data", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "empty-state"], [1, "table-wrapper"], [1, "sidebar"], [1, "sidebar-card"], [1, "sidebar-title"], [1, "fa-solid", "fa-heart-pulse"], [1, "health-row"], [1, "health-dot"], [1, "health-label"], [1, "health-status"], [1, "fa-solid", "fa-microchip"], [1, "model-info"], [1, "info-row"], [1, "info-label"], [1, "info-value"], [1, "fa-solid", "fa-hard-drive"], [1, "gauge-container"], [1, "gauge-bar"], [1, "gauge-fill"], [1, "gauge-label"], [1, "storage-detail"], [1, "slide-panel-overlay"], [1, "view-mode-btn", 3, "click"], [1, "fa-solid", "fa-cubes"], [1, "fa-solid", "fa-gauge-high"], [1, "fa-solid", "fa-folder-open"], [1, "sync-table"], [1, "text-right"], [1, "text-center"], [1, "entity-name"], [1, "document-name"], [1, "text-right", "vector-count"], [1, "last-synced"], [1, "status-badge"], [1, "text-center", "actions-cell"], ["title", "Sync now", 1, "sync-btn", 3, "click", "disabled"], ["title", "Edit entity document", 1, "edit-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "slide-panel-overlay", 3, "click"], [1, "slide-panel", "open", 3, "click"], [1, "suggest-dialog-header"], [1, "suggest-dialog-title"], [1, "suggest-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "suggest-dialog-body"], [1, "suggest-form"], [1, "suggest-field"], [1, "suggest-label"], [1, "edit-readonly-value"], ["type", "text", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "suggest-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "suggest-select", 3, "ngModel"], [1, "edit-readonly-value", 2, "font-size", "13px", "color", "var(--mj-text-muted)"], ["value", "Active"], ["value", "Inactive"], [1, "result-actions", 2, "margin-top", "1rem"], ["text", "Saving...", "size", "small"], ["value", ""], [1, "suggest-submit-btn", 3, "click"], [1, "fa-solid", "fa-save"], [1, "edit-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "suggest-close-action", 3, "click"], [1, "slide-panel", 3, "click"], [1, "suggest-result"], [1, "entity-picker"], [1, "entity-picker-trigger", 3, "click"], [1, "fa-solid", "fa-chevron-down", "entity-picker-arrow"], [1, "entity-picker-dropdown"], [1, "use-case-options"], [1, "use-case-btn", 3, "click"], [1, "fa-solid", "fa-clone"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-tags"], [1, "suggest-submit-btn", 3, "click", "disabled"], [1, "suggestion-error"], [1, "fa-solid", "fa-table"], [1, "entity-picker-value"], [1, "fa-solid", "fa-search"], [1, "entity-picker-placeholder"], [1, "entity-picker-search"], ["type", "text", "placeholder", "Filter entities...", "autofocus", "", 1, "entity-picker-search-input", 3, "ngModelChange", "input", "ngModel"], [1, "entity-picker-list"], [1, "entity-picker-group"], [1, "entity-picker-empty"], [1, "entity-picker-group-header"], [1, "fa-solid", "fa-database"], [1, "entity-picker-item", 3, "entity-picker-item-selected"], [1, "entity-picker-item", 3, "click"], [1, "fa-solid", "fa-circle-exclamation"], [1, "result-section"], [1, "result-heading"], [1, "template-editor-wrapper"], ["language", "markdown", 3, "change", "value", "readonly", "lineWrapping"], [1, "result-tags"], [1, "result-tag"], [1, "result-section", "result-thresholds"], [1, "threshold-item"], [1, "threshold-label"], [1, "threshold-value"], [1, "result-reasoning"], [1, "suggest-field", 2, "margin-top", "0.75rem"], [1, "result-actions"], [1, "save-spinner"], [1, "result-relationship"], [1, "rel-name"], [1, "rel-fields"], [1, "fa-solid", "fa-floppy-disk"], [1, "suggest-submit-btn", "suggest-try-again-btn", 3, "click"], [1, "fa-solid", "fa-rotate"]], template: function VectorManagementResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1748
|
-
i0.ɵɵconditionalCreate(0, VectorManagementResourceComponent_Conditional_0_Template, 2, 0, "div", 0)(1, VectorManagementResourceComponent_Conditional_1_Template,
|
|
1949
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VectorManagementResourceComponent, selectors: [["app-vector-management-resource"]], inputs: { EmbeddedMode: "EmbeddedMode" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "vector-loading"], ["text", "Loading vector management data..."], [1, "vector-dashboard"], [1, "view-mode-toggle"], [1, "kpi-row"], [3, "data"], [1, "content-area"], [1, "sync-table-panel"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-table-list"], [1, "panel-actions"], ["title", "Use AI to suggest an Entity Document template", 1, "suggest-btn", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles"], [1, "suggest-btn-text"], ["title", "Refresh data", 1, "refresh-btn", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "empty-state"], [1, "table-wrapper"], [1, "sidebar"], [1, "sidebar-card"], [1, "sidebar-title"], [1, "fa-solid", "fa-heart-pulse"], [1, "health-row"], [1, "health-dot"], [1, "health-label"], [1, "health-status"], [1, "fa-solid", "fa-microchip"], [1, "model-info"], [1, "info-row"], [1, "info-label"], [1, "info-value"], [1, "fa-solid", "fa-hard-drive"], [1, "gauge-container"], [1, "gauge-bar"], [1, "gauge-fill"], [1, "gauge-label"], [1, "storage-detail"], [1, "slide-panel-overlay"], [1, "view-mode-btn", 3, "click"], [1, "fa-solid", "fa-cubes"], [1, "fa-solid", "fa-gauge-high"], [1, "fa-solid", "fa-folder-open"], [1, "sync-table"], [1, "text-right"], [1, "text-center"], [1, "entity-name"], [1, "document-name"], [1, "text-right", "vector-count"], [1, "last-synced"], [1, "status-badge"], [1, "text-center", "actions-cell"], ["title", "Sync now", 1, "sync-btn", 3, "click", "disabled"], ["title", "Schedule recurring sync", 1, "schedule-btn", 3, "click"], [1, "fa-regular", "fa-clock"], ["title", "Edit entity document", 1, "edit-btn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-play"], [1, "slide-panel-overlay", 3, "click"], [1, "slide-panel", "open", 3, "click"], [1, "suggest-dialog-header"], [1, "suggest-dialog-title"], [1, "suggest-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "suggest-dialog-body"], [1, "suggest-form"], [1, "suggest-field"], [1, "suggest-label"], [1, "edit-readonly-value"], ["type", "text", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "suggest-select", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "suggest-select", 3, "ngModel"], [1, "edit-readonly-value", 2, "font-size", "13px", "color", "var(--mj-text-muted)"], ["value", "Active"], ["value", "Inactive"], [1, "result-actions", 2, "margin-top", "1rem"], ["text", "Saving...", "size", "small"], ["value", ""], [1, "suggest-submit-btn", 3, "click"], [1, "fa-solid", "fa-save"], [1, "edit-delete-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "suggest-close-action", 3, "click"], [1, "schedule-dialog", 3, "click"], ["type", "text", "placeholder", "0 2 * * *", 1, "suggest-input", 3, "ngModelChange", "ngModel"], [1, "schedule-cron-preview"], [1, "fa-solid", "fa-info-circle"], [1, "suggest-field", "schedule-toggle-row"], ["type", "checkbox", 1, "mj-checkbox", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-check"], [1, "slide-panel", 3, "click"], [1, "suggest-result"], [1, "entity-picker"], [1, "entity-picker-trigger", 3, "click"], [1, "fa-solid", "fa-chevron-down", "entity-picker-arrow"], [1, "entity-picker-dropdown"], [1, "use-case-options"], [1, "use-case-btn", 3, "click"], [1, "fa-solid", "fa-clone"], [1, "fa-solid", "fa-magnifying-glass"], [1, "fa-solid", "fa-tags"], [1, "suggest-submit-btn", 3, "click", "disabled"], [1, "suggestion-error"], [1, "fa-solid", "fa-table"], [1, "entity-picker-value"], [1, "fa-solid", "fa-search"], [1, "entity-picker-placeholder"], [1, "entity-picker-search"], ["type", "text", "placeholder", "Filter entities...", "autofocus", "", 1, "entity-picker-search-input", 3, "ngModelChange", "input", "ngModel"], [1, "entity-picker-list"], [1, "entity-picker-group"], [1, "entity-picker-empty"], [1, "entity-picker-group-header"], [1, "fa-solid", "fa-database"], [1, "entity-picker-item", 3, "entity-picker-item-selected"], [1, "entity-picker-item", 3, "click"], [1, "fa-solid", "fa-circle-exclamation"], [1, "result-section"], [1, "result-heading"], [1, "template-editor-wrapper"], ["language", "markdown", 3, "change", "value", "readonly", "lineWrapping"], [1, "result-tags"], [1, "result-tag"], [1, "result-section", "result-thresholds"], [1, "threshold-item"], [1, "threshold-label"], [1, "threshold-value"], [1, "result-reasoning"], [1, "suggest-field", 2, "margin-top", "0.75rem"], [1, "result-actions"], [1, "save-spinner"], [1, "result-relationship"], [1, "rel-name"], [1, "rel-fields"], [1, "fa-solid", "fa-floppy-disk"], [1, "suggest-submit-btn", "suggest-try-again-btn", 3, "click"], [1, "fa-solid", "fa-rotate"]], template: function VectorManagementResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1950
|
+
i0.ɵɵconditionalCreate(0, VectorManagementResourceComponent_Conditional_0_Template, 2, 0, "div", 0)(1, VectorManagementResourceComponent_Conditional_1_Template, 58, 17);
|
|
1749
1951
|
} if (rf & 2) {
|
|
1750
1952
|
i0.ɵɵconditional(ctx.IsLoading ? 0 : 1);
|
|
1751
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CodeEditorComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n.vector-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.vector-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n\n\n.kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.sync-table-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.sync-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.entity-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.document-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.vector-count[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n\n\n\n.actions-cell[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.edit-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.edit-delete-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n\n\n.sync-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n\n\n.health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.gauge-container[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.gauge-bar[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n.suggest-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.slide-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.suggest-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.suggest-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n.use-case-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n.entity-picker[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty[_ngcontent-%COMP%] {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n\n\n\n.template-editor-wrapper[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper[_ngcontent-%COMP%] .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.suggest-result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.result-heading[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.suggest-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.suggest-try-again-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n.save-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .panel-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .suggest-btn[_ngcontent-%COMP%] .suggest-btn-text[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
|
|
1953
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.CodeEditorComponent, i3.LoadingComponent, i4.KPICardComponent, i5.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n.vector-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n\n\n.view-mode-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n.vector-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n\n\n.kpi-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n.sync-table-panel[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n}\n\n\n\n.table-wrapper[_ngcontent-%COMP%] {\n overflow-x: auto;\n}\n\n.sync-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.text-right[_ngcontent-%COMP%] {\n text-align: right;\n}\n\n.text-center[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.entity-name[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.document-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n.vector-count[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n\n\n\n.actions-cell[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.schedule-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.schedule-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.edit-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n\n\n.schedule-dialog[_ngcontent-%COMP%] {\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.schedule-cron-preview[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 0 0;\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n}\n\n.schedule-toggle-row[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n\n\n.sync-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n\n\n.health-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot[_ngcontent-%COMP%] {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded[_ngcontent-%COMP%] {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n\n.gauge-container[_ngcontent-%COMP%] {\n margin-bottom: 8px;\n}\n\n.gauge-bar[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill[_ngcontent-%COMP%] {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n.suggest-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n\n\n.slide-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n.suggest-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n\n\n.suggest-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n.use-case-options[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n\n.entity-picker[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty[_ngcontent-%COMP%] {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n\n\n\n.template-editor-wrapper[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper[_ngcontent-%COMP%] .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n\n\n.suggest-result[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.result-heading[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds[_ngcontent-%COMP%] {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.suggest-input[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n.suggest-try-again-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n\n\n.save-spinner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n\n\n\n\n\n@media (max-width: 768px) {\n .panel-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel[_ngcontent-%COMP%] {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard[_ngcontent-%COMP%] {\n padding: 12px;\n }\n\n .suggest-btn[_ngcontent-%COMP%] .suggest-btn-text[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
|
|
1752
1954
|
};
|
|
1753
1955
|
VectorManagementResourceComponent = __decorate([
|
|
1754
1956
|
RegisterClass(BaseResourceComponent, 'VectorManagementResource')
|
|
@@ -1756,11 +1958,11 @@ VectorManagementResourceComponent = __decorate([
|
|
|
1756
1958
|
export { VectorManagementResourceComponent };
|
|
1757
1959
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VectorManagementResourceComponent, [{
|
|
1758
1960
|
type: Component,
|
|
1759
|
-
args: [{ standalone: false, selector: 'app-vector-management-resource', template: "@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database \u2014 one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n autofocus />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if (SuggestionResult.selectedRelationships.length > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n", styles: ["/* ================================================================\n Vector Management Dashboard\n All colors use MJ design tokens from _tokens.scss\n ================================================================ */\n\n/* --- Loading state --- */\n.vector-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n/* --- View Mode Toggle --- */\n.view-mode-toggle {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* --- Dashboard container --- */\n.vector-dashboard {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* --- KPI cards row --- */\n.kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Main content: table + sidebar --- */\n.content-area {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Sync table panel --- */\n.sync-table-panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Empty state --- */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* --- Table --- */\n.table-wrapper {\n overflow-x: auto;\n}\n\n.sync-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table th {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.text-right {\n text-align: right;\n}\n\n.text-center {\n text-align: center;\n}\n\n.entity-name {\n font-weight: 600;\n}\n\n.document-name {\n color: var(--mj-text-secondary);\n}\n\n.vector-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n/* --- Action buttons in table --- */\n\n.actions-cell {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.edit-delete-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n/* --- Status badges --- */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n/* --- Sync button --- */\n.sync-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ================================================================\n Sidebar\n ================================================================ */\n.sidebar {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title i {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n/* --- Vector DB Health --- */\n.health-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n/* --- Model Info --- */\n.model-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* --- Storage / Coverage Gauge --- */\n.gauge-container {\n margin-bottom: 8px;\n}\n\n.gauge-bar {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* --- Panel actions row --- */\n.panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* --- Suggest Document Button --- */\n.suggest-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* --- Slide-in Panel Overlay --- */\n.slide-panel-overlay {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open {\n transform: translateX(0);\n}\n\n.suggest-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title i {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body {\n padding: 24px;\n}\n\n/* --- Suggest Form --- */\n.suggest-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ---- Use Case Button Group ---- */\n\n.use-case-options {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn i {\n font-size: 12px;\n}\n\n/* ---- Entity Picker (grouped by schema) ---- */\n\n.entity-picker {\n position: relative;\n}\n\n.entity-picker-trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search i {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header i {\n font-size: 10px;\n}\n\n.entity-picker-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected i {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---- Template Editor ---- */\n\n.template-editor-wrapper {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper ::ng-deep .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error i {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- Suggestion Result --- */\n.suggest-result {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section:last-child {\n border-bottom: none;\n}\n\n.result-heading {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* --- Suggest Input --- */\n.suggest-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* --- Try Again Button (secondary style) --- */\n.suggest-try-again-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* --- Save Spinner --- */\n.save-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n/* ================================================================\n Responsive \u2014 Vector Management\n ================================================================ */\n\n@media (max-width: 768px) {\n .panel-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard {\n padding: 12px;\n }\n\n .suggest-btn .suggest-btn-text {\n display: none;\n }\n}\n"] }]
|
|
1961
|
+
args: [{ standalone: false, selector: 'app-vector-management-resource', template: "@if (IsLoading) {\n <div class=\"vector-loading\">\n <mj-loading text=\"Loading vector management data...\"></mj-loading>\n </div>\n} @else {\n <div class=\"vector-dashboard\">\n <!-- View Mode Toggle -->\n @if (!EmbeddedMode) {\n <div class=\"view-mode-toggle\">\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'index'\" (click)=\"ViewMode = 'index'\">\n <i class=\"fa-solid fa-cubes\"></i> Index View\n </button>\n <button class=\"view-mode-btn\" [class.view-mode-btn-active]=\"ViewMode === 'operations'\" (click)=\"ViewMode = 'operations'\">\n <i class=\"fa-solid fa-gauge-high\"></i> Operations\n </button>\n </div>\n }\n\n <!-- KPI Cards Row -->\n <div class=\"kpi-row\">\n @for (card of KPICards; track card.title) {\n <app-kpi-card [data]=\"card\"></app-kpi-card>\n }\n </div>\n\n <!-- Main Content Area: Table + Sidebar -->\n <div class=\"content-area\">\n <!-- Entity Sync Table -->\n <div class=\"sync-table-panel\">\n <div class=\"panel-header\">\n <h3 class=\"panel-title\">\n <i class=\"fa-solid fa-table-list\"></i>\n Entity Sync Status\n </h3>\n <div class=\"panel-actions\">\n <button class=\"suggest-btn\" (click)=\"OpenSuggestDialog()\" title=\"Use AI to suggest an Entity Document template\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <span class=\"suggest-btn-text\">Suggest Document</span>\n </button>\n <button class=\"refresh-btn\" (click)=\"LoadData()\" title=\"Refresh data\">\n <i class=\"fa-solid fa-arrows-rotate\"></i>\n Refresh\n </button>\n </div>\n </div>\n\n @if (SyncRows.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No entity documents configured for vectorization.</p>\n </div>\n } @else {\n <div class=\"table-wrapper\">\n <table class=\"sync-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Document</th>\n <th class=\"text-right\">Vectors</th>\n <th>Last Synced</th>\n <th>Status</th>\n <th class=\"text-center\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of SyncRows; track row.EntityDocumentID) {\n <tr>\n <td class=\"entity-name\">{{ row.EntityName }}</td>\n <td class=\"document-name\">{{ row.DocumentName }}</td>\n <td class=\"text-right vector-count\">{{ row.VectorCount | number }}</td>\n <td class=\"last-synced\">{{ FormatDate(row.LastSynced) }}</td>\n <td>\n <span class=\"status-badge\" [class]=\"GetStatusClass(row.Status)\">\n <i [class]=\"GetStatusIcon(row.Status)\"></i>\n @if (row.Status === 'Syncing' && row.PercentComplete > 0) {\n {{ row.PercentComplete }}%\n } @else {\n {{ row.Status }}\n }\n </span>\n </td>\n <td class=\"text-center actions-cell\">\n <button\n class=\"sync-btn\"\n [disabled]=\"SyncingIds.has(row.EntityDocumentID)\"\n (click)=\"SyncEntity(row.EntityDocumentID)\"\n title=\"Sync now\">\n @if (SyncingIds.has(row.EntityDocumentID)) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n {{ row.PercentComplete > 0 ? row.PercentComplete + '%' : 'Sync' }}\n } @else {\n <i class=\"fa-solid fa-play\"></i>\n Sync\n }\n </button>\n <button\n class=\"schedule-btn\"\n (click)=\"OpenScheduleSyncDialog(row.EntityDocumentID)\"\n title=\"Schedule recurring sync\">\n <i class=\"fa-regular fa-clock\"></i>\n </button>\n <button\n class=\"edit-btn\"\n (click)=\"OpenEditPanel(row.EntityDocumentID)\"\n title=\"Edit entity document\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- Sidebar Panels -->\n <div class=\"sidebar\">\n <!-- Vector DB Health -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-heart-pulse\"></i>\n Vector DB Health\n </h4>\n <div class=\"health-row\">\n <span class=\"health-dot\" [class]=\"DBHealthClass\"></span>\n <span class=\"health-label\">{{ VectorDBName }}</span>\n </div>\n <div class=\"health-status\">{{ VectorDBStatus }}</div>\n </div>\n\n <!-- Embedding Model Info -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n Embedding Model\n </h4>\n <div class=\"model-info\">\n <div class=\"info-row\">\n <span class=\"info-label\">Model</span>\n <span class=\"info-value\">{{ EmbeddingModel.Name }}</span>\n </div>\n @if (EmbeddingModel.Dimensions != null) {\n <div class=\"info-row\">\n <span class=\"info-label\">Dimensions</span>\n <span class=\"info-value\">{{ EmbeddingModel.Dimensions | number }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Storage Usage -->\n <div class=\"sidebar-card\">\n <h4 class=\"sidebar-title\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n Vectorization Coverage\n </h4>\n <div class=\"gauge-container\">\n <div class=\"gauge-bar\">\n <div class=\"gauge-fill\" [style.width.%]=\"StorageUsagePercent\"></div>\n </div>\n <div class=\"gauge-label\">{{ StorageLabel }} of records vectorized</div>\n </div>\n <div class=\"storage-detail\">\n {{ TotalVectors | number }} vectors stored\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Edit Entity Document Slide-in Panel -->\n @if (ShowEditPanel) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseEditPanel()\">\n <div class=\"slide-panel open\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-pen\"></i>\n Edit Entity Document\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseEditPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <span class=\"edit-readonly-value\">{{ EditDocEntityName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"EditDocName\" />\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocAIModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (EditFilteredIndexes.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of EditFilteredIndexes; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes for this database \u2014 one will be created automatically on sync\n </span>\n }\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Status</label>\n <select class=\"suggest-select\" [(ngModel)]=\"EditDocStatus\">\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (IsEditSaving || IsEditDeleting) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveEditedDocument()\">\n <i class=\"fa-solid fa-save\"></i> Save Changes\n </button>\n <button class=\"edit-delete-btn\" (click)=\"DeleteEntityDocument()\">\n <i class=\"fa-solid fa-trash-can\"></i> Delete\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseEditPanel()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Schedule Sync Dialog -->\n @if (ShowScheduleSyncDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseScheduleSyncDialog()\">\n <div class=\"schedule-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-regular fa-clock\"></i>\n Schedule Vector Sync\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseScheduleSyncDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity Document</label>\n <span class=\"edit-readonly-value\">{{ ScheduleSyncDocName }}</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Action</label>\n <span class=\"edit-readonly-value\">__VectorizeEntity</span>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Cron Expression</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"ScheduleSyncCron\" placeholder=\"0 2 * * *\" />\n <div class=\"schedule-cron-preview\">\n <i class=\"fa-solid fa-info-circle\"></i>\n {{ GetScheduleCronPreview(ScheduleSyncCron) }}\n </div>\n </div>\n <div class=\"suggest-field schedule-toggle-row\">\n <label class=\"suggest-label\">Enabled</label>\n <input type=\"checkbox\" class=\"mj-checkbox\" [(ngModel)]=\"ScheduleSyncEnabled\" />\n </div>\n <div class=\"result-actions\" style=\"margin-top: 1rem\">\n @if (ScheduleSyncSaving) {\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveScheduleSync()\">\n <i class=\"fa-solid fa-check\"></i> Create Schedule\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseScheduleSyncDialog()\">\n Cancel\n </button>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Suggest Document Slide-in Panel -->\n @if (ShowSuggestDialog) {\n <div class=\"slide-panel-overlay\" (click)=\"CloseSuggestDialog()\">\n <div class=\"slide-panel\" [class.open]=\"ShowSuggestDialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"suggest-dialog-header\">\n <h3 class=\"suggest-dialog-title\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n AI Document Suggestion\n </h3>\n <button class=\"suggest-close-btn\" (click)=\"CloseSuggestDialog()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"suggest-dialog-body\">\n @if (!SuggestionResult) {\n <div class=\"suggest-form\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Entity</label>\n <div class=\"entity-picker\">\n <button class=\"entity-picker-trigger\" (click)=\"ToggleEntityPicker()\">\n @if (SuggestEntityName) {\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"entity-picker-value\">{{ SuggestEntityName }}</span>\n } @else {\n <i class=\"fa-solid fa-search\"></i>\n <span class=\"entity-picker-placeholder\">Search and select an entity...</span>\n }\n <i class=\"fa-solid fa-chevron-down entity-picker-arrow\"></i>\n </button>\n @if (ShowEntityPicker) {\n <div class=\"entity-picker-dropdown\">\n <div class=\"entity-picker-search\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n class=\"entity-picker-search-input\"\n placeholder=\"Filter entities...\"\n [(ngModel)]=\"EntitySearchText\"\n (input)=\"FilterEntities()\"\n autofocus />\n </div>\n <div class=\"entity-picker-list\">\n @for (group of FilteredEntityGroups; track group.SchemaName) {\n <div class=\"entity-picker-group\">\n <div class=\"entity-picker-group-header\">\n <i class=\"fa-solid fa-database\"></i>\n {{ group.SchemaName }}\n </div>\n @for (entity of group.Entities; track entity.ID) {\n <button class=\"entity-picker-item\"\n [class.entity-picker-item-selected]=\"entity.Name === SuggestEntityName\"\n (click)=\"SelectEntity(entity.Name)\">\n <i class=\"fa-solid fa-table\"></i>\n {{ entity.Name }}\n </button>\n }\n </div>\n }\n @if (FilteredEntityGroups.length === 0) {\n <div class=\"entity-picker-empty\">\n No entities matching \"{{ EntitySearchText }}\"\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Use Case</label>\n <div class=\"use-case-options\">\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'duplicate detection'\"\n (click)=\"SuggestUseCase = 'duplicate detection'\">\n <i class=\"fa-solid fa-clone\"></i>\n Duplicate Detection\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'search'\"\n (click)=\"SuggestUseCase = 'search'\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n Search\n </button>\n <button class=\"use-case-btn\"\n [class.use-case-btn-active]=\"SuggestUseCase === 'classification'\"\n (click)=\"SuggestUseCase = 'classification'\">\n <i class=\"fa-solid fa-tags\"></i>\n Classification\n </button>\n </div>\n </div>\n <button class=\"suggest-submit-btn\"\n [disabled]=\"IsSuggesting || !SuggestEntityName\"\n (click)=\"RunSuggestion()\">\n @if (IsSuggesting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Generating with AI...\n } @else {\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i> Generate Template\n }\n </button>\n @if (SuggestionError) {\n <div class=\"suggestion-error\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n {{ SuggestionError }}\n </div>\n }\n </div>\n } @else {\n <div class=\"suggest-result\">\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Suggested Template</h4>\n <div class=\"template-editor-wrapper\">\n <mj-code-editor\n [value]=\"EditableTemplate\"\n language=\"markdown\"\n [readonly]=\"false\"\n [lineWrapping]=\"true\"\n (change)=\"OnTemplateChange($event)\">\n </mj-code-editor>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Selected Fields</h4>\n <div class=\"result-tags\">\n @for (field of SuggestionResult.selectedFields; track field) {\n <span class=\"result-tag\">{{ field }}</span>\n }\n </div>\n </div>\n @if (SuggestionResult.selectedRelationships.length > 0) {\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Related Entities</h4>\n @for (rel of SuggestionResult.selectedRelationships; track rel.name) {\n <div class=\"result-relationship\">\n <span class=\"rel-name\">{{ rel.name }}</span>\n <span class=\"rel-fields\">{{ rel.fields.join(', ') }}</span>\n </div>\n }\n </div>\n }\n <div class=\"result-section result-thresholds\">\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Potential Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.potentialMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n <div class=\"threshold-item\">\n <span class=\"threshold-label\">Absolute Match</span>\n <span class=\"threshold-value\">{{ (SuggestionResult.absoluteMatchThreshold * 100).toFixed(0) }}%</span>\n </div>\n </div>\n <div class=\"result-section\">\n <h4 class=\"result-heading\">Reasoning</h4>\n <p class=\"result-reasoning\">{{ SuggestionResult.reasoning }}</p>\n </div>\n <div class=\"result-section\">\n <div class=\"suggest-field\">\n <label class=\"suggest-label\">Document Name</label>\n <input class=\"suggest-input\" type=\"text\" [(ngModel)]=\"SaveDocumentName\" />\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Embedding Model</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedEmbeddingModelID\">\n @for (model of AvailableEmbeddingModels; track model.ID) {\n <option [value]=\"model.ID\">{{ model.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Database</label>\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorDBID\">\n @for (db of vectorDatabases; track db.ID) {\n <option [value]=\"db.ID\">{{ db.Name }}</option>\n }\n </select>\n </div>\n <div class=\"suggest-field\" style=\"margin-top: 0.75rem\">\n <label class=\"suggest-label\">Vector Index</label>\n @if (FilteredIndexesForSelectedDB.length > 0) {\n <select class=\"suggest-select\" [(ngModel)]=\"SelectedVectorIndexID\">\n <option value=\"\">Auto (create/find matching index)</option>\n @for (idx of FilteredIndexesForSelectedDB; track idx.ID) {\n <option [value]=\"idx.ID\">{{ idx.Name }}</option>\n }\n </select>\n } @else {\n <span class=\"edit-readonly-value\" style=\"font-size: 13px; color: var(--mj-text-muted);\">\n No indexes yet \u2014 create one in Configuration > Vector Database, or one will be created on sync\n </span>\n }\n </div>\n </div>\n <div class=\"result-actions\">\n @if (IsSavingDocument) {\n <div class=\"save-spinner\">\n <mj-loading text=\"Saving...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <button class=\"suggest-submit-btn\" (click)=\"SaveAsEntityDocument()\">\n <i class=\"fa-solid fa-floppy-disk\"></i> Save as Entity Document\n </button>\n <button class=\"suggest-submit-btn suggest-try-again-btn\" (click)=\"ClearSuggestion()\">\n <i class=\"fa-solid fa-rotate\"></i> Try Again\n </button>\n <button class=\"suggest-close-action\" (click)=\"CloseSuggestDialog()\">\n Close\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n }\n}\n", styles: ["/* ================================================================\n Vector Management Dashboard\n All colors use MJ design tokens from _tokens.scss\n ================================================================ */\n\n/* --- Loading state --- */\n.vector-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 400px;\n}\n\n/* --- View Mode Toggle --- */\n.view-mode-toggle {\n display: flex;\n gap: 0.25rem;\n padding: 0 24px 0;\n margin-bottom: -12px;\n}\n\n.view-mode-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n padding: 0.4rem 0.85rem;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.view-mode-btn:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-hover);\n}\n\n.view-mode-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* --- Dashboard container --- */\n.vector-dashboard {\n display: flex;\n flex-direction: column;\n gap: 24px;\n padding: 24px;\n background: var(--mj-bg-page);\n min-height: 100%;\n}\n\n/* --- KPI cards row --- */\n.kpi-row {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n}\n\n@media (max-width: 1200px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n@media (max-width: 600px) {\n .kpi-row {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Main content: table + sidebar --- */\n.content-area {\n display: grid;\n grid-template-columns: 1fr 300px;\n gap: 24px;\n align-items: start;\n}\n\n@media (max-width: 1024px) {\n .content-area {\n grid-template-columns: 1fr;\n }\n}\n\n/* --- Sync table panel --- */\n.sync-table-panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n}\n\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.panel-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.refresh-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.refresh-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Empty state --- */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 24px;\n color: var(--mj-text-muted);\n}\n\n.empty-state i {\n font-size: 36px;\n margin-bottom: 12px;\n opacity: 0.5;\n}\n\n.empty-state p {\n margin: 0;\n font-size: 14px;\n}\n\n/* --- Table --- */\n.table-wrapper {\n overflow-x: auto;\n}\n\n.sync-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.sync-table th {\n padding: 10px 16px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n text-align: left;\n white-space: nowrap;\n}\n\n.sync-table td {\n padding: 12px 16px;\n font-size: 13px;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n}\n\n.sync-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.sync-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.text-right {\n text-align: right;\n}\n\n.text-center {\n text-align: center;\n}\n\n.entity-name {\n font-weight: 600;\n}\n\n.document-name {\n color: var(--mj-text-secondary);\n}\n\n.vector-count {\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n}\n\n.last-synced {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n/* --- Action buttons in table --- */\n\n.actions-cell {\n display: flex;\n gap: 6px;\n align-items: center;\n justify-content: center;\n}\n\n.schedule-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.schedule-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.edit-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n/* --- Schedule Dialog --- */\n.schedule-dialog {\n width: 440px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n}\n\n.schedule-cron-preview {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 0 0;\n font-size: 0.82rem;\n color: var(--mj-text-muted);\n}\n\n.schedule-toggle-row {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n}\n\n.edit-delete-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-status-error-border);\n border-radius: 6px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error-text);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.edit-delete-btn:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, var(--mj-bg-surface));\n}\n\n.edit-readonly-value {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n padding: 8px 0;\n}\n\n/* --- Status badges --- */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n}\n\n.status-synced {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n\n.status-syncing {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n color: var(--mj-status-error-text, var(--mj-status-error));\n}\n\n.status-pending {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n/* --- Sync button --- */\n.sync-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.sync-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.sync-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ================================================================\n Sidebar\n ================================================================ */\n.sidebar {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.sidebar-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n padding: 16px 20px;\n}\n\n.sidebar-title {\n margin: 0 0 14px 0;\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.sidebar-title i {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n/* --- Vector DB Health --- */\n.health-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.health-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.health-healthy {\n background: var(--mj-status-success);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-success) 50%, transparent);\n}\n\n.health-degraded {\n background: var(--mj-status-warning);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-warning) 50%, transparent);\n}\n\n.health-offline {\n background: var(--mj-status-error);\n box-shadow: 0 0 6px color-mix(in srgb, var(--mj-status-error) 50%, transparent);\n}\n\n.health-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.health-status {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding-left: 18px;\n}\n\n/* --- Model Info --- */\n.model-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n\n.info-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* --- Storage / Coverage Gauge --- */\n.gauge-container {\n margin-bottom: 8px;\n}\n\n.gauge-bar {\n height: 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n margin-bottom: 6px;\n}\n\n.gauge-fill {\n height: 100%;\n border-radius: 4px;\n background: var(--mj-brand-primary);\n transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 2px;\n}\n\n.gauge-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.storage-detail {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* --- Panel actions row --- */\n.panel-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* --- Suggest Document Button --- */\n.suggest-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.suggest-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n}\n\n/* --- Slide-in Panel Overlay --- */\n.slide-panel-overlay {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n}\n\n.slide-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n width: 480px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 24px color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow-y: auto;\n}\n\n.slide-panel.open {\n transform: translateX(0);\n}\n\n.suggest-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.suggest-dialog-title {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.suggest-dialog-title i {\n color: var(--mj-brand-primary);\n}\n\n.suggest-close-btn {\n border: none;\n background: none;\n color: var(--mj-text-muted);\n font-size: 16px;\n cursor: pointer;\n padding: 4px;\n}\n\n.suggest-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n.suggest-dialog-body {\n padding: 24px;\n}\n\n/* --- Suggest Form --- */\n.suggest-form {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.suggest-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.suggest-label {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n}\n\n.suggest-select {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n}\n\n.suggest-select:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ---- Use Case Button Group ---- */\n\n.use-case-options {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n.use-case-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.use-case-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.use-case-btn-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.use-case-btn i {\n font-size: 12px;\n}\n\n/* ---- Entity Picker (grouped by schema) ---- */\n\n.entity-picker {\n position: relative;\n}\n\n.entity-picker-trigger {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: border-color 0.15s;\n}\n\n.entity-picker-trigger:hover {\n border-color: var(--mj-border-strong);\n}\n\n.entity-picker-placeholder {\n color: var(--mj-text-muted);\n flex: 1;\n}\n\n.entity-picker-value {\n flex: 1;\n font-weight: 500;\n}\n\n.entity-picker-arrow {\n font-size: 10px;\n color: var(--mj-text-muted);\n transition: transform 0.2s;\n}\n\n.entity-picker-dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n box-shadow: 0 8px 32px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n z-index: 100;\n max-height: 350px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.entity-picker-search {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.entity-picker-search i {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.entity-picker-search-input {\n flex: 1;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n outline: none;\n}\n\n.entity-picker-search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.entity-picker-list {\n overflow-y: auto;\n max-height: 300px;\n padding: 4px 0;\n}\n\n.entity-picker-group-header {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px 4px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n position: sticky;\n top: 0;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n}\n\n.entity-picker-group-header i {\n font-size: 10px;\n}\n\n.entity-picker-item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 7px 14px 7px 28px;\n border: none;\n background: transparent;\n color: var(--mj-text-primary);\n font-size: 13px;\n cursor: pointer;\n text-align: left;\n transition: background 0.1s;\n}\n\n.entity-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.entity-picker-item-selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.entity-picker-item i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.entity-picker-item-selected i {\n color: var(--mj-brand-primary);\n}\n\n.entity-picker-empty {\n padding: 20px 14px;\n text-align: center;\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n/* ---- Template Editor ---- */\n\n.template-editor-wrapper {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n min-height: 120px;\n max-height: 300px;\n}\n\n.template-editor-wrapper ::ng-deep .cm-editor {\n min-height: 120px;\n max-height: 300px;\n font-size: 13px;\n}\n\n.suggest-submit-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 10px 20px;\n border: none;\n border-radius: 6px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.suggest-submit-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n.suggestion-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n line-height: 1.4;\n}\n\n.suggestion-error i {\n flex-shrink: 0;\n}\n\n.suggest-submit-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* --- Suggestion Result --- */\n.suggest-result {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.result-section {\n border-bottom: 1px solid var(--mj-border-subtle);\n padding-bottom: 12px;\n}\n\n.result-section:last-child {\n border-bottom: none;\n}\n\n.result-heading {\n margin: 0 0 8px 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.result-template {\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 12px;\n font-size: 12px;\n color: var(--mj-text-primary);\n white-space: pre-wrap;\n word-break: break-all;\n margin: 0;\n}\n\n.result-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.result-tag {\n padding: 3px 10px;\n border-radius: 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 500;\n}\n\n.result-relationship {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 0;\n}\n\n.rel-name {\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.rel-fields {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.result-thresholds {\n display: flex;\n gap: 24px;\n}\n\n.threshold-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.threshold-label {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.threshold-value {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.result-reasoning {\n margin: 0;\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.result-actions {\n display: flex;\n gap: 8px;\n padding-top: 8px;\n}\n\n.suggest-close-action {\n padding: 10px 20px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n}\n\n.suggest-close-action:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* --- Suggest Input --- */\n.suggest-input {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n width: 100%;\n box-sizing: border-box;\n}\n\n.suggest-input:focus {\n outline: none;\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* --- Try Again Button (secondary style) --- */\n.suggest-try-again-btn {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n}\n\n.suggest-try-again-btn:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n/* --- Save Spinner --- */\n.save-spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px 0;\n}\n\n/* ================================================================\n Responsive \u2014 Vector Management\n ================================================================ */\n\n@media (max-width: 768px) {\n .panel-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 600px) {\n .slide-panel {\n width: 100vw;\n max-width: 100vw;\n }\n}\n\n@media (max-width: 480px) {\n .vector-dashboard {\n padding: 12px;\n }\n\n .suggest-btn .suggest-btn-text {\n display: none;\n }\n}\n"] }]
|
|
1760
1962
|
}], null, { EmbeddedMode: [{
|
|
1761
1963
|
type: Input
|
|
1762
1964
|
}] }); })();
|
|
1763
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VectorManagementResourceComponent, { className: "VectorManagementResourceComponent", filePath: "src/AI/components/vectors/vector-management-resource.component.ts", lineNumber:
|
|
1965
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VectorManagementResourceComponent, { className: "VectorManagementResourceComponent", filePath: "src/AI/components/vectors/vector-management-resource.component.ts", lineNumber: 72 }); })();
|
|
1764
1966
|
export function LoadVectorManagementResource() {
|
|
1765
1967
|
// Prevents tree-shaking
|
|
1766
1968
|
}
|