fix: 统一工作流空媒体参数处理
This commit is contained in:
@@ -67,7 +67,10 @@ import {
|
||||
} from './workflowExecutionDetails';
|
||||
import WorkflowFinalOutput from './WorkflowFinalOutput.vue';
|
||||
import WorkflowFormItem from './WorkflowFormItem.vue';
|
||||
import { resolveWorkflowFormParameters } from './workflowFormParameters';
|
||||
import {
|
||||
buildWorkflowFormInitialValues,
|
||||
resolveWorkflowFormParameters,
|
||||
} from './workflowFormParameters';
|
||||
import {
|
||||
buildWorkflowFormParameterSummaries,
|
||||
buildWorkflowFormSubmissionImages,
|
||||
@@ -349,24 +352,7 @@ async function resolveSharedWorkflowId() {
|
||||
}
|
||||
|
||||
function initializeAdditionalValues() {
|
||||
const values: Record<string, any> = {};
|
||||
for (const parameter of additionalParameters.value) {
|
||||
const defaultValue = parameter.defaultValue;
|
||||
if (
|
||||
parameter.contentType === 'file' &&
|
||||
(defaultValue === null ||
|
||||
defaultValue === undefined ||
|
||||
defaultValue === '')
|
||||
) {
|
||||
values[parameter.name] = [];
|
||||
} else if (Array.isArray(defaultValue)) {
|
||||
values[parameter.name] = [...defaultValue];
|
||||
} else if (defaultValue && typeof defaultValue === 'object') {
|
||||
values[parameter.name] = { ...defaultValue };
|
||||
} else {
|
||||
values[parameter.name] = defaultValue ?? '';
|
||||
}
|
||||
}
|
||||
const values = buildWorkflowFormInitialValues(additionalParameters.value);
|
||||
defaultExtraValues.value = values;
|
||||
extraValues.value = values;
|
||||
parametersLocked.value = false;
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import {
|
||||
buildWorkflowFormInitialValues,
|
||||
resolveWorkflowFormParameters,
|
||||
resolveWorkflowParameterDisplayName,
|
||||
resolveWorkflowParameterLabel,
|
||||
} from '../workflowFormParameters';
|
||||
|
||||
describe('resolveWorkflowFormParameters', () => {
|
||||
describe('workflowFormParameters', () => {
|
||||
it('uses the image parameter when a legacy schema still declares text', () => {
|
||||
const parameters = resolveWorkflowFormParameters({
|
||||
parameters: [
|
||||
@@ -119,4 +120,33 @@ describe('resolveWorkflowFormParameters', () => {
|
||||
'流程开始 > 用户问题123',
|
||||
);
|
||||
});
|
||||
|
||||
it('builds initial values without submitting blank images', () => {
|
||||
const imageDefault = {
|
||||
sourceType: 'url',
|
||||
url: 'https://example.com/default.png',
|
||||
};
|
||||
const choicesDefault = ['a'];
|
||||
const values = buildWorkflowFormInitialValues([
|
||||
{ name: 'files', contentType: 'file', defaultValue: ' ' },
|
||||
{ name: 'image', contentType: 'image', defaultValue: '' },
|
||||
{
|
||||
name: 'defaultImage',
|
||||
contentType: 'image',
|
||||
defaultValue: imageDefault,
|
||||
},
|
||||
{ name: 'text', contentType: 'text', defaultValue: 'hello' },
|
||||
{ name: 'choices', formType: 'checkbox', defaultValue: choicesDefault },
|
||||
]);
|
||||
|
||||
expect(values).toEqual({
|
||||
files: [],
|
||||
defaultImage: imageDefault,
|
||||
text: 'hello',
|
||||
choices: ['a'],
|
||||
});
|
||||
expect(values).not.toHaveProperty('image');
|
||||
expect(values.defaultImage).not.toBe(imageDefault);
|
||||
expect(values.choices).not.toBe(choicesDefault);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -136,6 +136,48 @@ function resolveDataType(type: string, contentType: string) {
|
||||
return 'String';
|
||||
}
|
||||
|
||||
function isBlankMediaValue(value: unknown) {
|
||||
return (
|
||||
value === null ||
|
||||
value === undefined ||
|
||||
(typeof value === 'string' && value.trim() === '')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建发布运行表单的初始值,确保空媒体参数使用稳定的运行时语义。
|
||||
*
|
||||
* @param parameters 工作流运行参数
|
||||
* @returns 可直接绑定到发布运行表单的初始值
|
||||
*/
|
||||
export function buildWorkflowFormInitialValues(parameters: any[]) {
|
||||
const values: Record<string, any> = {};
|
||||
for (const parameter of parameters || []) {
|
||||
const defaultValue = parameter?.defaultValue;
|
||||
if (
|
||||
parameter?.contentType === 'file' &&
|
||||
isBlankMediaValue(defaultValue)
|
||||
) {
|
||||
values[parameter.name] = [];
|
||||
continue;
|
||||
}
|
||||
if (
|
||||
parameter?.contentType === 'image' &&
|
||||
isBlankMediaValue(defaultValue)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (Array.isArray(defaultValue)) {
|
||||
values[parameter.name] = [...defaultValue];
|
||||
} else if (defaultValue && typeof defaultValue === 'object') {
|
||||
values[parameter.name] = { ...defaultValue };
|
||||
} else {
|
||||
values[parameter.name] = defaultValue ?? '';
|
||||
}
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
export function resolveWorkflowFormParameters(workflowParams: any) {
|
||||
const schema = Array.isArray(workflowParams?.startFormSchema)
|
||||
? workflowParams.startFormSchema
|
||||
|
||||
Reference in New Issue
Block a user