@memberjunction/ng-record-process-studio 6.2.0-edge.0 → 6.2.0-edge.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.d.ts +211 -11
  2. package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.d.ts.map +1 -1
  3. package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.js +1639 -400
  4. package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.js.map +1 -1
  5. package/dist/lib/record-process-editor/record-process-editor.component.d.ts +10 -0
  6. package/dist/lib/record-process-editor/record-process-editor.component.d.ts.map +1 -1
  7. package/dist/lib/record-process-editor/record-process-editor.component.js +25 -5
  8. package/dist/lib/record-process-editor/record-process-editor.component.js.map +1 -1
  9. package/dist/lib/record-process-history/record-process-history.component.d.ts +10 -0
  10. package/dist/lib/record-process-history/record-process-history.component.d.ts.map +1 -1
  11. package/dist/lib/record-process-history/record-process-history.component.js +30 -10
  12. package/dist/lib/record-process-history/record-process-history.component.js.map +1 -1
  13. package/dist/lib/record-process-studio/record-process-studio.component.d.ts +12 -0
  14. package/dist/lib/record-process-studio/record-process-studio.component.d.ts.map +1 -1
  15. package/dist/lib/record-process-studio/record-process-studio.component.js +31 -7
  16. package/dist/lib/record-process-studio/record-process-studio.component.js.map +1 -1
  17. package/dist/lib/run-detail.d.ts +4 -0
  18. package/dist/lib/run-detail.d.ts.map +1 -1
  19. package/dist/lib/run-detail.js +10 -2
  20. package/dist/lib/run-detail.js.map +1 -1
  21. package/package.json +10 -10
@@ -345,7 +345,7 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
345
345
  this.cdr.detectChanges();
346
346
  }
347
347
  /** Generic setter for the simple string/enum fields, driven by the template inputs. */
348
- set(field, event) {
348
+ Set(field, event) {
349
349
  if (!this.Record)
350
350
  return;
351
351
  const value = event.target.value;
@@ -372,26 +372,42 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
372
372
  }
373
373
  this.cdr.detectChanges();
374
374
  }
375
- onEntityChange(event) {
375
+ /** @deprecated Use {@link Set}. */
376
+ set(field, event) {
377
+ return this.Set(field, event);
378
+ }
379
+ OnEntityChange(event) {
376
380
  if (!this.Record)
377
381
  return;
378
382
  this.Record.EntityID = event.target.value;
379
383
  this.resolveEntityName();
380
384
  this.cdr.detectChanges();
381
385
  }
382
- onRulesChange(ruleSet) {
386
+ /** @deprecated Use {@link OnEntityChange}. */
387
+ onEntityChange(event) {
388
+ return this.OnEntityChange(event);
389
+ }
390
+ OnRulesChange(ruleSet) {
383
391
  this.RuleSet = ruleSet;
384
392
  if (this.Record)
385
393
  this.Record.Configuration = JSON.stringify(ruleSet);
386
394
  this.cdr.detectChanges();
387
395
  }
388
- onFeaturePipelineSpecChange(spec) {
396
+ /** @deprecated Use {@link OnRulesChange}. */
397
+ onRulesChange(ruleSet) {
398
+ return this.OnRulesChange(ruleSet);
399
+ }
400
+ OnFeaturePipelineSpecChange(spec) {
389
401
  this.FeaturePipelineSpec = spec;
390
402
  if (this.Record) {
391
403
  this.Record.Configuration = JSON.stringify(spec);
392
404
  }
393
405
  this.cdr.detectChanges();
394
406
  }
407
+ /** @deprecated Use {@link OnFeaturePipelineSpecChange}. */
408
+ onFeaturePipelineSpecChange(spec) {
409
+ return this.OnFeaturePipelineSpecChange(spec);
410
+ }
395
411
  /** Saves the record (and emits). Returns success. */
396
412
  async Save() {
397
413
  if (!this.Record || !this.CanSave)
@@ -446,10 +462,14 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
446
462
  };
447
463
  this.cdr.detectChanges();
448
464
  }
449
- onPreviewDone(_result) {
465
+ OnPreviewDone(_result) {
450
466
  this.PreviewDriver = null;
451
467
  this.cdr.detectChanges();
452
468
  }
469
+ /** @deprecated Use {@link OnPreviewDone}. */
470
+ onPreviewDone(_result) {
471
+ return this.OnPreviewDone(_result);
472
+ }
453
473
  Cancel() { this.Cancelled.emit(); }
454
474
  resolveEntityName() {
455
475
  this.SelectedEntityName = this.Record?.EntityID ? (this.ProviderToUse.EntityByID(this.Record.EntityID)?.Name ?? '') : '';
@@ -1 +1 @@
1
- {"version":3,"file":"record-process-editor.component.js","sourceRoot":"","sources":["../../../src/lib/record-process-editor/record-process-editor.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview The authoring surface for a single Record Process (a reusable bulk operation). Edits the\n * basics + target entity + scope, and — for the FieldRules work type — embeds the visual\n * `<mj-field-rules-builder>` so a business user defines rules without touching JSON. An inline \"Preview\"\n * runs the same server dry-run + diff runner used at invocation time.\n *\n * Reused in two places: standalone in the Bulk Operations hub (owns its Save/Preview toolbar), and inside\n * the custom Record Process entity form (toolbar hidden — the form owns Save).\n * @module @memberjunction/ng-record-process-studio\n */\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { type EntityInfo } from '@memberjunction/core';\nimport { SafeJSONParse, type FieldRuleSet } from '@memberjunction/global';\nimport { MJRecordProcessEntity } from '@memberjunction/core-entities';\nimport { FieldRulesBuilderComponent, EntityActionUXHostComponent, type EntityActionUXContext, type EntityActionUXResult } from '@memberjunction/ng-entity-action-ux';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { type DataFeatureSpec } from '@memberjunction/feature-pipelines';\nimport { FeaturePipelineBuilderComponent } from '../feature-pipeline-builder/feature-pipeline-builder.component';\n\ntype ScopeKind = 'Filter' | 'View' | 'List';\n\n@Component({\n selector: 'mj-record-process-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldRulesBuilderComponent, FeaturePipelineBuilderComponent, EntityActionUXHostComponent, MJButtonDirective],\n template: `\n @if (!Record) {\n <div class=\"rpe-loading\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Loading…</div>\n } @else {\n <div class=\"rpe\">\n <!-- BASICS -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">1</span><h3>Basics</h3></div>\n <div class=\"rpe-grid2\">\n <div class=\"field\"><label>Name</label>\n <input class=\"mj-input\" [value]=\"Record.Name || ''\" (input)=\"set('Name', $event)\" placeholder=\"e.g. Mark idle prompts for review\"></div>\n <div class=\"field\"><label>Status</label>\n <select class=\"mj-input\" [value]=\"Record.Status || 'Active'\" (change)=\"set('Status', $event)\">\n <option value=\"Draft\">Draft</option><option value=\"Active\">Active</option><option value=\"Disabled\">Disabled</option>\n </select></div>\n </div>\n <div class=\"field rpe-mt\"><label>Description</label>\n <input class=\"mj-input\" [value]=\"Record.Description || ''\" (input)=\"set('Description', $event)\" placeholder=\"What does this process do?\"></div>\n </section>\n\n <!-- TARGET + SCOPE -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">2</span><h3>What it acts on</h3></div>\n <div class=\"rpe-grid3\">\n <div class=\"field\"><label>Entity</label>\n <select class=\"mj-input\" [value]=\"Record.EntityID || ''\" (change)=\"onEntityChange($event)\">\n <option value=\"\" disabled>— choose an entity —</option>\n @for (e of Entities; track e.ID) { <option [value]=\"e.ID\">{{ e.DisplayName || e.Name }}</option> }\n </select></div>\n <div class=\"field\"><label>Default scope</label>\n <select class=\"mj-input\" [value]=\"Record.ScopeType || 'Filter'\" (change)=\"set('ScopeType', $event)\">\n <option value=\"Filter\">Filter</option><option value=\"View\">A view</option><option value=\"List\">A list</option>\n </select></div>\n <div class=\"field\"><label>Work type</label>\n <select class=\"mj-input\" [value]=\"Record.WorkType || 'FieldRules'\" (change)=\"set('WorkType', $event)\">\n <option value=\"FieldRules\">Field Rules</option>\n <option value=\"Infer\">Feature Pipeline (Infer)</option>\n </select></div>\n </div>\n @if (Record.ScopeType === 'Filter') {\n <div class=\"field rpe-mt\"><label>Filter <span class=\"muted\">— overridden by the grid selection at run time</span></label>\n <input class=\"mj-input mono\" [value]=\"Record.ScopeFilter || ''\" (input)=\"set('ScopeFilter', $event)\" placeholder=\"e.g. Status = 'Active'\"></div>\n }\n </section>\n\n <!-- RULES -->\n @if (Record.WorkType === 'FieldRules') {\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">3</span><h3>Rules</h3>\n @if (!SelectedEntityName) { <span class=\"muted rpe-h-note\">choose an entity first</span> }\n </div>\n @if (SelectedEntityName) {\n <mj-field-rules-builder\n [EntityName]=\"SelectedEntityName\"\n [Value]=\"RuleSet\"\n [Provider]=\"Provider\"\n (ValueChange)=\"onRulesChange($event)\"\n (ValidChange)=\"RulesValid = $event\">\n </mj-field-rules-builder>\n }\n </section>\n }\n\n <!-- FEATURE PIPELINE (INFER) -->\n @if (Record.WorkType === 'Infer') {\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">3</span><h3>Feature Pipeline Configuration</h3>\n @if (!SelectedEntityName) { <span class=\"muted rpe-h-note\">choose an entity first</span> }\n </div>\n @if (SelectedEntityName) {\n <mj-feature-pipeline-builder\n [Record]=\"Record\"\n [EntityID]=\"Record.EntityID\"\n (ValidChange)=\"FeaturePipelineValid = $event\"\n (SpecChange)=\"onFeaturePipelineSpecChange($event)\">\n </mj-feature-pipeline-builder>\n }\n </section>\n }\n\n <!-- TOOLBAR -->\n @if (ShowToolbar) {\n <div class=\"rpe-bar\">\n <button mjButton variant=\"primary\" [disabled]=\"!CanSave || Saving\" (click)=\"Save()\">\n <i class=\"fa-solid\" [class.fa-floppy-disk]=\"!Saving\" [class.fa-circle-notch]=\"Saving\" [class.fa-spin]=\"Saving\"></i> Save\n </button>\n <button mjButton [disabled]=\"!CanPreview || Saving\" (click)=\"Preview()\"><i class=\"fa-solid fa-flask\"></i> Preview changes</button>\n <button mjButton variant=\"flat\" (click)=\"Cancel()\">Cancel</button>\n @if (ErrorMessage) { <span class=\"rpe-err\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ErrorMessage }}</span> }\n </div>\n }\n </div>\n\n @if (PreviewDriver) {\n <mj-entity-action-ux-host\n [DriverClass]=\"PreviewDriver.DriverClass\" [Context]=\"PreviewDriver.Context\"\n (Completed)=\"onPreviewDone($event)\" (Cancelled)=\"PreviewDriver = null\">\n </mj-entity-action-ux-host>\n }\n }\n `,\n styles: [`\n .rpe-loading{padding:30px;color:var(--mj-text-muted);display:flex;align-items:center;gap:10px}\n .rpe{display:flex;flex-direction:column;gap:22px;color:var(--mj-text-primary)}\n .rpe-sec{background:var(--mj-bg-surface-card);border:1px solid var(--mj-border-subtle);border-radius:var(--mj-radius-md,10px);padding:18px 20px}\n .rpe-sec-h{display:flex;align-items:center;gap:11px;margin-bottom:16px}\n .rpe-sec-h h3{margin:0;font-size:16px;font-weight:700}\n .rpe-sec-h .num{width:23px;height:23px;border-radius:50%;background:var(--mj-brand-primary);color:var(--mj-text-inverse);display:grid;place-items:center;font-size:12px;font-weight:800}\n .rpe-h-note{margin-left:6px;font-size:12.5px}\n .rpe-grid2{display:grid;grid-template-columns:1fr 220px;gap:16px}\n .rpe-grid3{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:16px}\n .field{display:flex;flex-direction:column;gap:6px}\n .field label{font-size:12.5px;font-weight:600;color:var(--mj-text-secondary)}\n .rpe-mt{margin-top:16px}\n .mono{font-family:var(--mj-font-mono,monospace);font-size:12.5px}\n .muted{color:var(--mj-text-muted);font-weight:400}\n .rpe-bar{display:flex;align-items:center;gap:10px;padding-top:4px}\n .rpe-bar button i{margin-right:6px}\n .rpe-err{color:var(--mj-status-error-text);font-size:13px;display:flex;align-items:center;gap:7px}\n .rpe-err i{color:var(--mj-status-error)}\n `],\n})\nexport class RecordProcessEditorComponent extends BaseAngularComponent implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n /** The process being edited. Set this OR `RecordProcessID` (or neither, for a new draft). */\n @Input() Record: MJRecordProcessEntity | null = null;\n /** Load an existing process by ID (alternative to passing `Record`). */\n @Input() RecordProcessID: string | null = null;\n /** Default EntityID for a brand-new process (e.g. the grid the user came from). */\n @Input() DefaultEntityID: string | null = null;\n /** Default WorkType for a brand-new process (e.g. 'Infer' when opened from Feature Pipelines). */\n @Input() DefaultWorkType: MJRecordProcessEntity['WorkType'] | null = null;\n /** Default CategoryID for a brand-new process (e.g. Feature Pipeline category ID). */\n @Input() DefaultCategoryID: string | null = null;\n /** Show the built-in Save / Preview / Cancel toolbar. Set false when an outer form owns Save. */\n @Input() ShowToolbar = true;\n\n /** Emitted after a successful Save (the persisted record). */\n @Output() Saved = new EventEmitter<MJRecordProcessEntity>();\n /** Emitted when the user cancels. */\n @Output() Cancelled = new EventEmitter<void>();\n\n public Entities: EntityInfo[] = [];\n public SelectedEntityName = '';\n public RuleSet: FieldRuleSet = { Rules: [] };\n public RulesValid = true;\n public FeaturePipelineValid = true;\n public FeaturePipelineSpec: DataFeatureSpec | null = null;\n public Saving = false;\n public ErrorMessage = '';\n public PreviewDriver: { DriverClass: string; Context: EntityActionUXContext } | null = null;\n\n get CanSave(): boolean {\n if (!this.Record?.Name || !this.Record?.EntityID) return false;\n if (this.Record.WorkType === 'FieldRules') return this.RulesValid;\n if (this.Record.WorkType === 'Infer') return this.FeaturePipelineValid && !!this.Record.PromptID;\n return true;\n }\n get CanPreview(): boolean {\n if (this.Record?.WorkType === 'FieldRules') return this.CanSave && this.RuleSet.Rules.length > 0;\n if (this.Record?.WorkType === 'Infer') return this.CanSave;\n return false;\n }\n\n async ngOnInit(): Promise<void> {\n const provider = this.ProviderToUse;\n this.Entities = [...provider.Entities].sort((a, b) => (a.DisplayName || a.Name).localeCompare(b.DisplayName || b.Name));\n await this.loadRecord();\n }\n\n /** Resolves the record to edit: passed instance → by ID → a fresh draft. */\n private async loadRecord(): Promise<void> {\n const provider = this.ProviderToUse;\n if (!this.Record) {\n this.Record = await provider.GetEntityObject<MJRecordProcessEntity>('MJ: Record Processes', provider.CurrentUser);\n if (this.RecordProcessID) {\n await this.Record.Load(this.RecordProcessID);\n } else {\n this.Record.NewRecord();\n this.Record.WorkType = this.DefaultWorkType ?? 'FieldRules';\n this.Record.ScopeType = 'Filter';\n this.Record.Status = 'Draft';\n if (this.DefaultEntityID) this.Record.EntityID = this.DefaultEntityID;\n if (this.DefaultCategoryID) this.Record.CategoryID = this.DefaultCategoryID;\n }\n }\n if (this.Record.WorkType === 'FieldRules') {\n this.RuleSet = this.Record.Configuration ? (SafeJSONParse<FieldRuleSet>(this.Record.Configuration) ?? { Rules: [] }) : { Rules: [] };\n } else if (this.Record.WorkType === 'Infer') {\n this.FeaturePipelineSpec = this.Record.Configuration ? SafeJSONParse<DataFeatureSpec>(this.Record.Configuration) : null;\n }\n this.resolveEntityName();\n this.cdr.detectChanges();\n }\n\n /** Generic setter for the simple string/enum fields, driven by the template inputs. */\n set(field: 'Name' | 'Description' | 'Status' | 'ScopeType' | 'ScopeFilter' | 'WorkType', event: Event): void {\n if (!this.Record) return;\n const value = (event.target as HTMLInputElement | HTMLSelectElement).value;\n // Strongly-typed assignment per field (no dynamic Set()).\n switch (field) {\n case 'Name': this.Record.Name = value; break;\n case 'Description': this.Record.Description = value; break;\n case 'Status': this.Record.Status = value as MJRecordProcessEntity['Status']; break;\n case 'ScopeType': this.Record.ScopeType = value as MJRecordProcessEntity['ScopeType']; break;\n case 'ScopeFilter': this.Record.ScopeFilter = value; break;\n case 'WorkType': this.Record.WorkType = value as MJRecordProcessEntity['WorkType']; break;\n }\n this.cdr.detectChanges();\n }\n\n onEntityChange(event: Event): void {\n if (!this.Record) return;\n this.Record.EntityID = (event.target as HTMLSelectElement).value;\n this.resolveEntityName();\n this.cdr.detectChanges();\n }\n\n onRulesChange(ruleSet: FieldRuleSet): void {\n this.RuleSet = ruleSet;\n if (this.Record) this.Record.Configuration = JSON.stringify(ruleSet);\n this.cdr.detectChanges();\n }\n\n onFeaturePipelineSpecChange(spec: DataFeatureSpec): void {\n this.FeaturePipelineSpec = spec;\n if (this.Record) {\n this.Record.Configuration = JSON.stringify(spec);\n }\n this.cdr.detectChanges();\n }\n\n /** Saves the record (and emits). Returns success. */\n async Save(): Promise<boolean> {\n if (!this.Record || !this.CanSave) return false;\n this.Saving = true; this.ErrorMessage = ''; this.cdr.detectChanges();\n if (this.Record.WorkType === 'FieldRules') {\n this.Record.Configuration = JSON.stringify(this.RuleSet);\n } else if (this.Record.WorkType === 'Infer' && this.FeaturePipelineSpec) {\n this.Record.Configuration = JSON.stringify(this.FeaturePipelineSpec);\n }\n const ok = await this.Record.Save();\n this.Saving = false;\n if (ok) {\n this.Saved.emit(this.Record);\n } else {\n this.ErrorMessage = this.Record.LatestResult?.CompleteMessage ?? 'Save failed';\n }\n this.cdr.detectChanges();\n return ok;\n }\n\n /** Saves (if needed) then mounts the dry-run runner against the process's default scope. */\n async Preview(): Promise<void> {\n if (!this.Record) return;\n if (this.Record.Dirty || !this.Record.IsSaved) {\n const ok = await this.Save();\n if (!ok) return;\n }\n const entity = this.ProviderToUse.EntityByID(this.Record.EntityID);\n if (!entity) { this.ErrorMessage = 'Target entity not found'; this.cdr.detectChanges(); return; }\n this.PreviewDriver = {\n DriverClass: 'RecordProcessRunnerUX',\n Context: {\n EntityInfo: entity,\n ScopeKind: (this.Record.ScopeType?.toLowerCase() as EntityActionUXContext['ScopeKind']) || 'filter',\n Filter: this.Record.ScopeFilter ?? undefined,\n ViewID: this.Record.ScopeViewID ?? undefined,\n ListID: this.Record.ScopeListID ?? undefined,\n Config: { RecordProcessID: this.Record.ID },\n Provider: this.ProviderToUse,\n ActionLabel: `Preview: ${this.Record.Name}`,\n },\n };\n this.cdr.detectChanges();\n }\n\n onPreviewDone(_result: EntityActionUXResult): void {\n this.PreviewDriver = null;\n this.cdr.detectChanges();\n }\n\n Cancel(): void { this.Cancelled.emit(); }\n\n private resolveEntityName(): void {\n this.SelectedEntityName = this.Record?.EntityID ? (this.ProviderToUse.EntityByID(this.Record.EntityID)?.Name ?? '') : '';\n }\n}\n"]}
1
+ {"version":3,"file":"record-process-editor.component.js","sourceRoot":"","sources":["../../../src/lib/record-process-editor/record-process-editor.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview The authoring surface for a single Record Process (a reusable bulk operation). Edits the\n * basics + target entity + scope, and — for the FieldRules work type — embeds the visual\n * `<mj-field-rules-builder>` so a business user defines rules without touching JSON. An inline \"Preview\"\n * runs the same server dry-run + diff runner used at invocation time.\n *\n * Reused in two places: standalone in the Bulk Operations hub (owns its Save/Preview toolbar), and inside\n * the custom Record Process entity form (toolbar hidden — the form owns Save).\n * @module @memberjunction/ng-record-process-studio\n */\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { type EntityInfo } from '@memberjunction/core';\nimport { SafeJSONParse, type FieldRuleSet } from '@memberjunction/global';\nimport { MJRecordProcessEntity } from '@memberjunction/core-entities';\nimport { FieldRulesBuilderComponent, EntityActionUXHostComponent, type EntityActionUXContext, type EntityActionUXResult } from '@memberjunction/ng-entity-action-ux';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { type DataFeatureSpec } from '@memberjunction/feature-pipelines';\nimport { FeaturePipelineBuilderComponent } from '../feature-pipeline-builder/feature-pipeline-builder.component';\n\ntype ScopeKind = 'Filter' | 'View' | 'List';\n\n@Component({\n selector: 'mj-record-process-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldRulesBuilderComponent, FeaturePipelineBuilderComponent, EntityActionUXHostComponent, MJButtonDirective],\n template: `\n @if (!Record) {\n <div class=\"rpe-loading\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Loading…</div>\n } @else {\n <div class=\"rpe\">\n <!-- BASICS -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">1</span><h3>Basics</h3></div>\n <div class=\"rpe-grid2\">\n <div class=\"field\"><label>Name</label>\n <input class=\"mj-input\" [value]=\"Record.Name || ''\" (input)=\"set('Name', $event)\" placeholder=\"e.g. Mark idle prompts for review\"></div>\n <div class=\"field\"><label>Status</label>\n <select class=\"mj-input\" [value]=\"Record.Status || 'Active'\" (change)=\"set('Status', $event)\">\n <option value=\"Draft\">Draft</option><option value=\"Active\">Active</option><option value=\"Disabled\">Disabled</option>\n </select></div>\n </div>\n <div class=\"field rpe-mt\"><label>Description</label>\n <input class=\"mj-input\" [value]=\"Record.Description || ''\" (input)=\"set('Description', $event)\" placeholder=\"What does this process do?\"></div>\n </section>\n\n <!-- TARGET + SCOPE -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">2</span><h3>What it acts on</h3></div>\n <div class=\"rpe-grid3\">\n <div class=\"field\"><label>Entity</label>\n <select class=\"mj-input\" [value]=\"Record.EntityID || ''\" (change)=\"onEntityChange($event)\">\n <option value=\"\" disabled>— choose an entity —</option>\n @for (e of Entities; track e.ID) { <option [value]=\"e.ID\">{{ e.DisplayName || e.Name }}</option> }\n </select></div>\n <div class=\"field\"><label>Default scope</label>\n <select class=\"mj-input\" [value]=\"Record.ScopeType || 'Filter'\" (change)=\"set('ScopeType', $event)\">\n <option value=\"Filter\">Filter</option><option value=\"View\">A view</option><option value=\"List\">A list</option>\n </select></div>\n <div class=\"field\"><label>Work type</label>\n <select class=\"mj-input\" [value]=\"Record.WorkType || 'FieldRules'\" (change)=\"set('WorkType', $event)\">\n <option value=\"FieldRules\">Field Rules</option>\n <option value=\"Infer\">Feature Pipeline (Infer)</option>\n </select></div>\n </div>\n @if (Record.ScopeType === 'Filter') {\n <div class=\"field rpe-mt\"><label>Filter <span class=\"muted\">— overridden by the grid selection at run time</span></label>\n <input class=\"mj-input mono\" [value]=\"Record.ScopeFilter || ''\" (input)=\"set('ScopeFilter', $event)\" placeholder=\"e.g. Status = 'Active'\"></div>\n }\n </section>\n\n <!-- RULES -->\n @if (Record.WorkType === 'FieldRules') {\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">3</span><h3>Rules</h3>\n @if (!SelectedEntityName) { <span class=\"muted rpe-h-note\">choose an entity first</span> }\n </div>\n @if (SelectedEntityName) {\n <mj-field-rules-builder\n [EntityName]=\"SelectedEntityName\"\n [Value]=\"RuleSet\"\n [Provider]=\"Provider\"\n (ValueChange)=\"onRulesChange($event)\"\n (ValidChange)=\"RulesValid = $event\">\n </mj-field-rules-builder>\n }\n </section>\n }\n\n <!-- FEATURE PIPELINE (INFER) -->\n @if (Record.WorkType === 'Infer') {\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\"><span class=\"num\">3</span><h3>Feature Pipeline Configuration</h3>\n @if (!SelectedEntityName) { <span class=\"muted rpe-h-note\">choose an entity first</span> }\n </div>\n @if (SelectedEntityName) {\n <mj-feature-pipeline-builder\n [Record]=\"Record\"\n [EntityID]=\"Record.EntityID\"\n (ValidChange)=\"FeaturePipelineValid = $event\"\n (SpecChange)=\"onFeaturePipelineSpecChange($event)\">\n </mj-feature-pipeline-builder>\n }\n </section>\n }\n\n <!-- TOOLBAR -->\n @if (ShowToolbar) {\n <div class=\"rpe-bar\">\n <button mjButton variant=\"primary\" [disabled]=\"!CanSave || Saving\" (click)=\"Save()\">\n <i class=\"fa-solid\" [class.fa-floppy-disk]=\"!Saving\" [class.fa-circle-notch]=\"Saving\" [class.fa-spin]=\"Saving\"></i> Save\n </button>\n <button mjButton [disabled]=\"!CanPreview || Saving\" (click)=\"Preview()\"><i class=\"fa-solid fa-flask\"></i> Preview changes</button>\n <button mjButton variant=\"flat\" (click)=\"Cancel()\">Cancel</button>\n @if (ErrorMessage) { <span class=\"rpe-err\"><i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ErrorMessage }}</span> }\n </div>\n }\n </div>\n\n @if (PreviewDriver) {\n <mj-entity-action-ux-host\n [DriverClass]=\"PreviewDriver.DriverClass\" [Context]=\"PreviewDriver.Context\"\n (Completed)=\"onPreviewDone($event)\" (Cancelled)=\"PreviewDriver = null\">\n </mj-entity-action-ux-host>\n }\n }\n `,\n styles: [`\n .rpe-loading{padding:30px;color:var(--mj-text-muted);display:flex;align-items:center;gap:10px}\n .rpe{display:flex;flex-direction:column;gap:22px;color:var(--mj-text-primary)}\n .rpe-sec{background:var(--mj-bg-surface-card);border:1px solid var(--mj-border-subtle);border-radius:var(--mj-radius-md,10px);padding:18px 20px}\n .rpe-sec-h{display:flex;align-items:center;gap:11px;margin-bottom:16px}\n .rpe-sec-h h3{margin:0;font-size:16px;font-weight:700}\n .rpe-sec-h .num{width:23px;height:23px;border-radius:50%;background:var(--mj-brand-primary);color:var(--mj-text-inverse);display:grid;place-items:center;font-size:12px;font-weight:800}\n .rpe-h-note{margin-left:6px;font-size:12.5px}\n .rpe-grid2{display:grid;grid-template-columns:1fr 220px;gap:16px}\n .rpe-grid3{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:16px}\n .field{display:flex;flex-direction:column;gap:6px}\n .field label{font-size:12.5px;font-weight:600;color:var(--mj-text-secondary)}\n .rpe-mt{margin-top:16px}\n .mono{font-family:var(--mj-font-mono,monospace);font-size:12.5px}\n .muted{color:var(--mj-text-muted);font-weight:400}\n .rpe-bar{display:flex;align-items:center;gap:10px;padding-top:4px}\n .rpe-bar button i{margin-right:6px}\n .rpe-err{color:var(--mj-status-error-text);font-size:13px;display:flex;align-items:center;gap:7px}\n .rpe-err i{color:var(--mj-status-error)}\n `],\n})\nexport class RecordProcessEditorComponent extends BaseAngularComponent implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n /** The process being edited. Set this OR `RecordProcessID` (or neither, for a new draft). */\n @Input() Record: MJRecordProcessEntity | null = null;\n /** Load an existing process by ID (alternative to passing `Record`). */\n @Input() RecordProcessID: string | null = null;\n /** Default EntityID for a brand-new process (e.g. the grid the user came from). */\n @Input() DefaultEntityID: string | null = null;\n /** Default WorkType for a brand-new process (e.g. 'Infer' when opened from Feature Pipelines). */\n @Input() DefaultWorkType: MJRecordProcessEntity['WorkType'] | null = null;\n /** Default CategoryID for a brand-new process (e.g. Feature Pipeline category ID). */\n @Input() DefaultCategoryID: string | null = null;\n /** Show the built-in Save / Preview / Cancel toolbar. Set false when an outer form owns Save. */\n @Input() ShowToolbar = true;\n\n /** Emitted after a successful Save (the persisted record). */\n @Output() Saved = new EventEmitter<MJRecordProcessEntity>();\n /** Emitted when the user cancels. */\n @Output() Cancelled = new EventEmitter<void>();\n\n public Entities: EntityInfo[] = [];\n public SelectedEntityName = '';\n public RuleSet: FieldRuleSet = { Rules: [] };\n public RulesValid = true;\n public FeaturePipelineValid = true;\n public FeaturePipelineSpec: DataFeatureSpec | null = null;\n public Saving = false;\n public ErrorMessage = '';\n public PreviewDriver: { DriverClass: string; Context: EntityActionUXContext } | null = null;\n\n get CanSave(): boolean {\n if (!this.Record?.Name || !this.Record?.EntityID) return false;\n if (this.Record.WorkType === 'FieldRules') return this.RulesValid;\n if (this.Record.WorkType === 'Infer') return this.FeaturePipelineValid && !!this.Record.PromptID;\n return true;\n }\n get CanPreview(): boolean {\n if (this.Record?.WorkType === 'FieldRules') return this.CanSave && this.RuleSet.Rules.length > 0;\n if (this.Record?.WorkType === 'Infer') return this.CanSave;\n return false;\n }\n\n async ngOnInit(): Promise<void> {\n const provider = this.ProviderToUse;\n this.Entities = [...provider.Entities].sort((a, b) => (a.DisplayName || a.Name).localeCompare(b.DisplayName || b.Name));\n await this.loadRecord();\n }\n\n /** Resolves the record to edit: passed instance → by ID → a fresh draft. */\n private async loadRecord(): Promise<void> {\n const provider = this.ProviderToUse;\n if (!this.Record) {\n this.Record = await provider.GetEntityObject<MJRecordProcessEntity>('MJ: Record Processes', provider.CurrentUser);\n if (this.RecordProcessID) {\n await this.Record.Load(this.RecordProcessID);\n } else {\n this.Record.NewRecord();\n this.Record.WorkType = this.DefaultWorkType ?? 'FieldRules';\n this.Record.ScopeType = 'Filter';\n this.Record.Status = 'Draft';\n if (this.DefaultEntityID) this.Record.EntityID = this.DefaultEntityID;\n if (this.DefaultCategoryID) this.Record.CategoryID = this.DefaultCategoryID;\n }\n }\n if (this.Record.WorkType === 'FieldRules') {\n this.RuleSet = this.Record.Configuration ? (SafeJSONParse<FieldRuleSet>(this.Record.Configuration) ?? { Rules: [] }) : { Rules: [] };\n } else if (this.Record.WorkType === 'Infer') {\n this.FeaturePipelineSpec = this.Record.Configuration ? SafeJSONParse<DataFeatureSpec>(this.Record.Configuration) : null;\n }\n this.resolveEntityName();\n this.cdr.detectChanges();\n }\n\n /** Generic setter for the simple string/enum fields, driven by the template inputs. */\n Set(field: 'Name' | 'Description' | 'Status' | 'ScopeType' | 'ScopeFilter' | 'WorkType', event: Event): void {\n if (!this.Record) return;\n const value = (event.target as HTMLInputElement | HTMLSelectElement).value;\n // Strongly-typed assignment per field (no dynamic Set()).\n switch (field) {\n case 'Name': this.Record.Name = value; break;\n case 'Description': this.Record.Description = value; break;\n case 'Status': this.Record.Status = value as MJRecordProcessEntity['Status']; break;\n case 'ScopeType': this.Record.ScopeType = value as MJRecordProcessEntity['ScopeType']; break;\n case 'ScopeFilter': this.Record.ScopeFilter = value; break;\n case 'WorkType': this.Record.WorkType = value as MJRecordProcessEntity['WorkType']; break;\n }\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link Set}. */\n set(field: 'Name' | 'Description' | 'Status' | 'ScopeType' | 'ScopeFilter' | 'WorkType', event: Event): void {\n return this.Set(field, event);\n }\n\n OnEntityChange(event: Event): void {\n if (!this.Record) return;\n this.Record.EntityID = (event.target as HTMLSelectElement).value;\n this.resolveEntityName();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnEntityChange}. */\n onEntityChange(event: Event): void {\n return this.OnEntityChange(event);\n }\n\n OnRulesChange(ruleSet: FieldRuleSet): void {\n this.RuleSet = ruleSet;\n if (this.Record) this.Record.Configuration = JSON.stringify(ruleSet);\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnRulesChange}. */\n onRulesChange(ruleSet: FieldRuleSet): void {\n return this.OnRulesChange(ruleSet);\n }\n\n OnFeaturePipelineSpecChange(spec: DataFeatureSpec): void {\n this.FeaturePipelineSpec = spec;\n if (this.Record) {\n this.Record.Configuration = JSON.stringify(spec);\n }\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnFeaturePipelineSpecChange}. */\n onFeaturePipelineSpecChange(spec: DataFeatureSpec): void {\n return this.OnFeaturePipelineSpecChange(spec);\n }\n\n /** Saves the record (and emits). Returns success. */\n async Save(): Promise<boolean> {\n if (!this.Record || !this.CanSave) return false;\n this.Saving = true; this.ErrorMessage = ''; this.cdr.detectChanges();\n if (this.Record.WorkType === 'FieldRules') {\n this.Record.Configuration = JSON.stringify(this.RuleSet);\n } else if (this.Record.WorkType === 'Infer' && this.FeaturePipelineSpec) {\n this.Record.Configuration = JSON.stringify(this.FeaturePipelineSpec);\n }\n const ok = await this.Record.Save();\n this.Saving = false;\n if (ok) {\n this.Saved.emit(this.Record);\n } else {\n this.ErrorMessage = this.Record.LatestResult?.CompleteMessage ?? 'Save failed';\n }\n this.cdr.detectChanges();\n return ok;\n }\n\n /** Saves (if needed) then mounts the dry-run runner against the process's default scope. */\n async Preview(): Promise<void> {\n if (!this.Record) return;\n if (this.Record.Dirty || !this.Record.IsSaved) {\n const ok = await this.Save();\n if (!ok) return;\n }\n const entity = this.ProviderToUse.EntityByID(this.Record.EntityID);\n if (!entity) { this.ErrorMessage = 'Target entity not found'; this.cdr.detectChanges(); return; }\n this.PreviewDriver = {\n DriverClass: 'RecordProcessRunnerUX',\n Context: {\n EntityInfo: entity,\n ScopeKind: (this.Record.ScopeType?.toLowerCase() as EntityActionUXContext['ScopeKind']) || 'filter',\n Filter: this.Record.ScopeFilter ?? undefined,\n ViewID: this.Record.ScopeViewID ?? undefined,\n ListID: this.Record.ScopeListID ?? undefined,\n Config: { RecordProcessID: this.Record.ID },\n Provider: this.ProviderToUse,\n ActionLabel: `Preview: ${this.Record.Name}`,\n },\n };\n this.cdr.detectChanges();\n }\n\n OnPreviewDone(_result: EntityActionUXResult): void {\n this.PreviewDriver = null;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnPreviewDone}. */\n onPreviewDone(_result: EntityActionUXResult): void {\n return this.OnPreviewDone(_result);\n }\n\n Cancel(): void { this.Cancelled.emit(); }\n\n private resolveEntityName(): void {\n this.SelectedEntityName = this.Record?.EntityID ? (this.ProviderToUse.EntityByID(this.Record.EntityID)?.Name ?? '') : '';\n }\n}\n"]}
@@ -57,10 +57,20 @@ export declare class RecordProcessHistoryComponent extends BaseAngularComponent
57
57
  private subscribeToRunChanges;
58
58
  /** Debounce a burst of run/detail/checkpoint saves into a single reload; defer if the user is drilled into a detail. */
59
59
  private scheduleReload;
60
+ Reload(): Promise<void>;
61
+ /** @deprecated Use {@link Reload}. */
60
62
  reload(): Promise<void>;
63
+ OpenRun(run: RunRow): Promise<void>;
64
+ /** @deprecated Use {@link OpenRun}. */
61
65
  openRun(run: RunRow): Promise<void>;
66
+ BackToList(): void;
67
+ /** @deprecated Use {@link BackToList}. */
62
68
  backToList(): void;
69
+ Fmt(value?: string | Date): string;
70
+ /** @deprecated Use {@link Fmt}. */
63
71
  fmt(value?: string | Date): string;
72
+ Disp(value: unknown): string;
73
+ /** @deprecated Use {@link Disp}. */
64
74
  disp(value: unknown): string;
65
75
  static ɵfac: i0.ɵɵFactoryDeclaration<RecordProcessHistoryComponent, never>;
66
76
  static ɵcmp: i0.ɵɵComponentDeclaration<RecordProcessHistoryComponent, "mj-record-process-history", never, { "RecordProcessID": { "alias": "RecordProcessID"; "required": false; }; }, {}, never, never, true, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"record-process-history.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-process-history/record-process-history.component.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAgE,SAAS,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AAExH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAIrE,OAAO,EAAiD,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;;AAEpG,UAAU,MAAM;IACZ,EAAE,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IACtE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC7F,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CACxF;AACD,UAAU,MAAO,SAAQ,MAAM;IAAG,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;CAAE;AAG5E,UAAU,SAAS;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAAE;AAE5G,qBAwGa,6BAA8B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAChG,OAAO,CAAC,GAAG,CAA6B;IAExC,uDAAuD;IAC9C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAU;IACjC,OAAO,UAAQ;IACf,aAAa,UAAS;IACtB,IAAI,EAAE,MAAM,EAAE,CAAM;IACpB,OAAO,EAAE,SAAS,EAAE,CAAM;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAA8C;IAE3D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,WAAW,IAAI,IAAI;IAOnB,0GAA0G;IAC1G,OAAO,CAAC,qBAAqB;IAgB7B,wHAAwH;IACxH,OAAO,CAAC,cAAc;IAchB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBvB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAezC,UAAU,IAAI,IAAI;IAUlB,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAKlC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;yCA1HnB,6BAA6B;2CAA7B,6BAA6B;CA2HzC"}
1
+ {"version":3,"file":"record-process-history.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-process-history/record-process-history.component.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAgE,SAAS,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AAExH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAIrE,OAAO,EAAiD,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;;AAEpG,UAAU,MAAM;IACZ,EAAE,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IACtE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC7F,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CACxF;AACD,UAAU,MAAO,SAAQ,MAAM;IAAG,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;CAAE;AAG5E,UAAU,SAAS;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAAE;AAE5G,qBAwGa,6BAA8B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAChG,OAAO,CAAC,GAAG,CAA6B;IAExC,uDAAuD;IAC9C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAU;IACjC,OAAO,UAAQ;IACf,aAAa,UAAS;IACtB,IAAI,EAAE,MAAM,EAAE,CAAM;IACpB,OAAO,EAAE,SAAS,EAAE,CAAM;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAA8C;IAE3D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,WAAW,IAAI,IAAI;IAOnB,0GAA0G;IAC1G,OAAO,CAAC,qBAAqB;IAgB7B,wHAAwH;IACxH,OAAO,CAAC,cAAc;IAchB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB7B,sCAAsC;IAChC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAezC,uCAAuC;IACjC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,UAAU,IAAI,IAAI;IAUlB,0CAA0C;IAC1C,UAAU,IAAI,IAAI;IAIlB,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAMlC,mCAAmC;IACnC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAGlC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAE5B,oCAAoC;IACpC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;yCAjJnB,6BAA6B;2CAA7B,6BAA6B;CAoJzC"}
@@ -9,7 +9,7 @@ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
9
9
  import { BaseEntity, RunView } from '@memberjunction/core';
10
10
  import { MJEventType, MJGlobal, NormalizeUUID } from '@memberjunction/global';
11
11
  import { MJButtonDirective } from '@memberjunction/ng-ui-components';
12
- import { parseAppliedRunDetailChanges, displayRunValue } from '../run-detail';
12
+ import { ParseAppliedRunDetailChanges, DisplayRunValue } from '../run-detail';
13
13
  import * as i0 from "@angular/core";
14
14
  const _forTrack0 = ($index, $item) => $item.ID;
15
15
  const _forTrack1 = ($index, $item) => $item.RecordID;
@@ -273,7 +273,7 @@ export class RecordProcessHistoryComponent extends BaseAngularComponent {
273
273
  pendingReload = false;
274
274
  reloadTimer = null;
275
275
  async ngOnInit() {
276
- await this.reload();
276
+ await this.Reload();
277
277
  this.subscribeToRunChanges();
278
278
  }
279
279
  ngOnDestroy() {
@@ -309,10 +309,10 @@ export class RecordProcessHistoryComponent extends BaseAngularComponent {
309
309
  }
310
310
  this.reloadTimer = setTimeout(() => {
311
311
  this.reloadTimer = null;
312
- void this.reload();
312
+ void this.Reload();
313
313
  }, 400);
314
314
  }
315
- async reload() {
315
+ async Reload() {
316
316
  this.Loading = true;
317
317
  this.cdr.detectChanges();
318
318
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
@@ -339,7 +339,11 @@ export class RecordProcessHistoryComponent extends BaseAngularComponent {
339
339
  this.Loading = false;
340
340
  this.cdr.detectChanges();
341
341
  }
342
- async openRun(run) {
342
+ /** @deprecated Use {@link Reload}. */
343
+ async reload() {
344
+ return this.Reload();
345
+ }
346
+ async OpenRun(run) {
343
347
  this.OpenRunRow = run;
344
348
  this.Mode = 'detail';
345
349
  this.DetailLoading = true;
@@ -352,27 +356,43 @@ export class RecordProcessHistoryComponent extends BaseAngularComponent {
352
356
  ExtraFilter: `ProcessRunID='${run.ID}'`, OrderBy: 'Status, RecordID', MaxRows: 1000, ResultType: 'simple',
353
357
  });
354
358
  this.Details = (result.Success ? (result.Results ?? []) : []).map((d) => ({
355
- RecordID: d.RecordID, Status: d.Status, Changes: parseAppliedRunDetailChanges(d.ResultPayload), ErrorMessage: d.ErrorMessage,
359
+ RecordID: d.RecordID, Status: d.Status, Changes: ParseAppliedRunDetailChanges(d.ResultPayload), ErrorMessage: d.ErrorMessage,
356
360
  }));
357
361
  this.DetailLoading = false;
358
362
  this.cdr.detectChanges();
359
363
  }
360
- backToList() {
364
+ /** @deprecated Use {@link OpenRun}. */
365
+ async openRun(run) {
366
+ return this.OpenRun(run);
367
+ }
368
+ BackToList() {
361
369
  this.Mode = 'list';
362
370
  this.OpenRunRow = null;
363
371
  this.cdr.detectChanges();
364
372
  if (this.pendingReload) {
365
373
  this.pendingReload = false;
366
- void this.reload(); // a run changed while we were drilled into a detail — refresh now
374
+ void this.Reload(); // a run changed while we were drilled into a detail — refresh now
367
375
  }
368
376
  }
369
- fmt(value) {
377
+ /** @deprecated Use {@link BackToList}. */
378
+ backToList() {
379
+ return this.BackToList();
380
+ }
381
+ Fmt(value) {
370
382
  if (!value)
371
383
  return '—';
372
384
  const d = value instanceof Date ? value : new Date(value);
373
385
  return isNaN(d.getTime()) ? String(value) : d.toLocaleString();
374
386
  }
375
- disp(value) { return displayRunValue(value); }
387
+ /** @deprecated Use {@link Fmt}. */
388
+ fmt(value) {
389
+ return this.Fmt(value);
390
+ }
391
+ Disp(value) { return DisplayRunValue(value); }
392
+ /** @deprecated Use {@link Disp}. */
393
+ disp(value) {
394
+ return this.Disp(value);
395
+ }
376
396
  static ɵfac = /*@__PURE__*/ (() => { let ɵRecordProcessHistoryComponent_BaseFactory; return function RecordProcessHistoryComponent_Factory(__ngFactoryType__) { return (ɵRecordProcessHistoryComponent_BaseFactory || (ɵRecordProcessHistoryComponent_BaseFactory = i0.ɵɵgetInheritedFactory(RecordProcessHistoryComponent)))(__ngFactoryType__ || RecordProcessHistoryComponent); }; })();
377
397
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RecordProcessHistoryComponent, selectors: [["mj-record-process-history"]], inputs: { RecordProcessID: "RecordProcessID" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "rph-bar"], [1, "rph-title"], [1, "rph-spacer"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], [1, "rph-msg"], [1, "rph-table"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "rph-tr", "rph-head"], [1, "rph-tr"], [1, "rph-tr", 3, "click"], [1, "rph-sub"], [1, "rph-nm"], [1, "st"], [1, "dot"], ["title", "Compute-only preview \u2014 no changes were written", 1, "dryrun"], [1, "counts"], [1, "cbadge", "ok"], [1, "cbadge", "err"], [1, "cbadge"], [1, "fa-solid", "fa-arrow-left"], [1, "rph-details"], [1, "rph-detrec"], [1, "rph-detkey"], [1, "st", "sm"], [1, "rph-rk"], [1, "rph-changes"], [1, "rph-chg"], [1, "rph-chg", "err-msg"], [1, "f"], [1, "o"], [1, "fa-solid", "fa-arrow-right-long", "ar"], [1, "nw"]], template: function RecordProcessHistoryComponent_Template(rf, ctx) { if (rf & 1) {
378
398
  i0.ɵɵconditionalCreate(0, RecordProcessHistoryComponent_Conditional_0_Template, 10, 1)(1, RecordProcessHistoryComponent_Conditional_1_Template, 10, 4);
@@ -1 +1 @@
1
- {"version":3,"file":"record-process-history.component.js","sourceRoot":"","sources":["../../../src/lib/record-process-history/record-process-history.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Run history for Bulk Operations: every Record Process run (who/when/scope/status/counts),\n * drilling into the per-record outcome (the field diff persisted on each Process Run Detail). Read-only\n * audit surface. Generic + reusable.\n * @module @memberjunction/ng-record-process-studio\n */\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, BaseEntityEvent, RunView } from '@memberjunction/core';\nimport { MJEvent, MJEventType, MJGlobal, NormalizeUUID } from '@memberjunction/global';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { parseAppliedRunDetailChanges, displayRunValue, type RunDetailChange } from '../run-detail';\n\ninterface RawRun {\n ID: string; RecordProcessID: string; EntityID: string; Status: string;\n StartTime?: string | Date; SuccessCount?: number; ErrorCount?: number; SkippedCount?: number;\n TotalItemCount?: number; TriggeredBy?: string; SourceType?: string; DryRun?: boolean;\n}\ninterface RunRow extends RawRun { ProcessName: string; EntityName: string; }\n\ninterface RawDetail { RecordID: string; Status: string; ResultPayload?: string; ErrorMessage?: string; }\ninterface DetailRow { RecordID: string; Status: string; Changes: RunDetailChange[]; ErrorMessage?: string; }\n\n@Component({\n selector: 'mj-record-process-history',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MJButtonDirective],\n template: `\n @if (Mode === 'list') {\n <div class=\"rph-bar\">\n <h3 class=\"rph-title\">Run history</h3><span class=\"rph-spacer\"></span>\n <button mjButton variant=\"flat\" (click)=\"reload()\"><i class=\"fa-solid fa-arrows-rotate\"></i> Refresh</button>\n </div>\n @if (Loading) {\n <div class=\"rph-msg\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Loading…</div>\n } @else if (Runs.length === 0) {\n <div class=\"rph-msg\">No runs yet.</div>\n } @else {\n <div class=\"rph-table\">\n <div class=\"rph-tr rph-head\"><div>When</div><div>Operation</div><div>Entity</div><div>By</div><div>Status</div><div>Counts</div></div>\n @for (r of Runs; track r.ID) {\n <div class=\"rph-tr\" (click)=\"openRun(r)\">\n <div class=\"rph-sub\">{{ fmt(r.StartTime) }}</div>\n <div class=\"rph-nm\">{{ r.ProcessName }}</div>\n <div>{{ r.EntityName }}</div>\n <div class=\"rph-sub\">{{ r.TriggeredBy || '—' }}</div>\n <div><span class=\"st\" [class.ok]=\"r.Status==='Completed'\" [class.err]=\"r.Status==='Failed'\"><span class=\"dot\"></span> {{ r.Status }}</span>@if (r.DryRun) { <span class=\"dryrun\" title=\"Compute-only preview — no changes were written\">Dry Run</span> }</div>\n <div class=\"counts\">\n <span class=\"cbadge ok\">{{ r.SuccessCount || 0 }} ok</span>\n @if (r.ErrorCount) { <span class=\"cbadge err\">{{ r.ErrorCount }} err</span> }\n @if (r.SkippedCount) { <span class=\"cbadge\">{{ r.SkippedCount }} skip</span> }\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div class=\"rph-bar\">\n <button mjButton variant=\"flat\" (click)=\"backToList()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <h3 class=\"rph-title\">{{ OpenRunRow?.ProcessName }} · {{ fmt(OpenRunRow?.StartTime) }}</h3>\n @if (OpenRunRow?.DryRun) { <span class=\"dryrun\" title=\"Compute-only preview — no changes were written\">Dry Run</span> }\n </div>\n @if (DetailLoading) {\n <div class=\"rph-msg\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Loading details…</div>\n } @else if (Details.length === 0) {\n <div class=\"rph-msg\">No per-record details recorded for this run.</div>\n } @else {\n <div class=\"rph-details\">\n @for (d of Details; track d.RecordID) {\n <div class=\"rph-detrec\">\n <div class=\"rph-detkey\">\n <span class=\"st sm\" [class.ok]=\"d.Status==='Succeeded'\" [class.err]=\"d.Status==='Failed'\" [class.muted]=\"d.Status==='Skipped'\"><span class=\"dot\"></span> {{ d.Status }}</span>\n <div class=\"rph-rk\">{{ d.RecordID }}</div>\n </div>\n <div class=\"rph-changes\">\n @for (c of d.Changes; track c.Field) {\n <div class=\"rph-chg\"><span class=\"f\">{{ c.Field }}</span>\n <span class=\"o\">{{ disp(c.OldValue) }}</span><i class=\"fa-solid fa-arrow-right-long ar\"></i><span class=\"nw\">{{ disp(c.NewValue) }}</span></div>\n }\n @if (d.ErrorMessage) { <div class=\"rph-chg err-msg\">{{ d.ErrorMessage }}</div> }\n @if (d.Changes.length === 0 && !d.ErrorMessage) { <span class=\"rph-sub\">no changes</span> }\n </div>\n </div>\n }\n </div>\n }\n }\n `,\n styles: [`\n :host{display:block;color:var(--mj-text-primary)}\n .rph-bar{display:flex;align-items:center;gap:14px;margin-bottom:16px}\n .rph-title{margin:0;font-size:16px;font-weight:700}\n .rph-spacer{flex:1}\n .rph-bar button i{margin-right:6px}\n .rph-msg{padding:36px;text-align:center;color:var(--mj-text-muted)}\n .rph-table{border:1px solid var(--mj-border-subtle);border-radius:var(--mj-radius-md,10px);overflow:hidden}\n .rph-tr{display:grid;grid-template-columns:1.3fr 1.6fr 1.2fr .9fr 1fr 1.4fr;gap:14px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--mj-border-subtle);font-size:13px;cursor:pointer}\n .rph-tr:last-child{border-bottom:none}\n .rph-tr:not(.rph-head):hover{background:var(--mj-bg-surface-hover)}\n .rph-head{background:var(--mj-bg-surface-sunken);font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--mj-text-muted);font-weight:700;cursor:default}\n .rph-nm{font-weight:600}\n .rph-sub{color:var(--mj-text-muted);font-size:12px}\n .st{display:inline-flex;align-items:center;gap:7px;font-weight:600;font-size:12.5px}\n .st .dot{width:8px;height:8px;border-radius:50%;background:var(--mj-text-disabled)}\n .st.ok .dot{background:var(--mj-status-success)} .st.ok{color:var(--mj-status-success-text)}\n .st.err .dot{background:var(--mj-status-error)} .st.err{color:var(--mj-status-error-text)}\n .st.muted{color:var(--mj-text-muted)}\n .st.sm{font-size:11.5px}\n .counts{display:flex;gap:6px;flex-wrap:wrap}\n .cbadge{font-size:11px;font-weight:700;padding:2px 8px;border-radius:6px;background:var(--mj-bg-surface-sunken);color:var(--mj-text-secondary)}\n .dryrun{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:2px 7px;border-radius:6px;margin-left:6px;background:var(--mj-status-info-bg);color:var(--mj-status-info-text);border:1px solid var(--mj-status-info-border)}\n .cbadge.ok{background:var(--mj-status-success-bg);color:var(--mj-status-success-text)}\n .cbadge.err{background:var(--mj-status-error-bg);color:var(--mj-status-error-text)}\n .rph-details{border:1px solid var(--mj-border-subtle);border-radius:var(--mj-radius-md,10px);overflow:hidden;max-height:560px;overflow-y:auto}\n .rph-detrec{display:grid;grid-template-columns:200px 1fr;gap:14px;padding:11px 16px;border-bottom:1px solid var(--mj-border-subtle)}\n .rph-detrec:last-child{border-bottom:none}\n .rph-detkey{display:flex;flex-direction:column;gap:5px}\n .rph-rk{font-family:var(--mj-font-mono,monospace);font-size:11px;color:var(--mj-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n .rph-chg{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;padding:2px 0}\n .rph-chg .f{font-weight:700;min-width:120px}\n .rph-chg .o{color:var(--mj-text-muted);text-decoration:line-through}\n .rph-chg .nw{color:var(--mj-status-success-text);font-weight:600}\n .rph-chg .ar{color:var(--mj-text-disabled);font-size:11px}\n .rph-chg.err-msg{color:var(--mj-status-error-text)}\n `],\n})\nexport class RecordProcessHistoryComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n /** Optional: show runs for one Record Process only. */\n @Input() RecordProcessID: string | null = null;\n\n public Mode: 'list' | 'detail' = 'list';\n public Loading = true;\n public DetailLoading = false;\n public Runs: RunRow[] = [];\n public Details: DetailRow[] = [];\n public OpenRunRow: RunRow | null = null;\n\n /**\n * There is no RecordProcess BaseEngine to observe — Process Runs is an unbounded log table, so we don't\n * bulk-cache it. Instead we re-query on demand AND keep the list live by listening for BaseEntity save/\n * delete events on the run tables: a run started/finished anywhere (this view, the editor preview, a grid\n * runner, the scheduler) fires an event, and we debounce-reload so history never goes stale behind a run.\n */\n private eventSub?: Subscription;\n private pendingReload = false;\n private reloadTimer: ReturnType<typeof setTimeout> | null = null;\n\n async ngOnInit(): Promise<void> {\n await this.reload();\n this.subscribeToRunChanges();\n }\n\n ngOnDestroy(): void {\n this.eventSub?.unsubscribe();\n if (this.reloadTimer) {\n clearTimeout(this.reloadTimer);\n }\n }\n\n /** Subscribe to BaseEntity events and debounce-reload whenever a Process Run (or its details) changes. */\n private subscribeToRunChanges(): void {\n this.eventSub = MJGlobal.Instance.GetEventListener(false).subscribe((event: MJEvent) => {\n if (event.event !== MJEventType.ComponentEvent || event.eventCode !== BaseEntity.BaseEventCode) {\n return;\n }\n const e = event.args as BaseEntityEvent;\n if (e.type !== 'save' && e.type !== 'delete' && e.type !== 'remote-invalidate') {\n return;\n }\n const name = e.baseEntity?.EntityInfo?.Name ?? e.entityName;\n if (name === 'MJ: Process Runs' || name === 'MJ: Process Run Details') {\n this.scheduleReload();\n }\n });\n }\n\n /** Debounce a burst of run/detail/checkpoint saves into a single reload; defer if the user is drilled into a detail. */\n private scheduleReload(): void {\n if (this.Mode !== 'list') {\n this.pendingReload = true; // refresh when they return to the list — don't yank them out of a drill-in\n return;\n }\n if (this.reloadTimer) {\n clearTimeout(this.reloadTimer);\n }\n this.reloadTimer = setTimeout(() => {\n this.reloadTimer = null;\n void this.reload();\n }, 400);\n }\n\n async reload(): Promise<void> {\n this.Loading = true; this.cdr.detectChanges();\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = this.RecordProcessID ? `RecordProcessID='${this.RecordProcessID}'` : '';\n const [runs, procs] = await rv.RunViews([\n {\n EntityName: 'MJ: Process Runs',\n Fields: ['ID', 'RecordProcessID', 'EntityID', 'Status', 'StartTime', 'SuccessCount', 'ErrorCount', 'SkippedCount', 'TotalItemCount', 'TriggeredBy', 'SourceType', 'DryRun'],\n ExtraFilter: filter, OrderBy: 'StartTime DESC', MaxRows: 200, ResultType: 'simple',\n },\n { EntityName: 'MJ: Record Processes', Fields: ['ID', 'Name'], ResultType: 'simple' },\n ]);\n // Normalized-UUID keys → O(1), case-safe across SQL Server (upper) / PostgreSQL (lower).\n const nameByID = new Map<string, string>();\n if (procs.Success) for (const p of procs.Results as Array<{ ID: string; Name: string }>) nameByID.set(NormalizeUUID(p.ID), p.Name);\n const rawRuns = runs.Success ? (runs.Results as RawRun[]) : [];\n this.Runs = rawRuns.map((r) => ({\n ...r,\n ProcessName: nameByID.get(NormalizeUUID(r.RecordProcessID)) ?? '(deleted)',\n EntityName: this.ProviderToUse.EntityByID(r.EntityID)?.Name ?? r.EntityID,\n }));\n this.Loading = false;\n this.cdr.detectChanges();\n }\n\n async openRun(run: RunRow): Promise<void> {\n this.OpenRunRow = run; this.Mode = 'detail'; this.DetailLoading = true; this.Details = []; this.cdr.detectChanges();\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<RawDetail>({\n EntityName: 'MJ: Process Run Details',\n Fields: ['RecordID', 'Status', 'ResultPayload', 'ErrorMessage'],\n ExtraFilter: `ProcessRunID='${run.ID}'`, OrderBy: 'Status, RecordID', MaxRows: 1000, ResultType: 'simple',\n });\n this.Details = (result.Success ? (result.Results ?? []) : []).map((d) => ({\n RecordID: d.RecordID, Status: d.Status, Changes: parseAppliedRunDetailChanges(d.ResultPayload), ErrorMessage: d.ErrorMessage,\n }));\n this.DetailLoading = false;\n this.cdr.detectChanges();\n }\n\n backToList(): void {\n this.Mode = 'list';\n this.OpenRunRow = null;\n this.cdr.detectChanges();\n if (this.pendingReload) {\n this.pendingReload = false;\n void this.reload(); // a run changed while we were drilled into a detail — refresh now\n }\n }\n\n fmt(value?: string | Date): string {\n if (!value) return '—';\n const d = value instanceof Date ? value : new Date(value);\n return isNaN(d.getTime()) ? String(value) : d.toLocaleString();\n }\n disp(value: unknown): string { return displayRunValue(value); }\n}\n"]}
1
+ {"version":3,"file":"record-process-history.component.js","sourceRoot":"","sources":["../../../src/lib/record-process-history/record-process-history.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Run history for Bulk Operations: every Record Process run (who/when/scope/status/counts),\n * drilling into the per-record outcome (the field diff persisted on each Process Run Detail). Read-only\n * audit surface. Generic + reusable.\n * @module @memberjunction/ng-record-process-studio\n */\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, BaseEntityEvent, RunView } from '@memberjunction/core';\nimport { MJEvent, MJEventType, MJGlobal, NormalizeUUID } from '@memberjunction/global';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { ParseAppliedRunDetailChanges, DisplayRunValue, type RunDetailChange } from '../run-detail';\n\ninterface RawRun {\n ID: string; RecordProcessID: string; EntityID: string; Status: string;\n StartTime?: string | Date; SuccessCount?: number; ErrorCount?: number; SkippedCount?: number;\n TotalItemCount?: number; TriggeredBy?: string; SourceType?: string; DryRun?: boolean;\n}\ninterface RunRow extends RawRun { ProcessName: string; EntityName: string; }\n\ninterface RawDetail { RecordID: string; Status: string; ResultPayload?: string; ErrorMessage?: string; }\ninterface DetailRow { RecordID: string; Status: string; Changes: RunDetailChange[]; ErrorMessage?: string; }\n\n@Component({\n selector: 'mj-record-process-history',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MJButtonDirective],\n template: `\n @if (Mode === 'list') {\n <div class=\"rph-bar\">\n <h3 class=\"rph-title\">Run history</h3><span class=\"rph-spacer\"></span>\n <button mjButton variant=\"flat\" (click)=\"reload()\"><i class=\"fa-solid fa-arrows-rotate\"></i> Refresh</button>\n </div>\n @if (Loading) {\n <div class=\"rph-msg\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Loading…</div>\n } @else if (Runs.length === 0) {\n <div class=\"rph-msg\">No runs yet.</div>\n } @else {\n <div class=\"rph-table\">\n <div class=\"rph-tr rph-head\"><div>When</div><div>Operation</div><div>Entity</div><div>By</div><div>Status</div><div>Counts</div></div>\n @for (r of Runs; track r.ID) {\n <div class=\"rph-tr\" (click)=\"openRun(r)\">\n <div class=\"rph-sub\">{{ fmt(r.StartTime) }}</div>\n <div class=\"rph-nm\">{{ r.ProcessName }}</div>\n <div>{{ r.EntityName }}</div>\n <div class=\"rph-sub\">{{ r.TriggeredBy || '—' }}</div>\n <div><span class=\"st\" [class.ok]=\"r.Status==='Completed'\" [class.err]=\"r.Status==='Failed'\"><span class=\"dot\"></span> {{ r.Status }}</span>@if (r.DryRun) { <span class=\"dryrun\" title=\"Compute-only preview — no changes were written\">Dry Run</span> }</div>\n <div class=\"counts\">\n <span class=\"cbadge ok\">{{ r.SuccessCount || 0 }} ok</span>\n @if (r.ErrorCount) { <span class=\"cbadge err\">{{ r.ErrorCount }} err</span> }\n @if (r.SkippedCount) { <span class=\"cbadge\">{{ r.SkippedCount }} skip</span> }\n </div>\n </div>\n }\n </div>\n }\n } @else {\n <div class=\"rph-bar\">\n <button mjButton variant=\"flat\" (click)=\"backToList()\"><i class=\"fa-solid fa-arrow-left\"></i> Back</button>\n <h3 class=\"rph-title\">{{ OpenRunRow?.ProcessName }} · {{ fmt(OpenRunRow?.StartTime) }}</h3>\n @if (OpenRunRow?.DryRun) { <span class=\"dryrun\" title=\"Compute-only preview — no changes were written\">Dry Run</span> }\n </div>\n @if (DetailLoading) {\n <div class=\"rph-msg\"><i class=\"fa-solid fa-circle-notch fa-spin\"></i> Loading details…</div>\n } @else if (Details.length === 0) {\n <div class=\"rph-msg\">No per-record details recorded for this run.</div>\n } @else {\n <div class=\"rph-details\">\n @for (d of Details; track d.RecordID) {\n <div class=\"rph-detrec\">\n <div class=\"rph-detkey\">\n <span class=\"st sm\" [class.ok]=\"d.Status==='Succeeded'\" [class.err]=\"d.Status==='Failed'\" [class.muted]=\"d.Status==='Skipped'\"><span class=\"dot\"></span> {{ d.Status }}</span>\n <div class=\"rph-rk\">{{ d.RecordID }}</div>\n </div>\n <div class=\"rph-changes\">\n @for (c of d.Changes; track c.Field) {\n <div class=\"rph-chg\"><span class=\"f\">{{ c.Field }}</span>\n <span class=\"o\">{{ disp(c.OldValue) }}</span><i class=\"fa-solid fa-arrow-right-long ar\"></i><span class=\"nw\">{{ disp(c.NewValue) }}</span></div>\n }\n @if (d.ErrorMessage) { <div class=\"rph-chg err-msg\">{{ d.ErrorMessage }}</div> }\n @if (d.Changes.length === 0 && !d.ErrorMessage) { <span class=\"rph-sub\">no changes</span> }\n </div>\n </div>\n }\n </div>\n }\n }\n `,\n styles: [`\n :host{display:block;color:var(--mj-text-primary)}\n .rph-bar{display:flex;align-items:center;gap:14px;margin-bottom:16px}\n .rph-title{margin:0;font-size:16px;font-weight:700}\n .rph-spacer{flex:1}\n .rph-bar button i{margin-right:6px}\n .rph-msg{padding:36px;text-align:center;color:var(--mj-text-muted)}\n .rph-table{border:1px solid var(--mj-border-subtle);border-radius:var(--mj-radius-md,10px);overflow:hidden}\n .rph-tr{display:grid;grid-template-columns:1.3fr 1.6fr 1.2fr .9fr 1fr 1.4fr;gap:14px;align-items:center;padding:12px 16px;border-bottom:1px solid var(--mj-border-subtle);font-size:13px;cursor:pointer}\n .rph-tr:last-child{border-bottom:none}\n .rph-tr:not(.rph-head):hover{background:var(--mj-bg-surface-hover)}\n .rph-head{background:var(--mj-bg-surface-sunken);font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--mj-text-muted);font-weight:700;cursor:default}\n .rph-nm{font-weight:600}\n .rph-sub{color:var(--mj-text-muted);font-size:12px}\n .st{display:inline-flex;align-items:center;gap:7px;font-weight:600;font-size:12.5px}\n .st .dot{width:8px;height:8px;border-radius:50%;background:var(--mj-text-disabled)}\n .st.ok .dot{background:var(--mj-status-success)} .st.ok{color:var(--mj-status-success-text)}\n .st.err .dot{background:var(--mj-status-error)} .st.err{color:var(--mj-status-error-text)}\n .st.muted{color:var(--mj-text-muted)}\n .st.sm{font-size:11.5px}\n .counts{display:flex;gap:6px;flex-wrap:wrap}\n .cbadge{font-size:11px;font-weight:700;padding:2px 8px;border-radius:6px;background:var(--mj-bg-surface-sunken);color:var(--mj-text-secondary)}\n .dryrun{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:2px 7px;border-radius:6px;margin-left:6px;background:var(--mj-status-info-bg);color:var(--mj-status-info-text);border:1px solid var(--mj-status-info-border)}\n .cbadge.ok{background:var(--mj-status-success-bg);color:var(--mj-status-success-text)}\n .cbadge.err{background:var(--mj-status-error-bg);color:var(--mj-status-error-text)}\n .rph-details{border:1px solid var(--mj-border-subtle);border-radius:var(--mj-radius-md,10px);overflow:hidden;max-height:560px;overflow-y:auto}\n .rph-detrec{display:grid;grid-template-columns:200px 1fr;gap:14px;padding:11px 16px;border-bottom:1px solid var(--mj-border-subtle)}\n .rph-detrec:last-child{border-bottom:none}\n .rph-detkey{display:flex;flex-direction:column;gap:5px}\n .rph-rk{font-family:var(--mj-font-mono,monospace);font-size:11px;color:var(--mj-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n .rph-chg{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;padding:2px 0}\n .rph-chg .f{font-weight:700;min-width:120px}\n .rph-chg .o{color:var(--mj-text-muted);text-decoration:line-through}\n .rph-chg .nw{color:var(--mj-status-success-text);font-weight:600}\n .rph-chg .ar{color:var(--mj-text-disabled);font-size:11px}\n .rph-chg.err-msg{color:var(--mj-status-error-text)}\n `],\n})\nexport class RecordProcessHistoryComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n /** Optional: show runs for one Record Process only. */\n @Input() RecordProcessID: string | null = null;\n\n public Mode: 'list' | 'detail' = 'list';\n public Loading = true;\n public DetailLoading = false;\n public Runs: RunRow[] = [];\n public Details: DetailRow[] = [];\n public OpenRunRow: RunRow | null = null;\n\n /**\n * There is no RecordProcess BaseEngine to observe — Process Runs is an unbounded log table, so we don't\n * bulk-cache it. Instead we re-query on demand AND keep the list live by listening for BaseEntity save/\n * delete events on the run tables: a run started/finished anywhere (this view, the editor preview, a grid\n * runner, the scheduler) fires an event, and we debounce-reload so history never goes stale behind a run.\n */\n private eventSub?: Subscription;\n private pendingReload = false;\n private reloadTimer: ReturnType<typeof setTimeout> | null = null;\n\n async ngOnInit(): Promise<void> {\n await this.Reload();\n this.subscribeToRunChanges();\n }\n\n ngOnDestroy(): void {\n this.eventSub?.unsubscribe();\n if (this.reloadTimer) {\n clearTimeout(this.reloadTimer);\n }\n }\n\n /** Subscribe to BaseEntity events and debounce-reload whenever a Process Run (or its details) changes. */\n private subscribeToRunChanges(): void {\n this.eventSub = MJGlobal.Instance.GetEventListener(false).subscribe((event: MJEvent) => {\n if (event.event !== MJEventType.ComponentEvent || event.eventCode !== BaseEntity.BaseEventCode) {\n return;\n }\n const e = event.args as BaseEntityEvent;\n if (e.type !== 'save' && e.type !== 'delete' && e.type !== 'remote-invalidate') {\n return;\n }\n const name = e.baseEntity?.EntityInfo?.Name ?? e.entityName;\n if (name === 'MJ: Process Runs' || name === 'MJ: Process Run Details') {\n this.scheduleReload();\n }\n });\n }\n\n /** Debounce a burst of run/detail/checkpoint saves into a single reload; defer if the user is drilled into a detail. */\n private scheduleReload(): void {\n if (this.Mode !== 'list') {\n this.pendingReload = true; // refresh when they return to the list — don't yank them out of a drill-in\n return;\n }\n if (this.reloadTimer) {\n clearTimeout(this.reloadTimer);\n }\n this.reloadTimer = setTimeout(() => {\n this.reloadTimer = null;\n void this.Reload();\n }, 400);\n }\n\n async Reload(): Promise<void> {\n this.Loading = true; this.cdr.detectChanges();\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = this.RecordProcessID ? `RecordProcessID='${this.RecordProcessID}'` : '';\n const [runs, procs] = await rv.RunViews([\n {\n EntityName: 'MJ: Process Runs',\n Fields: ['ID', 'RecordProcessID', 'EntityID', 'Status', 'StartTime', 'SuccessCount', 'ErrorCount', 'SkippedCount', 'TotalItemCount', 'TriggeredBy', 'SourceType', 'DryRun'],\n ExtraFilter: filter, OrderBy: 'StartTime DESC', MaxRows: 200, ResultType: 'simple',\n },\n { EntityName: 'MJ: Record Processes', Fields: ['ID', 'Name'], ResultType: 'simple' },\n ]);\n // Normalized-UUID keys → O(1), case-safe across SQL Server (upper) / PostgreSQL (lower).\n const nameByID = new Map<string, string>();\n if (procs.Success) for (const p of procs.Results as Array<{ ID: string; Name: string }>) nameByID.set(NormalizeUUID(p.ID), p.Name);\n const rawRuns = runs.Success ? (runs.Results as RawRun[]) : [];\n this.Runs = rawRuns.map((r) => ({\n ...r,\n ProcessName: nameByID.get(NormalizeUUID(r.RecordProcessID)) ?? '(deleted)',\n EntityName: this.ProviderToUse.EntityByID(r.EntityID)?.Name ?? r.EntityID,\n }));\n this.Loading = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link Reload}. */\n async reload(): Promise<void> {\n return this.Reload();\n }\n\n async OpenRun(run: RunRow): Promise<void> {\n this.OpenRunRow = run; this.Mode = 'detail'; this.DetailLoading = true; this.Details = []; this.cdr.detectChanges();\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<RawDetail>({\n EntityName: 'MJ: Process Run Details',\n Fields: ['RecordID', 'Status', 'ResultPayload', 'ErrorMessage'],\n ExtraFilter: `ProcessRunID='${run.ID}'`, OrderBy: 'Status, RecordID', MaxRows: 1000, ResultType: 'simple',\n });\n this.Details = (result.Success ? (result.Results ?? []) : []).map((d) => ({\n RecordID: d.RecordID, Status: d.Status, Changes: ParseAppliedRunDetailChanges(d.ResultPayload), ErrorMessage: d.ErrorMessage,\n }));\n this.DetailLoading = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OpenRun}. */\n async openRun(run: RunRow): Promise<void> {\n return this.OpenRun(run);\n }\n\n BackToList(): void {\n this.Mode = 'list';\n this.OpenRunRow = null;\n this.cdr.detectChanges();\n if (this.pendingReload) {\n this.pendingReload = false;\n void this.Reload(); // a run changed while we were drilled into a detail — refresh now\n }\n }\n\n /** @deprecated Use {@link BackToList}. */\n backToList(): void {\n return this.BackToList();\n }\n\n Fmt(value?: string | Date): string {\n if (!value) return '—';\n const d = value instanceof Date ? value : new Date(value);\n return isNaN(d.getTime()) ? String(value) : d.toLocaleString();\n }\n\n /** @deprecated Use {@link Fmt}. */\n fmt(value?: string | Date): string {\n return this.Fmt(value);\n }\n Disp(value: unknown): string { return DisplayRunValue(value); }\n\n /** @deprecated Use {@link Disp}. */\n disp(value: unknown): string {\n return this.Disp(value);\n }\n}\n"]}
@@ -38,15 +38,27 @@ export declare class RecordProcessStudioComponent extends BaseAngularComponent i
38
38
  } | null;
39
39
  ngOnInit(): Promise<void>;
40
40
  get Filtered(): ProcessRow[];
41
+ Reload(): Promise<void>;
42
+ /** @deprecated Use {@link Reload}. */
41
43
  reload(): Promise<void>;
44
+ OnSearch(event: Event): void;
45
+ /** @deprecated Use {@link OnSearch}. */
42
46
  onSearch(event: Event): void;
43
47
  New(): void;
44
48
  Edit(p: ProcessRow): void;
49
+ BackToList(): void;
50
+ /** @deprecated Use {@link BackToList}. */
45
51
  backToList(): void;
52
+ OnSaved(): Promise<void>;
53
+ /** @deprecated Use {@link OnSaved}. */
46
54
  onSaved(): Promise<void>;
47
55
  /** Runs a process on demand against its default scope, via the dry-run → confirm runner. */
48
56
  Run(p: ProcessRow): void;
57
+ OnRunDone(_r: EntityActionUXResult): void;
58
+ /** @deprecated Use {@link OnRunDone}. */
49
59
  onRunDone(_r: EntityActionUXResult): void;
60
+ WorkLabel(workType: string): string;
61
+ /** @deprecated Use {@link WorkLabel}. */
50
62
  workLabel(workType: string): string;
51
63
  static ɵfac: i0.ɵɵFactoryDeclaration<RecordProcessStudioComponent, never>;
52
64
  static ɵcmp: i0.ɵɵComponentDeclaration<RecordProcessStudioComponent, "mj-record-process-studio", never, { "EntityID": { "alias": "EntityID"; "required": false; }; }, {}, never, never, true, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"record-process-studio.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-process-studio/record-process-studio.component.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAgE,MAAM,EAAU,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAA+B,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;;AAIzI,wDAAwD;AACxD,UAAU,UAAU;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAgGa,4BAA6B,SAAQ,oBAAqB,YAAW,MAAM;IACpF,OAAO,CAAC,GAAG,CAA6B;IAExC,qGAAqG;IAC5F,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAU;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAChC,OAAO,UAAQ;IACf,MAAM,SAAM;IACZ,SAAS,EAAE,UAAU,EAAE,CAAM;IAC7B,SAAS,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,qBAAqB,CAAA;KAAE,GAAG,IAAI,CAAQ;IAElF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,IAAI,QAAQ,IAAI,UAAU,EAAE,CAI3B;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB7B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAE5B,GAAG,IAAI,IAAI;IACX,IAAI,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI;IACzB,UAAU,IAAI,IAAI;IACZ,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9B,4FAA4F;IAC5F,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI;IAmBxB,SAAS,CAAC,EAAE,EAAE,oBAAoB,GAAG,IAAI;IAEzC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;yCApE1B,4BAA4B;2CAA5B,4BAA4B;CAuExC"}
1
+ {"version":3,"file":"record-process-studio.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-process-studio/record-process-studio.component.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAgE,MAAM,EAAU,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAA+B,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;;AAIzI,wDAAwD;AACxD,UAAU,UAAU;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAgGa,4BAA6B,SAAQ,oBAAqB,YAAW,MAAM;IACpF,OAAO,CAAC,GAAG,CAA6B;IAExC,qGAAqG;IAC5F,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAU;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAChC,OAAO,UAAQ;IACf,MAAM,SAAM;IACZ,SAAS,EAAE,UAAU,EAAE,CAAM;IAC7B,SAAS,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,qBAAqB,CAAA;KAAE,GAAG,IAAI,CAAQ;IAElF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,IAAI,QAAQ,IAAI,UAAU,EAAE,CAI3B;IAEK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB7B,sCAAsC;IAChC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAE5B,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAI5B,GAAG,IAAI,IAAI;IACX,IAAI,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI;IACzB,UAAU,IAAI,IAAI;IAElB,0CAA0C;IAC1C,UAAU,IAAI,IAAI;IAGZ,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9B,uCAAuC;IACjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,4FAA4F;IAC5F,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI;IAmBxB,SAAS,CAAC,EAAE,EAAE,oBAAoB,GAAG,IAAI;IAEzC,yCAAyC;IACzC,SAAS,CAAC,EAAE,EAAE,oBAAoB,GAAG,IAAI;IAIzC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAInC,yCAAyC;IACzC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;yCAlG1B,4BAA4B;2CAA5B,4BAA4B;CAqGxC"}
@@ -167,7 +167,7 @@ export class RecordProcessStudioComponent extends BaseAngularComponent {
167
167
  Processes = [];
168
168
  RunDriver = null;
169
169
  async ngOnInit() {
170
- await this.reload();
170
+ await this.Reload();
171
171
  }
172
172
  get Filtered() {
173
173
  const q = this.Search.trim().toLowerCase();
@@ -175,7 +175,7 @@ export class RecordProcessStudioComponent extends BaseAngularComponent {
175
175
  return this.Processes;
176
176
  return this.Processes.filter((p) => p.Name.toLowerCase().includes(q) || (p.Entity ?? '').toLowerCase().includes(q));
177
177
  }
178
- async reload() {
178
+ async Reload() {
179
179
  this.Loading = true;
180
180
  this.cdr.detectChanges();
181
181
  const rv = RunView.FromMetadataProvider(this.ProviderToUse);
@@ -191,11 +191,27 @@ export class RecordProcessStudioComponent extends BaseAngularComponent {
191
191
  this.Loading = false;
192
192
  this.cdr.detectChanges();
193
193
  }
194
- onSearch(event) { this.Search = event.target.value; this.cdr.detectChanges(); }
194
+ /** @deprecated Use {@link Reload}. */
195
+ async reload() {
196
+ return this.Reload();
197
+ }
198
+ OnSearch(event) { this.Search = event.target.value; this.cdr.detectChanges(); }
199
+ /** @deprecated Use {@link OnSearch}. */
200
+ onSearch(event) {
201
+ return this.OnSearch(event);
202
+ }
195
203
  New() { this.EditingID = null; this.Mode = 'edit'; this.cdr.detectChanges(); }
196
204
  Edit(p) { this.EditingID = p.ID; this.Mode = 'edit'; this.cdr.detectChanges(); }
197
- backToList() { this.Mode = 'list'; this.EditingID = null; this.cdr.detectChanges(); }
198
- async onSaved() { this.backToList(); await this.reload(); }
205
+ BackToList() { this.Mode = 'list'; this.EditingID = null; this.cdr.detectChanges(); }
206
+ /** @deprecated Use {@link BackToList}. */
207
+ backToList() {
208
+ return this.BackToList();
209
+ }
210
+ async OnSaved() { this.BackToList(); await this.Reload(); }
211
+ /** @deprecated Use {@link OnSaved}. */
212
+ async onSaved() {
213
+ return this.OnSaved();
214
+ }
199
215
  /** Runs a process on demand against its default scope, via the dry-run → confirm runner. */
200
216
  Run(p) {
201
217
  const entity = this.ProviderToUse.EntityByID(p.EntityID);
@@ -216,10 +232,18 @@ export class RecordProcessStudioComponent extends BaseAngularComponent {
216
232
  };
217
233
  this.cdr.detectChanges();
218
234
  }
219
- onRunDone(_r) { this.RunDriver = null; this.cdr.detectChanges(); }
220
- workLabel(workType) {
235
+ OnRunDone(_r) { this.RunDriver = null; this.cdr.detectChanges(); }
236
+ /** @deprecated Use {@link OnRunDone}. */
237
+ onRunDone(_r) {
238
+ return this.OnRunDone(_r);
239
+ }
240
+ WorkLabel(workType) {
221
241
  return workType === 'FieldRules' ? 'Field Rules' : workType;
222
242
  }
243
+ /** @deprecated Use {@link WorkLabel}. */
244
+ workLabel(workType) {
245
+ return this.WorkLabel(workType);
246
+ }
223
247
  static ɵfac = /*@__PURE__*/ (() => { let ɵRecordProcessStudioComponent_BaseFactory; return function RecordProcessStudioComponent_Factory(__ngFactoryType__) { return (ɵRecordProcessStudioComponent_BaseFactory || (ɵRecordProcessStudioComponent_BaseFactory = i0.ɵɵgetInheritedFactory(RecordProcessStudioComponent)))(__ngFactoryType__ || RecordProcessStudioComponent); }; })();
224
248
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RecordProcessStudioComponent, selectors: [["mj-record-process-studio"]], inputs: { EntityID: "EntityID" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 2, consts: [[3, "DriverClass", "Context"], [1, "rps-bar"], [1, "rps-search"], [1, "fa-solid", "fa-magnifying-glass"], ["placeholder", "Search bulk operations\u2026", 1, "mj-input", 3, "input", "value"], [1, "rps-spacer"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "fa-solid", "fa-arrows-rotate"], ["mjButton", "", "variant", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "rps-msg"], ["Icon", "fa-solid fa-list-check", "Title", "No bulk operations yet", "ActionText", "Create one", "ActionIcon", "fa-solid fa-plus", 1, "rps-empty"], [1, "rps-table"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], ["Icon", "fa-solid fa-list-check", "Title", "No bulk operations yet", "ActionText", "Create one", "ActionIcon", "fa-solid fa-plus", 1, "rps-empty", 3, "Action"], [1, "rps-tr", "rps-head"], [1, "ta-r"], [1, "rps-tr"], [1, "rps-tr", 3, "click"], [1, "rps-nm"], [1, "rps-sub"], [1, "pill", "purple"], [1, "pill"], [1, "ta-r", "rps-acts", 3, "click"], ["title", "Run", 1, "iconbtn", "run", 3, "click"], [1, "fa-solid", "fa-play"], ["title", "Edit", 1, "iconbtn", 3, "click"], [1, "fa-solid", "fa-pen"], [1, "rps-editbar"], [1, "fa-solid", "fa-arrow-left"], [3, "Saved", "Cancelled", "RecordProcessID", "DefaultEntityID", "Provider"], [3, "Completed", "Cancelled", "DriverClass", "Context"]], template: function RecordProcessStudioComponent_Template(rf, ctx) { if (rf & 1) {
225
249
  i0.ɵɵconditionalCreate(0, RecordProcessStudioComponent_Conditional_0_Template, 14, 2)(1, RecordProcessStudioComponent_Conditional_1_Template, 7, 4);