Sfoglia il codice sorgente

fix: 修改迭代输出迭代变量字段不存在的问题

jiaxing.liao 2 settimane fa
parent
commit
367f2af430

+ 51 - 8
apps/web/src/nodes/src/iteration/setter.vue

@@ -5,6 +5,7 @@ import NodeRuntimeConfig from '@/nodes/_base/NodeRuntimeConfig.vue'
 import VarSelect from '@/nodes/_base/VarSelect.vue'
 import { useSetterModel } from '../_shared/useSetterModel'
 import { useI18n } from '@/composables/useI18n'
+import { filterArrayVariables } from '../utils'
 
 import type { IterationData } from './index'
 import type { NodeVariable, NodeVariableType } from '@/nodes/Interface'
@@ -54,20 +55,57 @@ const formData = useSetterModel<IterationData>(props, emit)
 
 const inputVar = computed({
 	get() {
-		return (
-			formData.value.variables?.[0] ||
-			({ value: '', type: '', name: '' } as unknown as NodeVariable)
-		)
+		return formData.value.variables?.[0]
 	},
 	set(val) {
 		if (val && formData.value.variables?.[0]) {
 			formData.value.variables[0] = val
 		} else if (val) {
 			formData.value.variables = [val]
+		} else {
+			formData.value.variables = []
 		}
 	}
 })
 
+const outputIterationVar = computed({
+	get() {
+		return formData.value.output_iteration_variable
+	},
+	set(val) {
+		formData.value.output_iteration_variable =
+			val || ({ name: '', type: '', value: '' } as unknown as NodeVariable)
+	}
+})
+
+const handleInputVarChange = (val: { value: string; type: NodeVariableType }) => {
+	inputVar.value = {
+		name: 'iteration_input',
+		value: val.value,
+		type: val.type
+	}
+}
+
+const handleInputVarClear = () => {
+	inputVar.value = undefined
+}
+
+const handleOutputIterationVarChange = (val: { value: string; type: NodeVariableType }) => {
+	outputIterationVar.value = {
+		name: '',
+		value: val.value,
+		type: val.type
+	}
+}
+
+const handleOutputIterationVarClear = () => {
+	outputIterationVar.value = {
+		name: '',
+		value: '',
+		type: ''
+	} as unknown as NodeVariable
+}
+
 watch(
 	() => formData.value.output_iteration_variable?.type,
 	(val) => {
@@ -99,9 +137,12 @@ watch(
 					<label class="text-14px font-bold text-gray-700">{{ texts.input }}</label>
 				</div>
 				<VarSelect
-					v-model:model-value="inputVar.value"
-					v-model:var-type="inputVar.type"
+					:model-value="inputVar?.value"
+					:var-type="inputVar?.type"
 					:placeholder="texts.selectInput"
+					:filter-fn="filterArrayVariables"
+					@change="handleInputVarChange"
+					@clear="handleInputVarClear"
 				/>
 			</el-form-item>
 
@@ -110,9 +151,11 @@ watch(
 					<label class="text-14px font-bold text-gray-700">{{ texts.output }}</label>
 				</div>
 				<VarSelect
-					v-model:model-value="formData.output_iteration_variable.value"
-					v-model:var-type="formData.output_iteration_variable.type"
+					:model-value="outputIterationVar?.value"
+					:var-type="outputIterationVar?.type"
 					:placeholder="texts.selectInput"
+					@change="handleOutputIterationVarChange"
+					@clear="handleOutputIterationVarClear"
 				/>
 			</el-form-item>
 

+ 9 - 26
apps/web/src/nodes/src/list/setter.vue

@@ -5,42 +5,36 @@ import VarInput from '@/nodes/_base/VarInput.vue'
 import VarSelect from '@/nodes/_base/VarSelect.vue'
 import { VARIABLE_TYPE_OPERATORS } from '@/constant'
 import { useSetterModel } from '../_shared/useSetterModel'
+import { ALLOWED_INPUT_TYPES, filterArrayVariables, type AllowedListInputType } from '../utils'
 
 import type { ConditionType, NodeVariable, NodeVariableType } from '@/nodes/Interface'
 import type { ListData } from './index'
-import type { NodeVar } from '@/types/var'
 
-type AllowedListInputType = 'array[string]' | 'array[number]' | 'array[boolean]' | 'array[file]'
-
-type FilterValueType = Extract<ConditionType['varType'], 'string' | 'number' | 'boolean'>
+type FilterValueType = Extract<ConditionType['varType'], 'string' | 'number' | 'boolean' | 'object'>
 
 type OperatorsType = ListData['filter_by']['conditions'][0]['comparison_operator']
 
-const ALLOWED_INPUT_TYPES: AllowedListInputType[] = [
-	'array[string]',
-	'array[number]',
-	'array[boolean]',
-	'array[file]'
-]
-
 const FILTER_VALUE_TYPE_MAP: Record<AllowedListInputType, FilterValueType> = {
 	'array[string]': 'string',
 	'array[number]': 'number',
 	'array[boolean]': 'boolean',
-	'array[file]': 'string'
+	'array[file]': 'string',
+	'array[object]': 'object'
 }
 
 const DEFAULT_OPERATOR_MAP: Record<FilterValueType, ConditionType['comparison_operator']> = {
 	string: 'contains',
 	number: '=',
-	boolean: 'is'
+	boolean: 'is',
+	object: 'is'
 }
 
 const OUTPUT_ITEM_TYPE_MAP: Record<AllowedListInputType, NodeVariableType> = {
 	'array[string]': 'string',
 	'array[number]': 'number',
 	'array[boolean]': 'boolean',
-	'array[file]': 'object'
+	'array[file]': 'object',
+	'array[object]': 'object'
 }
 
 const FILE_OPTIONS = [
@@ -171,17 +165,6 @@ watch(
 	{ immediate: true }
 )
 
-const filterVarFn = (list: NodeVar[]) => {
-	return list
-		.map((group) => ({
-			...group,
-			variableList: group.variableList.filter((item) =>
-				ALLOWED_INPUT_TYPES.includes(item.type as AllowedListInputType)
-			)
-		}))
-		.filter((group) => group.variableList.length)
-}
-
 const handleInputVarChange = (val: { value: string; type: string }) => {
 	const nextType = val.type as NodeVariableType
 	const nextInputVar: NodeVariable = {
@@ -213,7 +196,7 @@ const handleLeftChange = (val: string) => {
 				</div>
 				<VarSelect
 					:model-value="inputVar?.value"
-					:filter-fn="filterVarFn"
+					:filter-fn="filterArrayVariables"
 					@change="handleInputVarChange"
 					placeholder="请选择输入变量"
 				/>

+ 27 - 0
apps/web/src/nodes/src/utils.ts

@@ -0,0 +1,27 @@
+import type { NodeVar } from '@/types/var'
+
+export type AllowedListInputType =
+	| 'array[string]'
+	| 'array[number]'
+	| 'array[boolean]'
+	| 'array[file]'
+	| 'array[object]'
+
+export const ALLOWED_INPUT_TYPES: AllowedListInputType[] = [
+	'array[string]',
+	'array[number]',
+	'array[boolean]',
+	'array[file]',
+	'array[object]'
+]
+
+export const filterArrayVariables = (list: NodeVar[]) => {
+	return list
+		.map((group) => ({
+			...group,
+			variableList: group.variableList.filter((item) =>
+				ALLOWED_INPUT_TYPES.includes(item.type as AllowedListInputType)
+			)
+		}))
+		.filter((group) => group.variableList.length)
+}