@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.
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.d.ts +211 -11
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.d.ts.map +1 -1
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.js +1639 -400
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.js.map +1 -1
- package/dist/lib/record-process-editor/record-process-editor.component.d.ts +10 -0
- package/dist/lib/record-process-editor/record-process-editor.component.d.ts.map +1 -1
- package/dist/lib/record-process-editor/record-process-editor.component.js +25 -5
- package/dist/lib/record-process-editor/record-process-editor.component.js.map +1 -1
- package/dist/lib/record-process-history/record-process-history.component.d.ts +10 -0
- package/dist/lib/record-process-history/record-process-history.component.d.ts.map +1 -1
- package/dist/lib/record-process-history/record-process-history.component.js +30 -10
- package/dist/lib/record-process-history/record-process-history.component.js.map +1 -1
- package/dist/lib/record-process-studio/record-process-studio.component.d.ts +12 -0
- package/dist/lib/record-process-studio/record-process-studio.component.d.ts.map +1 -1
- package/dist/lib/record-process-studio/record-process-studio.component.js +31 -7
- package/dist/lib/record-process-studio/record-process-studio.component.js.map +1 -1
- package/dist/lib/run-detail.d.ts +4 -0
- package/dist/lib/run-detail.d.ts.map +1 -1
- package/dist/lib/run-detail.js +10 -2
- package/dist/lib/run-detail.js.map +1 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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 {
|
|
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.
|
|
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.
|
|
312
|
+
void this.Reload();
|
|
313
313
|
}, 400);
|
|
314
314
|
}
|
|
315
|
-
async
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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.
|
|
374
|
+
void this.Reload(); // a run changed while we were drilled into a detail — refresh now
|
|
367
375
|
}
|
|
368
376
|
}
|
|
369
|
-
|
|
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
|
-
|
|
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;
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
198
|
-
|
|
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
|
-
|
|
220
|
-
|
|
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);
|