From a05573bcdcc50d87e43eb966905d0503bcdc41dc Mon Sep 17 00:00:00 2001 From: shaohuzhang1 <80892890+shaohuzhang1@users.noreply.github.com> Date: Tue, 26 Aug 2025 20:01:39 +0800 Subject: [PATCH] feat: Form collection single line tab supports variables (#3942) --- .../form_node/impl/base_form_node.py | 55 +++++---- .../dynamics-form/constructor/data.ts | 42 +++---- .../items/JsonInputConstructor.vue | 104 ++++++++++++++++-- .../items/MultiSelectConstructor.vue | 39 +++++-- .../items/RadioCardConstructor.vue | 37 +++++-- .../constructor/items/RadioRowConstructor.vue | 101 ++++++++++++++++- .../items/SingleSelectConstructor.vue | 38 +++++-- .../dynamics-form/items/JsonInput.vue | 4 +- ui/src/locales/lang/en-US/dynamics-form.ts | 1 + ui/src/locales/lang/zh-CN/dynamics-form.ts | 1 + ui/src/locales/lang/zh-Hant/dynamics-form.ts | 1 + 11 files changed, 345 insertions(+), 78 deletions(-) diff --git a/apps/application/flow/step_node/form_node/impl/base_form_node.py b/apps/application/flow/step_node/form_node/impl/base_form_node.py index cedc6c8fe..e3d9e8f95 100644 --- a/apps/application/flow/step_node/form_node/impl/base_form_node.py +++ b/apps/application/flow/step_node/form_node/impl/base_form_node.py @@ -18,15 +18,18 @@ from application.flow.step_node.form_node.i_form_node import IFormNode def get_default_option(option_list, _type, value_field): - if option_list is not None and len(option_list) > 0: - default_value_list = [o.get(value_field) for o in option_list if o.get('default')] - if len(default_value_list) == 0: - return option_list[0].get(value_field) - else: - if _type == 'MultiSelect': - return default_value_list + try: + if option_list is not None and isinstance(option_list, list) and len(option_list) > 0: + default_value_list = [o.get(value_field) for o in option_list if o.get('default')] + if len(default_value_list) == 0: + return option_list[0].get(value_field) else: - return default_value_list[0] + if _type == 'MultiSelect': + return default_value_list + else: + return default_value_list[0] + except Exception as _: + pass return [] @@ -41,6 +44,13 @@ def write_context(step_variable: Dict, global_variable: Dict, node, workflow): node.context['run_time'] = time.time() - node.context['start_time'] +def generate_prompt(workflow_manage, _value): + try: + return workflow_manage.generate_prompt(_value) + except Exception as e: + return _value + + class BaseFormNode(IFormNode): def save_context(self, details, workflow_manage): form_data = details.get('form_data', None) @@ -58,27 +68,34 @@ class BaseFormNode(IFormNode): self.context[key] = form_data[key] def reset_field(self, field): - if ['SingleSelect', 'MultiSelect', 'RadioCard'].__contains__(field.get('input_type')): - if field.get('assignment_method') == 'ref_variables': - option_list = self.workflow_manage.get_reference_field(field.get('option_list')[0], - field.get('option_list')[1:]) - field['option_list'] = option_list - field['default_value'] = get_default_option(option_list, field.get('input_type'), - field.get('value_field')) - reset_field = ['field', 'label', 'default_value'] for f in reset_field: _value = field[f] if _value is None: continue if isinstance(_value, str): - field[f] = self.workflow_manage.generate_prompt(_value) + field[f] = generate_prompt(self.workflow_manage, _value) elif f == 'label': _label_value = _value.get('label') - _value['label'] = self.workflow_manage.generate_prompt(_label_value) + _value['label'] = generate_prompt(self.workflow_manage, _label_value) tooltip = _value.get('attrs').get('tooltip') if tooltip is not None: - _value.get('attrs')['tooltip'] = self.workflow_manage.generate_prompt(tooltip) + _value.get('attrs')['tooltip'] = generate_prompt(self.workflow_manage, tooltip) + + if ['SingleSelect', 'MultiSelect', 'RadioCard', 'RadioRow'].__contains__(field.get('input_type')): + if field.get('assignment_method') == 'ref_variables': + option_list = self.workflow_manage.get_reference_field(field.get('option_list')[0], + field.get('option_list')[1:]) + option_list = option_list if isinstance(option_list, list) else [] + field['option_list'] = option_list + field['default_value'] = get_default_option(option_list, field.get('input_type'), + field.get('value_field')) + + if ['JsonInput'].__contains__(field.get('input_type')): + if field.get('default_value_assignment_method') == 'ref_variables': + field['default_value'] = self.workflow_manage.get_reference_field(field.get('default_value')[0], + field.get('default_value')[1:]) + return field def execute(self, form_field_list, form_content_format, form_data, **kwargs) -> NodeResult: diff --git a/ui/src/components/dynamics-form/constructor/data.ts b/ui/src/components/dynamics-form/constructor/data.ts index 2730830e9..7cbdceaef 100644 --- a/ui/src/components/dynamics-form/constructor/data.ts +++ b/ui/src/components/dynamics-form/constructor/data.ts @@ -4,18 +4,18 @@ const input_type_list = [ label: t('dynamicsForm.input_type_list.TextInput'), value: 'TextInput', }, + { + label: t('dynamicsForm.input_type_list.TextareaInput'), + value: 'TextareaInput', + }, + { + label: t('dynamicsForm.input_type_list.JsonInput'), + value: 'JsonInput', + }, { label: t('dynamicsForm.input_type_list.PasswordInput'), value: 'PasswordInput', }, - { - label: t('dynamicsForm.input_type_list.Slider'), - value: 'Slider', - }, - { - label: t('dynamicsForm.input_type_list.SwitchInput'), - value: 'SwitchInput', - }, { label: t('dynamicsForm.input_type_list.SingleSelect'), value: 'SingleSelect', @@ -24,14 +24,6 @@ const input_type_list = [ label: t('dynamicsForm.input_type_list.MultiSelect'), value: 'MultiSelect', }, - { - label: t('dynamicsForm.input_type_list.DatePicker'), - value: 'DatePicker', - }, - { - label: t('dynamicsForm.input_type_list.JsonInput'), - value: 'JsonInput', - }, { label: t('dynamicsForm.input_type_list.RadioCard'), value: 'RadioCard', @@ -40,13 +32,23 @@ const input_type_list = [ label: t('dynamicsForm.input_type_list.RadioRow'), value: 'RadioRow', }, + { + label: t('dynamicsForm.input_type_list.Slider'), + value: 'Slider', + }, + { + label: t('dynamicsForm.input_type_list.SwitchInput'), + value: 'SwitchInput', + }, + + { + label: t('dynamicsForm.input_type_list.DatePicker'), + value: 'DatePicker', + }, + { label: t('dynamicsForm.input_type_list.UploadInput'), value: 'UploadInput', }, - { - label: t('dynamicsForm.input_type_list.TextareaInput'), - value: 'TextareaInput', - }, ] export { input_type_list } diff --git a/ui/src/components/dynamics-form/constructor/items/JsonInputConstructor.vue b/ui/src/components/dynamics-form/constructor/items/JsonInputConstructor.vue index ba4ea8963..9e12bd5cb 100644 --- a/ui/src/components/dynamics-form/constructor/items/JsonInputConstructor.vue +++ b/ui/src/components/dynamics-form/constructor/items/JsonInputConstructor.vue @@ -1,8 +1,52 @@