@memberjunction/ng-record-process-studio 6.1.3 → 6.2.0-edge.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.d.ts +73 -0
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.d.ts.map +1 -0
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.js +1220 -0
- package/dist/lib/feature-pipeline-builder/feature-pipeline-builder.component.js.map +1 -0
- package/dist/lib/record-process-editor/record-process-editor.component.d.ts +9 -1
- 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 +149 -49
- package/dist/lib/record-process-editor/record-process-editor.component.js.map +1 -1
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +10 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-pipeline-builder.component.js","sourceRoot":"","sources":["../../../src/lib/feature-pipeline-builder/feature-pipeline-builder.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Visual authoring component for a Feature Pipeline (Infer Record Process).\n * Configures the DataFeatureSpec (Context, Outputs & Constraints, Caching) and binds\n * prompt, output mapping, and watermark strategy directly on the MJRecordProcessEntity.\n *\n * @module @memberjunction/ng-record-process-studio\n */\n\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { EntityInfo, EntityFieldInfo, LogError, RunView, UserInfo } from '@memberjunction/core';\nimport { MJRecordProcessEntity, MJAIPromptEntity, MJEntityDocumentEntity } from '@memberjunction/core-entities';\nimport {\n DataFeatureSpec,\n DataFeatureOutput,\n ValueConstraint,\n OutputTarget,\n ViolationPolicy,\n renderConstraintBlock,\n validateSpec,\n type SpecValidationIssue,\n type EntityMetadataStub,\n} from '@memberjunction/feature-pipelines';\nimport { SafeJSONParse, UUIDsEqual } from '@memberjunction/global';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\n\nexport type PromptOption = Pick<MJAIPromptEntity, 'ID' | 'Name' | 'Description'>;\n\nexport type EntityDocOption = Pick<MJEntityDocumentEntity, 'ID' | 'Name' | 'EntityID'>;\n\n@Component({\n selector: 'mj-feature-pipeline-builder',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, MJButtonDirective],\n template: `\n <div class=\"fpb\">\n <!-- STAGE 1: CONTEXT SOURCE -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\">\n <span class=\"num\">1</span>\n <h3>Context Source</h3>\n </div>\n <p class=\"rpe-desc\">Choose how data from each record is extracted and formatted before being sent to the LLM prompt.</p>\n\n <div class=\"rpe-grid3\">\n <div class=\"field\">\n <label>Context Mode</label>\n <select class=\"mj-input\" [value]=\"contextMode\" (change)=\"onContextModeChange($event)\">\n <option value=\"fields\">Record Fields</option>\n <option value=\"document\">Entity Document (Template)</option>\n <option value=\"query\">Query (Graph Traversal)</option>\n </select>\n </div>\n\n @if (contextMode === 'document') {\n <div class=\"field\">\n <label>Entity Document</label>\n <select class=\"mj-input\" [value]=\"spec.Context.EntityDocumentID || ''\" (change)=\"onEntityDocChange($event)\">\n <option value=\"\" disabled>— Select Entity Document —</option>\n @for (doc of availableDocs; track doc.ID) {\n <option [value]=\"doc.ID\">{{ doc.Name }}</option>\n }\n </select>\n </div>\n }\n\n @if (contextMode === 'query') {\n <div class=\"field\">\n <label>Query ID</label>\n <input class=\"mj-input mono\" [value]=\"spec.Context.QueryID || ''\" (input)=\"onQueryIDChange($event)\" placeholder=\"UUID of approved Query\">\n </div>\n }\n\n <div class=\"field\">\n <label>Field Filter (optional)</label>\n <input class=\"mj-input\" [value]=\"fieldsCsv\" (input)=\"onFieldsCsvChange($event)\" placeholder=\"e.g. FirstName, LastName, Title\">\n </div>\n </div>\n </section>\n\n <!-- STAGE 2: PROMPT & INJECTED CONSTRAINTS -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\">\n <span class=\"num\">2</span>\n <h3>AI Prompt</h3>\n </div>\n <div class=\"rpe-grid2\">\n <div class=\"field\">\n <label>Prompt</label>\n <select class=\"mj-input\" [value]=\"Record?.PromptID || ''\" (change)=\"onPromptChange($event)\">\n <option value=\"\" disabled>— Select AI Prompt —</option>\n @for (p of availablePrompts; track p.ID) {\n <option [value]=\"p.ID\">{{ p.Name }}</option>\n }\n </select>\n </div>\n @if (selectedPrompt) {\n <div class=\"field\">\n <label>Prompt Description</label>\n <div class=\"rpe-static-text\">{{ selectedPrompt.Description || 'No description provided' }}</div>\n </div>\n }\n </div>\n\n @if (renderedConstraintPreview) {\n <div class=\"field rpe-mt\">\n <label>Injected Constraint Block <span class=\"muted\">— automatically appended to prompt instructions</span></label>\n <pre class=\"fpb-code-preview\">{{ renderedConstraintPreview }}</pre>\n </div>\n }\n </section>\n\n <!-- STAGE 3: OUTPUTS & CONSTRAINTS -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h fpb-split-h\">\n <div class=\"fpb-title-group\">\n <span class=\"num\">3</span>\n <h3>Outputs & Constraints</h3>\n </div>\n <button mjButton size=\"sm\" variant=\"secondary\" (click)=\"addOutput()\">\n <i class=\"fa-solid fa-plus\"></i> Add Output\n </button>\n </div>\n <p class=\"rpe-desc\">Define the structured outputs produced by the LLM, their type constraints, and target write-back destinations.</p>\n\n @if (!spec.Outputs || spec.Outputs.length === 0) {\n <div class=\"fpb-empty-outputs\">\n <i class=\"fa-solid fa-arrow-turn-up\"></i>\n <span>No outputs defined. Click <strong>Add Output</strong> to configure at least one output attribute.</span>\n </div>\n } @else {\n <div class=\"fpb-outputs-list\">\n @for (output of spec.Outputs; track $index) {\n <div class=\"fpb-output-card\">\n <div class=\"fpb-output-head\">\n <h4>Output #{{ $index + 1 }}: {{ output.Name || '(unnamed)' }}</h4>\n <button mjButton size=\"sm\" variant=\"flat\" (click)=\"removeOutput($index)\">\n <i class=\"fa-solid fa-trash\"></i> Remove\n </button>\n </div>\n\n <div class=\"rpe-grid3\">\n <div class=\"field\">\n <label>Output Name</label>\n <input class=\"mj-input\" [value]=\"output.Name\" (input)=\"updateOutputProp($index, 'Name', $event)\" placeholder=\"e.g. SentimentScore\">\n </div>\n <div class=\"field\">\n <label>JSON Path / Ref</label>\n <input class=\"mj-input mono\" [value]=\"output.Ref\" (input)=\"updateOutputProp($index, 'Ref', $event)\" placeholder=\"e.g. $.sentiment or $\">\n </div>\n <div class=\"field\">\n <label>Target Mode</label>\n <select class=\"mj-input\" [value]=\"output.Target.Mode\" (change)=\"updateTargetMode($index, $event)\">\n <option value=\"field\">Entity Column (field)</option>\n <option value=\"child\">Child Rows (child)</option>\n <option value=\"tags\">Taxonomy Tags (tags)</option>\n </select>\n </div>\n </div>\n\n <!-- Target details -->\n <div class=\"rpe-grid3 rpe-mt\">\n @if (output.Target.Mode === 'field') {\n <div class=\"field\">\n <label>Target Field</label>\n <select class=\"mj-input\" [value]=\"output.Target.EntityFieldName\" (change)=\"updateFieldTarget($index, $event)\">\n <option value=\"\" disabled>— Select Column —</option>\n @for (f of entityFields; track f.Name) {\n <option [value]=\"f.Name\">{{ f.DisplayName || f.Name }} ({{ f.TSType }})</option>\n }\n </select>\n </div>\n }\n\n @if (output.Target.Mode === 'child') {\n <div class=\"field\">\n <label>Child Entity</label>\n <select class=\"mj-input\" [value]=\"output.Target.EntityName\" (change)=\"updateChildTargetEntity($index, $event)\">\n <option value=\"\" disabled>— Select Entity —</option>\n @for (e of availableEntities; track e.ID) {\n <option [value]=\"e.Name\">{{ e.DisplayName || e.Name }}</option>\n }\n </select>\n </div>\n }\n\n <!-- Constraint details -->\n <div class=\"field\">\n <label>Constraint Type</label>\n <select class=\"mj-input\" [value]=\"output.Constraint?.Type || 'none'\" (change)=\"updateConstraintType($index, $event)\">\n <option value=\"none\">None / Unconstrained</option>\n <option value=\"enum\">Enum (Allowed Values)</option>\n <option value=\"numeric\">Numeric (Min/Max)</option>\n <option value=\"boolean\">Boolean</option>\n <option value=\"freetext\">Free Text</option>\n </select>\n </div>\n\n @if (output.Constraint) {\n <div class=\"field\">\n <label>Violation Policy</label>\n <select class=\"mj-input\" [value]=\"output.Constraint.OnViolation || 'fail'\" (change)=\"updateViolationPolicy($index, $event)\">\n <option value=\"fail\">Fail Row</option>\n <option value=\"null\">Set Output to Null</option>\n <option value=\"coerce-to-other\">Coerce / Fallback</option>\n </select>\n </div>\n }\n </div>\n\n <!-- Constraint params -->\n @if (output.Constraint?.Type === 'enum') {\n <div class=\"field rpe-mt\">\n <label>Allowed Values (comma separated)</label>\n <input class=\"mj-input\" [value]=\"getEnumValuesCsv(output.Constraint)\" (input)=\"updateEnumValues($index, $event)\" placeholder=\"e.g. Positive, Neutral, Negative\">\n </div>\n }\n @if (output.Constraint?.Type === 'numeric') {\n <div class=\"rpe-grid2 rpe-mt\">\n <div class=\"field\">\n <label>Min Value</label>\n <input class=\"mj-input\" type=\"number\" [value]=\"getNumericMin(output.Constraint)\" (input)=\"updateNumericMin($index, $event)\">\n </div>\n <div class=\"field\">\n <label>Max Value</label>\n <input class=\"mj-input\" type=\"number\" [value]=\"getNumericMax(output.Constraint)\" (input)=\"updateNumericMax($index, $event)\">\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </section>\n\n <!-- STAGE 4: MATERIALIZATION & WATERMARK -->\n <section class=\"rpe-sec\">\n <div class=\"rpe-sec-h\">\n <span class=\"num\">4</span>\n <h3>Caching & Watermarks</h3>\n </div>\n <div class=\"rpe-grid3\">\n <div class=\"field\">\n <label>Watermark Strategy</label>\n <select class=\"mj-input\" [value]=\"Record?.WatermarkStrategy || 'Checksum'\" (change)=\"updateWatermarkStrategy($event)\">\n <option value=\"Checksum\">Checksum (Content Hash + Prompt Hash)</option>\n <option value=\"UpdatedAt\">UpdatedAt (Compare modified timestamp)</option>\n <option value=\"None\">None (Always process all records)</option>\n </select>\n </div>\n\n <div class=\"field\">\n <label>Skip Unchanged Records</label>\n <select class=\"mj-input\" [value]=\"Record?.SkipUnchanged ? 'true' : 'false'\" (change)=\"updateSkipUnchanged($event)\">\n <option value=\"true\">Yes — Skip unchanged rows</option>\n <option value=\"false\">No — Recompute every time</option>\n </select>\n </div>\n\n <div class=\"field\">\n <label>Enable Result Cache</label>\n <select class=\"mj-input\" [value]=\"spec.Caching.Cacheable ? 'true' : 'false'\" (change)=\"updateCacheable($event)\">\n <option value=\"true\">Yes — Cache outputs by distinct key</option>\n <option value=\"false\">No — Compute per row</option>\n </select>\n </div>\n </div>\n\n @if (spec.Caching.Cacheable) {\n <div class=\"rpe-grid3 rpe-mt\">\n <div class=\"field\">\n <label>Cache Key Fields (comma separated)</label>\n <input class=\"mj-input\" [value]=\"cacheKeyFieldsCsv\" (input)=\"updateCacheKeyFields($event)\" placeholder=\"e.g. CurrentJobTitle\">\n </div>\n <div class=\"field\">\n <label>Cache TTL (Seconds)</label>\n <input class=\"mj-input\" type=\"number\" [value]=\"spec.Caching.TTLSeconds ?? 86400\" (input)=\"updateCacheTTL($event)\">\n </div>\n <div class=\"field\">\n <label>Cache Scope</label>\n <select class=\"mj-input\" [value]=\"spec.Caching.Scope || 'pipeline'\" (change)=\"updateCacheScope($event)\">\n <option value=\"pipeline\">Pipeline (Isolated to this process)</option>\n <option value=\"prompt\">Prompt (Shared across processes with same prompt)</option>\n </select>\n </div>\n </div>\n }\n </section>\n\n <!-- VALIDATION ISSUES -->\n @if (validationErrors.length > 0) {\n <div class=\"fpb-issues-card fpb-issues-card--error\">\n <h4><i class=\"fa-solid fa-triangle-exclamation\"></i> Specification Issues</h4>\n <ul>\n @for (issue of validationErrors; track $index) {\n <li><strong>{{ issue.Field ? issue.Field + ': ' : '' }}</strong>{{ issue.Message }} @if (issue.FixRecommendation) { <span class=\"muted\">(Fix: {{ issue.FixRecommendation }})</span> }</li>\n }\n </ul>\n </div>\n }\n </div>\n `,\n styles: [`\n .fpb { display: flex; flex-direction: column; gap: 20px; }\n .rpe-desc { font-size: 13px; color: var(--mj-text-secondary); margin: -6px 0 16px 0; }\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: 14px; }\n .rpe-sec-h h3 { margin: 0; font-size: 16px; font-weight: 700; color: var(--mj-text-primary); }\n .rpe-sec-h .num { width: 24px; height: 24px; border-radius: 50%; background: var(--mj-brand-primary); color: #fff; display: grid; place-items: center; font-size: 12px; font-weight: 800; }\n .fpb-split-h { justify-content: space-between; }\n .fpb-title-group { display: flex; align-items: center; gap: 11px; }\n .rpe-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n .rpe-grid3 { display: grid; grid-template-columns: 1fr 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: 14px; }\n .mono { font-family: monospace; font-size: 12.5px; }\n .muted { color: var(--mj-text-muted); font-weight: 400; }\n .rpe-static-text { font-size: 13px; color: var(--mj-text-muted); padding: 7px 0; }\n .fpb-code-preview { background: var(--mj-bg-surface-sunken, #0f172a); color: var(--mj-text-code, var(--mj-text-primary, #e2e8f0)); border: 1px solid var(--mj-border-subtle, #334155); padding: 12px; border-radius: 6px; font-size: 12px; font-family: var(--mj-font-mono, monospace); white-space: pre-wrap; word-break: break-word; max-height: 160px; overflow-y: auto; margin: 0; }\n .fpb-empty-outputs { display: flex; align-items: center; gap: 10px; padding: 20px; border: 1px dashed var(--mj-border-subtle); border-radius: 8px; color: var(--mj-text-muted); font-size: 13px; }\n .fpb-outputs-list { display: flex; flex-direction: column; gap: 16px; }\n .fpb-output-card { border: 1px solid var(--mj-border-subtle); border-radius: 8px; padding: 14px 16px; background: var(--mj-bg-surface); }\n .fpb-output-head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; border-bottom: 1px solid var(--mj-border-subtle); padding-bottom: 8px; }\n .fpb-output-head h4 { margin: 0; font-size: 14px; font-weight: 600; }\n .fpb-issues-card { border-radius: 8px; padding: 12px 16px; font-size: 13px; }\n .fpb-issues-card--error { background: rgba(239, 68, 68, 0.08); border: 1px solid var(--mj-status-error); color: var(--mj-status-error-text); }\n .fpb-issues-card h4 { margin: 0 0 8px 0; font-size: 14px; display: flex; align-items: center; gap: 8px; }\n .fpb-issues-card ul { margin: 0; padding-left: 20px; }\n `],\n})\nexport class FeaturePipelineBuilderComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() Record: MJRecordProcessEntity | null = null;\n @Input() EntityID: string | null = null;\n\n @Output() SpecChange = new EventEmitter<DataFeatureSpec>();\n @Output() ValidChange = new EventEmitter<boolean>();\n\n public spec: DataFeatureSpec = {\n Name: '',\n Description: '',\n PromptID: '',\n Context: {},\n Outputs: [],\n Caching: { Cacheable: false },\n };\n\n public availablePrompts: PromptOption[] = [];\n public availableDocs: EntityDocOption[] = [];\n public availableEntities: EntityInfo[] = [];\n public entityFields: EntityFieldInfo[] = [];\n public selectedPrompt: PromptOption | null = null;\n\n public contextMode: 'fields' | 'document' | 'query' = 'fields';\n public fieldsCsv = '';\n public cacheKeyFieldsCsv = '';\n public validationErrors: SpecValidationIssue[] = [];\n public renderedConstraintPreview = '';\n\n async ngOnInit(): Promise<void> {\n this.availableEntities = [...this.ProviderToUse.Entities].sort((a, b) =>\n (a.DisplayName || a.Name).localeCompare(b.DisplayName || b.Name)\n );\n await this.loadPrompts();\n await this.loadEntityDocs();\n this.syncFromRecord();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Record'] || changes['EntityID']) {\n this.syncFromRecord();\n }\n }\n\n public syncFromRecord(): void {\n if (this.Record) {\n this.spec.Name = this.Record.Name || '';\n this.spec.Description = this.Record.Description || '';\n this.spec.PromptID = this.Record.PromptID || '';\n\n if (this.Record.Configuration) {\n const parsed = SafeJSONParse<DataFeatureSpec>(this.Record.Configuration);\n if (parsed && typeof parsed === 'object') {\n this.spec.Outputs = Array.isArray(parsed.Outputs) ? parsed.Outputs : [];\n this.spec.Context = parsed.Context ?? {};\n this.spec.Caching = parsed.Caching ?? { Cacheable: false };\n this.spec.ProcessorExtensionKey = parsed.ProcessorExtensionKey;\n }\n }\n }\n\n if (!this.spec.Outputs) {\n this.spec.Outputs = [];\n }\n if (!this.spec.Context) {\n this.spec.Context = {};\n }\n\n if (this.spec.Context.EntityDocumentID) {\n this.contextMode = 'document';\n } else if (this.spec.Context.QueryID) {\n this.contextMode = 'query';\n } else {\n this.contextMode = 'fields';\n }\n\n this.fieldsCsv = (this.spec.Context.Fields ?? []).join(', ');\n this.cacheKeyFieldsCsv = (this.spec.Caching.KeyFields ?? []).join(', ');\n\n const targetEntityID = this.Record?.EntityID || this.EntityID;\n if (targetEntityID) {\n const entity = this.ProviderToUse.EntityByID(targetEntityID);\n this.entityFields = entity?.Fields ? [...entity.Fields].sort((a, b) => a.Name.localeCompare(b.Name)) : [];\n } else {\n this.entityFields = [];\n }\n\n if (this.Record?.PromptID) {\n this.selectedPrompt = this.availablePrompts.find((p) => UUIDsEqual(p.ID, this.Record?.PromptID)) ?? null;\n }\n\n this.recomputeValidation();\n this.cdr.detectChanges();\n }\n\n private async loadPrompts(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<PromptOption>({\n EntityName: 'MJ: AI Prompts',\n Fields: ['ID', 'Name', 'Description'],\n ResultType: 'simple',\n });\n if (res.Success && Array.isArray(res.Results)) {\n this.availablePrompts = res.Results;\n } else {\n this.availablePrompts = [];\n LogError(`Failed to load AI Prompts: ${res.ErrorMessage || 'unknown error'}`);\n }\n } catch (error) {\n this.availablePrompts = [];\n LogError('Error loading AI Prompts', undefined, error);\n }\n }\n\n private async loadEntityDocs(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const res = await rv.RunView<EntityDocOption>({\n EntityName: 'MJ: Entity Documents',\n Fields: ['ID', 'Name', 'EntityID'],\n ResultType: 'simple',\n });\n if (res.Success && Array.isArray(res.Results)) {\n this.availableDocs = res.Results;\n } else {\n this.availableDocs = [];\n LogError(`Failed to load Entity Documents: ${res.ErrorMessage || 'unknown error'}`);\n }\n } catch (error) {\n this.availableDocs = [];\n LogError('Error loading Entity Documents', undefined, error);\n }\n }\n\n public onContextModeChange(event: Event): void {\n this.contextMode = (event.target as HTMLSelectElement).value as 'fields' | 'document' | 'query';\n if (!this.spec.Context) this.spec.Context = {};\n if (this.contextMode === 'fields') {\n this.spec.Context.EntityDocumentID = undefined;\n this.spec.Context.QueryID = undefined;\n } else if (this.contextMode === 'document') {\n this.spec.Context.QueryID = undefined;\n } else if (this.contextMode === 'query') {\n this.spec.Context.EntityDocumentID = undefined;\n }\n this.emitChanges();\n }\n\n public onEntityDocChange(event: Event): void {\n if (!this.spec.Context) this.spec.Context = {};\n this.spec.Context.EntityDocumentID = (event.target as HTMLSelectElement).value;\n this.emitChanges();\n }\n\n public onQueryIDChange(event: Event): void {\n if (!this.spec.Context) this.spec.Context = {};\n this.spec.Context.QueryID = (event.target as HTMLInputElement).value;\n this.emitChanges();\n }\n\n public onFieldsCsvChange(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.fieldsCsv = val;\n if (!this.spec.Context) this.spec.Context = {};\n this.spec.Context.Fields = val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n this.emitChanges();\n }\n\n public onPromptChange(event: Event): void {\n const promptID = (event.target as HTMLSelectElement).value;\n if (this.Record) {\n this.Record.PromptID = promptID;\n }\n this.spec.PromptID = promptID;\n this.selectedPrompt = this.availablePrompts.find((p) => UUIDsEqual(p.ID, promptID)) ?? null;\n this.emitChanges();\n }\n\n public addOutput(): void {\n const newOutput: DataFeatureOutput = {\n Name: `Output_${this.spec.Outputs.length + 1}`,\n Ref: '$',\n Target: {\n Mode: 'field',\n EntityFieldName: this.entityFields.length > 0 ? this.entityFields[0].Name : '',\n },\n };\n this.spec.Outputs.push(newOutput);\n this.emitChanges();\n }\n\n public removeOutput(index: number): void {\n this.spec.Outputs.splice(index, 1);\n this.emitChanges();\n }\n\n public updateOutputProp(index: number, prop: 'Name' | 'Ref', event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.spec.Outputs[index][prop] = val;\n this.emitChanges();\n }\n\n public updateTargetMode(index: number, event: Event): void {\n const mode = (event.target as HTMLSelectElement).value as OutputTarget['Mode'];\n const current = this.spec.Outputs[index];\n if (mode === 'field') {\n current.Target = {\n Mode: 'field',\n EntityFieldName: this.entityFields.length > 0 ? this.entityFields[0].Name : '',\n };\n } else if (mode === 'child') {\n current.Target = {\n Mode: 'child',\n EntityName: this.availableEntities.length > 0 ? this.availableEntities[0].Name : '',\n ParentField: 'ParentID',\n Map: {},\n };\n } else if (mode === 'tags') {\n current.Target = {\n Mode: 'tags',\n RootTagID: '',\n };\n }\n this.emitChanges();\n }\n\n public updateFieldTarget(index: number, event: Event): void {\n const fieldName = (event.target as HTMLSelectElement).value;\n const target = this.spec.Outputs[index].Target;\n if (target.Mode === 'field') {\n target.EntityFieldName = fieldName;\n }\n this.emitChanges();\n }\n\n public updateChildTargetEntity(index: number, event: Event): void {\n const entityName = (event.target as HTMLSelectElement).value;\n const target = this.spec.Outputs[index].Target;\n if (target.Mode === 'child') {\n target.EntityName = entityName;\n }\n this.emitChanges();\n }\n\n public updateConstraintType(index: number, event: Event): void {\n const type = (event.target as HTMLSelectElement).value;\n const output = this.spec.Outputs[index];\n if (type === 'none') {\n output.Constraint = undefined;\n } else if (type === 'enum') {\n output.Constraint = { Type: 'enum', Values: [], OnViolation: 'fail' };\n } else if (type === 'numeric') {\n output.Constraint = { Type: 'numeric', Min: 0, Max: 100, OnViolation: 'fail' };\n } else if (type === 'boolean') {\n output.Constraint = { Type: 'boolean', OnViolation: 'fail' };\n } else if (type === 'freetext') {\n output.Constraint = { Type: 'freetext', MaxLength: 500, OnViolation: 'fail' };\n }\n this.emitChanges();\n }\n\n public updateViolationPolicy(index: number, event: Event): void {\n const policy = (event.target as HTMLSelectElement).value as ViolationPolicy;\n if (this.spec.Outputs[index].Constraint) {\n this.spec.Outputs[index].Constraint.OnViolation = policy;\n }\n this.emitChanges();\n }\n\n public getEnumValuesCsv(constraint?: ValueConstraint): string {\n if (!constraint || constraint.Type !== 'enum' || !Array.isArray(constraint.Values)) {\n return '';\n }\n return constraint.Values.join(', ');\n }\n\n public getNumericMin(constraint?: ValueConstraint): number | string {\n return constraint && constraint.Type === 'numeric' && constraint.Min !== undefined ? constraint.Min : '';\n }\n\n public getNumericMax(constraint?: ValueConstraint): number | string {\n return constraint && constraint.Type === 'numeric' && constraint.Max !== undefined ? constraint.Max : '';\n }\n\n public updateEnumValues(index: number, event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n const output = this.spec.Outputs[index];\n if (!output.Constraint || output.Constraint.Type !== 'enum') {\n output.Constraint = { Type: 'enum', Values: [], OnViolation: 'fail' };\n }\n output.Constraint.Values = val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n this.emitChanges();\n }\n\n public updateNumericMin(index: number, event: Event): void {\n const val = parseFloat((event.target as HTMLInputElement).value);\n const output = this.spec.Outputs[index];\n if (output.Constraint && output.Constraint.Type === 'numeric') {\n output.Constraint.Min = isNaN(val) ? undefined : val;\n }\n this.emitChanges();\n }\n\n public updateNumericMax(index: number, event: Event): void {\n const val = parseFloat((event.target as HTMLInputElement).value);\n const output = this.spec.Outputs[index];\n if (output.Constraint && output.Constraint.Type === 'numeric') {\n output.Constraint.Max = isNaN(val) ? undefined : val;\n }\n this.emitChanges();\n }\n\n public updateWatermarkStrategy(event: Event): void {\n if (this.Record) {\n this.Record.WatermarkStrategy = (event.target as HTMLSelectElement).value as MJRecordProcessEntity['WatermarkStrategy'];\n }\n }\n\n public updateSkipUnchanged(event: Event): void {\n if (this.Record) {\n this.Record.SkipUnchanged = (event.target as HTMLSelectElement).value === 'true';\n }\n }\n\n public updateCacheable(event: Event): void {\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: false };\n this.spec.Caching.Cacheable = (event.target as HTMLSelectElement).value === 'true';\n this.emitChanges();\n }\n\n public updateCacheKeyFields(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.cacheKeyFieldsCsv = val;\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: true };\n this.spec.Caching.KeyFields = val\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n this.emitChanges();\n }\n\n public updateCacheTTL(event: Event): void {\n const val = parseInt((event.target as HTMLInputElement).value, 10);\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: true };\n this.spec.Caching.TTLSeconds = isNaN(val) ? 86400 : val;\n this.emitChanges();\n }\n\n public updateCacheScope(event: Event): void {\n const val = (event.target as HTMLSelectElement).value as 'pipeline' | 'prompt';\n if (!this.spec.Caching) this.spec.Caching = { Cacheable: true };\n this.spec.Caching.Scope = val;\n this.emitChanges();\n }\n\n private emitChanges(): void {\n if (this.Record) {\n this.spec.Name = this.Record.Name || '';\n this.spec.Description = this.Record.Description || '';\n this.spec.PromptID = this.Record.PromptID || '';\n this.Record.Configuration = JSON.stringify(this.spec);\n this.syncOutputMappingToRecord();\n }\n this.recomputeValidation();\n this.SpecChange.emit(this.spec);\n this.cdr.detectChanges();\n }\n\n /**\n * Automatically projects spec.Outputs into the record's OutputMapping JSON\n * so that WriteBackProcessor works out of the box without duplicate manual config.\n */\n private syncOutputMappingToRecord(): void {\n if (!this.Record) return;\n const fields: Record<string, string> = Object.create(null);\n for (const out of this.spec.Outputs) {\n if (out.Target.Mode === 'field' && out.Target.EntityFieldName) {\n fields[out.Target.EntityFieldName] = out.Ref;\n }\n }\n this.Record.OutputMapping = JSON.stringify({ fields });\n }\n\n private recomputeValidation(): void {\n this.renderedConstraintPreview = renderConstraintBlock(this.spec.Outputs);\n const entity = this.Record?.EntityID ? this.ProviderToUse.EntityByID(this.Record.EntityID) : null;\n if (entity) {\n const stub: EntityMetadataStub = {\n Name: entity.Name,\n Fields: (entity.Fields ?? []).map((f) => ({\n Name: f.Name,\n TSType: f.TSType,\n IsVirtual: f.IsVirtual,\n AllowsNull: f.AllowsNull,\n RelatedEntity: f.RelatedEntity,\n RelatedEntityID: f.RelatedEntityID,\n EntityFieldValues: f.EntityFieldValues ? f.EntityFieldValues.map((v) => ({ Value: v.Value, Code: v.Code })) : undefined,\n })),\n };\n this.validationErrors = validateSpec(this.spec, stub);\n } else {\n this.validationErrors = this.spec.Outputs.length === 0\n ? [{\n Path: 'Outputs',\n Severity: 'error',\n Message: 'At least one output attribute must be configured',\n FixRecommendation: 'Click Add Output to configure an output attribute',\n }]\n : [];\n }\n const hasErrors = this.validationErrors.some((i) => i.Severity === 'error');\n this.ValidChange.emit(!hasErrors);\n }\n}\n"]}
|
|
@@ -14,6 +14,7 @@ import { type EntityInfo } from '@memberjunction/core';
|
|
|
14
14
|
import { type FieldRuleSet } from '@memberjunction/global';
|
|
15
15
|
import { MJRecordProcessEntity } from '@memberjunction/core-entities';
|
|
16
16
|
import { type EntityActionUXContext, type EntityActionUXResult } from '@memberjunction/ng-entity-action-ux';
|
|
17
|
+
import { type DataFeatureSpec } from '@memberjunction/feature-pipelines';
|
|
17
18
|
import * as i0 from "@angular/core";
|
|
18
19
|
export declare class RecordProcessEditorComponent extends BaseAngularComponent implements OnInit {
|
|
19
20
|
private cdr;
|
|
@@ -23,6 +24,10 @@ export declare class RecordProcessEditorComponent extends BaseAngularComponent i
|
|
|
23
24
|
RecordProcessID: string | null;
|
|
24
25
|
/** Default EntityID for a brand-new process (e.g. the grid the user came from). */
|
|
25
26
|
DefaultEntityID: string | null;
|
|
27
|
+
/** Default WorkType for a brand-new process (e.g. 'Infer' when opened from Feature Pipelines). */
|
|
28
|
+
DefaultWorkType: MJRecordProcessEntity['WorkType'] | null;
|
|
29
|
+
/** Default CategoryID for a brand-new process (e.g. Feature Pipeline category ID). */
|
|
30
|
+
DefaultCategoryID: string | null;
|
|
26
31
|
/** Show the built-in Save / Preview / Cancel toolbar. Set false when an outer form owns Save. */
|
|
27
32
|
ShowToolbar: boolean;
|
|
28
33
|
/** Emitted after a successful Save (the persisted record). */
|
|
@@ -33,6 +38,8 @@ export declare class RecordProcessEditorComponent extends BaseAngularComponent i
|
|
|
33
38
|
SelectedEntityName: string;
|
|
34
39
|
RuleSet: FieldRuleSet;
|
|
35
40
|
RulesValid: boolean;
|
|
41
|
+
FeaturePipelineValid: boolean;
|
|
42
|
+
FeaturePipelineSpec: DataFeatureSpec | null;
|
|
36
43
|
Saving: boolean;
|
|
37
44
|
ErrorMessage: string;
|
|
38
45
|
PreviewDriver: {
|
|
@@ -48,6 +55,7 @@ export declare class RecordProcessEditorComponent extends BaseAngularComponent i
|
|
|
48
55
|
set(field: 'Name' | 'Description' | 'Status' | 'ScopeType' | 'ScopeFilter' | 'WorkType', event: Event): void;
|
|
49
56
|
onEntityChange(event: Event): void;
|
|
50
57
|
onRulesChange(ruleSet: FieldRuleSet): void;
|
|
58
|
+
onFeaturePipelineSpecChange(spec: DataFeatureSpec): void;
|
|
51
59
|
/** Saves the record (and emits). Returns success. */
|
|
52
60
|
Save(): Promise<boolean>;
|
|
53
61
|
/** Saves (if needed) then mounts the dry-run runner against the process's default scope. */
|
|
@@ -56,6 +64,6 @@ export declare class RecordProcessEditorComponent extends BaseAngularComponent i
|
|
|
56
64
|
Cancel(): void;
|
|
57
65
|
private resolveEntityName;
|
|
58
66
|
static ɵfac: i0.ɵɵFactoryDeclaration<RecordProcessEditorComponent, never>;
|
|
59
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<RecordProcessEditorComponent, "mj-record-process-editor", never, { "Record": { "alias": "Record"; "required": false; }; "RecordProcessID": { "alias": "RecordProcessID"; "required": false; }; "DefaultEntityID": { "alias": "DefaultEntityID"; "required": false; }; "ShowToolbar": { "alias": "ShowToolbar"; "required": false; }; }, { "Saved": "Saved"; "Cancelled": "Cancelled"; }, never, never, true, never>;
|
|
67
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RecordProcessEditorComponent, "mj-record-process-editor", never, { "Record": { "alias": "Record"; "required": false; }; "RecordProcessID": { "alias": "RecordProcessID"; "required": false; }; "DefaultEntityID": { "alias": "DefaultEntityID"; "required": false; }; "DefaultWorkType": { "alias": "DefaultWorkType"; "required": false; }; "DefaultCategoryID": { "alias": "DefaultCategoryID"; "required": false; }; "ShowToolbar": { "alias": "ShowToolbar"; "required": false; }; }, { "Saved": "Saved"; "Cancelled": "Cancelled"; }, never, never, true, never>;
|
|
60
68
|
}
|
|
61
69
|
//# sourceMappingURL=record-process-editor.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-process-editor.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-process-editor/record-process-editor.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAyD,YAAY,EAAS,MAAM,EAAkB,MAAM,eAAe,CAAC;AACnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAA2D,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;;
|
|
1
|
+
{"version":3,"file":"record-process-editor.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-process-editor/record-process-editor.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAyD,YAAY,EAAS,MAAM,EAAkB,MAAM,eAAe,CAAC;AACnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAA2D,KAAK,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAErK,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mCAAmC,CAAC;;AAKzE,qBA+Ha,4BAA6B,SAAQ,oBAAqB,YAAW,MAAM;IACpF,OAAO,CAAC,GAAG,CAA6B;IAExC,6FAA6F;IACpF,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAQ;IACrD,wEAAwE;IAC/D,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C,mFAAmF;IAC1E,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C,kGAAkG;IACzF,eAAe,EAAE,qBAAqB,CAAC,UAAU,CAAC,GAAG,IAAI,CAAQ;IAC1E,sFAAsF;IAC7E,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACjD,iGAAiG;IACxF,WAAW,UAAQ;IAE5B,8DAA8D;IACpD,KAAK,sCAA6C;IAC5D,qCAAqC;IAC3B,SAAS,qBAA4B;IAExC,QAAQ,EAAE,UAAU,EAAE,CAAM;IAC5B,kBAAkB,SAAM;IACxB,OAAO,EAAE,YAAY,CAAiB;IACtC,UAAU,UAAQ;IAClB,oBAAoB,UAAQ;IAC5B,mBAAmB,EAAE,eAAe,GAAG,IAAI,CAAQ;IACnD,MAAM,UAAS;IACf,YAAY,SAAM;IAClB,aAAa,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,qBAAqB,CAAA;KAAE,GAAG,IAAI,CAAQ;IAE5F,IAAI,OAAO,IAAI,OAAO,CAKrB;IACD,IAAI,UAAU,IAAI,OAAO,CAIxB;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,4EAA4E;YAC9D,UAAU;IAwBxB,uFAAuF;IACvF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAe5G,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAOlC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAM1C,2BAA2B,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAQxD,qDAAqD;IAC/C,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAmB9B,4FAA4F;IACtF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB9B,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAKlD,MAAM,IAAI,IAAI;IAEd,OAAO,CAAC,iBAAiB;yCAnKhB,4BAA4B;2CAA5B,4BAA4B;CAsKxC"}
|
|
@@ -13,6 +13,7 @@ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
|
13
13
|
import { SafeJSONParse } from '@memberjunction/global';
|
|
14
14
|
import { FieldRulesBuilderComponent, EntityActionUXHostComponent } from '@memberjunction/ng-entity-action-ux';
|
|
15
15
|
import { MJButtonDirective } from '@memberjunction/ng-ui-components';
|
|
16
|
+
import { FeaturePipelineBuilderComponent } from '../feature-pipeline-builder/feature-pipeline-builder.component';
|
|
16
17
|
import * as i0 from "@angular/core";
|
|
17
18
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
18
19
|
function RecordProcessEditorComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -31,45 +32,45 @@ function RecordProcessEditorComponent_Conditional_1_For_40_Template(rf, ctx) { i
|
|
|
31
32
|
i0.ɵɵadvance();
|
|
32
33
|
i0.ɵɵtextInterpolate(e_r3.DisplayName || e_r3.Name);
|
|
33
34
|
} }
|
|
34
|
-
function
|
|
35
|
+
function RecordProcessEditorComponent_Conditional_1_Conditional_59_Template(rf, ctx) { if (rf & 1) {
|
|
35
36
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
36
37
|
i0.ɵɵelementStart(0, "div", 13)(1, "label");
|
|
37
38
|
i0.ɵɵtext(2, "Filter ");
|
|
38
|
-
i0.ɵɵelementStart(3, "span",
|
|
39
|
+
i0.ɵɵelementStart(3, "span", 25);
|
|
39
40
|
i0.ɵɵtext(4, "\u2014 overridden by the grid selection at run time");
|
|
40
41
|
i0.ɵɵelementEnd()();
|
|
41
|
-
i0.ɵɵelementStart(5, "input",
|
|
42
|
-
i0.ɵɵlistener("input", function
|
|
42
|
+
i0.ɵɵelementStart(5, "input", 26);
|
|
43
|
+
i0.ɵɵlistener("input", function RecordProcessEditorComponent_Conditional_1_Conditional_59_Template_input_input_5_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.set("ScopeFilter", $event)); });
|
|
43
44
|
i0.ɵɵelementEnd()();
|
|
44
45
|
} if (rf & 2) {
|
|
45
46
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
46
47
|
i0.ɵɵadvance(5);
|
|
47
48
|
i0.ɵɵproperty("value", ctx_r1.Record.ScopeFilter || "");
|
|
48
49
|
} }
|
|
49
|
-
function
|
|
50
|
-
i0.ɵɵelementStart(0, "span",
|
|
50
|
+
function RecordProcessEditorComponent_Conditional_1_Conditional_60_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
51
|
+
i0.ɵɵelementStart(0, "span", 27);
|
|
51
52
|
i0.ɵɵtext(1, "choose an entity first");
|
|
52
53
|
i0.ɵɵelementEnd();
|
|
53
54
|
} }
|
|
54
|
-
function
|
|
55
|
+
function RecordProcessEditorComponent_Conditional_1_Conditional_60_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
55
56
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
56
|
-
i0.ɵɵelementStart(0, "mj-field-rules-builder",
|
|
57
|
-
i0.ɵɵlistener("ValueChange", function
|
|
57
|
+
i0.ɵɵelementStart(0, "mj-field-rules-builder", 29);
|
|
58
|
+
i0.ɵɵlistener("ValueChange", function RecordProcessEditorComponent_Conditional_1_Conditional_60_Conditional_7_Template_mj_field_rules_builder_ValueChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onRulesChange($event)); })("ValidChange", function RecordProcessEditorComponent_Conditional_1_Conditional_60_Conditional_7_Template_mj_field_rules_builder_ValidChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.RulesValid = $event); });
|
|
58
59
|
i0.ɵɵelementEnd();
|
|
59
60
|
} if (rf & 2) {
|
|
60
61
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
61
62
|
i0.ɵɵproperty("EntityName", ctx_r1.SelectedEntityName)("Value", ctx_r1.RuleSet)("Provider", ctx_r1.Provider);
|
|
62
63
|
} }
|
|
63
|
-
function
|
|
64
|
+
function RecordProcessEditorComponent_Conditional_1_Conditional_60_Template(rf, ctx) { if (rf & 1) {
|
|
64
65
|
i0.ɵɵelementStart(0, "section", 3)(1, "div", 4)(2, "span", 5);
|
|
65
66
|
i0.ɵɵtext(3, "3");
|
|
66
67
|
i0.ɵɵelementEnd();
|
|
67
68
|
i0.ɵɵelementStart(4, "h3");
|
|
68
69
|
i0.ɵɵtext(5, "Rules");
|
|
69
70
|
i0.ɵɵelementEnd();
|
|
70
|
-
i0.ɵɵconditionalCreate(6,
|
|
71
|
+
i0.ɵɵconditionalCreate(6, RecordProcessEditorComponent_Conditional_1_Conditional_60_Conditional_6_Template, 2, 0, "span", 27);
|
|
71
72
|
i0.ɵɵelementEnd();
|
|
72
|
-
i0.ɵɵconditionalCreate(7,
|
|
73
|
+
i0.ɵɵconditionalCreate(7, RecordProcessEditorComponent_Conditional_1_Conditional_60_Conditional_7_Template, 1, 3, "mj-field-rules-builder", 28);
|
|
73
74
|
i0.ɵɵelementEnd();
|
|
74
75
|
} if (rf & 2) {
|
|
75
76
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -78,9 +79,41 @@ function RecordProcessEditorComponent_Conditional_1_Conditional_58_Template(rf,
|
|
|
78
79
|
i0.ɵɵadvance();
|
|
79
80
|
i0.ɵɵconditional(ctx_r1.SelectedEntityName ? 7 : -1);
|
|
80
81
|
} }
|
|
81
|
-
function
|
|
82
|
-
i0.ɵɵelementStart(0, "span",
|
|
83
|
-
i0.ɵɵ
|
|
82
|
+
function RecordProcessEditorComponent_Conditional_1_Conditional_61_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
83
|
+
i0.ɵɵelementStart(0, "span", 27);
|
|
84
|
+
i0.ɵɵtext(1, "choose an entity first");
|
|
85
|
+
i0.ɵɵelementEnd();
|
|
86
|
+
} }
|
|
87
|
+
function RecordProcessEditorComponent_Conditional_1_Conditional_61_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
88
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
89
|
+
i0.ɵɵelementStart(0, "mj-feature-pipeline-builder", 31);
|
|
90
|
+
i0.ɵɵlistener("ValidChange", function RecordProcessEditorComponent_Conditional_1_Conditional_61_Conditional_7_Template_mj_feature_pipeline_builder_ValidChange_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.FeaturePipelineValid = $event); })("SpecChange", function RecordProcessEditorComponent_Conditional_1_Conditional_61_Conditional_7_Template_mj_feature_pipeline_builder_SpecChange_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onFeaturePipelineSpecChange($event)); });
|
|
91
|
+
i0.ɵɵelementEnd();
|
|
92
|
+
} if (rf & 2) {
|
|
93
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
94
|
+
i0.ɵɵproperty("Record", ctx_r1.Record)("EntityID", ctx_r1.Record.EntityID);
|
|
95
|
+
} }
|
|
96
|
+
function RecordProcessEditorComponent_Conditional_1_Conditional_61_Template(rf, ctx) { if (rf & 1) {
|
|
97
|
+
i0.ɵɵelementStart(0, "section", 3)(1, "div", 4)(2, "span", 5);
|
|
98
|
+
i0.ɵɵtext(3, "3");
|
|
99
|
+
i0.ɵɵelementEnd();
|
|
100
|
+
i0.ɵɵelementStart(4, "h3");
|
|
101
|
+
i0.ɵɵtext(5, "Feature Pipeline Configuration");
|
|
102
|
+
i0.ɵɵelementEnd();
|
|
103
|
+
i0.ɵɵconditionalCreate(6, RecordProcessEditorComponent_Conditional_1_Conditional_61_Conditional_6_Template, 2, 0, "span", 27);
|
|
104
|
+
i0.ɵɵelementEnd();
|
|
105
|
+
i0.ɵɵconditionalCreate(7, RecordProcessEditorComponent_Conditional_1_Conditional_61_Conditional_7_Template, 1, 2, "mj-feature-pipeline-builder", 30);
|
|
106
|
+
i0.ɵɵelementEnd();
|
|
107
|
+
} if (rf & 2) {
|
|
108
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
109
|
+
i0.ɵɵadvance(6);
|
|
110
|
+
i0.ɵɵconditional(!ctx_r1.SelectedEntityName ? 6 : -1);
|
|
111
|
+
i0.ɵɵadvance();
|
|
112
|
+
i0.ɵɵconditional(ctx_r1.SelectedEntityName ? 7 : -1);
|
|
113
|
+
} }
|
|
114
|
+
function RecordProcessEditorComponent_Conditional_1_Conditional_62_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
115
|
+
i0.ɵɵelementStart(0, "span", 37);
|
|
116
|
+
i0.ɵɵelement(1, "i", 38);
|
|
84
117
|
i0.ɵɵtext(2);
|
|
85
118
|
i0.ɵɵelementEnd();
|
|
86
119
|
} if (rf & 2) {
|
|
@@ -88,23 +121,23 @@ function RecordProcessEditorComponent_Conditional_1_Conditional_59_Conditional_9
|
|
|
88
121
|
i0.ɵɵadvance(2);
|
|
89
122
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.ErrorMessage);
|
|
90
123
|
} }
|
|
91
|
-
function
|
|
92
|
-
const
|
|
93
|
-
i0.ɵɵelementStart(0, "div",
|
|
94
|
-
i0.ɵɵlistener("click", function
|
|
95
|
-
i0.ɵɵelement(2, "i",
|
|
124
|
+
function RecordProcessEditorComponent_Conditional_1_Conditional_62_Template(rf, ctx) { if (rf & 1) {
|
|
125
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
126
|
+
i0.ɵɵelementStart(0, "div", 23)(1, "button", 32);
|
|
127
|
+
i0.ɵɵlistener("click", function RecordProcessEditorComponent_Conditional_1_Conditional_62_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.Save()); });
|
|
128
|
+
i0.ɵɵelement(2, "i", 33);
|
|
96
129
|
i0.ɵɵtext(3, " Save ");
|
|
97
130
|
i0.ɵɵelementEnd();
|
|
98
|
-
i0.ɵɵelementStart(4, "button",
|
|
99
|
-
i0.ɵɵlistener("click", function
|
|
100
|
-
i0.ɵɵelement(5, "i",
|
|
131
|
+
i0.ɵɵelementStart(4, "button", 34);
|
|
132
|
+
i0.ɵɵlistener("click", function RecordProcessEditorComponent_Conditional_1_Conditional_62_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.Preview()); });
|
|
133
|
+
i0.ɵɵelement(5, "i", 35);
|
|
101
134
|
i0.ɵɵtext(6, " Preview changes");
|
|
102
135
|
i0.ɵɵelementEnd();
|
|
103
|
-
i0.ɵɵelementStart(7, "button",
|
|
104
|
-
i0.ɵɵlistener("click", function
|
|
136
|
+
i0.ɵɵelementStart(7, "button", 36);
|
|
137
|
+
i0.ɵɵlistener("click", function RecordProcessEditorComponent_Conditional_1_Conditional_62_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.Cancel()); });
|
|
105
138
|
i0.ɵɵtext(8, "Cancel");
|
|
106
139
|
i0.ɵɵelementEnd();
|
|
107
|
-
i0.ɵɵconditionalCreate(9,
|
|
140
|
+
i0.ɵɵconditionalCreate(9, RecordProcessEditorComponent_Conditional_1_Conditional_62_Conditional_9_Template, 3, 1, "span", 37);
|
|
108
141
|
i0.ɵɵelementEnd();
|
|
109
142
|
} if (rf & 2) {
|
|
110
143
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -117,10 +150,10 @@ function RecordProcessEditorComponent_Conditional_1_Conditional_59_Template(rf,
|
|
|
117
150
|
i0.ɵɵadvance(5);
|
|
118
151
|
i0.ɵɵconditional(ctx_r1.ErrorMessage ? 9 : -1);
|
|
119
152
|
} }
|
|
120
|
-
function
|
|
121
|
-
const
|
|
122
|
-
i0.ɵɵelementStart(0, "mj-entity-action-ux-host",
|
|
123
|
-
i0.ɵɵlistener("Completed", function
|
|
153
|
+
function RecordProcessEditorComponent_Conditional_1_Conditional_63_Template(rf, ctx) { if (rf & 1) {
|
|
154
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
155
|
+
i0.ɵɵelementStart(0, "mj-entity-action-ux-host", 39);
|
|
156
|
+
i0.ɵɵlistener("Completed", function RecordProcessEditorComponent_Conditional_1_Conditional_63_Template_mj_entity_action_ux_host_Completed_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onPreviewDone($event)); })("Cancelled", function RecordProcessEditorComponent_Conditional_1_Conditional_63_Template_mj_entity_action_ux_host_Cancelled_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.PreviewDriver = null); });
|
|
124
157
|
i0.ɵɵelementEnd();
|
|
125
158
|
} if (rf & 2) {
|
|
126
159
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -197,13 +230,17 @@ function RecordProcessEditorComponent_Conditional_1_Template(rf, ctx) { if (rf &
|
|
|
197
230
|
i0.ɵɵlistener("change", function RecordProcessEditorComponent_Conditional_1_Template_select_change_54_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.set("WorkType", $event)); });
|
|
198
231
|
i0.ɵɵelementStart(55, "option", 21);
|
|
199
232
|
i0.ɵɵtext(56, "Field Rules");
|
|
233
|
+
i0.ɵɵelementEnd();
|
|
234
|
+
i0.ɵɵelementStart(57, "option", 22);
|
|
235
|
+
i0.ɵɵtext(58, "Feature Pipeline (Infer)");
|
|
200
236
|
i0.ɵɵelementEnd()()()();
|
|
201
|
-
i0.ɵɵconditionalCreate(
|
|
237
|
+
i0.ɵɵconditionalCreate(59, RecordProcessEditorComponent_Conditional_1_Conditional_59_Template, 6, 1, "div", 13);
|
|
202
238
|
i0.ɵɵelementEnd();
|
|
203
|
-
i0.ɵɵconditionalCreate(
|
|
204
|
-
i0.ɵɵconditionalCreate(
|
|
239
|
+
i0.ɵɵconditionalCreate(60, RecordProcessEditorComponent_Conditional_1_Conditional_60_Template, 8, 2, "section", 3);
|
|
240
|
+
i0.ɵɵconditionalCreate(61, RecordProcessEditorComponent_Conditional_1_Conditional_61_Template, 8, 2, "section", 3);
|
|
241
|
+
i0.ɵɵconditionalCreate(62, RecordProcessEditorComponent_Conditional_1_Conditional_62_Template, 10, 9, "div", 23);
|
|
205
242
|
i0.ɵɵelementEnd();
|
|
206
|
-
i0.ɵɵconditionalCreate(
|
|
243
|
+
i0.ɵɵconditionalCreate(63, RecordProcessEditorComponent_Conditional_1_Conditional_63_Template, 1, 2, "mj-entity-action-ux-host", 24);
|
|
207
244
|
} if (rf & 2) {
|
|
208
245
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
209
246
|
i0.ɵɵadvance(11);
|
|
@@ -220,14 +257,16 @@ function RecordProcessEditorComponent_Conditional_1_Template(rf, ctx) { if (rf &
|
|
|
220
257
|
i0.ɵɵproperty("value", ctx_r1.Record.ScopeType || "Filter");
|
|
221
258
|
i0.ɵɵadvance(10);
|
|
222
259
|
i0.ɵɵproperty("value", ctx_r1.Record.WorkType || "FieldRules");
|
|
223
|
-
i0.ɵɵadvance(
|
|
224
|
-
i0.ɵɵconditional(ctx_r1.Record.ScopeType === "Filter" ?
|
|
260
|
+
i0.ɵɵadvance(5);
|
|
261
|
+
i0.ɵɵconditional(ctx_r1.Record.ScopeType === "Filter" ? 59 : -1);
|
|
262
|
+
i0.ɵɵadvance();
|
|
263
|
+
i0.ɵɵconditional(ctx_r1.Record.WorkType === "FieldRules" ? 60 : -1);
|
|
225
264
|
i0.ɵɵadvance();
|
|
226
|
-
i0.ɵɵconditional(ctx_r1.Record.WorkType === "
|
|
265
|
+
i0.ɵɵconditional(ctx_r1.Record.WorkType === "Infer" ? 61 : -1);
|
|
227
266
|
i0.ɵɵadvance();
|
|
228
|
-
i0.ɵɵconditional(ctx_r1.ShowToolbar ?
|
|
267
|
+
i0.ɵɵconditional(ctx_r1.ShowToolbar ? 62 : -1);
|
|
229
268
|
i0.ɵɵadvance();
|
|
230
|
-
i0.ɵɵconditional(ctx_r1.PreviewDriver ?
|
|
269
|
+
i0.ɵɵconditional(ctx_r1.PreviewDriver ? 63 : -1);
|
|
231
270
|
} }
|
|
232
271
|
export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
233
272
|
cdr = inject(ChangeDetectorRef);
|
|
@@ -237,6 +276,10 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
237
276
|
RecordProcessID = null;
|
|
238
277
|
/** Default EntityID for a brand-new process (e.g. the grid the user came from). */
|
|
239
278
|
DefaultEntityID = null;
|
|
279
|
+
/** Default WorkType for a brand-new process (e.g. 'Infer' when opened from Feature Pipelines). */
|
|
280
|
+
DefaultWorkType = null;
|
|
281
|
+
/** Default CategoryID for a brand-new process (e.g. Feature Pipeline category ID). */
|
|
282
|
+
DefaultCategoryID = null;
|
|
240
283
|
/** Show the built-in Save / Preview / Cancel toolbar. Set false when an outer form owns Save. */
|
|
241
284
|
ShowToolbar = true;
|
|
242
285
|
/** Emitted after a successful Save (the persisted record). */
|
|
@@ -247,11 +290,27 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
247
290
|
SelectedEntityName = '';
|
|
248
291
|
RuleSet = { Rules: [] };
|
|
249
292
|
RulesValid = true;
|
|
293
|
+
FeaturePipelineValid = true;
|
|
294
|
+
FeaturePipelineSpec = null;
|
|
250
295
|
Saving = false;
|
|
251
296
|
ErrorMessage = '';
|
|
252
297
|
PreviewDriver = null;
|
|
253
|
-
get CanSave() {
|
|
254
|
-
|
|
298
|
+
get CanSave() {
|
|
299
|
+
if (!this.Record?.Name || !this.Record?.EntityID)
|
|
300
|
+
return false;
|
|
301
|
+
if (this.Record.WorkType === 'FieldRules')
|
|
302
|
+
return this.RulesValid;
|
|
303
|
+
if (this.Record.WorkType === 'Infer')
|
|
304
|
+
return this.FeaturePipelineValid && !!this.Record.PromptID;
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
get CanPreview() {
|
|
308
|
+
if (this.Record?.WorkType === 'FieldRules')
|
|
309
|
+
return this.CanSave && this.RuleSet.Rules.length > 0;
|
|
310
|
+
if (this.Record?.WorkType === 'Infer')
|
|
311
|
+
return this.CanSave;
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
255
314
|
async ngOnInit() {
|
|
256
315
|
const provider = this.ProviderToUse;
|
|
257
316
|
this.Entities = [...provider.Entities].sort((a, b) => (a.DisplayName || a.Name).localeCompare(b.DisplayName || b.Name));
|
|
@@ -267,14 +326,21 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
267
326
|
}
|
|
268
327
|
else {
|
|
269
328
|
this.Record.NewRecord();
|
|
270
|
-
this.Record.WorkType = 'FieldRules';
|
|
329
|
+
this.Record.WorkType = this.DefaultWorkType ?? 'FieldRules';
|
|
271
330
|
this.Record.ScopeType = 'Filter';
|
|
272
331
|
this.Record.Status = 'Draft';
|
|
273
332
|
if (this.DefaultEntityID)
|
|
274
333
|
this.Record.EntityID = this.DefaultEntityID;
|
|
334
|
+
if (this.DefaultCategoryID)
|
|
335
|
+
this.Record.CategoryID = this.DefaultCategoryID;
|
|
275
336
|
}
|
|
276
337
|
}
|
|
277
|
-
|
|
338
|
+
if (this.Record.WorkType === 'FieldRules') {
|
|
339
|
+
this.RuleSet = this.Record.Configuration ? (SafeJSONParse(this.Record.Configuration) ?? { Rules: [] }) : { Rules: [] };
|
|
340
|
+
}
|
|
341
|
+
else if (this.Record.WorkType === 'Infer') {
|
|
342
|
+
this.FeaturePipelineSpec = this.Record.Configuration ? SafeJSONParse(this.Record.Configuration) : null;
|
|
343
|
+
}
|
|
278
344
|
this.resolveEntityName();
|
|
279
345
|
this.cdr.detectChanges();
|
|
280
346
|
}
|
|
@@ -319,6 +385,13 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
319
385
|
this.Record.Configuration = JSON.stringify(ruleSet);
|
|
320
386
|
this.cdr.detectChanges();
|
|
321
387
|
}
|
|
388
|
+
onFeaturePipelineSpecChange(spec) {
|
|
389
|
+
this.FeaturePipelineSpec = spec;
|
|
390
|
+
if (this.Record) {
|
|
391
|
+
this.Record.Configuration = JSON.stringify(spec);
|
|
392
|
+
}
|
|
393
|
+
this.cdr.detectChanges();
|
|
394
|
+
}
|
|
322
395
|
/** Saves the record (and emits). Returns success. */
|
|
323
396
|
async Save() {
|
|
324
397
|
if (!this.Record || !this.CanSave)
|
|
@@ -326,7 +399,12 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
326
399
|
this.Saving = true;
|
|
327
400
|
this.ErrorMessage = '';
|
|
328
401
|
this.cdr.detectChanges();
|
|
329
|
-
this.Record.
|
|
402
|
+
if (this.Record.WorkType === 'FieldRules') {
|
|
403
|
+
this.Record.Configuration = JSON.stringify(this.RuleSet);
|
|
404
|
+
}
|
|
405
|
+
else if (this.Record.WorkType === 'Infer' && this.FeaturePipelineSpec) {
|
|
406
|
+
this.Record.Configuration = JSON.stringify(this.FeaturePipelineSpec);
|
|
407
|
+
}
|
|
330
408
|
const ok = await this.Record.Save();
|
|
331
409
|
this.Saving = false;
|
|
332
410
|
if (ok) {
|
|
@@ -377,15 +455,15 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
377
455
|
this.SelectedEntityName = this.Record?.EntityID ? (this.ProviderToUse.EntityByID(this.Record.EntityID)?.Name ?? '') : '';
|
|
378
456
|
}
|
|
379
457
|
static ɵfac = /*@__PURE__*/ (() => { let ɵRecordProcessEditorComponent_BaseFactory; return function RecordProcessEditorComponent_Factory(__ngFactoryType__) { return (ɵRecordProcessEditorComponent_BaseFactory || (ɵRecordProcessEditorComponent_BaseFactory = i0.ɵɵgetInheritedFactory(RecordProcessEditorComponent)))(__ngFactoryType__ || RecordProcessEditorComponent); }; })();
|
|
380
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RecordProcessEditorComponent, selectors: [["mj-record-process-editor"]], inputs: { Record: "Record", RecordProcessID: "RecordProcessID", DefaultEntityID: "DefaultEntityID", ShowToolbar: "ShowToolbar" }, outputs: { Saved: "Saved", Cancelled: "Cancelled" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "rpe-loading"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "rpe"], [1, "rpe-sec"], [1, "rpe-sec-h"], [1, "num"], [1, "rpe-grid2"], [1, "field"], ["placeholder", "e.g. Mark idle prompts for review", 1, "mj-input", 3, "input", "value"], [1, "mj-input", 3, "change", "value"], ["value", "Draft"], ["value", "Active"], ["value", "Disabled"], [1, "field", "rpe-mt"], ["placeholder", "What does this process do?", 1, "mj-input", 3, "input", "value"], [1, "rpe-grid3"], ["value", "", "disabled", ""], [3, "value"], ["value", "Filter"], ["value", "View"], ["value", "List"], ["value", "FieldRules"], [1, "rpe-bar"], [3, "DriverClass", "Context"], [1, "muted"], ["placeholder", "e.g. Status = 'Active'", 1, "mj-input", "mono", 3, "input", "value"], [1, "muted", "rpe-h-note"], [3, "EntityName", "Value", "Provider"], [3, "ValueChange", "ValidChange", "EntityName", "Value", "Provider"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid"], ["mjButton", "", 3, "click", "disabled"], [1, "fa-solid", "fa-flask"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "rpe-err"], [1, "fa-solid", "fa-triangle-exclamation"], [3, "Completed", "Cancelled", "DriverClass", "Context"]], template: function RecordProcessEditorComponent_Template(rf, ctx) { if (rf & 1) {
|
|
381
|
-
i0.ɵɵconditionalCreate(0, RecordProcessEditorComponent_Conditional_0_Template, 3, 0, "div", 0)(1, RecordProcessEditorComponent_Conditional_1_Template,
|
|
458
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RecordProcessEditorComponent, selectors: [["mj-record-process-editor"]], inputs: { Record: "Record", RecordProcessID: "RecordProcessID", DefaultEntityID: "DefaultEntityID", DefaultWorkType: "DefaultWorkType", DefaultCategoryID: "DefaultCategoryID", ShowToolbar: "ShowToolbar" }, outputs: { Saved: "Saved", Cancelled: "Cancelled" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 1, consts: [[1, "rpe-loading"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "rpe"], [1, "rpe-sec"], [1, "rpe-sec-h"], [1, "num"], [1, "rpe-grid2"], [1, "field"], ["placeholder", "e.g. Mark idle prompts for review", 1, "mj-input", 3, "input", "value"], [1, "mj-input", 3, "change", "value"], ["value", "Draft"], ["value", "Active"], ["value", "Disabled"], [1, "field", "rpe-mt"], ["placeholder", "What does this process do?", 1, "mj-input", 3, "input", "value"], [1, "rpe-grid3"], ["value", "", "disabled", ""], [3, "value"], ["value", "Filter"], ["value", "View"], ["value", "List"], ["value", "FieldRules"], ["value", "Infer"], [1, "rpe-bar"], [3, "DriverClass", "Context"], [1, "muted"], ["placeholder", "e.g. Status = 'Active'", 1, "mj-input", "mono", 3, "input", "value"], [1, "muted", "rpe-h-note"], [3, "EntityName", "Value", "Provider"], [3, "ValueChange", "ValidChange", "EntityName", "Value", "Provider"], [3, "Record", "EntityID"], [3, "ValidChange", "SpecChange", "Record", "EntityID"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], [1, "fa-solid"], ["mjButton", "", 3, "click", "disabled"], [1, "fa-solid", "fa-flask"], ["mjButton", "", "variant", "flat", 3, "click"], [1, "rpe-err"], [1, "fa-solid", "fa-triangle-exclamation"], [3, "Completed", "Cancelled", "DriverClass", "Context"]], template: function RecordProcessEditorComponent_Template(rf, ctx) { if (rf & 1) {
|
|
459
|
+
i0.ɵɵconditionalCreate(0, RecordProcessEditorComponent_Conditional_0_Template, 3, 0, "div", 0)(1, RecordProcessEditorComponent_Conditional_1_Template, 64, 11);
|
|
382
460
|
} if (rf & 2) {
|
|
383
461
|
i0.ɵɵconditional(!ctx.Record ? 0 : 1);
|
|
384
|
-
} }, dependencies: [FieldRulesBuilderComponent, EntityActionUXHostComponent, MJButtonDirective], styles: [".rpe-loading[_ngcontent-%COMP%]{padding:30px;color:var(--mj-text-muted);display:flex;align-items:center;gap:10px}\n .rpe[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:22px;color:var(--mj-text-primary)}\n .rpe-sec[_ngcontent-%COMP%]{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[_ngcontent-%COMP%]{display:flex;align-items:center;gap:11px;margin-bottom:16px}\n .rpe-sec-h[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;font-size:16px;font-weight:700}\n .rpe-sec-h[_ngcontent-%COMP%] .num[_ngcontent-%COMP%]{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[_ngcontent-%COMP%]{margin-left:6px;font-size:12.5px}\n .rpe-grid2[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 220px;gap:16px}\n .rpe-grid3[_ngcontent-%COMP%]{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:16px}\n .field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:6px}\n .field[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-size:12.5px;font-weight:600;color:var(--mj-text-secondary)}\n .rpe-mt[_ngcontent-%COMP%]{margin-top:16px}\n .mono[_ngcontent-%COMP%]{font-family:var(--mj-font-mono,monospace);font-size:12.5px}\n .muted[_ngcontent-%COMP%]{color:var(--mj-text-muted);font-weight:400}\n .rpe-bar[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding-top:4px}\n .rpe-bar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{margin-right:6px}\n .rpe-err[_ngcontent-%COMP%]{color:var(--mj-status-error-text);font-size:13px;display:flex;align-items:center;gap:7px}\n .rpe-err[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:var(--mj-status-error)}"], changeDetection: 0 });
|
|
462
|
+
} }, dependencies: [FieldRulesBuilderComponent, FeaturePipelineBuilderComponent, EntityActionUXHostComponent, MJButtonDirective], styles: [".rpe-loading[_ngcontent-%COMP%]{padding:30px;color:var(--mj-text-muted);display:flex;align-items:center;gap:10px}\n .rpe[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:22px;color:var(--mj-text-primary)}\n .rpe-sec[_ngcontent-%COMP%]{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[_ngcontent-%COMP%]{display:flex;align-items:center;gap:11px;margin-bottom:16px}\n .rpe-sec-h[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;font-size:16px;font-weight:700}\n .rpe-sec-h[_ngcontent-%COMP%] .num[_ngcontent-%COMP%]{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[_ngcontent-%COMP%]{margin-left:6px;font-size:12.5px}\n .rpe-grid2[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 220px;gap:16px}\n .rpe-grid3[_ngcontent-%COMP%]{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:16px}\n .field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:6px}\n .field[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-size:12.5px;font-weight:600;color:var(--mj-text-secondary)}\n .rpe-mt[_ngcontent-%COMP%]{margin-top:16px}\n .mono[_ngcontent-%COMP%]{font-family:var(--mj-font-mono,monospace);font-size:12.5px}\n .muted[_ngcontent-%COMP%]{color:var(--mj-text-muted);font-weight:400}\n .rpe-bar[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding-top:4px}\n .rpe-bar[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{margin-right:6px}\n .rpe-err[_ngcontent-%COMP%]{color:var(--mj-status-error-text);font-size:13px;display:flex;align-items:center;gap:7px}\n .rpe-err[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:var(--mj-status-error)}"], changeDetection: 0 });
|
|
385
463
|
}
|
|
386
464
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RecordProcessEditorComponent, [{
|
|
387
465
|
type: Component,
|
|
388
|
-
args: [{ selector: 'mj-record-process-editor', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [FieldRulesBuilderComponent, EntityActionUXHostComponent, MJButtonDirective], template: `
|
|
466
|
+
args: [{ selector: 'mj-record-process-editor', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [FieldRulesBuilderComponent, FeaturePipelineBuilderComponent, EntityActionUXHostComponent, MJButtonDirective], template: `
|
|
389
467
|
@if (!Record) {
|
|
390
468
|
<div class="rpe-loading"><i class="fa-solid fa-circle-notch fa-spin"></i> Loading…</div>
|
|
391
469
|
} @else {
|
|
@@ -421,6 +499,7 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
421
499
|
<div class="field"><label>Work type</label>
|
|
422
500
|
<select class="mj-input" [value]="Record.WorkType || 'FieldRules'" (change)="set('WorkType', $event)">
|
|
423
501
|
<option value="FieldRules">Field Rules</option>
|
|
502
|
+
<option value="Infer">Feature Pipeline (Infer)</option>
|
|
424
503
|
</select></div>
|
|
425
504
|
</div>
|
|
426
505
|
@if (Record.ScopeType === 'Filter') {
|
|
@@ -447,6 +526,23 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
447
526
|
</section>
|
|
448
527
|
}
|
|
449
528
|
|
|
529
|
+
<!-- FEATURE PIPELINE (INFER) -->
|
|
530
|
+
@if (Record.WorkType === 'Infer') {
|
|
531
|
+
<section class="rpe-sec">
|
|
532
|
+
<div class="rpe-sec-h"><span class="num">3</span><h3>Feature Pipeline Configuration</h3>
|
|
533
|
+
@if (!SelectedEntityName) { <span class="muted rpe-h-note">choose an entity first</span> }
|
|
534
|
+
</div>
|
|
535
|
+
@if (SelectedEntityName) {
|
|
536
|
+
<mj-feature-pipeline-builder
|
|
537
|
+
[Record]="Record"
|
|
538
|
+
[EntityID]="Record.EntityID"
|
|
539
|
+
(ValidChange)="FeaturePipelineValid = $event"
|
|
540
|
+
(SpecChange)="onFeaturePipelineSpecChange($event)">
|
|
541
|
+
</mj-feature-pipeline-builder>
|
|
542
|
+
}
|
|
543
|
+
</section>
|
|
544
|
+
}
|
|
545
|
+
|
|
450
546
|
<!-- TOOLBAR -->
|
|
451
547
|
@if (ShowToolbar) {
|
|
452
548
|
<div class="rpe-bar">
|
|
@@ -474,6 +570,10 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
474
570
|
type: Input
|
|
475
571
|
}], DefaultEntityID: [{
|
|
476
572
|
type: Input
|
|
573
|
+
}], DefaultWorkType: [{
|
|
574
|
+
type: Input
|
|
575
|
+
}], DefaultCategoryID: [{
|
|
576
|
+
type: Input
|
|
477
577
|
}], ShowToolbar: [{
|
|
478
578
|
type: Input
|
|
479
579
|
}], Saved: [{
|
|
@@ -481,5 +581,5 @@ export class RecordProcessEditorComponent extends BaseAngularComponent {
|
|
|
481
581
|
}], Cancelled: [{
|
|
482
582
|
type: Output
|
|
483
583
|
}] }); })();
|
|
484
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RecordProcessEditorComponent, { className: "RecordProcessEditorComponent", filePath: "lib/record-process-editor/record-process-editor.component.ts", lineNumber:
|
|
584
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RecordProcessEditorComponent, { className: "RecordProcessEditorComponent", filePath: "lib/record-process-editor/record-process-editor.component.ts", lineNumber: 150 }); })();
|
|
485
585
|
//# sourceMappingURL=record-process-editor.component.js.map
|