@memberjunction/ng-dashboards 6.1.0-edge.0 → 6.1.0-edge.2

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 (145) hide show
  1. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +3 -3
  2. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  3. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +8 -2
  4. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  5. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +7 -7
  6. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +21 -21
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  9. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +3 -3
  10. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -1
  11. package/dist/AI/components/autotagging/shared/classify.format.d.ts +1 -1
  12. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -1
  13. package/dist/AI/components/autotagging/shared/classify.format.js +1 -1
  14. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -1
  15. package/dist/AI/components/autotagging/shared/classify.types.d.ts +6 -6
  16. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -1
  17. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -1
  18. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +14 -19
  19. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
  20. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +53 -77
  21. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  22. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -20
  23. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  24. package/dist/AI/components/tags/tags-resource.component.js +51 -77
  25. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  26. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -3
  27. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/vectors/vector-management-resource.component.js +22 -43
  29. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  30. package/dist/Actions/components/explorer/action-card.component.js +6 -6
  31. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  32. package/dist/Actions/components/explorer/action-list-item.component.js +3 -3
  33. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  34. package/dist/Actions/index.d.ts +0 -1
  35. package/dist/Actions/index.d.ts.map +1 -1
  36. package/dist/Actions/index.js +0 -1
  37. package/dist/Actions/index.js.map +1 -1
  38. package/dist/Admin/admin-dev-tools-resource.component.d.ts.map +1 -1
  39. package/dist/Admin/admin-dev-tools-resource.component.js +14 -0
  40. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  41. package/dist/DevTools/grid-width-lab.component.d.ts +78 -0
  42. package/dist/DevTools/grid-width-lab.component.d.ts.map +1 -0
  43. package/dist/DevTools/grid-width-lab.component.js +248 -0
  44. package/dist/DevTools/grid-width-lab.component.js.map +1 -0
  45. package/dist/DevTools/index.d.ts +2 -0
  46. package/dist/DevTools/index.d.ts.map +1 -1
  47. package/dist/DevTools/index.js +2 -0
  48. package/dist/DevTools/index.js.map +1 -1
  49. package/dist/DevTools/tab-strip-lab.component.d.ts +76 -0
  50. package/dist/DevTools/tab-strip-lab.component.d.ts.map +1 -0
  51. package/dist/DevTools/tab-strip-lab.component.js +247 -0
  52. package/dist/DevTools/tab-strip-lab.component.js.map +1 -0
  53. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  54. package/dist/Home/home-dashboard.component.js +0 -6
  55. package/dist/Home/home-dashboard.component.js.map +1 -1
  56. package/dist/Integration/components/activity/activity.component.d.ts +4 -4
  57. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  58. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  59. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts +1 -1
  60. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
  61. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  62. package/dist/Integration/components/overview/overview.component.d.ts +2 -1
  63. package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
  64. package/dist/Integration/components/overview/overview.component.js +7 -3
  65. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  66. package/dist/Integration/components/pipelines/pipelines.component.d.ts +3 -3
  67. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  68. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  69. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts +3 -3
  70. package/dist/Integration/components/visual-editor/visual-editor.component.d.ts.map +1 -1
  71. package/dist/Integration/components/visual-editor/visual-editor.component.js.map +1 -1
  72. package/dist/Integration/components/widgets/run-history-panel.component.d.ts +1 -1
  73. package/dist/Integration/components/widgets/run-history-panel.component.d.ts.map +1 -1
  74. package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
  75. package/dist/Integration/services/integration-data.service.d.ts +8 -8
  76. package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
  77. package/dist/Integration/services/integration-data.service.js +2 -1
  78. package/dist/Integration/services/integration-data.service.js.map +1 -1
  79. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  80. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +5 -15
  81. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  82. package/dist/Testing/components/testing-explorer.component.d.ts +9 -0
  83. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  84. package/dist/Testing/components/testing-explorer.component.js +28 -5
  85. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  86. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  87. package/dist/VersionHistory/components/labels-resource.component.js +7 -4
  88. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  89. package/dist/Workflows/components/create-workflow.component.d.ts +91 -0
  90. package/dist/Workflows/components/create-workflow.component.d.ts.map +1 -0
  91. package/dist/Workflows/components/create-workflow.component.js +414 -0
  92. package/dist/Workflows/components/create-workflow.component.js.map +1 -0
  93. package/dist/Workflows/components/workflow-run-sorting.d.ts +29 -0
  94. package/dist/Workflows/components/workflow-run-sorting.d.ts.map +1 -0
  95. package/dist/Workflows/components/workflow-run-sorting.js +59 -0
  96. package/dist/Workflows/components/workflow-run-sorting.js.map +1 -0
  97. package/dist/Workflows/components/workflow-runs-resource.component.d.ts +143 -0
  98. package/dist/Workflows/components/workflow-runs-resource.component.d.ts.map +1 -0
  99. package/dist/Workflows/components/workflow-runs-resource.component.js +676 -0
  100. package/dist/Workflows/components/workflow-runs-resource.component.js.map +1 -0
  101. package/dist/Workflows/components/workflows-resource.component.d.ts +16 -0
  102. package/dist/Workflows/components/workflows-resource.component.d.ts.map +1 -0
  103. package/dist/Workflows/components/workflows-resource.component.js +45 -0
  104. package/dist/Workflows/components/workflows-resource.component.js.map +1 -0
  105. package/dist/Workflows/workflows-dashboard.component.d.ts +70 -0
  106. package/dist/Workflows/workflows-dashboard.component.d.ts.map +1 -0
  107. package/dist/Workflows/workflows-dashboard.component.js +354 -0
  108. package/dist/Workflows/workflows-dashboard.component.js.map +1 -0
  109. package/dist/Workflows/workflows.types.d.ts +95 -0
  110. package/dist/Workflows/workflows.types.d.ts.map +1 -0
  111. package/dist/Workflows/workflows.types.js +41 -0
  112. package/dist/Workflows/workflows.types.js.map +1 -0
  113. package/dist/actions-dashboards.module.d.ts +23 -24
  114. package/dist/actions-dashboards.module.d.ts.map +1 -1
  115. package/dist/actions-dashboards.module.js +0 -5
  116. package/dist/actions-dashboards.module.js.map +1 -1
  117. package/dist/core-dashboards.module.d.ts +46 -42
  118. package/dist/core-dashboards.module.d.ts.map +1 -1
  119. package/dist/core-dashboards.module.js +22 -0
  120. package/dist/core-dashboards.module.js.map +1 -1
  121. package/dist/module.d.ts +18 -17
  122. package/dist/module.d.ts.map +1 -1
  123. package/dist/module.js +7 -0
  124. package/dist/module.js.map +1 -1
  125. package/dist/public-api.d.ts +7 -1
  126. package/dist/public-api.d.ts.map +1 -1
  127. package/dist/public-api.js +8 -1
  128. package/dist/public-api.js.map +1 -1
  129. package/dist/shared/action-scheduled-job.d.ts +58 -0
  130. package/dist/shared/action-scheduled-job.d.ts.map +1 -0
  131. package/dist/shared/action-scheduled-job.js +77 -0
  132. package/dist/shared/action-scheduled-job.js.map +1 -0
  133. package/dist/shared/date-cell.d.ts +34 -0
  134. package/dist/shared/date-cell.d.ts.map +1 -0
  135. package/dist/shared/date-cell.js +57 -0
  136. package/dist/shared/date-cell.js.map +1 -0
  137. package/dist/workflows-dashboards.module.d.ts +40 -0
  138. package/dist/workflows-dashboards.module.d.ts.map +1 -0
  139. package/dist/workflows-dashboards.module.js +118 -0
  140. package/dist/workflows-dashboards.module.js.map +1 -0
  141. package/package.json +70 -64
  142. package/dist/Actions/components/scheduled-actions.component.d.ts +0 -16
  143. package/dist/Actions/components/scheduled-actions.component.d.ts.map +0 -1
  144. package/dist/Actions/components/scheduled-actions.component.js +0 -57
  145. package/dist/Actions/components/scheduled-actions.component.js.map +0 -1
@@ -145,7 +145,7 @@ export class ClassifyItemGridComponent extends BaseAngularComponent {
145
145
  { field: 'TagCount', headerName: 'Tags', width: 90, type: 'numericColumn' },
146
146
  { field: 'TaggingStatus', headerName: 'Status', width: 130 },
147
147
  { field: 'UpdatedAt', headerName: 'Updated', width: 160, sort: 'desc',
148
- comparator: (_a, _b, nodeA, nodeB) => (nodeA.data?.UpdatedAtRaw ?? '').localeCompare(nodeB.data?.UpdatedAtRaw ?? '') },
148
+ comparator: (_a, _b, nodeA, nodeB) => (nodeA.data?.UpdatedAtRaw ?? 0) - (nodeB.data?.UpdatedAtRaw ?? 0) },
149
149
  ];
150
150
  OnGridReady(event) {
151
151
  this.gridApi = event.api;
@@ -255,7 +255,7 @@ export class ClassifyItemGridComponent extends BaseAngularComponent {
255
255
  }
256
256
  toRow(r, tagCounts) {
257
257
  const id = r['ID'];
258
- const updatedAt = r['__mj_UpdatedAt'] ?? '';
258
+ const updatedAt = r['__mj_UpdatedAt'] ?? null;
259
259
  return {
260
260
  ID: id,
261
261
  DisplayName: deriveDisplayName({ Name: r['Name'], Description: r['Description'] }),
@@ -264,7 +264,7 @@ export class ClassifyItemGridComponent extends BaseAngularComponent {
264
264
  EmbeddingStatus: r['EmbeddingStatus'] ?? '',
265
265
  TaggingStatus: r['TaggingStatus'] ?? '',
266
266
  UpdatedAt: updatedAt ? formatDate(updatedAt) : '—',
267
- UpdatedAtRaw: updatedAt,
267
+ UpdatedAtRaw: updatedAt ? new Date(updatedAt).getTime() : 0,
268
268
  };
269
269
  }
270
270
  applyRows(rows, total) {
@@ -1 +1 @@
1
- {"version":3,"file":"classify-item-grid.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/components/classify-item-grid.component.ts","../../../../../src/AI/components/autotagging/components/classify-item-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Classify · Content Item Grid (Phase 4 audit/analytics).\n *\n * Thin, reusable AG Grid listing of content items in one of two modes:\n * - scoped to a single pipeline run via `[RunID]` (items processed in that run), or\n * - all items (when `[RunID]` is null).\n *\n * Read-only: uses `ResultType:'simple'` + an explicit narrow `Fields` list, and a\n * load-more / page-size widening approach mirroring the host dashboard. Selecting a\n * row bubbles `(ItemSelected)` UP — this component owns no navigation (the host owns\n * NavigationService and opens the drilldown).\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 ColDef,\n GridApi,\n GridOptions,\n GridReadyEvent,\n ModuleRegistry,\n AllCommunityModule,\n Theme,\n themeAlpine,\n RowClickedEvent,\n} from 'ag-grid-community';\nimport { ClassifyItemGridRow } from '../shared/classify.types';\nimport { deriveDisplayName, formatDate } from '../shared/classify.format';\n\n// Register AG Grid community modules once (idempotent across grids in the bundle).\nModuleRegistry.registerModules([AllCommunityModule]);\n\n@Component({\n standalone: false,\n selector: 'classify-item-grid',\n templateUrl: './classify-item-grid.component.html',\n styleUrls: ['./classify-item-grid.component.css'],\n})\nexport class ClassifyItemGridComponent extends BaseAngularComponent {\n private cdr = inject(ChangeDetectorRef);\n\n /** One page worth of additional rows fetched when \"Load more\" is clicked. */\n private static readonly PAGE_SIZE = 100;\n\n /**\n * When set, scope the grid to items processed by this pipeline run. When null,\n * show all content items. Re-fetches on change (setter pattern, not ngOnChanges).\n */\n private _runID: string | null = null;\n @Input()\n set RunID(value: string | null) {\n if (value === this._runID) return;\n this._runID = value;\n this._pageSize = ClassifyItemGridComponent.PAGE_SIZE;\n void this.loadItems();\n }\n get RunID(): string | null {\n return this._runID;\n }\n\n /** When true, the grid loads its data on init. Lets a parent defer the query until the section is shown. */\n private _autoLoad = true;\n @Input()\n set AutoLoad(value: boolean) {\n const was = this._autoLoad;\n this._autoLoad = value;\n if (value && !was && !this._loaded) void this.loadItems();\n }\n get AutoLoad(): boolean {\n return this._autoLoad;\n }\n\n /** Emits the selected content item's ID when a row is clicked. */\n @Output() ItemSelected = new EventEmitter<string>();\n\n public Rows: ClassifyItemGridRow[] = [];\n public IsLoading = false;\n public IsLoadingMore = false;\n public TotalCount = 0;\n\n private _loaded = false;\n private _pageSize = ClassifyItemGridComponent.PAGE_SIZE;\n private gridApi: GridApi | null = null;\n\n public get HasMore(): boolean {\n return this.TotalCount > this.Rows.length;\n }\n\n // ── AG Grid configuration ──\n\n public Theme: Theme = themeAlpine.withParams({\n backgroundColor: 'var(--mj-bg-surface)',\n foregroundColor: 'var(--mj-text-primary)',\n textColor: 'var(--mj-text-primary)',\n borderColor: 'var(--mj-border-default)',\n chromeBackgroundColor: 'var(--mj-bg-surface-card)',\n headerBackgroundColor: 'var(--mj-bg-surface-card)',\n headerTextColor: 'var(--mj-text-secondary)',\n cellTextColor: 'var(--mj-text-primary)',\n subtleTextColor: 'var(--mj-text-muted)',\n dataBackgroundColor: 'var(--mj-bg-surface)',\n oddRowBackgroundColor: 'var(--mj-bg-surface-card)',\n rowHoverColor: 'var(--mj-bg-surface-hover, color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface)))',\n selectedRowBackgroundColor: 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))',\n accentColor: 'var(--mj-brand-primary)',\n borderRadius: 'var(--mj-radius-sm)',\n browserColorScheme: 'inherit',\n });\n\n public GridOptions: GridOptions<ClassifyItemGridRow> = {\n animateRows: true,\n rowHeight: 36,\n headerHeight: 40,\n suppressCellFocus: true,\n enableCellTextSelection: true,\n suppressNoRowsOverlay: true,\n };\n\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n minWidth: 80,\n };\n\n public ColumnDefs: ColDef<ClassifyItemGridRow>[] = [\n { field: 'DisplayName', headerName: 'Item', flex: 2, minWidth: 220, tooltipField: 'DisplayName' },\n { field: 'SourceName', headerName: 'Source', flex: 1, minWidth: 140 },\n { field: 'TagCount', headerName: 'Tags', width: 90, type: 'numericColumn' },\n { field: 'TaggingStatus', headerName: 'Status', width: 130 },\n { field: 'UpdatedAt', headerName: 'Updated', width: 160, sort: 'desc',\n comparator: (_a, _b, nodeA, nodeB) =>\n (nodeA.data?.UpdatedAtRaw ?? '').localeCompare(nodeB.data?.UpdatedAtRaw ?? '') },\n ];\n\n public OnGridReady(event: GridReadyEvent<ClassifyItemGridRow>): void {\n this.gridApi = event.api;\n this.gridApi.setGridOption('rowData', this.Rows);\n }\n\n public OnRowClicked(event: RowClickedEvent<ClassifyItemGridRow>): void {\n if (event.data) this.ItemSelected.emit(event.data.ID);\n }\n\n /** Public refresh entry point (parent toolbar / load-more handler). */\n public async Reload(): Promise<void> {\n this._pageSize = ClassifyItemGridComponent.PAGE_SIZE;\n await this.loadItems();\n }\n\n public async LoadMore(): Promise<void> {\n if (this.IsLoadingMore || !this.HasMore) return;\n this.IsLoadingMore = true;\n this.cdr.detectChanges();\n this._pageSize += ClassifyItemGridComponent.PAGE_SIZE;\n await this.loadItems();\n this.IsLoadingMore = false;\n this.cdr.detectChanges();\n }\n\n private async loadItems(): Promise<void> {\n if (!this._autoLoad) return;\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n // When scoped to a run, resolve the run's source + time window so we can\n // constrain the item query. There is no per-item run join table in the\n // schema, so we scope by ContentSource + the run's processing window\n // (same time-correlation basis the rest of the pipeline uses).\n let extraFilter = '';\n if (this._runID) {\n const scope = await this.resolveRunScope(this._runID);\n if (scope === null) {\n this.applyRows([], 0);\n return;\n }\n extraFilter = scope;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: 'MJ: Content Items',\n ExtraFilter: extraFilter,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: this._pageSize,\n StartRow: 0,\n ResultType: 'simple',\n Fields: ['ID', 'Name', 'Description', 'ContentSource', 'TaggingStatus', 'EmbeddingStatus', '__mj_UpdatedAt'],\n }, this.ProviderToUse.CurrentUser);\n\n if (!result.Success) {\n this.applyRows([], 0);\n return;\n }\n\n const tagCounts = await this.loadTagCounts(result.Results.map(r => r['ID'] as string));\n const rows = result.Results.map(r => this.toRow(r, tagCounts));\n this.applyRows(rows, result.TotalRowCount);\n }\n\n /**\n * Build the item-level filter that scopes to a pipeline run: the run's\n * ContentSource, optionally bounded by the run's processing window. Returns\n * null on a hard failure (so the caller short-circuits to an empty grid).\n */\n private async resolveRunScope(runID: string): Promise<string | null> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ SourceID: string; StartTime: string | null; EndTime: string | null }>({\n EntityName: 'MJ: Content Process Runs',\n ExtraFilter: `ID='${runID}'`,\n Fields: ['SourceID', 'StartTime', 'EndTime'],\n ResultType: 'simple',\n }, this.ProviderToUse.CurrentUser);\n if (!result.Success || result.Results.length === 0) return null;\n\n const run = result.Results[0];\n const fragments = [`ContentSourceID='${run.SourceID.replace(/'/g, '')}'`];\n if (run.StartTime) fragments.push(`__mj_UpdatedAt >= '${this.toSqlDate(run.StartTime)}'`);\n if (run.EndTime) fragments.push(`__mj_UpdatedAt <= '${this.toSqlDate(run.EndTime)}'`);\n return fragments.join(' AND ');\n }\n\n /** Format an ISO date value for a SQL string literal (UTC, no tz suffix surprises). */\n private toSqlDate(value: string): string {\n const d = new Date(value);\n return isNaN(d.getTime()) ? value.replace(/'/g, '') : d.toISOString().replace('T', ' ').replace('Z', '');\n }\n\n /** Count tags per item for the visible page (one RunView, aggregated client-side). */\n private async loadTagCounts(itemIDs: string[]): Promise<Map<string, number>> {\n const counts = new Map<string, number>();\n if (itemIDs.length === 0) return counts;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ItemID: string }>({\n EntityName: 'MJ: Content Item Tags',\n ExtraFilter: this.buildItemIDInFilter(itemIDs, 'ItemID'),\n Fields: ['ItemID'],\n ResultType: 'simple',\n }, this.ProviderToUse.CurrentUser);\n if (result.Success) {\n for (const r of result.Results) {\n counts.set(r.ItemID, (counts.get(r.ItemID) ?? 0) + 1);\n }\n }\n return counts;\n }\n\n private toRow(r: Record<string, unknown>, tagCounts: Map<string, number>): ClassifyItemGridRow {\n const id = r['ID'] as string;\n const updatedAt = (r['__mj_UpdatedAt'] as string) ?? '';\n return {\n ID: id,\n DisplayName: deriveDisplayName({ Name: r['Name'] as string | null, Description: r['Description'] as string | null }),\n SourceName: (r['ContentSource'] as string) ?? 'Unknown',\n TagCount: tagCounts.get(id) ?? 0,\n EmbeddingStatus: (r['EmbeddingStatus'] as string) ?? '',\n TaggingStatus: (r['TaggingStatus'] as string) ?? '',\n UpdatedAt: updatedAt ? formatDate(updatedAt) : '—',\n UpdatedAtRaw: updatedAt,\n };\n }\n\n private applyRows(rows: ClassifyItemGridRow[], total: number): void {\n this.Rows = rows;\n this.TotalCount = total;\n this.IsLoading = false;\n this._loaded = true;\n this.gridApi?.setGridOption('rowData', rows);\n this.cdr.detectChanges();\n }\n\n /** Build an `IN (...)` filter from item IDs, defensively stripping quotes. */\n private buildItemIDInFilter(ids: string[], column = 'ID'): string {\n const quoted = ids.map(id => `'${id.replace(/'/g, '')}'`).join(',');\n return `${column} IN (${quoted})`;\n }\n}\n","<div class=\"cig-wrap\">\n @if (IsLoading && Rows.length === 0) {\n <mj-loading text=\"Loading items...\" size=\"small\"></mj-loading>\n } @else if (Rows.length === 0) {\n <mj-empty-state class=\"cig-empty\" Icon=\"fa-solid fa-inbox\" Title=\"No content items found.\" />\n } @else {\n <ag-grid-angular\n class=\"cig-grid\"\n [theme]=\"Theme\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [gridOptions]=\"GridOptions\"\n [rowData]=\"Rows\"\n (gridReady)=\"OnGridReady($event)\"\n (rowClicked)=\"OnRowClicked($event)\">\n </ag-grid-angular>\n\n <div class=\"cig-footer\">\n <span class=\"cig-count\">Showing {{ Rows.length }} of {{ TotalCount }} items</span>\n @if (HasMore) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"LoadMore()\" [disabled]=\"IsLoadingMore\">\n @if (IsLoadingMore) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading…\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Load more\n }\n </button>\n }\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"classify-item-grid.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/components/classify-item-grid.component.ts","../../../../../src/AI/components/autotagging/components/classify-item-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Classify · Content Item Grid (Phase 4 audit/analytics).\n *\n * Thin, reusable AG Grid listing of content items in one of two modes:\n * - scoped to a single pipeline run via `[RunID]` (items processed in that run), or\n * - all items (when `[RunID]` is null).\n *\n * Read-only: uses `ResultType:'simple'` + an explicit narrow `Fields` list, and a\n * load-more / page-size widening approach mirroring the host dashboard. Selecting a\n * row bubbles `(ItemSelected)` UP — this component owns no navigation (the host owns\n * NavigationService and opens the drilldown).\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 ColDef,\n GridApi,\n GridOptions,\n GridReadyEvent,\n ModuleRegistry,\n AllCommunityModule,\n Theme,\n themeAlpine,\n RowClickedEvent,\n} from 'ag-grid-community';\nimport { ClassifyItemGridRow } from '../shared/classify.types';\nimport { deriveDisplayName, formatDate } from '../shared/classify.format';\n\n// Register AG Grid community modules once (idempotent across grids in the bundle).\nModuleRegistry.registerModules([AllCommunityModule]);\n\n@Component({\n standalone: false,\n selector: 'classify-item-grid',\n templateUrl: './classify-item-grid.component.html',\n styleUrls: ['./classify-item-grid.component.css'],\n})\nexport class ClassifyItemGridComponent extends BaseAngularComponent {\n private cdr = inject(ChangeDetectorRef);\n\n /** One page worth of additional rows fetched when \"Load more\" is clicked. */\n private static readonly PAGE_SIZE = 100;\n\n /**\n * When set, scope the grid to items processed by this pipeline run. When null,\n * show all content items. Re-fetches on change (setter pattern, not ngOnChanges).\n */\n private _runID: string | null = null;\n @Input()\n set RunID(value: string | null) {\n if (value === this._runID) return;\n this._runID = value;\n this._pageSize = ClassifyItemGridComponent.PAGE_SIZE;\n void this.loadItems();\n }\n get RunID(): string | null {\n return this._runID;\n }\n\n /** When true, the grid loads its data on init. Lets a parent defer the query until the section is shown. */\n private _autoLoad = true;\n @Input()\n set AutoLoad(value: boolean) {\n const was = this._autoLoad;\n this._autoLoad = value;\n if (value && !was && !this._loaded) void this.loadItems();\n }\n get AutoLoad(): boolean {\n return this._autoLoad;\n }\n\n /** Emits the selected content item's ID when a row is clicked. */\n @Output() ItemSelected = new EventEmitter<string>();\n\n public Rows: ClassifyItemGridRow[] = [];\n public IsLoading = false;\n public IsLoadingMore = false;\n public TotalCount = 0;\n\n private _loaded = false;\n private _pageSize = ClassifyItemGridComponent.PAGE_SIZE;\n private gridApi: GridApi | null = null;\n\n public get HasMore(): boolean {\n return this.TotalCount > this.Rows.length;\n }\n\n // ── AG Grid configuration ──\n\n public Theme: Theme = themeAlpine.withParams({\n backgroundColor: 'var(--mj-bg-surface)',\n foregroundColor: 'var(--mj-text-primary)',\n textColor: 'var(--mj-text-primary)',\n borderColor: 'var(--mj-border-default)',\n chromeBackgroundColor: 'var(--mj-bg-surface-card)',\n headerBackgroundColor: 'var(--mj-bg-surface-card)',\n headerTextColor: 'var(--mj-text-secondary)',\n cellTextColor: 'var(--mj-text-primary)',\n subtleTextColor: 'var(--mj-text-muted)',\n dataBackgroundColor: 'var(--mj-bg-surface)',\n oddRowBackgroundColor: 'var(--mj-bg-surface-card)',\n rowHoverColor: 'var(--mj-bg-surface-hover, color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface)))',\n selectedRowBackgroundColor: 'color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface))',\n accentColor: 'var(--mj-brand-primary)',\n borderRadius: 'var(--mj-radius-sm)',\n browserColorScheme: 'inherit',\n });\n\n public GridOptions: GridOptions<ClassifyItemGridRow> = {\n animateRows: true,\n rowHeight: 36,\n headerHeight: 40,\n suppressCellFocus: true,\n enableCellTextSelection: true,\n suppressNoRowsOverlay: true,\n };\n\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n minWidth: 80,\n };\n\n public ColumnDefs: ColDef<ClassifyItemGridRow>[] = [\n { field: 'DisplayName', headerName: 'Item', flex: 2, minWidth: 220, tooltipField: 'DisplayName' },\n { field: 'SourceName', headerName: 'Source', flex: 1, minWidth: 140 },\n { field: 'TagCount', headerName: 'Tags', width: 90, type: 'numericColumn' },\n { field: 'TaggingStatus', headerName: 'Status', width: 130 },\n { field: 'UpdatedAt', headerName: 'Updated', width: 160, sort: 'desc',\n comparator: (_a, _b, nodeA, nodeB) =>\n (nodeA.data?.UpdatedAtRaw ?? 0) - (nodeB.data?.UpdatedAtRaw ?? 0) },\n ];\n\n public OnGridReady(event: GridReadyEvent<ClassifyItemGridRow>): void {\n this.gridApi = event.api;\n this.gridApi.setGridOption('rowData', this.Rows);\n }\n\n public OnRowClicked(event: RowClickedEvent<ClassifyItemGridRow>): void {\n if (event.data) this.ItemSelected.emit(event.data.ID);\n }\n\n /** Public refresh entry point (parent toolbar / load-more handler). */\n public async Reload(): Promise<void> {\n this._pageSize = ClassifyItemGridComponent.PAGE_SIZE;\n await this.loadItems();\n }\n\n public async LoadMore(): Promise<void> {\n if (this.IsLoadingMore || !this.HasMore) return;\n this.IsLoadingMore = true;\n this.cdr.detectChanges();\n this._pageSize += ClassifyItemGridComponent.PAGE_SIZE;\n await this.loadItems();\n this.IsLoadingMore = false;\n this.cdr.detectChanges();\n }\n\n private async loadItems(): Promise<void> {\n if (!this._autoLoad) return;\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n // When scoped to a run, resolve the run's source + time window so we can\n // constrain the item query. There is no per-item run join table in the\n // schema, so we scope by ContentSource + the run's processing window\n // (same time-correlation basis the rest of the pipeline uses).\n let extraFilter = '';\n if (this._runID) {\n const scope = await this.resolveRunScope(this._runID);\n if (scope === null) {\n this.applyRows([], 0);\n return;\n }\n extraFilter = scope;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: 'MJ: Content Items',\n ExtraFilter: extraFilter,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: this._pageSize,\n StartRow: 0,\n ResultType: 'simple',\n Fields: ['ID', 'Name', 'Description', 'ContentSource', 'TaggingStatus', 'EmbeddingStatus', '__mj_UpdatedAt'],\n }, this.ProviderToUse.CurrentUser);\n\n if (!result.Success) {\n this.applyRows([], 0);\n return;\n }\n\n const tagCounts = await this.loadTagCounts(result.Results.map(r => r['ID'] as string));\n const rows = result.Results.map(r => this.toRow(r, tagCounts));\n this.applyRows(rows, result.TotalRowCount);\n }\n\n /**\n * Build the item-level filter that scopes to a pipeline run: the run's\n * ContentSource, optionally bounded by the run's processing window. Returns\n * null on a hard failure (so the caller short-circuits to an empty grid).\n */\n private async resolveRunScope(runID: string): Promise<string | null> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ SourceID: string; StartTime: string | null; EndTime: string | null }>({\n EntityName: 'MJ: Content Process Runs',\n ExtraFilter: `ID='${runID}'`,\n Fields: ['SourceID', 'StartTime', 'EndTime'],\n ResultType: 'simple',\n }, this.ProviderToUse.CurrentUser);\n if (!result.Success || result.Results.length === 0) return null;\n\n const run = result.Results[0];\n const fragments = [`ContentSourceID='${run.SourceID.replace(/'/g, '')}'`];\n if (run.StartTime) fragments.push(`__mj_UpdatedAt >= '${this.toSqlDate(run.StartTime)}'`);\n if (run.EndTime) fragments.push(`__mj_UpdatedAt <= '${this.toSqlDate(run.EndTime)}'`);\n return fragments.join(' AND ');\n }\n\n /** Format an ISO date value for a SQL string literal (UTC, no tz suffix surprises). */\n private toSqlDate(value: string): string {\n const d = new Date(value);\n return isNaN(d.getTime()) ? value.replace(/'/g, '') : d.toISOString().replace('T', ' ').replace('Z', '');\n }\n\n /** Count tags per item for the visible page (one RunView, aggregated client-side). */\n private async loadTagCounts(itemIDs: string[]): Promise<Map<string, number>> {\n const counts = new Map<string, number>();\n if (itemIDs.length === 0) return counts;\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<{ ItemID: string }>({\n EntityName: 'MJ: Content Item Tags',\n ExtraFilter: this.buildItemIDInFilter(itemIDs, 'ItemID'),\n Fields: ['ItemID'],\n ResultType: 'simple',\n }, this.ProviderToUse.CurrentUser);\n if (result.Success) {\n for (const r of result.Results) {\n counts.set(r.ItemID, (counts.get(r.ItemID) ?? 0) + 1);\n }\n }\n return counts;\n }\n\n private toRow(r: Record<string, unknown>, tagCounts: Map<string, number>): ClassifyItemGridRow {\n const id = r['ID'] as string;\n const updatedAt = (r['__mj_UpdatedAt'] as Date | string | null) ?? null;\n return {\n ID: id,\n DisplayName: deriveDisplayName({ Name: r['Name'] as string | null, Description: r['Description'] as string | null }),\n SourceName: (r['ContentSource'] as string) ?? 'Unknown',\n TagCount: tagCounts.get(id) ?? 0,\n EmbeddingStatus: (r['EmbeddingStatus'] as string) ?? '',\n TaggingStatus: (r['TaggingStatus'] as string) ?? '',\n UpdatedAt: updatedAt ? formatDate(updatedAt) : '—',\n UpdatedAtRaw: updatedAt ? new Date(updatedAt).getTime() : 0,\n };\n }\n\n private applyRows(rows: ClassifyItemGridRow[], total: number): void {\n this.Rows = rows;\n this.TotalCount = total;\n this.IsLoading = false;\n this._loaded = true;\n this.gridApi?.setGridOption('rowData', rows);\n this.cdr.detectChanges();\n }\n\n /** Build an `IN (...)` filter from item IDs, defensively stripping quotes. */\n private buildItemIDInFilter(ids: string[], column = 'ID'): string {\n const quoted = ids.map(id => `'${id.replace(/'/g, '')}'`).join(',');\n return `${column} IN (${quoted})`;\n }\n}\n","<div class=\"cig-wrap\">\n @if (IsLoading && Rows.length === 0) {\n <mj-loading text=\"Loading items...\" size=\"small\"></mj-loading>\n } @else if (Rows.length === 0) {\n <mj-empty-state class=\"cig-empty\" Icon=\"fa-solid fa-inbox\" Title=\"No content items found.\" />\n } @else {\n <ag-grid-angular\n class=\"cig-grid\"\n [theme]=\"Theme\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [gridOptions]=\"GridOptions\"\n [rowData]=\"Rows\"\n (gridReady)=\"OnGridReady($event)\"\n (rowClicked)=\"OnRowClicked($event)\">\n </ag-grid-angular>\n\n <div class=\"cig-footer\">\n <span class=\"cig-count\">Showing {{ Rows.length }} of {{ TotalCount }} items</span>\n @if (HasMore) {\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"LoadMore()\" [disabled]=\"IsLoadingMore\">\n @if (IsLoadingMore) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading…\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Load more\n }\n </button>\n }\n </div>\n }\n</div>\n"]}
@@ -30,7 +30,7 @@ export declare function tagFontSize(weight: number): string;
30
30
  /** Short date (e.g. "Mar 5"). Returns '' on parse failure. */
31
31
  export declare function formatShortDate(dateStr: string): string;
32
32
  /** Date + time (e.g. "Mar 5, 2:05 PM"). Echoes the input on parse failure. */
33
- export declare function formatDate(dateStr: string): string;
33
+ export declare function formatDate(dateStr: Date | string): string;
34
34
  /** Human-friendly elapsed duration between two ISO timestamps; open-ended if `end` is null. */
35
35
  export declare function computeDuration(start: string | null, end: string | null): string;
36
36
  /** Normalize a raw run status to one of the canonical display labels. */
@@ -1 +1 @@
1
- {"version":3,"file":"classify.format.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,CAYrG;AAgCD,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAUhF;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,EAAE,CAyBtF;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD"}
1
+ {"version":3,"file":"classify.format.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,CAYrG;AAgCD,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAMzD;AAED,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAUhF;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,8DAA8D;AAC9D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,EAAE,CAyBtF;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQxD"}
@@ -86,7 +86,7 @@ export function formatDate(dateStr) {
86
86
  return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });
87
87
  }
88
88
  catch {
89
- return dateStr;
89
+ return String(dateStr);
90
90
  }
91
91
  }
92
92
  /** Human-friendly elapsed duration between two ISO timestamps; open-ended if `end` is null. */
@@ -1 +1 @@
1
- {"version":3,"file":"classify.format.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.format.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Pure formatting/mapping helpers for the Classify (autotagging) sub-app.\n * Extracted from the former monolith so host + tabs share one implementation (DRY).\n * All functions are stateless — no `this`, no DI — so they're safe to import anywhere.\n */\nimport { RunDetailRow } from './classify.types';\n\n/** Locale-formatted integer (e.g. 12345 → \"12,345\"). */\nexport function formatNumber(n: number): string {\n return n.toLocaleString();\n}\n\n/**\n * Derive a human-meaningful display name for a content item.\n *\n * Entity-sourced content items now carry a real per-record `Name` (the source\n * entity's name field — e.g. \"GPT-4\"), so we prefer `Name` directly. Only when a\n * Name is missing (or is a generic source-name placeholder) do we fall back to\n * the first meaningful line of the LLM-generated `Description` to keep rows\n * distinguishable, then to a placeholder.\n *\n * Pure/stateless — safe to call from any render site.\n */\nexport function deriveDisplayName(item: { Name?: string | null; Description?: string | null }): string {\n const name = item?.Name?.trim();\n if (name) {\n return name.length > DISPLAY_NAME_MAX_LEN\n ? `${name.slice(0, DISPLAY_NAME_MAX_LEN).trimEnd()}…`\n : name;\n }\n\n const fromDescription = firstMeaningfulLine(item?.Description);\n if (fromDescription) return fromDescription;\n\n return '(Untitled)';\n}\n\n/** Max length of a derived display name before it is truncated with an ellipsis. */\nconst DISPLAY_NAME_MAX_LEN = 80;\n\n/**\n * Returns the first non-empty, markdown-stripped line of a description, clamped\n * to DISPLAY_NAME_MAX_LEN characters. Returns null when nothing meaningful remains.\n */\nfunction firstMeaningfulLine(description: string | null | undefined): string | null {\n if (!description) return null;\n\n for (const rawLine of description.split(/\\r?\\n/)) {\n const cleaned = stripMarkdown(rawLine);\n if (cleaned.length === 0) continue;\n return cleaned.length > DISPLAY_NAME_MAX_LEN\n ? `${cleaned.slice(0, DISPLAY_NAME_MAX_LEN).trimEnd()}…`\n : cleaned;\n }\n return null;\n}\n\n/** Strip leading markdown markers (#, *, -, >, backticks) and collapse whitespace. */\nfunction stripMarkdown(line: string): string {\n return line\n .replace(/^[#>\\s]*/g, '') // leading heading / blockquote markers + space\n .replace(/^[-*+]\\s+/, '') // leading bullet markers\n .replace(/[`*_~]/g, '') // inline emphasis / code markers\n .replace(/\\s+/g, ' ') // collapse runs of whitespace\n .trim();\n}\n\n/** Compact token count (e.g. 1500 → \"2K\", 2_400_000 → \"2.4M\"). */\nexport function formatTokenCount(tokens: number): string {\n if (tokens >= 1000000) return `${(tokens / 1000000).toFixed(1)}M`;\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(0)}K`;\n return String(tokens);\n}\n\n/** Weight (0.0–1.0) as a percentage string (e.g. 0.42 → \"42%\"). */\nexport function formatWeight(weight: number): string {\n return `${Math.round(weight * 100)}%`;\n}\n\n/** Font size in rem for a tag chip based on weight (0.0–1.0), clamped to 0.7–1.0rem. */\nexport function tagFontSize(weight: number): string {\n const min = 0.7;\n const max = 1.0;\n return `${min + (max - min) * Math.min(1, Math.max(0, weight))}rem`;\n}\n\n/** Short date (e.g. \"Mar 5\"). Returns '' on parse failure. */\nexport function formatShortDate(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n}\n\n/** Date + time (e.g. \"Mar 5, 2:05 PM\"). Echoes the input on parse failure. */\nexport function formatDate(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n } catch {\n return dateStr;\n }\n}\n\n/** Human-friendly elapsed duration between two ISO timestamps; open-ended if `end` is null. */\nexport function computeDuration(start: string | null, end: string | null): string {\n if (!start) return '—';\n const s = new Date(start);\n const e = end ? new Date(end) : new Date();\n const ms = e.getTime() - s.getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${Math.round(ms / 1000)}s`;\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\n/** Normalize a raw run status to one of the canonical display labels. */\nexport function displayStatus(status: string): string {\n const lower = status.toLowerCase();\n if (lower === 'complete' || lower === 'completed' || lower === 'done') return 'Complete';\n if (lower === 'error' || lower === 'failed') return 'Failed';\n if (lower === 'running' || lower === 'processing') return 'Running';\n return status;\n}\n\n/** Font Awesome icon class for a content source type name. */\nexport function getSourceTypeIcon(typeName: string): string {\n const iconMap: Record<string, string> = {\n 'Web': 'fa-solid fa-globe', 'Web Crawler': 'fa-solid fa-globe',\n 'API': 'fa-solid fa-plug', 'Database': 'fa-solid fa-database',\n 'File': 'fa-solid fa-file-alt', 'Email': 'fa-solid fa-envelope',\n 'RSS': 'fa-solid fa-rss', 'RSS Feed': 'fa-solid fa-rss',\n 'CMS': 'fa-solid fa-newspaper', 'PDF': 'fa-solid fa-file-pdf'\n };\n return iconMap[typeName] ?? 'fa-solid fa-folder';\n}\n\n/** Map raw `MJ: Content Process Run Details` rows to typed RunDetailRow view models. */\nexport function mapRunDetailRecords(records: Record<string, unknown>[]): RunDetailRow[] {\n return records.map(d => {\n const status = String(d['Status'] || 'Pending');\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'failed' || statusLower === 'error';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const startTime = d['StartTime'] ? new Date(String(d['StartTime'])) : null;\n const endTime = d['EndTime'] ? new Date(String(d['EndTime'])) : null;\n const durationMs = startTime && endTime ? endTime.getTime() - startTime.getTime() : 0;\n const durationStr = durationMs > 60000 ? `${Math.round(durationMs / 60000)}m` : `${Math.round(durationMs / 1000)}s`;\n\n return {\n SourceName: String(d['ContentSource'] || 'Unknown'),\n SourceType: String(d['ContentSourceType'] || ''),\n Status: displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n ItemsProcessed: Number(d['ItemsProcessed'] || 0),\n ItemsTagged: Number(d['ItemsTagged'] || 0),\n ItemsVectorized: Number(d['ItemsVectorized'] || 0),\n ErrorCount: Number(d['ErrorCount'] || 0),\n TotalTokens: Number(d['TotalTokensUsed'] || 0),\n TotalCost: Number(d['TotalCost'] || 0),\n Duration: durationStr,\n };\n });\n}\n\n// ================================================================\n// Cron-to-Human-Readable Utility\n// ================================================================\n\n/**\n * Converts a 5-part or 6-part cron expression to a human-readable English string.\n *\n * Handles common patterns:\n * `0 * * * *` -> \"Every hour\"\n * `0 2 * * *` -> \"Daily at 2:00 AM\"\n * `0 2 * * 1` -> \"Weekly on Monday at 2:00 AM\"\n * `star/15 * * * *` -> \"Every 15 minutes\" (where star = asterisk)\n * `0 0 1 * *` -> \"Monthly on day 1 at 12:00 AM\"\n *\n * Falls back to returning the raw cron string for unrecognized patterns.\n *\n * @param cron A cron expression string (5 or 6 parts)\n * @returns A human-readable description or the raw cron if unrecognized\n */\nexport function CronToHumanReadable(cron: string): string {\n if (!cron) return 'No schedule';\n\n const parts = cron.trim().split(/\\s+/);\n const p = parseCronParts(parts);\n if (!p) return cron;\n\n return formatCronParts(p) ?? cron;\n}\n\n/** Internal cron field tuple */\ninterface CronFields {\n Minute: string;\n Hour: string;\n DayOfMonth: string;\n Month: string;\n DayOfWeek: string;\n}\n\n/**\n * Parses 5-part or 6-part cron expressions into normalized fields.\n * 6-part expressions have a leading seconds field that is discarded.\n */\nfunction parseCronParts(parts: string[]): CronFields | null {\n if (parts.length === 5) {\n return { Minute: parts[0], Hour: parts[1], DayOfMonth: parts[2], Month: parts[3], DayOfWeek: parts[4] };\n }\n if (parts.length === 6) {\n return { Minute: parts[1], Hour: parts[2], DayOfMonth: parts[3], Month: parts[4], DayOfWeek: parts[5] };\n }\n return null;\n}\n\n/**\n * Attempts to map parsed cron fields to a human-readable string.\n * Returns null when the pattern is not recognized.\n */\nfunction formatCronParts(p: CronFields): string | null {\n // Every N minutes: */N * * * *\n if (p.Minute.startsWith('*/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n const interval = parseInt(p.Minute.slice(2), 10);\n if (interval === 1) return 'Every minute';\n return `Every ${interval} minutes`;\n }\n\n // Every hour at minute M: M * * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n return 'Every hour';\n }\n\n // Every N hours: 0 */N * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour.startsWith('*/') && p.DayOfMonth === '*') {\n const interval = parseInt(p.Hour.slice(2), 10);\n if (interval === 1) return 'Every hour';\n return `Every ${interval} hours`;\n }\n\n // Specific hour + minute with wildcard or specific day fields\n if (!p.Minute.includes('*') && !p.Minute.includes('/') &&\n !p.Hour.includes('*') && !p.Hour.includes('/') &&\n p.Month === '*') {\n\n const hour = parseInt(p.Hour, 10);\n const minute = parseInt(p.Minute, 10);\n const timeStr = formatTimeOfDay(hour, minute);\n\n // Weekly: specific day of week\n if (p.DayOfWeek !== '*' && p.DayOfMonth === '*') {\n const dayName = dayOfWeekToName(p.DayOfWeek);\n return `Weekly on ${dayName} at ${timeStr}`;\n }\n\n // Monthly: specific day of month\n if (p.DayOfMonth !== '*' && p.DayOfWeek === '*') {\n return `Monthly on day ${p.DayOfMonth} at ${timeStr}`;\n }\n\n // Daily\n if (p.DayOfMonth === '*' && p.DayOfWeek === '*') {\n return `Daily at ${timeStr}`;\n }\n }\n\n return null;\n}\n\n/** Formats hour and minute to 12-hour AM/PM time string */\nfunction formatTimeOfDay(hour: number, minute: number): string {\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const h = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const m = minute.toString().padStart(2, '0');\n return `${h}:${m} ${ampm}`;\n}\n\n/** Maps day-of-week cron values (0-7 or SUN-SAT) to English names */\nfunction dayOfWeekToName(dow: string): string {\n const names: Record<string, string> = {\n '0': 'Sunday', '1': 'Monday', '2': 'Tuesday',\n '3': 'Wednesday', '4': 'Thursday', '5': 'Friday',\n '6': 'Saturday', '7': 'Sunday',\n 'SUN': 'Sunday', 'MON': 'Monday', 'TUE': 'Tuesday',\n 'WED': 'Wednesday', 'THU': 'Thursday', 'FRI': 'Friday',\n 'SAT': 'Saturday',\n };\n return names[dow.toUpperCase()] ?? dow;\n}\n"]}
1
+ {"version":3,"file":"classify.format.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.format.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Pure formatting/mapping helpers for the Classify (autotagging) sub-app.\n * Extracted from the former monolith so host + tabs share one implementation (DRY).\n * All functions are stateless — no `this`, no DI — so they're safe to import anywhere.\n */\nimport { RunDetailRow } from './classify.types';\n\n/** Locale-formatted integer (e.g. 12345 → \"12,345\"). */\nexport function formatNumber(n: number): string {\n return n.toLocaleString();\n}\n\n/**\n * Derive a human-meaningful display name for a content item.\n *\n * Entity-sourced content items now carry a real per-record `Name` (the source\n * entity's name field — e.g. \"GPT-4\"), so we prefer `Name` directly. Only when a\n * Name is missing (or is a generic source-name placeholder) do we fall back to\n * the first meaningful line of the LLM-generated `Description` to keep rows\n * distinguishable, then to a placeholder.\n *\n * Pure/stateless — safe to call from any render site.\n */\nexport function deriveDisplayName(item: { Name?: string | null; Description?: string | null }): string {\n const name = item?.Name?.trim();\n if (name) {\n return name.length > DISPLAY_NAME_MAX_LEN\n ? `${name.slice(0, DISPLAY_NAME_MAX_LEN).trimEnd()}…`\n : name;\n }\n\n const fromDescription = firstMeaningfulLine(item?.Description);\n if (fromDescription) return fromDescription;\n\n return '(Untitled)';\n}\n\n/** Max length of a derived display name before it is truncated with an ellipsis. */\nconst DISPLAY_NAME_MAX_LEN = 80;\n\n/**\n * Returns the first non-empty, markdown-stripped line of a description, clamped\n * to DISPLAY_NAME_MAX_LEN characters. Returns null when nothing meaningful remains.\n */\nfunction firstMeaningfulLine(description: string | null | undefined): string | null {\n if (!description) return null;\n\n for (const rawLine of description.split(/\\r?\\n/)) {\n const cleaned = stripMarkdown(rawLine);\n if (cleaned.length === 0) continue;\n return cleaned.length > DISPLAY_NAME_MAX_LEN\n ? `${cleaned.slice(0, DISPLAY_NAME_MAX_LEN).trimEnd()}…`\n : cleaned;\n }\n return null;\n}\n\n/** Strip leading markdown markers (#, *, -, >, backticks) and collapse whitespace. */\nfunction stripMarkdown(line: string): string {\n return line\n .replace(/^[#>\\s]*/g, '') // leading heading / blockquote markers + space\n .replace(/^[-*+]\\s+/, '') // leading bullet markers\n .replace(/[`*_~]/g, '') // inline emphasis / code markers\n .replace(/\\s+/g, ' ') // collapse runs of whitespace\n .trim();\n}\n\n/** Compact token count (e.g. 1500 → \"2K\", 2_400_000 → \"2.4M\"). */\nexport function formatTokenCount(tokens: number): string {\n if (tokens >= 1000000) return `${(tokens / 1000000).toFixed(1)}M`;\n if (tokens >= 1000) return `${(tokens / 1000).toFixed(0)}K`;\n return String(tokens);\n}\n\n/** Weight (0.0–1.0) as a percentage string (e.g. 0.42 → \"42%\"). */\nexport function formatWeight(weight: number): string {\n return `${Math.round(weight * 100)}%`;\n}\n\n/** Font size in rem for a tag chip based on weight (0.0–1.0), clamped to 0.7–1.0rem. */\nexport function tagFontSize(weight: number): string {\n const min = 0.7;\n const max = 1.0;\n return `${min + (max - min) * Math.min(1, Math.max(0, weight))}rem`;\n}\n\n/** Short date (e.g. \"Mar 5\"). Returns '' on parse failure. */\nexport function formatShortDate(dateStr: string): string {\n try {\n return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n}\n\n/** Date + time (e.g. \"Mar 5, 2:05 PM\"). Echoes the input on parse failure. */\nexport function formatDate(dateStr: Date | string): string {\n try {\n return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' });\n } catch {\n return String(dateStr);\n }\n}\n\n/** Human-friendly elapsed duration between two ISO timestamps; open-ended if `end` is null. */\nexport function computeDuration(start: string | null, end: string | null): string {\n if (!start) return '—';\n const s = new Date(start);\n const e = end ? new Date(end) : new Date();\n const ms = e.getTime() - s.getTime();\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${Math.round(ms / 1000)}s`;\n const mins = Math.floor(ms / 60000);\n const secs = Math.round((ms % 60000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\n/** Normalize a raw run status to one of the canonical display labels. */\nexport function displayStatus(status: string): string {\n const lower = status.toLowerCase();\n if (lower === 'complete' || lower === 'completed' || lower === 'done') return 'Complete';\n if (lower === 'error' || lower === 'failed') return 'Failed';\n if (lower === 'running' || lower === 'processing') return 'Running';\n return status;\n}\n\n/** Font Awesome icon class for a content source type name. */\nexport function getSourceTypeIcon(typeName: string): string {\n const iconMap: Record<string, string> = {\n 'Web': 'fa-solid fa-globe', 'Web Crawler': 'fa-solid fa-globe',\n 'API': 'fa-solid fa-plug', 'Database': 'fa-solid fa-database',\n 'File': 'fa-solid fa-file-alt', 'Email': 'fa-solid fa-envelope',\n 'RSS': 'fa-solid fa-rss', 'RSS Feed': 'fa-solid fa-rss',\n 'CMS': 'fa-solid fa-newspaper', 'PDF': 'fa-solid fa-file-pdf'\n };\n return iconMap[typeName] ?? 'fa-solid fa-folder';\n}\n\n/** Map raw `MJ: Content Process Run Details` rows to typed RunDetailRow view models. */\nexport function mapRunDetailRecords(records: Record<string, unknown>[]): RunDetailRow[] {\n return records.map(d => {\n const status = String(d['Status'] || 'Pending');\n const statusLower = status.toLowerCase();\n const isFailed = statusLower === 'failed' || statusLower === 'error';\n const isRunning = statusLower === 'running' || statusLower === 'processing';\n const startTime = d['StartTime'] ? new Date(String(d['StartTime'])) : null;\n const endTime = d['EndTime'] ? new Date(String(d['EndTime'])) : null;\n const durationMs = startTime && endTime ? endTime.getTime() - startTime.getTime() : 0;\n const durationStr = durationMs > 60000 ? `${Math.round(durationMs / 60000)}m` : `${Math.round(durationMs / 1000)}s`;\n\n return {\n SourceName: String(d['ContentSource'] || 'Unknown'),\n SourceType: String(d['ContentSourceType'] || ''),\n Status: displayStatus(status),\n StatusClass: isFailed ? 'failed' : isRunning ? 'running' : 'complete',\n ItemsProcessed: Number(d['ItemsProcessed'] || 0),\n ItemsTagged: Number(d['ItemsTagged'] || 0),\n ItemsVectorized: Number(d['ItemsVectorized'] || 0),\n ErrorCount: Number(d['ErrorCount'] || 0),\n TotalTokens: Number(d['TotalTokensUsed'] || 0),\n TotalCost: Number(d['TotalCost'] || 0),\n Duration: durationStr,\n };\n });\n}\n\n// ================================================================\n// Cron-to-Human-Readable Utility\n// ================================================================\n\n/**\n * Converts a 5-part or 6-part cron expression to a human-readable English string.\n *\n * Handles common patterns:\n * `0 * * * *` -> \"Every hour\"\n * `0 2 * * *` -> \"Daily at 2:00 AM\"\n * `0 2 * * 1` -> \"Weekly on Monday at 2:00 AM\"\n * `star/15 * * * *` -> \"Every 15 minutes\" (where star = asterisk)\n * `0 0 1 * *` -> \"Monthly on day 1 at 12:00 AM\"\n *\n * Falls back to returning the raw cron string for unrecognized patterns.\n *\n * @param cron A cron expression string (5 or 6 parts)\n * @returns A human-readable description or the raw cron if unrecognized\n */\nexport function CronToHumanReadable(cron: string): string {\n if (!cron) return 'No schedule';\n\n const parts = cron.trim().split(/\\s+/);\n const p = parseCronParts(parts);\n if (!p) return cron;\n\n return formatCronParts(p) ?? cron;\n}\n\n/** Internal cron field tuple */\ninterface CronFields {\n Minute: string;\n Hour: string;\n DayOfMonth: string;\n Month: string;\n DayOfWeek: string;\n}\n\n/**\n * Parses 5-part or 6-part cron expressions into normalized fields.\n * 6-part expressions have a leading seconds field that is discarded.\n */\nfunction parseCronParts(parts: string[]): CronFields | null {\n if (parts.length === 5) {\n return { Minute: parts[0], Hour: parts[1], DayOfMonth: parts[2], Month: parts[3], DayOfWeek: parts[4] };\n }\n if (parts.length === 6) {\n return { Minute: parts[1], Hour: parts[2], DayOfMonth: parts[3], Month: parts[4], DayOfWeek: parts[5] };\n }\n return null;\n}\n\n/**\n * Attempts to map parsed cron fields to a human-readable string.\n * Returns null when the pattern is not recognized.\n */\nfunction formatCronParts(p: CronFields): string | null {\n // Every N minutes: */N * * * *\n if (p.Minute.startsWith('*/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n const interval = parseInt(p.Minute.slice(2), 10);\n if (interval === 1) return 'Every minute';\n return `Every ${interval} minutes`;\n }\n\n // Every hour at minute M: M * * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour === '*' && p.DayOfMonth === '*' && p.Month === '*' && p.DayOfWeek === '*') {\n return 'Every hour';\n }\n\n // Every N hours: 0 */N * * *\n if (!p.Minute.includes('*') && !p.Minute.includes('/') && p.Hour.startsWith('*/') && p.DayOfMonth === '*') {\n const interval = parseInt(p.Hour.slice(2), 10);\n if (interval === 1) return 'Every hour';\n return `Every ${interval} hours`;\n }\n\n // Specific hour + minute with wildcard or specific day fields\n if (!p.Minute.includes('*') && !p.Minute.includes('/') &&\n !p.Hour.includes('*') && !p.Hour.includes('/') &&\n p.Month === '*') {\n\n const hour = parseInt(p.Hour, 10);\n const minute = parseInt(p.Minute, 10);\n const timeStr = formatTimeOfDay(hour, minute);\n\n // Weekly: specific day of week\n if (p.DayOfWeek !== '*' && p.DayOfMonth === '*') {\n const dayName = dayOfWeekToName(p.DayOfWeek);\n return `Weekly on ${dayName} at ${timeStr}`;\n }\n\n // Monthly: specific day of month\n if (p.DayOfMonth !== '*' && p.DayOfWeek === '*') {\n return `Monthly on day ${p.DayOfMonth} at ${timeStr}`;\n }\n\n // Daily\n if (p.DayOfMonth === '*' && p.DayOfWeek === '*') {\n return `Daily at ${timeStr}`;\n }\n }\n\n return null;\n}\n\n/** Formats hour and minute to 12-hour AM/PM time string */\nfunction formatTimeOfDay(hour: number, minute: number): string {\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const h = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;\n const m = minute.toString().padStart(2, '0');\n return `${h}:${m} ${ampm}`;\n}\n\n/** Maps day-of-week cron values (0-7 or SUN-SAT) to English names */\nfunction dayOfWeekToName(dow: string): string {\n const names: Record<string, string> = {\n '0': 'Sunday', '1': 'Monday', '2': 'Tuesday',\n '3': 'Wednesday', '4': 'Thursday', '5': 'Friday',\n '6': 'Saturday', '7': 'Sunday',\n 'SUN': 'Sunday', 'MON': 'Monday', 'TUE': 'Tuesday',\n 'WED': 'Wednesday', 'THU': 'Thursday', 'FRI': 'Friday',\n 'SAT': 'Saturday',\n };\n return names[dow.toUpperCase()] ?? dow;\n}\n"]}
@@ -59,10 +59,10 @@ export interface SourceCard {
59
59
  EntityID: string;
60
60
  EntityDocumentID: string;
61
61
  RequiresFileType: boolean;
62
- /** FK to ScheduledAction entity, null if no schedule configured */
63
- ScheduledActionID: string | null;
64
- /** Denormalized name of the linked ScheduledAction */
65
- ScheduledActionName: string | null;
62
+ /** FK to the Scheduled Job that runs this source, null if no schedule configured */
63
+ ScheduledJobID: string | null;
64
+ /** Denormalized name of the linked Scheduled Job */
65
+ ScheduledJobName: string | null;
66
66
  /** Human-readable schedule description (parsed from cron) */
67
67
  ScheduleDescription: string | null;
68
68
  }
@@ -269,8 +269,8 @@ export interface ClassifyItemGridRow {
269
269
  EmbeddingStatus: string;
270
270
  TaggingStatus: string;
271
271
  UpdatedAt: string;
272
- /** Raw ISO timestamp used for sorting (the grid renders UpdatedAt formatted). */
273
- UpdatedAtRaw: string;
272
+ /** Epoch-ms timestamp used for sorting (the grid renders UpdatedAt formatted); 0 when absent. */
273
+ UpdatedAtRaw: number;
274
274
  }
275
275
  /**
276
276
  * A single tag on a content item, enriched with the LLM provenance fields
@@ -1 +1 @@
1
- {"version":3,"file":"classify.types.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"classify.types.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"classify.types.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * @fileoverview Shared types & interfaces for the Classify (autotagging) sub-app.\n * Extracted verbatim from the former monolith so host, tabs, and dialogs share one contract.\n */\n\n// ── Tab type ──\n\nexport type TabName = 'pipeline' | 'sources' | 'types' | 'tags' | 'taxonomy' | 'inbox' | 'health' | 'history';\n\n// ── Interfaces ──\n\nexport interface NavItem {\n Tab: TabName;\n Icon: string;\n Label: string;\n BadgeText: string;\n BadgeClass: string;\n}\n\nexport interface KPIMetric {\n Label: string;\n Value: number;\n Icon: string;\n Trend: string;\n TrendUp: boolean;\n}\n\nexport interface PipelineStageInfo {\n Name: string;\n Icon: string;\n Status: 'idle' | 'active' | 'complete';\n Count: string;\n}\n\nexport interface FeedItem {\n Name: string;\n SourceName: string;\n Tags: string[];\n TimeAgo: string;\n Status: 'complete' | 'processing' | 'error';\n}\n\nexport interface SourceMini {\n ID: string;\n Name: string;\n Icon: string;\n Meta: string;\n StatusClass: 'active' | 'error' | 'inactive';\n}\n\nexport interface SourceCard {\n ID: string;\n Name: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n Icon: string;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n URL: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ContentSourceTypeID: string;\n ContentTypeID: string;\n ContentFileTypeID: string;\n EmbeddingModelID: string;\n VectorIndexID: string;\n EntityID: string;\n EntityDocumentID: string;\n RequiresFileType: boolean;\n /** FK to ScheduledAction entity, null if no schedule configured */\n ScheduledActionID: string | null;\n /** Denormalized name of the linked ScheduledAction */\n ScheduledActionName: string | null;\n /** Human-readable schedule description (parsed from cron) */\n ScheduleDescription: string | null;\n}\n\nexport interface ContentTypeCard {\n ID: string;\n Name: string;\n Description: string;\n AIModelName: string;\n AIModelID: string;\n MinTags: number;\n MaxTags: number;\n SourcesUsing: number;\n ItemsTagged: number;\n RangeLeftPct: number;\n RangeRightPct: number;\n EmbeddingModelID: string;\n VectorIndexID: string;\n}\n\nexport interface TagRow {\n Tag: string;\n UsageCount: number;\n AvgWeight: number;\n BarWidthPct: number;\n TopSource: string;\n FirstSeen: string;\n}\n\nexport interface TagCloudItem {\n Tag: string;\n AvgWeight: number;\n SizeClass: 'large' | '' | 'small';\n}\n\nexport interface TagBySource {\n SourceName: string;\n Count: number;\n}\n\nexport interface RunHistoryRow {\n ID: string;\n Status: string;\n StatusClass: string;\n SourceName: string;\n StartedDisplay: string;\n Duration: string;\n Items: string;\n Tags: string;\n Errors: string;\n ErrorClass: string;\n}\n\nexport interface DropdownOption {\n ID: string;\n Name: string;\n}\n\n/** G3: Content item duplicate pair for review */\nexport interface ContentDuplicateRow {\n ID: string;\n ItemAName: string;\n ItemASource: string;\n ItemBName: string;\n ItemBSource: string;\n SimilarityScore: number;\n DetectionMethod: string;\n Status: 'Pending' | 'Confirmed' | 'Dismissed' | 'Merged';\n}\n\n/** D2/D3/D8: Per-source detail row for a specific pipeline run */\nexport interface RunDetailRow {\n SourceName: string;\n SourceType: string;\n Status: string;\n StatusClass: string;\n ItemsProcessed: number;\n ItemsTagged: number;\n ItemsVectorized: number;\n ErrorCount: number;\n TotalTokens: number;\n TotalCost: number;\n Duration: string;\n}\n\n// ── Taxonomy Governance interfaces ──\n\nexport type TaxonomySubTab = 'tree' | 'duplicates' | 'orphans' | 'treemap' | 'audit';\n\nexport interface TaxTreeNode {\n ID: string;\n Name: string;\n DisplayName: string;\n Description: string;\n ParentID: string | null;\n Depth: number;\n Children: TaxTreeNode[];\n ItemCount: number;\n AvgWeight: number;\n HealthColor: 'green' | 'yellow' | 'red';\n IsExpanded: boolean;\n IsSelected: boolean;\n FirstSeen: string;\n}\n\nexport interface TaxDuplicatePair {\n TagA: string;\n TagB: string;\n TagAID: string;\n TagBID: string;\n Similarity: number;\n SeverityClass: 'high' | 'moderate';\n /** True when multiple Tag records share the same name (case-insensitive) */\n IsExactDuplicate: boolean;\n /** How many Tag records share this exact name (only set when IsExactDuplicate) */\n ExactDuplicateCount: number;\n /** All Tag IDs sharing the exact name (only set when IsExactDuplicate) */\n AllIDs: string[];\n}\n\nexport interface TaxOrphanCard {\n ID: string;\n Name: string;\n UsageCount: number;\n AvgWeight: number;\n FirstSeen: string;\n LastSeen: string;\n IsSelected: boolean;\n}\n\nexport interface TaxTreemapCell {\n ID: string;\n Name: string;\n ItemCount: number;\n ColorClass: string;\n RowSpan: number;\n}\n\n/** Supported audit action types — matches DB Action values (lowercased) */\nexport type TaxAuditAction = 'created' | 'merged' | 'moved' | 'deleted' | 'renamed' | 'deprecated' | 'descriptionchanged' | 'reactivated' | 'split';\n\nexport interface TaxAuditEvent {\n Type: TaxAuditAction;\n Description: string;\n TagRef: string;\n User: string;\n Timestamp: string;\n DayHeader: string;\n}\n\nexport interface TaxHealthStat {\n Total: number;\n Healthy: number;\n NeedAttention: number;\n Orphaned: number;\n Duplicates: number;\n}\n\nexport interface WeightedTag {\n Tag: string;\n Weight: number;\n}\n\n/** Status value for embedding or tagging pipeline phases */\nexport type ItemPipelineStatus = 'Complete' | 'Processing' | 'Failed' | 'Pending';\n\nexport interface ContentItemDetail {\n ID: string;\n Name: string;\n SourceName: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n URL: string;\n TextContent: string;\n Checksum: string;\n Tags: WeightedTag[];\n CreatedAt: string;\n UpdatedAt: string;\n ContentSourceID: string;\n ContentSourceTypeID: string;\n StatusDot: 'complete' | 'processing' | 'error';\n TagCount: number;\n /** Whether this source type uses content/file type (false for Entity sources) */\n RequiresContentType: boolean;\n /** Entity record ID if source is entity type (for direct entity navigation) */\n EntityRecordID: string | null;\n /** Entity name if source is entity type */\n EntityName: string | null;\n /** Embedding pipeline status for this content item */\n EmbeddingStatus: ItemPipelineStatus;\n /** Tagging pipeline status for this content item */\n TaggingStatus: ItemPipelineStatus;\n}\n\nexport interface SourceDetailInfo {\n ID: string;\n Name: string;\n SourceTypeName: string;\n FileTypeName: string;\n ContentTypeName: string;\n RequiresFileType: boolean;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n Icon: string;\n URL: string;\n EmbeddingModelName: string;\n VectorIndexName: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ErrorCount: number;\n ContentItems: ContentItemDetail[];\n RunHistory: RunHistoryRow[];\n}\n\n// ── Phase 4: Audit / Analytics ──\n\n/**\n * A single content-item row shown in {@link ClassifyItemGridComponent}. Built from\n * a narrow `ResultType:'simple'` projection of `MJ: Content Items` — no BaseEntity.\n */\nexport interface ClassifyItemGridRow {\n ID: string;\n DisplayName: string;\n SourceName: string;\n TagCount: number;\n EmbeddingStatus: string;\n TaggingStatus: string;\n UpdatedAt: string;\n /** Raw ISO timestamp used for sorting (the grid renders UpdatedAt formatted). */\n UpdatedAtRaw: string;\n}\n\n/**\n * A single tag on a content item, enriched with the LLM provenance fields\n * (Reasoning + AIPromptRunID) surfaced in {@link ClassifyItemDrilldownComponent}.\n */\nexport interface ClassifyDrilldownTag {\n Tag: string;\n Weight: number;\n /** The LLM's justification for this tag, when captured at extraction time. */\n Reasoning: string | null;\n /** FK to the AI Prompt Run that produced this tag (provenance link). */\n AIPromptRunID: string | null;\n CreatedAt: string;\n}\n\n/** A single provenance fact shown in the drilldown's Provenance section. */\nexport interface ClassifyProvenanceFact {\n Label: string;\n Value: string;\n Icon: string;\n /** Optional record reference the user can open (entity + id). */\n RecordEntity?: string;\n RecordID?: string;\n}\n\n/** A single audit-trail entry shown in the drilldown's Audit section. */\nexport interface ClassifyAuditEntry {\n Label: string;\n Timestamp: string;\n Icon: string;\n}\n\n// ── Slide-in form mode ──\n\nexport type FormMode = 'none' | 'add-source' | 'edit-source' | 'add-type' | 'edit-type';\n\n// ── Dry-run preview ──\n\n/** Per-disposition tally for the dry-run summary line. */\nexport interface DryRunDispositionCount {\n AutoApply: number;\n RouteToInbox: number;\n CreateNew: number;\n Reject: number;\n}\n\n/** Illustrative token/cost estimate shown on the dry-run preview banner. */\nexport interface DryRunEstimate {\n ItemsSampled: number;\n /** Rough total token estimate (clearly marked illustrative in the UI). */\n EstimatedTokens: number;\n /** Rough dollar cost estimate derived from EstimatedTokens. */\n EstimatedCost: number;\n}\n"]}
1
+ {"version":3,"file":"classify.types.js","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/shared/classify.types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * @fileoverview Shared types & interfaces for the Classify (autotagging) sub-app.\n * Extracted verbatim from the former monolith so host, tabs, and dialogs share one contract.\n */\n\n// ── Tab type ──\n\nexport type TabName = 'pipeline' | 'sources' | 'types' | 'tags' | 'taxonomy' | 'inbox' | 'health' | 'history';\n\n// ── Interfaces ──\n\nexport interface NavItem {\n Tab: TabName;\n Icon: string;\n Label: string;\n BadgeText: string;\n BadgeClass: string;\n}\n\nexport interface KPIMetric {\n Label: string;\n Value: number;\n Icon: string;\n Trend: string;\n TrendUp: boolean;\n}\n\nexport interface PipelineStageInfo {\n Name: string;\n Icon: string;\n Status: 'idle' | 'active' | 'complete';\n Count: string;\n}\n\nexport interface FeedItem {\n Name: string;\n SourceName: string;\n Tags: string[];\n TimeAgo: string;\n Status: 'complete' | 'processing' | 'error';\n}\n\nexport interface SourceMini {\n ID: string;\n Name: string;\n Icon: string;\n Meta: string;\n StatusClass: 'active' | 'error' | 'inactive';\n}\n\nexport interface SourceCard {\n ID: string;\n Name: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n Icon: string;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n URL: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ContentSourceTypeID: string;\n ContentTypeID: string;\n ContentFileTypeID: string;\n EmbeddingModelID: string;\n VectorIndexID: string;\n EntityID: string;\n EntityDocumentID: string;\n RequiresFileType: boolean;\n /** FK to the Scheduled Job that runs this source, null if no schedule configured */\n ScheduledJobID: string | null;\n /** Denormalized name of the linked Scheduled Job */\n ScheduledJobName: string | null;\n /** Human-readable schedule description (parsed from cron) */\n ScheduleDescription: string | null;\n}\n\nexport interface ContentTypeCard {\n ID: string;\n Name: string;\n Description: string;\n AIModelName: string;\n AIModelID: string;\n MinTags: number;\n MaxTags: number;\n SourcesUsing: number;\n ItemsTagged: number;\n RangeLeftPct: number;\n RangeRightPct: number;\n EmbeddingModelID: string;\n VectorIndexID: string;\n}\n\nexport interface TagRow {\n Tag: string;\n UsageCount: number;\n AvgWeight: number;\n BarWidthPct: number;\n TopSource: string;\n FirstSeen: string;\n}\n\nexport interface TagCloudItem {\n Tag: string;\n AvgWeight: number;\n SizeClass: 'large' | '' | 'small';\n}\n\nexport interface TagBySource {\n SourceName: string;\n Count: number;\n}\n\nexport interface RunHistoryRow {\n ID: string;\n Status: string;\n StatusClass: string;\n SourceName: string;\n StartedDisplay: string;\n Duration: string;\n Items: string;\n Tags: string;\n Errors: string;\n ErrorClass: string;\n}\n\nexport interface DropdownOption {\n ID: string;\n Name: string;\n}\n\n/** G3: Content item duplicate pair for review */\nexport interface ContentDuplicateRow {\n ID: string;\n ItemAName: string;\n ItemASource: string;\n ItemBName: string;\n ItemBSource: string;\n SimilarityScore: number;\n DetectionMethod: string;\n Status: 'Pending' | 'Confirmed' | 'Dismissed' | 'Merged';\n}\n\n/** D2/D3/D8: Per-source detail row for a specific pipeline run */\nexport interface RunDetailRow {\n SourceName: string;\n SourceType: string;\n Status: string;\n StatusClass: string;\n ItemsProcessed: number;\n ItemsTagged: number;\n ItemsVectorized: number;\n ErrorCount: number;\n TotalTokens: number;\n TotalCost: number;\n Duration: string;\n}\n\n// ── Taxonomy Governance interfaces ──\n\nexport type TaxonomySubTab = 'tree' | 'duplicates' | 'orphans' | 'treemap' | 'audit';\n\nexport interface TaxTreeNode {\n ID: string;\n Name: string;\n DisplayName: string;\n Description: string;\n ParentID: string | null;\n Depth: number;\n Children: TaxTreeNode[];\n ItemCount: number;\n AvgWeight: number;\n HealthColor: 'green' | 'yellow' | 'red';\n IsExpanded: boolean;\n IsSelected: boolean;\n FirstSeen: string;\n}\n\nexport interface TaxDuplicatePair {\n TagA: string;\n TagB: string;\n TagAID: string;\n TagBID: string;\n Similarity: number;\n SeverityClass: 'high' | 'moderate';\n /** True when multiple Tag records share the same name (case-insensitive) */\n IsExactDuplicate: boolean;\n /** How many Tag records share this exact name (only set when IsExactDuplicate) */\n ExactDuplicateCount: number;\n /** All Tag IDs sharing the exact name (only set when IsExactDuplicate) */\n AllIDs: string[];\n}\n\nexport interface TaxOrphanCard {\n ID: string;\n Name: string;\n UsageCount: number;\n AvgWeight: number;\n FirstSeen: string;\n LastSeen: string;\n IsSelected: boolean;\n}\n\nexport interface TaxTreemapCell {\n ID: string;\n Name: string;\n ItemCount: number;\n ColorClass: string;\n RowSpan: number;\n}\n\n/** Supported audit action types — matches DB Action values (lowercased) */\nexport type TaxAuditAction = 'created' | 'merged' | 'moved' | 'deleted' | 'renamed' | 'deprecated' | 'descriptionchanged' | 'reactivated' | 'split';\n\nexport interface TaxAuditEvent {\n Type: TaxAuditAction;\n Description: string;\n TagRef: string;\n User: string;\n Timestamp: string;\n DayHeader: string;\n}\n\nexport interface TaxHealthStat {\n Total: number;\n Healthy: number;\n NeedAttention: number;\n Orphaned: number;\n Duplicates: number;\n}\n\nexport interface WeightedTag {\n Tag: string;\n Weight: number;\n}\n\n/** Status value for embedding or tagging pipeline phases */\nexport type ItemPipelineStatus = 'Complete' | 'Processing' | 'Failed' | 'Pending';\n\nexport interface ContentItemDetail {\n ID: string;\n Name: string;\n SourceName: string;\n SourceTypeName: string;\n ContentTypeName: string;\n FileTypeName: string;\n URL: string;\n TextContent: string;\n Checksum: string;\n Tags: WeightedTag[];\n CreatedAt: string;\n UpdatedAt: string;\n ContentSourceID: string;\n ContentSourceTypeID: string;\n StatusDot: 'complete' | 'processing' | 'error';\n TagCount: number;\n /** Whether this source type uses content/file type (false for Entity sources) */\n RequiresContentType: boolean;\n /** Entity record ID if source is entity type (for direct entity navigation) */\n EntityRecordID: string | null;\n /** Entity name if source is entity type */\n EntityName: string | null;\n /** Embedding pipeline status for this content item */\n EmbeddingStatus: ItemPipelineStatus;\n /** Tagging pipeline status for this content item */\n TaggingStatus: ItemPipelineStatus;\n}\n\nexport interface SourceDetailInfo {\n ID: string;\n Name: string;\n SourceTypeName: string;\n FileTypeName: string;\n ContentTypeName: string;\n RequiresFileType: boolean;\n StatusClass: 'active' | 'error' | 'inactive';\n StatusLabel: string;\n Icon: string;\n URL: string;\n EmbeddingModelName: string;\n VectorIndexName: string;\n ItemCount: number;\n TagCount: number;\n AvgTags: string;\n LastRunAgo: string;\n ErrorCount: number;\n ContentItems: ContentItemDetail[];\n RunHistory: RunHistoryRow[];\n}\n\n// ── Phase 4: Audit / Analytics ──\n\n/**\n * A single content-item row shown in {@link ClassifyItemGridComponent}. Built from\n * a narrow `ResultType:'simple'` projection of `MJ: Content Items` — no BaseEntity.\n */\nexport interface ClassifyItemGridRow {\n ID: string;\n DisplayName: string;\n SourceName: string;\n TagCount: number;\n EmbeddingStatus: string;\n TaggingStatus: string;\n UpdatedAt: string;\n /** Epoch-ms timestamp used for sorting (the grid renders UpdatedAt formatted); 0 when absent. */\n UpdatedAtRaw: number;\n}\n\n/**\n * A single tag on a content item, enriched with the LLM provenance fields\n * (Reasoning + AIPromptRunID) surfaced in {@link ClassifyItemDrilldownComponent}.\n */\nexport interface ClassifyDrilldownTag {\n Tag: string;\n Weight: number;\n /** The LLM's justification for this tag, when captured at extraction time. */\n Reasoning: string | null;\n /** FK to the AI Prompt Run that produced this tag (provenance link). */\n AIPromptRunID: string | null;\n CreatedAt: string;\n}\n\n/** A single provenance fact shown in the drilldown's Provenance section. */\nexport interface ClassifyProvenanceFact {\n Label: string;\n Value: string;\n Icon: string;\n /** Optional record reference the user can open (entity + id). */\n RecordEntity?: string;\n RecordID?: string;\n}\n\n/** A single audit-trail entry shown in the drilldown's Audit section. */\nexport interface ClassifyAuditEntry {\n Label: string;\n Timestamp: string;\n Icon: string;\n}\n\n// ── Slide-in form mode ──\n\nexport type FormMode = 'none' | 'add-source' | 'edit-source' | 'add-type' | 'edit-type';\n\n// ── Dry-run preview ──\n\n/** Per-disposition tally for the dry-run summary line. */\nexport interface DryRunDispositionCount {\n AutoApply: number;\n RouteToInbox: number;\n CreateNew: number;\n Reject: number;\n}\n\n/** Illustrative token/cost estimate shown on the dry-run preview banner. */\nexport interface DryRunEstimate {\n ItemsSampled: number;\n /** Rough total token estimate (clearly marked illustrative in the UI). */\n EstimatedTokens: number;\n /** Rough dollar cost estimate derived from EstimatedTokens. */\n EstimatedCost: number;\n}\n"]}
@@ -4,7 +4,7 @@
4
4
  * Self-contained sub-page: owns its header-interior, the source cards grid,
5
5
  * the per-source detail slide-in, and the quick-schedule dialog. Receives the
6
6
  * shared raw data needed to build the cards (sources, items, tags, runs, and
7
- * the cached ScheduledAction + EntityRecordDocument lookups) from the host
7
+ * the cached Scheduled Job + EntityRecordDocument lookups) from the host
8
8
  * orchestrator via `@Input()`. Cross-tab concerns — opening the add/edit slide-in
9
9
  * form, running the pipeline, opening a content-item detail, and reloading the
10
10
  * shared source list after a mutation — bubble up via `@Output()`.
@@ -14,7 +14,7 @@
14
14
  */
15
15
  import { EventEmitter } from '@angular/core';
16
16
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
17
- import { MJScheduledActionEntity } from '@memberjunction/core-entities';
17
+ import { MJScheduledJobEntity } from '@memberjunction/core-entities';
18
18
  import { SourceCard, SourceDetailInfo, ContentItemDetail, ItemPipelineStatus } from '../shared/classify.types';
19
19
  import { formatNumber } from '../shared/classify.format';
20
20
  import * as i0 from "@angular/core";
@@ -45,10 +45,10 @@ export declare class ClassifySourcesTabComponent extends BaseAngularComponent {
45
45
  private _totalTagCount;
46
46
  set TotalTagCount(value: number);
47
47
  get TotalTagCount(): number;
48
- /** Cached ScheduledAction entities, keyed by normalized ID, supplied by the host. */
49
- private _scheduledActions;
50
- set ScheduledActions(value: Map<string, MJScheduledActionEntity>);
51
- get ScheduledActions(): Map<string, MJScheduledActionEntity>;
48
+ /** Cached Scheduled Job entities, keyed by normalized ID, supplied by the host. */
49
+ private _scheduledJobs;
50
+ set ScheduledJobs(value: Map<string, MJScheduledJobEntity>);
51
+ get ScheduledJobs(): Map<string, MJScheduledJobEntity>;
52
52
  /** Cache: EntityRecordDocument ID → RecordID, supplied by the host. */
53
53
  private _entityRecordDocCache;
54
54
  set EntityRecordDocCache(value: Map<string, string>);
@@ -120,21 +120,21 @@ export declare class ClassifySourcesTabComponent extends BaseAngularComponent {
120
120
  private inferPipelineStatuses;
121
121
  private mapStatusString;
122
122
  formatRelativeTime(dateStr: string | null | undefined): string;
123
- /** Looks up the cron expression for a cached ScheduledAction by ID */
124
- private getScheduledActionCron;
123
+ /** Looks up the cron expression for a cached Scheduled Job by ID */
124
+ private getScheduledJobCron;
125
125
  /** Returns the CSS class for a pipeline status badge color */
126
126
  GetStatusBadgeClass(status: ItemPipelineStatus): string;
127
127
  DeleteSource(card: SourceCard): Promise<void>;
128
128
  OpenScheduleDialog(card: SourceCard): void;
129
129
  CloseScheduleDialog(): void;
130
130
  /**
131
- * Saves a new ScheduledAction for the current source, links it via
132
- * ContentSource.ScheduledActionID, and creates the default action params
131
+ * Saves a new Scheduled Job (type: Action) for the current source, links it via
132
+ * ContentSource.ScheduledJobID, and creates the default action params
133
133
  * for the Autotag and Vectorize action.
134
134
  */
135
135
  SaveSchedule(): Promise<void>;
136
136
  /**
137
- * Removes the schedule from a source card by unlinking the ScheduledActionID.
137
+ * Removes the schedule from a source card by unlinking the ScheduledJobID.
138
138
  */
139
139
  RemoveSchedule(card: SourceCard): Promise<void>;
140
140
  /** Returns the human-readable schedule description for a source card. */
@@ -144,13 +144,8 @@ export declare class ClassifySourcesTabComponent extends BaseAngularComponent {
144
144
  /** Finds the Action ID for "Autotag and Vectorize Content" by querying actions */
145
145
  private findAutotagActionID;
146
146
  /**
147
- * Creates a ScheduledActionParam that passes the source ID to the action.
148
- * Looks up the "EntityNames" action param and sets the source ID as its value.
149
- */
150
- private createSourceIDParam;
151
- /**
152
- * Links (or unlinks) a ScheduledAction to a ContentSource by updating
153
- * the ContentSource.ScheduledActionID field.
147
+ * Links (or unlinks) a Scheduled Job to a ContentSource by updating
148
+ * the ContentSource.ScheduledJobID field.
154
149
  */
155
150
  private linkScheduleToSource;
156
151
  OpenSourceDetail(card: SourceCard): Promise<void>;
@@ -173,6 +168,6 @@ export declare class ClassifySourcesTabComponent extends BaseAngularComponent {
173
168
  private loadContentItemsForSource;
174
169
  private loadRunHistoryForSource;
175
170
  static ɵfac: i0.ɵɵFactoryDeclaration<ClassifySourcesTabComponent, never>;
176
- static ɵcmp: i0.ɵɵComponentDeclaration<ClassifySourcesTabComponent, "classify-sources-tab", never, { "Sources": { "alias": "Sources"; "required": false; }; "Items": { "alias": "Items"; "required": false; }; "Tags": { "alias": "Tags"; "required": false; }; "Runs": { "alias": "Runs"; "required": false; }; "TotalItemCount": { "alias": "TotalItemCount"; "required": false; }; "TotalTagCount": { "alias": "TotalTagCount"; "required": false; }; "ScheduledActions": { "alias": "ScheduledActions"; "required": false; }; "EntityRecordDocCache": { "alias": "EntityRecordDocCache"; "required": false; }; }, { "AddSourceRequested": "AddSourceRequested"; "AddSourceGuidedRequested": "AddSourceGuidedRequested"; "EditSourceRequested": "EditSourceRequested"; "RunSourceRequested": "RunSourceRequested"; "OpenContentItemRequested": "OpenContentItemRequested"; "DataChanged": "DataChanged"; }, never, never, false, never>;
171
+ static ɵcmp: i0.ɵɵComponentDeclaration<ClassifySourcesTabComponent, "classify-sources-tab", never, { "Sources": { "alias": "Sources"; "required": false; }; "Items": { "alias": "Items"; "required": false; }; "Tags": { "alias": "Tags"; "required": false; }; "Runs": { "alias": "Runs"; "required": false; }; "TotalItemCount": { "alias": "TotalItemCount"; "required": false; }; "TotalTagCount": { "alias": "TotalTagCount"; "required": false; }; "ScheduledJobs": { "alias": "ScheduledJobs"; "required": false; }; "EntityRecordDocCache": { "alias": "EntityRecordDocCache"; "required": false; }; }, { "AddSourceRequested": "AddSourceRequested"; "AddSourceGuidedRequested": "AddSourceGuidedRequested"; "EditSourceRequested": "EditSourceRequested"; "RunSourceRequested": "RunSourceRequested"; "OpenContentItemRequested": "OpenContentItemRequested"; "DataChanged": "DataChanged"; }, never, never, false, never>;
177
172
  }
178
173
  //# sourceMappingURL=sources-tab.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sources-tab.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/tabs/sources-tab.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sources-tab.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/autotagging/tabs/sources-tab.component.ts"],"names":[],"mappings":"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"}