@memberjunction/ng-archive-manager 5.42.0 → 5.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/archive-config/archive-config-admin.component.js +65 -74
- package/dist/lib/archive-config/archive-config-admin.component.js.map +1 -1
- package/dist/lib/archive-manager.module.d.ts +2 -1
- package/dist/lib/archive-manager.module.d.ts.map +1 -1
- package/dist/lib/archive-manager.module.js +6 -2
- package/dist/lib/archive-manager.module.js.map +1 -1
- package/dist/lib/archive-restore/archive-restore-dialog.component.js +20 -27
- package/dist/lib/archive-restore/archive-restore-dialog.component.js.map +1 -1
- package/dist/lib/archive-run-viewer/archive-run-viewer.component.js +51 -56
- package/dist/lib/archive-run-viewer/archive-run-viewer.component.js.map +1 -1
- package/package.json +9 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive-run-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/archive-run-viewer/archive-run-viewer.component.ts","../../../src/lib/archive-run-viewer/archive-run-viewer.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n OnInit,\n OnDestroy,\n inject,\n} from '@angular/core';\nimport { RunView } from '@memberjunction/core';\n\n/** Summary metrics for the dashboard cards */\nexport interface ArchiveRunMetrics {\n TotalRuns: number;\n TotalRecordsArchived: number;\n TotalStorageBytes: number;\n LastRunDate: Date | null;\n}\n\n/** Represents a single archive run */\nexport interface ArchiveRunSummary {\n ID: string;\n ConfigurationName: string;\n StartedAt: Date;\n CompletedAt: Date | null;\n Status: string;\n RecordsArchived: number;\n RecordsFailed: number;\n RecordsSkipped: number;\n TotalBytes: number;\n DurationSeconds: number;\n}\n\n/** Detail record for a single archived item within a run */\nexport interface ArchiveRunDetailRow {\n ID: string;\n EntityName: string;\n RecordID: string;\n Status: string;\n StoragePath: string;\n Bytes: number;\n ArchivedAt: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-archive-run-viewer',\n templateUrl: './archive-run-viewer.component.html',\n styleUrls: ['./archive-run-viewer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ArchiveRunViewerComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n /** Summary metrics */\n Metrics: ArchiveRunMetrics = {\n TotalRuns: 0,\n TotalRecordsArchived: 0,\n TotalStorageBytes: 0,\n LastRunDate: null,\n };\n\n /** All archive runs */\n Runs: ArchiveRunSummary[] = [];\n\n /** Currently selected run for the drawer */\n SelectedRun: ArchiveRunSummary | null = null;\n\n /** Detail records for the selected run */\n RunDetails: ArchiveRunDetailRow[] = [];\n\n /** Whether the drawer is open */\n DrawerOpen = false;\n\n /** Whether the main data is loading */\n IsLoading = true;\n\n /** Whether drawer details are loading */\n IsDrawerLoading = false;\n\n private destroyed = false;\n\n ngOnInit(): void {\n this.loadRunData();\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n }\n\n /** Open the drawer for a specific run */\n async OpenRunDrawer(run: ArchiveRunSummary): Promise<void> {\n this.SelectedRun = run;\n this.DrawerOpen = true;\n this.cdr.markForCheck();\n await this.loadRunDetails(run.ID);\n }\n\n /** Close the drawer */\n CloseDrawer(): void {\n this.DrawerOpen = false;\n this.SelectedRun = null;\n this.RunDetails = [];\n this.cdr.markForCheck();\n }\n\n /** Format bytes into a readable string */\n FormatBytes(bytes: number | string | null | undefined): string {\n const numBytes = Number(bytes);\n if (!numBytes || numBytes <= 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(numBytes) / Math.log(k));\n const value = numBytes / Math.pow(k, i);\n return `${value.toFixed(i > 0 ? 1 : 0)} ${units[i]}`;\n }\n\n /** Format a date for display */\n FormatDate(date: Date | null): string {\n if (!date) return 'N/A';\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n }\n\n /** Format duration in seconds to a readable string */\n FormatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n\n /** Get CSS class for a status badge */\n GetStatusClass(status: string): string {\n switch (status.toLowerCase()) {\n case 'success':\n case 'completed':\n return 'status-badge-success';\n case 'failed':\n case 'error':\n return 'status-badge-error';\n case 'running':\n case 'in progress':\n return 'status-badge-info';\n default:\n return 'status-badge-default';\n }\n }\n\n /** Load all run data and compute metrics */\n private async loadRunData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const runs = await this.fetchRuns();\n this.Runs = runs;\n this.Metrics = this.computeMetrics(runs);\n } catch {\n this.Runs = [];\n } finally {\n this.IsLoading = false;\n this.markForCheckIfAlive();\n }\n }\n\n /** Fetch run records from the server */\n private async fetchRuns(): Promise<ArchiveRunSummary[]> {\n const rv = new RunView();\n const result = await rv.RunView<RunRecord>({\n EntityName: 'MJ: Archive Runs',\n ExtraFilter: '',\n OrderBy: 'StartedAt DESC',\n ResultType: 'simple',\n });\n\n if (!result.Success) return [];\n return result.Results.map((r) => this.mapRunRecord(r));\n }\n\n /** Map a raw run record to a typed summary */\n private mapRunRecord(r: RunRecord): ArchiveRunSummary {\n const startedAt = new Date(r.StartedAt);\n const completedAt = r.CompletedAt ? new Date(r.CompletedAt) : null;\n const durationSeconds = completedAt\n ? Math.round((completedAt.getTime() - startedAt.getTime()) / 1000)\n : 0;\n\n return {\n ID: r.ID,\n ConfigurationName: r.ArchiveConfiguration ?? '',\n StartedAt: startedAt,\n CompletedAt: completedAt,\n Status: r.Status ?? 'Unknown',\n RecordsArchived: Number(r.ArchivedRecords) || 0,\n RecordsFailed: Number(r.FailedRecords) || 0,\n RecordsSkipped: Number(r.SkippedRecords) || 0,\n TotalBytes: Number(r.TotalBytesArchived) || 0,\n DurationSeconds: durationSeconds,\n };\n }\n\n /** Compute summary metrics from all runs */\n private computeMetrics(runs: ArchiveRunSummary[]): ArchiveRunMetrics {\n return {\n TotalRuns: runs.length,\n TotalRecordsArchived: runs.reduce((sum, r) => sum + r.RecordsArchived, 0),\n TotalStorageBytes: runs.reduce((sum, r) => sum + r.TotalBytes, 0),\n LastRunDate: runs.length > 0 ? runs[0].StartedAt : null,\n };\n }\n\n /** Load detail records for a specific run */\n private async loadRunDetails(runId: string): Promise<void> {\n this.IsDrawerLoading = true;\n this.RunDetails = [];\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const escapedId = runId.replace(/'/g, \"''\");\n const result = await rv.RunView<DetailRecord>({\n EntityName: 'MJ: Archive Run Details',\n ExtraFilter: `ArchiveRunID='${escapedId}'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'simple',\n Fields: ['ID', 'Entity', 'RecordID', 'Status', 'StoragePath', 'BytesArchived', '__mj_CreatedAt'],\n });\n\n if (result.Success) {\n this.RunDetails = result.Results.map((r) => this.mapDetailRecord(r));\n }\n } catch {\n this.RunDetails = [];\n } finally {\n this.IsDrawerLoading = false;\n this.markForCheckIfAlive();\n }\n }\n\n /** Map a raw detail record to a typed row */\n private mapDetailRecord(r: DetailRecord): ArchiveRunDetailRow {\n return {\n ID: r.ID,\n EntityName: r.Entity ?? '',\n RecordID: r.RecordID ?? '',\n Status: r.Status ?? 'Unknown',\n StoragePath: r.StoragePath ?? '',\n Bytes: Number(r.BytesArchived) || 0,\n ArchivedAt: r.__mj_CreatedAt ?? '',\n };\n }\n\n /** Mark for check only if not destroyed */\n private markForCheckIfAlive(): void {\n if (!this.destroyed) {\n this.cdr.markForCheck();\n }\n }\n}\n\n/** Shape of a run record from the simple RunView query */\ninterface RunRecord {\n ID: string;\n ArchiveConfiguration: string;\n StartedAt: string;\n CompletedAt: string;\n Status: string;\n ArchivedRecords: number;\n FailedRecords: number;\n SkippedRecords: number;\n TotalBytesArchived: number;\n}\n\n/** Shape of a detail record from the simple RunView query */\ninterface DetailRecord {\n ID: string;\n Entity: string;\n RecordID: string;\n Status: string;\n StoragePath: string;\n BytesArchived: number;\n __mj_CreatedAt: string;\n}\n","<div class=\"run-viewer\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"run-viewer-loading\">\n <mj-loading text=\"Loading archive runs...\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n <!-- Summary metric cards -->\n <div class=\"metrics-row\">\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-play-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <span class=\"metric-value\">{{ Metrics.TotalRuns }}</span>\n <span class=\"metric-label\">Total Runs</span>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-archive\">\n <i class=\"fa-solid fa-box-archive\"></i>\n </div>\n <div class=\"metric-content\">\n <span class=\"metric-value\">{{ Metrics.TotalRecordsArchived }}</span>\n <span class=\"metric-label\">Records Archived</span>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-storage\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"metric-content\">\n <span class=\"metric-value\">{{ FormatBytes(Metrics.TotalStorageBytes) }}</span>\n <span class=\"metric-label\">Storage Used</span>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-time\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"metric-content\">\n <span class=\"metric-value\">{{ FormatDate(Metrics.LastRunDate) }}</span>\n <span class=\"metric-label\">Last Run</span>\n </div>\n </div>\n </div>\n\n <!-- Run list -->\n <div class=\"run-list\">\n <h3 class=\"run-list-title\">Run History</h3>\n\n @if (Runs.length === 0) {\n <div class=\"run-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No archive runs found.</p>\n </div>\n }\n\n @for (run of Runs; track run.ID) {\n <div\n class=\"run-card\"\n (click)=\"OpenRunDrawer(run)\"\n (keydown.enter)=\"OpenRunDrawer(run)\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'View details for run on ' + FormatDate(run.StartedAt)\">\n <div class=\"run-card-header\">\n <span class=\"run-card-name\">{{ run.ConfigurationName }}</span>\n <span class=\"status-badge\" [ngClass]=\"GetStatusClass(run.Status)\">{{ run.Status }}</span>\n </div>\n <div class=\"run-card-date\">\n <i class=\"fa-solid fa-calendar\"></i>\n {{ FormatDate(run.StartedAt) }}\n </div>\n <div class=\"run-card-stats\">\n <span class=\"run-stat\">\n <i class=\"fa-solid fa-box-archive\"></i>\n {{ run.RecordsArchived }} archived\n </span>\n @if (run.RecordsFailed > 0) {\n <span class=\"run-stat run-stat-error\">\n <i class=\"fa-solid fa-circle-xmark\"></i>\n {{ run.RecordsFailed }} failed\n </span>\n }\n @if (run.RecordsSkipped > 0) {\n <span class=\"run-stat run-stat-muted\">\n <i class=\"fa-solid fa-forward\"></i>\n {{ run.RecordsSkipped }} skipped\n </span>\n }\n <span class=\"run-stat\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n {{ FormatDuration(run.DurationSeconds) }}\n </span>\n <span class=\"run-stat\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n {{ FormatBytes(run.TotalBytes) }}\n </span>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Drawer backdrop -->\n @if (DrawerOpen) {\n <div class=\"archive-drawer-backdrop\" (click)=\"CloseDrawer()\"></div>\n }\n\n <!-- Slide-in drawer -->\n <div class=\"archive-drawer\" [class.open]=\"DrawerOpen\">\n @if (SelectedRun) {\n <!-- Drawer header -->\n <div class=\"drawer-header\">\n <h3>Run Details</h3>\n <button class=\"drawer-close-btn\" (click)=\"CloseDrawer()\" aria-label=\"Close drawer\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Run summary -->\n <div class=\"drawer-summary\">\n <div class=\"drawer-summary-row\">\n <span class=\"drawer-label\">Configuration</span>\n <span class=\"drawer-value\">{{ SelectedRun.ConfigurationName }}</span>\n </div>\n <div class=\"drawer-summary-row\">\n <span class=\"drawer-label\">Status</span>\n <span class=\"status-badge\" [ngClass]=\"GetStatusClass(SelectedRun.Status)\">{{ SelectedRun.Status }}</span>\n </div>\n <div class=\"drawer-summary-row\">\n <span class=\"drawer-label\">Started</span>\n <span class=\"drawer-value\">{{ FormatDate(SelectedRun.StartedAt) }}</span>\n </div>\n <div class=\"drawer-summary-row\">\n <span class=\"drawer-label\">Duration</span>\n <span class=\"drawer-value\">{{ FormatDuration(SelectedRun.DurationSeconds) }}</span>\n </div>\n </div>\n\n <!-- Stats row -->\n <div class=\"drawer-stats\">\n <div class=\"drawer-stat\">\n <span class=\"drawer-stat-value\">{{ SelectedRun.RecordsArchived }}</span>\n <span class=\"drawer-stat-label\">Archived</span>\n </div>\n <div class=\"drawer-stat drawer-stat-error\">\n <span class=\"drawer-stat-value\">{{ SelectedRun.RecordsFailed }}</span>\n <span class=\"drawer-stat-label\">Failed</span>\n </div>\n <div class=\"drawer-stat drawer-stat-muted\">\n <span class=\"drawer-stat-value\">{{ SelectedRun.RecordsSkipped }}</span>\n <span class=\"drawer-stat-label\">Skipped</span>\n </div>\n </div>\n\n <!-- Detail table -->\n <div class=\"drawer-details\">\n <h4>Per-Record Results</h4>\n\n @if (IsDrawerLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n }\n\n @if (!IsDrawerLoading && RunDetails.length === 0) {\n <p class=\"drawer-details-empty\">No detail records found.</p>\n }\n\n @if (!IsDrawerLoading && RunDetails.length > 0) {\n <div class=\"drawer-table-wrapper\">\n <table class=\"drawer-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Record ID</th>\n <th>Status</th>\n <th>Bytes</th>\n </tr>\n </thead>\n <tbody>\n @for (detail of RunDetails; track detail.ID) {\n <tr>\n <td class=\"cell-entity\">{{ detail.EntityName }}</td>\n <td class=\"cell-id\" [title]=\"detail.RecordID\">{{ detail.RecordID }}</td>\n <td>\n <span class=\"status-badge status-badge-sm\" [ngClass]=\"GetStatusClass(detail.Status)\">\n {{ detail.Status }}\n </span>\n </td>\n <td class=\"cell-bytes\">{{ FormatBytes(detail.Bytes) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"archive-run-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/archive-run-viewer/archive-run-viewer.component.ts","../../../src/lib/archive-run-viewer/archive-run-viewer.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,uBAAuB,EACvB,iBAAiB,EAGjB,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;;;;;;;ICL3C,8BAAgC;IAC9B,gCAAwD;IAC1D,iBAAM;;;IAoDF,qCAEmC;;;IAyB7B,gCAAsC;IACpC,wBAAwC;IACxC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,4DACF;;;IAGA,gCAAsC;IACpC,wBAAmC;IACnC,YACF;IAAA,iBAAO;;;IADL,eACF;IADE,8DACF;;;;IA9BN,+BAM6E;IAH3E,AADA,2NAAS,4BAAkB,KAAC,8NACX,4BAAkB,KAAC;IAKlC,AADF,+BAA6B,eACC;IAAA,YAA2B;IAAA,iBAAO;IAC9D,gCAAkE;IAAA,YAAgB;IACpF,AADoF,iBAAO,EACrF;IACN,+BAA2B;IACzB,wBAAoC;IACpC,YACF;IAAA,iBAAM;IAEJ,AADF,+BAA4B,gBACH;IACrB,yBAAuC;IACvC,aACF;IAAA,iBAAO;IACP,oHAA6B;IAM7B,oHAA8B;IAM9B,iCAAuB;IACrB,yBAAqC;IACrC,aACF;IAAA,iBAAO;IACP,iCAAuB;IACrB,yBAAsC;IACtC,aACF;IAEJ,AADE,AADE,iBAAO,EACH,EACF;;;;;IAjC0B,eAA2B;IAA3B,8CAA2B;IAC5B,cAAsC;IAAtC,8DAAsC;IAAC,cAAgB;IAAhB,mCAAgB;IAIlF,eACF;IADE,oEACF;IAII,eACF;IADE,gEACF;IACA,cAKC;IALD,oDAKC;IACD,cAKC;IALD,qDAKC;IAGC,eACF;IADE,8EACF;IAGE,eACF;IADE,sEACF;;;IA1FJ,AADF,AADF,8BAAyB,aACE,aACE;IACvB,uBAAuC;IACzC,iBAAM;IAEJ,AADF,8BAA4B,eACC;IAAA,YAAuB;IAAA,iBAAO;IACzD,gCAA2B;IAAA,0BAAU;IAEzC,AADE,AADuC,iBAAO,EACxC,EACF;IAGJ,AADF,8BAAyB,eACsB;IAC3C,yBAAuC;IACzC,iBAAM;IAEJ,AADF,+BAA4B,gBACC;IAAA,aAAkC;IAAA,iBAAO;IACpE,iCAA2B;IAAA,iCAAgB;IAE/C,AADE,AAD6C,iBAAO,EAC9C,EACF;IAGJ,AADF,+BAAyB,eACsB;IAC3C,yBAAoC;IACtC,iBAAM;IAEJ,AADF,+BAA4B,gBACC;IAAA,aAA4C;IAAA,iBAAO;IAC9E,iCAA2B;IAAA,6BAAY;IAE3C,AADE,AADyC,iBAAO,EAC1C,EACF;IAGJ,AADF,+BAAyB,eACmB;IACxC,yBAAiC;IACnC,iBAAM;IAEJ,AADF,+BAA4B,gBACC;IAAA,aAAqC;IAAA,iBAAO;IACvE,iCAA2B;IAAA,yBAAQ;IAGzC,AADE,AADE,AADqC,iBAAO,EACtC,EACF,EACF;IAIJ,AADF,gCAAsB,cACO;IAAA,4BAAW;IAAA,iBAAK;IAE3C,uHAAyB;IAMzB,+GA2CC;IACH,iBAAM;;;IA1F2B,eAAuB;IAAvB,8CAAuB;IAUvB,eAAkC;IAAlC,yDAAkC;IAUlC,eAA4C;IAA5C,0EAA4C;IAU5C,eAAqC;IAArC,mEAAqC;IAUpE,eAIC;IAJD,oDAIC;IAED,cA2CC;IA3CD,0BA2CC;;;;IAMH,+BAA6D;IAAxB,0LAAS,oBAAa,KAAC;IAAC,iBAAM;;;IAuD7D,iCAAgE;;;IAIhE,qCAAuG;;;IAiB7F,AADF,0BAAI,aACsB;IAAA,YAAuB;IAAA,iBAAK;IACpD,8BAA8C;IAAA,YAAqB;IAAA,iBAAK;IAEtE,AADF,0BAAI,eACmF;IACnF,YACF;IACF,AADE,iBAAO,EACJ;IACL,8BAAuB;IAAA,YAA+B;IACxD,AADwD,iBAAK,EACxD;;;;IARqB,eAAuB;IAAvB,0CAAuB;IAC3B,cAAyB;IAAzB,0CAAyB;IAAC,cAAqB;IAArB,wCAAqB;IAEtB,eAAyC;IAAzC,iEAAyC;IAClF,cACF;IADE,iDACF;IAEqB,eAA+B;IAA/B,yDAA+B;;;IAhBxD,AADF,AADF,AADF,AADF,+BAAkC,gBACJ,YACnB,SACD,SACE;IAAA,sBAAM;IAAA,iBAAK;IACf,0BAAI;IAAA,yBAAS;IAAA,iBAAK;IAClB,0BAAI;IAAA,sBAAM;IAAA,iBAAK;IACf,2BAAI;IAAA,sBAAK;IAEb,AADE,AADW,iBAAK,EACX,EACC;IACR,8BAAO;IACL,8HAWC;IAGP,AADE,AADE,iBAAQ,EACF,EACJ;;;IAdA,gBAWC;IAXD,gCAWC;;;;IA7ET,AADF,+BAA2B,SACrB;IAAA,2BAAW;IAAA,iBAAK;IACpB,kCAAmF;IAAlD,6LAAS,oBAAa,KAAC;IACtD,wBAAiC;IAErC,AADE,iBAAS,EACL;IAKF,AADF,AADF,+BAA4B,cACM,eACH;IAAA,6BAAa;IAAA,iBAAO;IAC/C,gCAA2B;IAAA,aAAmC;IAChE,AADgE,iBAAO,EACjE;IAEJ,AADF,gCAAgC,gBACH;IAAA,uBAAM;IAAA,iBAAO;IACxC,iCAA0E;IAAA,aAAwB;IACpG,AADoG,iBAAO,EACrG;IAEJ,AADF,gCAAgC,gBACH;IAAA,wBAAO;IAAA,iBAAO;IACzC,iCAA2B;IAAA,aAAuC;IACpE,AADoE,iBAAO,EACrE;IAEJ,AADF,gCAAgC,gBACH;IAAA,yBAAQ;IAAA,iBAAO;IAC1C,iCAA2B;IAAA,aAAiD;IAEhF,AADE,AAD8E,iBAAO,EAC/E,EACF;IAKF,AADF,AADF,gCAA0B,eACC,gBACS;IAAA,aAAiC;IAAA,iBAAO;IACxE,iCAAgC;IAAA,yBAAQ;IAC1C,AAD0C,iBAAO,EAC3C;IAEJ,AADF,gCAA2C,gBACT;IAAA,aAA+B;IAAA,iBAAO;IACtE,iCAAgC;IAAA,uBAAM;IACxC,AADwC,iBAAO,EACzC;IAEJ,AADF,gCAA2C,gBACT;IAAA,aAAgC;IAAA,iBAAO;IACvE,iCAAgC;IAAA,wBAAO;IAE3C,AADE,AADyC,iBAAO,EAC1C,EACF;IAIJ,AADF,gCAA4B,UACtB;IAAA,mCAAkB;IAAA,iBAAK;IAE3B,mHAAuB;IAIvB,uHAAmD;IAInD,6GAAiD;IA4BnD,iBAAM;;;IAxEyB,gBAAmC;IAAnC,0DAAmC;IAInC,eAA8C;IAA9C,0EAA8C;IAAC,cAAwB;IAAxB,+CAAwB;IAIvE,eAAuC;IAAvC,qEAAuC;IAIvC,eAAiD;IAAjD,+EAAiD;IAO5C,eAAiC;IAAjC,wDAAiC;IAIjC,eAA+B;IAA/B,sDAA+B;IAI/B,eAAgC;IAAhC,uDAAgC;IASlE,eAEC;IAFD,kDAEC;IAED,cAEC;IAFD,qFAEC;IAED,cA2BC;IA3BD,mFA2BC;;ADtJT,MAAM,OAAO,yBAAyB;IAC5B,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAExC,sBAAsB;IACtB,OAAO,GAAsB;QAC3B,SAAS,EAAE,CAAC;QACZ,oBAAoB,EAAE,CAAC;QACvB,iBAAiB,EAAE,CAAC;QACpB,WAAW,EAAE,IAAI;KAClB,CAAC;IAEF,uBAAuB;IACvB,IAAI,GAAwB,EAAE,CAAC;IAE/B,4CAA4C;IAC5C,WAAW,GAA6B,IAAI,CAAC;IAE7C,0CAA0C;IAC1C,UAAU,GAA0B,EAAE,CAAC;IAEvC,iCAAiC;IACjC,UAAU,GAAG,KAAK,CAAC;IAEnB,uCAAuC;IACvC,SAAS,GAAG,IAAI,CAAC;IAEjB,yCAAyC;IACzC,eAAe,GAAG,KAAK,CAAC;IAEhB,SAAS,GAAG,KAAK,CAAC;IAE1B,QAAQ;QACN,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,WAAW;QACT,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,aAAa,CAAC,GAAsB;QACxC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,uBAAuB;IACvB,WAAW;QACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED,0CAA0C;IAC1C,WAAW,CAAC,KAAyC;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,IAAI,CAAC;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,gCAAgC;IAChC,UAAU,CAAC,IAAiB;QAC1B,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE;YACxC,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;IAED,sDAAsD;IACtD,cAAc,CAAC,OAAe;QAC5B,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,GAAG,OAAO,GAAG,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE,CAAC;QAC1B,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;IACrD,CAAC;IAED,uCAAuC;IACvC,cAAc,CAAC,MAAc;QAC3B,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7B,KAAK,SAAS,CAAC;YACf,KAAK,WAAW;gBACd,OAAO,sBAAsB,CAAC;YAChC,KAAK,QAAQ,CAAC;YACd,KAAK,OAAO;gBACV,OAAO,oBAAoB,CAAC;YAC9B,KAAK,SAAS,CAAC;YACf,KAAK,aAAa;gBAChB,OAAO,mBAAmB,CAAC;YAC7B;gBACE,OAAO,sBAAsB,CAAC;QAClC,CAAC;IACH,CAAC;IAED,4CAA4C;IACpC,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACjB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,wCAAwC;IAChC,KAAK,CAAC,SAAS;QACrB,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAY;YACzC,UAAU,EAAE,kBAAkB;YAC9B,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,gBAAgB;YACzB,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,8CAA8C;IACtC,YAAY,CAAC,CAAY;QAC/B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,MAAM,eAAe,GAAG,WAAW;YACjC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;YAClE,CAAC,CAAC,CAAC,CAAC;QAEN,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,iBAAiB,EAAE,CAAC,CAAC,oBAAoB,IAAI,EAAE;YAC/C,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,WAAW;YACxB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;YAC7B,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;YAC/C,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;YAC3C,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;YAC7C,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAC7C,eAAe,EAAE,eAAe;SACjC,CAAC;IACJ,CAAC;IAED,4CAA4C;IACpC,cAAc,CAAC,IAAyB;QAC9C,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,MAAM;YACtB,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;YACzE,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;YACjE,WAAW,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;SACxD,CAAC;IACJ,CAAC;IAED,6CAA6C;IACrC,KAAK,CAAC,cAAc,CAAC,KAAa;QACxC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAe;gBAC5C,UAAU,EAAE,yBAAyB;gBACrC,WAAW,EAAE,iBAAiB,SAAS,GAAG;gBAC1C,OAAO,EAAE,qBAAqB;gBAC9B,UAAU,EAAE,QAAQ;gBACpB,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,CAAC;aACjG,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,6CAA6C;IACrC,eAAe,CAAC,CAAe;QACrC,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;YAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;YAC7B,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;YACnC,UAAU,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE;SACnC,CAAC;IACJ,CAAC;IAED,2CAA2C;IACnC,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;mHApNU,yBAAyB;6DAAzB,yBAAyB;YClDtC,8BAAwB;YAEtB,2FAAiB;YAMjB,kFAAkB;YAsGlB,2FAAkB;YAKlB,8BAAsD;YACpD,mFAAmB;YAwFvB,AADE,iBAAM,EACF;;YA1MJ,cAIC;YAJD,wCAIC;YAED,cAmGC;YAnGD,yCAmGC;YAGD,cAEC;YAFD,yCAEC;YAG2B,cAAyB;YAAzB,sCAAyB;YACnD,cAsFC;YAtFD,0CAsFC;;;iFDxJQ,yBAAyB;cAPrC,SAAS;6BACI,KAAK,YACP,uBAAuB,mBAGhB,uBAAuB,CAAC,MAAM;;kFAEpC,yBAAyB","sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n OnInit,\n OnDestroy,\n inject,\n} from '@angular/core';\nimport { RunView } from '@memberjunction/core';\n\n/** Summary metrics for the dashboard cards */\nexport interface ArchiveRunMetrics {\n TotalRuns: number;\n TotalRecordsArchived: number;\n TotalStorageBytes: number;\n LastRunDate: Date | null;\n}\n\n/** Represents a single archive run */\nexport interface ArchiveRunSummary {\n ID: string;\n ConfigurationName: string;\n StartedAt: Date;\n CompletedAt: Date | null;\n Status: string;\n RecordsArchived: number;\n RecordsFailed: number;\n RecordsSkipped: number;\n TotalBytes: number;\n DurationSeconds: number;\n}\n\n/** Detail record for a single archived item within a run */\nexport interface ArchiveRunDetailRow {\n ID: string;\n EntityName: string;\n RecordID: string;\n Status: string;\n StoragePath: string;\n Bytes: number;\n ArchivedAt: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-archive-run-viewer',\n templateUrl: './archive-run-viewer.component.html',\n styleUrls: ['./archive-run-viewer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ArchiveRunViewerComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n /** Summary metrics */\n Metrics: ArchiveRunMetrics = {\n TotalRuns: 0,\n TotalRecordsArchived: 0,\n TotalStorageBytes: 0,\n LastRunDate: null,\n };\n\n /** All archive runs */\n Runs: ArchiveRunSummary[] = [];\n\n /** Currently selected run for the drawer */\n SelectedRun: ArchiveRunSummary | null = null;\n\n /** Detail records for the selected run */\n RunDetails: ArchiveRunDetailRow[] = [];\n\n /** Whether the drawer is open */\n DrawerOpen = false;\n\n /** Whether the main data is loading */\n IsLoading = true;\n\n /** Whether drawer details are loading */\n IsDrawerLoading = false;\n\n private destroyed = false;\n\n ngOnInit(): void {\n this.loadRunData();\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n }\n\n /** Open the drawer for a specific run */\n async OpenRunDrawer(run: ArchiveRunSummary): Promise<void> {\n this.SelectedRun = run;\n this.DrawerOpen = true;\n this.cdr.markForCheck();\n await this.loadRunDetails(run.ID);\n }\n\n /** Close the drawer */\n CloseDrawer(): void {\n this.DrawerOpen = false;\n this.SelectedRun = null;\n this.RunDetails = [];\n this.cdr.markForCheck();\n }\n\n /** Format bytes into a readable string */\n FormatBytes(bytes: number | string | null | undefined): string {\n const numBytes = Number(bytes);\n if (!numBytes || numBytes <= 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(numBytes) / Math.log(k));\n const value = numBytes / Math.pow(k, i);\n return `${value.toFixed(i > 0 ? 1 : 0)} ${units[i]}`;\n }\n\n /** Format a date for display */\n FormatDate(date: Date | null): string {\n if (!date) return 'N/A';\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n }\n\n /** Format duration in seconds to a readable string */\n FormatDuration(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;\n }\n\n /** Get CSS class for a status badge */\n GetStatusClass(status: string): string {\n switch (status.toLowerCase()) {\n case 'success':\n case 'completed':\n return 'status-badge-success';\n case 'failed':\n case 'error':\n return 'status-badge-error';\n case 'running':\n case 'in progress':\n return 'status-badge-info';\n default:\n return 'status-badge-default';\n }\n }\n\n /** Load all run data and compute metrics */\n private async loadRunData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const runs = await this.fetchRuns();\n this.Runs = runs;\n this.Metrics = this.computeMetrics(runs);\n } catch {\n this.Runs = [];\n } finally {\n this.IsLoading = false;\n this.markForCheckIfAlive();\n }\n }\n\n /** Fetch run records from the server */\n private async fetchRuns(): Promise<ArchiveRunSummary[]> {\n const rv = new RunView();\n const result = await rv.RunView<RunRecord>({\n EntityName: 'MJ: Archive Runs',\n ExtraFilter: '',\n OrderBy: 'StartedAt DESC',\n ResultType: 'simple',\n });\n\n if (!result.Success) return [];\n return result.Results.map((r) => this.mapRunRecord(r));\n }\n\n /** Map a raw run record to a typed summary */\n private mapRunRecord(r: RunRecord): ArchiveRunSummary {\n const startedAt = new Date(r.StartedAt);\n const completedAt = r.CompletedAt ? new Date(r.CompletedAt) : null;\n const durationSeconds = completedAt\n ? Math.round((completedAt.getTime() - startedAt.getTime()) / 1000)\n : 0;\n\n return {\n ID: r.ID,\n ConfigurationName: r.ArchiveConfiguration ?? '',\n StartedAt: startedAt,\n CompletedAt: completedAt,\n Status: r.Status ?? 'Unknown',\n RecordsArchived: Number(r.ArchivedRecords) || 0,\n RecordsFailed: Number(r.FailedRecords) || 0,\n RecordsSkipped: Number(r.SkippedRecords) || 0,\n TotalBytes: Number(r.TotalBytesArchived) || 0,\n DurationSeconds: durationSeconds,\n };\n }\n\n /** Compute summary metrics from all runs */\n private computeMetrics(runs: ArchiveRunSummary[]): ArchiveRunMetrics {\n return {\n TotalRuns: runs.length,\n TotalRecordsArchived: runs.reduce((sum, r) => sum + r.RecordsArchived, 0),\n TotalStorageBytes: runs.reduce((sum, r) => sum + r.TotalBytes, 0),\n LastRunDate: runs.length > 0 ? runs[0].StartedAt : null,\n };\n }\n\n /** Load detail records for a specific run */\n private async loadRunDetails(runId: string): Promise<void> {\n this.IsDrawerLoading = true;\n this.RunDetails = [];\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const escapedId = runId.replace(/'/g, \"''\");\n const result = await rv.RunView<DetailRecord>({\n EntityName: 'MJ: Archive Run Details',\n ExtraFilter: `ArchiveRunID='${escapedId}'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'simple',\n Fields: ['ID', 'Entity', 'RecordID', 'Status', 'StoragePath', 'BytesArchived', '__mj_CreatedAt'],\n });\n\n if (result.Success) {\n this.RunDetails = result.Results.map((r) => this.mapDetailRecord(r));\n }\n } catch {\n this.RunDetails = [];\n } finally {\n this.IsDrawerLoading = false;\n this.markForCheckIfAlive();\n }\n }\n\n /** Map a raw detail record to a typed row */\n private mapDetailRecord(r: DetailRecord): ArchiveRunDetailRow {\n return {\n ID: r.ID,\n EntityName: r.Entity ?? '',\n RecordID: r.RecordID ?? '',\n Status: r.Status ?? 'Unknown',\n StoragePath: r.StoragePath ?? '',\n Bytes: Number(r.BytesArchived) || 0,\n ArchivedAt: r.__mj_CreatedAt ?? '',\n };\n }\n\n /** Mark for check only if not destroyed */\n private markForCheckIfAlive(): void {\n if (!this.destroyed) {\n this.cdr.markForCheck();\n }\n }\n}\n\n/** Shape of a run record from the simple RunView query */\ninterface RunRecord {\n ID: string;\n ArchiveConfiguration: string;\n StartedAt: string;\n CompletedAt: string;\n Status: string;\n ArchivedRecords: number;\n FailedRecords: number;\n SkippedRecords: number;\n TotalBytesArchived: number;\n}\n\n/** Shape of a detail record from the simple RunView query */\ninterface DetailRecord {\n ID: string;\n Entity: string;\n RecordID: string;\n Status: string;\n StoragePath: string;\n BytesArchived: number;\n __mj_CreatedAt: string;\n}\n","<div class=\"run-viewer\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"run-viewer-loading\">\n <mj-loading text=\"Loading archive runs...\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n <!-- Summary metric cards -->\n <div class=\"metrics-row\">\n <div class=\"metric-card\">\n <div class=\"metric-icon\">\n <i class=\"fa-solid fa-play-circle\"></i>\n </div>\n <div class=\"metric-content\">\n <span class=\"metric-value\">{{ Metrics.TotalRuns }}</span>\n <span class=\"metric-label\">Total Runs</span>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-archive\">\n <i class=\"fa-solid fa-box-archive\"></i>\n </div>\n <div class=\"metric-content\">\n <span class=\"metric-value\">{{ Metrics.TotalRecordsArchived }}</span>\n <span class=\"metric-label\">Records Archived</span>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-storage\">\n <i class=\"fa-solid fa-database\"></i>\n </div>\n <div class=\"metric-content\">\n <span class=\"metric-value\">{{ FormatBytes(Metrics.TotalStorageBytes) }}</span>\n <span class=\"metric-label\">Storage Used</span>\n </div>\n </div>\n\n <div class=\"metric-card\">\n <div class=\"metric-icon metric-icon-time\">\n <i class=\"fa-solid fa-clock\"></i>\n </div>\n <div class=\"metric-content\">\n <span class=\"metric-value\">{{ FormatDate(Metrics.LastRunDate) }}</span>\n <span class=\"metric-label\">Last Run</span>\n </div>\n </div>\n </div>\n\n <!-- Run list -->\n <div class=\"run-list\">\n <h3 class=\"run-list-title\">Run History</h3>\n\n @if (Runs.length === 0) {\n <mj-empty-state class=\"run-empty\" Size=\"compact\"\n Icon=\"fa-solid fa-inbox\"\n Title=\"No archive runs found.\" />\n }\n\n @for (run of Runs; track run.ID) {\n <div\n class=\"run-card\"\n (click)=\"OpenRunDrawer(run)\"\n (keydown.enter)=\"OpenRunDrawer(run)\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-label]=\"'View details for run on ' + FormatDate(run.StartedAt)\">\n <div class=\"run-card-header\">\n <span class=\"run-card-name\">{{ run.ConfigurationName }}</span>\n <span class=\"status-badge\" [ngClass]=\"GetStatusClass(run.Status)\">{{ run.Status }}</span>\n </div>\n <div class=\"run-card-date\">\n <i class=\"fa-solid fa-calendar\"></i>\n {{ FormatDate(run.StartedAt) }}\n </div>\n <div class=\"run-card-stats\">\n <span class=\"run-stat\">\n <i class=\"fa-solid fa-box-archive\"></i>\n {{ run.RecordsArchived }} archived\n </span>\n @if (run.RecordsFailed > 0) {\n <span class=\"run-stat run-stat-error\">\n <i class=\"fa-solid fa-circle-xmark\"></i>\n {{ run.RecordsFailed }} failed\n </span>\n }\n @if (run.RecordsSkipped > 0) {\n <span class=\"run-stat run-stat-muted\">\n <i class=\"fa-solid fa-forward\"></i>\n {{ run.RecordsSkipped }} skipped\n </span>\n }\n <span class=\"run-stat\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n {{ FormatDuration(run.DurationSeconds) }}\n </span>\n <span class=\"run-stat\">\n <i class=\"fa-solid fa-hard-drive\"></i>\n {{ FormatBytes(run.TotalBytes) }}\n </span>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Drawer backdrop -->\n @if (DrawerOpen) {\n <div class=\"archive-drawer-backdrop\" (click)=\"CloseDrawer()\"></div>\n }\n\n <!-- Slide-in drawer -->\n <div class=\"archive-drawer\" [class.open]=\"DrawerOpen\">\n @if (SelectedRun) {\n <!-- Drawer header -->\n <div class=\"drawer-header\">\n <h3>Run Details</h3>\n <button class=\"drawer-close-btn\" (click)=\"CloseDrawer()\" aria-label=\"Close drawer\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Run summary -->\n <div class=\"drawer-summary\">\n <div class=\"drawer-summary-row\">\n <span class=\"drawer-label\">Configuration</span>\n <span class=\"drawer-value\">{{ SelectedRun.ConfigurationName }}</span>\n </div>\n <div class=\"drawer-summary-row\">\n <span class=\"drawer-label\">Status</span>\n <span class=\"status-badge\" [ngClass]=\"GetStatusClass(SelectedRun.Status)\">{{ SelectedRun.Status }}</span>\n </div>\n <div class=\"drawer-summary-row\">\n <span class=\"drawer-label\">Started</span>\n <span class=\"drawer-value\">{{ FormatDate(SelectedRun.StartedAt) }}</span>\n </div>\n <div class=\"drawer-summary-row\">\n <span class=\"drawer-label\">Duration</span>\n <span class=\"drawer-value\">{{ FormatDuration(SelectedRun.DurationSeconds) }}</span>\n </div>\n </div>\n\n <!-- Stats row -->\n <div class=\"drawer-stats\">\n <div class=\"drawer-stat\">\n <span class=\"drawer-stat-value\">{{ SelectedRun.RecordsArchived }}</span>\n <span class=\"drawer-stat-label\">Archived</span>\n </div>\n <div class=\"drawer-stat drawer-stat-error\">\n <span class=\"drawer-stat-value\">{{ SelectedRun.RecordsFailed }}</span>\n <span class=\"drawer-stat-label\">Failed</span>\n </div>\n <div class=\"drawer-stat drawer-stat-muted\">\n <span class=\"drawer-stat-value\">{{ SelectedRun.RecordsSkipped }}</span>\n <span class=\"drawer-stat-label\">Skipped</span>\n </div>\n </div>\n\n <!-- Detail table -->\n <div class=\"drawer-details\">\n <h4>Per-Record Results</h4>\n\n @if (IsDrawerLoading) {\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n }\n\n @if (!IsDrawerLoading && RunDetails.length === 0) {\n <mj-empty-state class=\"drawer-details-empty\" Size=\"compact\" Icon=\"\" Title=\"No detail records found.\" />\n }\n\n @if (!IsDrawerLoading && RunDetails.length > 0) {\n <div class=\"drawer-table-wrapper\">\n <table class=\"drawer-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Record ID</th>\n <th>Status</th>\n <th>Bytes</th>\n </tr>\n </thead>\n <tbody>\n @for (detail of RunDetails; track detail.ID) {\n <tr>\n <td class=\"cell-entity\">{{ detail.EntityName }}</td>\n <td class=\"cell-id\" [title]=\"detail.RecordID\">{{ detail.RecordID }}</td>\n <td>\n <span class=\"status-badge status-badge-sm\" [ngClass]=\"GetStatusClass(detail.Status)\">\n {{ detail.Status }}\n </span>\n </td>\n <td class=\"cell-bytes\">{{ FormatBytes(detail.Bytes) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n </div>\n</div>\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-archive-manager",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.44.0",
|
|
4
4
|
"description": "MemberJunction: Angular Archive Manager - UI components for managing entity field archiving, restoration, and configuration.",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"/dist"
|
|
9
9
|
],
|
|
10
10
|
"scripts": {
|
|
11
|
-
"test": "
|
|
11
|
+
"test": "vitest run",
|
|
12
12
|
"build": "npm run clean && ngc",
|
|
13
13
|
"clean": "rimraf dist",
|
|
14
14
|
"test:watch": "vitest"
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@angular/compiler": "21.1.3",
|
|
25
25
|
"@angular/compiler-cli": "21.1.3",
|
|
26
|
+
"@memberjunction/ng-test-utils": "5.44.0",
|
|
26
27
|
"vitest": "^4.0.18"
|
|
27
28
|
},
|
|
28
29
|
"peerDependencies": {
|
|
@@ -32,11 +33,12 @@
|
|
|
32
33
|
"rxjs": "^7.8.2"
|
|
33
34
|
},
|
|
34
35
|
"dependencies": {
|
|
35
|
-
"@memberjunction/
|
|
36
|
-
"@memberjunction/
|
|
37
|
-
"@memberjunction/
|
|
38
|
-
"@memberjunction/
|
|
39
|
-
"@memberjunction/
|
|
36
|
+
"@memberjunction/ng-ui-components": "5.44.0",
|
|
37
|
+
"@memberjunction/core": "5.44.0",
|
|
38
|
+
"@memberjunction/ng-base-types": "5.44.0",
|
|
39
|
+
"@memberjunction/core-entities": "5.44.0",
|
|
40
|
+
"@memberjunction/global": "5.44.0",
|
|
41
|
+
"@memberjunction/ng-shared-generic": "5.44.0",
|
|
40
42
|
"tslib": "^2.8.1"
|
|
41
43
|
},
|
|
42
44
|
"sideEffects": false,
|