@memberjunction/ng-archive-manager 5.30.0 → 5.31.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.
@@ -1,4 +1,5 @@
1
1
  import { OnInit, OnDestroy } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
2
3
  import { MJArchiveConfigurationEntityType, MJArchiveConfigurationEntityEntityType } from '@memberjunction/core-entities';
3
4
  import * as i0 from "@angular/core";
4
5
  type ArchiveStatus = MJArchiveConfigurationEntityType['Status'];
@@ -37,7 +38,7 @@ export interface StorageAccountOption {
37
38
  ID: string;
38
39
  Name: string;
39
40
  }
40
- export declare class ArchiveConfigAdminComponent implements OnInit, OnDestroy {
41
+ export declare class ArchiveConfigAdminComponent extends BaseAngularComponent implements OnInit, OnDestroy {
41
42
  private cdr;
42
43
  /** All configurations */
43
44
  Configs: ArchiveConfig[];
@@ -1 +1 @@
1
- {"version":3,"file":"archive-config-admin.component.d.ts","sourceRoot":"","sources":["../../../src/lib/archive-config/archive-config-admin.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"archive-config-admin.component.d.ts","sourceRoot":"","sources":["../../../src/lib/archive-config/archive-config-admin.component.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Component, ChangeDetectionStrategy, ChangeDetectorRef, inject, } from '@angular/core';
2
- import { CompositeKey, Metadata, RunView } from '@memberjunction/core';
2
+ import { CompositeKey, RunView } from '@memberjunction/core';
3
3
  import { UUIDsEqual } from '@memberjunction/global';
4
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "@angular/forms";
6
7
  import * as i2 from "@memberjunction/ng-shared-generic";
@@ -384,7 +385,7 @@ function ArchiveConfigAdminComponent_Conditional_2_Template(rf, ctx) { if (rf &
384
385
  i0.ɵɵadvance();
385
386
  i0.ɵɵconditional(ctx_r1.SelectedConfig ? 14 : -1);
386
387
  } }
387
- export class ArchiveConfigAdminComponent {
388
+ export class ArchiveConfigAdminComponent extends BaseAngularComponent {
388
389
  cdr = inject(ChangeDetectorRef);
389
390
  /** All configurations */
390
391
  Configs = [];
@@ -526,7 +527,7 @@ export class ArchiveConfigAdminComponent {
526
527
  this.IsLoading = true;
527
528
  this.cdr.markForCheck();
528
529
  try {
529
- const rv = new RunView();
530
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
530
531
  const [configResult, storageResult] = await rv.RunViews([
531
532
  {
532
533
  EntityName: 'MJ: Archive Configurations',
@@ -589,7 +590,7 @@ export class ArchiveConfigAdminComponent {
589
590
  this.IsDetailLoading = true;
590
591
  this.cdr.markForCheck();
591
592
  try {
592
- const rv = new RunView();
593
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
593
594
  const escapedId = configId.replace(/'/g, "''");
594
595
  const result = await rv.RunView({
595
596
  EntityName: 'MJ: Archive Configuration Entities',
@@ -628,8 +629,8 @@ export class ArchiveConfigAdminComponent {
628
629
  async saveConfiguration() {
629
630
  if (!this.SelectedConfig?.IsDirty)
630
631
  return;
631
- const md = new Metadata();
632
- const entity = await md.GetEntityObject('MJ: Archive Configurations');
632
+ const md = this.ProviderToUse;
633
+ const entity = await md.GetEntityObject('MJ: Archive Configurations', md.CurrentUser);
633
634
  if (!this.SelectedConfig.ID.startsWith('new-')) {
634
635
  await entity.InnerLoad(CompositeKey.FromKeyValuePair('ID', this.SelectedConfig.ID));
635
636
  }
@@ -666,8 +667,8 @@ export class ArchiveConfigAdminComponent {
666
667
  }
667
668
  /** Save a single config entity record using strongly-typed entity */
668
669
  async saveConfigEntity(configEntity) {
669
- const md = new Metadata();
670
- const entity = await md.GetEntityObject('MJ: Archive Configuration Entities');
670
+ const md = this.ProviderToUse;
671
+ const entity = await md.GetEntityObject('MJ: Archive Configuration Entities', md.CurrentUser);
671
672
  if (!configEntity.IsNew) {
672
673
  await entity.InnerLoad(CompositeKey.FromKeyValuePair('ID', configEntity.ID));
673
674
  }
@@ -689,7 +690,7 @@ export class ArchiveConfigAdminComponent {
689
690
  }
690
691
  /** Refresh the config list after a save */
691
692
  async refreshConfigList() {
692
- const rv = new RunView();
693
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
693
694
  const result = await rv.RunView({
694
695
  EntityName: 'MJ: Archive Configurations',
695
696
  ExtraFilter: '',
@@ -714,8 +715,8 @@ export class ArchiveConfigAdminComponent {
714
715
  this.cdr.markForCheck();
715
716
  }
716
717
  }
717
- static ɵfac = function ArchiveConfigAdminComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArchiveConfigAdminComponent)(); };
718
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArchiveConfigAdminComponent, selectors: [["mj-archive-config-admin"]], standalone: false, decls: 3, vars: 2, consts: [[1, "config-admin"], [1, "config-loading"], [1, "config-layout"], ["text", "Loading configurations..."], [1, "config-list-panel"], [1, "config-list-header"], [1, "btn", "btn-primary", "btn-sm", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "config-card-list"], ["tabindex", "0", "role", "button", 1, "config-card", 3, "selected"], [1, "config-empty"], [1, "config-detail-panel"], [1, "config-detail-placeholder"], ["tabindex", "0", "role", "button", 1, "config-card", 3, "click", "keydown.enter"], [1, "config-card-header"], [1, "config-card-name"], [1, "config-status-badge"], [1, "config-card-meta"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-folder"], [1, "config-card-date"], [1, "config-status-mode"], [1, "fa-solid", "fa-sliders"], [1, "fa-solid", "fa-folder-open"], [1, "fa-solid", "fa-hand-pointer"], [1, "config-detail-loading"], [1, "config-detail-content"], ["text", "Loading details...", "size", "small"], [1, "detail-section"], [1, "detail-field"], ["for", "config-name"], ["id", "config-name", "type", "text", 1, "detail-input", 3, "ngModelChange", "ngModel"], [1, "detail-checkbox"], ["type", "checkbox", 3, "change", "checked"], ["for", "config-desc"], ["id", "config-desc", "rows", "2", 1, "detail-input", "detail-textarea", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-hard-drive"], [1, "detail-row"], ["for", "config-storage"], ["id", "config-storage", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], ["for", "config-path"], ["id", "config-path", "type", "text", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["for", "config-retention"], ["id", "config-retention", "type", "number", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["for", "config-batch"], ["id", "config-batch", "type", "number", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["for", "config-mode"], ["id", "config-mode", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "detail-section-header"], [1, "fa-solid", "fa-table"], [1, "btn", "btn-sm", "btn-outline", 3, "click"], [1, "entity-table-wrapper"], [1, "entity-empty"], [1, "config-status", 3, "status-success", "status-error"], [1, "detail-actions"], [1, "btn", "btn-primary", 3, "click", "disabled"], [1, "btn", "btn-secondary", 3, "click", "disabled"], [1, "entity-table"], ["type", "text", "placeholder", "Entity name", 1, "entity-input", 3, "ngModelChange", "ngModel"], [1, "entity-input", 3, "ngModelChange", "ngModel"], ["type", "number", 1, "entity-input", "entity-input-sm", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "e.g. CreatedAt", 1, "entity-input", 3, "ngModelChange", "ngModel"], ["title", "Remove entity", "aria-label", "Remove entity", 1, "btn-icon", "btn-icon-danger", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "config-status"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-floppy-disk"]], template: function ArchiveConfigAdminComponent_Template(rf, ctx) { if (rf & 1) {
718
+ static ɵfac = /*@__PURE__*/ (() => { let ɵArchiveConfigAdminComponent_BaseFactory; return function ArchiveConfigAdminComponent_Factory(__ngFactoryType__) { return (ɵArchiveConfigAdminComponent_BaseFactory || (ɵArchiveConfigAdminComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ArchiveConfigAdminComponent)))(__ngFactoryType__ || ArchiveConfigAdminComponent); }; })();
719
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArchiveConfigAdminComponent, selectors: [["mj-archive-config-admin"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [[1, "config-admin"], [1, "config-loading"], [1, "config-layout"], ["text", "Loading configurations..."], [1, "config-list-panel"], [1, "config-list-header"], [1, "btn", "btn-primary", "btn-sm", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "config-card-list"], ["tabindex", "0", "role", "button", 1, "config-card", 3, "selected"], [1, "config-empty"], [1, "config-detail-panel"], [1, "config-detail-placeholder"], ["tabindex", "0", "role", "button", 1, "config-card", 3, "click", "keydown.enter"], [1, "config-card-header"], [1, "config-card-name"], [1, "config-status-badge"], [1, "config-card-meta"], [1, "fa-solid", "fa-database"], [1, "fa-solid", "fa-folder"], [1, "config-card-date"], [1, "config-status-mode"], [1, "fa-solid", "fa-sliders"], [1, "fa-solid", "fa-folder-open"], [1, "fa-solid", "fa-hand-pointer"], [1, "config-detail-loading"], [1, "config-detail-content"], ["text", "Loading details...", "size", "small"], [1, "detail-section"], [1, "detail-field"], ["for", "config-name"], ["id", "config-name", "type", "text", 1, "detail-input", 3, "ngModelChange", "ngModel"], [1, "detail-checkbox"], ["type", "checkbox", 3, "change", "checked"], ["for", "config-desc"], ["id", "config-desc", "rows", "2", 1, "detail-input", "detail-textarea", 3, "ngModelChange", "ngModel"], [1, "fa-solid", "fa-hard-drive"], [1, "detail-row"], ["for", "config-storage"], ["id", "config-storage", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["value", ""], [3, "value"], ["for", "config-path"], ["id", "config-path", "type", "text", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["for", "config-retention"], ["id", "config-retention", "type", "number", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["for", "config-batch"], ["id", "config-batch", "type", "number", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["for", "config-mode"], ["id", "config-mode", 1, "detail-input", 3, "ngModelChange", "ngModel"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [1, "detail-section-header"], [1, "fa-solid", "fa-table"], [1, "btn", "btn-sm", "btn-outline", 3, "click"], [1, "entity-table-wrapper"], [1, "entity-empty"], [1, "config-status", 3, "status-success", "status-error"], [1, "detail-actions"], [1, "btn", "btn-primary", 3, "click", "disabled"], [1, "btn", "btn-secondary", 3, "click", "disabled"], [1, "entity-table"], ["type", "text", "placeholder", "Entity name", 1, "entity-input", 3, "ngModelChange", "ngModel"], [1, "entity-input", 3, "ngModelChange", "ngModel"], ["type", "number", 1, "entity-input", "entity-input-sm", 3, "ngModelChange", "ngModel"], ["type", "text", "placeholder", "e.g. CreatedAt", 1, "entity-input", 3, "ngModelChange", "ngModel"], ["title", "Remove entity", "aria-label", "Remove entity", 1, "btn-icon", "btn-icon-danger", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "config-status"], [1, "fa-solid", "fa-circle-check"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-floppy-disk"]], template: function ArchiveConfigAdminComponent_Template(rf, ctx) { if (rf & 1) {
719
720
  i0.ɵɵelementStart(0, "div", 0);
720
721
  i0.ɵɵconditionalCreate(1, ArchiveConfigAdminComponent_Conditional_1_Template, 2, 0, "div", 1);
721
722
  i0.ɵɵconditionalCreate(2, ArchiveConfigAdminComponent_Conditional_2_Template, 15, 3, "div", 2);
@@ -731,5 +732,5 @@ export class ArchiveConfigAdminComponent {
731
732
  type: Component,
732
733
  args: [{ standalone: false, selector: 'mj-archive-config-admin', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"config-admin\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configurations...\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n <div class=\"config-layout\">\n <!-- Left panel: Config list -->\n <div class=\"config-list-panel\">\n <div class=\"config-list-header\">\n <h2>Archive Configurations</h2>\n <button class=\"btn btn-primary btn-sm\" (click)=\"AddConfiguration()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Configuration\n </button>\n </div>\n\n <div class=\"config-card-list\">\n @for (config of Configs; track config.ID) {\n <div\n class=\"config-card\"\n [class.selected]=\"IsSelectedConfig(config)\"\n (click)=\"SelectConfig(config)\"\n (keydown.enter)=\"SelectConfig(config)\"\n tabindex=\"0\"\n role=\"button\">\n <div class=\"config-card-header\">\n <span class=\"config-card-name\">{{ config.Name }}</span>\n <span\n class=\"config-status-badge\"\n [class.status-active]=\"config.Status === 'Idle' || config.Status === 'Running'\"\n [class.status-inactive]=\"config.Status === 'Disabled' || config.Status === 'Error'\">\n {{ GetStatusLabel(config.Status) }}\n </span>\n </div>\n <div class=\"config-card-meta\">\n <span><i class=\"fa-solid fa-database\"></i> {{ config.StorageAccountName || 'No storage' }}</span>\n <span><i class=\"fa-solid fa-folder\"></i> {{ config.RootPath }}</span>\n </div>\n <div class=\"config-card-date\">\n <span class=\"config-status-mode\"><i class=\"fa-solid fa-sliders\"></i> {{ config.DefaultMode }}</span>\n </div>\n </div>\n }\n\n @if (Configs.length === 0) {\n <div class=\"config-empty\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No configurations found. Create one to get started.</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Right panel: Detail -->\n <div class=\"config-detail-panel\">\n @if (!SelectedConfig) {\n <div class=\"config-detail-placeholder\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a configuration to view details</p>\n </div>\n }\n\n @if (SelectedConfig) {\n @if (IsDetailLoading) {\n <div class=\"config-detail-loading\">\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n </div>\n }\n\n @if (!IsDetailLoading) {\n <div class=\"config-detail-content\">\n <!-- Header section -->\n <div class=\"detail-section\">\n <div class=\"detail-field\">\n <label for=\"config-name\">Name</label>\n <input\n id=\"config-name\"\n type=\"text\"\n [(ngModel)]=\"SelectedConfig.Name\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n <div class=\"detail-field\">\n <label>Active</label>\n <div class=\"detail-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"SelectedConfig.Status === 'Idle'\"\n (change)=\"SelectedConfig.Status = SelectedConfig.Status === 'Idle' ? 'Disabled' : 'Idle'; OnConfigFieldChanged()\" />\n </div>\n </div>\n <div class=\"detail-field\">\n <label for=\"config-desc\">Description</label>\n <textarea\n id=\"config-desc\"\n [(ngModel)]=\"SelectedConfig.Description\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input detail-textarea\"\n rows=\"2\"></textarea>\n </div>\n </div>\n\n <!-- Storage section -->\n <div class=\"detail-section\">\n <h3><i class=\"fa-solid fa-hard-drive\"></i> Storage</h3>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-storage\">Storage Account</label>\n <select\n id=\"config-storage\"\n [(ngModel)]=\"SelectedConfig.StorageAccountID\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\">\n <option value=\"\">-- Select --</option>\n @for (account of StorageAccounts; track account.ID) {\n <option [value]=\"account.ID\">{{ account.Name }}</option>\n }\n </select>\n </div>\n <div class=\"detail-field\">\n <label for=\"config-path\">Root Path</label>\n <input\n id=\"config-path\"\n type=\"text\"\n [(ngModel)]=\"SelectedConfig.RootPath\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n </div>\n </div>\n\n <!-- Defaults section -->\n <div class=\"detail-section\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Defaults</h3>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-retention\">Retention Days</label>\n <input\n id=\"config-retention\"\n type=\"number\"\n [(ngModel)]=\"SelectedConfig.DefaultRetentionDays\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n <div class=\"detail-field\">\n <label for=\"config-batch\">Batch Size</label>\n <input\n id=\"config-batch\"\n type=\"number\"\n [(ngModel)]=\"SelectedConfig.DefaultBatchSize\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-mode\">Archive Mode</label>\n <select\n id=\"config-mode\"\n [(ngModel)]=\"SelectedConfig.DefaultMode\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\">\n @for (mode of ArchiveModes; track mode) {\n <option [value]=\"mode\">{{ mode }}</option>\n }\n </select>\n </div>\n <div class=\"detail-field\">\n <label>Archive Record Changes</label>\n <div class=\"detail-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"SelectedConfig.ArchiveRelatedRecordChanges\"\n (ngModelChange)=\"OnConfigFieldChanged()\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- Entities section -->\n <div class=\"detail-section\">\n <div class=\"detail-section-header\">\n <h3><i class=\"fa-solid fa-table\"></i> Entities</h3>\n <button class=\"btn btn-sm btn-outline\" (click)=\"AddEntity()\">\n <i class=\"fa-solid fa-plus\"></i> Add Entity\n </button>\n </div>\n\n @if (ConfigEntities.length > 0) {\n <div class=\"entity-table-wrapper\">\n <table class=\"entity-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Mode</th>\n <th>Retention</th>\n <th>Batch</th>\n <th>Date Field</th>\n <th>Active</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (entity of ConfigEntities; track entity.ID) {\n <tr>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"entity.EntityName\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\"\n placeholder=\"Entity name\" />\n </td>\n <td>\n <select\n [(ngModel)]=\"entity.Mode\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\">\n @for (mode of ArchiveModes; track mode) {\n <option [value]=\"mode\">{{ mode }}</option>\n }\n </select>\n </td>\n <td>\n <input\n type=\"number\"\n [(ngModel)]=\"entity.RetentionDays\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input entity-input-sm\" />\n </td>\n <td>\n <input\n type=\"number\"\n [(ngModel)]=\"entity.BatchSize\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input entity-input-sm\" />\n </td>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"entity.DateField\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\"\n placeholder=\"e.g. CreatedAt\" />\n </td>\n <td>\n <input\n type=\"checkbox\"\n [(ngModel)]=\"entity.IsActive\"\n (ngModelChange)=\"OnEntityChanged(entity)\" />\n </td>\n <td>\n <button\n class=\"btn-icon btn-icon-danger\"\n (click)=\"RemoveEntity(entity)\"\n title=\"Remove entity\"\n aria-label=\"Remove entity\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @if (ConfigEntities.length === 0) {\n <div class=\"entity-empty\">\n <p>No entities configured. Click \"Add Entity\" to add one.</p>\n </div>\n }\n </div>\n\n <!-- Status message -->\n @if (StatusMessage) {\n <div class=\"config-status\" [class.status-success]=\"StatusType === 'success'\" [class.status-error]=\"StatusType === 'error'\">\n @if (StatusType === 'success') {\n <i class=\"fa-solid fa-circle-check\"></i>\n }\n @if (StatusType === 'error') {\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n }\n {{ StatusMessage }}\n </div>\n }\n\n <!-- Action bar (Save on LEFT per MJ convention) -->\n <div class=\"detail-actions\">\n <button\n class=\"btn btn-primary\"\n [disabled]=\"IsSaving\"\n (click)=\"Save()\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save\n }\n </button>\n <button class=\"btn btn-secondary\" [disabled]=\"IsSaving\" (click)=\"Cancel()\">\n Cancel\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n</div>\n", styles: [".config-admin {\n height: 100%;\n display: flex;\n flex-direction: column;\n}\n\n/* Loading */\n.config-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 60px;\n}\n\n/* Layout: 35% / 65% split */\n.config-layout {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n/* Left panel: Config list */\n.config-list-panel {\n width: 35%;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.config-list-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n\n h2 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n}\n\n.config-card-list {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* Config card */\n.config-card {\n padding: 12px 14px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n cursor: pointer;\n transition: border-color 0.15s ease, background 0.15s ease;\n\n &:hover {\n border-color: var(--mj-border-default);\n background: var(--mj-bg-surface-hover);\n }\n\n &:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n }\n\n &.selected {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, var(--mj-bg-surface));\n }\n}\n\n.config-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 6px;\n}\n\n.config-card-name {\n font-weight: 600;\n font-size: 0.9rem;\n color: var(--mj-text-primary);\n}\n\n.config-status-badge {\n font-size: 0.7rem;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n}\n\n.status-active {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-inactive {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.config-card-meta {\n display: flex;\n gap: 14px;\n font-size: 0.78rem;\n color: var(--mj-text-secondary);\n\n i {\n margin-right: 4px;\n }\n}\n\n.config-card-date {\n margin-top: 6px;\n font-size: 0.73rem;\n color: var(--mj-text-muted);\n\n i {\n margin-right: 4px;\n }\n}\n\n.config-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n color: var(--mj-text-muted);\n text-align: center;\n\n i {\n font-size: 2rem;\n margin-bottom: 12px;\n }\n\n p {\n margin: 0;\n font-size: 0.85rem;\n }\n}\n\n/* Right panel: Detail */\n.config-detail-panel {\n width: 65%;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n}\n\n.config-detail-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n color: var(--mj-text-muted);\n\n i {\n font-size: 1.5rem;\n margin-bottom: 8px;\n }\n\n p {\n margin: 0;\n font-size: 0.85rem;\n }\n}\n\n.config-detail-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px;\n}\n\n.config-detail-content {\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n/* Detail sections */\n.detail-section {\n h3 {\n margin: 0 0 12px;\n font-size: 0.9rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-subtle);\n\n i {\n color: var(--mj-brand-primary);\n }\n }\n}\n\n.detail-section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n\n h3 {\n margin-bottom: 0;\n padding-bottom: 0;\n border-bottom: none;\n }\n}\n\n.detail-row {\n display: flex;\n gap: 16px;\n margin-bottom: 10px;\n\n .detail-field {\n flex: 1;\n }\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-bottom: 10px;\n\n label {\n font-size: 0.78rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.03em;\n }\n}\n\n.detail-input {\n padding: 7px 10px;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n outline: none;\n transition: border-color 0.15s ease;\n\n &:focus {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n }\n}\n\n.detail-textarea {\n resize: vertical;\n font-family: inherit;\n}\n\n.detail-checkbox {\n display: flex;\n align-items: center;\n padding-top: 2px;\n\n input[type=\"checkbox\"] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n position: relative;\n\n &:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n\n &::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 6px;\n height: 10px;\n border: solid var(--mj-text-inverse, white);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n }\n\n &:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n }\n }\n}\n\n/* Entity table */\n.entity-table-wrapper {\n overflow-x: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n}\n\n.entity-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.82rem;\n\n th {\n padding: 8px 10px;\n text-align: left;\n font-weight: 600;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: middle;\n }\n\n tr:last-child td {\n border-bottom: none;\n }\n}\n\n.entity-input {\n width: 100%;\n padding: 4px 6px;\n font-size: 0.82rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 3px;\n outline: none;\n\n &:focus {\n border-color: var(--mj-border-focus);\n }\n}\n\n.entity-input-sm {\n width: 70px;\n}\n\n/* Checkbox styling within entity table */\n.entity-table td input[type=\"checkbox\"] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.15s ease;\n position: relative;\n\n &:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n\n &::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 6px;\n height: 10px;\n border: solid var(--mj-text-inverse, white);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n }\n\n &:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: 2px;\n }\n}\n\n.entity-empty {\n text-align: center;\n padding: 20px;\n color: var(--mj-text-muted);\n font-size: 0.85rem;\n border: 1px dashed var(--mj-border-default);\n border-radius: 6px;\n\n p {\n margin: 0;\n }\n}\n\n/* Status message */\n.config-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 6px;\n font-size: 0.85rem;\n\n i {\n font-size: 1rem;\n }\n}\n\n.status-success {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n/* Action bar */\n.detail-actions {\n display: flex;\n gap: 10px;\n padding-top: 10px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n/* Buttons */\n.btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n font-size: 0.85rem;\n font-weight: 500;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: background 0.15s ease, opacity 0.15s ease;\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n}\n\n.btn-sm {\n padding: 5px 10px;\n font-size: 0.78rem;\n}\n\n.btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n\n &:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n }\n\n &:active:not(:disabled) {\n background: var(--mj-brand-primary-active);\n }\n}\n\n.btn-secondary {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n border: 1px solid var(--mj-border-default);\n\n &:hover:not(:disabled) {\n background: var(--mj-bg-surface-active);\n }\n}\n\n.btn-outline {\n background: transparent;\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-brand-primary);\n\n &:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n }\n}\n\n.btn-icon {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px 6px;\n border-radius: 4px;\n transition: color 0.15s ease, background 0.15s ease;\n}\n\n.btn-icon-danger {\n color: var(--mj-text-muted);\n\n &:hover {\n color: var(--mj-status-error);\n background: var(--mj-status-error-bg);\n }\n}\n"] }]
733
734
  }], null, null); })();
734
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArchiveConfigAdminComponent, { className: "ArchiveConfigAdminComponent", filePath: "src/lib/archive-config/archive-config-admin.component.ts", lineNumber: 65 }); })();
735
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArchiveConfigAdminComponent, { className: "ArchiveConfigAdminComponent", filePath: "src/lib/archive-config/archive-config-admin.component.ts", lineNumber: 66 }); })();
735
736
  //# sourceMappingURL=archive-config-admin.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"archive-config-admin.component.js","sourceRoot":"","sources":["../../../src/lib/archive-config/archive-config-admin.component.ts","../../../src/lib/archive-config/archive-config-admin.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 { CompositeKey, Metadata, RunView } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n MJArchiveConfigurationEntity,\n MJArchiveConfigurationEntityEntity,\n MJArchiveConfigurationEntityType,\n MJArchiveConfigurationEntityEntityType,\n} from '@memberjunction/core-entities';\n\ntype ArchiveStatus = MJArchiveConfigurationEntityType['Status'];\ntype ArchiveMode = MJArchiveConfigurationEntityType['DefaultMode'];\ntype EntityMode = MJArchiveConfigurationEntityEntityType['Mode'];\n\n/** Represents an archive configuration record */\nexport interface ArchiveConfig {\n ID: string;\n Name: string;\n Description: string;\n Status: ArchiveStatus;\n StorageAccountID: string;\n StorageAccountName: string;\n RootPath: string;\n DefaultRetentionDays: number;\n DefaultBatchSize: number;\n DefaultMode: ArchiveMode;\n ArchiveRelatedRecordChanges: boolean;\n IsDirty: boolean;\n}\n\n/** Represents an entity within a configuration */\nexport interface ArchiveConfigEntity {\n ID: string;\n ArchiveConfigurationID: string;\n EntityName: string;\n Mode: EntityMode;\n RetentionDays: number;\n BatchSize: number;\n DateField: string;\n IsActive: boolean;\n IsNew: boolean;\n IsDirty: boolean;\n}\n\n/** Storage account option for the dropdown */\nexport interface StorageAccountOption {\n ID: string;\n Name: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-archive-config-admin',\n templateUrl: './archive-config-admin.component.html',\n styleUrls: ['./archive-config-admin.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ArchiveConfigAdminComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n /** All configurations */\n Configs: ArchiveConfig[] = [];\n\n /** Currently selected configuration */\n SelectedConfig: ArchiveConfig | null = null;\n\n /** Entities for the selected configuration */\n ConfigEntities: ArchiveConfigEntity[] = [];\n\n /** Available storage accounts for dropdown */\n StorageAccounts: StorageAccountOption[] = [];\n\n /** Available archive modes */\n ArchiveModes: string[] = ['StripFields', 'SoftDelete', 'HardDelete', 'ArchiveOnly'];\n\n /** Whether the list is loading */\n IsLoading = true;\n\n /** Whether the detail panel is loading */\n IsDetailLoading = false;\n\n /** Whether a save operation is in progress */\n IsSaving = false;\n\n /** Status message for feedback */\n StatusMessage = '';\n\n /** Status type for styling */\n StatusType: 'success' | 'error' | '' = '';\n\n private destroyed = false;\n\n ngOnInit(): void {\n this.loadAllData();\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n }\n\n /** Select a configuration and load its entities */\n async SelectConfig(config: ArchiveConfig): Promise<void> {\n this.SelectedConfig = { ...config };\n this.clearStatus();\n await this.loadConfigEntities(config.ID);\n }\n\n /** Check if a config is the currently selected one */\n IsSelectedConfig(config: ArchiveConfig): boolean {\n return UUIDsEqual(this.SelectedConfig?.ID, config.ID);\n }\n\n /** Add a new empty entity row */\n AddEntity(): void {\n if (!this.SelectedConfig) return;\n\n const newEntity: ArchiveConfigEntity = {\n ID: `new-${Date.now()}`,\n ArchiveConfigurationID: this.SelectedConfig.ID,\n EntityName: '',\n Mode: this.SelectedConfig.DefaultMode ?? 'StripFields',\n RetentionDays: this.SelectedConfig.DefaultRetentionDays || 365,\n BatchSize: this.SelectedConfig.DefaultBatchSize || 100,\n DateField: '__mj_CreatedAt',\n IsActive: true,\n IsNew: true,\n IsDirty: true,\n };\n this.ConfigEntities = [...this.ConfigEntities, newEntity];\n this.cdr.markForCheck();\n }\n\n /** Remove an entity row */\n RemoveEntity(entity: ArchiveConfigEntity): void {\n this.ConfigEntities = this.ConfigEntities.filter((e) => !UUIDsEqual(e.ID, entity.ID));\n this.cdr.markForCheck();\n }\n\n /** Mark an entity as dirty when edited */\n OnEntityChanged(entity: ArchiveConfigEntity): void {\n entity.IsDirty = true;\n this.cdr.markForCheck();\n }\n\n /** Mark the selected config as dirty */\n OnConfigFieldChanged(): void {\n if (this.SelectedConfig) {\n this.SelectedConfig.IsDirty = true;\n this.cdr.markForCheck();\n }\n }\n\n /** Save the selected configuration and its entities */\n async Save(): Promise<void> {\n if (!this.SelectedConfig) return;\n\n this.IsSaving = true;\n this.clearStatus();\n this.cdr.markForCheck();\n\n try {\n await this.saveConfiguration();\n await this.saveConfigEntities();\n this.setStatus('Configuration saved successfully.', 'success');\n await this.refreshConfigList();\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Save failed. Please try again.';\n this.setStatus(message, 'error');\n } finally {\n this.IsSaving = false;\n this.markForCheckIfAlive();\n }\n }\n\n /** Cancel changes and reload the selected config */\n async Cancel(): Promise<void> {\n if (!this.SelectedConfig) return;\n\n const configId = this.SelectedConfig.ID;\n this.clearStatus();\n\n const original = this.Configs.find((c) => UUIDsEqual(c.ID, configId));\n if (original) {\n this.SelectedConfig = { ...original };\n await this.loadConfigEntities(configId);\n }\n }\n\n /** Add a new configuration */\n AddConfiguration(): void {\n const newConfig: ArchiveConfig = {\n ID: `new-${Date.now()}`,\n Name: 'New Configuration',\n Description: '',\n Status: 'Disabled',\n StorageAccountID: '',\n StorageAccountName: '',\n RootPath: '/archives',\n DefaultRetentionDays: 365,\n DefaultBatchSize: 100,\n DefaultMode: 'StripFields',\n ArchiveRelatedRecordChanges: false,\n IsDirty: true,\n };\n this.Configs = [newConfig, ...this.Configs];\n this.SelectConfig(newConfig);\n }\n\n /** Get a display label for the status */\n GetStatusLabel(status: string | undefined): string {\n switch (status) {\n case 'Idle': return 'Idle';\n case 'Running': return 'Running';\n case 'Error': return 'Error';\n default: return 'Disabled';\n }\n }\n\n /** Load all initial data using batched RunViews */\n private async loadAllData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const [configResult, storageResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Archive Configurations',\n ExtraFilter: '',\n OrderBy: 'Name',\n ResultType: 'simple',\n },\n {\n EntityName: 'MJ: File Storage Accounts',\n ExtraFilter: '',\n OrderBy: 'Name',\n ResultType: 'simple',\n Fields: ['ID', 'Name'],\n },\n ]);\n\n this.Configs = this.mapConfigRecords(configResult);\n this.StorageAccounts = this.mapStorageAccounts(storageResult);\n\n if (this.Configs.length > 0) {\n await this.SelectConfig(this.Configs[0]);\n }\n } catch {\n this.setStatus('Failed to load configurations.', 'error');\n } finally {\n this.IsLoading = false;\n this.markForCheckIfAlive();\n }\n }\n\n /** Map raw config records to typed objects */\n private mapConfigRecords(result: { Success: boolean; Results: Record<string, unknown>[] }): ArchiveConfig[] {\n if (!result.Success) return [];\n return result.Results.map((r) => ({\n ID: String(r['ID'] ?? ''),\n Name: String(r['Name'] ?? ''),\n Description: String(r['Description'] ?? ''),\n Status: (r['Status'] as ArchiveStatus) ?? 'Disabled',\n StorageAccountID: String(r['StorageAccountID'] ?? ''),\n StorageAccountName: String(r['StorageAccount'] ?? ''),\n RootPath: String(r['RootPath'] ?? ''),\n DefaultRetentionDays: Number(r['DefaultRetentionDays'] ?? 365),\n DefaultBatchSize: Number(r['DefaultBatchSize'] ?? 100),\n DefaultMode: (r['DefaultMode'] as ArchiveMode) ?? 'StripFields',\n ArchiveRelatedRecordChanges: Boolean(r['ArchiveRelatedRecordChanges']),\n IsDirty: false,\n }));\n }\n\n /** Map raw storage account records */\n private mapStorageAccounts(result: { Success: boolean; Results: Record<string, unknown>[] }): StorageAccountOption[] {\n if (!result.Success) return [];\n return result.Results.map((r) => ({\n ID: String(r['ID'] ?? ''),\n Name: String(r['Name'] ?? ''),\n }));\n }\n\n /** Load entities for a specific configuration */\n private async loadConfigEntities(configId: string): Promise<void> {\n this.IsDetailLoading = true;\n this.cdr.markForCheck();\n\n try {\n const rv = new RunView();\n const escapedId = configId.replace(/'/g, \"''\");\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: 'MJ: Archive Configuration Entities',\n ExtraFilter: `ArchiveConfigurationID='${escapedId}'`,\n OrderBy: 'Entity',\n ResultType: 'simple',\n });\n\n this.ConfigEntities = this.mapEntityRecords(result);\n } catch {\n this.ConfigEntities = [];\n } finally {\n this.IsDetailLoading = false;\n this.markForCheckIfAlive();\n }\n }\n\n /** Map raw entity records to typed objects */\n private mapEntityRecords(result: { Success: boolean; Results: Record<string, unknown>[] }): ArchiveConfigEntity[] {\n if (!result.Success) return [];\n return result.Results.map((r) => ({\n ID: String(r['ID'] ?? ''),\n ArchiveConfigurationID: String(r['ArchiveConfigurationID'] ?? ''),\n EntityName: String(r['Entity'] ?? ''),\n Mode: (r['Mode'] as EntityMode) ?? 'StripFields',\n RetentionDays: Number(r['RetentionDays'] ?? 365),\n BatchSize: Number(r['BatchSize'] ?? 100),\n DateField: String(r['DateField'] ?? '__mj_CreatedAt'),\n IsActive: Boolean(r['IsActive']),\n IsNew: false,\n IsDirty: false,\n }));\n }\n\n /** Save the configuration record using strongly-typed entity */\n private async saveConfiguration(): Promise<void> {\n if (!this.SelectedConfig?.IsDirty) return;\n\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJArchiveConfigurationEntity>('MJ: Archive Configurations');\n\n if (!this.SelectedConfig.ID.startsWith('new-')) {\n await entity.InnerLoad(CompositeKey.FromKeyValuePair('ID', this.SelectedConfig.ID));\n } else {\n entity.NewRecord();\n }\n\n entity.Name = this.SelectedConfig.Name;\n entity.Description = this.SelectedConfig.Description;\n entity.Status = this.SelectedConfig.Status ?? 'Disabled';\n if (this.SelectedConfig.StorageAccountID) {\n entity.StorageAccountID = this.SelectedConfig.StorageAccountID;\n }\n entity.RootPath = this.SelectedConfig.RootPath;\n entity.DefaultRetentionDays = this.SelectedConfig.DefaultRetentionDays;\n entity.DefaultBatchSize = this.SelectedConfig.DefaultBatchSize;\n entity.DefaultMode = this.SelectedConfig.DefaultMode ?? 'StripFields';\n entity.ArchiveRelatedRecordChanges = this.SelectedConfig.ArchiveRelatedRecordChanges;\n\n const saved = await entity.Save();\n if (!saved) {\n throw new Error('Failed to save configuration.');\n }\n\n // Update the ID if this was a new record\n if (this.SelectedConfig.ID.startsWith('new-')) {\n this.SelectedConfig.ID = entity.ID;\n }\n this.SelectedConfig.IsDirty = false;\n }\n\n /** Save all dirty/new entity records */\n private async saveConfigEntities(): Promise<void> {\n const dirtyEntities = this.ConfigEntities.filter((e) => e.IsDirty);\n for (const configEntity of dirtyEntities) {\n await this.saveConfigEntity(configEntity);\n }\n }\n\n /** Save a single config entity record using strongly-typed entity */\n private async saveConfigEntity(configEntity: ArchiveConfigEntity): Promise<void> {\n const md = new Metadata();\n const entity = await md.GetEntityObject<MJArchiveConfigurationEntityEntity>('MJ: Archive Configuration Entities');\n\n if (!configEntity.IsNew) {\n await entity.InnerLoad(CompositeKey.FromKeyValuePair('ID', configEntity.ID));\n } else {\n entity.NewRecord();\n }\n\n entity.ArchiveConfigurationID = configEntity.ArchiveConfigurationID;\n entity.Mode = configEntity.Mode ?? null;\n entity.RetentionDays = configEntity.RetentionDays;\n entity.BatchSize = configEntity.BatchSize;\n entity.DateField = configEntity.DateField;\n entity.IsActive = configEntity.IsActive;\n\n const saved = await entity.Save();\n if (!saved) {\n throw new Error(`Failed to save entity \"${configEntity.EntityName}\".`);\n }\n\n configEntity.IsDirty = false;\n configEntity.IsNew = false;\n }\n\n /** Refresh the config list after a save */\n private async refreshConfigList(): Promise<void> {\n const rv = new RunView();\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: 'MJ: Archive Configurations',\n ExtraFilter: '',\n OrderBy: 'Name',\n ResultType: 'simple',\n });\n this.Configs = this.mapConfigRecords(result);\n }\n\n /** Set a status message */\n private setStatus(message: string, type: 'success' | 'error'): void {\n this.StatusMessage = message;\n this.StatusType = type;\n }\n\n /** Clear status message */\n private clearStatus(): void {\n this.StatusMessage = '';\n this.StatusType = '';\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","<div class=\"config-admin\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configurations...\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n <div class=\"config-layout\">\n <!-- Left panel: Config list -->\n <div class=\"config-list-panel\">\n <div class=\"config-list-header\">\n <h2>Archive Configurations</h2>\n <button class=\"btn btn-primary btn-sm\" (click)=\"AddConfiguration()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Configuration\n </button>\n </div>\n\n <div class=\"config-card-list\">\n @for (config of Configs; track config.ID) {\n <div\n class=\"config-card\"\n [class.selected]=\"IsSelectedConfig(config)\"\n (click)=\"SelectConfig(config)\"\n (keydown.enter)=\"SelectConfig(config)\"\n tabindex=\"0\"\n role=\"button\">\n <div class=\"config-card-header\">\n <span class=\"config-card-name\">{{ config.Name }}</span>\n <span\n class=\"config-status-badge\"\n [class.status-active]=\"config.Status === 'Idle' || config.Status === 'Running'\"\n [class.status-inactive]=\"config.Status === 'Disabled' || config.Status === 'Error'\">\n {{ GetStatusLabel(config.Status) }}\n </span>\n </div>\n <div class=\"config-card-meta\">\n <span><i class=\"fa-solid fa-database\"></i> {{ config.StorageAccountName || 'No storage' }}</span>\n <span><i class=\"fa-solid fa-folder\"></i> {{ config.RootPath }}</span>\n </div>\n <div class=\"config-card-date\">\n <span class=\"config-status-mode\"><i class=\"fa-solid fa-sliders\"></i> {{ config.DefaultMode }}</span>\n </div>\n </div>\n }\n\n @if (Configs.length === 0) {\n <div class=\"config-empty\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No configurations found. Create one to get started.</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Right panel: Detail -->\n <div class=\"config-detail-panel\">\n @if (!SelectedConfig) {\n <div class=\"config-detail-placeholder\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a configuration to view details</p>\n </div>\n }\n\n @if (SelectedConfig) {\n @if (IsDetailLoading) {\n <div class=\"config-detail-loading\">\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n </div>\n }\n\n @if (!IsDetailLoading) {\n <div class=\"config-detail-content\">\n <!-- Header section -->\n <div class=\"detail-section\">\n <div class=\"detail-field\">\n <label for=\"config-name\">Name</label>\n <input\n id=\"config-name\"\n type=\"text\"\n [(ngModel)]=\"SelectedConfig.Name\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n <div class=\"detail-field\">\n <label>Active</label>\n <div class=\"detail-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"SelectedConfig.Status === 'Idle'\"\n (change)=\"SelectedConfig.Status = SelectedConfig.Status === 'Idle' ? 'Disabled' : 'Idle'; OnConfigFieldChanged()\" />\n </div>\n </div>\n <div class=\"detail-field\">\n <label for=\"config-desc\">Description</label>\n <textarea\n id=\"config-desc\"\n [(ngModel)]=\"SelectedConfig.Description\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input detail-textarea\"\n rows=\"2\"></textarea>\n </div>\n </div>\n\n <!-- Storage section -->\n <div class=\"detail-section\">\n <h3><i class=\"fa-solid fa-hard-drive\"></i> Storage</h3>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-storage\">Storage Account</label>\n <select\n id=\"config-storage\"\n [(ngModel)]=\"SelectedConfig.StorageAccountID\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\">\n <option value=\"\">-- Select --</option>\n @for (account of StorageAccounts; track account.ID) {\n <option [value]=\"account.ID\">{{ account.Name }}</option>\n }\n </select>\n </div>\n <div class=\"detail-field\">\n <label for=\"config-path\">Root Path</label>\n <input\n id=\"config-path\"\n type=\"text\"\n [(ngModel)]=\"SelectedConfig.RootPath\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n </div>\n </div>\n\n <!-- Defaults section -->\n <div class=\"detail-section\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Defaults</h3>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-retention\">Retention Days</label>\n <input\n id=\"config-retention\"\n type=\"number\"\n [(ngModel)]=\"SelectedConfig.DefaultRetentionDays\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n <div class=\"detail-field\">\n <label for=\"config-batch\">Batch Size</label>\n <input\n id=\"config-batch\"\n type=\"number\"\n [(ngModel)]=\"SelectedConfig.DefaultBatchSize\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-mode\">Archive Mode</label>\n <select\n id=\"config-mode\"\n [(ngModel)]=\"SelectedConfig.DefaultMode\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\">\n @for (mode of ArchiveModes; track mode) {\n <option [value]=\"mode\">{{ mode }}</option>\n }\n </select>\n </div>\n <div class=\"detail-field\">\n <label>Archive Record Changes</label>\n <div class=\"detail-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"SelectedConfig.ArchiveRelatedRecordChanges\"\n (ngModelChange)=\"OnConfigFieldChanged()\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- Entities section -->\n <div class=\"detail-section\">\n <div class=\"detail-section-header\">\n <h3><i class=\"fa-solid fa-table\"></i> Entities</h3>\n <button class=\"btn btn-sm btn-outline\" (click)=\"AddEntity()\">\n <i class=\"fa-solid fa-plus\"></i> Add Entity\n </button>\n </div>\n\n @if (ConfigEntities.length > 0) {\n <div class=\"entity-table-wrapper\">\n <table class=\"entity-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Mode</th>\n <th>Retention</th>\n <th>Batch</th>\n <th>Date Field</th>\n <th>Active</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (entity of ConfigEntities; track entity.ID) {\n <tr>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"entity.EntityName\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\"\n placeholder=\"Entity name\" />\n </td>\n <td>\n <select\n [(ngModel)]=\"entity.Mode\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\">\n @for (mode of ArchiveModes; track mode) {\n <option [value]=\"mode\">{{ mode }}</option>\n }\n </select>\n </td>\n <td>\n <input\n type=\"number\"\n [(ngModel)]=\"entity.RetentionDays\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input entity-input-sm\" />\n </td>\n <td>\n <input\n type=\"number\"\n [(ngModel)]=\"entity.BatchSize\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input entity-input-sm\" />\n </td>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"entity.DateField\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\"\n placeholder=\"e.g. CreatedAt\" />\n </td>\n <td>\n <input\n type=\"checkbox\"\n [(ngModel)]=\"entity.IsActive\"\n (ngModelChange)=\"OnEntityChanged(entity)\" />\n </td>\n <td>\n <button\n class=\"btn-icon btn-icon-danger\"\n (click)=\"RemoveEntity(entity)\"\n title=\"Remove entity\"\n aria-label=\"Remove entity\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @if (ConfigEntities.length === 0) {\n <div class=\"entity-empty\">\n <p>No entities configured. Click \"Add Entity\" to add one.</p>\n </div>\n }\n </div>\n\n <!-- Status message -->\n @if (StatusMessage) {\n <div class=\"config-status\" [class.status-success]=\"StatusType === 'success'\" [class.status-error]=\"StatusType === 'error'\">\n @if (StatusType === 'success') {\n <i class=\"fa-solid fa-circle-check\"></i>\n }\n @if (StatusType === 'error') {\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n }\n {{ StatusMessage }}\n </div>\n }\n\n <!-- Action bar (Save on LEFT per MJ convention) -->\n <div class=\"detail-actions\">\n <button\n class=\"btn btn-primary\"\n [disabled]=\"IsSaving\"\n (click)=\"Save()\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save\n }\n </button>\n <button class=\"btn btn-secondary\" [disabled]=\"IsSaving\" (click)=\"Cancel()\">\n Cancel\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n</div>\n"]}
1
+ {"version":3,"file":"archive-config-admin.component.js","sourceRoot":"","sources":["../../../src/lib/archive-config/archive-config-admin.component.ts","../../../src/lib/archive-config/archive-config-admin.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 { CompositeKey, RunView } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport {\n MJArchiveConfigurationEntity,\n MJArchiveConfigurationEntityEntity,\n MJArchiveConfigurationEntityType,\n MJArchiveConfigurationEntityEntityType,\n} from '@memberjunction/core-entities';\n\ntype ArchiveStatus = MJArchiveConfigurationEntityType['Status'];\ntype ArchiveMode = MJArchiveConfigurationEntityType['DefaultMode'];\ntype EntityMode = MJArchiveConfigurationEntityEntityType['Mode'];\n\n/** Represents an archive configuration record */\nexport interface ArchiveConfig {\n ID: string;\n Name: string;\n Description: string;\n Status: ArchiveStatus;\n StorageAccountID: string;\n StorageAccountName: string;\n RootPath: string;\n DefaultRetentionDays: number;\n DefaultBatchSize: number;\n DefaultMode: ArchiveMode;\n ArchiveRelatedRecordChanges: boolean;\n IsDirty: boolean;\n}\n\n/** Represents an entity within a configuration */\nexport interface ArchiveConfigEntity {\n ID: string;\n ArchiveConfigurationID: string;\n EntityName: string;\n Mode: EntityMode;\n RetentionDays: number;\n BatchSize: number;\n DateField: string;\n IsActive: boolean;\n IsNew: boolean;\n IsDirty: boolean;\n}\n\n/** Storage account option for the dropdown */\nexport interface StorageAccountOption {\n ID: string;\n Name: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-archive-config-admin',\n templateUrl: './archive-config-admin.component.html',\n styleUrls: ['./archive-config-admin.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ArchiveConfigAdminComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n /** All configurations */\n Configs: ArchiveConfig[] = [];\n\n /** Currently selected configuration */\n SelectedConfig: ArchiveConfig | null = null;\n\n /** Entities for the selected configuration */\n ConfigEntities: ArchiveConfigEntity[] = [];\n\n /** Available storage accounts for dropdown */\n StorageAccounts: StorageAccountOption[] = [];\n\n /** Available archive modes */\n ArchiveModes: string[] = ['StripFields', 'SoftDelete', 'HardDelete', 'ArchiveOnly'];\n\n /** Whether the list is loading */\n IsLoading = true;\n\n /** Whether the detail panel is loading */\n IsDetailLoading = false;\n\n /** Whether a save operation is in progress */\n IsSaving = false;\n\n /** Status message for feedback */\n StatusMessage = '';\n\n /** Status type for styling */\n StatusType: 'success' | 'error' | '' = '';\n\n private destroyed = false;\n\n ngOnInit(): void {\n this.loadAllData();\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n }\n\n /** Select a configuration and load its entities */\n async SelectConfig(config: ArchiveConfig): Promise<void> {\n this.SelectedConfig = { ...config };\n this.clearStatus();\n await this.loadConfigEntities(config.ID);\n }\n\n /** Check if a config is the currently selected one */\n IsSelectedConfig(config: ArchiveConfig): boolean {\n return UUIDsEqual(this.SelectedConfig?.ID, config.ID);\n }\n\n /** Add a new empty entity row */\n AddEntity(): void {\n if (!this.SelectedConfig) return;\n\n const newEntity: ArchiveConfigEntity = {\n ID: `new-${Date.now()}`,\n ArchiveConfigurationID: this.SelectedConfig.ID,\n EntityName: '',\n Mode: this.SelectedConfig.DefaultMode ?? 'StripFields',\n RetentionDays: this.SelectedConfig.DefaultRetentionDays || 365,\n BatchSize: this.SelectedConfig.DefaultBatchSize || 100,\n DateField: '__mj_CreatedAt',\n IsActive: true,\n IsNew: true,\n IsDirty: true,\n };\n this.ConfigEntities = [...this.ConfigEntities, newEntity];\n this.cdr.markForCheck();\n }\n\n /** Remove an entity row */\n RemoveEntity(entity: ArchiveConfigEntity): void {\n this.ConfigEntities = this.ConfigEntities.filter((e) => !UUIDsEqual(e.ID, entity.ID));\n this.cdr.markForCheck();\n }\n\n /** Mark an entity as dirty when edited */\n OnEntityChanged(entity: ArchiveConfigEntity): void {\n entity.IsDirty = true;\n this.cdr.markForCheck();\n }\n\n /** Mark the selected config as dirty */\n OnConfigFieldChanged(): void {\n if (this.SelectedConfig) {\n this.SelectedConfig.IsDirty = true;\n this.cdr.markForCheck();\n }\n }\n\n /** Save the selected configuration and its entities */\n async Save(): Promise<void> {\n if (!this.SelectedConfig) return;\n\n this.IsSaving = true;\n this.clearStatus();\n this.cdr.markForCheck();\n\n try {\n await this.saveConfiguration();\n await this.saveConfigEntities();\n this.setStatus('Configuration saved successfully.', 'success');\n await this.refreshConfigList();\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Save failed. Please try again.';\n this.setStatus(message, 'error');\n } finally {\n this.IsSaving = false;\n this.markForCheckIfAlive();\n }\n }\n\n /** Cancel changes and reload the selected config */\n async Cancel(): Promise<void> {\n if (!this.SelectedConfig) return;\n\n const configId = this.SelectedConfig.ID;\n this.clearStatus();\n\n const original = this.Configs.find((c) => UUIDsEqual(c.ID, configId));\n if (original) {\n this.SelectedConfig = { ...original };\n await this.loadConfigEntities(configId);\n }\n }\n\n /** Add a new configuration */\n AddConfiguration(): void {\n const newConfig: ArchiveConfig = {\n ID: `new-${Date.now()}`,\n Name: 'New Configuration',\n Description: '',\n Status: 'Disabled',\n StorageAccountID: '',\n StorageAccountName: '',\n RootPath: '/archives',\n DefaultRetentionDays: 365,\n DefaultBatchSize: 100,\n DefaultMode: 'StripFields',\n ArchiveRelatedRecordChanges: false,\n IsDirty: true,\n };\n this.Configs = [newConfig, ...this.Configs];\n this.SelectConfig(newConfig);\n }\n\n /** Get a display label for the status */\n GetStatusLabel(status: string | undefined): string {\n switch (status) {\n case 'Idle': return 'Idle';\n case 'Running': return 'Running';\n case 'Error': return 'Error';\n default: return 'Disabled';\n }\n }\n\n /** Load all initial data using batched RunViews */\n private async loadAllData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [configResult, storageResult] = await rv.RunViews([\n {\n EntityName: 'MJ: Archive Configurations',\n ExtraFilter: '',\n OrderBy: 'Name',\n ResultType: 'simple',\n },\n {\n EntityName: 'MJ: File Storage Accounts',\n ExtraFilter: '',\n OrderBy: 'Name',\n ResultType: 'simple',\n Fields: ['ID', 'Name'],\n },\n ]);\n\n this.Configs = this.mapConfigRecords(configResult);\n this.StorageAccounts = this.mapStorageAccounts(storageResult);\n\n if (this.Configs.length > 0) {\n await this.SelectConfig(this.Configs[0]);\n }\n } catch {\n this.setStatus('Failed to load configurations.', 'error');\n } finally {\n this.IsLoading = false;\n this.markForCheckIfAlive();\n }\n }\n\n /** Map raw config records to typed objects */\n private mapConfigRecords(result: { Success: boolean; Results: Record<string, unknown>[] }): ArchiveConfig[] {\n if (!result.Success) return [];\n return result.Results.map((r) => ({\n ID: String(r['ID'] ?? ''),\n Name: String(r['Name'] ?? ''),\n Description: String(r['Description'] ?? ''),\n Status: (r['Status'] as ArchiveStatus) ?? 'Disabled',\n StorageAccountID: String(r['StorageAccountID'] ?? ''),\n StorageAccountName: String(r['StorageAccount'] ?? ''),\n RootPath: String(r['RootPath'] ?? ''),\n DefaultRetentionDays: Number(r['DefaultRetentionDays'] ?? 365),\n DefaultBatchSize: Number(r['DefaultBatchSize'] ?? 100),\n DefaultMode: (r['DefaultMode'] as ArchiveMode) ?? 'StripFields',\n ArchiveRelatedRecordChanges: Boolean(r['ArchiveRelatedRecordChanges']),\n IsDirty: false,\n }));\n }\n\n /** Map raw storage account records */\n private mapStorageAccounts(result: { Success: boolean; Results: Record<string, unknown>[] }): StorageAccountOption[] {\n if (!result.Success) return [];\n return result.Results.map((r) => ({\n ID: String(r['ID'] ?? ''),\n Name: String(r['Name'] ?? ''),\n }));\n }\n\n /** Load entities for a specific configuration */\n private async loadConfigEntities(configId: string): Promise<void> {\n this.IsDetailLoading = true;\n this.cdr.markForCheck();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const escapedId = configId.replace(/'/g, \"''\");\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: 'MJ: Archive Configuration Entities',\n ExtraFilter: `ArchiveConfigurationID='${escapedId}'`,\n OrderBy: 'Entity',\n ResultType: 'simple',\n });\n\n this.ConfigEntities = this.mapEntityRecords(result);\n } catch {\n this.ConfigEntities = [];\n } finally {\n this.IsDetailLoading = false;\n this.markForCheckIfAlive();\n }\n }\n\n /** Map raw entity records to typed objects */\n private mapEntityRecords(result: { Success: boolean; Results: Record<string, unknown>[] }): ArchiveConfigEntity[] {\n if (!result.Success) return [];\n return result.Results.map((r) => ({\n ID: String(r['ID'] ?? ''),\n ArchiveConfigurationID: String(r['ArchiveConfigurationID'] ?? ''),\n EntityName: String(r['Entity'] ?? ''),\n Mode: (r['Mode'] as EntityMode) ?? 'StripFields',\n RetentionDays: Number(r['RetentionDays'] ?? 365),\n BatchSize: Number(r['BatchSize'] ?? 100),\n DateField: String(r['DateField'] ?? '__mj_CreatedAt'),\n IsActive: Boolean(r['IsActive']),\n IsNew: false,\n IsDirty: false,\n }));\n }\n\n /** Save the configuration record using strongly-typed entity */\n private async saveConfiguration(): Promise<void> {\n if (!this.SelectedConfig?.IsDirty) return;\n\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJArchiveConfigurationEntity>('MJ: Archive Configurations', md.CurrentUser);\n\n if (!this.SelectedConfig.ID.startsWith('new-')) {\n await entity.InnerLoad(CompositeKey.FromKeyValuePair('ID', this.SelectedConfig.ID));\n } else {\n entity.NewRecord();\n }\n\n entity.Name = this.SelectedConfig.Name;\n entity.Description = this.SelectedConfig.Description;\n entity.Status = this.SelectedConfig.Status ?? 'Disabled';\n if (this.SelectedConfig.StorageAccountID) {\n entity.StorageAccountID = this.SelectedConfig.StorageAccountID;\n }\n entity.RootPath = this.SelectedConfig.RootPath;\n entity.DefaultRetentionDays = this.SelectedConfig.DefaultRetentionDays;\n entity.DefaultBatchSize = this.SelectedConfig.DefaultBatchSize;\n entity.DefaultMode = this.SelectedConfig.DefaultMode ?? 'StripFields';\n entity.ArchiveRelatedRecordChanges = this.SelectedConfig.ArchiveRelatedRecordChanges;\n\n const saved = await entity.Save();\n if (!saved) {\n throw new Error('Failed to save configuration.');\n }\n\n // Update the ID if this was a new record\n if (this.SelectedConfig.ID.startsWith('new-')) {\n this.SelectedConfig.ID = entity.ID;\n }\n this.SelectedConfig.IsDirty = false;\n }\n\n /** Save all dirty/new entity records */\n private async saveConfigEntities(): Promise<void> {\n const dirtyEntities = this.ConfigEntities.filter((e) => e.IsDirty);\n for (const configEntity of dirtyEntities) {\n await this.saveConfigEntity(configEntity);\n }\n }\n\n /** Save a single config entity record using strongly-typed entity */\n private async saveConfigEntity(configEntity: ArchiveConfigEntity): Promise<void> {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJArchiveConfigurationEntityEntity>('MJ: Archive Configuration Entities', md.CurrentUser);\n\n if (!configEntity.IsNew) {\n await entity.InnerLoad(CompositeKey.FromKeyValuePair('ID', configEntity.ID));\n } else {\n entity.NewRecord();\n }\n\n entity.ArchiveConfigurationID = configEntity.ArchiveConfigurationID;\n entity.Mode = configEntity.Mode ?? null;\n entity.RetentionDays = configEntity.RetentionDays;\n entity.BatchSize = configEntity.BatchSize;\n entity.DateField = configEntity.DateField;\n entity.IsActive = configEntity.IsActive;\n\n const saved = await entity.Save();\n if (!saved) {\n throw new Error(`Failed to save entity \"${configEntity.EntityName}\".`);\n }\n\n configEntity.IsDirty = false;\n configEntity.IsNew = false;\n }\n\n /** Refresh the config list after a save */\n private async refreshConfigList(): Promise<void> {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<Record<string, unknown>>({\n EntityName: 'MJ: Archive Configurations',\n ExtraFilter: '',\n OrderBy: 'Name',\n ResultType: 'simple',\n });\n this.Configs = this.mapConfigRecords(result);\n }\n\n /** Set a status message */\n private setStatus(message: string, type: 'success' | 'error'): void {\n this.StatusMessage = message;\n this.StatusType = type;\n }\n\n /** Clear status message */\n private clearStatus(): void {\n this.StatusMessage = '';\n this.StatusType = '';\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","<div class=\"config-admin\">\n <!-- Loading state -->\n @if (IsLoading) {\n <div class=\"config-loading\">\n <mj-loading text=\"Loading configurations...\"></mj-loading>\n </div>\n }\n\n @if (!IsLoading) {\n <div class=\"config-layout\">\n <!-- Left panel: Config list -->\n <div class=\"config-list-panel\">\n <div class=\"config-list-header\">\n <h2>Archive Configurations</h2>\n <button class=\"btn btn-primary btn-sm\" (click)=\"AddConfiguration()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Configuration\n </button>\n </div>\n\n <div class=\"config-card-list\">\n @for (config of Configs; track config.ID) {\n <div\n class=\"config-card\"\n [class.selected]=\"IsSelectedConfig(config)\"\n (click)=\"SelectConfig(config)\"\n (keydown.enter)=\"SelectConfig(config)\"\n tabindex=\"0\"\n role=\"button\">\n <div class=\"config-card-header\">\n <span class=\"config-card-name\">{{ config.Name }}</span>\n <span\n class=\"config-status-badge\"\n [class.status-active]=\"config.Status === 'Idle' || config.Status === 'Running'\"\n [class.status-inactive]=\"config.Status === 'Disabled' || config.Status === 'Error'\">\n {{ GetStatusLabel(config.Status) }}\n </span>\n </div>\n <div class=\"config-card-meta\">\n <span><i class=\"fa-solid fa-database\"></i> {{ config.StorageAccountName || 'No storage' }}</span>\n <span><i class=\"fa-solid fa-folder\"></i> {{ config.RootPath }}</span>\n </div>\n <div class=\"config-card-date\">\n <span class=\"config-status-mode\"><i class=\"fa-solid fa-sliders\"></i> {{ config.DefaultMode }}</span>\n </div>\n </div>\n }\n\n @if (Configs.length === 0) {\n <div class=\"config-empty\">\n <i class=\"fa-solid fa-folder-open\"></i>\n <p>No configurations found. Create one to get started.</p>\n </div>\n }\n </div>\n </div>\n\n <!-- Right panel: Detail -->\n <div class=\"config-detail-panel\">\n @if (!SelectedConfig) {\n <div class=\"config-detail-placeholder\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a configuration to view details</p>\n </div>\n }\n\n @if (SelectedConfig) {\n @if (IsDetailLoading) {\n <div class=\"config-detail-loading\">\n <mj-loading text=\"Loading details...\" size=\"small\"></mj-loading>\n </div>\n }\n\n @if (!IsDetailLoading) {\n <div class=\"config-detail-content\">\n <!-- Header section -->\n <div class=\"detail-section\">\n <div class=\"detail-field\">\n <label for=\"config-name\">Name</label>\n <input\n id=\"config-name\"\n type=\"text\"\n [(ngModel)]=\"SelectedConfig.Name\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n <div class=\"detail-field\">\n <label>Active</label>\n <div class=\"detail-checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"SelectedConfig.Status === 'Idle'\"\n (change)=\"SelectedConfig.Status = SelectedConfig.Status === 'Idle' ? 'Disabled' : 'Idle'; OnConfigFieldChanged()\" />\n </div>\n </div>\n <div class=\"detail-field\">\n <label for=\"config-desc\">Description</label>\n <textarea\n id=\"config-desc\"\n [(ngModel)]=\"SelectedConfig.Description\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input detail-textarea\"\n rows=\"2\"></textarea>\n </div>\n </div>\n\n <!-- Storage section -->\n <div class=\"detail-section\">\n <h3><i class=\"fa-solid fa-hard-drive\"></i> Storage</h3>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-storage\">Storage Account</label>\n <select\n id=\"config-storage\"\n [(ngModel)]=\"SelectedConfig.StorageAccountID\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\">\n <option value=\"\">-- Select --</option>\n @for (account of StorageAccounts; track account.ID) {\n <option [value]=\"account.ID\">{{ account.Name }}</option>\n }\n </select>\n </div>\n <div class=\"detail-field\">\n <label for=\"config-path\">Root Path</label>\n <input\n id=\"config-path\"\n type=\"text\"\n [(ngModel)]=\"SelectedConfig.RootPath\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n </div>\n </div>\n\n <!-- Defaults section -->\n <div class=\"detail-section\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Defaults</h3>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-retention\">Retention Days</label>\n <input\n id=\"config-retention\"\n type=\"number\"\n [(ngModel)]=\"SelectedConfig.DefaultRetentionDays\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n <div class=\"detail-field\">\n <label for=\"config-batch\">Batch Size</label>\n <input\n id=\"config-batch\"\n type=\"number\"\n [(ngModel)]=\"SelectedConfig.DefaultBatchSize\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\" />\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"detail-field\">\n <label for=\"config-mode\">Archive Mode</label>\n <select\n id=\"config-mode\"\n [(ngModel)]=\"SelectedConfig.DefaultMode\"\n (ngModelChange)=\"OnConfigFieldChanged()\"\n class=\"detail-input\">\n @for (mode of ArchiveModes; track mode) {\n <option [value]=\"mode\">{{ mode }}</option>\n }\n </select>\n </div>\n <div class=\"detail-field\">\n <label>Archive Record Changes</label>\n <div class=\"detail-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"SelectedConfig.ArchiveRelatedRecordChanges\"\n (ngModelChange)=\"OnConfigFieldChanged()\" />\n </div>\n </div>\n </div>\n </div>\n\n <!-- Entities section -->\n <div class=\"detail-section\">\n <div class=\"detail-section-header\">\n <h3><i class=\"fa-solid fa-table\"></i> Entities</h3>\n <button class=\"btn btn-sm btn-outline\" (click)=\"AddEntity()\">\n <i class=\"fa-solid fa-plus\"></i> Add Entity\n </button>\n </div>\n\n @if (ConfigEntities.length > 0) {\n <div class=\"entity-table-wrapper\">\n <table class=\"entity-table\">\n <thead>\n <tr>\n <th>Entity</th>\n <th>Mode</th>\n <th>Retention</th>\n <th>Batch</th>\n <th>Date Field</th>\n <th>Active</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (entity of ConfigEntities; track entity.ID) {\n <tr>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"entity.EntityName\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\"\n placeholder=\"Entity name\" />\n </td>\n <td>\n <select\n [(ngModel)]=\"entity.Mode\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\">\n @for (mode of ArchiveModes; track mode) {\n <option [value]=\"mode\">{{ mode }}</option>\n }\n </select>\n </td>\n <td>\n <input\n type=\"number\"\n [(ngModel)]=\"entity.RetentionDays\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input entity-input-sm\" />\n </td>\n <td>\n <input\n type=\"number\"\n [(ngModel)]=\"entity.BatchSize\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input entity-input-sm\" />\n </td>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"entity.DateField\"\n (ngModelChange)=\"OnEntityChanged(entity)\"\n class=\"entity-input\"\n placeholder=\"e.g. CreatedAt\" />\n </td>\n <td>\n <input\n type=\"checkbox\"\n [(ngModel)]=\"entity.IsActive\"\n (ngModelChange)=\"OnEntityChanged(entity)\" />\n </td>\n <td>\n <button\n class=\"btn-icon btn-icon-danger\"\n (click)=\"RemoveEntity(entity)\"\n title=\"Remove entity\"\n aria-label=\"Remove entity\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n\n @if (ConfigEntities.length === 0) {\n <div class=\"entity-empty\">\n <p>No entities configured. Click \"Add Entity\" to add one.</p>\n </div>\n }\n </div>\n\n <!-- Status message -->\n @if (StatusMessage) {\n <div class=\"config-status\" [class.status-success]=\"StatusType === 'success'\" [class.status-error]=\"StatusType === 'error'\">\n @if (StatusType === 'success') {\n <i class=\"fa-solid fa-circle-check\"></i>\n }\n @if (StatusType === 'error') {\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n }\n {{ StatusMessage }}\n </div>\n }\n\n <!-- Action bar (Save on LEFT per MJ convention) -->\n <div class=\"detail-actions\">\n <button\n class=\"btn btn-primary\"\n [disabled]=\"IsSaving\"\n (click)=\"Save()\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n <i class=\"fa-solid fa-floppy-disk\"></i> Save\n }\n </button>\n <button class=\"btn btn-secondary\" [disabled]=\"IsSaving\" (click)=\"Cancel()\">\n Cancel\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n }\n</div>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-archive-manager",
3
- "version": "5.30.0",
3
+ "version": "5.31.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",
@@ -32,10 +32,11 @@
32
32
  "rxjs": "^7.8.2"
33
33
  },
34
34
  "dependencies": {
35
- "@memberjunction/core": "5.30.0",
36
- "@memberjunction/core-entities": "5.30.0",
37
- "@memberjunction/global": "5.30.0",
38
- "@memberjunction/ng-shared-generic": "5.30.0",
35
+ "@memberjunction/core": "5.31.0",
36
+ "@memberjunction/ng-base-types": "5.31.0",
37
+ "@memberjunction/core-entities": "5.31.0",
38
+ "@memberjunction/global": "5.31.0",
39
+ "@memberjunction/ng-shared-generic": "5.31.0",
39
40
  "tslib": "^2.8.1"
40
41
  },
41
42
  "sideEffects": false,