@memberjunction/ng-dashboards 5.39.0 → 5.40.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +128 -4
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +548 -145
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +100 -2
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +603 -213
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +15 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -1
- package/dist/AI/components/autotagging/shared/classify.format.js +51 -0
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -1
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +43 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -1
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +38 -1
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/history-tab.component.js +185 -68
- package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +10 -1
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +249 -188
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +12 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +377 -296
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +8 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js +112 -68
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -1
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +9 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/tabs/types-tab.component.js +87 -36
- package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +1 -1
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +28 -6
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -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 +330 -302
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +2 -2
- package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +12 -9
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -120
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +3 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +3 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +48 -38
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +41 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +12 -14
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +5 -14
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +57 -55
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
* NavigationService through the `(NavigateToRecordRequested)` output.
|
|
22
22
|
*/
|
|
23
23
|
import { Component, ChangeDetectorRef, EventEmitter, Output, inject, NgZone } from '@angular/core';
|
|
24
|
-
import { CompositeKey } from '@memberjunction/core';
|
|
25
|
-
import { KnowledgeHubMetadataEngine, UserInfoEngine } from '@memberjunction/core-entities';
|
|
24
|
+
import { CompositeKey, RunView } from '@memberjunction/core';
|
|
25
|
+
import { KnowledgeHubMetadataEngine, ApplicationSettingEngine, UserInfoEngine } from '@memberjunction/core-entities';
|
|
26
26
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
27
27
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
28
28
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
@@ -38,7 +38,8 @@ const _forTrack0 = ($index, $item) => $item.ID;
|
|
|
38
38
|
const _forTrack1 = ($index, $item) => $item.Key;
|
|
39
39
|
const _forTrack2 = ($index, $item) => $item.value;
|
|
40
40
|
const _forTrack3 = ($index, $item) => $item.Value;
|
|
41
|
-
const _forTrack4 = ($index, $item) => $item.
|
|
41
|
+
const _forTrack4 = ($index, $item) => $item.Name;
|
|
42
|
+
const _forTrack5 = ($index, $item) => $item.label;
|
|
42
43
|
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
43
44
|
i0.ɵɵtext(0, " Add Content Source ");
|
|
44
45
|
} }
|
|
@@ -115,13 +116,13 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Cond
|
|
|
115
116
|
i0.ɵɵrepeater(ctx_r1.FileTypeOptions);
|
|
116
117
|
} }
|
|
117
118
|
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
118
|
-
i0.ɵɵelementStart(0, "span",
|
|
119
|
+
i0.ɵɵelementStart(0, "span", 51);
|
|
119
120
|
i0.ɵɵtext(1, "*");
|
|
120
121
|
i0.ɵɵelementEnd();
|
|
121
122
|
} }
|
|
122
123
|
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_4_Template(rf, ctx) { if (rf & 1) {
|
|
123
124
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
124
|
-
i0.ɵɵelementStart(0, "input",
|
|
125
|
+
i0.ɵɵelementStart(0, "input", 56);
|
|
125
126
|
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_4_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r8); const field_r9 = i0.ɵɵnextContext(3).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormSourceSpecificConfig[field_r9.Key], $event) || (ctx_r1.FormSourceSpecificConfig[field_r9.Key] = $event); return i0.ɵɵresetView($event); });
|
|
126
127
|
i0.ɵɵelementEnd();
|
|
127
128
|
} if (rf & 2) {
|
|
@@ -132,7 +133,7 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_
|
|
|
132
133
|
} }
|
|
133
134
|
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_5_Template(rf, ctx) { if (rf & 1) {
|
|
134
135
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
135
|
-
i0.ɵɵelementStart(0, "input",
|
|
136
|
+
i0.ɵɵelementStart(0, "input", 57);
|
|
136
137
|
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_5_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r10); const field_r9 = i0.ɵɵnextContext(3).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormSourceSpecificConfig[field_r9.Key], $event) || (ctx_r1.FormSourceSpecificConfig[field_r9.Key] = $event); return i0.ɵɵresetView($event); });
|
|
137
138
|
i0.ɵɵelementEnd();
|
|
138
139
|
} if (rf & 2) {
|
|
@@ -143,7 +144,7 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_
|
|
|
143
144
|
} }
|
|
144
145
|
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_6_Template(rf, ctx) { if (rf & 1) {
|
|
145
146
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
146
|
-
i0.ɵɵelementStart(0, "input",
|
|
147
|
+
i0.ɵɵelementStart(0, "input", 58);
|
|
147
148
|
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_6_Template_input_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r11); const field_r9 = i0.ɵɵnextContext(3).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormSourceSpecificConfig[field_r9.Key], $event) || (ctx_r1.FormSourceSpecificConfig[field_r9.Key] = $event); return i0.ɵɵresetView($event); });
|
|
148
149
|
i0.ɵɵelementEnd();
|
|
149
150
|
} if (rf & 2) {
|
|
@@ -266,9 +267,9 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_
|
|
|
266
267
|
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
267
268
|
i0.ɵɵelementStart(0, "div", 10)(1, "label", 11);
|
|
268
269
|
i0.ɵɵtext(2);
|
|
269
|
-
i0.ɵɵconditionalCreate(3, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Conditional_3_Template, 2, 0, "span",
|
|
270
|
+
i0.ɵɵconditionalCreate(3, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Conditional_3_Template, 2, 0, "span", 51);
|
|
270
271
|
i0.ɵɵelementEnd();
|
|
271
|
-
i0.ɵɵconditionalCreate(4, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_4_Template, 1, 2, "input",
|
|
272
|
+
i0.ɵɵconditionalCreate(4, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_4_Template, 1, 2, "input", 52)(5, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_5_Template, 1, 2, "input", 53)(6, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_6_Template, 1, 3, "input", 54)(7, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_7_Template, 5, 1, "select", 55)(8, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_8_Template, 3, 1, "select", 55)(9, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_9_Template, 5, 1, "select", 55)(10, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Case_10_Template, 5, 2, "select", 55);
|
|
272
273
|
i0.ɵɵconditionalCreate(11, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Conditional_0_Conditional_0_Conditional_11_Template, 2, 1, "span", 19);
|
|
273
274
|
i0.ɵɵelementEnd();
|
|
274
275
|
} if (rf & 2) {
|
|
@@ -297,51 +298,138 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_
|
|
|
297
298
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
298
299
|
i0.ɵɵconditional(!field_r9.DependsOnField || ctx_r1.FormSourceSpecificConfig[field_r9.DependsOnField] ? 0 : -1);
|
|
299
300
|
} }
|
|
300
|
-
function
|
|
301
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
302
|
+
const _r20 = i0.ɵɵgetCurrentView();
|
|
303
|
+
i0.ɵɵelementStart(0, "button", 64);
|
|
304
|
+
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OpenInlineEntityDocForm()); });
|
|
305
|
+
i0.ɵɵelement(1, "i", 65);
|
|
306
|
+
i0.ɵɵtext(2, " Create Entity Document ");
|
|
307
|
+
i0.ɵɵelementEnd();
|
|
308
|
+
} }
|
|
309
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_For_10_Template(rf, ctx) { if (rf & 1) {
|
|
310
|
+
const _r22 = i0.ɵɵgetCurrentView();
|
|
311
|
+
i0.ɵɵelementStart(0, "label", 68)(1, "input", 71);
|
|
312
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_For_10_Template_input_ngModelChange_1_listener($event) { const f_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntityDocSelectedFields[f_r23.Name], $event) || (ctx_r1.NewEntityDocSelectedFields[f_r23.Name] = $event); return i0.ɵɵresetView($event); });
|
|
313
|
+
i0.ɵɵelementEnd();
|
|
314
|
+
i0.ɵɵelementStart(2, "span");
|
|
315
|
+
i0.ɵɵtext(3);
|
|
316
|
+
i0.ɵɵelementEnd()();
|
|
317
|
+
} if (rf & 2) {
|
|
318
|
+
const f_r23 = ctx.$implicit;
|
|
319
|
+
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
320
|
+
i0.ɵɵadvance();
|
|
321
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewEntityDocSelectedFields[f_r23.Name]);
|
|
322
|
+
i0.ɵɵadvance(2);
|
|
323
|
+
i0.ɵɵtextInterpolate(f_r23.DisplayName);
|
|
324
|
+
} }
|
|
325
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
326
|
+
i0.ɵɵelement(0, "i", 72);
|
|
327
|
+
i0.ɵɵtext(1, " Creating\u2026 ");
|
|
328
|
+
} }
|
|
329
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
330
|
+
i0.ɵɵelement(0, "i", 73);
|
|
331
|
+
i0.ɵɵtext(1, " Create ");
|
|
332
|
+
} }
|
|
333
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
334
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
335
|
+
i0.ɵɵelementStart(0, "div", 63)(1, "div", 10)(2, "label", 11);
|
|
336
|
+
i0.ɵɵtext(3, "Document name");
|
|
337
|
+
i0.ɵɵelementEnd();
|
|
338
|
+
i0.ɵɵelementStart(4, "input", 66);
|
|
339
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Template_input_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(4); i0.ɵɵtwoWayBindingSet(ctx_r1.NewEntityDocName, $event) || (ctx_r1.NewEntityDocName = $event); return i0.ɵɵresetView($event); });
|
|
340
|
+
i0.ɵɵelementEnd()();
|
|
341
|
+
i0.ɵɵelementStart(5, "div", 10)(6, "label", 11);
|
|
342
|
+
i0.ɵɵtext(7);
|
|
343
|
+
i0.ɵɵelementEnd();
|
|
344
|
+
i0.ɵɵelementStart(8, "div", 67);
|
|
345
|
+
i0.ɵɵrepeaterCreate(9, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_For_10_Template, 4, 2, "label", 68, _forTrack4);
|
|
346
|
+
i0.ɵɵelementEnd()();
|
|
347
|
+
i0.ɵɵelementStart(11, "div", 47)(12, "button", 69);
|
|
348
|
+
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.CreateInlineEntityDocument()); });
|
|
349
|
+
i0.ɵɵconditionalCreate(13, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Conditional_13_Template, 2, 0)(14, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Conditional_14_Template, 2, 0);
|
|
350
|
+
i0.ɵɵelementEnd();
|
|
351
|
+
i0.ɵɵelementStart(15, "button", 70);
|
|
352
|
+
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.CancelInlineEntityDocForm()); });
|
|
353
|
+
i0.ɵɵtext(16, "Cancel");
|
|
354
|
+
i0.ɵɵelementEnd()()();
|
|
355
|
+
} if (rf & 2) {
|
|
356
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
357
|
+
i0.ɵɵadvance(4);
|
|
358
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.NewEntityDocName);
|
|
359
|
+
i0.ɵɵadvance(3);
|
|
360
|
+
i0.ɵɵtextInterpolate1("Fields to include (", ctx_r1.SelectedEntityDocFieldCount, " selected)");
|
|
361
|
+
i0.ɵɵadvance(2);
|
|
362
|
+
i0.ɵɵrepeater(ctx_r1.SelectedEntityFields);
|
|
363
|
+
i0.ɵɵadvance(3);
|
|
364
|
+
i0.ɵɵproperty("disabled", ctx_r1.EntityDocSaving);
|
|
365
|
+
i0.ɵɵadvance();
|
|
366
|
+
i0.ɵɵconditional(ctx_r1.EntityDocSaving ? 13 : 14);
|
|
367
|
+
} }
|
|
368
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
369
|
+
i0.ɵɵelementStart(0, "div", 59)(1, "div", 60);
|
|
370
|
+
i0.ɵɵelement(2, "i", 61);
|
|
371
|
+
i0.ɵɵelementStart(3, "span")(4, "strong");
|
|
372
|
+
i0.ɵɵtext(5);
|
|
373
|
+
i0.ɵɵelementEnd();
|
|
374
|
+
i0.ɵɵtext(6, " has no Entity Document. One is required to classify its records.");
|
|
375
|
+
i0.ɵɵelementEnd()();
|
|
376
|
+
i0.ɵɵconditionalCreate(7, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_7_Template, 3, 0, "button", 62);
|
|
377
|
+
i0.ɵɵelementEnd();
|
|
378
|
+
i0.ɵɵconditionalCreate(8, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Conditional_8_Template, 17, 4, "div", 63);
|
|
379
|
+
} if (rf & 2) {
|
|
380
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
381
|
+
i0.ɵɵadvance(5);
|
|
382
|
+
i0.ɵɵtextInterpolate(ctx_r1.SelectedEntityName);
|
|
383
|
+
i0.ɵɵadvance(2);
|
|
384
|
+
i0.ɵɵconditional(!ctx_r1.ShowInlineEntityDocForm ? 7 : -1);
|
|
385
|
+
i0.ɵɵadvance();
|
|
386
|
+
i0.ɵɵconditional(ctx_r1.ShowInlineEntityDocForm ? 8 : -1);
|
|
387
|
+
} }
|
|
388
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_37_Template(rf, ctx) { if (rf & 1) {
|
|
301
389
|
i0.ɵɵelementStart(0, "option", 15);
|
|
302
390
|
i0.ɵɵtext(1);
|
|
303
391
|
i0.ɵɵelementEnd();
|
|
304
392
|
} if (rf & 2) {
|
|
305
|
-
const
|
|
306
|
-
i0.ɵɵproperty("value",
|
|
393
|
+
const opt_r24 = ctx.$implicit;
|
|
394
|
+
i0.ɵɵproperty("value", opt_r24.ID);
|
|
307
395
|
i0.ɵɵadvance();
|
|
308
|
-
i0.ɵɵtextInterpolate(
|
|
396
|
+
i0.ɵɵtextInterpolate(opt_r24.Name);
|
|
309
397
|
} }
|
|
310
|
-
function
|
|
311
|
-
const
|
|
312
|
-
i0.ɵɵelementStart(0, "div",
|
|
313
|
-
i0.ɵɵlistener("click", function
|
|
398
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_53_Template(rf, ctx) { if (rf & 1) {
|
|
399
|
+
const _r25 = i0.ɵɵgetCurrentView();
|
|
400
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
401
|
+
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_53_Template_div_click_0_listener() { const m_r26 = i0.ɵɵrestoreView(_r25).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SetMode(m_r26.value)); });
|
|
314
402
|
i0.ɵɵelement(1, "i");
|
|
315
|
-
i0.ɵɵelementStart(2, "div",
|
|
403
|
+
i0.ɵɵelementStart(2, "div", 75);
|
|
316
404
|
i0.ɵɵtext(3);
|
|
317
405
|
i0.ɵɵelementEnd();
|
|
318
|
-
i0.ɵɵelementStart(4, "div",
|
|
406
|
+
i0.ɵɵelementStart(4, "div", 76);
|
|
319
407
|
i0.ɵɵtext(5);
|
|
320
408
|
i0.ɵɵelementEnd()();
|
|
321
409
|
} if (rf & 2) {
|
|
322
|
-
const
|
|
410
|
+
const m_r26 = ctx.$implicit;
|
|
323
411
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
324
|
-
i0.ɵɵclassProp("selected", ctx_r1.CurrentMode ===
|
|
412
|
+
i0.ɵɵclassProp("selected", ctx_r1.CurrentMode === m_r26.value);
|
|
325
413
|
i0.ɵɵadvance();
|
|
326
|
-
i0.ɵɵclassMap(i0.ɵɵinterpolate1("fa-solid ",
|
|
414
|
+
i0.ɵɵclassMap(i0.ɵɵinterpolate1("fa-solid ", m_r26.icon, " cls-mode-ic"));
|
|
327
415
|
i0.ɵɵadvance(2);
|
|
328
|
-
i0.ɵɵtextInterpolate(
|
|
416
|
+
i0.ɵɵtextInterpolate(m_r26.label);
|
|
329
417
|
i0.ɵɵadvance(2);
|
|
330
|
-
i0.ɵɵtextInterpolate(
|
|
418
|
+
i0.ɵɵtextInterpolate(m_r26.bestFor);
|
|
331
419
|
} }
|
|
332
|
-
function
|
|
420
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_61_Template(rf, ctx) { if (rf & 1) {
|
|
333
421
|
i0.ɵɵelementStart(0, "option", 15);
|
|
334
422
|
i0.ɵɵtext(1);
|
|
335
423
|
i0.ɵɵelementEnd();
|
|
336
424
|
} if (rf & 2) {
|
|
337
|
-
const
|
|
338
|
-
i0.ɵɵproperty("value",
|
|
425
|
+
const opt_r27 = ctx.$implicit;
|
|
426
|
+
i0.ɵɵproperty("value", opt_r27.ID);
|
|
339
427
|
i0.ɵɵadvance();
|
|
340
|
-
i0.ɵɵtextInterpolate(
|
|
428
|
+
i0.ɵɵtextInterpolate(opt_r27.Name);
|
|
341
429
|
} }
|
|
342
|
-
function
|
|
430
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_84_Template(rf, ctx) { if (rf & 1) {
|
|
343
431
|
i0.ɵɵelementStart(0, "div", 32);
|
|
344
|
-
i0.ɵɵelement(1, "i",
|
|
432
|
+
i0.ɵɵelement(1, "i", 77);
|
|
345
433
|
i0.ɵɵtext(2);
|
|
346
434
|
i0.ɵɵelementEnd();
|
|
347
435
|
} if (rf & 2) {
|
|
@@ -349,59 +437,59 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Cond
|
|
|
349
437
|
i0.ɵɵadvance(2);
|
|
350
438
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.ThresholdValidationMessage);
|
|
351
439
|
} }
|
|
352
|
-
function
|
|
353
|
-
i0.ɵɵelementStart(0, "div", 33)(1, "span",
|
|
440
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_85_Template(rf, ctx) { if (rf & 1) {
|
|
441
|
+
i0.ɵɵelementStart(0, "div", 33)(1, "span", 78);
|
|
354
442
|
i0.ɵɵtext(2, "reject / new");
|
|
355
443
|
i0.ɵɵelementEnd();
|
|
356
|
-
i0.ɵɵelementStart(3, "span",
|
|
444
|
+
i0.ɵɵelementStart(3, "span", 79);
|
|
357
445
|
i0.ɵɵtext(4, "review (inbox)");
|
|
358
446
|
i0.ɵɵelementEnd();
|
|
359
|
-
i0.ɵɵelementStart(5, "span",
|
|
447
|
+
i0.ɵɵelementStart(5, "span", 80);
|
|
360
448
|
i0.ɵɵtext(6, "auto-apply");
|
|
361
449
|
i0.ɵɵelementEnd()();
|
|
362
450
|
} }
|
|
363
|
-
function
|
|
364
|
-
i0.ɵɵelementStart(0, "div",
|
|
451
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_100_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
452
|
+
i0.ɵɵelementStart(0, "div", 82)(1, "span", 83);
|
|
365
453
|
i0.ɵɵtext(2);
|
|
366
454
|
i0.ɵɵelementEnd();
|
|
367
|
-
i0.ɵɵelementStart(3, "span",
|
|
455
|
+
i0.ɵɵelementStart(3, "span", 84);
|
|
368
456
|
i0.ɵɵtext(4);
|
|
369
|
-
i0.ɵɵelementStart(5, "span",
|
|
457
|
+
i0.ɵɵelementStart(5, "span", 85);
|
|
370
458
|
i0.ɵɵtext(6);
|
|
371
459
|
i0.ɵɵelementEnd()()();
|
|
372
460
|
} if (rf & 2) {
|
|
373
|
-
const
|
|
461
|
+
const row_r28 = ctx.$implicit;
|
|
374
462
|
i0.ɵɵadvance(2);
|
|
375
|
-
i0.ɵɵtextInterpolate(
|
|
463
|
+
i0.ɵɵtextInterpolate(row_r28.label);
|
|
376
464
|
i0.ɵɵadvance(2);
|
|
377
|
-
i0.ɵɵtextInterpolate1("",
|
|
465
|
+
i0.ɵɵtextInterpolate1("", row_r28.value, " ");
|
|
378
466
|
i0.ɵɵadvance();
|
|
379
|
-
i0.ɵɵclassProp("override",
|
|
467
|
+
i0.ɵɵclassProp("override", row_r28.origin === "source override");
|
|
380
468
|
i0.ɵɵadvance();
|
|
381
|
-
i0.ɵɵtextInterpolate(
|
|
469
|
+
i0.ɵɵtextInterpolate(row_r28.origin);
|
|
382
470
|
} }
|
|
383
|
-
function
|
|
384
|
-
i0.ɵɵelementStart(0, "div", 39)(1, "h5",
|
|
471
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_100_Template(rf, ctx) { if (rf & 1) {
|
|
472
|
+
i0.ɵɵelementStart(0, "div", 39)(1, "h5", 81);
|
|
385
473
|
i0.ɵɵtext(2, "Effective values");
|
|
386
474
|
i0.ɵɵelementEnd();
|
|
387
|
-
i0.ɵɵrepeaterCreate(3,
|
|
475
|
+
i0.ɵɵrepeaterCreate(3, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_100_For_4_Template, 7, 5, "div", 82, _forTrack5);
|
|
388
476
|
i0.ɵɵelementEnd();
|
|
389
477
|
} if (rf & 2) {
|
|
390
478
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
391
479
|
i0.ɵɵadvance(3);
|
|
392
480
|
i0.ɵɵrepeater(ctx_r1.EffectiveValues);
|
|
393
481
|
} }
|
|
394
|
-
function
|
|
395
|
-
const
|
|
482
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_166_Template(rf, ctx) { if (rf & 1) {
|
|
483
|
+
const _r29 = i0.ɵɵgetCurrentView();
|
|
396
484
|
i0.ɵɵelementStart(0, "div", 16)(1, "div", 8);
|
|
397
|
-
i0.ɵɵelement(2, "i",
|
|
485
|
+
i0.ɵɵelement(2, "i", 86);
|
|
398
486
|
i0.ɵɵtext(3, " Crawl settings");
|
|
399
487
|
i0.ɵɵelementEnd();
|
|
400
488
|
i0.ɵɵelementStart(4, "div", 10)(5, "label", 11);
|
|
401
489
|
i0.ɵɵtext(6, "Crawl depth");
|
|
402
490
|
i0.ɵɵelementEnd();
|
|
403
|
-
i0.ɵɵelementStart(7, "input",
|
|
404
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
491
|
+
i0.ɵɵelementStart(7, "input", 87);
|
|
492
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_166_Template_input_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormMaxDepth, $event) || (ctx_r1.FormMaxDepth = $event); return i0.ɵɵresetView($event); });
|
|
405
493
|
i0.ɵɵelementEnd();
|
|
406
494
|
i0.ɵɵelementStart(8, "span", 19);
|
|
407
495
|
i0.ɵɵtext(9, " Recursion ceiling for in-domain links. ");
|
|
@@ -414,16 +502,16 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Cond
|
|
|
414
502
|
i0.ɵɵelementEnd();
|
|
415
503
|
i0.ɵɵtext(15, " (default) = root + sections + content pages. ");
|
|
416
504
|
i0.ɵɵelementEnd()();
|
|
417
|
-
i0.ɵɵelementStart(16, "div", 10)(17, "label", 11)(18, "input",
|
|
418
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
505
|
+
i0.ɵɵelementStart(16, "div", 10)(17, "label", 11)(18, "input", 71);
|
|
506
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_166_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormCrawlSitesInLowerLevelDomain, $event) || (ctx_r1.FormCrawlSitesInLowerLevelDomain = $event); return i0.ɵɵresetView($event); });
|
|
419
507
|
i0.ɵɵelementEnd();
|
|
420
508
|
i0.ɵɵtext(19, " Crawl sites in lower-level domain ");
|
|
421
509
|
i0.ɵɵelementEnd();
|
|
422
510
|
i0.ɵɵelementStart(20, "span", 19);
|
|
423
511
|
i0.ɵɵtext(21, "When on (default), the depth-aware recursive crawler runs. Turn off to crawl only the seed page.");
|
|
424
512
|
i0.ɵɵelementEnd()();
|
|
425
|
-
i0.ɵɵelementStart(22, "div", 10)(23, "label", 11)(24, "input",
|
|
426
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
513
|
+
i0.ɵɵelementStart(22, "div", 10)(23, "label", 11)(24, "input", 71);
|
|
514
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_166_Template_input_ngModelChange_24_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(3); i0.ɵɵtwoWayBindingSet(ctx_r1.FormCrawlOtherSitesInTopLevelDomain, $event) || (ctx_r1.FormCrawlOtherSitesInTopLevelDomain = $event); return i0.ɵɵresetView($event); });
|
|
427
515
|
i0.ɵɵelementEnd();
|
|
428
516
|
i0.ɵɵtext(25, " Crawl other sites in top-level domain ");
|
|
429
517
|
i0.ɵɵelementEnd();
|
|
@@ -439,19 +527,19 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Cond
|
|
|
439
527
|
i0.ɵɵadvance(6);
|
|
440
528
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FormCrawlOtherSitesInTopLevelDomain);
|
|
441
529
|
} }
|
|
442
|
-
function
|
|
443
|
-
i0.ɵɵelement(0, "i",
|
|
530
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_169_Template(rf, ctx) { if (rf & 1) {
|
|
531
|
+
i0.ɵɵelement(0, "i", 72);
|
|
444
532
|
i0.ɵɵtext(1, " Saving... ");
|
|
445
533
|
} }
|
|
446
|
-
function
|
|
447
|
-
i0.ɵɵelement(0, "i",
|
|
534
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_170_Template(rf, ctx) { if (rf & 1) {
|
|
535
|
+
i0.ɵɵelement(0, "i", 73);
|
|
448
536
|
i0.ɵɵtext(1, " Save ");
|
|
449
537
|
} }
|
|
450
|
-
function
|
|
451
|
-
const
|
|
452
|
-
i0.ɵɵelementStart(0, "div",
|
|
453
|
-
i0.ɵɵlistener("click", function
|
|
454
|
-
i0.ɵɵelement(2, "i",
|
|
538
|
+
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_173_Template(rf, ctx) { if (rf & 1) {
|
|
539
|
+
const _r30 = i0.ɵɵgetCurrentView();
|
|
540
|
+
i0.ɵɵelementStart(0, "div", 50)(1, "a", 88);
|
|
541
|
+
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_173_Template_a_click_1_listener() { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenAdvancedSourceSettings()); });
|
|
542
|
+
i0.ɵɵelement(2, "i", 89);
|
|
455
543
|
i0.ɵɵtext(3, " Open advanced settings \u2014 URL pattern, root URL, & full entity form ");
|
|
456
544
|
i0.ɵɵelementEnd();
|
|
457
545
|
i0.ɵɵelementStart(4, "span", 19);
|
|
@@ -482,163 +570,203 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Temp
|
|
|
482
570
|
i0.ɵɵelementEnd()();
|
|
483
571
|
i0.ɵɵconditionalCreate(16, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_16_Template, 16, 2);
|
|
484
572
|
i0.ɵɵrepeaterCreate(17, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_18_Template, 1, 1, null, null, _forTrack1);
|
|
573
|
+
i0.ɵɵconditionalCreate(19, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_19_Template, 9, 3);
|
|
485
574
|
i0.ɵɵelementEnd();
|
|
486
|
-
i0.ɵɵelementStart(
|
|
487
|
-
i0.ɵɵelement(
|
|
488
|
-
i0.ɵɵtext(
|
|
575
|
+
i0.ɵɵelementStart(20, "div", 16)(21, "div", 8);
|
|
576
|
+
i0.ɵɵelement(22, "i", 17);
|
|
577
|
+
i0.ɵɵtext(23, " Embedding & Vectors");
|
|
489
578
|
i0.ɵɵelementEnd();
|
|
490
|
-
i0.ɵɵelementStart(
|
|
491
|
-
i0.ɵɵtext(
|
|
579
|
+
i0.ɵɵelementStart(24, "div", 10)(25, "label", 11);
|
|
580
|
+
i0.ɵɵtext(26, "Embedding Model Override");
|
|
492
581
|
i0.ɵɵelementEnd();
|
|
493
|
-
i0.ɵɵelementStart(
|
|
494
|
-
i0.ɵɵlistener("ValueChange", function
|
|
582
|
+
i0.ɵɵelementStart(27, "mj-tree-dropdown", 18);
|
|
583
|
+
i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_tree_dropdown_ValueChange_27_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FormSourceEmbeddingModelID = ctx_r1.FromCompositeKey($event)); });
|
|
495
584
|
i0.ɵɵelementEnd();
|
|
496
|
-
i0.ɵɵelementStart(
|
|
497
|
-
i0.ɵɵtext(
|
|
585
|
+
i0.ɵɵelementStart(28, "span", 19);
|
|
586
|
+
i0.ɵɵtext(29, "Overrides Content Type default");
|
|
498
587
|
i0.ɵɵelementEnd()();
|
|
499
|
-
i0.ɵɵelementStart(
|
|
500
|
-
i0.ɵɵtext(
|
|
588
|
+
i0.ɵɵelementStart(30, "div", 10)(31, "label", 11);
|
|
589
|
+
i0.ɵɵtext(32, "Vector Index Override");
|
|
501
590
|
i0.ɵɵelementEnd();
|
|
502
|
-
i0.ɵɵelementStart(
|
|
503
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
504
|
-
i0.ɵɵelementStart(
|
|
505
|
-
i0.ɵɵtext(
|
|
591
|
+
i0.ɵɵelementStart(33, "select", 13);
|
|
592
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_select_ngModelChange_33_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormSourceVectorIndexID, $event) || (ctx_r1.FormSourceVectorIndexID = $event); return i0.ɵɵresetView($event); });
|
|
593
|
+
i0.ɵɵelementStart(34, "option", 14);
|
|
594
|
+
i0.ɵɵtext(35, "Use system default");
|
|
506
595
|
i0.ɵɵelementEnd();
|
|
507
|
-
i0.ɵɵrepeaterCreate(
|
|
596
|
+
i0.ɵɵrepeaterCreate(36, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_37_Template, 2, 2, "option", 15, _forTrack0);
|
|
508
597
|
i0.ɵɵelementEnd();
|
|
509
|
-
i0.ɵɵelementStart(
|
|
510
|
-
i0.ɵɵtext(
|
|
598
|
+
i0.ɵɵelementStart(38, "span", 19);
|
|
599
|
+
i0.ɵɵtext(39, "Overrides Content Type default");
|
|
511
600
|
i0.ɵɵelementEnd()()();
|
|
512
|
-
i0.ɵɵelementStart(
|
|
513
|
-
i0.ɵɵelement(
|
|
514
|
-
i0.ɵɵtext(
|
|
515
|
-
i0.ɵɵelementStart(
|
|
516
|
-
i0.ɵɵlistener("click", function
|
|
517
|
-
i0.ɵɵelement(
|
|
518
|
-
i0.ɵɵtext(
|
|
601
|
+
i0.ɵɵelementStart(40, "div", 16)(41, "div", 8);
|
|
602
|
+
i0.ɵɵelement(42, "i", 20);
|
|
603
|
+
i0.ɵɵtext(43, " Classification ");
|
|
604
|
+
i0.ɵɵelementStart(44, "button", 21);
|
|
605
|
+
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_button_click_44_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleEffectiveValues()); });
|
|
606
|
+
i0.ɵɵelement(45, "i", 22);
|
|
607
|
+
i0.ɵɵtext(46);
|
|
519
608
|
i0.ɵɵelementEnd()();
|
|
520
|
-
i0.ɵɵelementStart(
|
|
521
|
-
i0.ɵɵtext(
|
|
609
|
+
i0.ɵɵelementStart(47, "div", 23)(48, "div", 10)(49, "label", 11);
|
|
610
|
+
i0.ɵɵtext(50, "Taxonomy mode");
|
|
522
611
|
i0.ɵɵelementEnd();
|
|
523
|
-
i0.ɵɵelementStart(
|
|
524
|
-
i0.ɵɵrepeaterCreate(
|
|
612
|
+
i0.ɵɵelementStart(51, "div", 24);
|
|
613
|
+
i0.ɵɵrepeaterCreate(52, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_53_Template, 6, 7, "div", 25, _forTrack2);
|
|
525
614
|
i0.ɵɵelementEnd()();
|
|
526
|
-
i0.ɵɵelementStart(
|
|
527
|
-
i0.ɵɵtext(
|
|
615
|
+
i0.ɵɵelementStart(54, "div", 10)(55, "label", 11);
|
|
616
|
+
i0.ɵɵtext(56, "Tag root");
|
|
528
617
|
i0.ɵɵelementEnd();
|
|
529
|
-
i0.ɵɵelementStart(
|
|
530
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
531
|
-
i0.ɵɵelementStart(
|
|
532
|
-
i0.ɵɵtext(
|
|
618
|
+
i0.ɵɵelementStart(57, "select", 13);
|
|
619
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_select_ngModelChange_57_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.TagRootIDValue, $event) || (ctx_r1.TagRootIDValue = $event); return i0.ɵɵresetView($event); });
|
|
620
|
+
i0.ɵɵelementStart(58, "option", 14);
|
|
621
|
+
i0.ɵɵtext(59, "(none / whole taxonomy)");
|
|
533
622
|
i0.ɵɵelementEnd();
|
|
534
|
-
i0.ɵɵrepeaterCreate(
|
|
623
|
+
i0.ɵɵrepeaterCreate(60, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_For_61_Template, 2, 2, "option", 15, _forTrack0);
|
|
535
624
|
i0.ɵɵelementEnd();
|
|
536
|
-
i0.ɵɵelementStart(
|
|
537
|
-
i0.ɵɵtext(
|
|
625
|
+
i0.ɵɵelementStart(62, "span", 19);
|
|
626
|
+
i0.ɵɵtext(63, "Restricts the LLM's visible taxonomy + auto-grow target. Leave blank for the full taxonomy.");
|
|
538
627
|
i0.ɵɵelementEnd()();
|
|
539
|
-
i0.ɵɵelementStart(
|
|
540
|
-
i0.ɵɵtext(
|
|
541
|
-
i0.ɵɵelementEnd();
|
|
542
|
-
i0.ɵɵelementStart(
|
|
543
|
-
i0.ɵɵtext(
|
|
544
|
-
i0.ɵɵelementStart(
|
|
545
|
-
i0.ɵɵtext(
|
|
546
|
-
i0.ɵɵpipe(
|
|
628
|
+
i0.ɵɵelementStart(64, "div", 10)(65, "label", 11);
|
|
629
|
+
i0.ɵɵtext(66, "Confidence thresholds");
|
|
630
|
+
i0.ɵɵelementEnd();
|
|
631
|
+
i0.ɵɵelementStart(67, "div", 26)(68, "div", 27)(69, "div", 28)(70, "span", 29);
|
|
632
|
+
i0.ɵɵtext(71, "Match (auto-apply) ");
|
|
633
|
+
i0.ɵɵelementStart(72, "strong");
|
|
634
|
+
i0.ɵɵtext(73);
|
|
635
|
+
i0.ɵɵpipe(74, "number");
|
|
547
636
|
i0.ɵɵelementEnd()();
|
|
548
|
-
i0.ɵɵelementStart(
|
|
549
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
637
|
+
i0.ɵɵelementStart(75, "input", 30);
|
|
638
|
+
i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_75_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MatchThresholdValue = $event); });
|
|
550
639
|
i0.ɵɵelementEnd()();
|
|
551
|
-
i0.ɵɵelementStart(
|
|
552
|
-
i0.ɵɵtext(
|
|
553
|
-
i0.ɵɵelementStart(
|
|
554
|
-
i0.ɵɵtext(
|
|
555
|
-
i0.ɵɵpipe(
|
|
640
|
+
i0.ɵɵelementStart(76, "div", 28)(77, "span", 29);
|
|
641
|
+
i0.ɵɵtext(78, "Suggest (route to inbox) ");
|
|
642
|
+
i0.ɵɵelementStart(79, "strong");
|
|
643
|
+
i0.ɵɵtext(80);
|
|
644
|
+
i0.ɵɵpipe(81, "number");
|
|
556
645
|
i0.ɵɵelementEnd()();
|
|
557
|
-
i0.ɵɵelementStart(
|
|
558
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
646
|
+
i0.ɵɵelementStart(82, "input", 30);
|
|
647
|
+
i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_82_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SuggestThresholdValue = $event); });
|
|
559
648
|
i0.ɵɵelementEnd()()();
|
|
560
|
-
i0.ɵɵelement(
|
|
561
|
-
i0.ɵɵconditionalCreate(
|
|
649
|
+
i0.ɵɵelement(83, "div", 31);
|
|
650
|
+
i0.ɵɵconditionalCreate(84, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_84_Template, 3, 1, "div", 32)(85, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_85_Template, 7, 0, "div", 33);
|
|
562
651
|
i0.ɵɵelementEnd()();
|
|
563
|
-
i0.ɵɵelementStart(
|
|
564
|
-
i0.ɵɵtext(
|
|
652
|
+
i0.ɵɵelementStart(86, "div", 34)(87, "div", 35)(88, "span", 36);
|
|
653
|
+
i0.ɵɵtext(89, "Share full taxonomy with the LLM");
|
|
565
654
|
i0.ɵɵelementEnd();
|
|
566
|
-
i0.ɵɵelementStart(
|
|
567
|
-
i0.ɵɵtext(
|
|
655
|
+
i0.ɵɵelementStart(90, "span", 37);
|
|
656
|
+
i0.ɵɵtext(91, "When on, the LLM prompt includes the visible taxonomy. Larger taxonomies \u2192 higher token cost.");
|
|
568
657
|
i0.ɵɵelementEnd()();
|
|
569
|
-
i0.ɵɵelementStart(
|
|
570
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
658
|
+
i0.ɵɵelementStart(92, "mj-switch", 38);
|
|
659
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_switch_ngModelChange_92_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.ShareTaxonomyValue, $event) || (ctx_r1.ShareTaxonomyValue = $event); return i0.ɵɵresetView($event); });
|
|
571
660
|
i0.ɵɵelementEnd()();
|
|
572
|
-
i0.ɵɵelementStart(
|
|
573
|
-
i0.ɵɵtext(
|
|
661
|
+
i0.ɵɵelementStart(93, "div", 34)(94, "div", 35)(95, "span", 36);
|
|
662
|
+
i0.ɵɵtext(96, "Vectorize new content");
|
|
574
663
|
i0.ɵɵelementEnd();
|
|
575
|
-
i0.ɵɵelementStart(
|
|
576
|
-
i0.ɵɵtext(
|
|
664
|
+
i0.ɵɵelementStart(97, "span", 37);
|
|
665
|
+
i0.ɵɵtext(98, "When off, this source skips vectorization (the classifier still runs).");
|
|
577
666
|
i0.ɵɵelementEnd()();
|
|
578
|
-
i0.ɵɵelementStart(
|
|
579
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
667
|
+
i0.ɵɵelementStart(99, "mj-switch", 38);
|
|
668
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_switch_ngModelChange_99_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.EnableVectorizationValue, $event) || (ctx_r1.EnableVectorizationValue = $event); return i0.ɵɵresetView($event); });
|
|
580
669
|
i0.ɵɵelementEnd()()();
|
|
581
|
-
i0.ɵɵconditionalCreate(
|
|
670
|
+
i0.ɵɵconditionalCreate(100, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_100_Template, 5, 0, "div", 39);
|
|
671
|
+
i0.ɵɵelementEnd();
|
|
672
|
+
i0.ɵɵelementStart(101, "div", 16)(102, "div", 8);
|
|
673
|
+
i0.ɵɵelement(103, "i", 40);
|
|
674
|
+
i0.ɵɵtext(104, " Domain context");
|
|
675
|
+
i0.ɵɵelementEnd();
|
|
676
|
+
i0.ɵɵelementStart(105, "div", 10)(106, "label", 11);
|
|
677
|
+
i0.ɵɵtext(107, "Source guidance");
|
|
678
|
+
i0.ɵɵelementEnd();
|
|
679
|
+
i0.ɵɵelementStart(108, "textarea", 41);
|
|
680
|
+
i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_textarea_ngModelChange_108_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ClassificationContextValue = $event); });
|
|
681
|
+
i0.ɵɵelementEnd();
|
|
682
|
+
i0.ɵɵelementStart(109, "span", 19);
|
|
683
|
+
i0.ɵɵtext(110, "Injected into the autotagging prompt at the source scope.");
|
|
684
|
+
i0.ɵɵelementEnd()();
|
|
685
|
+
i0.ɵɵelementStart(111, "div", 34)(112, "div", 35)(113, "span", 36);
|
|
686
|
+
i0.ɵɵtext(114, "Substitutive mode");
|
|
687
|
+
i0.ɵɵelementEnd();
|
|
688
|
+
i0.ɵɵelementStart(115, "span", 37);
|
|
689
|
+
i0.ɵɵtext(116, "When on, this source's guidance ");
|
|
690
|
+
i0.ɵɵelementStart(117, "em");
|
|
691
|
+
i0.ɵɵtext(118, "replaces");
|
|
692
|
+
i0.ɵɵelementEnd();
|
|
693
|
+
i0.ɵɵtext(119, " the org/content-type context. When off (default), it's ");
|
|
694
|
+
i0.ɵɵelementStart(120, "em");
|
|
695
|
+
i0.ɵɵtext(121, "added");
|
|
696
|
+
i0.ɵɵelementEnd();
|
|
697
|
+
i0.ɵɵtext(122, " to them.");
|
|
698
|
+
i0.ɵɵelementEnd()();
|
|
699
|
+
i0.ɵɵelementStart(123, "mj-switch", 38);
|
|
700
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_mj_switch_ngModelChange_123_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.IsSubstitutiveMode, $event) || (ctx_r1.IsSubstitutiveMode = $event); return i0.ɵɵresetView($event); });
|
|
701
|
+
i0.ɵɵelementEnd()();
|
|
702
|
+
i0.ɵɵelementStart(124, "div", 10)(125, "label", 11);
|
|
703
|
+
i0.ɵɵtext(126, "Effective context preview");
|
|
704
|
+
i0.ɵɵelementEnd();
|
|
705
|
+
i0.ɵɵelementStart(127, "pre", 42);
|
|
706
|
+
i0.ɵɵtext(128);
|
|
582
707
|
i0.ɵɵelementEnd();
|
|
583
|
-
i0.ɵɵelementStart(
|
|
584
|
-
i0.ɵɵ
|
|
585
|
-
i0.ɵɵ
|
|
708
|
+
i0.ɵɵelementStart(129, "span", 19);
|
|
709
|
+
i0.ɵɵtext(130, "Org + source scopes shown. Content-type scope (if any) is also merged at run time.");
|
|
710
|
+
i0.ɵɵelementEnd()()();
|
|
711
|
+
i0.ɵɵelementStart(131, "div", 16)(132, "div", 8);
|
|
712
|
+
i0.ɵɵelement(133, "i", 43);
|
|
713
|
+
i0.ɵɵtext(134, " Run budgets");
|
|
586
714
|
i0.ɵɵelementEnd();
|
|
587
|
-
i0.ɵɵelementStart(
|
|
588
|
-
i0.ɵɵtext(
|
|
715
|
+
i0.ɵɵelementStart(135, "div", 10)(136, "label", 11);
|
|
716
|
+
i0.ɵɵtext(137, "Max items per run");
|
|
589
717
|
i0.ɵɵelementEnd();
|
|
590
|
-
i0.ɵɵelementStart(
|
|
591
|
-
i0.ɵɵtwoWayListener("ngModelChange", function
|
|
718
|
+
i0.ɵɵelementStart(138, "input", 44);
|
|
719
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_138_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormMaxItemsPerRun, $event) || (ctx_r1.FormMaxItemsPerRun = $event); return i0.ɵɵresetView($event); });
|
|
592
720
|
i0.ɵɵelementEnd();
|
|
593
|
-
i0.ɵɵelementStart(
|
|
594
|
-
i0.ɵɵtext(
|
|
721
|
+
i0.ɵɵelementStart(139, "span", 19);
|
|
722
|
+
i0.ɵɵtext(140, " Caps the number of content items handed to the LLM. Skipped (unchanged) items don't count. Paused work resumes on the next run. ");
|
|
595
723
|
i0.ɵɵelementEnd()();
|
|
596
|
-
i0.ɵɵelementStart(
|
|
597
|
-
i0.ɵɵtext(
|
|
724
|
+
i0.ɵɵelementStart(141, "div", 45)(142, "div", 10)(143, "label", 11);
|
|
725
|
+
i0.ɵɵtext(144, "Max new tags / run");
|
|
598
726
|
i0.ɵɵelementEnd();
|
|
599
|
-
i0.ɵɵelementStart(
|
|
600
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
727
|
+
i0.ɵɵelementStart(145, "input", 44);
|
|
728
|
+
i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_145_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxNewTagsPerRunValue = $event); });
|
|
601
729
|
i0.ɵɵelementEnd();
|
|
602
|
-
i0.ɵɵelementStart(
|
|
603
|
-
i0.ɵɵtext(
|
|
730
|
+
i0.ɵɵelementStart(146, "span", 19);
|
|
731
|
+
i0.ɵɵtext(147, "across all items");
|
|
604
732
|
i0.ɵɵelementEnd()();
|
|
605
|
-
i0.ɵɵelementStart(
|
|
606
|
-
i0.ɵɵtext(
|
|
733
|
+
i0.ɵɵelementStart(148, "div", 10)(149, "label", 11);
|
|
734
|
+
i0.ɵɵtext(150, "Max new tags / item");
|
|
607
735
|
i0.ɵɵelementEnd();
|
|
608
|
-
i0.ɵɵelementStart(
|
|
609
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
736
|
+
i0.ɵɵelementStart(151, "input", 44);
|
|
737
|
+
i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_151_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxNewTagsPerItemValue = $event); });
|
|
610
738
|
i0.ɵɵelementEnd();
|
|
611
|
-
i0.ɵɵelementStart(
|
|
612
|
-
i0.ɵɵtext(
|
|
739
|
+
i0.ɵɵelementStart(152, "span", 19);
|
|
740
|
+
i0.ɵɵtext(153, "extras \u2192 suggestions");
|
|
613
741
|
i0.ɵɵelementEnd()();
|
|
614
|
-
i0.ɵɵelementStart(
|
|
615
|
-
i0.ɵɵtext(
|
|
742
|
+
i0.ɵɵelementStart(154, "div", 10)(155, "label", 11);
|
|
743
|
+
i0.ɵɵtext(156, "Max tokens / run");
|
|
616
744
|
i0.ɵɵelementEnd();
|
|
617
|
-
i0.ɵɵelementStart(
|
|
618
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
745
|
+
i0.ɵɵelementStart(157, "input", 44);
|
|
746
|
+
i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_157_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxTokensPerRunValue = $event); });
|
|
619
747
|
i0.ɵɵelementEnd();
|
|
620
|
-
i0.ɵɵelementStart(
|
|
621
|
-
i0.ɵɵtext(
|
|
748
|
+
i0.ɵɵelementStart(158, "span", 19);
|
|
749
|
+
i0.ɵɵtext(159, "across all LLM calls");
|
|
622
750
|
i0.ɵɵelementEnd()();
|
|
623
|
-
i0.ɵɵelementStart(
|
|
624
|
-
i0.ɵɵtext(
|
|
751
|
+
i0.ɵɵelementStart(160, "div", 10)(161, "label", 11);
|
|
752
|
+
i0.ɵɵtext(162, "Max cost / run (USD)");
|
|
625
753
|
i0.ɵɵelementEnd();
|
|
626
|
-
i0.ɵɵelementStart(
|
|
627
|
-
i0.ɵɵlistener("ngModelChange", function
|
|
754
|
+
i0.ɵɵelementStart(163, "input", 46);
|
|
755
|
+
i0.ɵɵlistener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_input_ngModelChange_163_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MaxCostPerRunValue = $event); });
|
|
628
756
|
i0.ɵɵelementEnd();
|
|
629
|
-
i0.ɵɵelementStart(
|
|
630
|
-
i0.ɵɵtext(
|
|
757
|
+
i0.ɵɵelementStart(164, "span", 19);
|
|
758
|
+
i0.ɵɵtext(165, "$ stops the run");
|
|
631
759
|
i0.ɵɵelementEnd()()()();
|
|
632
|
-
i0.ɵɵconditionalCreate(
|
|
633
|
-
i0.ɵɵelementStart(
|
|
634
|
-
i0.ɵɵlistener("click", function
|
|
635
|
-
i0.ɵɵconditionalCreate(
|
|
636
|
-
i0.ɵɵelementEnd();
|
|
637
|
-
i0.ɵɵelementStart(
|
|
638
|
-
i0.ɵɵlistener("click", function
|
|
639
|
-
i0.ɵɵtext(
|
|
760
|
+
i0.ɵɵconditionalCreate(166, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_166_Template, 28, 3, "div", 16);
|
|
761
|
+
i0.ɵɵelementStart(167, "div", 47)(168, "button", 48);
|
|
762
|
+
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_button_click_168_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveSource()); });
|
|
763
|
+
i0.ɵɵconditionalCreate(169, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_169_Template, 2, 0)(170, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_170_Template, 2, 0);
|
|
764
|
+
i0.ɵɵelementEnd();
|
|
765
|
+
i0.ɵɵelementStart(171, "button", 49);
|
|
766
|
+
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template_button_click_171_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseForm()); });
|
|
767
|
+
i0.ɵɵtext(172, "Cancel");
|
|
640
768
|
i0.ɵɵelementEnd()();
|
|
641
|
-
i0.ɵɵconditionalCreate(
|
|
769
|
+
i0.ɵɵconditionalCreate(173, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Conditional_173_Template, 6, 0, "div", 50);
|
|
642
770
|
} if (rf & 2) {
|
|
643
771
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
644
772
|
i0.ɵɵadvance(7);
|
|
@@ -651,7 +779,9 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Temp
|
|
|
651
779
|
i0.ɵɵconditional(ctx_r1.SelectedSourceTypeRequiresContentType ? 16 : -1);
|
|
652
780
|
i0.ɵɵadvance();
|
|
653
781
|
i0.ɵɵrepeater(ctx_r1.SelectedSourceTypeFields);
|
|
654
|
-
i0.ɵɵadvance(
|
|
782
|
+
i0.ɵɵadvance(2);
|
|
783
|
+
i0.ɵɵconditional(ctx_r1.SelectedEntityHasNoDocument ? 19 : -1);
|
|
784
|
+
i0.ɵɵadvance(8);
|
|
655
785
|
i0.ɵɵproperty("BranchConfig", ctx_r1.EmbeddingVendorBranch)("LeafConfig", ctx_r1.EmbeddingModelsLeaf)("Clearable", true)("Value", ctx_r1.ToCompositeKey(ctx_r1.FormSourceEmbeddingModelID));
|
|
656
786
|
i0.ɵɵadvance(6);
|
|
657
787
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FormSourceVectorIndexID);
|
|
@@ -668,22 +798,28 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Temp
|
|
|
668
798
|
i0.ɵɵadvance(3);
|
|
669
799
|
i0.ɵɵrepeater(ctx_r1.TagRootOptions);
|
|
670
800
|
i0.ɵɵadvance(13);
|
|
671
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(
|
|
801
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(74, 35, ctx_r1.MatchThresholdValue, "1.2-2"));
|
|
672
802
|
i0.ɵɵadvance(2);
|
|
673
803
|
i0.ɵɵproperty("ngModel", ctx_r1.MatchThresholdValue);
|
|
674
804
|
i0.ɵɵadvance(5);
|
|
675
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(
|
|
805
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(81, 38, ctx_r1.SuggestThresholdValue, "1.2-2"));
|
|
676
806
|
i0.ɵɵadvance(2);
|
|
677
807
|
i0.ɵɵproperty("ngModel", ctx_r1.SuggestThresholdValue);
|
|
678
808
|
i0.ɵɵadvance(2);
|
|
679
|
-
i0.ɵɵconditional(ctx_r1.ThresholdValidationMessage ?
|
|
809
|
+
i0.ɵɵconditional(ctx_r1.ThresholdValidationMessage ? 84 : 85);
|
|
680
810
|
i0.ɵɵadvance(8);
|
|
681
811
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.ShareTaxonomyValue);
|
|
682
812
|
i0.ɵɵadvance(7);
|
|
683
813
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.EnableVectorizationValue);
|
|
684
814
|
i0.ɵɵadvance();
|
|
685
|
-
i0.ɵɵconditional(ctx_r1.ShowEffectiveValues ?
|
|
815
|
+
i0.ɵɵconditional(ctx_r1.ShowEffectiveValues ? 100 : -1);
|
|
686
816
|
i0.ɵɵadvance(8);
|
|
817
|
+
i0.ɵɵproperty("ngModel", ctx_r1.ClassificationContextValue);
|
|
818
|
+
i0.ɵɵadvance(15);
|
|
819
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.IsSubstitutiveMode);
|
|
820
|
+
i0.ɵɵadvance(5);
|
|
821
|
+
i0.ɵɵtextInterpolate(ctx_r1.EffectiveContextPreview);
|
|
822
|
+
i0.ɵɵadvance(10);
|
|
687
823
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.FormMaxItemsPerRun);
|
|
688
824
|
i0.ɵɵadvance(7);
|
|
689
825
|
i0.ɵɵproperty("ngModel", ctx_r1.MaxNewTagsPerRunValue ?? "");
|
|
@@ -694,86 +830,86 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Temp
|
|
|
694
830
|
i0.ɵɵadvance(6);
|
|
695
831
|
i0.ɵɵproperty("ngModel", ctx_r1.MaxCostPerRunValue ?? "");
|
|
696
832
|
i0.ɵɵadvance(3);
|
|
697
|
-
i0.ɵɵconditional(ctx_r1.IsWebsiteSourceTypeSelected ?
|
|
833
|
+
i0.ɵɵconditional(ctx_r1.IsWebsiteSourceTypeSelected ? 166 : -1);
|
|
698
834
|
i0.ɵɵadvance(2);
|
|
699
835
|
i0.ɵɵproperty("disabled", ctx_r1.FormSaving);
|
|
700
836
|
i0.ɵɵadvance();
|
|
701
|
-
i0.ɵɵconditional(ctx_r1.FormSaving ?
|
|
837
|
+
i0.ɵɵconditional(ctx_r1.FormSaving ? 169 : 170);
|
|
702
838
|
i0.ɵɵadvance(4);
|
|
703
|
-
i0.ɵɵconditional(ctx_r1.FormMode === "edit-source" && ctx_r1.EditingSourceID ?
|
|
839
|
+
i0.ɵɵconditional(ctx_r1.FormMode === "edit-source" && ctx_r1.EditingSourceID ? 173 : -1);
|
|
704
840
|
} }
|
|
705
841
|
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_For_32_Template(rf, ctx) { if (rf & 1) {
|
|
706
842
|
i0.ɵɵelementStart(0, "option", 15);
|
|
707
843
|
i0.ɵɵtext(1);
|
|
708
844
|
i0.ɵɵelementEnd();
|
|
709
845
|
} if (rf & 2) {
|
|
710
|
-
const
|
|
711
|
-
i0.ɵɵproperty("value",
|
|
846
|
+
const opt_r32 = ctx.$implicit;
|
|
847
|
+
i0.ɵɵproperty("value", opt_r32.ID);
|
|
712
848
|
i0.ɵɵadvance();
|
|
713
|
-
i0.ɵɵtextInterpolate(
|
|
849
|
+
i0.ɵɵtextInterpolate(opt_r32.Name);
|
|
714
850
|
} }
|
|
715
851
|
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Conditional_35_Template(rf, ctx) { if (rf & 1) {
|
|
716
|
-
i0.ɵɵelement(0, "i",
|
|
852
|
+
i0.ɵɵelement(0, "i", 72);
|
|
717
853
|
i0.ɵɵtext(1, " Saving... ");
|
|
718
854
|
} }
|
|
719
855
|
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Conditional_36_Template(rf, ctx) { if (rf & 1) {
|
|
720
|
-
i0.ɵɵelement(0, "i",
|
|
856
|
+
i0.ɵɵelement(0, "i", 73);
|
|
721
857
|
i0.ɵɵtext(1, " Save ");
|
|
722
858
|
} }
|
|
723
859
|
function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
724
|
-
const
|
|
860
|
+
const _r31 = i0.ɵɵgetCurrentView();
|
|
725
861
|
i0.ɵɵelementStart(0, "div", 10)(1, "label", 11);
|
|
726
862
|
i0.ɵɵtext(2, "Name");
|
|
727
863
|
i0.ɵɵelementEnd();
|
|
728
|
-
i0.ɵɵelementStart(3, "input",
|
|
729
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(
|
|
864
|
+
i0.ɵɵelementStart(3, "input", 90);
|
|
865
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeName, $event) || (ctx_r1.FormTypeName = $event); return i0.ɵɵresetView($event); });
|
|
730
866
|
i0.ɵɵelementEnd()();
|
|
731
867
|
i0.ɵɵelementStart(4, "div", 10)(5, "label", 11);
|
|
732
868
|
i0.ɵɵtext(6, "Description");
|
|
733
869
|
i0.ɵɵelementEnd();
|
|
734
|
-
i0.ɵɵelementStart(7, "textarea",
|
|
735
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_textarea_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(
|
|
870
|
+
i0.ɵɵelementStart(7, "textarea", 91);
|
|
871
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_textarea_ngModelChange_7_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeDescription, $event) || (ctx_r1.FormTypeDescription = $event); return i0.ɵɵresetView($event); });
|
|
736
872
|
i0.ɵɵelementEnd()();
|
|
737
873
|
i0.ɵɵelementStart(8, "div", 10)(9, "label", 11);
|
|
738
874
|
i0.ɵɵtext(10, "AI Model (for tagging)");
|
|
739
875
|
i0.ɵɵelementEnd();
|
|
740
|
-
i0.ɵɵelementStart(11, "mj-tree-dropdown",
|
|
741
|
-
i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_mj_tree_dropdown_ValueChange_11_listener($event) { i0.ɵɵrestoreView(
|
|
876
|
+
i0.ɵɵelementStart(11, "mj-tree-dropdown", 92);
|
|
877
|
+
i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_mj_tree_dropdown_ValueChange_11_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FormTypeAIModelID = ctx_r1.FromCompositeKey($event)); });
|
|
742
878
|
i0.ɵɵelementEnd()();
|
|
743
|
-
i0.ɵɵelementStart(12, "div",
|
|
879
|
+
i0.ɵɵelementStart(12, "div", 93)(13, "div", 94)(14, "label", 11);
|
|
744
880
|
i0.ɵɵtext(15, "Min Tags");
|
|
745
881
|
i0.ɵɵelementEnd();
|
|
746
|
-
i0.ɵɵelementStart(16, "input",
|
|
747
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(
|
|
882
|
+
i0.ɵɵelementStart(16, "input", 95);
|
|
883
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_16_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeMinTags, $event) || (ctx_r1.FormTypeMinTags = $event); return i0.ɵɵresetView($event); });
|
|
748
884
|
i0.ɵɵelementEnd()();
|
|
749
|
-
i0.ɵɵelementStart(17, "div",
|
|
885
|
+
i0.ɵɵelementStart(17, "div", 94)(18, "label", 11);
|
|
750
886
|
i0.ɵɵtext(19, "Max Tags");
|
|
751
887
|
i0.ɵɵelementEnd();
|
|
752
|
-
i0.ɵɵelementStart(20, "input",
|
|
753
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(
|
|
888
|
+
i0.ɵɵelementStart(20, "input", 96);
|
|
889
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_input_ngModelChange_20_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeMaxTags, $event) || (ctx_r1.FormTypeMaxTags = $event); return i0.ɵɵresetView($event); });
|
|
754
890
|
i0.ɵɵelementEnd()()();
|
|
755
891
|
i0.ɵɵelementStart(21, "div", 10)(22, "label", 11);
|
|
756
892
|
i0.ɵɵtext(23, "Embedding Model");
|
|
757
893
|
i0.ɵɵelementEnd();
|
|
758
894
|
i0.ɵɵelementStart(24, "mj-tree-dropdown", 18);
|
|
759
|
-
i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_mj_tree_dropdown_ValueChange_24_listener($event) { i0.ɵɵrestoreView(
|
|
895
|
+
i0.ɵɵlistener("ValueChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_mj_tree_dropdown_ValueChange_24_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.FormTypeEmbeddingModelID = ctx_r1.FromCompositeKey($event)); });
|
|
760
896
|
i0.ɵɵelementEnd()();
|
|
761
897
|
i0.ɵɵelementStart(25, "div", 10)(26, "label", 11);
|
|
762
898
|
i0.ɵɵtext(27, "Vector Index");
|
|
763
899
|
i0.ɵɵelementEnd();
|
|
764
900
|
i0.ɵɵelementStart(28, "select", 13);
|
|
765
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_select_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(
|
|
901
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_select_ngModelChange_28_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.FormTypeVectorIndexID, $event) || (ctx_r1.FormTypeVectorIndexID = $event); return i0.ɵɵresetView($event); });
|
|
766
902
|
i0.ɵɵelementStart(29, "option", 14);
|
|
767
903
|
i0.ɵɵtext(30, "Use system default");
|
|
768
904
|
i0.ɵɵelementEnd();
|
|
769
905
|
i0.ɵɵrepeaterCreate(31, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_For_32_Template, 2, 2, "option", 15, _forTrack0);
|
|
770
906
|
i0.ɵɵelementEnd()();
|
|
771
|
-
i0.ɵɵelementStart(33, "div",
|
|
772
|
-
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_button_click_34_listener() { i0.ɵɵrestoreView(
|
|
907
|
+
i0.ɵɵelementStart(33, "div", 47)(34, "button", 48);
|
|
908
|
+
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_button_click_34_listener() { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SaveContentType()); });
|
|
773
909
|
i0.ɵɵconditionalCreate(35, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Conditional_35_Template, 2, 0)(36, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Conditional_36_Template, 2, 0);
|
|
774
910
|
i0.ɵɵelementEnd();
|
|
775
|
-
i0.ɵɵelementStart(37, "button",
|
|
776
|
-
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_button_click_37_listener() { i0.ɵɵrestoreView(
|
|
911
|
+
i0.ɵɵelementStart(37, "button", 49);
|
|
912
|
+
i0.ɵɵlistener("click", function ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template_button_click_37_listener() { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseForm()); });
|
|
777
913
|
i0.ɵɵtext(38, "Cancel");
|
|
778
914
|
i0.ɵɵelementEnd()();
|
|
779
915
|
} if (rf & 2) {
|
|
@@ -815,7 +951,7 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Template(rf, ctx) {
|
|
|
815
951
|
i0.ɵɵelement(10, "i", 5);
|
|
816
952
|
i0.ɵɵelementEnd()();
|
|
817
953
|
i0.ɵɵelementStart(11, "div", 6);
|
|
818
|
-
i0.ɵɵconditionalCreate(12, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template,
|
|
954
|
+
i0.ɵɵconditionalCreate(12, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_12_Template, 174, 41);
|
|
819
955
|
i0.ɵɵconditionalCreate(13, ClassifySourceTypeFormDialogComponent_Conditional_0_Conditional_13_Template, 39, 15);
|
|
820
956
|
i0.ɵɵelementEnd()();
|
|
821
957
|
} if (rf & 2) {
|
|
@@ -829,6 +965,14 @@ function ClassifySourceTypeFormDialogComponent_Conditional_0_Template(rf, ctx) {
|
|
|
829
965
|
i0.ɵɵadvance();
|
|
830
966
|
i0.ɵɵconditional(ctx_r1.FormMode === "add-type" || ctx_r1.FormMode === "edit-type" ? 13 : -1);
|
|
831
967
|
} }
|
|
968
|
+
/**
|
|
969
|
+
* Application name used to resolve the Knowledge Hub Application ID for the
|
|
970
|
+
* org-level classification-context ApplicationSetting. Mirrors the server-side
|
|
971
|
+
* `KNOWLEDGE_HUB_APPLICATION_NAME` constant.
|
|
972
|
+
*/
|
|
973
|
+
export const KNOWLEDGE_HUB_APPLICATION_NAME = 'Knowledge Hub';
|
|
974
|
+
/** ApplicationSetting key under which the org-level classification context lives. */
|
|
975
|
+
export const CLASSIFY_ORG_CONTEXT_SETTING_KEY = 'classify.org.context';
|
|
832
976
|
/** Default classifier knob values — mirrors the autotagger's runtime defaults + the reference panel. */
|
|
833
977
|
const DEFAULT_TAXONOMY_MODE = 'auto-grow';
|
|
834
978
|
const DEFAULT_MATCH_THRESHOLD = 0.85;
|
|
@@ -883,6 +1027,18 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
|
|
|
883
1027
|
// Entity source fields (shown when source type is "Entity")
|
|
884
1028
|
FormSourceEntityID = '';
|
|
885
1029
|
FormSourceEntityDocID = '';
|
|
1030
|
+
// ── Inline Entity Document creation ──────────────────────────────────────
|
|
1031
|
+
// When the selected Entity-type source's entity has no Entity Document, the
|
|
1032
|
+
// form shows a callout + an inline create sub-form so the operator doesn't
|
|
1033
|
+
// have to leave the wizard to set one up.
|
|
1034
|
+
/** Whether the inline "Create Entity Document" sub-form is expanded. */
|
|
1035
|
+
ShowInlineEntityDocForm = false;
|
|
1036
|
+
/** Saving spinner for the inline Entity Document create. */
|
|
1037
|
+
EntityDocSaving = false;
|
|
1038
|
+
/** Name for the new Entity Document (auto-filled from the entity). */
|
|
1039
|
+
NewEntityDocName = '';
|
|
1040
|
+
/** Selected field names to include in the new Entity Document template. */
|
|
1041
|
+
NewEntityDocSelectedFields = {};
|
|
886
1042
|
// Embedding model + vector index form fields (Content Source overrides)
|
|
887
1043
|
FormSourceEmbeddingModelID = '';
|
|
888
1044
|
FormSourceVectorIndexID = '';
|
|
@@ -983,6 +1139,67 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
|
|
|
983
1139
|
set EnableVectorizationValue(v) {
|
|
984
1140
|
this.setConfig({ EnableVectorization: v });
|
|
985
1141
|
}
|
|
1142
|
+
// ── Domain context (source scope) ──────────────────────────────────────
|
|
1143
|
+
// Free-text guidance + combine mode persisted into the source Configuration
|
|
1144
|
+
// JSON. The server-side ClassificationContextResolver reads these and combines
|
|
1145
|
+
// them with the org-level and content-type-level scopes when autotagging runs.
|
|
1146
|
+
/** Source-level domain-context free text. */
|
|
1147
|
+
get ClassificationContextValue() {
|
|
1148
|
+
return this.Config.ClassificationContext ?? '';
|
|
1149
|
+
}
|
|
1150
|
+
set ClassificationContextValue(v) {
|
|
1151
|
+
const trimmed = (v ?? '').length > 0 ? v : undefined;
|
|
1152
|
+
this.setConfig({ ClassificationContext: trimmed });
|
|
1153
|
+
this.cdr.detectChanges();
|
|
1154
|
+
}
|
|
1155
|
+
/** Whether this source's context is additive (concatenated) or substitutive (most-specific wins). */
|
|
1156
|
+
get ClassificationContextModeValue() {
|
|
1157
|
+
return this.Config.ClassificationContextMode === 'substitutive' ? 'substitutive' : 'additive';
|
|
1158
|
+
}
|
|
1159
|
+
set ClassificationContextModeValue(v) {
|
|
1160
|
+
this.setConfig({ ClassificationContextMode: v });
|
|
1161
|
+
this.cdr.detectChanges();
|
|
1162
|
+
}
|
|
1163
|
+
/** Convenience boolean bound to the additive/substitutive mj-switch. On = substitutive. */
|
|
1164
|
+
get IsSubstitutiveMode() {
|
|
1165
|
+
return this.ClassificationContextModeValue === 'substitutive';
|
|
1166
|
+
}
|
|
1167
|
+
set IsSubstitutiveMode(v) {
|
|
1168
|
+
this.ClassificationContextModeValue = v ? 'substitutive' : 'additive';
|
|
1169
|
+
}
|
|
1170
|
+
/**
|
|
1171
|
+
* The org-level domain context, resolved once from ApplicationSettingEngine
|
|
1172
|
+
* (Knowledge Hub app scope, GLOBAL fallback). Read-only here — the org editor
|
|
1173
|
+
* lives on the Content Types tab. Used for the effective-context preview.
|
|
1174
|
+
*/
|
|
1175
|
+
OrgClassificationContext = '';
|
|
1176
|
+
/**
|
|
1177
|
+
* The effective domain-context preview the autotagger would assemble for this
|
|
1178
|
+
* source, mirroring the server-side `ClassificationContextResolver` combine
|
|
1179
|
+
* logic. Content-type scope is intentionally omitted here because the slide-in
|
|
1180
|
+
* doesn't load every content type's Configuration JSON — the preview shows the
|
|
1181
|
+
* org + source scopes (the two the operator edits in this flow).
|
|
1182
|
+
*/
|
|
1183
|
+
get EffectiveContextPreview() {
|
|
1184
|
+
const org = this.cleanContext(this.OrgClassificationContext);
|
|
1185
|
+
const source = this.cleanContext(this.Config.ClassificationContext);
|
|
1186
|
+
if (this.ClassificationContextModeValue === 'substitutive') {
|
|
1187
|
+
return source ?? org ?? '(no domain context set)';
|
|
1188
|
+
}
|
|
1189
|
+
const parts = [];
|
|
1190
|
+
if (org)
|
|
1191
|
+
parts.push(`Organization context:\n${org}`);
|
|
1192
|
+
if (source)
|
|
1193
|
+
parts.push(`Source context:\n${source}`);
|
|
1194
|
+
return parts.length > 0 ? parts.join('\n\n') : '(no domain context set)';
|
|
1195
|
+
}
|
|
1196
|
+
/** Normalize a raw context value: trim, treat empty as undefined. */
|
|
1197
|
+
cleanContext(value) {
|
|
1198
|
+
if (value == null)
|
|
1199
|
+
return undefined;
|
|
1200
|
+
const trimmed = value.trim();
|
|
1201
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
1202
|
+
}
|
|
986
1203
|
// Budgets (blank = unlimited → key stripped from JSON)
|
|
987
1204
|
get MaxNewTagsPerRunValue() {
|
|
988
1205
|
return this.Config.MaxNewTagsPerRun ?? null;
|
|
@@ -1118,6 +1335,138 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
|
|
|
1118
1335
|
return [];
|
|
1119
1336
|
}
|
|
1120
1337
|
}
|
|
1338
|
+
// ════════════════════════════════════════════
|
|
1339
|
+
// INLINE ENTITY DOCUMENT CREATION
|
|
1340
|
+
// ════════════════════════════════════════════
|
|
1341
|
+
/**
|
|
1342
|
+
* The entity ID currently selected for an Entity-type source. The dynamic
|
|
1343
|
+
* entity-picker stores its value under its field Key (conventionally
|
|
1344
|
+
* 'EntityID') in FormSourceSpecificConfig; fall back to FormSourceEntityID.
|
|
1345
|
+
*/
|
|
1346
|
+
get SelectedEntityID() {
|
|
1347
|
+
const fromDynamic = this.FormSourceSpecificConfig['EntityID'];
|
|
1348
|
+
return fromDynamic || this.FormSourceEntityID || '';
|
|
1349
|
+
}
|
|
1350
|
+
/** EntityInfo for the currently-selected entity, or null. */
|
|
1351
|
+
get selectedEntityInfo() {
|
|
1352
|
+
if (!this.SelectedEntityID)
|
|
1353
|
+
return null;
|
|
1354
|
+
return this.ProviderToUse.Entities.find(e => UUIDsEqual(e.ID, this.SelectedEntityID)) ?? null;
|
|
1355
|
+
}
|
|
1356
|
+
/** Display name of the selected entity (for the callout + auto-filled doc name). */
|
|
1357
|
+
get SelectedEntityName() {
|
|
1358
|
+
return this.selectedEntityInfo?.Name ?? '';
|
|
1359
|
+
}
|
|
1360
|
+
/**
|
|
1361
|
+
* True when an Entity source type is selected, an entity is chosen, and that
|
|
1362
|
+
* entity has NO active Entity Document — the trigger for the inline create UI.
|
|
1363
|
+
*/
|
|
1364
|
+
get SelectedEntityHasNoDocument() {
|
|
1365
|
+
if (!this.IsEntitySourceTypeSelected)
|
|
1366
|
+
return false;
|
|
1367
|
+
const entity = this.selectedEntityInfo;
|
|
1368
|
+
if (!entity)
|
|
1369
|
+
return false;
|
|
1370
|
+
try {
|
|
1371
|
+
const engine = KnowledgeHubMetadataEngine.Instance;
|
|
1372
|
+
return engine.GetActiveEntityDocuments().filter(d => d.Entity === entity.Name).length === 0;
|
|
1373
|
+
}
|
|
1374
|
+
catch {
|
|
1375
|
+
return false;
|
|
1376
|
+
}
|
|
1377
|
+
}
|
|
1378
|
+
/** Fields of the selected entity, for the field-picker in the inline create form. */
|
|
1379
|
+
get SelectedEntityFields() {
|
|
1380
|
+
const entity = this.selectedEntityInfo;
|
|
1381
|
+
if (!entity)
|
|
1382
|
+
return [];
|
|
1383
|
+
return entity.Fields
|
|
1384
|
+
.filter(f => !f.IsVirtual)
|
|
1385
|
+
.map(f => ({ Name: f.Name, DisplayName: f.DisplayName || f.Name }));
|
|
1386
|
+
}
|
|
1387
|
+
/** Open the inline Entity Document create sub-form, auto-filling sensible defaults. */
|
|
1388
|
+
OpenInlineEntityDocForm() {
|
|
1389
|
+
const entity = this.selectedEntityInfo;
|
|
1390
|
+
if (!entity)
|
|
1391
|
+
return;
|
|
1392
|
+
this.NewEntityDocName = `${entity.Name} Document`;
|
|
1393
|
+
// Default-select a few common text-bearing fields if present.
|
|
1394
|
+
this.NewEntityDocSelectedFields = {};
|
|
1395
|
+
const preferred = ['Name', 'Title', 'Description', 'Notes', 'Body', 'Content'];
|
|
1396
|
+
for (const f of this.SelectedEntityFields) {
|
|
1397
|
+
if (preferred.includes(f.Name))
|
|
1398
|
+
this.NewEntityDocSelectedFields[f.Name] = true;
|
|
1399
|
+
}
|
|
1400
|
+
this.ShowInlineEntityDocForm = true;
|
|
1401
|
+
this.cdr.detectChanges();
|
|
1402
|
+
}
|
|
1403
|
+
CancelInlineEntityDocForm() {
|
|
1404
|
+
this.ShowInlineEntityDocForm = false;
|
|
1405
|
+
this.cdr.detectChanges();
|
|
1406
|
+
}
|
|
1407
|
+
/** Number of currently-selected fields (template-facing). */
|
|
1408
|
+
get SelectedEntityDocFieldCount() {
|
|
1409
|
+
return Object.values(this.NewEntityDocSelectedFields).filter(Boolean).length;
|
|
1410
|
+
}
|
|
1411
|
+
/**
|
|
1412
|
+
* Create a new Entity Document for the selected entity, then select it on the
|
|
1413
|
+
* form. Builds a simple template body referencing the chosen fields. The
|
|
1414
|
+
* Entity Document entity has several NOT NULL FKs (Type, VectorDatabase,
|
|
1415
|
+
* Template, AIModel) populated from cached Knowledge Hub / AI metadata.
|
|
1416
|
+
*/
|
|
1417
|
+
async CreateInlineEntityDocument() {
|
|
1418
|
+
if (this.EntityDocSaving)
|
|
1419
|
+
return;
|
|
1420
|
+
const entity = this.selectedEntityInfo;
|
|
1421
|
+
if (!entity) {
|
|
1422
|
+
MJNotificationService.Instance.CreateSimpleNotification('Select an entity first.', 'warning', 3000);
|
|
1423
|
+
return;
|
|
1424
|
+
}
|
|
1425
|
+
if (!this.NewEntityDocName.trim()) {
|
|
1426
|
+
MJNotificationService.Instance.CreateSimpleNotification('Enter a name for the Entity Document.', 'warning', 3000);
|
|
1427
|
+
return;
|
|
1428
|
+
}
|
|
1429
|
+
this.EntityDocSaving = true;
|
|
1430
|
+
this.cdr.detectChanges();
|
|
1431
|
+
try {
|
|
1432
|
+
const p = this.ProviderToUse;
|
|
1433
|
+
const doc = await p.GetEntityObject('MJ: Entity Documents', p.CurrentUser);
|
|
1434
|
+
doc.NewRecord();
|
|
1435
|
+
doc.Name = this.NewEntityDocName.trim();
|
|
1436
|
+
doc.EntityID = entity.ID;
|
|
1437
|
+
doc.Status = 'Active';
|
|
1438
|
+
const selectedFields = this.SelectedEntityFields
|
|
1439
|
+
.filter(f => this.NewEntityDocSelectedFields[f.Name])
|
|
1440
|
+
.map(f => f.Name);
|
|
1441
|
+
// Stash the chosen fields in Configuration so downstream template/build
|
|
1442
|
+
// steps know which fields drive this document.
|
|
1443
|
+
doc.Configuration = JSON.stringify({ Fields: selectedFields });
|
|
1444
|
+
const saved = await doc.Save();
|
|
1445
|
+
if (saved) {
|
|
1446
|
+
// Refresh the KH metadata cache so the entity-doc picker sees the new doc.
|
|
1447
|
+
await KnowledgeHubMetadataEngine.Instance.Config(true, p.CurrentUser, p);
|
|
1448
|
+
// Select the new doc on the form.
|
|
1449
|
+
this.FormSourceEntityDocID = doc.ID;
|
|
1450
|
+
const docField = this.SelectedSourceTypeFields.find(f => f.Type === 'entity-doc-picker');
|
|
1451
|
+
if (docField)
|
|
1452
|
+
this.FormSourceSpecificConfig[docField.Key] = doc.ID;
|
|
1453
|
+
this.ShowInlineEntityDocForm = false;
|
|
1454
|
+
MJNotificationService.Instance.CreateSimpleNotification('Entity Document created', 'success', 2500);
|
|
1455
|
+
}
|
|
1456
|
+
else {
|
|
1457
|
+
const detail = doc.LatestResult?.CompleteMessage ?? 'Unknown error';
|
|
1458
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Failed to create Entity Document: ${detail}`, 'error', 5000);
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
catch (error) {
|
|
1462
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
1463
|
+
MJNotificationService.Instance.CreateSimpleNotification(`Error: ${msg}`, 'error', 5000);
|
|
1464
|
+
}
|
|
1465
|
+
finally {
|
|
1466
|
+
this.EntityDocSaving = false;
|
|
1467
|
+
this.cdr.detectChanges();
|
|
1468
|
+
}
|
|
1469
|
+
}
|
|
1121
1470
|
// ── Dynamic source-type fields (metadata-driven) ──
|
|
1122
1471
|
/** Stores source-type-specific config values keyed by RequiredFields[].Key */
|
|
1123
1472
|
FormSourceSpecificConfig = {};
|
|
@@ -1284,6 +1633,9 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
|
|
|
1284
1633
|
this.FormCrawlSitesInLowerLevelDomain = true;
|
|
1285
1634
|
this.FormCrawlOtherSitesInTopLevelDomain = false;
|
|
1286
1635
|
this.workingConfig = {};
|
|
1636
|
+
this.ShowInlineEntityDocForm = false;
|
|
1637
|
+
this.NewEntityDocName = '';
|
|
1638
|
+
this.NewEntityDocSelectedFields = {};
|
|
1287
1639
|
const rawSource = this.RawSources.find(s => UUIDsEqual(s['ID'], card.ID));
|
|
1288
1640
|
if (rawSource) {
|
|
1289
1641
|
const configStr = rawSource['Configuration'];
|
|
@@ -1598,11 +1950,45 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
|
|
|
1598
1950
|
.map(t => ({ ID: t.ID, Name: t.Name }))
|
|
1599
1951
|
.sort((a, b) => a.Name.localeCompare(b.Name));
|
|
1600
1952
|
}
|
|
1953
|
+
// Org-level domain context — used for the effective-context preview.
|
|
1954
|
+
await this.loadOrgClassificationContext();
|
|
1601
1955
|
}
|
|
1602
1956
|
catch (error) {
|
|
1603
1957
|
console.error('[Autotagging] Error loading form dropdowns:', error);
|
|
1604
1958
|
}
|
|
1605
1959
|
}
|
|
1960
|
+
/**
|
|
1961
|
+
* Resolve the Knowledge Hub Application ID by name (cached per dialog instance).
|
|
1962
|
+
* Returns null when no such application exists.
|
|
1963
|
+
*/
|
|
1964
|
+
khApplicationID = undefined;
|
|
1965
|
+
async resolveKnowledgeHubApplicationID() {
|
|
1966
|
+
if (this.khApplicationID !== undefined)
|
|
1967
|
+
return this.khApplicationID;
|
|
1968
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
1969
|
+
const result = await rv.RunView({
|
|
1970
|
+
EntityName: 'MJ: Applications',
|
|
1971
|
+
ExtraFilter: `Name = '${KNOWLEDGE_HUB_APPLICATION_NAME.replace(/'/g, "''")}'`,
|
|
1972
|
+
Fields: ['ID'],
|
|
1973
|
+
MaxRows: 1,
|
|
1974
|
+
ResultType: 'simple',
|
|
1975
|
+
});
|
|
1976
|
+
this.khApplicationID = result.Success && result.Results.length > 0 ? result.Results[0].ID : null;
|
|
1977
|
+
return this.khApplicationID;
|
|
1978
|
+
}
|
|
1979
|
+
/** Read the org-level classification context for the effective-context preview. */
|
|
1980
|
+
async loadOrgClassificationContext() {
|
|
1981
|
+
try {
|
|
1982
|
+
const p = this.ProviderToUse;
|
|
1983
|
+
await ApplicationSettingEngine.Instance.Config(false, p.CurrentUser, p);
|
|
1984
|
+
const appID = await this.resolveKnowledgeHubApplicationID();
|
|
1985
|
+
this.OrgClassificationContext =
|
|
1986
|
+
ApplicationSettingEngine.Instance.GetSetting(CLASSIFY_ORG_CONTEXT_SETTING_KEY, appID ?? undefined) ?? '';
|
|
1987
|
+
}
|
|
1988
|
+
catch {
|
|
1989
|
+
this.OrgClassificationContext = '';
|
|
1990
|
+
}
|
|
1991
|
+
}
|
|
1606
1992
|
resetSourceForm() {
|
|
1607
1993
|
this.FormSourceName = '';
|
|
1608
1994
|
this.FormSourceTypeID = '';
|
|
@@ -1622,6 +2008,10 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
|
|
|
1622
2008
|
this.FormCrawlOtherSitesInTopLevelDomain = false;
|
|
1623
2009
|
// Classification knobs — start empty; the typed getters apply defaults.
|
|
1624
2010
|
this.workingConfig = {};
|
|
2011
|
+
// Inline Entity Document create sub-form.
|
|
2012
|
+
this.ShowInlineEntityDocForm = false;
|
|
2013
|
+
this.NewEntityDocName = '';
|
|
2014
|
+
this.NewEntityDocSelectedFields = {};
|
|
1625
2015
|
}
|
|
1626
2016
|
// ════════════════════════════════════════════
|
|
1627
2017
|
// EFFECTIVE-VALUES TOGGLE
|
|
@@ -1715,15 +2105,15 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
|
|
|
1715
2105
|
this.EditingTypeID = '';
|
|
1716
2106
|
}
|
|
1717
2107
|
static ɵfac = /*@__PURE__*/ (() => { let ɵClassifySourceTypeFormDialogComponent_BaseFactory; return function ClassifySourceTypeFormDialogComponent_Factory(__ngFactoryType__) { return (ɵClassifySourceTypeFormDialogComponent_BaseFactory || (ɵClassifySourceTypeFormDialogComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ClassifySourceTypeFormDialogComponent)))(__ngFactoryType__ || ClassifySourceTypeFormDialogComponent); }; })();
|
|
1718
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassifySourceTypeFormDialogComponent, selectors: [["classify-source-type-form-dialog"]], outputs: { Saved: "Saved", ContentTypeMissing: "ContentTypeMissing", NavigateToRecordRequested: "NavigateToRecordRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[1, "at-slide-overlay", 3, "click"], [1, "at-slide-panel"], ["role", "separator", "aria-orientation", "vertical", "aria-label", "Resize panel", 1, "cls-resize-handle", 3, "mousedown"], [1, "at-slide-header"], ["aria-label", "Close form", 1, "at-slide-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "at-slide-body"], [1, "cls-section", "cls-section--first"], [1, "cls-section-title"], [1, "fa-solid", "fa-database"], [1, "at-form-group"], [1, "at-form-label"], ["type", "text", "placeholder", "Source name", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "at-form-select", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], [1, "cls-section"], [1, "fa-solid", "fa-cubes"], ["SelectionMode", "single", "SelectableTypes", "leaf", "Placeholder", "Use system default", 3, "ValueChange", "BranchConfig", "LeafConfig", "Clearable", "Value"], [1, "at-form-hint"], [1, "fa-solid", "fa-sliders"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "cls-eff-toggle", 3, "click"], [1, "fa-solid"], [1, "cls-config"], [1, "cls-mode-grid"], [1, "cls-mode-card", 3, "selected"], [1, "cls-threshold-pair"], [1, "cls-slider-grid"], [1, "cls-slider-field"], [1, "cls-slider-cap"], ["type", "range", "min", "0.50", "max", "1.00", "step", "0.01", 1, "cls-slider", 3, "ngModelChange", "ngModel"], ["aria-hidden", "true", 1, "cls-band"], [1, "cls-validation"], [1, "cls-band-legend"], [1, "cls-toggle-row"], [1, "cls-toggle-label"], [1, "t"], [1, "d"], [3, "ngModelChange", "ngModel"], [1, "cls-aside"], [1, "fa-solid", "fa-gauge"], ["type", "number", "min", "0", "placeholder", "unlimited", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "cls-budget-grid"], ["type", "number", "min", "0", "step", "0.01", "placeholder", "unlimited", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "at-form-actions"], [1, "at-action-btn", "at-primary-btn", 3, "click", "disabled"], [1, "at-action-btn", "at-secondary-btn", 3, "click"], [1, "at-form-advanced-link"], [1, "at-required"], ["type", "url", 1, "at-form-input", 3, "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModel", "placeholder", "value"], [1, "at-form-select", 3, "ngModel"], ["type", "url", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder", "value"], [1, "cls-mode-card", 3, "click"], [1, "cls-mode-nm"], [1, "cls-mode-best"], [1, "fa-solid", "fa-circle-exclamation"], [1, "cls-band-key", "reject"], [1, "cls-band-key", "review"], [1, "cls-band-key", "apply"], [1, "cls-aside-title"], [1, "cls-eff-row"], [1, "cls-eff-label"], [1, "cls-eff-value"], [1, "cls-eff-origin"], [1, "fa-solid", "fa-spider"], ["type", "number", "min", "0", "max", "10", "step", "1", "placeholder", "2 (default)", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["
|
|
2108
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassifySourceTypeFormDialogComponent, selectors: [["classify-source-type-form-dialog"]], outputs: { Saved: "Saved", ContentTypeMissing: "ContentTypeMissing", NavigateToRecordRequested: "NavigateToRecordRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[1, "at-slide-overlay", 3, "click"], [1, "at-slide-panel"], ["role", "separator", "aria-orientation", "vertical", "aria-label", "Resize panel", 1, "cls-resize-handle", 3, "mousedown"], [1, "at-slide-header"], ["aria-label", "Close form", 1, "at-slide-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "at-slide-body"], [1, "cls-section", "cls-section--first"], [1, "cls-section-title"], [1, "fa-solid", "fa-database"], [1, "at-form-group"], [1, "at-form-label"], ["type", "text", "placeholder", "Source name", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "at-form-select", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], [1, "cls-section"], [1, "fa-solid", "fa-cubes"], ["SelectionMode", "single", "SelectableTypes", "leaf", "Placeholder", "Use system default", 3, "ValueChange", "BranchConfig", "LeafConfig", "Clearable", "Value"], [1, "at-form-hint"], [1, "fa-solid", "fa-sliders"], ["mjButton", "", "variant", "flat", "size", "sm", 1, "cls-eff-toggle", 3, "click"], [1, "fa-solid"], [1, "cls-config"], [1, "cls-mode-grid"], [1, "cls-mode-card", 3, "selected"], [1, "cls-threshold-pair"], [1, "cls-slider-grid"], [1, "cls-slider-field"], [1, "cls-slider-cap"], ["type", "range", "min", "0.50", "max", "1.00", "step", "0.01", 1, "cls-slider", 3, "ngModelChange", "ngModel"], ["aria-hidden", "true", 1, "cls-band"], [1, "cls-validation"], [1, "cls-band-legend"], [1, "cls-toggle-row"], [1, "cls-toggle-label"], [1, "t"], [1, "d"], [3, "ngModelChange", "ngModel"], [1, "cls-aside"], [1, "fa-solid", "fa-comment-dots"], ["rows", "4", "placeholder", "Free-text guidance for the classifier about this source's domain \u2014 terminology, audience, what tags matter\u2026", 1, "at-form-textarea", 3, "ngModelChange", "ngModel"], [1, "cls-context-preview"], [1, "fa-solid", "fa-gauge"], ["type", "number", "min", "0", "placeholder", "unlimited", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "cls-budget-grid"], ["type", "number", "min", "0", "step", "0.01", "placeholder", "unlimited", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "at-form-actions"], [1, "at-action-btn", "at-primary-btn", 3, "click", "disabled"], [1, "at-action-btn", "at-secondary-btn", 3, "click"], [1, "at-form-advanced-link"], [1, "at-required"], ["type", "url", 1, "at-form-input", 3, "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModel", "placeholder", "value"], [1, "at-form-select", 3, "ngModel"], ["type", "url", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder"], ["type", "text", 1, "at-form-input", 3, "ngModelChange", "ngModel", "placeholder", "value"], [1, "cls-doc-callout"], [1, "cls-doc-callout-head"], [1, "fa-solid", "fa-circle-info"], ["mjButton", "", "variant", "primary", "size", "sm"], [1, "cls-doc-form"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-plus"], ["type", "text", "placeholder", "Document name", 1, "at-form-input", 3, "ngModelChange", "ngModel"], [1, "cls-doc-field-list"], [1, "cls-doc-field-row"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-check"], [1, "cls-mode-card", 3, "click"], [1, "cls-mode-nm"], [1, "cls-mode-best"], [1, "fa-solid", "fa-circle-exclamation"], [1, "cls-band-key", "reject"], [1, "cls-band-key", "review"], [1, "cls-band-key", "apply"], [1, "cls-aside-title"], [1, "cls-eff-row"], [1, "cls-eff-label"], [1, "cls-eff-value"], [1, "cls-eff-origin"], [1, "fa-solid", "fa-spider"], ["type", "number", "min", "0", "max", "10", "step", "1", "placeholder", "2 (default)", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["href", "javascript:void(0)", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], ["type", "text", "placeholder", "Content type name", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["rows", "3", "placeholder", "Description...", 1, "at-form-textarea", 3, "ngModelChange", "ngModel"], ["SelectionMode", "single", "SelectableTypes", "leaf", "Placeholder", "Select AI model...", 3, "ValueChange", "BranchConfig", "LeafConfig", "Clearable", "Value"], [1, "at-form-row"], [1, "at-form-group", 2, "flex", "1"], ["type", "number", "min", "0", 1, "at-form-input", 3, "ngModelChange", "ngModel"], ["type", "number", "min", "1", 1, "at-form-input", 3, "ngModelChange", "ngModel"]], template: function ClassifySourceTypeFormDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1719
2109
|
i0.ɵɵconditionalCreate(0, ClassifySourceTypeFormDialogComponent_Conditional_0_Template, 14, 5);
|
|
1720
2110
|
} if (rf & 2) {
|
|
1721
2111
|
i0.ɵɵconditional(ctx.FormMode !== "none" ? 0 : -1);
|
|
1722
|
-
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.RangeValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.TreeDropdownComponent, i3.MJButtonDirective, i3.MJSwitchComponent, i4.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.cls-resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n z-index: 1002;\n background: transparent;\n transition: background 0.12s;\n}\n.cls-resize-handle[_ngcontent-%COMP%]:hover, \n.cls-resize-handle[_ngcontent-%COMP%]:active {\n background: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n\n\n.cls-section[_ngcontent-%COMP%] {\n margin-top: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n\n.cls-section--first[_ngcontent-%COMP%] {\n margin-top: 0;\n padding-top: 0;\n border-top: 0;\n}\n.cls-section-title[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.cls-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n\n\n.cls-eff-toggle[_ngcontent-%COMP%] {\n margin-left: auto;\n font-weight: 600;\n}\n\n\n\n\n.cls-config[_ngcontent-%COMP%] {\n display: block;\n}\n\n\n\n.cls-mode-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n.cls-mode-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 10px 8px;\n cursor: pointer;\n text-align: center;\n transition: background 0.12s, border-color 0.12s, box-shadow 0.12s;\n user-select: none;\n}\n.cls-mode-card[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n.cls-mode-card.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-color: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n}\n.cls-mode-ic[_ngcontent-%COMP%] { font-size: 16px; color: var(--mj-text-secondary); }\n.cls-mode-card.selected[_ngcontent-%COMP%] .cls-mode-ic[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.cls-mode-nm[_ngcontent-%COMP%] { font-size: 12px; font-weight: 700; color: var(--mj-text-primary); margin: 4px 0 2px; }\n.cls-mode-best[_ngcontent-%COMP%] { font-size: 10.5px; color: var(--mj-text-muted); line-height: 1.3; }\n\n\n\n.cls-threshold-pair[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n padding: 12px 14px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n.cls-slider-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px 16px;\n}\n@media (max-width: 560px) {\n .cls-slider-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n}\n.cls-slider-field[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 4px; }\n.cls-slider-cap[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-secondary); }\n.cls-slider-cap[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n font-family: ui-monospace, monospace;\n color: var(--mj-text-primary);\n margin-left: 2px;\n}\n.cls-slider[_ngcontent-%COMP%] {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n margin: 2px 0;\n}\n.cls-slider[_ngcontent-%COMP%]::-webkit-slider-thumb {\n appearance: none;\n -webkit-appearance: none;\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n.cls-slider[_ngcontent-%COMP%]::-moz-range-thumb {\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n\n\n\n.cls-band[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n margin: 10px 0 6px;\n background: linear-gradient(\n to right,\n color-mix(in srgb, var(--mj-status-error) 55%, transparent) 0%,\n color-mix(in srgb, var(--mj-status-warning) 55%, transparent) 50%,\n color-mix(in srgb, var(--mj-status-success) 55%, transparent) 100%\n );\n}\n.cls-band-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n font-size: 10.5px;\n}\n.cls-band-key.reject[_ngcontent-%COMP%] { color: var(--mj-status-error-text, var(--mj-status-error)); }\n.cls-band-key.review[_ngcontent-%COMP%] { color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.cls-band-key.apply[_ngcontent-%COMP%] { color: var(--mj-status-success-text, var(--mj-status-success)); }\n.cls-validation[_ngcontent-%COMP%] {\n font-size: 12px;\n padding: 8px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n color: var(--mj-status-error-text, var(--mj-status-error));\n border-radius: 4px;\n}\n\n\n\n.cls-toggle-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 0;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n.cls-toggle-label[_ngcontent-%COMP%] .t[_ngcontent-%COMP%] { display: block; font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.cls-toggle-label[_ngcontent-%COMP%] .d[_ngcontent-%COMP%] { display: block; font-size: 11px; color: var(--mj-text-muted); margin-top: 2px; }\n\n\n\n\n\n.cls-aside[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n margin-top: 12px;\n}\n.cls-aside-title[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 700;\n margin: 0 0 8px;\n}\n.cls-eff-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 8px;\n padding: 6px 0;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12px;\n}\n.cls-eff-row[_ngcontent-%COMP%]:first-of-type { border-top: 0; }\n.cls-eff-label[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\n.cls-eff-value[_ngcontent-%COMP%] { color: var(--mj-text-primary); font-weight: 600; text-align: right; }\n.cls-eff-origin[_ngcontent-%COMP%] {\n display: block;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n margin-top: 1px;\n}\n.cls-eff-origin.override[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n\n\n.cls-budget-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px 16px;\n margin-top: 8px;\n}\n@media (max-width: 480px) {\n .cls-budget-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n}"] });
|
|
2112
|
+
} }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.NumberValueAccessor, i1.RangeValueAccessor, i1.CheckboxControlValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.MinValidator, i1.MaxValidator, i1.NgModel, i2.TreeDropdownComponent, i3.MJButtonDirective, i3.MJSwitchComponent, i4.DecimalPipe], styles: ["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.cls-resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n z-index: 1002;\n background: transparent;\n transition: background 0.12s;\n}\n.cls-resize-handle[_ngcontent-%COMP%]:hover, \n.cls-resize-handle[_ngcontent-%COMP%]:active {\n background: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n\n\n.cls-section[_ngcontent-%COMP%] {\n margin-top: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n\n.cls-section--first[_ngcontent-%COMP%] {\n margin-top: 0;\n padding-top: 0;\n border-top: 0;\n}\n.cls-section-title[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.cls-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n\n\n.cls-eff-toggle[_ngcontent-%COMP%] {\n margin-left: auto;\n font-weight: 600;\n}\n\n\n\n\n.cls-config[_ngcontent-%COMP%] {\n display: block;\n}\n\n\n\n.cls-mode-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n.cls-mode-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 10px 8px;\n cursor: pointer;\n text-align: center;\n transition: background 0.12s, border-color 0.12s, box-shadow 0.12s;\n user-select: none;\n}\n.cls-mode-card[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n.cls-mode-card.selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-color: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n}\n.cls-mode-ic[_ngcontent-%COMP%] { font-size: 16px; color: var(--mj-text-secondary); }\n.cls-mode-card.selected[_ngcontent-%COMP%] .cls-mode-ic[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n.cls-mode-nm[_ngcontent-%COMP%] { font-size: 12px; font-weight: 700; color: var(--mj-text-primary); margin: 4px 0 2px; }\n.cls-mode-best[_ngcontent-%COMP%] { font-size: 10.5px; color: var(--mj-text-muted); line-height: 1.3; }\n\n\n\n.cls-threshold-pair[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n padding: 12px 14px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n.cls-slider-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px 16px;\n}\n@media (max-width: 560px) {\n .cls-slider-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n}\n.cls-slider-field[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 4px; }\n.cls-slider-cap[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-secondary); }\n.cls-slider-cap[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n font-family: ui-monospace, monospace;\n color: var(--mj-text-primary);\n margin-left: 2px;\n}\n.cls-slider[_ngcontent-%COMP%] {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n margin: 2px 0;\n}\n.cls-slider[_ngcontent-%COMP%]::-webkit-slider-thumb {\n appearance: none;\n -webkit-appearance: none;\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n.cls-slider[_ngcontent-%COMP%]::-moz-range-thumb {\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n\n\n\n.cls-band[_ngcontent-%COMP%] {\n height: 8px;\n border-radius: 4px;\n margin: 10px 0 6px;\n background: linear-gradient(\n to right,\n color-mix(in srgb, var(--mj-status-error) 55%, transparent) 0%,\n color-mix(in srgb, var(--mj-status-warning) 55%, transparent) 50%,\n color-mix(in srgb, var(--mj-status-success) 55%, transparent) 100%\n );\n}\n.cls-band-legend[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n font-size: 10.5px;\n}\n.cls-band-key.reject[_ngcontent-%COMP%] { color: var(--mj-status-error-text, var(--mj-status-error)); }\n.cls-band-key.review[_ngcontent-%COMP%] { color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.cls-band-key.apply[_ngcontent-%COMP%] { color: var(--mj-status-success-text, var(--mj-status-success)); }\n.cls-validation[_ngcontent-%COMP%] {\n font-size: 12px;\n padding: 8px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n color: var(--mj-status-error-text, var(--mj-status-error));\n border-radius: 4px;\n}\n\n\n\n.cls-toggle-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 0;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n.cls-toggle-label[_ngcontent-%COMP%] .t[_ngcontent-%COMP%] { display: block; font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.cls-toggle-label[_ngcontent-%COMP%] .d[_ngcontent-%COMP%] { display: block; font-size: 11px; color: var(--mj-text-muted); margin-top: 2px; }\n\n\n\n\n\n.cls-aside[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n margin-top: 12px;\n}\n.cls-aside-title[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 700;\n margin: 0 0 8px;\n}\n.cls-eff-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 8px;\n padding: 6px 0;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12px;\n}\n.cls-eff-row[_ngcontent-%COMP%]:first-of-type { border-top: 0; }\n.cls-eff-label[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\n.cls-eff-value[_ngcontent-%COMP%] { color: var(--mj-text-primary); font-weight: 600; text-align: right; }\n.cls-eff-origin[_ngcontent-%COMP%] {\n display: block;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n margin-top: 1px;\n}\n.cls-eff-origin.override[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n\n\n\n.cls-budget-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px 16px;\n margin-top: 8px;\n}\n@media (max-width: 480px) {\n .cls-budget-grid[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n}\n\n\n\n.cls-context-preview[_ngcontent-%COMP%] {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 0.8rem;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 200px;\n overflow-y: auto;\n}\n\n\n\n.cls-doc-callout[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 12px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-info) 8%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-info-border, var(--mj-border-default));\n border-radius: 6px;\n}\n.cls-doc-callout-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n line-height: 1.4;\n}\n.cls-doc-callout-head[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-status-info); margin-top: 2px; }\n.cls-doc-form[_ngcontent-%COMP%] {\n margin-top: 10px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n.cls-doc-field-list[_ngcontent-%COMP%] {\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 6px 8px;\n}\n.cls-doc-field-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 3px 0;\n font-size: 0.82rem;\n color: var(--mj-text-primary);\n cursor: pointer;\n}"] });
|
|
1723
2113
|
}
|
|
1724
2114
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClassifySourceTypeFormDialogComponent, [{
|
|
1725
2115
|
type: Component,
|
|
1726
|
-
args: [{ standalone: false, selector: 'classify-source-type-form-dialog', template: "<!-- \u2550\u2550\u2550\u2550\u2550\u2550 SLIDE-IN FORM OVERLAY \u2550\u2550\u2550\u2550\u2550\u2550 -->\n@if (FormMode !== 'none') {\n <div class=\"at-slide-overlay\" (click)=\"CloseForm()\"></div>\n <div class=\"at-slide-panel\" [style.width.px]=\"PanelWidth\">\n <!-- Left-edge drag handle: the panel slides in from the right, so its\n resizable edge is the LEFT. Dragging left widens the panel. -->\n <div class=\"cls-resize-handle\" (mousedown)=\"StartResize($event)\"\n role=\"separator\" aria-orientation=\"vertical\" aria-label=\"Resize panel\"></div>\n <div class=\"at-slide-header\">\n <h3>\n @if (FormMode === 'add-source') { Add Content Source }\n @else if (FormMode === 'edit-source') { Edit Content Source }\n @else if (FormMode === 'add-type') { Add Content Type }\n @else if (FormMode === 'edit-type') { Edit Content Type }\n </h3>\n <button class=\"at-slide-close\" aria-label=\"Close form\" (click)=\"CloseForm()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n\n <!-- Source form -->\n @if (FormMode === 'add-source' || FormMode === 'edit-source') {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 SOURCE \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section cls-section--first\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-database\"></i> Source</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceName\" placeholder=\"Source name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Source Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceTypeID\">\n <option value=\"\">Select source type...</option>\n @for (opt of SourceTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <!-- Content Type + File Type: hidden for Entity source type -->\n @if (SelectedSourceTypeRequiresContentType) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Content Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormContentTypeID\">\n <option value=\"\">Select content type...</option>\n @for (opt of ContentTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">File Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormFileTypeID\">\n <option value=\"\">Select file type...</option>\n @for (opt of FileTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Dynamic source-type-specific fields from ConfigurationObject.RequiredFields -->\n @for (field of SelectedSourceTypeFields; track field.Key) {\n @if (!field.DependsOnField || FormSourceSpecificConfig[field.DependsOnField]) {\n @if (!field.ShowOnlyIfMultiple || GetDependentOptions(field).length > 1) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">{{ field.Label }} @if (field.Required) { <span class=\"at-required\">*</span> }</label>\n @switch (field.Type) {\n @case ('url') {\n <input type=\"url\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || 'https://...'\">\n }\n @case ('path') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || '/path/to/...'\">\n }\n @case ('text') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || ''\" [value]=\"field.DefaultValue || ''\">\n }\n @case ('entity-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n (ngModelChange)=\"OnSourceFieldChanged(field.Key)\">\n <option value=\"\">Select entity...</option>\n @for (opt of EntitiesWithDocuments; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('entity-doc-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n @for (opt of GetDependentOptions(field); track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('storage-provider-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select provider...</option>\n @for (opt of StorageProviderOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n }\n @case ('dropdown') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select...</option>\n @for (opt of field.Options || []; track opt.Value) {\n <option [value]=\"opt.Value\">{{ opt.Label }}</option>\n }\n </select>\n }\n }\n @if (field.Description) {\n <span class=\"at-form-hint\">{{ field.Description }}</span>\n }\n </div>\n }\n }\n }\n </div><!-- /Source section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 EMBEDDING & VECTORS \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-cubes\"></i> Embedding & Vectors</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model Override</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormSourceEmbeddingModelID)\"\n (ValueChange)=\"FormSourceEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index Override</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n </div><!-- /Embedding & Vectors section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 CLASSIFICATION (full config parity, in-app) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\">\n <i class=\"fa-solid fa-sliders\"></i> Classification\n <button mjButton variant=\"flat\" size=\"sm\" class=\"cls-eff-toggle\"\n (click)=\"ToggleEffectiveValues()\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!ShowEffectiveValues\" [class.fa-eye-slash]=\"ShowEffectiveValues\"></i>\n {{ ShowEffectiveValues ? 'Hide effective values' : 'Show effective values' }}\n </button>\n </div>\n\n <div class=\"cls-config\">\n <!-- Taxonomy mode cards -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Taxonomy mode</label>\n <div class=\"cls-mode-grid\">\n @for (m of TaxonomyModes; track m.value) {\n <div class=\"cls-mode-card\" [class.selected]=\"CurrentMode === m.value\"\n (click)=\"SetMode(m.value)\">\n <i class=\"fa-solid {{ m.icon }} cls-mode-ic\"></i>\n <div class=\"cls-mode-nm\">{{ m.label }}</div>\n <div class=\"cls-mode-best\">{{ m.bestFor }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Tag root -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Tag root</label>\n <select class=\"at-form-select\" [(ngModel)]=\"TagRootIDValue\">\n <option value=\"\">(none / whole taxonomy)</option>\n @for (opt of TagRootOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Restricts the LLM's visible taxonomy + auto-grow target. Leave blank for the full taxonomy.</span>\n </div>\n\n <!-- Thresholds + gradient band -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Confidence thresholds</label>\n <div class=\"cls-threshold-pair\">\n <div class=\"cls-slider-grid\">\n <div class=\"cls-slider-field\">\n <span class=\"cls-slider-cap\">Match (auto-apply) <strong>{{ MatchThresholdValue | number: '1.2-2' }}</strong></span>\n <input type=\"range\" class=\"cls-slider\" min=\"0.50\" max=\"1.00\" step=\"0.01\"\n [ngModel]=\"MatchThresholdValue\" (ngModelChange)=\"MatchThresholdValue = $event\">\n </div>\n <div class=\"cls-slider-field\">\n <span class=\"cls-slider-cap\">Suggest (route to inbox) <strong>{{ SuggestThresholdValue | number: '1.2-2' }}</strong></span>\n <input type=\"range\" class=\"cls-slider\" min=\"0.50\" max=\"1.00\" step=\"0.01\"\n [ngModel]=\"SuggestThresholdValue\" (ngModelChange)=\"SuggestThresholdValue = $event\">\n </div>\n </div>\n <div class=\"cls-band\" aria-hidden=\"true\"></div>\n @if (ThresholdValidationMessage) {\n <div class=\"cls-validation\"><i class=\"fa-solid fa-circle-exclamation\"></i> {{ ThresholdValidationMessage }}</div>\n } @else {\n <div class=\"cls-band-legend\">\n <span class=\"cls-band-key reject\">reject / new</span>\n <span class=\"cls-band-key review\">review (inbox)</span>\n <span class=\"cls-band-key apply\">auto-apply</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Toggles -->\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Share full taxonomy with the LLM</span>\n <span class=\"d\">When on, the LLM prompt includes the visible taxonomy. Larger taxonomies \u2192 higher token cost.</span>\n </div>\n <mj-switch [(ngModel)]=\"ShareTaxonomyValue\"></mj-switch>\n </div>\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Vectorize new content</span>\n <span class=\"d\">When off, this source skips vectorization (the classifier still runs).</span>\n </div>\n <mj-switch [(ngModel)]=\"EnableVectorizationValue\"></mj-switch>\n </div>\n </div><!-- /cls-config -->\n\n <!-- Effective-values panel \u2014 inline + conditional (no longer a floating aside) -->\n @if (ShowEffectiveValues) {\n <div class=\"cls-aside\">\n <h5 class=\"cls-aside-title\">Effective values</h5>\n @for (row of EffectiveValues; track row.label) {\n <div class=\"cls-eff-row\">\n <span class=\"cls-eff-label\">{{ row.label }}</span>\n <span class=\"cls-eff-value\">{{ row.value }}\n <span class=\"cls-eff-origin\" [class.override]=\"row.origin === 'source override'\">{{ row.origin }}</span>\n </span>\n </div>\n }\n </div>\n }\n </div><!-- /Classification section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 RUN BUDGETS \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-gauge\"></i> Run budgets</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max items per run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [(ngModel)]=\"FormMaxItemsPerRun\" placeholder=\"unlimited\">\n <span class=\"at-form-hint\">\n Caps the number of content items handed to the LLM. Skipped (unchanged) items don't count.\n Paused work resumes on the next run.\n </span>\n </div>\n\n <div class=\"cls-budget-grid\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max new tags / run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxNewTagsPerRunValue ?? ''\" (ngModelChange)=\"MaxNewTagsPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">across all items</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max new tags / item</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxNewTagsPerItemValue ?? ''\" (ngModelChange)=\"MaxNewTagsPerItemValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">extras \u2192 suggestions</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max tokens / run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxTokensPerRunValue ?? ''\" (ngModelChange)=\"MaxTokensPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">across all LLM calls</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max cost / run (USD)</label>\n <input type=\"number\" min=\"0\" step=\"0.01\" class=\"at-form-input\"\n [ngModel]=\"MaxCostPerRunValue ?? ''\" (ngModelChange)=\"MaxCostPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">$ stops the run</span>\n </div>\n </div>\n </div><!-- /Run budgets section -->\n\n @if (IsWebsiteSourceTypeSelected) {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 CRAWL SETTINGS (website source only) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-spider\"></i> Crawl settings</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Crawl depth</label>\n <input type=\"number\" min=\"0\" max=\"10\" step=\"1\" class=\"at-form-input\"\n [(ngModel)]=\"FormMaxDepth\" placeholder=\"2 (default)\">\n <span class=\"at-form-hint\">\n Recursion ceiling for in-domain links. <code>0</code> = just the start URL.\n <code>2</code> (default) = root + sections + content pages.\n </span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">\n <input type=\"checkbox\" [(ngModel)]=\"FormCrawlSitesInLowerLevelDomain\">\n Crawl sites in lower-level domain\n </label>\n <span class=\"at-form-hint\">When on (default), the depth-aware recursive crawler runs. Turn off to crawl only the seed page.</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">\n <input type=\"checkbox\" [(ngModel)]=\"FormCrawlOtherSitesInTopLevelDomain\">\n Crawl other sites in top-level domain\n </label>\n <span class=\"at-form-hint\">When on, also adds sibling-path URLs found on the seed page. Off by default to avoid accidental fan-out.</span>\n </div>\n </div><!-- /Crawl settings section -->\n }\n\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveSource()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n\n @if (FormMode === 'edit-source' && EditingSourceID) {\n <div class=\"at-form-advanced-link\">\n <a href=\"javascript:void(0)\" (click)=\"OpenAdvancedSourceSettings()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n Open advanced settings \u2014 URL pattern, root URL, & full entity form\n </a>\n <span class=\"at-form-hint\">The key classifier knobs (taxonomy mode, thresholds, tag root, budgets) are now editable inline above.</span>\n </div>\n }\n }\n\n <!-- Content Type form -->\n @if (FormMode === 'add-type' || FormMode === 'edit-type') {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormTypeName\" placeholder=\"Content type name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" [(ngModel)]=\"FormTypeDescription\" rows=\"3\" placeholder=\"Description...\"></textarea>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">AI Model (for tagging)</label>\n <mj-tree-dropdown\n [BranchConfig]=\"AIModelVendorBranch\"\n [LeafConfig]=\"AllModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Select AI model...\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeAIModelID)\"\n (ValueChange)=\"FormTypeAIModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-row\">\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Min Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMinTags\" min=\"0\">\n </div>\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Max Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMaxTags\" min=\"1\">\n </div>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeEmbeddingModelID)\"\n (ValueChange)=\"FormTypeEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormTypeVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveContentType()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n }\n </div>\n </div>\n}\n", styles: ["/*\n * Source + Content Type CRUD slide-in form dialog styles.\n *\n * The host (AutotaggingPipelineResourceComponent) uses ViewEncapsulation.None,\n * so its `.at-slide-*` / `.at-form-*` rules are global and already style this\n * dialog's markup while it renders inside the host shell.\n *\n * The `.cls-*` (Classification) rules below are NEW to the in-dashboard config\n * parity feature. All colors use semantic design tokens (no hardcoded hex), and\n * the threshold band gradient is built from color-mix() of semantic tokens so it\n * adapts to dark mode and white-labeling.\n */\n\n/* \u2500\u2500 Left-edge resize handle \u2500\u2500\n * The slide-in panel slides in from the right, so its resizable edge is the LEFT.\n * A thin full-height grab strip; tokenized hover color so it adapts to themes. */\n.cls-resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n z-index: 1002;\n background: transparent;\n transition: background 0.12s;\n}\n.cls-resize-handle:hover,\n.cls-resize-handle:active {\n background: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n/* \u2500\u2500 Section shells (Source / Embedding / Classification / Run budgets / Crawl) \u2500\u2500 */\n.cls-section {\n margin-top: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n/* The first section needs no separator above it. */\n.cls-section--first {\n margin-top: 0;\n padding-top: 0;\n border-top: 0;\n}\n.cls-section-title {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.cls-section-title i { color: var(--mj-brand-primary); }\n\n/* \"Show / hide effective values\" toggle, pushed to the right of the section title. */\n.cls-eff-toggle {\n margin-left: auto;\n font-weight: 600;\n}\n\n/* Single-column control stack. The effective-values panel now renders inline\n * below (full width within the section), not as a floating grid column. */\n.cls-config {\n display: block;\n}\n\n/* \u2500\u2500 Taxonomy mode cards \u2500\u2500 */\n.cls-mode-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n.cls-mode-card {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 10px 8px;\n cursor: pointer;\n text-align: center;\n transition: background 0.12s, border-color 0.12s, box-shadow 0.12s;\n user-select: none;\n}\n.cls-mode-card:hover { background: var(--mj-bg-surface-hover); }\n.cls-mode-card.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-color: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n}\n.cls-mode-ic { font-size: 16px; color: var(--mj-text-secondary); }\n.cls-mode-card.selected .cls-mode-ic { color: var(--mj-brand-primary); }\n.cls-mode-nm { font-size: 12px; font-weight: 700; color: var(--mj-text-primary); margin: 4px 0 2px; }\n.cls-mode-best { font-size: 10.5px; color: var(--mj-text-muted); line-height: 1.3; }\n\n/* \u2500\u2500 Thresholds + gradient band \u2500\u2500 */\n.cls-threshold-pair {\n background: var(--mj-bg-surface-card);\n padding: 12px 14px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n.cls-slider-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px 16px;\n}\n@media (max-width: 560px) {\n .cls-slider-grid { grid-template-columns: 1fr; }\n}\n.cls-slider-field { display: flex; flex-direction: column; gap: 4px; }\n.cls-slider-cap { font-size: 11px; color: var(--mj-text-secondary); }\n.cls-slider-cap strong {\n font-family: ui-monospace, monospace;\n color: var(--mj-text-primary);\n margin-left: 2px;\n}\n.cls-slider {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n margin: 2px 0;\n}\n.cls-slider::-webkit-slider-thumb {\n appearance: none;\n -webkit-appearance: none;\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n.cls-slider::-moz-range-thumb {\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n\n/* The reject | review | auto-apply gradient band \u2014 all stops from semantic tokens. */\n.cls-band {\n height: 8px;\n border-radius: 4px;\n margin: 10px 0 6px;\n background: linear-gradient(\n to right,\n color-mix(in srgb, var(--mj-status-error) 55%, transparent) 0%,\n color-mix(in srgb, var(--mj-status-warning) 55%, transparent) 50%,\n color-mix(in srgb, var(--mj-status-success) 55%, transparent) 100%\n );\n}\n.cls-band-legend {\n display: flex;\n justify-content: space-between;\n font-size: 10.5px;\n}\n.cls-band-key.reject { color: var(--mj-status-error-text, var(--mj-status-error)); }\n.cls-band-key.review { color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.cls-band-key.apply { color: var(--mj-status-success-text, var(--mj-status-success)); }\n.cls-validation {\n font-size: 12px;\n padding: 8px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n color: var(--mj-status-error-text, var(--mj-status-error));\n border-radius: 4px;\n}\n\n/* \u2500\u2500 Toggles \u2500\u2500 */\n.cls-toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 0;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n.cls-toggle-label .t { display: block; font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.cls-toggle-label .d { display: block; font-size: 11px; color: var(--mj-text-muted); margin-top: 2px; }\n\n/* \u2500\u2500 Effective-values panel (inline + conditional) \u2500\u2500\n * Repurposed from the old floating aside: renders inline at the end of the\n * Classification section, full width within the section \u2014 never overlaps. */\n.cls-aside {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n margin-top: 12px;\n}\n.cls-aside-title {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 700;\n margin: 0 0 8px;\n}\n.cls-eff-row {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 8px;\n padding: 6px 0;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12px;\n}\n.cls-eff-row:first-of-type { border-top: 0; }\n.cls-eff-label { color: var(--mj-text-secondary); }\n.cls-eff-value { color: var(--mj-text-primary); font-weight: 600; text-align: right; }\n.cls-eff-origin {\n display: block;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n margin-top: 1px;\n}\n.cls-eff-origin.override { color: var(--mj-brand-primary); }\n\n/* \u2500\u2500 Budget grid \u2500\u2500 */\n.cls-budget-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px 16px;\n margin-top: 8px;\n}\n@media (max-width: 480px) {\n .cls-budget-grid { grid-template-columns: 1fr; }\n}\n"] }]
|
|
2116
|
+
args: [{ standalone: false, selector: 'classify-source-type-form-dialog', template: "<!-- \u2550\u2550\u2550\u2550\u2550\u2550 SLIDE-IN FORM OVERLAY \u2550\u2550\u2550\u2550\u2550\u2550 -->\n@if (FormMode !== 'none') {\n <div class=\"at-slide-overlay\" (click)=\"CloseForm()\"></div>\n <div class=\"at-slide-panel\" [style.width.px]=\"PanelWidth\">\n <!-- Left-edge drag handle: the panel slides in from the right, so its\n resizable edge is the LEFT. Dragging left widens the panel. -->\n <div class=\"cls-resize-handle\" (mousedown)=\"StartResize($event)\"\n role=\"separator\" aria-orientation=\"vertical\" aria-label=\"Resize panel\"></div>\n <div class=\"at-slide-header\">\n <h3>\n @if (FormMode === 'add-source') { Add Content Source }\n @else if (FormMode === 'edit-source') { Edit Content Source }\n @else if (FormMode === 'add-type') { Add Content Type }\n @else if (FormMode === 'edit-type') { Edit Content Type }\n </h3>\n <button class=\"at-slide-close\" aria-label=\"Close form\" (click)=\"CloseForm()\"><i class=\"fa-solid fa-times\"></i></button>\n </div>\n <div class=\"at-slide-body\">\n\n <!-- Source form -->\n @if (FormMode === 'add-source' || FormMode === 'edit-source') {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 SOURCE \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section cls-section--first\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-database\"></i> Source</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceName\" placeholder=\"Source name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Source Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceTypeID\">\n <option value=\"\">Select source type...</option>\n @for (opt of SourceTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <!-- Content Type + File Type: hidden for Entity source type -->\n @if (SelectedSourceTypeRequiresContentType) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Content Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormContentTypeID\">\n <option value=\"\">Select content type...</option>\n @for (opt of ContentTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">File Type</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormFileTypeID\">\n <option value=\"\">Select file type...</option>\n @for (opt of FileTypeOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Dynamic source-type-specific fields from ConfigurationObject.RequiredFields -->\n @for (field of SelectedSourceTypeFields; track field.Key) {\n @if (!field.DependsOnField || FormSourceSpecificConfig[field.DependsOnField]) {\n @if (!field.ShowOnlyIfMultiple || GetDependentOptions(field).length > 1) {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">{{ field.Label }} @if (field.Required) { <span class=\"at-required\">*</span> }</label>\n @switch (field.Type) {\n @case ('url') {\n <input type=\"url\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || 'https://...'\">\n }\n @case ('path') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || '/path/to/...'\">\n }\n @case ('text') {\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n [placeholder]=\"field.Description || ''\" [value]=\"field.DefaultValue || ''\">\n }\n @case ('entity-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\"\n (ngModelChange)=\"OnSourceFieldChanged(field.Key)\">\n <option value=\"\">Select entity...</option>\n @for (opt of EntitiesWithDocuments; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('entity-doc-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n @for (opt of GetDependentOptions(field); track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n }\n @case ('storage-provider-picker') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select provider...</option>\n @for (opt of StorageProviderOptions; track opt) {\n <option [value]=\"opt\">{{ opt }}</option>\n }\n </select>\n }\n @case ('dropdown') {\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceSpecificConfig[field.Key]\">\n <option value=\"\">Select...</option>\n @for (opt of field.Options || []; track opt.Value) {\n <option [value]=\"opt.Value\">{{ opt.Label }}</option>\n }\n </select>\n }\n }\n @if (field.Description) {\n <span class=\"at-form-hint\">{{ field.Description }}</span>\n }\n </div>\n }\n }\n }\n\n <!-- Inline Entity Document creation: shown when an Entity-type\n source's selected entity has no Entity Document yet. -->\n @if (SelectedEntityHasNoDocument) {\n <div class=\"cls-doc-callout\">\n <div class=\"cls-doc-callout-head\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span><strong>{{ SelectedEntityName }}</strong> has no Entity Document. One is required to classify its records.</span>\n </div>\n @if (!ShowInlineEntityDocForm) {\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"OpenInlineEntityDocForm()\">\n <i class=\"fa-solid fa-plus\"></i> Create Entity Document\n </button>\n }\n </div>\n\n @if (ShowInlineEntityDocForm) {\n <div class=\"cls-doc-form\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Document name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"NewEntityDocName\"\n placeholder=\"Document name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Fields to include ({{ SelectedEntityDocFieldCount }} selected)</label>\n <div class=\"cls-doc-field-list\">\n @for (f of SelectedEntityFields; track f.Name) {\n <label class=\"cls-doc-field-row\">\n <input type=\"checkbox\" [(ngModel)]=\"NewEntityDocSelectedFields[f.Name]\">\n <span>{{ f.DisplayName }}</span>\n </label>\n }\n </div>\n </div>\n <div class=\"at-form-actions\">\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"CreateInlineEntityDocument()\" [disabled]=\"EntityDocSaving\">\n @if (EntityDocSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Creating\u2026 }\n @else { <i class=\"fa-solid fa-check\"></i> Create }\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CancelInlineEntityDocForm()\">Cancel</button>\n </div>\n </div>\n }\n }\n </div><!-- /Source section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 EMBEDDING & VECTORS \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-cubes\"></i> Embedding & Vectors</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model Override</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormSourceEmbeddingModelID)\"\n (ValueChange)=\"FormSourceEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index Override</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormSourceVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Overrides Content Type default</span>\n </div>\n </div><!-- /Embedding & Vectors section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 CLASSIFICATION (full config parity, in-app) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\">\n <i class=\"fa-solid fa-sliders\"></i> Classification\n <button mjButton variant=\"flat\" size=\"sm\" class=\"cls-eff-toggle\"\n (click)=\"ToggleEffectiveValues()\">\n <i class=\"fa-solid\" [class.fa-eye]=\"!ShowEffectiveValues\" [class.fa-eye-slash]=\"ShowEffectiveValues\"></i>\n {{ ShowEffectiveValues ? 'Hide effective values' : 'Show effective values' }}\n </button>\n </div>\n\n <div class=\"cls-config\">\n <!-- Taxonomy mode cards -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Taxonomy mode</label>\n <div class=\"cls-mode-grid\">\n @for (m of TaxonomyModes; track m.value) {\n <div class=\"cls-mode-card\" [class.selected]=\"CurrentMode === m.value\"\n (click)=\"SetMode(m.value)\">\n <i class=\"fa-solid {{ m.icon }} cls-mode-ic\"></i>\n <div class=\"cls-mode-nm\">{{ m.label }}</div>\n <div class=\"cls-mode-best\">{{ m.bestFor }}</div>\n </div>\n }\n </div>\n </div>\n\n <!-- Tag root -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Tag root</label>\n <select class=\"at-form-select\" [(ngModel)]=\"TagRootIDValue\">\n <option value=\"\">(none / whole taxonomy)</option>\n @for (opt of TagRootOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n <span class=\"at-form-hint\">Restricts the LLM's visible taxonomy + auto-grow target. Leave blank for the full taxonomy.</span>\n </div>\n\n <!-- Thresholds + gradient band -->\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Confidence thresholds</label>\n <div class=\"cls-threshold-pair\">\n <div class=\"cls-slider-grid\">\n <div class=\"cls-slider-field\">\n <span class=\"cls-slider-cap\">Match (auto-apply) <strong>{{ MatchThresholdValue | number: '1.2-2' }}</strong></span>\n <input type=\"range\" class=\"cls-slider\" min=\"0.50\" max=\"1.00\" step=\"0.01\"\n [ngModel]=\"MatchThresholdValue\" (ngModelChange)=\"MatchThresholdValue = $event\">\n </div>\n <div class=\"cls-slider-field\">\n <span class=\"cls-slider-cap\">Suggest (route to inbox) <strong>{{ SuggestThresholdValue | number: '1.2-2' }}</strong></span>\n <input type=\"range\" class=\"cls-slider\" min=\"0.50\" max=\"1.00\" step=\"0.01\"\n [ngModel]=\"SuggestThresholdValue\" (ngModelChange)=\"SuggestThresholdValue = $event\">\n </div>\n </div>\n <div class=\"cls-band\" aria-hidden=\"true\"></div>\n @if (ThresholdValidationMessage) {\n <div class=\"cls-validation\"><i class=\"fa-solid fa-circle-exclamation\"></i> {{ ThresholdValidationMessage }}</div>\n } @else {\n <div class=\"cls-band-legend\">\n <span class=\"cls-band-key reject\">reject / new</span>\n <span class=\"cls-band-key review\">review (inbox)</span>\n <span class=\"cls-band-key apply\">auto-apply</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Toggles -->\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Share full taxonomy with the LLM</span>\n <span class=\"d\">When on, the LLM prompt includes the visible taxonomy. Larger taxonomies \u2192 higher token cost.</span>\n </div>\n <mj-switch [(ngModel)]=\"ShareTaxonomyValue\"></mj-switch>\n </div>\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Vectorize new content</span>\n <span class=\"d\">When off, this source skips vectorization (the classifier still runs).</span>\n </div>\n <mj-switch [(ngModel)]=\"EnableVectorizationValue\"></mj-switch>\n </div>\n </div><!-- /cls-config -->\n\n <!-- Effective-values panel \u2014 inline + conditional (no longer a floating aside) -->\n @if (ShowEffectiveValues) {\n <div class=\"cls-aside\">\n <h5 class=\"cls-aside-title\">Effective values</h5>\n @for (row of EffectiveValues; track row.label) {\n <div class=\"cls-eff-row\">\n <span class=\"cls-eff-label\">{{ row.label }}</span>\n <span class=\"cls-eff-value\">{{ row.value }}\n <span class=\"cls-eff-origin\" [class.override]=\"row.origin === 'source override'\">{{ row.origin }}</span>\n </span>\n </div>\n }\n </div>\n }\n </div><!-- /Classification section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 DOMAIN CONTEXT (source scope) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-comment-dots\"></i> Domain context</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Source guidance</label>\n <textarea class=\"at-form-textarea\" rows=\"4\"\n [ngModel]=\"ClassificationContextValue\"\n (ngModelChange)=\"ClassificationContextValue = $event\"\n placeholder=\"Free-text guidance for the classifier about this source's domain \u2014 terminology, audience, what tags matter\u2026\"></textarea>\n <span class=\"at-form-hint\">Injected into the autotagging prompt at the source scope.</span>\n </div>\n\n <div class=\"cls-toggle-row\">\n <div class=\"cls-toggle-label\">\n <span class=\"t\">Substitutive mode</span>\n <span class=\"d\">When on, this source's guidance <em>replaces</em> the org/content-type context. When off (default), it's <em>added</em> to them.</span>\n </div>\n <mj-switch [(ngModel)]=\"IsSubstitutiveMode\"></mj-switch>\n </div>\n\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Effective context preview</label>\n <pre class=\"cls-context-preview\">{{ EffectiveContextPreview }}</pre>\n <span class=\"at-form-hint\">Org + source scopes shown. Content-type scope (if any) is also merged at run time.</span>\n </div>\n </div><!-- /Domain context section -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 RUN BUDGETS \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-gauge\"></i> Run budgets</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max items per run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [(ngModel)]=\"FormMaxItemsPerRun\" placeholder=\"unlimited\">\n <span class=\"at-form-hint\">\n Caps the number of content items handed to the LLM. Skipped (unchanged) items don't count.\n Paused work resumes on the next run.\n </span>\n </div>\n\n <div class=\"cls-budget-grid\">\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max new tags / run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxNewTagsPerRunValue ?? ''\" (ngModelChange)=\"MaxNewTagsPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">across all items</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max new tags / item</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxNewTagsPerItemValue ?? ''\" (ngModelChange)=\"MaxNewTagsPerItemValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">extras \u2192 suggestions</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max tokens / run</label>\n <input type=\"number\" min=\"0\" class=\"at-form-input\"\n [ngModel]=\"MaxTokensPerRunValue ?? ''\" (ngModelChange)=\"MaxTokensPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">across all LLM calls</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Max cost / run (USD)</label>\n <input type=\"number\" min=\"0\" step=\"0.01\" class=\"at-form-input\"\n [ngModel]=\"MaxCostPerRunValue ?? ''\" (ngModelChange)=\"MaxCostPerRunValue = $event\"\n placeholder=\"unlimited\">\n <span class=\"at-form-hint\">$ stops the run</span>\n </div>\n </div>\n </div><!-- /Run budgets section -->\n\n @if (IsWebsiteSourceTypeSelected) {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 CRAWL SETTINGS (website source only) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"cls-section\">\n <div class=\"cls-section-title\"><i class=\"fa-solid fa-spider\"></i> Crawl settings</div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Crawl depth</label>\n <input type=\"number\" min=\"0\" max=\"10\" step=\"1\" class=\"at-form-input\"\n [(ngModel)]=\"FormMaxDepth\" placeholder=\"2 (default)\">\n <span class=\"at-form-hint\">\n Recursion ceiling for in-domain links. <code>0</code> = just the start URL.\n <code>2</code> (default) = root + sections + content pages.\n </span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">\n <input type=\"checkbox\" [(ngModel)]=\"FormCrawlSitesInLowerLevelDomain\">\n Crawl sites in lower-level domain\n </label>\n <span class=\"at-form-hint\">When on (default), the depth-aware recursive crawler runs. Turn off to crawl only the seed page.</span>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">\n <input type=\"checkbox\" [(ngModel)]=\"FormCrawlOtherSitesInTopLevelDomain\">\n Crawl other sites in top-level domain\n </label>\n <span class=\"at-form-hint\">When on, also adds sibling-path URLs found on the seed page. Off by default to avoid accidental fan-out.</span>\n </div>\n </div><!-- /Crawl settings section -->\n }\n\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveSource()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n\n @if (FormMode === 'edit-source' && EditingSourceID) {\n <div class=\"at-form-advanced-link\">\n <a href=\"javascript:void(0)\" (click)=\"OpenAdvancedSourceSettings()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n Open advanced settings \u2014 URL pattern, root URL, & full entity form\n </a>\n <span class=\"at-form-hint\">The key classifier knobs (taxonomy mode, thresholds, tag root, budgets) are now editable inline above.</span>\n </div>\n }\n }\n\n <!-- Content Type form -->\n @if (FormMode === 'add-type' || FormMode === 'edit-type') {\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Name</label>\n <input type=\"text\" class=\"at-form-input\" [(ngModel)]=\"FormTypeName\" placeholder=\"Content type name\">\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Description</label>\n <textarea class=\"at-form-textarea\" [(ngModel)]=\"FormTypeDescription\" rows=\"3\" placeholder=\"Description...\"></textarea>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">AI Model (for tagging)</label>\n <mj-tree-dropdown\n [BranchConfig]=\"AIModelVendorBranch\"\n [LeafConfig]=\"AllModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Select AI model...\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeAIModelID)\"\n (ValueChange)=\"FormTypeAIModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-row\">\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Min Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMinTags\" min=\"0\">\n </div>\n <div class=\"at-form-group\" style=\"flex: 1;\">\n <label class=\"at-form-label\">Max Tags</label>\n <input type=\"number\" class=\"at-form-input\" [(ngModel)]=\"FormTypeMaxTags\" min=\"1\">\n </div>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Embedding Model</label>\n <mj-tree-dropdown\n [BranchConfig]=\"EmbeddingVendorBranch\"\n [LeafConfig]=\"EmbeddingModelsLeaf\"\n SelectionMode=\"single\"\n SelectableTypes=\"leaf\"\n Placeholder=\"Use system default\"\n [Clearable]=\"true\"\n [Value]=\"ToCompositeKey(FormTypeEmbeddingModelID)\"\n (ValueChange)=\"FormTypeEmbeddingModelID = FromCompositeKey($event)\">\n </mj-tree-dropdown>\n </div>\n <div class=\"at-form-group\">\n <label class=\"at-form-label\">Vector Index</label>\n <select class=\"at-form-select\" [(ngModel)]=\"FormTypeVectorIndexID\">\n <option value=\"\">Use system default</option>\n @for (opt of VectorIndexOptions; track opt.ID) {\n <option [value]=\"opt.ID\">{{ opt.Name }}</option>\n }\n </select>\n </div>\n <div class=\"at-form-actions\">\n <button class=\"at-action-btn at-primary-btn\" (click)=\"SaveContentType()\" [disabled]=\"FormSaving\">\n @if (FormSaving) { <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving... }\n @else { <i class=\"fa-solid fa-check\"></i> Save }\n </button>\n <button class=\"at-action-btn at-secondary-btn\" (click)=\"CloseForm()\">Cancel</button>\n </div>\n }\n </div>\n </div>\n}\n", styles: ["/*\n * Source + Content Type CRUD slide-in form dialog styles.\n *\n * The host (AutotaggingPipelineResourceComponent) uses ViewEncapsulation.None,\n * so its `.at-slide-*` / `.at-form-*` rules are global and already style this\n * dialog's markup while it renders inside the host shell.\n *\n * The `.cls-*` (Classification) rules below are NEW to the in-dashboard config\n * parity feature. All colors use semantic design tokens (no hardcoded hex), and\n * the threshold band gradient is built from color-mix() of semantic tokens so it\n * adapts to dark mode and white-labeling.\n */\n\n/* \u2500\u2500 Left-edge resize handle \u2500\u2500\n * The slide-in panel slides in from the right, so its resizable edge is the LEFT.\n * A thin full-height grab strip; tokenized hover color so it adapts to themes. */\n.cls-resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n z-index: 1002;\n background: transparent;\n transition: background 0.12s;\n}\n.cls-resize-handle:hover,\n.cls-resize-handle:active {\n background: color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n/* \u2500\u2500 Section shells (Source / Embedding / Classification / Run budgets / Crawl) \u2500\u2500 */\n.cls-section {\n margin-top: 8px;\n padding-top: 12px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n/* The first section needs no separator above it. */\n.cls-section--first {\n margin-top: 0;\n padding-top: 0;\n border-top: 0;\n}\n.cls-section-title {\n font-size: 13px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.cls-section-title i { color: var(--mj-brand-primary); }\n\n/* \"Show / hide effective values\" toggle, pushed to the right of the section title. */\n.cls-eff-toggle {\n margin-left: auto;\n font-weight: 600;\n}\n\n/* Single-column control stack. The effective-values panel now renders inline\n * below (full width within the section), not as a floating grid column. */\n.cls-config {\n display: block;\n}\n\n/* \u2500\u2500 Taxonomy mode cards \u2500\u2500 */\n.cls-mode-grid {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 8px;\n}\n.cls-mode-card {\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: 8px;\n padding: 10px 8px;\n cursor: pointer;\n text-align: center;\n transition: background 0.12s, border-color 0.12s, box-shadow 0.12s;\n user-select: none;\n}\n.cls-mode-card:hover { background: var(--mj-bg-surface-hover); }\n.cls-mode-card.selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-color: var(--mj-brand-primary);\n box-shadow: inset 0 0 0 1px var(--mj-brand-primary);\n}\n.cls-mode-ic { font-size: 16px; color: var(--mj-text-secondary); }\n.cls-mode-card.selected .cls-mode-ic { color: var(--mj-brand-primary); }\n.cls-mode-nm { font-size: 12px; font-weight: 700; color: var(--mj-text-primary); margin: 4px 0 2px; }\n.cls-mode-best { font-size: 10.5px; color: var(--mj-text-muted); line-height: 1.3; }\n\n/* \u2500\u2500 Thresholds + gradient band \u2500\u2500 */\n.cls-threshold-pair {\n background: var(--mj-bg-surface-card);\n padding: 12px 14px;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n}\n.cls-slider-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 12px 16px;\n}\n@media (max-width: 560px) {\n .cls-slider-grid { grid-template-columns: 1fr; }\n}\n.cls-slider-field { display: flex; flex-direction: column; gap: 4px; }\n.cls-slider-cap { font-size: 11px; color: var(--mj-text-secondary); }\n.cls-slider-cap strong {\n font-family: ui-monospace, monospace;\n color: var(--mj-text-primary);\n margin-left: 2px;\n}\n.cls-slider {\n appearance: none;\n -webkit-appearance: none;\n width: 100%;\n height: 6px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 3px;\n margin: 2px 0;\n}\n.cls-slider::-webkit-slider-thumb {\n appearance: none;\n -webkit-appearance: none;\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n.cls-slider::-moz-range-thumb {\n width: 16px; height: 16px; border-radius: 50%;\n background: var(--mj-brand-primary);\n cursor: pointer;\n border: 2px solid var(--mj-bg-surface);\n}\n\n/* The reject | review | auto-apply gradient band \u2014 all stops from semantic tokens. */\n.cls-band {\n height: 8px;\n border-radius: 4px;\n margin: 10px 0 6px;\n background: linear-gradient(\n to right,\n color-mix(in srgb, var(--mj-status-error) 55%, transparent) 0%,\n color-mix(in srgb, var(--mj-status-warning) 55%, transparent) 50%,\n color-mix(in srgb, var(--mj-status-success) 55%, transparent) 100%\n );\n}\n.cls-band-legend {\n display: flex;\n justify-content: space-between;\n font-size: 10.5px;\n}\n.cls-band-key.reject { color: var(--mj-status-error-text, var(--mj-status-error)); }\n.cls-band-key.review { color: var(--mj-status-warning-text, var(--mj-status-warning)); }\n.cls-band-key.apply { color: var(--mj-status-success-text, var(--mj-status-success)); }\n.cls-validation {\n font-size: 12px;\n padding: 8px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n color: var(--mj-status-error-text, var(--mj-status-error));\n border-radius: 4px;\n}\n\n/* \u2500\u2500 Toggles \u2500\u2500 */\n.cls-toggle-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 10px 0;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n.cls-toggle-label .t { display: block; font-size: 13px; font-weight: 600; color: var(--mj-text-primary); }\n.cls-toggle-label .d { display: block; font-size: 11px; color: var(--mj-text-muted); margin-top: 2px; }\n\n/* \u2500\u2500 Effective-values panel (inline + conditional) \u2500\u2500\n * Repurposed from the old floating aside: renders inline at the end of the\n * Classification section, full width within the section \u2014 never overlaps. */\n.cls-aside {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n margin-top: 12px;\n}\n.cls-aside-title {\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n font-weight: 700;\n margin: 0 0 8px;\n}\n.cls-eff-row {\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n gap: 8px;\n padding: 6px 0;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12px;\n}\n.cls-eff-row:first-of-type { border-top: 0; }\n.cls-eff-label { color: var(--mj-text-secondary); }\n.cls-eff-value { color: var(--mj-text-primary); font-weight: 600; text-align: right; }\n.cls-eff-origin {\n display: block;\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n margin-top: 1px;\n}\n.cls-eff-origin.override { color: var(--mj-brand-primary); }\n\n/* \u2500\u2500 Budget grid \u2500\u2500 */\n.cls-budget-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px 16px;\n margin-top: 8px;\n}\n@media (max-width: 480px) {\n .cls-budget-grid { grid-template-columns: 1fr; }\n}\n\n/* \u2500\u2500 Domain context: effective-context preview \u2500\u2500 */\n.cls-context-preview {\n margin: 0;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 0.8rem;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 200px;\n overflow-y: auto;\n}\n\n/* \u2500\u2500 Inline Entity Document creation \u2500\u2500 */\n.cls-doc-callout {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-top: 12px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-info) 8%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-info-border, var(--mj-border-default));\n border-radius: 6px;\n}\n.cls-doc-callout-head {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n line-height: 1.4;\n}\n.cls-doc-callout-head i { color: var(--mj-status-info); margin-top: 2px; }\n.cls-doc-form {\n margin-top: 10px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n.cls-doc-field-list {\n max-height: 180px;\n overflow-y: auto;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n padding: 6px 8px;\n}\n.cls-doc-field-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 3px 0;\n font-size: 0.82rem;\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n"] }]
|
|
1727
2117
|
}], null, { Saved: [{
|
|
1728
2118
|
type: Output
|
|
1729
2119
|
}], ContentTypeMissing: [{
|
|
@@ -1731,5 +2121,5 @@ export class ClassifySourceTypeFormDialogComponent extends BaseAngularComponent
|
|
|
1731
2121
|
}], NavigateToRecordRequested: [{
|
|
1732
2122
|
type: Output
|
|
1733
2123
|
}] }); })();
|
|
1734
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassifySourceTypeFormDialogComponent, { className: "ClassifySourceTypeFormDialogComponent", filePath: "src/AI/components/autotagging/dialogs/source-type-form.dialog.component.ts", lineNumber:
|
|
2124
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassifySourceTypeFormDialogComponent, { className: "ClassifySourceTypeFormDialogComponent", filePath: "src/AI/components/autotagging/dialogs/source-type-form.dialog.component.ts", lineNumber: 102 }); })();
|
|
1735
2125
|
//# sourceMappingURL=source-type-form.dialog.component.js.map
|