@memberjunction/ng-core-entity-forms 6.2.0-edge.1 → 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/custom/AIAgents/agent-form-tabs.d.ts +1 -0
- package/dist/lib/custom/AIAgents/agent-form-tabs.d.ts.map +1 -1
- package/dist/lib/custom/AIAgents/agent-form-tabs.js +2 -0
- package/dist/lib/custom/AIAgents/agent-form-tabs.js.map +1 -1
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js +528 -521
- package/dist/lib/custom/AIAgents/ai-agent-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.d.ts.map +1 -1
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js +10 -16
- package/dist/lib/custom/AIPrompts/ai-prompt-form.component.js.map +1 -1
- package/dist/lib/custom/AIPrompts/pending-records.d.ts +11 -0
- package/dist/lib/custom/AIPrompts/pending-records.d.ts.map +1 -0
- package/dist/lib/custom/AIPrompts/pending-records.js +21 -0
- package/dist/lib/custom/AIPrompts/pending-records.js.map +1 -0
- package/dist/lib/custom/Entities/entity-form.component.d.ts +8 -1
- package/dist/lib/custom/Entities/entity-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Entities/entity-form.component.js +240 -147
- package/dist/lib/custom/Entities/entity-form.component.js.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts +19 -0
- package/dist/lib/custom/RecordProcesses/record-process-form.component.d.ts.map +1 -1
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js +50 -8
- package/dist/lib/custom/RecordProcesses/record-process-form.component.js.map +1 -1
- package/dist/lib/custom/Rubrics/evaluation-form.component.d.ts +37 -0
- package/dist/lib/custom/Rubrics/evaluation-form.component.d.ts.map +1 -0
- package/dist/lib/custom/Rubrics/evaluation-form.component.js +399 -0
- package/dist/lib/custom/Rubrics/evaluation-form.component.js.map +1 -0
- package/dist/lib/custom/Rubrics/record-forms.component.d.ts +69 -0
- package/dist/lib/custom/Rubrics/record-forms.component.d.ts.map +1 -0
- package/dist/lib/custom/Rubrics/record-forms.component.js +587 -0
- package/dist/lib/custom/Rubrics/record-forms.component.js.map +1 -0
- package/dist/lib/custom/Rubrics/rubric-form.component.d.ts +67 -0
- package/dist/lib/custom/Rubrics/rubric-form.component.d.ts.map +1 -0
- package/dist/lib/custom/Rubrics/rubric-form.component.js +534 -0
- package/dist/lib/custom/Rubrics/rubric-form.component.js.map +1 -0
- package/dist/lib/custom/Rubrics/rubric-form.panels.d.ts +25 -0
- package/dist/lib/custom/Rubrics/rubric-form.panels.d.ts.map +1 -0
- package/dist/lib/custom/Rubrics/rubric-form.panels.js +299 -0
- package/dist/lib/custom/Rubrics/rubric-form.panels.js.map +1 -0
- package/dist/lib/custom/Rubrics/scale-form.component.d.ts +31 -0
- package/dist/lib/custom/Rubrics/scale-form.component.d.ts.map +1 -0
- package/dist/lib/custom/Rubrics/scale-form.component.js +395 -0
- package/dist/lib/custom/Rubrics/scale-form.component.js.map +1 -0
- package/dist/lib/custom/Templates/templates-form.component.d.ts +13 -4
- package/dist/lib/custom/Templates/templates-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Templates/templates-form.component.js +110 -113
- package/dist/lib/custom/Templates/templates-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.d.ts +6 -0
- package/dist/lib/custom/Tests/test-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-form.component.js +402 -361
- package/dist/lib/custom/Tests/test-form.component.js.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts +5 -0
- package/dist/lib/custom/Tests/test-suite-form.component.d.ts.map +1 -1
- package/dist/lib/custom/Tests/test-suite-form.component.js +704 -664
- package/dist/lib/custom/Tests/test-suite-form.component.js.map +1 -1
- package/dist/lib/custom/Users/user-overview.panel.js +1 -1
- package/dist/lib/custom/Users/user-overview.panel.js.map +1 -1
- package/dist/lib/custom/custom-forms.module.d.ts +56 -48
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -1
- package/dist/lib/custom/custom-forms.module.js +60 -0
- package/dist/lib/custom/custom-forms.module.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js +61 -43
- package/dist/lib/generated/Entities/MJAIAgent/mjaiagent.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.js +74 -0
- package/dist/lib/generated/Entities/MJAIAgentRubric/mjaiagentrubric.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js +37 -19
- package/dist/lib/generated/Entities/MJAIAgentRun/mjaiagentrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js +31 -13
- package/dist/lib/generated/Entities/MJAIPromptRun/mjaipromptrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js +156 -84
- package/dist/lib/generated/Entities/MJEntity/mjentity.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.js +62 -0
- package/dist/lib/generated/Entities/MJFeaturePipelineType/mjfeaturepipelinetype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js +24 -6
- package/dist/lib/generated/Entities/MJProcessRun/mjprocessrun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js +24 -16
- package/dist/lib/generated/Entities/MJRecordChange/mjrecordchange.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.js +107 -0
- package/dist/lib/generated/Entities/MJRecordCloneLog/mjrecordclonelog.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.js +74 -0
- package/dist/lib/generated/Entities/MJRecordCloneLogItem/mjrecordclonelogitem.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.js +135 -0
- package/dist/lib/generated/Entities/MJRubric/mjrubric.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.js +87 -0
- package/dist/lib/generated/Entities/MJRubricBand/mjrubricband.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.js +107 -0
- package/dist/lib/generated/Entities/MJRubricCategory/mjrubriccategory.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.js +155 -0
- package/dist/lib/generated/Entities/MJRubricCriterion/mjrubriccriterion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.js +62 -0
- package/dist/lib/generated/Entities/MJRubricCriterionLevel/mjrubriccriterionlevel.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.js +183 -0
- package/dist/lib/generated/Entities/MJRubricEvaluation/mjrubricevaluation.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.js +120 -0
- package/dist/lib/generated/Entities/MJRubricEvaluationScore/mjrubricevaluationscore.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.js +107 -0
- package/dist/lib/generated/Entities/MJRubricScale/mjrubricscale.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.js +103 -0
- package/dist/lib/generated/Entities/MJRubricScaleLevel/mjrubricscalelevel.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.js +171 -0
- package/dist/lib/generated/Entities/MJRubricVersion/mjrubricversion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js +24 -16
- package/dist/lib/generated/Entities/MJTest/mjtest.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js +27 -25
- package/dist/lib/generated/Entities/MJTestSuite/mjtestsuite.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js +19 -11
- package/dist/lib/generated/Entities/MJTestSuiteRun/mjtestsuiterun.form.component.js.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.d.ts.map +1 -1
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js +172 -118
- package/dist/lib/generated/Entities/MJUser/mjuser.form.component.js.map +1 -1
- package/dist/lib/generated/generated-forms.module.d.ts +436 -422
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -1
- package/dist/lib/generated/generated-forms.module.js +44 -2
- package/dist/lib/generated/generated-forms.module.js.map +1 -1
- package/dist/lib/panels/record-clone/entity-clone-config-editor.component.d.ts +116 -0
- package/dist/lib/panels/record-clone/entity-clone-config-editor.component.d.ts.map +1 -0
- package/dist/lib/panels/record-clone/entity-clone-config-editor.component.js +820 -0
- package/dist/lib/panels/record-clone/entity-clone-config-editor.component.js.map +1 -0
- package/dist/lib/shared/components/template-editor.component.d.ts +25 -1
- package/dist/lib/shared/components/template-editor.component.d.ts.map +1 -1
- package/dist/lib/shared/components/template-editor.component.js +67 -3
- package/dist/lib/shared/components/template-editor.component.js.map +1 -1
- package/dist/public-api.d.ts +5 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +5 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +47 -43
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
|
+
import { type ValidationResult } from '@memberjunction/global';
|
|
2
3
|
import { BaseFormPolicy, FormChromeContext, FormChromeSpec } from '@memberjunction/ng-base-forms';
|
|
4
|
+
import type { MJRecordProcessEntity } from '@memberjunction/core-entities';
|
|
3
5
|
import { MJRecordProcessFormComponent } from '../../generated/Entities/MJRecordProcess/mjrecordprocess.form.component';
|
|
4
6
|
import { EntityInfo } from '@memberjunction/core';
|
|
5
7
|
import type { DataFeatureSpec, SpecValidationIssue, EntityMetadataStub } from '@memberjunction/feature-pipelines';
|
|
@@ -55,6 +57,14 @@ export declare function buildFeatureOutputViewModels(spec: DataFeatureSpec | nul
|
|
|
55
57
|
export declare function BuildPromptParamViewModels(spec: DataFeatureSpec | null, inputMapping?: string | null): PromptParamViewModel[];
|
|
56
58
|
/** @deprecated Use {@link BuildPromptParamViewModels}. */
|
|
57
59
|
export declare function buildPromptParamViewModels(spec: DataFeatureSpec | null, inputMapping?: string | null): PromptParamViewModel[];
|
|
60
|
+
/** The message the form refuses a save with when the builder flagged the pipeline without listing why. */
|
|
61
|
+
export declare const PIPELINE_BUILDER_INVALID_MESSAGE = "The pipeline configuration has errors. Fix them under Pipeline Configuration before saving.";
|
|
62
|
+
/**
|
|
63
|
+
* Why the record form refuses to save an Infer pipeline the builder reports invalid: the builder's error
|
|
64
|
+
* messages, once each, or {@link PIPELINE_BUILDER_INVALID_MESSAGE} when they are not available. Empty for
|
|
65
|
+
* any other work type (the builder only edits Infer pipelines), and while the builder reports it valid.
|
|
66
|
+
*/
|
|
67
|
+
export declare function GetPipelineBuilderSaveErrors(workType: MJRecordProcessEntity['WorkType'] | null | undefined, pipelineValid: boolean, builderIssues?: ReadonlyArray<SpecValidationIssue>): string[];
|
|
58
68
|
/**
|
|
59
69
|
* Custom form override for `MJ: Record Processes` (priority 100).
|
|
60
70
|
* Presents the Record Process / Feature Pipeline in a first-class MJ form with:
|
|
@@ -69,7 +79,10 @@ export declare function buildPromptParamViewModels(spec: DataFeatureSpec | null,
|
|
|
69
79
|
* - System Metadata panel.
|
|
70
80
|
*/
|
|
71
81
|
export declare class RecordProcessFormComponentExtended extends MJRecordProcessFormComponent implements OnInit {
|
|
82
|
+
/** Whether the Feature Pipeline builder last reported the pipeline valid. The form refuses to save while it is false. */
|
|
72
83
|
PipelineValid: boolean;
|
|
84
|
+
/** The embedded builder, when it is rendered, for the messages behind {@link PipelineValid}. */
|
|
85
|
+
private pipelineBuilder?;
|
|
73
86
|
/** @deprecated Use {@link PipelineValid}. */
|
|
74
87
|
get pipelineValid(): boolean;
|
|
75
88
|
/** @deprecated Use {@link PipelineValid}. */
|
|
@@ -109,6 +122,12 @@ export declare class RecordProcessFormComponentExtended extends MJRecordProcessF
|
|
|
109
122
|
get StatusBadgeClass(): string;
|
|
110
123
|
OnPipelineSpecChange(): void;
|
|
111
124
|
OnPipelineValidChange(valid: boolean): void;
|
|
125
|
+
/**
|
|
126
|
+
* The record's validation (which includes the shared Feature Pipeline save check), plus the builder's
|
|
127
|
+
* verdict: while the builder reports an Infer pipeline invalid, the save is refused and its errors are
|
|
128
|
+
* listed on Configuration.
|
|
129
|
+
*/
|
|
130
|
+
Validate(): ValidationResult;
|
|
112
131
|
ToggleRawJson(): void;
|
|
113
132
|
/** @deprecated Use {@link ToggleRawJson}. */
|
|
114
133
|
toggleRawJson(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-process-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/RecordProcesses/record-process-form.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,
|
|
1
|
+
{"version":3,"file":"record-process-form.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/custom/RecordProcesses/record-process-form.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAa,MAAM,eAAe,CAAC;AAC7D,OAAO,EAA4G,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzK,OAAO,EAAqB,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAuB,MAAM,+BAA+B,CAAC;AAE1I,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,yEAAyE,CAAC;AACvH,OAAO,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;;AAGlH;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAI3E;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE3E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,eAAe,GAAG,IAAI,CAGvF;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,eAAe,GAAG,IAAI,CAEvF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,UAAU,CAAC,EAAE,kBAAkB,GAChC,mBAAmB,EAAE,CAGvB;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,UAAU,CAAC,EAAE,kBAAkB,GAChC,mBAAmB,EAAE,CAEvB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CACxC,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,EAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC9B,sBAAsB,EAAE,CAgG1B;AAED,4DAA4D;AAC5D,wBAAgB,4BAA4B,CACxC,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,EAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC9B,sBAAsB,EAAE,CAE1B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAC7B,oBAAoB,EAAE,CAmBxB;AAED,0DAA0D;AAC1D,wBAAgB,0BAA0B,CACtC,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,GAC7B,oBAAoB,EAAE,CAExB;AAED,0GAA0G;AAC1G,eAAO,MAAM,gCAAgC,gGAAgG,CAAC;AAE9I;;;;GAIG;AACH,wBAAgB,4BAA4B,CACxC,QAAQ,EAAE,qBAAqB,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,SAAS,EAC9D,aAAa,EAAE,OAAO,EACtB,aAAa,CAAC,EAAE,aAAa,CAAC,mBAAmB,CAAC,GACnD,MAAM,EAAE,CAMV;AAED;;;;;;;;;;;;GAYG;AACH,qBAOa,kCAAmC,SAAQ,4BAA6B,YAAW,MAAM;IAClG,yHAAyH;IAClH,aAAa,UAAQ;IAE5B,gGAAgG;IACpD,OAAO,CAAC,eAAe,CAAC,CAAkC;IAEtG,6CAA6C;IAC7C,IAAW,aAAa,YAEvB;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAK,SAAA,EAE7B;IACM,eAAe,UAAS;IAE/B,+CAA+C;IAC/C,IAAW,eAAe,YAEzB;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAK,SAAA,EAE/B;IACM,aAAa,UAAS;IAE7B,6CAA6C;IAC7C,IAAW,aAAa,YAEvB;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAK,SAAA,EAE7B;IACM,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAQ;IAE5E,2CAA2C;IAC3C,IAAW,WAAW,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAEzE;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,EAE7E;IAEc,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAqB1B,gBAAgB;IAuB9B,IAAW,gBAAgB,IAAI,MAAM,CAIpC;IAED,IAAW,gBAAgB,IAAI,UAAU,GAAG,SAAS,CAGpD;IAED,IAAW,YAAY,IAAI,MAAM,CAehC;IAED,IAAW,gBAAgB,IAAI,MAAM,CAWpC;IAEM,oBAAoB,IAAI,IAAI;IAI5B,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAKlD;;;;OAIG;IACa,QAAQ,IAAI,gBAAgB;IAcrC,aAAa,IAAI,IAAI;IAK5B,6CAA6C;IACtC,aAAa,IAAI,IAAI;IAIf,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBzC,2CAA2C;IAC9B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,IAAW,UAAU,IAAI,eAAe,GAAG,IAAI,CAE9C;IAED,IAAW,UAAU,IAAI,kBAAkB,GAAG,SAAS,CAiBtD;IAED,IAAW,UAAU,IAAI,mBAAmB,EAAE,CAE7C;IAED,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,IAAW,cAAc,IAAI,sBAAsB,EAAE,CAEpD;IAED,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,IAAW,iBAAiB,IAAI,oBAAoB,EAAE,CAErD;IAED,IAAW,eAAe,IAAI,MAAM,CAQnC;IAED,IAAW,mBAAmB,IAAI,MAAM,CAUvC;IAED,IAAW,oBAAoB,IAAI,MAAM,CAExC;yCAzQQ,kCAAkC;2CAAlC,kCAAkC;CA0Q9C;AAED;;;GAGG;AACH,qBACa,uBAAwB,SAAQ,cAAc;IACvC,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,GAAG,cAAc;CAkBhG;AAED,oFAAoF;AACpF,wBAAgB,sCAAsC,IAAI,IAAI,CAG7D"}
|
|
@@ -4,9 +4,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
-
import { Component } from '@angular/core';
|
|
8
|
-
import { RegisterClass, RegisterClassEx, SafeJSONParse, EscapeSQLString } from '@memberjunction/global';
|
|
7
|
+
import { Component, ViewChild } from '@angular/core';
|
|
8
|
+
import { RegisterClass, RegisterClassEx, SafeJSONParse, EscapeSQLString, ValidationErrorInfo, ValidationErrorType } from '@memberjunction/global';
|
|
9
9
|
import { BaseFormComponent, BaseFormPolicy, DETAILS_SECTION_KEY } from '@memberjunction/ng-base-forms';
|
|
10
|
+
import { FeaturePipelineBuilderComponent } from '@memberjunction/ng-record-process-studio';
|
|
10
11
|
import { MJRecordProcessFormComponent } from '../../generated/Entities/MJRecordProcess/mjrecordprocess.form.component';
|
|
11
12
|
import { RunView, LogError } from '@memberjunction/core';
|
|
12
13
|
import { validateSpec } from '@memberjunction/feature-pipelines';
|
|
@@ -74,7 +75,7 @@ function RecordProcessFormComponentExtended_Conditional_0_Conditional_66_Templat
|
|
|
74
75
|
} if (rf & 2) {
|
|
75
76
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
76
77
|
i0.ɵɵadvance();
|
|
77
|
-
i0.ɵɵproperty("Record", ctx_r1.record)("EntityID", ctx_r1.record.EntityID);
|
|
78
|
+
i0.ɵɵproperty("Record", ctx_r1.record)("EntityID", ctx_r1.record.EntityID)("Provider", ctx_r1.ProviderToUse);
|
|
78
79
|
} }
|
|
79
80
|
function RecordProcessFormComponentExtended_Conditional_0_Conditional_67_Template(rf, ctx) { if (rf & 1) {
|
|
80
81
|
i0.ɵɵelementStart(0, "div", 32);
|
|
@@ -687,7 +688,7 @@ function RecordProcessFormComponentExtended_Conditional_0_Template(rf, ctx) { if
|
|
|
687
688
|
i0.ɵɵtext(64);
|
|
688
689
|
i0.ɵɵelementEnd()()()()();
|
|
689
690
|
i0.ɵɵelementStart(65, "mj-collapsible-panel", 30);
|
|
690
|
-
i0.ɵɵconditionalCreate(66, RecordProcessFormComponentExtended_Conditional_0_Conditional_66_Template, 2,
|
|
691
|
+
i0.ɵɵconditionalCreate(66, RecordProcessFormComponentExtended_Conditional_0_Conditional_66_Template, 2, 3, "div", 31)(67, RecordProcessFormComponentExtended_Conditional_0_Conditional_67_Template, 2, 3, "div", 32)(68, RecordProcessFormComponentExtended_Conditional_0_Conditional_68_Template, 14, 1, "div", 33);
|
|
691
692
|
i0.ɵɵelementEnd();
|
|
692
693
|
i0.ɵɵelementStart(69, "mj-collapsible-panel", 34);
|
|
693
694
|
i0.ɵɵconditionalCreate(70, RecordProcessFormComponentExtended_Conditional_0_Conditional_70_Template, 2, 1, "div", 35)(71, RecordProcessFormComponentExtended_Conditional_0_Conditional_71_Template, 4, 0, "div", 36);
|
|
@@ -1012,6 +1013,20 @@ export function BuildPromptParamViewModels(spec, inputMapping) {
|
|
|
1012
1013
|
export function buildPromptParamViewModels(spec, inputMapping) {
|
|
1013
1014
|
return BuildPromptParamViewModels(spec, inputMapping);
|
|
1014
1015
|
}
|
|
1016
|
+
/** The message the form refuses a save with when the builder flagged the pipeline without listing why. */
|
|
1017
|
+
export const PIPELINE_BUILDER_INVALID_MESSAGE = 'The pipeline configuration has errors. Fix them under Pipeline Configuration before saving.';
|
|
1018
|
+
/**
|
|
1019
|
+
* Why the record form refuses to save an Infer pipeline the builder reports invalid: the builder's error
|
|
1020
|
+
* messages, once each, or {@link PIPELINE_BUILDER_INVALID_MESSAGE} when they are not available. Empty for
|
|
1021
|
+
* any other work type (the builder only edits Infer pipelines), and while the builder reports it valid.
|
|
1022
|
+
*/
|
|
1023
|
+
export function GetPipelineBuilderSaveErrors(workType, pipelineValid, builderIssues) {
|
|
1024
|
+
if (workType !== 'Infer' || pipelineValid) {
|
|
1025
|
+
return [];
|
|
1026
|
+
}
|
|
1027
|
+
const messages = (builderIssues ?? []).filter((issue) => issue.Severity === 'error').map((issue) => issue.Message);
|
|
1028
|
+
return messages.length > 0 ? Array.from(new Set(messages)) : [PIPELINE_BUILDER_INVALID_MESSAGE];
|
|
1029
|
+
}
|
|
1015
1030
|
/**
|
|
1016
1031
|
* Custom form override for `MJ: Record Processes` (priority 100).
|
|
1017
1032
|
* Presents the Record Process / Feature Pipeline in a first-class MJ form with:
|
|
@@ -1028,6 +1043,7 @@ export function buildPromptParamViewModels(spec, inputMapping) {
|
|
|
1028
1043
|
let RecordProcessFormComponentExtended = class RecordProcessFormComponentExtended extends MJRecordProcessFormComponent {
|
|
1029
1044
|
constructor() {
|
|
1030
1045
|
super(...arguments);
|
|
1046
|
+
/** Whether the Feature Pipeline builder last reported the pipeline valid. The form refuses to save while it is false. */
|
|
1031
1047
|
this.PipelineValid = true;
|
|
1032
1048
|
this.RawJsonExpanded = false;
|
|
1033
1049
|
this.RawJsonCopied = false;
|
|
@@ -1155,6 +1171,24 @@ let RecordProcessFormComponentExtended = class RecordProcessFormComponentExtende
|
|
|
1155
1171
|
this.PipelineValid = valid;
|
|
1156
1172
|
this.cdr.markForCheck();
|
|
1157
1173
|
}
|
|
1174
|
+
/**
|
|
1175
|
+
* The record's validation (which includes the shared Feature Pipeline save check), plus the builder's
|
|
1176
|
+
* verdict: while the builder reports an Infer pipeline invalid, the save is refused and its errors are
|
|
1177
|
+
* listed on Configuration.
|
|
1178
|
+
*/
|
|
1179
|
+
Validate() {
|
|
1180
|
+
const result = super.Validate();
|
|
1181
|
+
const builderErrors = GetPipelineBuilderSaveErrors(this.record?.WorkType, this.PipelineValid, this.pipelineBuilder?.ValidationErrors);
|
|
1182
|
+
for (const message of builderErrors) {
|
|
1183
|
+
if (!result.Errors.some((error) => error.Message === message)) {
|
|
1184
|
+
result.Errors.push(new ValidationErrorInfo('Configuration', message, this.record?.Configuration, ValidationErrorType.Failure));
|
|
1185
|
+
}
|
|
1186
|
+
}
|
|
1187
|
+
if (builderErrors.length > 0) {
|
|
1188
|
+
result.Success = false;
|
|
1189
|
+
}
|
|
1190
|
+
return result;
|
|
1191
|
+
}
|
|
1158
1192
|
ToggleRawJson() {
|
|
1159
1193
|
this.RawJsonExpanded = !this.RawJsonExpanded;
|
|
1160
1194
|
this.cdr.markForCheck();
|
|
@@ -1252,7 +1286,12 @@ let RecordProcessFormComponentExtended = class RecordProcessFormComponentExtende
|
|
|
1252
1286
|
return this.record?.ScopeFilter?.trim() || '';
|
|
1253
1287
|
}
|
|
1254
1288
|
static { this.ɵfac = /*@__PURE__*/ (() => { let ɵRecordProcessFormComponentExtended_BaseFactory; return function RecordProcessFormComponentExtended_Factory(__ngFactoryType__) { return (ɵRecordProcessFormComponentExtended_BaseFactory || (ɵRecordProcessFormComponentExtended_BaseFactory = i0.ɵɵgetInheritedFactory(RecordProcessFormComponentExtended)))(__ngFactoryType__ || RecordProcessFormComponentExtended); }; })(); }
|
|
1255
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RecordProcessFormComponentExtended, selectors: [["mj-record-process-form-extended"]],
|
|
1289
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RecordProcessFormComponentExtended, selectors: [["mj-record-process-form-extended"]], viewQuery: function RecordProcessFormComponentExtended_Query(rf, ctx) { if (rf & 1) {
|
|
1290
|
+
i0.ɵɵviewQuery(FeaturePipelineBuilderComponent, 5);
|
|
1291
|
+
} if (rf & 2) {
|
|
1292
|
+
let _t;
|
|
1293
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.pipelineBuilder = _t.first);
|
|
1294
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [[3, "Record", "FormComponent"], [3, "Navigate", "DeleteRequested", "FavoriteToggled", "HistoryRequested", "ListManagementRequested", "Record", "FormComponent"], ["Slot", "before-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "processOverview", "SectionName", "Overview & Status", "Icon", "fa-solid fa-gauge-high", 3, "Form", "FormContext", "DefaultExpanded"], [1, "rpf-overview-container"], [1, "rpf-hero-card"], [1, "rpf-hero-main"], [1, "rpf-hero-icon-wrap"], [1, "rpf-hero-info"], [1, "rpf-hero-title-row"], [1, "rpf-hero-title"], [1, "rpf-badge", 3, "ngClass"], [1, "rpf-badge-dot"], [1, "rpf-hero-desc"], [1, "rpf-hero-pills"], ["title", "Target Entity", 1, "rpf-pill"], [1, "fa-solid", "fa-database"], ["title", "Work Type", 1, "rpf-pill"], ["title", "Feature Pipeline", 1, "rpf-pill", "rpf-pill-feature"], [1, "rpf-kpi-grid"], [1, "rpf-kpi-card"], [1, "rpf-kpi-label"], [1, "fa-solid", "fa-filter"], [1, "rpf-kpi-value"], [1, "rpf-kpi-sub", 3, "title"], [1, "fa-solid", "fa-bolt"], [1, "muted"], [1, "rpf-kpi-sub"], [1, "fa-solid", "fa-water"], [1, "fa-solid", "fa-microchip"], ["SectionKey", "pipelineConfiguration", "SectionName", "Pipeline Configuration", "Icon", "fa-solid fa-wand-magic-sparkles", "Variant", "related-entity", 3, "Form", "FormContext", "DefaultExpanded"], [1, "rpf-pipeline-builder-wrap"], [1, "rpf-editor-wrap"], [1, "rpf-generic-config-wrap"], ["SectionKey", "processRuns", "SectionName", "Prior Runs", "Icon", "fa-solid fa-clock-rotate-left", "Variant", "related-entity", 3, "Form", "FormContext", "DefaultExpanded"], [1, "rpf-history-wrap"], [1, "rpf-notice-card"], ["SectionKey", "processDefinition", "SectionName", "Process Definition", "Icon", "fa fa-info-circle", 3, "Form", "FormContext"], ["FieldName", "Name", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Description", "Type", "textarea", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "CategoryID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "EntityID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Status", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "executionLogic", "SectionName", "Execution Logic", "Icon", "fa fa-play", 3, "Form", "FormContext", "DefaultExpanded"], ["SectionKey", "scopeConfiguration", "SectionName", "Scope Configuration", "Icon", "fa fa-filter", 3, "Form", "FormContext"], [1, "rpf-scope-infer-wrap"], ["SectionKey", "triggers", "SectionName", "Triggers", "Icon", "fa fa-bolt", 3, "Form", "FormContext"], ["FieldName", "OnChangeEnabled", "Type", "checkbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "OnChangeInvocationType", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "OnChangeFilter", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ScheduleEnabled", "Type", "checkbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "CronExpression", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Timezone", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "OnDemandEnabled", "Type", "checkbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["SectionKey", "performanceAndOptimization", "SectionName", "Performance and Optimization", "Icon", "fa fa-tachometer-alt", 3, "Form", "FormContext"], ["SectionKey", "systemMetadata", "SectionName", "System Metadata", "Icon", "fa fa-database", 3, "Form", "FormContext", "DefaultExpanded"], ["FieldName", "__mj_CreatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "__mj_UpdatedAt", "Type", "textbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["Slot", "after-fields", 3, "Entity", "Record", "FormComponent", "FormContext"], ["SectionKey", "mJRecordProcessWatermarks", "SectionName", "Record Process Watermarks", "Icon", "fa fa-water", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["SectionKey", "mJMLModelScoringBindings", "SectionName", "ML Model Scoring Bindings", "Icon", "fa fa-project-diagram", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["SectionKey", "mJFeatureValues", "SectionName", "Feature Values", "Icon", "fa fa-history", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["SectionKey", "mJFeatureValueCaches", "SectionName", "Feature Value Caches", "Icon", "fa fa-database", "Variant", "related-entity", 3, "Form", "FormContext", "BadgeCount", "DefaultExpanded"], ["Slot", "after-related", 3, "Entity", "Record", "FormComponent", "FormContext"], [1, "fa-solid", "fa-sparkles"], [3, "SpecChange", "ValidChange", "Record", "EntityID", "Provider"], [3, "Record", "ShowToolbar", "Provider"], [1, "fa-solid", "fa-circle-info"], [3, "RecordProcessID"], [1, "rpf-audit-bar"], [1, "rpf-audit-badges"], [1, "rpf-audit-chip"], [1, "fa-solid", "fa-check-circle", 2, "color", "var(--mj-status-success)"], [1, "rpf-prompt-grid"], [1, "rpf-card-box"], [1, "rpf-box-eyebrow"], [1, "rpf-prompt-title"], [1, "fa-solid", "fa-message-code"], [1, "rpf-chip-wrap"], [1, "rpf-sm-chip", "rpf-sm-chip-brand"], [1, "rpf-sm-chip"], [2, "margin-top", "10px"], [1, "rpf-param-list"], [2, "font-size", "12px", "color", "var(--mj-text-muted)"], [1, "rpf-sql-preview-box"], [1, "rpf-sql-preview-label"], [1, "fa-solid", "fa-code"], [1, "rpf-sql-preview-code"], [1, "rpf-table-wrap"], [1, "rpf-feature-table"], [1, "rpf-raw-json-drawer"], [1, "rpf-raw-json-header", 3, "click"], [1, "rpf-raw-json-title"], ["type", "button", 1, "rpf-sm-chip", 3, "click"], [1, "rpf-raw-json-body"], [1, "rpf-edit-fields-divider"], ["FieldName", "PromptID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], [1, "rpf-param-row"], [1, "rpf-param-name"], [1, "fa-solid", "fa-arrow-left", "rpf-param-arrow"], [1, "rpf-feature-name-cell"], [1, "rpf-type-tag"], [1, "rpf-sm-chip", 3, "title"], [1, "fa-solid", "fa-shield"], [1, "rpf-binding-pill"], [2, "color", "var(--mj-text-muted)", "font-size", "11px"], [1, "fa-solid", "fa-brain"], ["colspan", "5", 2, "text-align", "center", "color", "var(--mj-text-muted)", "padding", "20px"], ["FieldName", "WorkType", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "Configuration", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "OutputMapping", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ActionID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "AgentID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "InputMapping", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], [1, "rpf-scope-summary-row"], [1, "rpf-scope-badge-group"], [1, "rpf-scope-chip"], [1, "rpf-scope-chip", "rpf-scope-chip-brand"], [1, "fa-solid", "fa-calculator"], ["FieldName", "ScopeType", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ScopeFilter", "Type", "code", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ScopeViewID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "ScopeListID", "Type", "textbox", "LinkType", "Record", 3, "Record", "ShowLabel", "EditMode", "FormContext"], [1, "rpf-opt-grid"], [1, "rpf-opt-card"], [1, "rpf-opt-label"], [1, "rpf-opt-value"], [1, "rpf-opt-sub"], ["FieldName", "SkipUnchanged", "Type", "checkbox", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "WatermarkStrategy", "Type", "select", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "BatchSize", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], ["FieldName", "MaxConcurrency", "Type", "number", 3, "Record", "ShowLabel", "EditMode", "FormContext"], [3, "Navigate", "AfterDataLoad", "Params", "NewRecordValues", "AllowLoad", "ShowToolbar"]], template: function RecordProcessFormComponentExtended_Template(rf, ctx) { if (rf & 1) {
|
|
1256
1295
|
i0.ɵɵconditionalCreate(0, RecordProcessFormComponentExtended_Conditional_0_Template, 108, 142, "mj-record-form-container", 0);
|
|
1257
1296
|
} if (rf & 2) {
|
|
1258
1297
|
i0.ɵɵconditional(ctx.record ? 0 : -1);
|
|
@@ -1264,9 +1303,12 @@ RecordProcessFormComponentExtended = __decorate([
|
|
|
1264
1303
|
export { RecordProcessFormComponentExtended };
|
|
1265
1304
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RecordProcessFormComponentExtended, [{
|
|
1266
1305
|
type: Component,
|
|
1267
|
-
args: [{ standalone: false, selector: 'mj-record-process-form-extended', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n OVERVIEW & STATUS (Lead Panel)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"processOverview\"\n SectionName=\"Overview & Status\"\n Icon=\"fa-solid fa-gauge-high\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n <div class=\"rpf-overview-container\">\n <!-- Hero Header Card -->\n <div class=\"rpf-hero-card\">\n <div class=\"rpf-hero-main\">\n <div class=\"rpf-hero-icon-wrap\">\n <i [class]=\"WorkTypeIcon\"></i>\n </div>\n <div class=\"rpf-hero-info\">\n <div class=\"rpf-hero-title-row\">\n <h2 class=\"rpf-hero-title\">{{ record.Name || 'Untitled Process' }}</h2>\n <span class=\"rpf-badge\" [ngClass]=\"StatusBadgeClass\">\n <span class=\"rpf-badge-dot\"></span>\n {{ record.Status || 'Draft' }}\n </span>\n </div>\n <p class=\"rpf-hero-desc\">{{ record.Description || 'No description provided for this process.' }}</p>\n <div class=\"rpf-hero-pills\">\n <span class=\"rpf-pill\" title=\"Target Entity\">\n <i class=\"fa-solid fa-database\"></i>\n <span>{{ TargetEntityName }}</span>\n </span>\n <span class=\"rpf-pill\" title=\"Work Type\">\n <i [class]=\"WorkTypeIcon\"></i>\n <span>{{ record.WorkType || 'Not set' }}</span>\n </span>\n @if (record.WorkType === 'Infer') {\n <span class=\"rpf-pill rpf-pill-feature\" title=\"Feature Pipeline\">\n <i class=\"fa-solid fa-sparkles\"></i>\n <span>Feature Pipeline</span>\n </span>\n }\n </div>\n </div>\n </div>\n </div>\n\n <!-- KPI Summary Grid -->\n <div class=\"rpf-kpi-grid\">\n <div class=\"rpf-kpi-card\">\n <div class=\"rpf-kpi-label\"><i class=\"fa-solid fa-filter\"></i> Target Scope</div>\n <div class=\"rpf-kpi-value\">{{ record.ScopeType || 'Filter' }}</div>\n <div class=\"rpf-kpi-sub\" [title]=\"record.ScopeFilter || 'All records in scope'\">\n {{ record.ScopeFilter ? record.ScopeFilter : 'No filter applied (all records)' }}\n </div>\n </div>\n\n <div class=\"rpf-kpi-card\">\n <div class=\"rpf-kpi-label\"><i class=\"fa-solid fa-bolt\"></i> Triggers</div>\n <div class=\"rpf-kpi-value\">\n @if (record.ScheduleEnabled) {\n <span>Scheduled</span>\n } @else if (record.OnChangeEnabled) {\n <span>On Change</span>\n } @else if (record.OnDemandEnabled) {\n <span>On Demand</span>\n } @else {\n <span class=\"muted\">Manual</span>\n }\n </div>\n <div class=\"rpf-kpi-sub\">\n @if (record.ScheduleEnabled && record.CronExpression) {\n <code>{{ record.CronExpression }}</code>\n } @else if (record.OnChangeEnabled) {\n <span>Mode: {{ record.OnChangeInvocationType || 'Immediate' }}</span>\n } @else {\n <span>On demand execution</span>\n }\n </div>\n </div>\n\n <div class=\"rpf-kpi-card\">\n <div class=\"rpf-kpi-label\"><i class=\"fa-solid fa-water\"></i> Optimization</div>\n <div class=\"rpf-kpi-value\">{{ record.WatermarkStrategy || 'None' }}</div>\n <div class=\"rpf-kpi-sub\">\n Batch: {{ record.BatchSize || 'default' }} | Concurrency: {{ record.MaxConcurrency || '1' }}\n </div>\n </div>\n\n <div class=\"rpf-kpi-card\">\n <div class=\"rpf-kpi-label\"><i class=\"fa-solid fa-microchip\"></i> Skip Unchanged</div>\n <div class=\"rpf-kpi-value\">{{ record.SkipUnchanged ? 'Enabled' : 'Disabled' }}</div>\n <div class=\"rpf-kpi-sub\">\n {{ record.SkipUnchanged ? 'Skips re-evaluating unchanged rows' : 'Processes all matching rows' }}\n </div>\n </div>\n </div>\n </div>\n </mj-collapsible-panel>\n\n <!-- ========================================\n PIPELINE CONFIGURATION (Visual Builder)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"pipelineConfiguration\"\n SectionName=\"Pipeline Configuration\"\n Icon=\"fa-solid fa-wand-magic-sparkles\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n @if (record.WorkType === 'Infer') {\n <div class=\"rpf-pipeline-builder-wrap\">\n <mj-feature-pipeline-builder\n [Record]=\"record\"\n [EntityID]=\"record.EntityID\"\n (SpecChange)=\"OnPipelineSpecChange()\"\n (ValidChange)=\"OnPipelineValidChange($event)\">\n </mj-feature-pipeline-builder>\n </div>\n } @else if (record.WorkType === 'FieldRules') {\n <div class=\"rpf-editor-wrap\">\n <mj-record-process-editor\n [Record]=\"record\"\n [ShowToolbar]=\"false\"\n [Provider]=\"ProviderToUse\">\n </mj-record-process-editor>\n </div>\n } @else {\n <div class=\"rpf-generic-config-wrap\">\n <div class=\"rpf-notice-card\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <div>\n <strong>{{ record.WorkType || 'Custom' }} Execution Logic</strong>\n <p>Configure actions, prompts, and mappings in the <em>Process Definition</em> and <em>Execution Logic</em> sections below.</p>\n </div>\n </div>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ========================================\n PRIOR RUNS & AUDIT (Embedded History)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"processRuns\"\n SectionName=\"Prior Runs\"\n Icon=\"fa-solid fa-clock-rotate-left\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n @if (record.IsSaved) {\n <div class=\"rpf-history-wrap\">\n <mj-record-process-history\n [RecordProcessID]=\"record.ID\">\n </mj-record-process-history>\n </div>\n } @else {\n <div class=\"rpf-notice-card\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span>Save this record process to view execution history and per-record audit logs.</span>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ========================================\n FIELD PANELS (Fold into Details rail)\n ======================================== -->\n\n <!-- Process Definition Section -->\n <mj-collapsible-panel\n SectionKey=\"processDefinition\"\n SectionName=\"Process Definition\"\n Icon=\"fa fa-info-circle\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Name\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Description\" Type=\"textarea\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"CategoryID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"EntityID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Status\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Execution Logic Section -->\n <mj-collapsible-panel\n SectionKey=\"executionLogic\"\n SectionName=\"Execution Logic\"\n Icon=\"fa fa-play\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"false\">\n @if (record.WorkType === 'Infer') {\n <!-- Health & Schema Audit Bar -->\n <div class=\"rpf-audit-bar\" [class.rpf-audit-bar-warning]=\"!IsSpecValid\">\n <div class=\"rpf-audit-badges\">\n <div class=\"rpf-audit-chip\" [class.rpf-audit-chip-valid]=\"IsSpecValid\" [class.rpf-audit-chip-warning]=\"!IsSpecValid\">\n <i [class]=\"IsSpecValid ? 'fa-solid fa-shield-check' : 'fa-solid fa-triangle-exclamation'\"></i>\n <span>{{ IsSpecValid ? 'Configuration Valid' : 'Configuration Issues Found' }}</span>\n </div>\n <div class=\"rpf-audit-chip\">\n <i class=\"fa-solid fa-check-circle\" style=\"color: var(--mj-status-success);\"></i>\n <span>{{ BoundFeaturesCount }} of {{ TotalFeaturesCount }} Features Bound to Target</span>\n </div>\n <div class=\"rpf-audit-chip\">\n <i class=\"fa-solid fa-database\"></i>\n <span>Context: {{ ContextModeText }}</span>\n </div>\n </div>\n </div>\n\n <!-- AI Model & Context Query Section -->\n <div class=\"rpf-prompt-grid\">\n <!-- Prompt Card -->\n <div class=\"rpf-card-box\">\n <div class=\"rpf-box-eyebrow\">Bound AI Prompt</div>\n <div class=\"rpf-prompt-title\">\n <i class=\"fa-solid fa-message-code\"></i>\n <span>{{ record.PromptID ? 'Prompt Configured' : 'No Prompt Selected' }}</span>\n </div>\n <div class=\"rpf-chip-wrap\">\n @if (record.PromptID) {\n <span class=\"rpf-sm-chip rpf-sm-chip-brand\">ID: {{ record.PromptID.substring(0, 8) }}...</span>\n }\n <span class=\"rpf-sm-chip\"><i class=\"fa-solid fa-sparkles\"></i> Feature Infer Engine</span>\n <span class=\"rpf-sm-chip\"><i class=\"fa-solid fa-microchip\"></i> LLM Output Parser</span>\n </div>\n @if (EditMode) {\n <div style=\"margin-top: 10px;\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"PromptID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n </div>\n }\n </div>\n\n <!-- Parameters Resolution Card -->\n <div class=\"rpf-card-box\">\n <div class=\"rpf-box-eyebrow\">Prompt Parameter Resolution</div>\n @if (ParameterMappings.length > 0) {\n <div class=\"rpf-param-list\">\n @for (item of ParameterMappings; track item.Param) {\n <div class=\"rpf-param-row\">\n <span class=\"rpf-param-name\">{{ item.Param }}</span>\n <span>\n <i class=\"fa-solid fa-arrow-left rpf-param-arrow\"></i>\n <span>Column: <code>{{ item.Field }}</code></span>\n </span>\n </div>\n }\n </div>\n } @else {\n <div style=\"font-size: 12px; color: var(--mj-text-muted);\">\n No parameter bindings configured. Entire row context will be passed to prompt.\n </div>\n }\n </div>\n </div>\n\n <!-- Context Query Display -->\n <div class=\"rpf-sql-preview-box\">\n <div class=\"rpf-sql-preview-label\">\n <i class=\"fa-solid fa-code\"></i> Context Retrieval Query\n </div>\n <div class=\"rpf-sql-preview-code\">\n <code>{{ ContextQueryDisplay }}</code>\n </div>\n </div>\n\n <!-- Feature Output Schema & Entity Mappings Table -->\n <div class=\"rpf-table-wrap\">\n <table class=\"rpf-feature-table\">\n <thead>\n <tr>\n <th>Feature Name</th>\n <th>Kind / Type</th>\n <th>Validation Constraints</th>\n <th>Target Field Binding</th>\n <th>Reasoning</th>\n </tr>\n </thead>\n <tbody>\n @if (FeatureOutputs.length > 0) {\n @for (out of FeatureOutputs; track out.Name) {\n <tr>\n <td>\n <div class=\"rpf-feature-name-cell\">\n <i [class]=\"out.FeatureKind === 'numeric' ? 'fa-solid fa-chart-line' : 'fa-solid fa-tags'\"\n [style.color]=\"out.FeatureKind === 'numeric' ? '#f59e0b' : '#8b5cf6'\"></i>\n <span>{{ out.Name }}</span>\n </div>\n </td>\n <td>\n <span class=\"rpf-type-tag\"\n [class.rpf-type-numeric]=\"out.FeatureKind === 'numeric'\"\n [class.rpf-type-categorical]=\"out.FeatureKind === 'categorical'\"\n [class.rpf-type-default]=\"out.FeatureKind !== 'numeric' && out.FeatureKind !== 'categorical'\">\n {{ out.FeatureKind }}\n </span>\n </td>\n <td>\n <span class=\"rpf-sm-chip\" [title]=\"'Violation policy: ' + out.ViolationPolicy\">\n <i class=\"fa-solid fa-shield\"></i> {{ out.ConstraintSummary }}\n </span>\n </td>\n <td>\n <div class=\"rpf-binding-pill\">\n <i [class]=\"out.TargetFieldExists ? 'fa-solid fa-check-circle rpf-binding-valid' : 'fa-solid fa-triangle-exclamation rpf-binding-invalid'\"></i>\n <span>{{ TargetEntityName }}.<strong>{{ out.TargetField }}</strong></span>\n <span style=\"color: var(--mj-text-muted); font-size: 11px;\">({{ out.TargetFieldType }})</span>\n </div>\n </td>\n <td>\n @if (out.ReasoningTarget === 'Enabled') {\n <span class=\"rpf-sm-chip rpf-sm-chip-brand\"><i class=\"fa-solid fa-brain\"></i> Captured</span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-size: 11px;\">None</span>\n }\n </td>\n </tr>\n }\n } @else {\n <tr>\n <td colspan=\"5\" style=\"text-align: center; color: var(--mj-text-muted); padding: 20px;\">\n No output features defined yet. Use the <em>Pipeline Configuration</em> builder tab to add output features.\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Advanced Raw JSON Drawer -->\n <div class=\"rpf-raw-json-drawer\">\n <div class=\"rpf-raw-json-header\" (click)=\"ToggleRawJson()\">\n <div class=\"rpf-raw-json-title\">\n <i [class]=\"RawJsonExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-code\"></i>\n <span>Power User Escape Hatch: View Raw Pipeline Configuration JSON</span>\n </div>\n <button type=\"button\" class=\"rpf-sm-chip\" (click)=\"$event.stopPropagation(); CopyRawJson()\">\n <i [class]=\"RawJsonCopied ? 'fa-solid fa-check' : 'fa-regular fa-copy'\"></i>\n <span>{{ RawJsonCopied ? 'Copied!' : 'Copy JSON' }}</span>\n </button>\n </div>\n @if (RawJsonExpanded) {\n <div class=\"rpf-raw-json-body\">\n <pre><code>{{ FormattedRawJson }}</code></pre>\n </div>\n }\n </div>\n\n @if (EditMode) {\n <div class=\"rpf-edit-fields-divider\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"WorkType\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Configuration\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OutputMapping\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </div>\n }\n } @else {\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"WorkType\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ActionID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"AgentID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"PromptID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"InputMapping\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OutputMapping\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Configuration\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n }\n </mj-collapsible-panel>\n\n <!-- Scope Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"scopeConfiguration\"\n SectionName=\"Scope Configuration\"\n Icon=\"fa fa-filter\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n @if (record.WorkType === 'Infer') {\n <div class=\"rpf-scope-infer-wrap\">\n <div class=\"rpf-scope-summary-row\">\n <div class=\"rpf-scope-badge-group\">\n <span class=\"rpf-scope-chip\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>Scope Type: <strong>{{ record.ScopeType || 'Filter' }}</strong></span>\n </span>\n @if (record.ScopeFilter) {\n <span class=\"rpf-scope-chip rpf-scope-chip-brand\">\n <i class=\"fa-solid fa-calculator\"></i>\n <span>Filter Active</span>\n </span>\n }\n </div>\n </div>\n @if (FormattedScopeFilter) {\n <div class=\"rpf-sql-preview-box\">\n <div class=\"rpf-sql-preview-label\">\n <i class=\"fa-solid fa-database\"></i> SQL Scope Filter (WHERE clause)\n </div>\n <div class=\"rpf-sql-preview-code\">\n <code>{{ FormattedScopeFilter }}</code>\n </div>\n </div>\n } @else {\n <div class=\"rpf-notice-card\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span>No scope filter applied. All records in <strong>{{ TargetEntityName }}</strong> will be evaluated.</span>\n </div>\n }\n @if (EditMode) {\n <div class=\"rpf-edit-fields-divider\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeType\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeFilter\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </div>\n }\n </div>\n } @else {\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeType\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeViewID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeListID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeFilter\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n }\n </mj-collapsible-panel>\n\n <!-- Triggers Section -->\n <mj-collapsible-panel\n SectionKey=\"triggers\"\n SectionName=\"Triggers\"\n Icon=\"fa fa-bolt\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OnChangeEnabled\" Type=\"checkbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OnChangeInvocationType\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OnChangeFilter\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScheduleEnabled\" Type=\"checkbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"CronExpression\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Timezone\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OnDemandEnabled\" Type=\"checkbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Performance and Optimization Section -->\n <mj-collapsible-panel\n SectionKey=\"performanceAndOptimization\"\n SectionName=\"Performance and Optimization\"\n Icon=\"fa fa-tachometer-alt\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n @if (record.WorkType === 'Infer') {\n <div class=\"rpf-opt-grid\">\n <div class=\"rpf-opt-card\">\n <div class=\"rpf-opt-label\">Delta Watermark</div>\n <div class=\"rpf-opt-value\">{{ record.WatermarkStrategy || 'Checksum' }}</div>\n <div class=\"rpf-opt-sub\">Evaluates row state changes</div>\n </div>\n <div class=\"rpf-opt-card\">\n <div class=\"rpf-opt-label\">Batch Processing</div>\n <div class=\"rpf-opt-value\">{{ record.BatchSize || 100 }} records</div>\n <div class=\"rpf-opt-sub\">Per inference chunk</div>\n </div>\n <div class=\"rpf-opt-card\">\n <div class=\"rpf-opt-label\">Concurrency</div>\n <div class=\"rpf-opt-value\">{{ record.MaxConcurrency || 1 }} Parallel</div>\n <div class=\"rpf-opt-sub\">Concurrent worker threads</div>\n </div>\n <div class=\"rpf-opt-card\">\n <div class=\"rpf-opt-label\">Skip Unchanged</div>\n <div class=\"rpf-opt-value\" [class.rpf-text-success]=\"record.SkipUnchanged\">\n <i [class]=\"record.SkipUnchanged ? 'fa-solid fa-check' : 'fa-solid fa-minus'\"></i>\n {{ record.SkipUnchanged ? 'Enabled' : 'Disabled' }}\n </div>\n <div class=\"rpf-opt-sub\">Skips re-evaluating unchanged rows</div>\n </div>\n </div>\n @if (EditMode) {\n <div class=\"rpf-edit-fields-divider\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"SkipUnchanged\" Type=\"checkbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"WatermarkStrategy\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BatchSize\" Type=\"number\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"MaxConcurrency\" Type=\"number\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </div>\n }\n } @else {\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"SkipUnchanged\" Type=\"checkbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"WatermarkStrategy\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BatchSize\" Type=\"number\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"MaxConcurrency\" Type=\"number\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n }\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-database\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"false\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"__mj_CreatedAt\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"__mj_UpdatedAt\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- Record Process Watermarks Section -->\n <mj-collapsible-panel\n SectionKey=\"mJRecordProcessWatermarks\"\n SectionName=\"Record Process Watermarks\"\n Icon=\"fa fa-water\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJRecordProcessWatermarks')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Record Process Watermarks','RecordProcessID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Record Process Watermarks','RecordProcessID')\"\n [AllowLoad]=\"IsSectionExpanded('mJRecordProcessWatermarks')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJRecordProcessWatermarks', $event.totalRowCount)\">\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ML Model Scoring Bindings Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLModelScoringBindings\"\n SectionName=\"ML Model Scoring Bindings\"\n Icon=\"fa fa-project-diagram\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLModelScoringBindings')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Model Scoring Bindings','RecordProcessID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Model Scoring Bindings','RecordProcessID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLModelScoringBindings')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLModelScoringBindings', $event.totalRowCount)\">\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Feature Values Section -->\n <mj-collapsible-panel\n SectionKey=\"mJFeatureValues\"\n SectionName=\"Feature Values\"\n Icon=\"fa fa-history\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJFeatureValues')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Feature Values','RecordProcessID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Feature Values','RecordProcessID')\"\n [AllowLoad]=\"IsSectionExpanded('mJFeatureValues')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJFeatureValues', $event.totalRowCount)\">\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Feature Value Caches Section -->\n <mj-collapsible-panel\n SectionKey=\"mJFeatureValueCaches\"\n SectionName=\"Feature Value Caches\"\n Icon=\"fa fa-database\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJFeatureValueCaches')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Feature Value Caches','RecordProcessID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Feature Value Caches','RecordProcessID')\"\n [AllowLoad]=\"IsSectionExpanded('mJFeatureValueCaches')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJFeatureValueCaches', $event.totalRowCount)\">\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n</mj-record-form-container>\n}\n", styles: ["/* ==========================================================================\n Record Process / Feature Pipeline Custom Form Styles\n Uses standard MemberJunction design tokens for full light & dark mode support.\n ========================================================================== */\n\n.rpf-overview-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 4px 0 12px 0;\n}\n\n/* Hero Header Card */\n.rpf-hero-card {\n background: var(--mj-bg-surface-elevated, #ffffff);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 10px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n}\n\n.rpf-hero-main {\n display: flex;\n align-items: flex-start;\n gap: 18px;\n}\n\n.rpf-hero-icon-wrap {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n color: var(--mj-brand-primary, #0284c7);\n font-size: 22px;\n flex-shrink: 0;\n}\n\n.rpf-hero-info {\n flex: 1;\n min-width: 0;\n}\n\n.rpf-hero-title-row {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n margin-bottom: 6px;\n}\n\n.rpf-hero-title {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary, #0f172a);\n line-height: 1.3;\n}\n\n.rpf-hero-desc {\n margin: 0 0 12px 0;\n font-size: 14px;\n color: var(--mj-text-secondary, #64748b);\n line-height: 1.5;\n}\n\n.rpf-hero-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.rpf-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n border: 1px solid var(--mj-border-subtle, #e2e8f0);\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary, #475569);\n}\n\n.rpf-pill-feature {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n/* Status Badges */\n.rpf-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: 9999px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.rpf-badge-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n}\n\n.rpf-status-active {\n background: var(--mj-status-success-bg, color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface)));\n color: var(--mj-status-success-text, var(--mj-status-success));\n border: 1px solid var(--mj-status-success-border, color-mix(in srgb, var(--mj-status-success) 30%, transparent));\n}\n.rpf-status-active .rpf-badge-dot {\n background: var(--mj-status-success);\n}\n\n.rpf-status-draft {\n background: var(--mj-status-warning-bg, color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface)));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n border: 1px solid var(--mj-status-warning-border, color-mix(in srgb, var(--mj-status-warning) 30%, transparent));\n}\n.rpf-status-draft .rpf-badge-dot {\n background: var(--mj-status-warning);\n}\n\n.rpf-status-disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-subtle);\n}\n.rpf-status-disabled .rpf-badge-dot {\n background: var(--mj-text-muted);\n}\n\n.rpf-status-default {\n background: var(--mj-bg-surface-sunken, #f1f5f9);\n color: var(--mj-text-secondary, #64748b);\n border: 1px solid var(--mj-border-subtle, #cbd5e1);\n}\n.rpf-status-default .rpf-badge-dot {\n background: var(--mj-text-secondary, #64748b);\n}\n\n/* KPI Grid */\n.rpf-kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n}\n\n.rpf-kpi-card {\n background: var(--mj-bg-surface-elevated, #ffffff);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.rpf-kpi-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted, #94a3b8);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.rpf-kpi-value {\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary, #0f172a);\n}\n\n.rpf-kpi-sub {\n font-size: 12px;\n color: var(--mj-text-secondary, #64748b);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.rpf-kpi-sub code {\n font-family: var(--mj-font-mono, monospace);\n font-size: 11px;\n padding: 1px 4px;\n background: var(--mj-bg-surface-sunken, #f1f5f9);\n border-radius: 4px;\n}\n\n/* Wrappers for child components */\n.rpf-pipeline-builder-wrap {\n padding: 8px 0;\n}\n\n.rpf-editor-wrap {\n padding: 8px 0;\n}\n\n.rpf-history-wrap {\n padding: 8px 0;\n}\n\n.rpf-notice-card {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n border: 1px solid var(--mj-border-subtle, #e2e8f0);\n border-radius: 8px;\n color: var(--mj-text-secondary, #64748b);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.rpf-notice-card i {\n font-size: 16px;\n color: var(--mj-brand-primary, #0284c7);\n margin-top: 2px;\n}\n\n.rpf-notice-card strong {\n display: block;\n color: var(--mj-text-primary, #0f172a);\n margin-bottom: 2px;\n}\n\n.rpf-notice-card p {\n margin: 0;\n}\n\n/* ==========================================================================\n Option A: Semantic Cards for Infer Feature Pipeline Details\n ========================================================================== */\n\n/* Schema Health / Audit Banner */\n.rpf-audit-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 12px;\n padding: 10px 16px;\n background: var(--mj-bg-surface-elevated, #ffffff);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-left: 4px solid var(--mj-status-success, #22c55e);\n border-radius: 8px;\n margin-bottom: 16px;\n}\n\n.rpf-audit-bar-warning {\n border-left-color: var(--mj-status-warning, #f59e0b);\n}\n\n.rpf-audit-badges {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.rpf-audit-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary, #475569);\n font-weight: 500;\n}\n\n.rpf-audit-chip-valid {\n color: var(--mj-status-success-text, #15803d);\n font-weight: 600;\n}\n\n.rpf-audit-chip-warning {\n color: var(--mj-status-warning-text, #b45309);\n font-weight: 600;\n}\n\n/* Prompt Card & Resolution Grid */\n.rpf-prompt-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 14px;\n margin-bottom: 16px;\n}\n\n@media (max-width: 768px) {\n .rpf-prompt-grid {\n grid-template-columns: 1fr;\n }\n}\n\n.rpf-card-box {\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n padding: 14px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n}\n\n.rpf-box-eyebrow {\n font-size: 11px;\n text-transform: uppercase;\n font-weight: 700;\n color: var(--mj-text-muted, #94a3b8);\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n.rpf-prompt-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-brand-primary, #0076b6);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.rpf-chip-wrap {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 10px;\n}\n\n.rpf-sm-chip {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 8px;\n border-radius: 4px;\n font-size: 11px;\n background: var(--mj-bg-surface, #ffffff);\n color: var(--mj-text-secondary, #475569);\n border: 1px solid var(--mj-border-subtle, #e2e8f0);\n}\n\n.rpf-sm-chip-brand {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n font-weight: 600;\n}\n\n.rpf-param-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rpf-param-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 12px;\n padding: 2px 0;\n}\n\n.rpf-param-name {\n font-family: var(--mj-font-mono, monospace);\n color: var(--mj-text-secondary, #475569);\n font-weight: 600;\n}\n\n.rpf-param-arrow {\n color: var(--mj-text-muted, #94a3b8);\n font-size: 10px;\n margin: 0 4px;\n}\n\n/* SQL / Code Display Boxes */\n.rpf-sql-preview-box {\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n margin-bottom: 16px;\n}\n\n.rpf-sql-preview-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-muted, #94a3b8);\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.rpf-sql-preview-code {\n font-family: var(--mj-font-mono, monospace);\n font-size: 12px;\n color: var(--mj-text-primary, #0f172a);\n line-height: 1.6;\n overflow-x: auto;\n}\n\n/* Feature Schema Table */\n.rpf-table-wrap {\n overflow-x: auto;\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n background: var(--mj-bg-surface, #ffffff);\n margin-bottom: 16px;\n}\n\n.rpf-feature-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.rpf-feature-table th {\n text-align: left;\n padding: 10px 14px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-muted, #94a3b8);\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n border-bottom: 2px solid var(--mj-border-default, #e2e8f0);\n}\n\n.rpf-feature-table td {\n padding: 12px 14px;\n border-bottom: 1px solid var(--mj-border-subtle, #f1f5f9);\n vertical-align: middle;\n}\n\n.rpf-feature-table tr:last-child td {\n border-bottom: none;\n}\n\n.rpf-feature-table tr:hover td {\n background: var(--mj-bg-surface-hover, #f8fafc);\n}\n\n.rpf-feature-name-cell {\n font-weight: 600;\n color: var(--mj-text-primary, #0f172a);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.rpf-type-tag {\n font-size: 11px;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 600;\n}\n\n.rpf-type-numeric {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n}\n\n.rpf-type-categorical {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n.rpf-type-default {\n background: var(--mj-bg-surface-sunken, #f1f5f9);\n color: var(--mj-text-secondary, #475569);\n}\n\n.rpf-binding-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-family: var(--mj-font-mono, monospace);\n font-size: 12px;\n padding: 2px 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken, #f1f5f9);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n}\n\n.rpf-binding-valid {\n color: var(--mj-status-success, #22c55e);\n}\n\n.rpf-binding-invalid {\n color: var(--mj-status-warning, #f59e0b);\n}\n\n/* Optimization Grid */\n.rpf-opt-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 12px;\n}\n\n@media (max-width: 900px) {\n .rpf-opt-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n.rpf-opt-card {\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n padding: 14px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n}\n\n.rpf-opt-label {\n font-size: 11px;\n text-transform: uppercase;\n font-weight: 700;\n color: var(--mj-text-muted, #94a3b8);\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n}\n\n.rpf-opt-value {\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary, #0f172a);\n}\n\n.rpf-opt-sub {\n font-size: 11px;\n color: var(--mj-text-secondary, #64748b);\n margin-top: 2px;\n}\n\n.rpf-text-success {\n color: var(--mj-status-success-text, #15803d) !important;\n}\n\n/* Raw JSON Accordion */\n.rpf-raw-json-drawer {\n border: 1px dashed var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n margin-top: 20px;\n padding: 14px 16px;\n}\n\n.rpf-raw-json-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n user-select: none;\n}\n\n.rpf-raw-json-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary, #475569);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.rpf-raw-json-body {\n margin-top: 12px;\n}\n\n.rpf-raw-json-body pre {\n margin: 0;\n padding: 12px;\n background: var(--mj-bg-surface, #ffffff);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 6px;\n font-family: var(--mj-font-mono, monospace);\n font-size: 12px;\n color: var(--mj-text-primary, #0f172a);\n line-height: 1.5;\n max-height: 350px;\n overflow-y: auto;\n}\n\n.rpf-scope-infer-wrap {\n padding: 4px 0;\n}\n\n.rpf-scope-summary-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.rpf-scope-badge-group {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.rpf-scope-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: 6px;\n font-size: 12px;\n background: var(--mj-bg-surface-sunken, #f1f5f9);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n color: var(--mj-text-secondary, #475569);\n}\n\n.rpf-scope-chip-brand {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n font-weight: 600;\n}\n\n.rpf-edit-fields-divider {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px dashed var(--mj-border-default, #e2e8f0);\n}\n"] }]
|
|
1268
|
-
}], null,
|
|
1269
|
-
|
|
1306
|
+
args: [{ standalone: false, selector: 'mj-record-process-form-extended', template: "@if (record) {\n<mj-record-form-container [Record]=\"record\" [FormComponent]=\"this\"\n (Navigate)=\"OnFormNavigate($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (ListManagementRequested)=\"OnListManagementRequested()\">\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"before-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n OVERVIEW & STATUS (Lead Panel)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"processOverview\"\n SectionName=\"Overview & Status\"\n Icon=\"fa-solid fa-gauge-high\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n <div class=\"rpf-overview-container\">\n <!-- Hero Header Card -->\n <div class=\"rpf-hero-card\">\n <div class=\"rpf-hero-main\">\n <div class=\"rpf-hero-icon-wrap\">\n <i [class]=\"WorkTypeIcon\"></i>\n </div>\n <div class=\"rpf-hero-info\">\n <div class=\"rpf-hero-title-row\">\n <h2 class=\"rpf-hero-title\">{{ record.Name || 'Untitled Process' }}</h2>\n <span class=\"rpf-badge\" [ngClass]=\"StatusBadgeClass\">\n <span class=\"rpf-badge-dot\"></span>\n {{ record.Status || 'Draft' }}\n </span>\n </div>\n <p class=\"rpf-hero-desc\">{{ record.Description || 'No description provided for this process.' }}</p>\n <div class=\"rpf-hero-pills\">\n <span class=\"rpf-pill\" title=\"Target Entity\">\n <i class=\"fa-solid fa-database\"></i>\n <span>{{ TargetEntityName }}</span>\n </span>\n <span class=\"rpf-pill\" title=\"Work Type\">\n <i [class]=\"WorkTypeIcon\"></i>\n <span>{{ record.WorkType || 'Not set' }}</span>\n </span>\n @if (record.WorkType === 'Infer') {\n <span class=\"rpf-pill rpf-pill-feature\" title=\"Feature Pipeline\">\n <i class=\"fa-solid fa-sparkles\"></i>\n <span>Feature Pipeline</span>\n </span>\n }\n </div>\n </div>\n </div>\n </div>\n\n <!-- KPI Summary Grid -->\n <div class=\"rpf-kpi-grid\">\n <div class=\"rpf-kpi-card\">\n <div class=\"rpf-kpi-label\"><i class=\"fa-solid fa-filter\"></i> Target Scope</div>\n <div class=\"rpf-kpi-value\">{{ record.ScopeType || 'Filter' }}</div>\n <div class=\"rpf-kpi-sub\" [title]=\"record.ScopeFilter || 'All records in scope'\">\n {{ record.ScopeFilter ? record.ScopeFilter : 'No filter applied (all records)' }}\n </div>\n </div>\n\n <div class=\"rpf-kpi-card\">\n <div class=\"rpf-kpi-label\"><i class=\"fa-solid fa-bolt\"></i> Triggers</div>\n <div class=\"rpf-kpi-value\">\n @if (record.ScheduleEnabled) {\n <span>Scheduled</span>\n } @else if (record.OnChangeEnabled) {\n <span>On Change</span>\n } @else if (record.OnDemandEnabled) {\n <span>On Demand</span>\n } @else {\n <span class=\"muted\">Manual</span>\n }\n </div>\n <div class=\"rpf-kpi-sub\">\n @if (record.ScheduleEnabled && record.CronExpression) {\n <code>{{ record.CronExpression }}</code>\n } @else if (record.OnChangeEnabled) {\n <span>Mode: {{ record.OnChangeInvocationType || 'Immediate' }}</span>\n } @else {\n <span>On demand execution</span>\n }\n </div>\n </div>\n\n <div class=\"rpf-kpi-card\">\n <div class=\"rpf-kpi-label\"><i class=\"fa-solid fa-water\"></i> Optimization</div>\n <div class=\"rpf-kpi-value\">{{ record.WatermarkStrategy || 'None' }}</div>\n <div class=\"rpf-kpi-sub\">\n Batch: {{ record.BatchSize || 'default' }} | Concurrency: {{ record.MaxConcurrency || '1' }}\n </div>\n </div>\n\n <div class=\"rpf-kpi-card\">\n <div class=\"rpf-kpi-label\"><i class=\"fa-solid fa-microchip\"></i> Skip Unchanged</div>\n <div class=\"rpf-kpi-value\">{{ record.SkipUnchanged ? 'Enabled' : 'Disabled' }}</div>\n <div class=\"rpf-kpi-sub\">\n {{ record.SkipUnchanged ? 'Skips re-evaluating unchanged rows' : 'Processes all matching rows' }}\n </div>\n </div>\n </div>\n </div>\n </mj-collapsible-panel>\n\n <!-- ========================================\n PIPELINE CONFIGURATION (Visual Builder)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"pipelineConfiguration\"\n SectionName=\"Pipeline Configuration\"\n Icon=\"fa-solid fa-wand-magic-sparkles\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n @if (record.WorkType === 'Infer') {\n <div class=\"rpf-pipeline-builder-wrap\">\n <mj-feature-pipeline-builder\n [Record]=\"record\"\n [EntityID]=\"record.EntityID\"\n [Provider]=\"ProviderToUse\"\n (SpecChange)=\"OnPipelineSpecChange()\"\n (ValidChange)=\"OnPipelineValidChange($event)\">\n </mj-feature-pipeline-builder>\n </div>\n } @else if (record.WorkType === 'FieldRules') {\n <div class=\"rpf-editor-wrap\">\n <mj-record-process-editor\n [Record]=\"record\"\n [ShowToolbar]=\"false\"\n [Provider]=\"ProviderToUse\">\n </mj-record-process-editor>\n </div>\n } @else {\n <div class=\"rpf-generic-config-wrap\">\n <div class=\"rpf-notice-card\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <div>\n <strong>{{ record.WorkType || 'Custom' }} Execution Logic</strong>\n <p>Configure actions, prompts, and mappings in the <em>Process Definition</em> and <em>Execution Logic</em> sections below.</p>\n </div>\n </div>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ========================================\n PRIOR RUNS & AUDIT (Embedded History)\n ======================================== -->\n <mj-collapsible-panel\n SectionKey=\"processRuns\"\n SectionName=\"Prior Runs\"\n Icon=\"fa-solid fa-clock-rotate-left\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"true\">\n @if (record.IsSaved) {\n <div class=\"rpf-history-wrap\">\n <mj-record-process-history\n [RecordProcessID]=\"record.ID\">\n </mj-record-process-history>\n </div>\n } @else {\n <div class=\"rpf-notice-card\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span>Save this record process to view execution history and per-record audit logs.</span>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ========================================\n FIELD PANELS (Fold into Details rail)\n ======================================== -->\n\n <!-- Process Definition Section -->\n <mj-collapsible-panel\n SectionKey=\"processDefinition\"\n SectionName=\"Process Definition\"\n Icon=\"fa fa-info-circle\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Name\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Description\" Type=\"textarea\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"CategoryID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"EntityID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Status\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Execution Logic Section -->\n <mj-collapsible-panel\n SectionKey=\"executionLogic\"\n SectionName=\"Execution Logic\"\n Icon=\"fa fa-play\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"false\">\n @if (record.WorkType === 'Infer') {\n <!-- Health & Schema Audit Bar -->\n <div class=\"rpf-audit-bar\" [class.rpf-audit-bar-warning]=\"!IsSpecValid\">\n <div class=\"rpf-audit-badges\">\n <div class=\"rpf-audit-chip\" [class.rpf-audit-chip-valid]=\"IsSpecValid\" [class.rpf-audit-chip-warning]=\"!IsSpecValid\">\n <i [class]=\"IsSpecValid ? 'fa-solid fa-shield-check' : 'fa-solid fa-triangle-exclamation'\"></i>\n <span>{{ IsSpecValid ? 'Configuration Valid' : 'Configuration Issues Found' }}</span>\n </div>\n <div class=\"rpf-audit-chip\">\n <i class=\"fa-solid fa-check-circle\" style=\"color: var(--mj-status-success);\"></i>\n <span>{{ BoundFeaturesCount }} of {{ TotalFeaturesCount }} Features Bound to Target</span>\n </div>\n <div class=\"rpf-audit-chip\">\n <i class=\"fa-solid fa-database\"></i>\n <span>Context: {{ ContextModeText }}</span>\n </div>\n </div>\n </div>\n\n <!-- AI Model & Context Query Section -->\n <div class=\"rpf-prompt-grid\">\n <!-- Prompt Card -->\n <div class=\"rpf-card-box\">\n <div class=\"rpf-box-eyebrow\">Bound AI Prompt</div>\n <div class=\"rpf-prompt-title\">\n <i class=\"fa-solid fa-message-code\"></i>\n <span>{{ record.PromptID ? 'Prompt Configured' : 'No Prompt Selected' }}</span>\n </div>\n <div class=\"rpf-chip-wrap\">\n @if (record.PromptID) {\n <span class=\"rpf-sm-chip rpf-sm-chip-brand\">ID: {{ record.PromptID.substring(0, 8) }}...</span>\n }\n <span class=\"rpf-sm-chip\"><i class=\"fa-solid fa-sparkles\"></i> Feature Infer Engine</span>\n <span class=\"rpf-sm-chip\"><i class=\"fa-solid fa-microchip\"></i> LLM Output Parser</span>\n </div>\n @if (EditMode) {\n <div style=\"margin-top: 10px;\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"PromptID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n </div>\n }\n </div>\n\n <!-- Parameters Resolution Card -->\n <div class=\"rpf-card-box\">\n <div class=\"rpf-box-eyebrow\">Prompt Parameter Resolution</div>\n @if (ParameterMappings.length > 0) {\n <div class=\"rpf-param-list\">\n @for (item of ParameterMappings; track item.Param) {\n <div class=\"rpf-param-row\">\n <span class=\"rpf-param-name\">{{ item.Param }}</span>\n <span>\n <i class=\"fa-solid fa-arrow-left rpf-param-arrow\"></i>\n <span>Column: <code>{{ item.Field }}</code></span>\n </span>\n </div>\n }\n </div>\n } @else {\n <div style=\"font-size: 12px; color: var(--mj-text-muted);\">\n No parameter bindings configured. Entire row context will be passed to prompt.\n </div>\n }\n </div>\n </div>\n\n <!-- Context Query Display -->\n <div class=\"rpf-sql-preview-box\">\n <div class=\"rpf-sql-preview-label\">\n <i class=\"fa-solid fa-code\"></i> Context Retrieval Query\n </div>\n <div class=\"rpf-sql-preview-code\">\n <code>{{ ContextQueryDisplay }}</code>\n </div>\n </div>\n\n <!-- Feature Output Schema & Entity Mappings Table -->\n <div class=\"rpf-table-wrap\">\n <table class=\"rpf-feature-table\">\n <thead>\n <tr>\n <th>Feature Name</th>\n <th>Kind / Type</th>\n <th>Validation Constraints</th>\n <th>Target Field Binding</th>\n <th>Reasoning</th>\n </tr>\n </thead>\n <tbody>\n @if (FeatureOutputs.length > 0) {\n @for (out of FeatureOutputs; track out.Name) {\n <tr>\n <td>\n <div class=\"rpf-feature-name-cell\">\n <i [class]=\"out.FeatureKind === 'numeric' ? 'fa-solid fa-chart-line' : 'fa-solid fa-tags'\"\n [style.color]=\"out.FeatureKind === 'numeric' ? '#f59e0b' : '#8b5cf6'\"></i>\n <span>{{ out.Name }}</span>\n </div>\n </td>\n <td>\n <span class=\"rpf-type-tag\"\n [class.rpf-type-numeric]=\"out.FeatureKind === 'numeric'\"\n [class.rpf-type-categorical]=\"out.FeatureKind === 'categorical'\"\n [class.rpf-type-default]=\"out.FeatureKind !== 'numeric' && out.FeatureKind !== 'categorical'\">\n {{ out.FeatureKind }}\n </span>\n </td>\n <td>\n <span class=\"rpf-sm-chip\" [title]=\"'Violation policy: ' + out.ViolationPolicy\">\n <i class=\"fa-solid fa-shield\"></i> {{ out.ConstraintSummary }}\n </span>\n </td>\n <td>\n <div class=\"rpf-binding-pill\">\n <i [class]=\"out.TargetFieldExists ? 'fa-solid fa-check-circle rpf-binding-valid' : 'fa-solid fa-triangle-exclamation rpf-binding-invalid'\"></i>\n <span>{{ TargetEntityName }}.<strong>{{ out.TargetField }}</strong></span>\n <span style=\"color: var(--mj-text-muted); font-size: 11px;\">({{ out.TargetFieldType }})</span>\n </div>\n </td>\n <td>\n @if (out.ReasoningTarget === 'Enabled') {\n <span class=\"rpf-sm-chip rpf-sm-chip-brand\"><i class=\"fa-solid fa-brain\"></i> Captured</span>\n } @else {\n <span style=\"color: var(--mj-text-muted); font-size: 11px;\">None</span>\n }\n </td>\n </tr>\n }\n } @else {\n <tr>\n <td colspan=\"5\" style=\"text-align: center; color: var(--mj-text-muted); padding: 20px;\">\n No output features defined yet. Use the <em>Pipeline Configuration</em> builder tab to add output features.\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <!-- Advanced Raw JSON Drawer -->\n <div class=\"rpf-raw-json-drawer\">\n <div class=\"rpf-raw-json-header\" (click)=\"ToggleRawJson()\">\n <div class=\"rpf-raw-json-title\">\n <i [class]=\"RawJsonExpanded ? 'fa-solid fa-chevron-down' : 'fa-solid fa-chevron-right'\"></i>\n <i class=\"fa-solid fa-code\"></i>\n <span>Power User Escape Hatch: View Raw Pipeline Configuration JSON</span>\n </div>\n <button type=\"button\" class=\"rpf-sm-chip\" (click)=\"$event.stopPropagation(); CopyRawJson()\">\n <i [class]=\"RawJsonCopied ? 'fa-solid fa-check' : 'fa-regular fa-copy'\"></i>\n <span>{{ RawJsonCopied ? 'Copied!' : 'Copy JSON' }}</span>\n </button>\n </div>\n @if (RawJsonExpanded) {\n <div class=\"rpf-raw-json-body\">\n <pre><code>{{ FormattedRawJson }}</code></pre>\n </div>\n }\n </div>\n\n @if (EditMode) {\n <div class=\"rpf-edit-fields-divider\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"WorkType\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Configuration\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OutputMapping\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </div>\n }\n } @else {\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"WorkType\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ActionID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"AgentID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"PromptID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"InputMapping\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OutputMapping\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Configuration\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n }\n </mj-collapsible-panel>\n\n <!-- Scope Configuration Section -->\n <mj-collapsible-panel\n SectionKey=\"scopeConfiguration\"\n SectionName=\"Scope Configuration\"\n Icon=\"fa fa-filter\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n @if (record.WorkType === 'Infer') {\n <div class=\"rpf-scope-infer-wrap\">\n <div class=\"rpf-scope-summary-row\">\n <div class=\"rpf-scope-badge-group\">\n <span class=\"rpf-scope-chip\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>Scope Type: <strong>{{ record.ScopeType || 'Filter' }}</strong></span>\n </span>\n @if (record.ScopeFilter) {\n <span class=\"rpf-scope-chip rpf-scope-chip-brand\">\n <i class=\"fa-solid fa-calculator\"></i>\n <span>Filter Active</span>\n </span>\n }\n </div>\n </div>\n @if (FormattedScopeFilter) {\n <div class=\"rpf-sql-preview-box\">\n <div class=\"rpf-sql-preview-label\">\n <i class=\"fa-solid fa-database\"></i> SQL Scope Filter (WHERE clause)\n </div>\n <div class=\"rpf-sql-preview-code\">\n <code>{{ FormattedScopeFilter }}</code>\n </div>\n </div>\n } @else {\n <div class=\"rpf-notice-card\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span>No scope filter applied. All records in <strong>{{ TargetEntityName }}</strong> will be evaluated.</span>\n </div>\n }\n @if (EditMode) {\n <div class=\"rpf-edit-fields-divider\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeType\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeFilter\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </div>\n }\n </div>\n } @else {\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeType\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeViewID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeListID\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\" LinkType=\"Record\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScopeFilter\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n }\n </mj-collapsible-panel>\n\n <!-- Triggers Section -->\n <mj-collapsible-panel\n SectionKey=\"triggers\"\n SectionName=\"Triggers\"\n Icon=\"fa fa-bolt\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OnChangeEnabled\" Type=\"checkbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OnChangeInvocationType\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OnChangeFilter\" Type=\"code\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"ScheduleEnabled\" Type=\"checkbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"CronExpression\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"Timezone\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"OnDemandEnabled\" Type=\"checkbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </mj-collapsible-panel>\n\n <!-- Performance and Optimization Section -->\n <mj-collapsible-panel\n SectionKey=\"performanceAndOptimization\"\n SectionName=\"Performance and Optimization\"\n Icon=\"fa fa-tachometer-alt\"\n [Form]=\"this\"\n [FormContext]=\"formContext\">\n @if (record.WorkType === 'Infer') {\n <div class=\"rpf-opt-grid\">\n <div class=\"rpf-opt-card\">\n <div class=\"rpf-opt-label\">Delta Watermark</div>\n <div class=\"rpf-opt-value\">{{ record.WatermarkStrategy || 'Checksum' }}</div>\n <div class=\"rpf-opt-sub\">Evaluates row state changes</div>\n </div>\n <div class=\"rpf-opt-card\">\n <div class=\"rpf-opt-label\">Batch Processing</div>\n <div class=\"rpf-opt-value\">{{ record.BatchSize || 100 }} records</div>\n <div class=\"rpf-opt-sub\">Per inference chunk</div>\n </div>\n <div class=\"rpf-opt-card\">\n <div class=\"rpf-opt-label\">Concurrency</div>\n <div class=\"rpf-opt-value\">{{ record.MaxConcurrency || 1 }} Parallel</div>\n <div class=\"rpf-opt-sub\">Concurrent worker threads</div>\n </div>\n <div class=\"rpf-opt-card\">\n <div class=\"rpf-opt-label\">Skip Unchanged</div>\n <div class=\"rpf-opt-value\" [class.rpf-text-success]=\"record.SkipUnchanged\">\n <i [class]=\"record.SkipUnchanged ? 'fa-solid fa-check' : 'fa-solid fa-minus'\"></i>\n {{ record.SkipUnchanged ? 'Enabled' : 'Disabled' }}\n </div>\n <div class=\"rpf-opt-sub\">Skips re-evaluating unchanged rows</div>\n </div>\n </div>\n @if (EditMode) {\n <div class=\"rpf-edit-fields-divider\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"SkipUnchanged\" Type=\"checkbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"WatermarkStrategy\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BatchSize\" Type=\"number\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"MaxConcurrency\" Type=\"number\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </div>\n }\n } @else {\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"SkipUnchanged\" Type=\"checkbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"WatermarkStrategy\" Type=\"select\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"BatchSize\" Type=\"number\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"MaxConcurrency\" Type=\"number\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n }\n </mj-collapsible-panel>\n\n <!-- System Metadata Section -->\n <mj-collapsible-panel\n SectionKey=\"systemMetadata\"\n SectionName=\"System Metadata\"\n Icon=\"fa fa-database\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [DefaultExpanded]=\"false\">\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"__mj_CreatedAt\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n <mj-form-field [Record]=\"record\" [ShowLabel]=\"true\" FieldName=\"__mj_UpdatedAt\" Type=\"textbox\" [EditMode]=\"EditMode\" [FormContext]=\"formContext\"></mj-form-field>\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-fields\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n\n <!-- ========================================\n RELATED ENTITY PANELS\n ======================================== -->\n\n <!-- Record Process Watermarks Section -->\n <mj-collapsible-panel\n SectionKey=\"mJRecordProcessWatermarks\"\n SectionName=\"Record Process Watermarks\"\n Icon=\"fa fa-water\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJRecordProcessWatermarks')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Record Process Watermarks','RecordProcessID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Record Process Watermarks','RecordProcessID')\"\n [AllowLoad]=\"IsSectionExpanded('mJRecordProcessWatermarks')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJRecordProcessWatermarks', $event.totalRowCount)\">\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- ML Model Scoring Bindings Section -->\n <mj-collapsible-panel\n SectionKey=\"mJMLModelScoringBindings\"\n SectionName=\"ML Model Scoring Bindings\"\n Icon=\"fa fa-project-diagram\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJMLModelScoringBindings')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: ML Model Scoring Bindings','RecordProcessID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: ML Model Scoring Bindings','RecordProcessID')\"\n [AllowLoad]=\"IsSectionExpanded('mJMLModelScoringBindings')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJMLModelScoringBindings', $event.totalRowCount)\">\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Feature Values Section -->\n <mj-collapsible-panel\n SectionKey=\"mJFeatureValues\"\n SectionName=\"Feature Values\"\n Icon=\"fa fa-history\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJFeatureValues')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Feature Values','RecordProcessID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Feature Values','RecordProcessID')\"\n [AllowLoad]=\"IsSectionExpanded('mJFeatureValues')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJFeatureValues', $event.totalRowCount)\">\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <!-- Feature Value Caches Section -->\n <mj-collapsible-panel\n SectionKey=\"mJFeatureValueCaches\"\n SectionName=\"Feature Value Caches\"\n Icon=\"fa fa-database\"\n Variant=\"related-entity\"\n [Form]=\"this\"\n [FormContext]=\"formContext\"\n [BadgeCount]=\"GetSectionRowCount('mJFeatureValueCaches')\"\n [DefaultExpanded]=\"false\">\n @if (record.IsSaved) {\n <div>\n <mj-explorer-entity-data-grid\n [Params]=\"BuildRelationshipViewParamsByEntityName('MJ: Feature Value Caches','RecordProcessID')\"\n [NewRecordValues]=\"NewRecordValues('MJ: Feature Value Caches','RecordProcessID')\"\n [AllowLoad]=\"IsSectionExpanded('mJFeatureValueCaches')\"\n [ShowToolbar]=\"true\"\n (Navigate)=\"OnFormNavigate($event)\"\n (AfterDataLoad)=\"SetSectionRowCount('mJFeatureValueCaches', $event.totalRowCount)\">\n </mj-explorer-entity-data-grid>\n </div>\n }\n </mj-collapsible-panel>\n\n <mj-form-panel-slot Entity=\"{{record.EntityInfo.Name}}\" Slot=\"after-related\" [Record]=\"record\" [FormComponent]=\"this\" [FormContext]=\"formContext\"></mj-form-panel-slot>\n</mj-record-form-container>\n}\n", styles: ["/* ==========================================================================\n Record Process / Feature Pipeline Custom Form Styles\n Uses standard MemberJunction design tokens for full light & dark mode support.\n ========================================================================== */\n\n.rpf-overview-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 4px 0 12px 0;\n}\n\n/* Hero Header Card */\n.rpf-hero-card {\n background: var(--mj-bg-surface-elevated, #ffffff);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 10px;\n padding: 20px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n}\n\n.rpf-hero-main {\n display: flex;\n align-items: flex-start;\n gap: 18px;\n}\n\n.rpf-hero-icon-wrap {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n border-radius: 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n color: var(--mj-brand-primary, #0284c7);\n font-size: 22px;\n flex-shrink: 0;\n}\n\n.rpf-hero-info {\n flex: 1;\n min-width: 0;\n}\n\n.rpf-hero-title-row {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n margin-bottom: 6px;\n}\n\n.rpf-hero-title {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary, #0f172a);\n line-height: 1.3;\n}\n\n.rpf-hero-desc {\n margin: 0 0 12px 0;\n font-size: 14px;\n color: var(--mj-text-secondary, #64748b);\n line-height: 1.5;\n}\n\n.rpf-hero-pills {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.rpf-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 6px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n border: 1px solid var(--mj-border-subtle, #e2e8f0);\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary, #475569);\n}\n\n.rpf-pill-feature {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n/* Status Badges */\n.rpf-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: 9999px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.rpf-badge-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n}\n\n.rpf-status-active {\n background: var(--mj-status-success-bg, color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface)));\n color: var(--mj-status-success-text, var(--mj-status-success));\n border: 1px solid var(--mj-status-success-border, color-mix(in srgb, var(--mj-status-success) 30%, transparent));\n}\n.rpf-status-active .rpf-badge-dot {\n background: var(--mj-status-success);\n}\n\n.rpf-status-draft {\n background: var(--mj-status-warning-bg, color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface)));\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n border: 1px solid var(--mj-status-warning-border, color-mix(in srgb, var(--mj-status-warning) 30%, transparent));\n}\n.rpf-status-draft .rpf-badge-dot {\n background: var(--mj-status-warning);\n}\n\n.rpf-status-disabled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-subtle);\n}\n.rpf-status-disabled .rpf-badge-dot {\n background: var(--mj-text-muted);\n}\n\n.rpf-status-default {\n background: var(--mj-bg-surface-sunken, #f1f5f9);\n color: var(--mj-text-secondary, #64748b);\n border: 1px solid var(--mj-border-subtle, #cbd5e1);\n}\n.rpf-status-default .rpf-badge-dot {\n background: var(--mj-text-secondary, #64748b);\n}\n\n/* KPI Grid */\n.rpf-kpi-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n}\n\n.rpf-kpi-card {\n background: var(--mj-bg-surface-elevated, #ffffff);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n padding: 14px 16px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.rpf-kpi-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted, #94a3b8);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.rpf-kpi-value {\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary, #0f172a);\n}\n\n.rpf-kpi-sub {\n font-size: 12px;\n color: var(--mj-text-secondary, #64748b);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.rpf-kpi-sub code {\n font-family: var(--mj-font-mono, monospace);\n font-size: 11px;\n padding: 1px 4px;\n background: var(--mj-bg-surface-sunken, #f1f5f9);\n border-radius: 4px;\n}\n\n/* Wrappers for child components */\n.rpf-pipeline-builder-wrap {\n padding: 8px 0;\n}\n\n.rpf-editor-wrap {\n padding: 8px 0;\n}\n\n.rpf-history-wrap {\n padding: 8px 0;\n}\n\n.rpf-notice-card {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n border: 1px solid var(--mj-border-subtle, #e2e8f0);\n border-radius: 8px;\n color: var(--mj-text-secondary, #64748b);\n font-size: 13px;\n line-height: 1.5;\n}\n\n.rpf-notice-card i {\n font-size: 16px;\n color: var(--mj-brand-primary, #0284c7);\n margin-top: 2px;\n}\n\n.rpf-notice-card strong {\n display: block;\n color: var(--mj-text-primary, #0f172a);\n margin-bottom: 2px;\n}\n\n.rpf-notice-card p {\n margin: 0;\n}\n\n/* ==========================================================================\n Option A: Semantic Cards for Infer Feature Pipeline Details\n ========================================================================== */\n\n/* Schema Health / Audit Banner */\n.rpf-audit-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 12px;\n padding: 10px 16px;\n background: var(--mj-bg-surface-elevated, #ffffff);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-left: 4px solid var(--mj-status-success, #22c55e);\n border-radius: 8px;\n margin-bottom: 16px;\n}\n\n.rpf-audit-bar-warning {\n border-left-color: var(--mj-status-warning, #f59e0b);\n}\n\n.rpf-audit-badges {\n display: flex;\n align-items: center;\n gap: 16px;\n flex-wrap: wrap;\n}\n\n.rpf-audit-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n color: var(--mj-text-secondary, #475569);\n font-weight: 500;\n}\n\n.rpf-audit-chip-valid {\n color: var(--mj-status-success-text, #15803d);\n font-weight: 600;\n}\n\n.rpf-audit-chip-warning {\n color: var(--mj-status-warning-text, #b45309);\n font-weight: 600;\n}\n\n/* Prompt Card & Resolution Grid */\n.rpf-prompt-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 14px;\n margin-bottom: 16px;\n}\n\n@media (max-width: 768px) {\n .rpf-prompt-grid {\n grid-template-columns: 1fr;\n }\n}\n\n.rpf-card-box {\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n padding: 14px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n}\n\n.rpf-box-eyebrow {\n font-size: 11px;\n text-transform: uppercase;\n font-weight: 700;\n color: var(--mj-text-muted, #94a3b8);\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n}\n\n.rpf-prompt-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-brand-primary, #0076b6);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.rpf-chip-wrap {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 10px;\n}\n\n.rpf-sm-chip {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 8px;\n border-radius: 4px;\n font-size: 11px;\n background: var(--mj-bg-surface, #ffffff);\n color: var(--mj-text-secondary, #475569);\n border: 1px solid var(--mj-border-subtle, #e2e8f0);\n}\n\n.rpf-sm-chip-brand {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n font-weight: 600;\n}\n\n.rpf-param-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.rpf-param-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 12px;\n padding: 2px 0;\n}\n\n.rpf-param-name {\n font-family: var(--mj-font-mono, monospace);\n color: var(--mj-text-secondary, #475569);\n font-weight: 600;\n}\n\n.rpf-param-arrow {\n color: var(--mj-text-muted, #94a3b8);\n font-size: 10px;\n margin: 0 4px;\n}\n\n/* SQL / Code Display Boxes */\n.rpf-sql-preview-box {\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n margin-bottom: 16px;\n}\n\n.rpf-sql-preview-label {\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-muted, #94a3b8);\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.rpf-sql-preview-code {\n font-family: var(--mj-font-mono, monospace);\n font-size: 12px;\n color: var(--mj-text-primary, #0f172a);\n line-height: 1.6;\n overflow-x: auto;\n}\n\n/* Feature Schema Table */\n.rpf-table-wrap {\n overflow-x: auto;\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n background: var(--mj-bg-surface, #ffffff);\n margin-bottom: 16px;\n}\n\n.rpf-feature-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n}\n\n.rpf-feature-table th {\n text-align: left;\n padding: 10px 14px;\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n color: var(--mj-text-muted, #94a3b8);\n letter-spacing: 0.5px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n border-bottom: 2px solid var(--mj-border-default, #e2e8f0);\n}\n\n.rpf-feature-table td {\n padding: 12px 14px;\n border-bottom: 1px solid var(--mj-border-subtle, #f1f5f9);\n vertical-align: middle;\n}\n\n.rpf-feature-table tr:last-child td {\n border-bottom: none;\n}\n\n.rpf-feature-table tr:hover td {\n background: var(--mj-bg-surface-hover, #f8fafc);\n}\n\n.rpf-feature-name-cell {\n font-weight: 600;\n color: var(--mj-text-primary, #0f172a);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.rpf-type-tag {\n font-size: 11px;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 600;\n}\n\n.rpf-type-numeric {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n}\n\n.rpf-type-categorical {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n.rpf-type-default {\n background: var(--mj-bg-surface-sunken, #f1f5f9);\n color: var(--mj-text-secondary, #475569);\n}\n\n.rpf-binding-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-family: var(--mj-font-mono, monospace);\n font-size: 12px;\n padding: 2px 8px;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken, #f1f5f9);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n}\n\n.rpf-binding-valid {\n color: var(--mj-status-success, #22c55e);\n}\n\n.rpf-binding-invalid {\n color: var(--mj-status-warning, #f59e0b);\n}\n\n/* Optimization Grid */\n.rpf-opt-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 12px;\n}\n\n@media (max-width: 900px) {\n .rpf-opt-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n}\n\n.rpf-opt-card {\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n padding: 14px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n}\n\n.rpf-opt-label {\n font-size: 11px;\n text-transform: uppercase;\n font-weight: 700;\n color: var(--mj-text-muted, #94a3b8);\n letter-spacing: 0.5px;\n margin-bottom: 4px;\n}\n\n.rpf-opt-value {\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary, #0f172a);\n}\n\n.rpf-opt-sub {\n font-size: 11px;\n color: var(--mj-text-secondary, #64748b);\n margin-top: 2px;\n}\n\n.rpf-text-success {\n color: var(--mj-status-success-text, #15803d) !important;\n}\n\n/* Raw JSON Accordion */\n.rpf-raw-json-drawer {\n border: 1px dashed var(--mj-border-default, #e2e8f0);\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken, #f8fafc);\n margin-top: 20px;\n padding: 14px 16px;\n}\n\n.rpf-raw-json-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n user-select: none;\n}\n\n.rpf-raw-json-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary, #475569);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.rpf-raw-json-body {\n margin-top: 12px;\n}\n\n.rpf-raw-json-body pre {\n margin: 0;\n padding: 12px;\n background: var(--mj-bg-surface, #ffffff);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n border-radius: 6px;\n font-family: var(--mj-font-mono, monospace);\n font-size: 12px;\n color: var(--mj-text-primary, #0f172a);\n line-height: 1.5;\n max-height: 350px;\n overflow-y: auto;\n}\n\n.rpf-scope-infer-wrap {\n padding: 4px 0;\n}\n\n.rpf-scope-summary-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n}\n\n.rpf-scope-badge-group {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.rpf-scope-chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: 6px;\n font-size: 12px;\n background: var(--mj-bg-surface-sunken, #f1f5f9);\n border: 1px solid var(--mj-border-default, #e2e8f0);\n color: var(--mj-text-secondary, #475569);\n}\n\n.rpf-scope-chip-brand {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n font-weight: 600;\n}\n\n.rpf-edit-fields-divider {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px dashed var(--mj-border-default, #e2e8f0);\n}\n"] }]
|
|
1307
|
+
}], null, { pipelineBuilder: [{
|
|
1308
|
+
type: ViewChild,
|
|
1309
|
+
args: [FeaturePipelineBuilderComponent]
|
|
1310
|
+
}] }); })();
|
|
1311
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RecordProcessFormComponentExtended, { className: "RecordProcessFormComponentExtended", filePath: "src/lib/custom/RecordProcesses/record-process-form.component.ts", lineNumber: 269 }); })();
|
|
1270
1312
|
/**
|
|
1271
1313
|
* Form policy ensuring the Overview panel sits as the lead group
|
|
1272
1314
|
* on the left-nav rail with proper title and icon.
|