@memberjunction/ng-dashboards 5.39.0 → 5.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +128 -4
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +548 -145
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  5. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
  6. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
  7. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
  8. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
  9. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
  10. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
  11. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
  12. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
  13. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
  14. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
  15. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
  16. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
  17. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
  18. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
  19. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
  20. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
  21. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
  22. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
  23. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
  24. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
  25. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
  26. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
  27. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
  28. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
  29. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +100 -2
  30. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
  31. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +603 -213
  32. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
  33. package/dist/AI/components/autotagging/shared/classify.format.d.ts +15 -0
  34. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -1
  35. package/dist/AI/components/autotagging/shared/classify.format.js +51 -0
  36. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -1
  37. package/dist/AI/components/autotagging/shared/classify.types.d.ts +43 -0
  38. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -1
  39. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -1
  40. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +38 -1
  41. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -1
  42. package/dist/AI/components/autotagging/tabs/history-tab.component.js +185 -68
  43. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -1
  44. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +10 -1
  45. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -1
  46. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +249 -188
  47. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -1
  48. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +12 -1
  49. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
  50. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +377 -296
  51. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  52. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +8 -0
  53. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -1
  54. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +112 -68
  55. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -1
  56. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +9 -0
  57. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -1
  58. package/dist/AI/components/autotagging/tabs/types-tab.component.js +87 -36
  59. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -1
  60. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
  61. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  62. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -3
  63. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  64. package/dist/AI/components/execution-monitoring.component.js +1 -1
  65. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  66. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
  67. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  68. package/dist/AI/components/tags/tags-resource.component.js +28 -6
  69. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  70. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -0
  71. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  72. package/dist/AI/components/vectors/vector-management-resource.component.js +330 -302
  73. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  74. package/dist/APIKeys/api-applications-panel.component.js +2 -2
  75. package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
  76. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
  77. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  78. package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
  79. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  80. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  81. package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
  82. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  83. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  84. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +12 -9
  85. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  86. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
  87. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  88. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -120
  89. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  90. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
  91. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
  92. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
  93. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
  94. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
  95. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
  96. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
  97. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
  98. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
  99. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
  100. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
  101. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
  102. package/dist/KnowledgeHub/index.d.ts +3 -0
  103. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  104. package/dist/KnowledgeHub/index.js +3 -0
  105. package/dist/KnowledgeHub/index.js.map +1 -1
  106. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  107. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  108. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  109. package/dist/ai-dashboards.module.d.ts +48 -38
  110. package/dist/ai-dashboards.module.d.ts.map +1 -1
  111. package/dist/ai-dashboards.module.js +41 -1
  112. package/dist/ai-dashboards.module.js.map +1 -1
  113. package/dist/data-explorer-dashboards.module.d.ts +12 -14
  114. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  115. package/dist/data-explorer-dashboards.module.js +5 -14
  116. package/dist/data-explorer-dashboards.module.js.map +1 -1
  117. package/dist/public-api.d.ts +3 -0
  118. package/dist/public-api.d.ts.map +1 -1
  119. package/dist/public-api.js +3 -0
  120. package/dist/public-api.js.map +1 -1
  121. package/package.json +57 -55
  122. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
  123. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
  124. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
  125. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
  126. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
  127. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
  128. package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
  129. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @fileoverview Classify · Content Item Drilldown (Phase 4 audit/analytics).
3
+ *
4
+ * Given a content item (by ID), renders an auditable view of:
5
+ * (A) basic rendered content / fields,
6
+ * (B) its tags WITH weight + LLM Reasoning, plus a provenance link to the
7
+ * AI Prompt Run (`AIPromptRunID`) that produced each tag,
8
+ * (C) provenance facts (source / entity doc / prompt run), and
9
+ * (D) a simple audit list (created / last tagged / last embedded).
10
+ *
11
+ * Read-only: all loads use `ResultType:'simple'` + narrow `Fields`. Tags are read
12
+ * from `MJ: Content Item Tags` filtered by `ItemID`. This component owns NO
13
+ * navigation — record-open intents bubble UP via `(OpenRecordRequested)` so the
14
+ * host (which owns NavigationService) opens the full entity form.
15
+ */
16
+ import { EventEmitter } from '@angular/core';
17
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
18
+ import { ClassifyDrilldownTag, ClassifyProvenanceFact, ClassifyAuditEntry } from '../shared/classify.types';
19
+ import { formatWeight, tagFontSize } from '../shared/classify.format';
20
+ import * as i0 from "@angular/core";
21
+ export declare class ClassifyItemDrilldownComponent extends BaseAngularComponent {
22
+ private cdr;
23
+ /** The content item to drill into, by ID. Re-loads on change (setter pattern). */
24
+ private _itemID;
25
+ set ItemID(value: string | null);
26
+ get ItemID(): string | null;
27
+ /** Emitted when the user wants to open a related record (entity + id). */
28
+ OpenRecordRequested: EventEmitter<{
29
+ entityName: string;
30
+ recordID: string;
31
+ }>;
32
+ IsLoading: boolean;
33
+ DisplayName: string;
34
+ SourceName: string;
35
+ URL: string;
36
+ TextPreview: string;
37
+ Tags: ClassifyDrilldownTag[];
38
+ Provenance: ClassifyProvenanceFact[];
39
+ Audit: ClassifyAuditEntry[];
40
+ readonly FormatWeight: typeof formatWeight;
41
+ readonly TagFontSize: typeof tagFontSize;
42
+ /** Max characters of item text shown in the rendered-content preview. */
43
+ private static readonly TEXT_PREVIEW_MAX;
44
+ OpenPromptRun(tag: ClassifyDrilldownTag): void;
45
+ OpenProvenanceRecord(fact: ClassifyProvenanceFact): void;
46
+ OpenItemRecord(): void;
47
+ private reset;
48
+ private load;
49
+ private applyItem;
50
+ private applyTags;
51
+ private buildProvenance;
52
+ private buildAudit;
53
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClassifyItemDrilldownComponent, never>;
54
+ static ɵcmp: i0.ɵɵComponentDeclaration<ClassifyItemDrilldownComponent, "classify-item-drilldown", never, { "ItemID": { "alias": "ItemID"; "required": false; }; }, { "OpenRecordRequested": "OpenRecordRequested"; }, never, never, false, never>;
55
+ }
56
+ //# sourceMappingURL=classify-item-drilldown.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-item-drilldown.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/components/classify-item-drilldown.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAIH,YAAY,EAGf,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EACH,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAqB,YAAY,EAAE,WAAW,EAAc,MAAM,2BAA2B,CAAC;;AAErG,qBAMa,8BAA+B,SAAQ,oBAAoB;IACpE,OAAO,CAAC,GAAG,CAA6B;IAExC,kFAAkF;IAClF,OAAO,CAAC,OAAO,CAAuB;IACtC,IACI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAK9B;IACD,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED,0EAA0E;IAChE,mBAAmB;oBAAkC,MAAM;kBAAY,MAAM;OAAM;IAEtF,SAAS,UAAS;IAClB,WAAW,SAAM;IACjB,UAAU,SAAM;IAChB,GAAG,SAAM;IACT,WAAW,SAAM;IACjB,IAAI,EAAE,oBAAoB,EAAE,CAAM;IAClC,UAAU,EAAE,sBAAsB,EAAE,CAAM;IAC1C,KAAK,EAAE,kBAAkB,EAAE,CAAM;IAGxC,SAAgB,YAAY,sBAAgB;IAC5C,SAAgB,WAAW,qBAAe;IAE1C,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IAEzC,aAAa,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI;IAM9C,oBAAoB,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI;IAMxD,cAAc,IAAI,IAAI;IAM7B,OAAO,CAAC,KAAK;YAWC,IAAI;IAqClB,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,UAAU;yCApKT,8BAA8B;2CAA9B,8BAA8B;CAgL1C"}
@@ -0,0 +1,423 @@
1
+ /**
2
+ * @fileoverview Classify · Content Item Drilldown (Phase 4 audit/analytics).
3
+ *
4
+ * Given a content item (by ID), renders an auditable view of:
5
+ * (A) basic rendered content / fields,
6
+ * (B) its tags WITH weight + LLM Reasoning, plus a provenance link to the
7
+ * AI Prompt Run (`AIPromptRunID`) that produced each tag,
8
+ * (C) provenance facts (source / entity doc / prompt run), and
9
+ * (D) a simple audit list (created / last tagged / last embedded).
10
+ *
11
+ * Read-only: all loads use `ResultType:'simple'` + narrow `Fields`. Tags are read
12
+ * from `MJ: Content Item Tags` filtered by `ItemID`. This component owns NO
13
+ * navigation — record-open intents bubble UP via `(OpenRecordRequested)` so the
14
+ * host (which owns NavigationService) opens the full entity form.
15
+ */
16
+ import { Component, Input, Output, EventEmitter, ChangeDetectorRef, inject, } from '@angular/core';
17
+ import { RunView } from '@memberjunction/core';
18
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
19
+ import { deriveDisplayName, formatWeight, tagFontSize, formatDate } from '../shared/classify.format';
20
+ import * as i0 from "@angular/core";
21
+ import * as i1 from "@memberjunction/ng-shared-generic";
22
+ import * as i2 from "@memberjunction/ng-ui-components";
23
+ const _forTrack0 = ($index, $item) => $item.Label + $item.Value;
24
+ const _forTrack1 = ($index, $item) => $item.Tag + $item.CreatedAt;
25
+ const _forTrack2 = ($index, $item) => $item.Label;
26
+ function ClassifyItemDrilldownComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
27
+ i0.ɵɵelementStart(0, "div", 0);
28
+ i0.ɵɵelement(1, "i", 3);
29
+ i0.ɵɵelementStart(2, "p");
30
+ i0.ɵɵtext(3, "Select an item to inspect its tags, reasoning, and provenance.");
31
+ i0.ɵɵelementEnd()();
32
+ } }
33
+ function ClassifyItemDrilldownComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
34
+ i0.ɵɵelement(0, "mj-loading", 1);
35
+ } }
36
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵelementStart(0, "div", 11)(1, "span", 12);
38
+ i0.ɵɵtext(2, "URL");
39
+ i0.ɵɵelementEnd();
40
+ i0.ɵɵelementStart(3, "a", 23);
41
+ i0.ɵɵtext(4);
42
+ i0.ɵɵelementEnd()();
43
+ } if (rf & 2) {
44
+ const ctx_r1 = i0.ɵɵnextContext(2);
45
+ i0.ɵɵadvance(3);
46
+ i0.ɵɵproperty("href", ctx_r1.URL, i0.ɵɵsanitizeUrl);
47
+ i0.ɵɵadvance();
48
+ i0.ɵɵtextInterpolate(ctx_r1.URL);
49
+ } }
50
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
51
+ i0.ɵɵelementStart(0, "div", 14);
52
+ i0.ɵɵtext(1);
53
+ i0.ɵɵelementEnd();
54
+ } if (rf & 2) {
55
+ const ctx_r1 = i0.ɵɵnextContext(2);
56
+ i0.ɵɵadvance();
57
+ i0.ɵɵtextInterpolate(ctx_r1.TextPreview);
58
+ } }
59
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
60
+ i0.ɵɵelementStart(0, "p", 16);
61
+ i0.ɵɵtext(1, "No tags applied to this item.");
62
+ i0.ɵɵelementEnd();
63
+ } }
64
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
65
+ const _r3 = i0.ɵɵgetCurrentView();
66
+ i0.ɵɵelementStart(0, "button", 31);
67
+ i0.ɵɵlistener("click", function ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_For_2_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const tag_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenPromptRun(tag_r4)); });
68
+ i0.ɵɵelement(1, "i", 32);
69
+ i0.ɵɵtext(2, " Prompt Run ");
70
+ i0.ɵɵelementEnd();
71
+ } }
72
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
73
+ i0.ɵɵelementStart(0, "div", 29);
74
+ i0.ɵɵelement(1, "i", 33);
75
+ i0.ɵɵtext(2);
76
+ i0.ɵɵelementEnd();
77
+ } if (rf & 2) {
78
+ const tag_r4 = i0.ɵɵnextContext().$implicit;
79
+ i0.ɵɵadvance(2);
80
+ i0.ɵɵtextInterpolate1(" ", tag_r4.Reasoning, " ");
81
+ } }
82
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
83
+ i0.ɵɵelementStart(0, "div", 30);
84
+ i0.ɵɵtext(1, "No reasoning captured.");
85
+ i0.ɵɵelementEnd();
86
+ } }
87
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_For_2_Template(rf, ctx) { if (rf & 1) {
88
+ i0.ɵɵelementStart(0, "div", 24)(1, "div", 25)(2, "span", 26);
89
+ i0.ɵɵtext(3);
90
+ i0.ɵɵelementEnd();
91
+ i0.ɵɵelementStart(4, "span", 27);
92
+ i0.ɵɵtext(5);
93
+ i0.ɵɵelementEnd();
94
+ i0.ɵɵconditionalCreate(6, ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_For_2_Conditional_6_Template, 3, 0, "button", 28);
95
+ i0.ɵɵelementEnd();
96
+ i0.ɵɵconditionalCreate(7, ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_For_2_Conditional_7_Template, 3, 1, "div", 29)(8, ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_For_2_Conditional_8_Template, 2, 0, "div", 30);
97
+ i0.ɵɵelementEnd();
98
+ } if (rf & 2) {
99
+ const tag_r4 = ctx.$implicit;
100
+ const ctx_r1 = i0.ɵɵnextContext(3);
101
+ i0.ɵɵadvance(2);
102
+ i0.ɵɵstyleProp("font-size", ctx_r1.TagFontSize(tag_r4.Weight));
103
+ i0.ɵɵadvance();
104
+ i0.ɵɵtextInterpolate(tag_r4.Tag);
105
+ i0.ɵɵadvance(2);
106
+ i0.ɵɵtextInterpolate(ctx_r1.FormatWeight(tag_r4.Weight));
107
+ i0.ɵɵadvance();
108
+ i0.ɵɵconditional(tag_r4.AIPromptRunID ? 6 : -1);
109
+ i0.ɵɵadvance();
110
+ i0.ɵɵconditional(tag_r4.Reasoning ? 7 : 8);
111
+ } }
112
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
113
+ i0.ɵɵelementStart(0, "div", 17);
114
+ i0.ɵɵrepeaterCreate(1, ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_For_2_Template, 9, 6, "div", 24, _forTrack1);
115
+ i0.ɵɵelementEnd();
116
+ } if (rf & 2) {
117
+ const ctx_r1 = i0.ɵɵnextContext(2);
118
+ i0.ɵɵadvance();
119
+ i0.ɵɵrepeater(ctx_r1.Tags);
120
+ } }
121
+ function ClassifyItemDrilldownComponent_Conditional_2_For_29_Conditional_4_Template(rf, ctx) { if (rf & 1) {
122
+ const _r5 = i0.ɵɵgetCurrentView();
123
+ i0.ɵɵelementStart(0, "button", 38);
124
+ i0.ɵɵlistener("click", function ClassifyItemDrilldownComponent_Conditional_2_For_29_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const fact_r6 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenProvenanceRecord(fact_r6)); });
125
+ i0.ɵɵtext(1);
126
+ i0.ɵɵelement(2, "i", 9);
127
+ i0.ɵɵelementEnd();
128
+ } if (rf & 2) {
129
+ const fact_r6 = i0.ɵɵnextContext().$implicit;
130
+ i0.ɵɵadvance();
131
+ i0.ɵɵtextInterpolate1(" ", fact_r6.Value, " ");
132
+ } }
133
+ function ClassifyItemDrilldownComponent_Conditional_2_For_29_Conditional_5_Template(rf, ctx) { if (rf & 1) {
134
+ i0.ɵɵelementStart(0, "span", 37);
135
+ i0.ɵɵtext(1);
136
+ i0.ɵɵelementEnd();
137
+ } if (rf & 2) {
138
+ const fact_r6 = i0.ɵɵnextContext().$implicit;
139
+ i0.ɵɵadvance();
140
+ i0.ɵɵtextInterpolate(fact_r6.Value);
141
+ } }
142
+ function ClassifyItemDrilldownComponent_Conditional_2_For_29_Template(rf, ctx) { if (rf & 1) {
143
+ i0.ɵɵelementStart(0, "div", 20);
144
+ i0.ɵɵelement(1, "i", 34);
145
+ i0.ɵɵelementStart(2, "span", 35);
146
+ i0.ɵɵtext(3);
147
+ i0.ɵɵelementEnd();
148
+ i0.ɵɵconditionalCreate(4, ClassifyItemDrilldownComponent_Conditional_2_For_29_Conditional_4_Template, 3, 1, "button", 36)(5, ClassifyItemDrilldownComponent_Conditional_2_For_29_Conditional_5_Template, 2, 1, "span", 37);
149
+ i0.ɵɵelementEnd();
150
+ } if (rf & 2) {
151
+ const fact_r6 = ctx.$implicit;
152
+ i0.ɵɵadvance();
153
+ i0.ɵɵclassMap(fact_r6.Icon);
154
+ i0.ɵɵadvance(2);
155
+ i0.ɵɵtextInterpolate(fact_r6.Label);
156
+ i0.ɵɵadvance();
157
+ i0.ɵɵconditional(fact_r6.RecordEntity && fact_r6.RecordID ? 4 : 5);
158
+ } }
159
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_34_Template(rf, ctx) { if (rf & 1) {
160
+ i0.ɵɵelementStart(0, "p", 16);
161
+ i0.ɵɵtext(1, "No audit events recorded.");
162
+ i0.ɵɵelementEnd();
163
+ } }
164
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_35_For_2_Template(rf, ctx) { if (rf & 1) {
165
+ i0.ɵɵelementStart(0, "li", 39);
166
+ i0.ɵɵelement(1, "i", 40);
167
+ i0.ɵɵelementStart(2, "span", 41);
168
+ i0.ɵɵtext(3);
169
+ i0.ɵɵelementEnd();
170
+ i0.ɵɵelementStart(4, "span", 42);
171
+ i0.ɵɵtext(5);
172
+ i0.ɵɵelementEnd()();
173
+ } if (rf & 2) {
174
+ const entry_r7 = ctx.$implicit;
175
+ i0.ɵɵadvance();
176
+ i0.ɵɵclassMap(entry_r7.Icon);
177
+ i0.ɵɵadvance(2);
178
+ i0.ɵɵtextInterpolate(entry_r7.Label);
179
+ i0.ɵɵadvance(2);
180
+ i0.ɵɵtextInterpolate(entry_r7.Timestamp);
181
+ } }
182
+ function ClassifyItemDrilldownComponent_Conditional_2_Conditional_35_Template(rf, ctx) { if (rf & 1) {
183
+ i0.ɵɵelementStart(0, "ul", 22);
184
+ i0.ɵɵrepeaterCreate(1, ClassifyItemDrilldownComponent_Conditional_2_Conditional_35_For_2_Template, 6, 4, "li", 39, _forTrack2);
185
+ i0.ɵɵelementEnd();
186
+ } if (rf & 2) {
187
+ const ctx_r1 = i0.ɵɵnextContext(2);
188
+ i0.ɵɵadvance();
189
+ i0.ɵɵrepeater(ctx_r1.Audit);
190
+ } }
191
+ function ClassifyItemDrilldownComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
192
+ const _r1 = i0.ɵɵgetCurrentView();
193
+ i0.ɵɵelementStart(0, "div", 2)(1, "section", 4)(2, "div", 5)(3, "h4", 6);
194
+ i0.ɵɵelement(4, "i", 7);
195
+ i0.ɵɵtext(5);
196
+ i0.ɵɵelementEnd();
197
+ i0.ɵɵelementStart(6, "button", 8);
198
+ i0.ɵɵlistener("click", function ClassifyItemDrilldownComponent_Conditional_2_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OpenItemRecord()); });
199
+ i0.ɵɵelement(7, "i", 9);
200
+ i0.ɵɵtext(8, " Open Record ");
201
+ i0.ɵɵelementEnd()();
202
+ i0.ɵɵelementStart(9, "div", 10)(10, "div", 11)(11, "span", 12);
203
+ i0.ɵɵtext(12, "Source");
204
+ i0.ɵɵelementEnd();
205
+ i0.ɵɵelementStart(13, "span", 13);
206
+ i0.ɵɵtext(14);
207
+ i0.ɵɵelementEnd()();
208
+ i0.ɵɵconditionalCreate(15, ClassifyItemDrilldownComponent_Conditional_2_Conditional_15_Template, 5, 2, "div", 11);
209
+ i0.ɵɵelementEnd();
210
+ i0.ɵɵconditionalCreate(16, ClassifyItemDrilldownComponent_Conditional_2_Conditional_16_Template, 2, 1, "div", 14);
211
+ i0.ɵɵelementEnd();
212
+ i0.ɵɵelementStart(17, "section", 4)(18, "h4", 6);
213
+ i0.ɵɵelement(19, "i", 15);
214
+ i0.ɵɵtext(20);
215
+ i0.ɵɵelementEnd();
216
+ i0.ɵɵconditionalCreate(21, ClassifyItemDrilldownComponent_Conditional_2_Conditional_21_Template, 2, 0, "p", 16)(22, ClassifyItemDrilldownComponent_Conditional_2_Conditional_22_Template, 3, 0, "div", 17);
217
+ i0.ɵɵelementEnd();
218
+ i0.ɵɵelementStart(23, "section", 4)(24, "h4", 6);
219
+ i0.ɵɵelement(25, "i", 18);
220
+ i0.ɵɵtext(26, " Provenance");
221
+ i0.ɵɵelementEnd();
222
+ i0.ɵɵelementStart(27, "div", 19);
223
+ i0.ɵɵrepeaterCreate(28, ClassifyItemDrilldownComponent_Conditional_2_For_29_Template, 6, 4, "div", 20, _forTrack0);
224
+ i0.ɵɵelementEnd()();
225
+ i0.ɵɵelementStart(30, "section", 4)(31, "h4", 6);
226
+ i0.ɵɵelement(32, "i", 21);
227
+ i0.ɵɵtext(33, " Audit");
228
+ i0.ɵɵelementEnd();
229
+ i0.ɵɵconditionalCreate(34, ClassifyItemDrilldownComponent_Conditional_2_Conditional_34_Template, 2, 0, "p", 16)(35, ClassifyItemDrilldownComponent_Conditional_2_Conditional_35_Template, 3, 0, "ul", 22);
230
+ i0.ɵɵelementEnd()();
231
+ } if (rf & 2) {
232
+ const ctx_r1 = i0.ɵɵnextContext();
233
+ i0.ɵɵadvance(5);
234
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.DisplayName);
235
+ i0.ɵɵadvance(9);
236
+ i0.ɵɵtextInterpolate(ctx_r1.SourceName);
237
+ i0.ɵɵadvance();
238
+ i0.ɵɵconditional(ctx_r1.URL ? 15 : -1);
239
+ i0.ɵɵadvance();
240
+ i0.ɵɵconditional(ctx_r1.TextPreview ? 16 : -1);
241
+ i0.ɵɵadvance(4);
242
+ i0.ɵɵtextInterpolate1(" Tags (", ctx_r1.Tags.length, ")");
243
+ i0.ɵɵadvance();
244
+ i0.ɵɵconditional(ctx_r1.Tags.length === 0 ? 21 : 22);
245
+ i0.ɵɵadvance(7);
246
+ i0.ɵɵrepeater(ctx_r1.Provenance);
247
+ i0.ɵɵadvance(6);
248
+ i0.ɵɵconditional(ctx_r1.Audit.length === 0 ? 34 : 35);
249
+ } }
250
+ export class ClassifyItemDrilldownComponent extends BaseAngularComponent {
251
+ cdr = inject(ChangeDetectorRef);
252
+ /** The content item to drill into, by ID. Re-loads on change (setter pattern). */
253
+ _itemID = null;
254
+ set ItemID(value) {
255
+ if (value === this._itemID)
256
+ return;
257
+ this._itemID = value;
258
+ if (value)
259
+ void this.load(value);
260
+ else
261
+ this.reset();
262
+ }
263
+ get ItemID() {
264
+ return this._itemID;
265
+ }
266
+ /** Emitted when the user wants to open a related record (entity + id). */
267
+ OpenRecordRequested = new EventEmitter();
268
+ IsLoading = false;
269
+ DisplayName = '';
270
+ SourceName = '';
271
+ URL = '';
272
+ TextPreview = '';
273
+ Tags = [];
274
+ Provenance = [];
275
+ Audit = [];
276
+ // Template-facing formatters
277
+ FormatWeight = formatWeight;
278
+ TagFontSize = tagFontSize;
279
+ /** Max characters of item text shown in the rendered-content preview. */
280
+ static TEXT_PREVIEW_MAX = 1200;
281
+ OpenPromptRun(tag) {
282
+ if (tag.AIPromptRunID) {
283
+ this.OpenRecordRequested.emit({ entityName: 'MJ: AI Prompt Runs', recordID: tag.AIPromptRunID });
284
+ }
285
+ }
286
+ OpenProvenanceRecord(fact) {
287
+ if (fact.RecordEntity && fact.RecordID) {
288
+ this.OpenRecordRequested.emit({ entityName: fact.RecordEntity, recordID: fact.RecordID });
289
+ }
290
+ }
291
+ OpenItemRecord() {
292
+ if (this._itemID) {
293
+ this.OpenRecordRequested.emit({ entityName: 'MJ: Content Items', recordID: this._itemID });
294
+ }
295
+ }
296
+ reset() {
297
+ this.DisplayName = '';
298
+ this.SourceName = '';
299
+ this.URL = '';
300
+ this.TextPreview = '';
301
+ this.Tags = [];
302
+ this.Provenance = [];
303
+ this.Audit = [];
304
+ this.cdr.detectChanges();
305
+ }
306
+ async load(itemID) {
307
+ this.reset();
308
+ this.IsLoading = true;
309
+ this.cdr.detectChanges();
310
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
311
+ const [itemResult, tagsResult] = await rv.RunViews([
312
+ {
313
+ EntityName: 'MJ: Content Items',
314
+ ExtraFilter: `ID='${itemID}'`,
315
+ Fields: ['ID', 'Name', 'Description', 'ContentSource', 'ContentSourceID', 'URL', 'Text',
316
+ 'EntityRecordDocumentID', 'EmbeddingStatus', 'TaggingStatus', 'LastTaggedAt',
317
+ 'LastEmbeddedAt', '__mj_CreatedAt'],
318
+ ResultType: 'simple',
319
+ },
320
+ {
321
+ EntityName: 'MJ: Content Item Tags',
322
+ ExtraFilter: `ItemID='${itemID}'`,
323
+ OrderBy: 'Weight DESC',
324
+ Fields: ['ID', 'Tag', 'Weight', 'Reasoning', 'AIPromptRunID', '__mj_CreatedAt'],
325
+ ResultType: 'simple',
326
+ },
327
+ ], this.ProviderToUse.CurrentUser);
328
+ const item = itemResult.Success && itemResult.Results.length > 0
329
+ ? itemResult.Results[0]
330
+ : null;
331
+ if (item) {
332
+ this.applyItem(item);
333
+ }
334
+ this.applyTags(tagsResult.Success ? tagsResult.Results : []);
335
+ this.IsLoading = false;
336
+ this.cdr.detectChanges();
337
+ }
338
+ applyItem(item) {
339
+ this.DisplayName = deriveDisplayName({ Name: item['Name'], Description: item['Description'] });
340
+ this.SourceName = item['ContentSource'] ?? 'Unknown';
341
+ this.URL = item['URL'] ?? '';
342
+ const text = item['Text'] ?? '';
343
+ this.TextPreview = text.length > ClassifyItemDrilldownComponent.TEXT_PREVIEW_MAX
344
+ ? `${text.slice(0, ClassifyItemDrilldownComponent.TEXT_PREVIEW_MAX)}…`
345
+ : text;
346
+ this.buildProvenance(item);
347
+ this.buildAudit(item);
348
+ }
349
+ applyTags(rows) {
350
+ this.Tags = rows.map(r => ({
351
+ Tag: r['Tag'] ?? '',
352
+ Weight: Number(r['Weight'] ?? 0),
353
+ Reasoning: r['Reasoning'] ?? null,
354
+ AIPromptRunID: r['AIPromptRunID'] ?? null,
355
+ CreatedAt: r['__mj_CreatedAt'] ?? '',
356
+ }));
357
+ }
358
+ buildProvenance(item) {
359
+ const facts = [];
360
+ const sourceID = item['ContentSourceID'];
361
+ facts.push({
362
+ Label: 'Content Source',
363
+ Value: this.SourceName,
364
+ Icon: 'fa-solid fa-database',
365
+ ...(sourceID ? { RecordEntity: 'MJ: Content Sources', RecordID: sourceID } : {}),
366
+ });
367
+ const docID = item['EntityRecordDocumentID'];
368
+ if (docID) {
369
+ facts.push({
370
+ Label: 'Entity Record Document',
371
+ Value: docID,
372
+ Icon: 'fa-solid fa-file-lines',
373
+ RecordEntity: 'MJ: Entity Record Documents',
374
+ RecordID: docID,
375
+ });
376
+ }
377
+ // Distinct AI Prompt Runs across this item's tags (provenance to the LLM runs).
378
+ const promptRunIDs = new Set();
379
+ for (const t of this.Tags) {
380
+ if (t.AIPromptRunID)
381
+ promptRunIDs.add(t.AIPromptRunID);
382
+ }
383
+ for (const runID of promptRunIDs) {
384
+ facts.push({
385
+ Label: 'AI Prompt Run',
386
+ Value: runID,
387
+ Icon: 'fa-solid fa-robot',
388
+ RecordEntity: 'MJ: AI Prompt Runs',
389
+ RecordID: runID,
390
+ });
391
+ }
392
+ this.Provenance = facts;
393
+ }
394
+ buildAudit(item) {
395
+ const entries = [];
396
+ const created = item['__mj_CreatedAt'];
397
+ const lastTagged = item['LastTaggedAt'];
398
+ const lastEmbedded = item['LastEmbeddedAt'];
399
+ if (created)
400
+ entries.push({ Label: 'Item created', Timestamp: formatDate(created), Icon: 'fa-solid fa-plus' });
401
+ if (lastTagged)
402
+ entries.push({ Label: 'Last tagged', Timestamp: formatDate(lastTagged), Icon: 'fa-solid fa-tags' });
403
+ if (lastEmbedded)
404
+ entries.push({ Label: 'Last embedded', Timestamp: formatDate(lastEmbedded), Icon: 'fa-solid fa-vector-square' });
405
+ this.Audit = entries;
406
+ }
407
+ static ɵfac = /*@__PURE__*/ (() => { let ɵClassifyItemDrilldownComponent_BaseFactory; return function ClassifyItemDrilldownComponent_Factory(__ngFactoryType__) { return (ɵClassifyItemDrilldownComponent_BaseFactory || (ɵClassifyItemDrilldownComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ClassifyItemDrilldownComponent)))(__ngFactoryType__ || ClassifyItemDrilldownComponent); }; })();
408
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassifyItemDrilldownComponent, selectors: [["classify-item-drilldown"]], inputs: { ItemID: "ItemID" }, outputs: { OpenRecordRequested: "OpenRecordRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "cid-empty"], ["text", "Loading item detail...", "size", "small"], [1, "cid-wrap"], [1, "fa-solid", "fa-arrow-pointer"], [1, "cid-section"], [1, "cid-section-head"], [1, "cid-title"], [1, "fa-solid", "fa-file-lines"], ["mjButton", "", "variant", "secondary", "size", "sm", 3, "click"], [1, "fa-solid", "fa-up-right-from-square"], [1, "cid-fields"], [1, "cid-field"], [1, "cid-field-label"], [1, "cid-field-value"], [1, "cid-text-preview"], [1, "fa-solid", "fa-tags"], [1, "cid-muted"], [1, "cid-tag-list"], [1, "fa-solid", "fa-diagram-project"], [1, "cid-provenance-list"], [1, "cid-provenance-row"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "cid-audit-list"], ["target", "_blank", "rel", "noopener", 1, "cid-field-link", 3, "href"], [1, "cid-tag-card"], [1, "cid-tag-head"], [1, "cid-tag-name"], [1, "cid-tag-weight"], ["title", "Open the AI Prompt Run that produced this tag", 1, "cid-provenance-link"], [1, "cid-tag-reasoning"], [1, "cid-tag-reasoning", "cid-muted"], ["title", "Open the AI Prompt Run that produced this tag", 1, "cid-provenance-link", 3, "click"], [1, "fa-solid", "fa-robot"], [1, "fa-solid", "fa-quote-left"], [1, "cid-provenance-icon"], [1, "cid-provenance-label"], [1, "cid-provenance-value", "cid-provenance-clickable"], [1, "cid-provenance-value"], [1, "cid-provenance-value", "cid-provenance-clickable", 3, "click"], [1, "cid-audit-row"], [1, "cid-audit-icon"], [1, "cid-audit-label"], [1, "cid-audit-time"]], template: function ClassifyItemDrilldownComponent_Template(rf, ctx) { if (rf & 1) {
409
+ i0.ɵɵconditionalCreate(0, ClassifyItemDrilldownComponent_Conditional_0_Template, 4, 0, "div", 0)(1, ClassifyItemDrilldownComponent_Conditional_1_Template, 1, 0, "mj-loading", 1)(2, ClassifyItemDrilldownComponent_Conditional_2_Template, 36, 7, "div", 2);
410
+ } if (rf & 2) {
411
+ i0.ɵɵconditional(!ctx.ItemID ? 0 : ctx.IsLoading ? 1 : 2);
412
+ } }, dependencies: [i1.LoadingComponent, i2.MJButtonDirective], styles: [".cid-wrap[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.cid-section[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n padding: 12px 14px;\n}\n\n.cid-section-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.cid-title[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.cid-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.cid-section-head[_ngcontent-%COMP%] .cid-title[_ngcontent-%COMP%] {\n margin-bottom: 0;\n}\n\n.cid-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.cid-field[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n font-size: 0.82rem;\n}\n\n.cid-field-label[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n min-width: 60px;\n}\n\n.cid-field-value[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.cid-field-link[_ngcontent-%COMP%] {\n color: var(--mj-text-link);\n text-decoration: none;\n word-break: break-all;\n}\n\n.cid-field-link[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}\n\n.cid-text-preview[_ngcontent-%COMP%] {\n margin-top: 10px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-sm);\n font-size: 0.8rem;\n line-height: 1.45;\n color: var(--mj-text-secondary);\n white-space: pre-wrap;\n max-height: 220px;\n overflow-y: auto;\n}\n\n.cid-muted[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n margin: 0;\n}\n\n\n\n.cid-tag-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.cid-tag-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-sm);\n padding: 8px 10px;\n background: var(--mj-bg-surface-card);\n}\n\n.cid-tag-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.cid-tag-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cid-tag-weight[_ngcontent-%COMP%] {\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-radius: var(--mj-radius-full, 999px);\n padding: 1px 8px;\n}\n\n.cid-provenance-link[_ngcontent-%COMP%] {\n margin-left: auto;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-link);\n border-radius: var(--mj-radius-sm);\n font-size: 0.72rem;\n padding: 2px 8px;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.cid-provenance-link[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.cid-tag-reasoning[_ngcontent-%COMP%] {\n margin-top: 6px;\n font-size: 0.8rem;\n line-height: 1.4;\n color: var(--mj-text-secondary);\n}\n\n.cid-tag-reasoning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n margin-right: 4px;\n}\n\n\n\n.cid-provenance-list[_ngcontent-%COMP%], \n.cid-audit-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.cid-provenance-row[_ngcontent-%COMP%], \n.cid-audit-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 0.82rem;\n}\n\n.cid-provenance-icon[_ngcontent-%COMP%], \n.cid-audit-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n width: 16px;\n text-align: center;\n}\n\n.cid-provenance-label[_ngcontent-%COMP%], \n.cid-audit-label[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n min-width: 150px;\n}\n\n.cid-provenance-value[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n word-break: break-all;\n}\n\n.cid-provenance-clickable[_ngcontent-%COMP%] {\n border: none;\n background: none;\n color: var(--mj-text-link);\n cursor: pointer;\n padding: 0;\n font: inherit;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.cid-provenance-clickable[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}\n\n.cid-audit-time[_ngcontent-%COMP%] {\n margin-left: auto;\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n\n\n.cid-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 40px 16px;\n color: var(--mj-text-muted);\n text-align: center;\n}\n\n.cid-empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.6rem;\n color: var(--mj-text-disabled);\n}\n\n.cid-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.85rem;\n}"] });
413
+ }
414
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClassifyItemDrilldownComponent, [{
415
+ type: Component,
416
+ args: [{ standalone: false, selector: 'classify-item-drilldown', template: "@if (!ItemID) {\n <div class=\"cid-empty\">\n <i class=\"fa-solid fa-arrow-pointer\"></i>\n <p>Select an item to inspect its tags, reasoning, and provenance.</p>\n </div>\n} @else if (IsLoading) {\n <mj-loading text=\"Loading item detail...\" size=\"small\"></mj-loading>\n} @else {\n <div class=\"cid-wrap\">\n\n <!-- (A) Rendered content / fields -->\n <section class=\"cid-section\">\n <div class=\"cid-section-head\">\n <h4 class=\"cid-title\"><i class=\"fa-solid fa-file-lines\"></i> {{ DisplayName }}</h4>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OpenItemRecord()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i> Open Record\n </button>\n </div>\n <div class=\"cid-fields\">\n <div class=\"cid-field\"><span class=\"cid-field-label\">Source</span><span class=\"cid-field-value\">{{ SourceName }}</span></div>\n @if (URL) {\n <div class=\"cid-field\">\n <span class=\"cid-field-label\">URL</span>\n <a class=\"cid-field-link\" [href]=\"URL\" target=\"_blank\" rel=\"noopener\">{{ URL }}</a>\n </div>\n }\n </div>\n @if (TextPreview) {\n <div class=\"cid-text-preview\">{{ TextPreview }}</div>\n }\n </section>\n\n <!-- (B) Tags with weight + reasoning + provenance link -->\n <section class=\"cid-section\">\n <h4 class=\"cid-title\"><i class=\"fa-solid fa-tags\"></i> Tags ({{ Tags.length }})</h4>\n @if (Tags.length === 0) {\n <p class=\"cid-muted\">No tags applied to this item.</p>\n } @else {\n <div class=\"cid-tag-list\">\n @for (tag of Tags; track tag.Tag + tag.CreatedAt) {\n <div class=\"cid-tag-card\">\n <div class=\"cid-tag-head\">\n <span class=\"cid-tag-name\" [style.fontSize]=\"TagFontSize(tag.Weight)\">{{ tag.Tag }}</span>\n <span class=\"cid-tag-weight\">{{ FormatWeight(tag.Weight) }}</span>\n @if (tag.AIPromptRunID) {\n <button class=\"cid-provenance-link\" (click)=\"OpenPromptRun(tag)\"\n title=\"Open the AI Prompt Run that produced this tag\">\n <i class=\"fa-solid fa-robot\"></i> Prompt Run\n </button>\n }\n </div>\n @if (tag.Reasoning) {\n <div class=\"cid-tag-reasoning\">\n <i class=\"fa-solid fa-quote-left\"></i> {{ tag.Reasoning }}\n </div>\n } @else {\n <div class=\"cid-tag-reasoning cid-muted\">No reasoning captured.</div>\n }\n </div>\n }\n </div>\n }\n </section>\n\n <!-- (C) Provenance -->\n <section class=\"cid-section\">\n <h4 class=\"cid-title\"><i class=\"fa-solid fa-diagram-project\"></i> Provenance</h4>\n <div class=\"cid-provenance-list\">\n @for (fact of Provenance; track fact.Label + fact.Value) {\n <div class=\"cid-provenance-row\">\n <i [class]=\"fact.Icon\" class=\"cid-provenance-icon\"></i>\n <span class=\"cid-provenance-label\">{{ fact.Label }}</span>\n @if (fact.RecordEntity && fact.RecordID) {\n <button class=\"cid-provenance-value cid-provenance-clickable\" (click)=\"OpenProvenanceRecord(fact)\">\n {{ fact.Value }} <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n } @else {\n <span class=\"cid-provenance-value\">{{ fact.Value }}</span>\n }\n </div>\n }\n </div>\n </section>\n\n <!-- (D) Audit -->\n <section class=\"cid-section\">\n <h4 class=\"cid-title\"><i class=\"fa-solid fa-clock-rotate-left\"></i> Audit</h4>\n @if (Audit.length === 0) {\n <p class=\"cid-muted\">No audit events recorded.</p>\n } @else {\n <ul class=\"cid-audit-list\">\n @for (entry of Audit; track entry.Label) {\n <li class=\"cid-audit-row\">\n <i [class]=\"entry.Icon\" class=\"cid-audit-icon\"></i>\n <span class=\"cid-audit-label\">{{ entry.Label }}</span>\n <span class=\"cid-audit-time\">{{ entry.Timestamp }}</span>\n </li>\n }\n </ul>\n }\n </section>\n\n </div>\n}\n", styles: [".cid-wrap {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.cid-section {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n padding: 12px 14px;\n}\n\n.cid-section-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.cid-title {\n margin: 0 0 8px 0;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.cid-title i {\n color: var(--mj-brand-primary);\n}\n\n.cid-section-head .cid-title {\n margin-bottom: 0;\n}\n\n.cid-fields {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.cid-field {\n display: flex;\n gap: 10px;\n font-size: 0.82rem;\n}\n\n.cid-field-label {\n color: var(--mj-text-muted);\n min-width: 60px;\n}\n\n.cid-field-value {\n color: var(--mj-text-primary);\n}\n\n.cid-field-link {\n color: var(--mj-text-link);\n text-decoration: none;\n word-break: break-all;\n}\n\n.cid-field-link:hover {\n text-decoration: underline;\n}\n\n.cid-text-preview {\n margin-top: 10px;\n padding: 10px;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-sm);\n font-size: 0.8rem;\n line-height: 1.45;\n color: var(--mj-text-secondary);\n white-space: pre-wrap;\n max-height: 220px;\n overflow-y: auto;\n}\n\n.cid-muted {\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n margin: 0;\n}\n\n/* Tags */\n.cid-tag-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.cid-tag-card {\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-sm);\n padding: 8px 10px;\n background: var(--mj-bg-surface-card);\n}\n\n.cid-tag-head {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.cid-tag-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.cid-tag-weight {\n font-size: 0.72rem;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-radius: var(--mj-radius-full, 999px);\n padding: 1px 8px;\n}\n\n.cid-provenance-link {\n margin-left: auto;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-link);\n border-radius: var(--mj-radius-sm);\n font-size: 0.72rem;\n padding: 2px 8px;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.cid-provenance-link:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.cid-tag-reasoning {\n margin-top: 6px;\n font-size: 0.8rem;\n line-height: 1.4;\n color: var(--mj-text-secondary);\n}\n\n.cid-tag-reasoning i {\n color: var(--mj-text-disabled);\n margin-right: 4px;\n}\n\n/* Provenance */\n.cid-provenance-list,\n.cid-audit-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.cid-provenance-row,\n.cid-audit-row {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 0.82rem;\n}\n\n.cid-provenance-icon,\n.cid-audit-icon {\n color: var(--mj-text-muted);\n width: 16px;\n text-align: center;\n}\n\n.cid-provenance-label,\n.cid-audit-label {\n color: var(--mj-text-secondary);\n min-width: 150px;\n}\n\n.cid-provenance-value {\n color: var(--mj-text-primary);\n word-break: break-all;\n}\n\n.cid-provenance-clickable {\n border: none;\n background: none;\n color: var(--mj-text-link);\n cursor: pointer;\n padding: 0;\n font: inherit;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.cid-provenance-clickable:hover {\n text-decoration: underline;\n}\n\n.cid-audit-time {\n margin-left: auto;\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n/* Empty state */\n.cid-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 40px 16px;\n color: var(--mj-text-muted);\n text-align: center;\n}\n\n.cid-empty i {\n font-size: 1.6rem;\n color: var(--mj-text-disabled);\n}\n\n.cid-empty p {\n margin: 0;\n font-size: 0.85rem;\n}\n"] }]
417
+ }], null, { ItemID: [{
418
+ type: Input
419
+ }], OpenRecordRequested: [{
420
+ type: Output
421
+ }] }); })();
422
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassifyItemDrilldownComponent, { className: "ClassifyItemDrilldownComponent", filePath: "src/AI/components/autotagging/components/classify-item-drilldown.component.ts", lineNumber: 39 }); })();
423
+ //# sourceMappingURL=classify-item-drilldown.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-item-drilldown.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/components/classify-item-drilldown.component.ts","../../../../../src/AI/components/autotagging/components/classify-item-drilldown.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Classify · Content Item Drilldown (Phase 4 audit/analytics).\n *\n * Given a content item (by ID), renders an auditable view of:\n * (A) basic rendered content / fields,\n * (B) its tags WITH weight + LLM Reasoning, plus a provenance link to the\n * AI Prompt Run (`AIPromptRunID`) that produced each tag,\n * (C) provenance facts (source / entity doc / prompt run), and\n * (D) a simple audit list (created / last tagged / last embedded).\n *\n * Read-only: all loads use `ResultType:'simple'` + narrow `Fields`. Tags are read\n * from `MJ: Content Item Tags` filtered by `ItemID`. This component owns NO\n * navigation — record-open intents bubble UP via `(OpenRecordRequested)` so the\n * host (which owns NavigationService) opens the full entity form.\n */\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n inject,\n} from '@angular/core';\nimport { RunView } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport {\n ClassifyDrilldownTag,\n ClassifyProvenanceFact,\n ClassifyAuditEntry,\n} from '../shared/classify.types';\nimport { deriveDisplayName, formatWeight, tagFontSize, formatDate } from '../shared/classify.format';\n\n@Component({\n standalone: false,\n selector: 'classify-item-drilldown',\n templateUrl: './classify-item-drilldown.component.html',\n styleUrls: ['./classify-item-drilldown.component.css'],\n})\nexport class ClassifyItemDrilldownComponent extends BaseAngularComponent {\n private cdr = inject(ChangeDetectorRef);\n\n /** The content item to drill into, by ID. Re-loads on change (setter pattern). */\n private _itemID: string | null = null;\n @Input()\n set ItemID(value: string | null) {\n if (value === this._itemID) return;\n this._itemID = value;\n if (value) void this.load(value);\n else this.reset();\n }\n get ItemID(): string | null {\n return this._itemID;\n }\n\n /** Emitted when the user wants to open a related record (entity + id). */\n @Output() OpenRecordRequested = new EventEmitter<{ entityName: string; recordID: string }>();\n\n public IsLoading = false;\n public DisplayName = '';\n public SourceName = '';\n public URL = '';\n public TextPreview = '';\n public Tags: ClassifyDrilldownTag[] = [];\n public Provenance: ClassifyProvenanceFact[] = [];\n public Audit: ClassifyAuditEntry[] = [];\n\n // Template-facing formatters\n public readonly FormatWeight = formatWeight;\n public readonly TagFontSize = tagFontSize;\n\n /** Max characters of item text shown in the rendered-content preview. */\n private static readonly TEXT_PREVIEW_MAX = 1200;\n\n public OpenPromptRun(tag: ClassifyDrilldownTag): void {\n if (tag.AIPromptRunID) {\n this.OpenRecordRequested.emit({ entityName: 'MJ: AI Prompt Runs', recordID: tag.AIPromptRunID });\n }\n }\n\n public OpenProvenanceRecord(fact: ClassifyProvenanceFact): void {\n if (fact.RecordEntity && fact.RecordID) {\n this.OpenRecordRequested.emit({ entityName: fact.RecordEntity, recordID: fact.RecordID });\n }\n }\n\n public OpenItemRecord(): void {\n if (this._itemID) {\n this.OpenRecordRequested.emit({ entityName: 'MJ: Content Items', recordID: this._itemID });\n }\n }\n\n private reset(): void {\n this.DisplayName = '';\n this.SourceName = '';\n this.URL = '';\n this.TextPreview = '';\n this.Tags = [];\n this.Provenance = [];\n this.Audit = [];\n this.cdr.detectChanges();\n }\n\n private async load(itemID: string): Promise<void> {\n this.reset();\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [itemResult, tagsResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Content Items',\n ExtraFilter: `ID='${itemID}'`,\n Fields: ['ID', 'Name', 'Description', 'ContentSource', 'ContentSourceID', 'URL', 'Text',\n 'EntityRecordDocumentID', 'EmbeddingStatus', 'TaggingStatus', 'LastTaggedAt',\n 'LastEmbeddedAt', '__mj_CreatedAt'],\n ResultType: 'simple',\n },\n {\n EntityName: 'MJ: Content Item Tags',\n ExtraFilter: `ItemID='${itemID}'`,\n OrderBy: 'Weight DESC',\n Fields: ['ID', 'Tag', 'Weight', 'Reasoning', 'AIPromptRunID', '__mj_CreatedAt'],\n ResultType: 'simple',\n },\n ], this.ProviderToUse.CurrentUser);\n\n const item = itemResult.Success && itemResult.Results.length > 0\n ? (itemResult.Results[0] as Record<string, unknown>)\n : null;\n\n if (item) {\n this.applyItem(item);\n }\n this.applyTags(tagsResult.Success ? (tagsResult.Results as Record<string, unknown>[]) : []);\n\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n\n private applyItem(item: Record<string, unknown>): void {\n this.DisplayName = deriveDisplayName({ Name: item['Name'] as string | null, Description: item['Description'] as string | null });\n this.SourceName = (item['ContentSource'] as string) ?? 'Unknown';\n this.URL = (item['URL'] as string) ?? '';\n const text = (item['Text'] as string) ?? '';\n this.TextPreview = text.length > ClassifyItemDrilldownComponent.TEXT_PREVIEW_MAX\n ? `${text.slice(0, ClassifyItemDrilldownComponent.TEXT_PREVIEW_MAX)}…`\n : text;\n\n this.buildProvenance(item);\n this.buildAudit(item);\n }\n\n private applyTags(rows: Record<string, unknown>[]): void {\n this.Tags = rows.map(r => ({\n Tag: (r['Tag'] as string) ?? '',\n Weight: Number(r['Weight'] ?? 0),\n Reasoning: (r['Reasoning'] as string | null) ?? null,\n AIPromptRunID: (r['AIPromptRunID'] as string | null) ?? null,\n CreatedAt: (r['__mj_CreatedAt'] as string) ?? '',\n }));\n }\n\n private buildProvenance(item: Record<string, unknown>): void {\n const facts: ClassifyProvenanceFact[] = [];\n\n const sourceID = item['ContentSourceID'] as string | null;\n facts.push({\n Label: 'Content Source',\n Value: this.SourceName,\n Icon: 'fa-solid fa-database',\n ...(sourceID ? { RecordEntity: 'MJ: Content Sources', RecordID: sourceID } : {}),\n });\n\n const docID = item['EntityRecordDocumentID'] as string | null;\n if (docID) {\n facts.push({\n Label: 'Entity Record Document',\n Value: docID,\n Icon: 'fa-solid fa-file-lines',\n RecordEntity: 'MJ: Entity Record Documents',\n RecordID: docID,\n });\n }\n\n // Distinct AI Prompt Runs across this item's tags (provenance to the LLM runs).\n const promptRunIDs = new Set<string>();\n for (const t of this.Tags) {\n if (t.AIPromptRunID) promptRunIDs.add(t.AIPromptRunID);\n }\n for (const runID of promptRunIDs) {\n facts.push({\n Label: 'AI Prompt Run',\n Value: runID,\n Icon: 'fa-solid fa-robot',\n RecordEntity: 'MJ: AI Prompt Runs',\n RecordID: runID,\n });\n }\n\n this.Provenance = facts;\n }\n\n private buildAudit(item: Record<string, unknown>): void {\n const entries: ClassifyAuditEntry[] = [];\n const created = item['__mj_CreatedAt'] as string | null;\n const lastTagged = item['LastTaggedAt'] as string | null;\n const lastEmbedded = item['LastEmbeddedAt'] as string | null;\n\n if (created) entries.push({ Label: 'Item created', Timestamp: formatDate(created), Icon: 'fa-solid fa-plus' });\n if (lastTagged) entries.push({ Label: 'Last tagged', Timestamp: formatDate(lastTagged), Icon: 'fa-solid fa-tags' });\n if (lastEmbedded) entries.push({ Label: 'Last embedded', Timestamp: formatDate(lastEmbedded), Icon: 'fa-solid fa-vector-square' });\n\n this.Audit = entries;\n }\n}\n","@if (!ItemID) {\n <div class=\"cid-empty\">\n <i class=\"fa-solid fa-arrow-pointer\"></i>\n <p>Select an item to inspect its tags, reasoning, and provenance.</p>\n </div>\n} @else if (IsLoading) {\n <mj-loading text=\"Loading item detail...\" size=\"small\"></mj-loading>\n} @else {\n <div class=\"cid-wrap\">\n\n <!-- (A) Rendered content / fields -->\n <section class=\"cid-section\">\n <div class=\"cid-section-head\">\n <h4 class=\"cid-title\"><i class=\"fa-solid fa-file-lines\"></i> {{ DisplayName }}</h4>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OpenItemRecord()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i> Open Record\n </button>\n </div>\n <div class=\"cid-fields\">\n <div class=\"cid-field\"><span class=\"cid-field-label\">Source</span><span class=\"cid-field-value\">{{ SourceName }}</span></div>\n @if (URL) {\n <div class=\"cid-field\">\n <span class=\"cid-field-label\">URL</span>\n <a class=\"cid-field-link\" [href]=\"URL\" target=\"_blank\" rel=\"noopener\">{{ URL }}</a>\n </div>\n }\n </div>\n @if (TextPreview) {\n <div class=\"cid-text-preview\">{{ TextPreview }}</div>\n }\n </section>\n\n <!-- (B) Tags with weight + reasoning + provenance link -->\n <section class=\"cid-section\">\n <h4 class=\"cid-title\"><i class=\"fa-solid fa-tags\"></i> Tags ({{ Tags.length }})</h4>\n @if (Tags.length === 0) {\n <p class=\"cid-muted\">No tags applied to this item.</p>\n } @else {\n <div class=\"cid-tag-list\">\n @for (tag of Tags; track tag.Tag + tag.CreatedAt) {\n <div class=\"cid-tag-card\">\n <div class=\"cid-tag-head\">\n <span class=\"cid-tag-name\" [style.fontSize]=\"TagFontSize(tag.Weight)\">{{ tag.Tag }}</span>\n <span class=\"cid-tag-weight\">{{ FormatWeight(tag.Weight) }}</span>\n @if (tag.AIPromptRunID) {\n <button class=\"cid-provenance-link\" (click)=\"OpenPromptRun(tag)\"\n title=\"Open the AI Prompt Run that produced this tag\">\n <i class=\"fa-solid fa-robot\"></i> Prompt Run\n </button>\n }\n </div>\n @if (tag.Reasoning) {\n <div class=\"cid-tag-reasoning\">\n <i class=\"fa-solid fa-quote-left\"></i> {{ tag.Reasoning }}\n </div>\n } @else {\n <div class=\"cid-tag-reasoning cid-muted\">No reasoning captured.</div>\n }\n </div>\n }\n </div>\n }\n </section>\n\n <!-- (C) Provenance -->\n <section class=\"cid-section\">\n <h4 class=\"cid-title\"><i class=\"fa-solid fa-diagram-project\"></i> Provenance</h4>\n <div class=\"cid-provenance-list\">\n @for (fact of Provenance; track fact.Label + fact.Value) {\n <div class=\"cid-provenance-row\">\n <i [class]=\"fact.Icon\" class=\"cid-provenance-icon\"></i>\n <span class=\"cid-provenance-label\">{{ fact.Label }}</span>\n @if (fact.RecordEntity && fact.RecordID) {\n <button class=\"cid-provenance-value cid-provenance-clickable\" (click)=\"OpenProvenanceRecord(fact)\">\n {{ fact.Value }} <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n } @else {\n <span class=\"cid-provenance-value\">{{ fact.Value }}</span>\n }\n </div>\n }\n </div>\n </section>\n\n <!-- (D) Audit -->\n <section class=\"cid-section\">\n <h4 class=\"cid-title\"><i class=\"fa-solid fa-clock-rotate-left\"></i> Audit</h4>\n @if (Audit.length === 0) {\n <p class=\"cid-muted\">No audit events recorded.</p>\n } @else {\n <ul class=\"cid-audit-list\">\n @for (entry of Audit; track entry.Label) {\n <li class=\"cid-audit-row\">\n <i [class]=\"entry.Icon\" class=\"cid-audit-icon\"></i>\n <span class=\"cid-audit-label\">{{ entry.Label }}</span>\n <span class=\"cid-audit-time\">{{ entry.Timestamp }}</span>\n </li>\n }\n </ul>\n }\n </section>\n\n </div>\n}\n"]}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @fileoverview Classify · Content Item Grid (Phase 4 audit/analytics).
3
+ *
4
+ * Thin, reusable AG Grid listing of content items in one of two modes:
5
+ * - scoped to a single pipeline run via `[RunID]` (items processed in that run), or
6
+ * - all items (when `[RunID]` is null).
7
+ *
8
+ * Read-only: uses `ResultType:'simple'` + an explicit narrow `Fields` list, and a
9
+ * load-more / page-size widening approach mirroring the host dashboard. Selecting a
10
+ * row bubbles `(ItemSelected)` UP — this component owns no navigation (the host owns
11
+ * NavigationService and opens the drilldown).
12
+ */
13
+ import { EventEmitter } from '@angular/core';
14
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
15
+ import { ColDef, GridOptions, GridReadyEvent, Theme, RowClickedEvent } from 'ag-grid-community';
16
+ import { ClassifyItemGridRow } from '../shared/classify.types';
17
+ import * as i0 from "@angular/core";
18
+ export declare class ClassifyItemGridComponent extends BaseAngularComponent {
19
+ private cdr;
20
+ /** One page worth of additional rows fetched when "Load more" is clicked. */
21
+ private static readonly PAGE_SIZE;
22
+ /**
23
+ * When set, scope the grid to items processed by this pipeline run. When null,
24
+ * show all content items. Re-fetches on change (setter pattern, not ngOnChanges).
25
+ */
26
+ private _runID;
27
+ set RunID(value: string | null);
28
+ get RunID(): string | null;
29
+ /** When true, the grid loads its data on init. Lets a parent defer the query until the section is shown. */
30
+ private _autoLoad;
31
+ set AutoLoad(value: boolean);
32
+ get AutoLoad(): boolean;
33
+ /** Emits the selected content item's ID when a row is clicked. */
34
+ ItemSelected: EventEmitter<string>;
35
+ Rows: ClassifyItemGridRow[];
36
+ IsLoading: boolean;
37
+ IsLoadingMore: boolean;
38
+ TotalCount: number;
39
+ private _loaded;
40
+ private _pageSize;
41
+ private gridApi;
42
+ get HasMore(): boolean;
43
+ Theme: Theme;
44
+ GridOptions: GridOptions<ClassifyItemGridRow>;
45
+ DefaultColDef: ColDef;
46
+ ColumnDefs: ColDef<ClassifyItemGridRow>[];
47
+ OnGridReady(event: GridReadyEvent<ClassifyItemGridRow>): void;
48
+ OnRowClicked(event: RowClickedEvent<ClassifyItemGridRow>): void;
49
+ /** Public refresh entry point (parent toolbar / load-more handler). */
50
+ Reload(): Promise<void>;
51
+ LoadMore(): Promise<void>;
52
+ private loadItems;
53
+ /**
54
+ * Build the item-level filter that scopes to a pipeline run: the run's
55
+ * ContentSource, optionally bounded by the run's processing window. Returns
56
+ * null on a hard failure (so the caller short-circuits to an empty grid).
57
+ */
58
+ private resolveRunScope;
59
+ /** Format an ISO date value for a SQL string literal (UTC, no tz suffix surprises). */
60
+ private toSqlDate;
61
+ /** Count tags per item for the visible page (one RunView, aggregated client-side). */
62
+ private loadTagCounts;
63
+ private toRow;
64
+ private applyRows;
65
+ /** Build an `IN (...)` filter from item IDs, defensively stripping quotes. */
66
+ private buildItemIDInFilter;
67
+ static ɵfac: i0.ɵɵFactoryDeclaration<ClassifyItemGridComponent, never>;
68
+ static ɵcmp: i0.ɵɵComponentDeclaration<ClassifyItemGridComponent, "classify-item-grid", never, { "RunID": { "alias": "RunID"; "required": false; }; "AutoLoad": { "alias": "AutoLoad"; "required": false; }; }, { "ItemSelected": "ItemSelected"; }, never, never, false, never>;
69
+ }
70
+ //# sourceMappingURL=classify-item-grid.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify-item-grid.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/components/classify-item-grid.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAIH,YAAY,EAGf,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EACH,MAAM,EAEN,WAAW,EACX,cAAc,EAGd,KAAK,EAEL,eAAe,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;;AAM/D,qBAMa,yBAA0B,SAAQ,oBAAoB;IAC/D,OAAO,CAAC,GAAG,CAA6B;IAExC,6EAA6E;IAC7E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAO;IAExC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAuB;IACrC,IACI,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAK7B;IACD,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,4GAA4G;IAC5G,OAAO,CAAC,SAAS,CAAQ;IACzB,IACI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAI1B;IACD,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,kEAAkE;IACxD,YAAY,uBAA8B;IAE7C,IAAI,EAAE,mBAAmB,EAAE,CAAM;IACjC,SAAS,UAAS;IAClB,aAAa,UAAS;IACtB,UAAU,SAAK;IAEtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,OAAO,CAAwB;IAEvC,IAAW,OAAO,IAAI,OAAO,CAE5B;IAIM,KAAK,EAAE,KAAK,CAiBhB;IAEI,WAAW,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAOlD;IAEK,aAAa,EAAE,MAAM,CAI1B;IAEK,UAAU,EAAE,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAQ9C;IAEK,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAK7D,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAItE,uEAAuE;IAC1D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAKvB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAUxB,SAAS;IAwCvB;;;;OAIG;YACW,eAAe;IAiB7B,uFAAuF;IACvF,OAAO,CAAC,SAAS;IAKjB,sFAAsF;YACxE,aAAa;IAkB3B,OAAO,CAAC,KAAK;IAeb,OAAO,CAAC,SAAS;IASjB,8EAA8E;IAC9E,OAAO,CAAC,mBAAmB;yCAzOlB,yBAAyB;2CAAzB,yBAAyB;CA6OrC"}