Skip to content

Commit 5128ca8

Browse files
committed
feat: Form collection single line tab supports variables
1 parent 7948e4f commit 5128ca8

File tree

11 files changed

+343
-76
lines changed

11 files changed

+343
-76
lines changed

apps/application/flow/step_node/form_node/impl/base_form_node.py

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,18 @@
1818

1919

2020
def get_default_option(option_list, _type, value_field):
21-
if option_list is not None and len(option_list) > 0:
22-
default_value_list = [o.get(value_field) for o in option_list if o.get('default')]
23-
if len(default_value_list) == 0:
24-
return option_list[0].get(value_field)
25-
else:
26-
if _type == 'MultiSelect':
27-
return default_value_list
21+
try:
22+
if option_list is not None and isinstance(option_list, list) and len(option_list) > 0:
23+
default_value_list = [o.get(value_field) for o in option_list if o.get('default')]
24+
if len(default_value_list) == 0:
25+
return option_list[0].get(value_field)
2826
else:
29-
return default_value_list[0]
27+
if _type == 'MultiSelect':
28+
return default_value_list
29+
else:
30+
return default_value_list[0]
31+
except Exception as _:
32+
pass
3033
return []
3134

3235

@@ -41,6 +44,13 @@ def write_context(step_variable: Dict, global_variable: Dict, node, workflow):
4144
node.context['run_time'] = time.time() - node.context['start_time']
4245

4346

47+
def generate_prompt(workflow_manage, _value):
48+
try:
49+
return workflow_manage.generate_prompt(_value)
50+
except Exception as e:
51+
return _value
52+
53+
4454
class BaseFormNode(IFormNode):
4555
def save_context(self, details, workflow_manage):
4656
form_data = details.get('form_data', None)
@@ -58,27 +68,34 @@ def save_context(self, details, workflow_manage):
5868
self.context[key] = form_data[key]
5969

6070
def reset_field(self, field):
61-
if ['SingleSelect', 'MultiSelect', 'RadioCard'].__contains__(field.get('input_type')):
62-
if field.get('assignment_method') == 'ref_variables':
63-
option_list = self.workflow_manage.get_reference_field(field.get('option_list')[0],
64-
field.get('option_list')[1:])
65-
field['option_list'] = option_list
66-
field['default_value'] = get_default_option(option_list, field.get('input_type'),
67-
field.get('value_field'))
68-
6971
reset_field = ['field', 'label', 'default_value']
7072
for f in reset_field:
7173
_value = field[f]
7274
if _value is None:
7375
continue
7476
if isinstance(_value, str):
75-
field[f] = self.workflow_manage.generate_prompt(_value)
77+
field[f] = generate_prompt(self.workflow_manage, _value)
7678
elif f == 'label':
7779
_label_value = _value.get('label')
78-
_value['label'] = self.workflow_manage.generate_prompt(_label_value)
80+
_value['label'] = generate_prompt(self.workflow_manage, _label_value)
7981
tooltip = _value.get('attrs').get('tooltip')
8082
if tooltip is not None:
81-
_value.get('attrs')['tooltip'] = self.workflow_manage.generate_prompt(tooltip)
83+
_value.get('attrs')['tooltip'] = generate_prompt(self.workflow_manage, tooltip)
84+
85+
if ['SingleSelect', 'MultiSelect', 'RadioCard', 'RadioRow'].__contains__(field.get('input_type')):
86+
if field.get('assignment_method') == 'ref_variables':
87+
option_list = self.workflow_manage.get_reference_field(field.get('option_list')[0],
88+
field.get('option_list')[1:])
89+
option_list = option_list if isinstance(option_list, list) else []
90+
field['option_list'] = option_list
91+
field['default_value'] = get_default_option(option_list, field.get('input_type'),
92+
field.get('value_field'))
93+
94+
if ['JsonInput'].__contains__(field.get('input_type')):
95+
if field.get('default_value_assignment_method') == 'ref_variables':
96+
field['default_value'] = self.workflow_manage.get_reference_field(field.get('default_value')[0],
97+
field.get('default_value')[1:])
98+
8299
return field
83100

84101
def execute(self, form_field_list, form_content_format, form_data, **kwargs) -> NodeResult:

ui/src/components/dynamics-form/constructor/data.ts

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ const input_type_list = [
55
value: 'TextInput',
66
},
77
{
8-
label: t('dynamicsForm.input_type_list.PasswordInput'),
9-
value: 'PasswordInput',
8+
label: t('dynamicsForm.input_type_list.TextareaInput'),
9+
value: 'TextareaInput',
1010
},
1111
{
12-
label: t('dynamicsForm.input_type_list.Slider'),
13-
value: 'Slider',
12+
label: t('dynamicsForm.input_type_list.JsonInput'),
13+
value: 'JsonInput',
1414
},
1515
{
16-
label: t('dynamicsForm.input_type_list.SwitchInput'),
17-
value: 'SwitchInput',
16+
label: t('dynamicsForm.input_type_list.PasswordInput'),
17+
value: 'PasswordInput',
1818
},
1919
{
2020
label: t('dynamicsForm.input_type_list.SingleSelect'),
@@ -24,14 +24,6 @@ const input_type_list = [
2424
label: t('dynamicsForm.input_type_list.MultiSelect'),
2525
value: 'MultiSelect',
2626
},
27-
{
28-
label: t('dynamicsForm.input_type_list.DatePicker'),
29-
value: 'DatePicker',
30-
},
31-
{
32-
label: t('dynamicsForm.input_type_list.JsonInput'),
33-
value: 'JsonInput',
34-
},
3527
{
3628
label: t('dynamicsForm.input_type_list.RadioCard'),
3729
value: 'RadioCard',
@@ -41,12 +33,22 @@ const input_type_list = [
4133
value: 'RadioRow',
4234
},
4335
{
44-
label: t('dynamicsForm.input_type_list.UploadInput'),
45-
value: 'UploadInput',
36+
label: t('dynamicsForm.input_type_list.Slider'),
37+
value: 'Slider',
4638
},
4739
{
48-
label: t('dynamicsForm.input_type_list.TextareaInput'),
49-
value: 'TextareaInput',
40+
label: t('dynamicsForm.input_type_list.SwitchInput'),
41+
value: 'SwitchInput',
42+
},
43+
44+
{
45+
label: t('dynamicsForm.input_type_list.DatePicker'),
46+
value: 'DatePicker',
47+
},
48+
49+
{
50+
label: t('dynamicsForm.input_type_list.UploadInput'),
51+
value: 'UploadInput',
5052
},
5153
]
5254
export { input_type_list }

ui/src/components/dynamics-form/constructor/items/JsonInputConstructor.vue

Lines changed: 96 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,52 @@
11
<template>
2+
<el-form-item v-if="getModel">
3+
<template #label>
4+
<div class="flex-between">
5+
{{ $t('dynamicsForm.AssignmentMethod.label', '赋值方式') }}
6+
</div>
7+
</template>
8+
9+
<el-row style="width: 100%" :gutter="10">
10+
<el-radio-group v-model="formValue.default_value_assignment_method">
11+
<el-radio :value="item.value" size="large" v-for="item in assignment_method_option_list"
12+
>{{ item.label }}
13+
<el-popover
14+
width="300px"
15+
v-if="item.value == 'ref_variables'"
16+
class="box-item"
17+
placement="top-start"
18+
>
19+
{{ $t('dynamicsForm.AssignmentMethod.ref_variables.popover') }}:
20+
{{ $t('dynamicsForm.AssignmentMethod.ref_variables.json_format') }}
21+
22+
<template #reference>
23+
<el-icon><InfoFilled /></el-icon>
24+
</template>
25+
</el-popover>
26+
</el-radio>
27+
</el-radio-group>
28+
</el-row>
29+
</el-form-item>
30+
<el-form-item
31+
v-if="formValue.default_value_assignment_method == 'ref_variables'"
32+
:required="true"
33+
prop="default_value"
34+
:rules="[default_ref_variables_value_rule]"
35+
>
36+
<NodeCascader
37+
ref="nodeCascaderRef"
38+
:nodeModel="model"
39+
class="w-full"
40+
:placeholder="$t('views.applicationWorkflow.variable.placeholder')"
41+
v-model="formValue.default_value"
42+
/>
43+
</el-form-item>
44+
245
<el-form-item
346
class="defaultValueItem"
447
:label="$t('dynamicsForm.default.label')"
548
:required="formValue.required"
49+
v-if="formValue.default_value_assignment_method == 'custom'"
650
prop="default_value"
751
:rules="[default_value_rule]"
852
>
@@ -16,19 +60,46 @@
1660
</el-form-item>
1761
</template>
1862
<script setup lang="ts">
19-
import { computed, onMounted, ref } from 'vue'
63+
import { computed, onMounted, ref, inject, watch } from 'vue'
64+
import { t } from '@/locales'
65+
import NodeCascader from '@/workflow/common/NodeCascader.vue'
2066
import JsonInput from '@/components/dynamics-form/items/JsonInput.vue'
2167
const props = defineProps<{
2268
modelValue: any
2369
}>()
70+
const getModel = inject('getModel') as any
71+
72+
const assignment_method_option_list = computed(() => {
73+
const option_list = [
74+
{
75+
label: t('dynamicsForm.AssignmentMethod.custom.label', '自定义'),
76+
value: 'custom',
77+
},
78+
]
79+
if (getModel) {
80+
option_list.push({
81+
label: t('dynamicsForm.AssignmentMethod.ref_variables.label', '引用变量'),
82+
value: 'ref_variables',
83+
})
84+
}
85+
return option_list
86+
})
87+
88+
const model = computed(() => {
89+
if (getModel) {
90+
return getModel()
91+
} else {
92+
return null
93+
}
94+
})
2495
const emit = defineEmits(['update:modelValue'])
2596
const formValue = computed({
2697
set: (item) => {
2798
emit('update:modelValue', item)
2899
},
29100
get: () => {
30101
return props.modelValue
31-
}
102+
},
32103
})
33104
const jsonInputRef = ref<InstanceType<typeof JsonInput>>()
34105
const getData = () => {
@@ -41,14 +112,15 @@ const getData = () => {
41112
required: formValue.value.required,
42113
validator: `validator = (rule, value, callback) => {
43114
return componentFormRef.value?.validate_rules(rule, value, callback);
44-
115+
45116
}`,
46-
trigger: 'blur'
47-
}
48-
]
117+
trigger: 'blur',
118+
},
119+
],
49120
},
50121
default_value: formValue.value.default_value,
51-
show_default_value: formValue.value.show_default_value
122+
show_default_value: formValue.value.show_default_value,
123+
default_value_assignment_method: formValue.value.default_value_assignment_method || 'custom',
52124
}
53125
}
54126
@@ -58,15 +130,31 @@ const default_value_rule = {
58130
jsonInputRef.value?.validate_rules(rule, value, callback)
59131
return true
60132
},
61-
trigger: 'blur'
133+
trigger: 'blur',
134+
}
135+
const default_ref_variables_value_rule = {
136+
required: true,
137+
validator: (rule: any, value: any, callback: any) => {
138+
if (!(Array.isArray(value) && value.length > 1)) {
139+
callback(
140+
t('dynamicsForm.AssignmentMethod.ref_variables.label', '引用变量') + t('common.required'),
141+
)
142+
}
143+
144+
return true
145+
},
146+
trigger: 'blur',
62147
}
63148
64149
const rander = (form_data: any) => {
65150
formValue.value.default_value = form_data.default_value
151+
formValue.value.default_value_assignment_method =
152+
form_data.default_value_assignment_method || 'custom'
66153
}
67154
defineExpose({ getData, rander })
68155
onMounted(() => {
69156
formValue.value.default_value = {}
157+
formValue.value.default_value_assignment_method = 'custom'
70158
if (formValue.value.show_default_value === undefined) {
71159
formValue.value.show_default_value = true
72160
}

ui/src/components/dynamics-form/constructor/items/MultiSelectConstructor.vue

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
</template>
88

99
<el-row style="width: 100%" :gutter="10">
10-
<el-radio-group v-model="formValue.assignment_method">
10+
<el-radio-group @change="formValue.option_list = []" v-model="formValue.assignment_method">
1111
<el-radio :value="item.value" size="large" v-for="item in assignment_method_option_list"
1212
>{{ item.label }}
1313
<el-popover
@@ -37,14 +37,21 @@
3737
</el-radio-group>
3838
</el-row>
3939
</el-form-item>
40-
<NodeCascader
40+
<el-form-item
4141
v-if="formValue.assignment_method == 'ref_variables'"
42-
ref="nodeCascaderRef"
43-
:nodeModel="model"
44-
class="w-full"
45-
:placeholder="$t('views.applicationWorkflow.variable.placeholder')"
46-
v-model="formValue.option_list"
47-
/>
42+
:required="true"
43+
prop="option_list"
44+
:rules="[default_ref_variables_value_rule]"
45+
>
46+
<NodeCascader
47+
ref="nodeCascaderRef"
48+
:nodeModel="model"
49+
class="w-full"
50+
:placeholder="$t('views.applicationWorkflow.variable.placeholder')"
51+
v-model="formValue.option_list"
52+
/>
53+
</el-form-item>
54+
4855
<el-form-item v-if="formValue.assignment_method == 'custom'">
4956
<template #label>
5057
<div class="flex-between">
@@ -139,7 +146,7 @@
139146
</el-form-item>
140147
</template>
141148
<script setup lang="ts">
142-
import { computed, onMounted, inject } from 'vue'
149+
import { computed, onMounted, inject, watch } from 'vue'
143150
import NodeCascader from '@/workflow/common/NodeCascader.vue'
144151
import { t } from '@/locales'
145152
const getModel = inject('getModel') as any
@@ -180,6 +187,20 @@ const formValue = computed({
180187
},
181188
})
182189
190+
const default_ref_variables_value_rule = {
191+
required: true,
192+
validator: (rule: any, value: any, callback: any) => {
193+
console.log(value.length)
194+
if (!(Array.isArray(value) && value.length > 1)) {
195+
callback(
196+
t('dynamicsForm.AssignmentMethod.ref_variables.label', '引用变量') + t('common.required'),
197+
)
198+
}
199+
200+
return true
201+
},
202+
trigger: 'blur',
203+
}
183204
const addOption = () => {
184205
formValue.value.option_list.push({ value: '', label: '' })
185206
}

0 commit comments

Comments
 (0)