From 589f895c730d8f414b88637e81cfac176ae5678d Mon Sep 17 00:00:00 2001 From: shaohuzhang1 Date: Thu, 23 Nov 2023 17:55:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8A=A8=E6=80=81=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/froms/__init__.py | 8 +- .../{array_card.py => array_object_card.py} | 13 +- apps/common/froms/base_field.py | 51 ++-- apps/common/froms/multi_select.py | 11 +- apps/common/froms/number_input_field.py | 27 -- apps/common/froms/object_card.py | 9 +- apps/common/froms/password_input.py | 9 +- ...ombobox_field.py => radio_button_field.py} | 21 +- apps/common/froms/radio_card_field.py | 38 +++ apps/common/froms/radio_field.py | 11 +- apps/common/froms/single_select_field.py | 9 +- apps/common/froms/switch_btn.py | 28 -- apps/common/froms/tab_card.py | 9 +- apps/common/froms/table_checkbox.py | 33 +++ apps/common/froms/table_radio.py | 9 +- apps/common/froms/text_input_field.py | 10 +- ui/package.json | 3 +- ui/src/api/provider.ts | 12 + ui/src/bus/index.ts | 8 + ui/src/components/dynamics-form/Demo.vue | 278 ++++++++++++++++++ ui/src/components/dynamics-form/FormItem.vue | 155 ++++++++++ .../dynamics-form/FormItemLabel.vue | 11 + ui/src/components/dynamics-form/index.ts | 23 ++ ui/src/components/dynamics-form/index.vue | 175 +++++++++++ .../dynamics-form/items/PasswordInput.vue | 5 + .../dynamics-form/items/TextInput.vue | 5 + .../items/complex/ArrayObjectCard.vue | 161 ++++++++++ .../items/complex/ObjectCard.vue | 82 ++++++ .../dynamics-form/items/complex/TabCard.vue | 129 ++++++++ .../dynamics-form/items/radio/Radio.vue | 38 +++ .../dynamics-form/items/radio/RadioButton.vue | 38 +++ .../dynamics-form/items/radio/RadioCard.vue | 92 ++++++ .../items/select/MultiSelect.vue | 65 ++++ .../items/select/SingleSelect.vue | 63 ++++ .../items/table/ProgressTableItem.vue | 68 +++++ .../items/table/TableCheckbox.vue | 211 +++++++++++++ .../dynamics-form/items/table/TableColumn.vue | 22 ++ .../dynamics-form/items/table/TableRadio.vue | 199 +++++++++++++ ui/src/components/dynamics-form/type.ts | 172 +++++++++++ ui/src/components/index.ts | 3 +- ui/src/utils/decimalFormat.ts | 16 + ui/src/views/template/index.vue | 2 +- 42 files changed, 2170 insertions(+), 162 deletions(-) rename apps/common/froms/{array_card.py => array_object_card.py} (55%) delete mode 100644 apps/common/froms/number_input_field.py rename apps/common/froms/{combobox_field.py => radio_button_field.py} (52%) create mode 100644 apps/common/froms/radio_card_field.py delete mode 100644 apps/common/froms/switch_btn.py create mode 100644 apps/common/froms/table_checkbox.py create mode 100644 ui/src/api/provider.ts create mode 100644 ui/src/bus/index.ts create mode 100644 ui/src/components/dynamics-form/Demo.vue create mode 100644 ui/src/components/dynamics-form/FormItem.vue create mode 100644 ui/src/components/dynamics-form/FormItemLabel.vue create mode 100644 ui/src/components/dynamics-form/index.ts create mode 100644 ui/src/components/dynamics-form/index.vue create mode 100644 ui/src/components/dynamics-form/items/PasswordInput.vue create mode 100644 ui/src/components/dynamics-form/items/TextInput.vue create mode 100644 ui/src/components/dynamics-form/items/complex/ArrayObjectCard.vue create mode 100644 ui/src/components/dynamics-form/items/complex/ObjectCard.vue create mode 100644 ui/src/components/dynamics-form/items/complex/TabCard.vue create mode 100644 ui/src/components/dynamics-form/items/radio/Radio.vue create mode 100644 ui/src/components/dynamics-form/items/radio/RadioButton.vue create mode 100644 ui/src/components/dynamics-form/items/radio/RadioCard.vue create mode 100644 ui/src/components/dynamics-form/items/select/MultiSelect.vue create mode 100644 ui/src/components/dynamics-form/items/select/SingleSelect.vue create mode 100644 ui/src/components/dynamics-form/items/table/ProgressTableItem.vue create mode 100644 ui/src/components/dynamics-form/items/table/TableCheckbox.vue create mode 100644 ui/src/components/dynamics-form/items/table/TableColumn.vue create mode 100644 ui/src/components/dynamics-form/items/table/TableRadio.vue create mode 100644 ui/src/components/dynamics-form/type.ts create mode 100644 ui/src/utils/decimalFormat.ts diff --git a/apps/common/froms/__init__.py b/apps/common/froms/__init__.py index 5a1f3be58..cda6fe040 100644 --- a/apps/common/froms/__init__.py +++ b/apps/common/froms/__init__.py @@ -6,17 +6,17 @@ @date:2023/10/31 17:56 @desc: """ -from .array_card import * +from .array_object_card import * from .base_field import * from .base_form import * -from .combobox_field import * from .multi_select import * -from .number_input_field import * from .object_card import * from .password_input import * from .radio_field import * from .single_select_field import * -from .switch_btn import * from .tab_card import * from .table_radio import * from .text_input_field import * +from .radio_button_field import * +from .table_checkbox import * +from .radio_card_field import * diff --git a/apps/common/froms/array_card.py b/apps/common/froms/array_object_card.py similarity index 55% rename from apps/common/froms/array_card.py rename to apps/common/froms/array_object_card.py index 1e4daa303..2bc47a53b 100644 --- a/apps/common/froms/array_card.py +++ b/apps/common/froms/array_object_card.py @@ -2,7 +2,7 @@ """ @project: maxkb @Author:虎 - @file: array_card.py + @file: array_object_card.py @date:2023/10/31 18:03 @desc: """ @@ -24,13 +24,10 @@ class ArrayCard(BaseExecField): method: str, required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - relation_trigger_field_list: List[str] = None, - relation_trigger_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, trigger_type: TriggerType = TriggerType.OPTION_LIST, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): - super().__init__("ArrayCard", label, text_field, value_field, provider, method, required, default_value, - relation_show_field_list, relation_show_value_list, relation_trigger_field_list, - relation_trigger_value_list, trigger_type, attrs, props_info) + super().__init__("ArrayObjectCard", label, text_field, value_field, provider, method, required, default_value, + relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info) diff --git a/apps/common/froms/base_field.py b/apps/common/froms/base_field.py index 21da03868..d12ae77a7 100644 --- a/apps/common/froms/base_field.py +++ b/apps/common/froms/base_field.py @@ -23,10 +23,8 @@ class BaseField: label: str, required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - relation_trigger_field_list: List[str] = None, - relation_trigger_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, trigger_type: TriggerType = TriggerType.OPTION_LIST, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): @@ -35,10 +33,8 @@ class BaseField: :param input_type: 字段 :param label: 提示 :param default_value: 默认值 - :param relation_show_field_list: 指定那些当那些字段有值的时候 当前字段显示 - :param relation_show_value_list: 指定字段有值 并且值在relation_show_value_list列表中则显示当前字段 - :param relation_trigger_field_list: 指定那些字段有值的时候 调用当前字段的 执行函数获取optionList数据 - :param relation_trigger_value_list: 指定那些字段有值 并且值在relation_trigger_value_list列表中 则执行函数获取optionList数据 + :param relation_show_field_dict: {field:field_value_list} 表示在 field有值 ,并且值在field_value_list中才显示 + :param relation_trigger_field_dict: {field:field_value_list} 表示在 field有值 ,并且值在field_value_list中才 执行函数获取 数据 :param trigger_type: 执行器类型 OPTION_LIST请求Option_list数据 CHILD_FORMS请求子表单 :param attrs: 前端attr数据 :param props_info: 其他额外信息 @@ -52,10 +48,8 @@ class BaseField: self.props_info = props_info self.default_value = default_value self.input_type = input_type - self.relation_show_field_list = [] if relation_show_field_list is None else relation_show_field_list - self.relation_show_value_list = [] if relation_show_value_list is None else relation_show_value_list - self.relation_trigger_field_list = [] if relation_trigger_field_list is None else relation_trigger_field_list - self.relation_trigger_value_field_list = [] if relation_trigger_value_list is None else relation_trigger_value_list + self.relation_show_field_dict = {} if relation_show_field_dict is None else relation_show_field_dict + self.relation_trigger_field_dict = [] if relation_trigger_field_dict is None else relation_trigger_field_dict self.required = required self.trigger_type = trigger_type @@ -65,10 +59,8 @@ class BaseField: 'label': self.label, 'required': self.required, 'default_value': self.default_value, - 'relation_show_field_list': self.relation_show_field_list, - 'relation_show_value_list': self.relation_show_value_list, - 'relation_trigger_field_list': self.relation_trigger_field_list, - 'relation_trigger_value_field_list': self.relation_trigger_value_field_list, + 'relation_show_field_dict': self.relation_show_field_dict, + 'relation_trigger_field_dict': self.relation_trigger_field_dict, 'trigger_type': self.trigger_type.value, 'attrs': self.attrs, 'props_info': self.props_info, @@ -83,8 +75,7 @@ class BaseDefaultOptionField(BaseField): option_list: List[dict], required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, + relation_show_field_dict: Dict[str, object] = None, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): """ @@ -96,13 +87,12 @@ class BaseDefaultOptionField(BaseField): :param option_list: 可选列表 :param required: 是否必填 :param default_value: 默认值 - :param relation_show_field_list: 指定那些当那些字段有值的时候 当前字段显示 - :param relation_show_value_list: 指定字段有值 并且值在relation_show_value_list列表中则显示当前字段 + :param relation_show_field_dict: {field:field_value_list} 表示在 field有值 ,并且值在field_value_list中才显示 :param attrs: 前端attr数据 :param props_info: 其他额外信息 """ - super().__init__(input_type, label, required, default_value, relation_show_field_list, relation_show_value_list, - [], [], TriggerType.OPTION_LIST, attrs, props_info) + super().__init__(input_type, label, required, default_value, relation_show_field_dict, + {}, TriggerType.OPTION_LIST, attrs, props_info) self.text_field = text_field self.value_field = value_field self.option_list = option_list @@ -122,10 +112,8 @@ class BaseExecField(BaseField): method: str, required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - relation_trigger_field_list: List[str] = None, - relation_trigger_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, trigger_type: TriggerType = TriggerType.OPTION_LIST, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): @@ -139,16 +127,15 @@ class BaseExecField(BaseField): :param method: 执行供应商函数 method :param required: 是否必填 :param default_value: 默认值 - :param relation_show_field_list: 指定那些当那些字段有值的时候 当前字段显示 - :param relation_show_value_list: 指定字段有值 并且值在relation_show_value_list列表中则显示当前字段 - :param relation_trigger_field_list: 指定那些字段有值的时候 调用当前字段的 执行函数获取optionList数据 - :param relation_trigger_value_list: 指定那些字段有值 并且值在relation_trigger_value_list列表中 则执行函数获取optionList数据 + :param relation_show_field_dict: {field:field_value_list} 表示在 field有值 ,并且值在field_value_list中才显示 + :param relation_trigger_field_dict: {field:field_value_list} 表示在 field有值 ,并且值在field_value_list中才 执行函数获取 数据 :param trigger_type: 执行器类型 OPTION_LIST请求Option_list数据 CHILD_FORMS请求子表单 :param attrs: 前端attr数据 :param props_info: 其他额外信息 """ - super().__init__(input_type, label, required, default_value, relation_show_field_list, relation_show_value_list, - relation_trigger_field_list, relation_trigger_value_list, trigger_type, attrs, props_info) + super().__init__(input_type, label, required, default_value, relation_show_field_dict, + relation_trigger_field_dict, + trigger_type, attrs, props_info) self.text_field = text_field self.value_field = value_field self.provider = provider diff --git a/apps/common/froms/multi_select.py b/apps/common/froms/multi_select.py index 12c41f1e1..f3c854224 100644 --- a/apps/common/froms/multi_select.py +++ b/apps/common/froms/multi_select.py @@ -25,17 +25,14 @@ class MultiSelect(BaseExecField): method: str = None, required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - relation_trigger_field_list: List[str] = None, - relation_trigger_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, trigger_type: TriggerType = TriggerType.OPTION_LIST, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): super().__init__("MultiSelect", label, text_field, value_field, provider, method, required, default_value, - relation_show_field_list, relation_show_value_list, relation_trigger_field_list, - relation_trigger_value_list, trigger_type, attrs, props_info) + relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info) self.option_list = option_list def to_dict(self): - return {**super().to_dict(), 'option_list': self.option_list} \ No newline at end of file + return {**super().to_dict(), 'option_list': self.option_list} diff --git a/apps/common/froms/number_input_field.py b/apps/common/froms/number_input_field.py deleted file mode 100644 index 59d8e7e08..000000000 --- a/apps/common/froms/number_input_field.py +++ /dev/null @@ -1,27 +0,0 @@ -# coding=utf-8 -""" - @project: maxkb - @Author:虎 - @file: number_input_field.py - @date:2023/10/31 17:58 - @desc: -""" -from typing import List - -from common.froms.base_field import BaseField, TriggerType - - -class NumberInput(BaseField): - """ - 文本输入框 - """ - - def __init__(self, label: str, - required: bool = False, - default_value=None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - attrs=None, props_info=None): - super().__init__('NumberInput', label, required, default_value, relation_show_field_list, - relation_show_value_list, [], [], - TriggerType.OPTION_LIST, attrs, props_info) diff --git a/apps/common/froms/object_card.py b/apps/common/froms/object_card.py index 3e9075dce..493c488c9 100644 --- a/apps/common/froms/object_card.py +++ b/apps/common/froms/object_card.py @@ -24,13 +24,10 @@ class ObjectCard(BaseExecField): method: str, required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - relation_trigger_field_list: List[str] = None, - relation_trigger_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, trigger_type: TriggerType = TriggerType.OPTION_LIST, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): super().__init__("ObjectCard", label, text_field, value_field, provider, method, required, default_value, - relation_show_field_list, relation_show_value_list, relation_trigger_field_list, - relation_trigger_value_list, trigger_type, attrs, props_info) + relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info) diff --git a/apps/common/froms/password_input.py b/apps/common/froms/password_input.py index 81b9d697b..a8452c893 100644 --- a/apps/common/froms/password_input.py +++ b/apps/common/froms/password_input.py @@ -6,7 +6,7 @@ @date:2023/11/1 14:48 @desc: """ -from typing import List +from typing import List, Dict from common.froms import BaseField, TriggerType @@ -19,9 +19,8 @@ class PasswordInputField(BaseField): def __init__(self, label: str, required: bool = False, default_value=None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, + relation_show_field_dict: Dict = None, attrs=None, props_info=None): - super().__init__('TextInput', label, required, default_value, relation_show_field_list, - relation_show_value_list, [], [], + super().__init__('PasswordInput', label, required, default_value, relation_show_field_dict, + {}, TriggerType.OPTION_LIST, attrs, props_info) diff --git a/apps/common/froms/combobox_field.py b/apps/common/froms/radio_button_field.py similarity index 52% rename from apps/common/froms/combobox_field.py rename to apps/common/froms/radio_button_field.py index 2a506f852..5c7f2cf9a 100644 --- a/apps/common/froms/combobox_field.py +++ b/apps/common/froms/radio_button_field.py @@ -2,7 +2,7 @@ """ @project: maxkb @Author:虎 - @file: combobox_field.py + @file: radio_field.py @date:2023/10/31 17:59 @desc: """ @@ -11,9 +11,9 @@ from typing import List, Dict from common.froms.base_field import BaseExecField, TriggerType -class Combobox(BaseExecField): +class Radio(BaseExecField): """ - 多选框 + 下拉单选 """ def __init__(self, @@ -21,20 +21,17 @@ class Combobox(BaseExecField): text_field: str, value_field: str, option_list: List[str:object], - provider: str = None, - method: str = None, + provider: str, + method: str, required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - relation_trigger_field_list: List[str] = None, - relation_trigger_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, trigger_type: TriggerType = TriggerType.OPTION_LIST, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): - super().__init__("Combobox", label, text_field, value_field, provider, method, required, default_value, - relation_show_field_list, relation_show_value_list, relation_trigger_field_list, - relation_trigger_value_list, trigger_type, attrs, props_info) + super().__init__("RadioButton", label, text_field, value_field, provider, method, required, default_value, + relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info) self.option_list = option_list def to_dict(self): diff --git a/apps/common/froms/radio_card_field.py b/apps/common/froms/radio_card_field.py new file mode 100644 index 000000000..07c57dcd9 --- /dev/null +++ b/apps/common/froms/radio_card_field.py @@ -0,0 +1,38 @@ +# coding=utf-8 +""" + @project: maxkb + @Author:虎 + @file: radio_field.py + @date:2023/10/31 17:59 + @desc: +""" +from typing import List, Dict + +from common.froms.base_field import BaseExecField, TriggerType + + +class Radio(BaseExecField): + """ + 下拉单选 + """ + + def __init__(self, + label: str, + text_field: str, + value_field: str, + option_list: List[str:object], + provider: str, + method: str, + required: bool = False, + default_value: object = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, + trigger_type: TriggerType = TriggerType.OPTION_LIST, + attrs: Dict[str, object] = None, + props_info: Dict[str, object] = None): + super().__init__("RadioCard", label, text_field, value_field, provider, method, required, default_value, + relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info) + self.option_list = option_list + + def to_dict(self): + return {**super().to_dict(), 'option_list': self.option_list} diff --git a/apps/common/froms/radio_field.py b/apps/common/froms/radio_field.py index ce2146070..b8fcbd9b1 100644 --- a/apps/common/froms/radio_field.py +++ b/apps/common/froms/radio_field.py @@ -25,17 +25,14 @@ class Radio(BaseExecField): method: str, required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - relation_trigger_field_list: List[str] = None, - relation_trigger_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, trigger_type: TriggerType = TriggerType.OPTION_LIST, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): super().__init__("Radio", label, text_field, value_field, provider, method, required, default_value, - relation_show_field_list, relation_show_value_list, relation_trigger_field_list, - relation_trigger_value_list, trigger_type, attrs, props_info) + relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info) self.option_list = option_list def to_dict(self): - return {**super().to_dict(), 'option_list': self.option_list} \ No newline at end of file + return {**super().to_dict(), 'option_list': self.option_list} diff --git a/apps/common/froms/single_select_field.py b/apps/common/froms/single_select_field.py index 9d3ecb2a9..f0d359d90 100644 --- a/apps/common/froms/single_select_field.py +++ b/apps/common/froms/single_select_field.py @@ -25,16 +25,13 @@ class SingleSelect(BaseExecField): method: str = None, required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - relation_trigger_field_list: List[str] = None, - relation_trigger_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, trigger_type: TriggerType = TriggerType.OPTION_LIST, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): super().__init__("SingleSelect", label, text_field, value_field, provider, method, required, default_value, - relation_show_field_list, relation_show_value_list, relation_trigger_field_list, - relation_trigger_value_list, trigger_type, attrs, props_info) + relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info) self.option_list = option_list def to_dict(self): diff --git a/apps/common/froms/switch_btn.py b/apps/common/froms/switch_btn.py deleted file mode 100644 index 32aadbd5f..000000000 --- a/apps/common/froms/switch_btn.py +++ /dev/null @@ -1,28 +0,0 @@ -# coding=utf-8 -""" - @project: maxkb - @Author:虎 - @file: switch_btn.py - @date:2023/10/31 18:00 - @desc: -""" -from typing import List - -from common.froms.base_field import TriggerType, BaseField - - -class SwitchBtn(BaseField): - """ - 开关 - """ - - def __init__(self, - label: str, - required: bool = False, - default_value=None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - attrs=None, props_info=None): - super().__init__('SwitchBtn', label, required, default_value, relation_show_field_list, - relation_show_value_list, [], [], - TriggerType.OPTION_LIST, attrs, props_info) diff --git a/apps/common/froms/tab_card.py b/apps/common/froms/tab_card.py index 50caa3c79..2b09d46bf 100644 --- a/apps/common/froms/tab_card.py +++ b/apps/common/froms/tab_card.py @@ -24,13 +24,10 @@ class TabCard(BaseExecField): method: str, required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - relation_trigger_field_list: List[str] = None, - relation_trigger_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, trigger_type: TriggerType = TriggerType.OPTION_LIST, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): super().__init__("TabCard", label, text_field, value_field, provider, method, required, default_value, - relation_show_field_list, relation_show_value_list, relation_trigger_field_list, - relation_trigger_value_list, trigger_type, attrs, props_info) + relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info) diff --git a/apps/common/froms/table_checkbox.py b/apps/common/froms/table_checkbox.py new file mode 100644 index 000000000..f08b2720b --- /dev/null +++ b/apps/common/froms/table_checkbox.py @@ -0,0 +1,33 @@ +# coding=utf-8 +""" + @project: maxkb + @Author:虎 + @file: table_radio.py + @date:2023/10/31 18:01 + @desc: +""" +from typing import List, Dict + +from common.froms.base_field import TriggerType, BaseExecField + + +class TableRadio(BaseExecField): + """ + table 单选 + """ + + def __init__(self, + label: str, + text_field: str, + value_field: str, + provider: str, + method: str, + required: bool = False, + default_value: object = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, + trigger_type: TriggerType = TriggerType.OPTION_LIST, + attrs: Dict[str, object] = None, + props_info: Dict[str, object] = None): + super().__init__("TableCheckbox", label, text_field, value_field, provider, method, required, default_value, + relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info) diff --git a/apps/common/froms/table_radio.py b/apps/common/froms/table_radio.py index ef7cb7f8d..ad0647030 100644 --- a/apps/common/froms/table_radio.py +++ b/apps/common/froms/table_radio.py @@ -24,13 +24,10 @@ class TableRadio(BaseExecField): method: str, required: bool = False, default_value: object = None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, - relation_trigger_field_list: List[str] = None, - relation_trigger_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + relation_trigger_field_dict: Dict = None, trigger_type: TriggerType = TriggerType.OPTION_LIST, attrs: Dict[str, object] = None, props_info: Dict[str, object] = None): super().__init__("TableRadio", label, text_field, value_field, provider, method, required, default_value, - relation_show_field_list, relation_show_value_list, relation_trigger_field_list, - relation_trigger_value_list, trigger_type, attrs, props_info) + relation_show_field_dict, relation_trigger_field_dict, trigger_type, attrs, props_info) diff --git a/apps/common/froms/text_input_field.py b/apps/common/froms/text_input_field.py index 1fceb65cc..8da50a870 100644 --- a/apps/common/froms/text_input_field.py +++ b/apps/common/froms/text_input_field.py @@ -6,7 +6,7 @@ @date:2023/10/31 17:58 @desc: """ -from typing import List +from typing import List, Dict from common.froms.base_field import BaseField, TriggerType @@ -19,9 +19,9 @@ class TextInputField(BaseField): def __init__(self, label: str, required: bool = False, default_value=None, - relation_show_field_list: List[str] = None, - relation_show_value_list: List[str] = None, + relation_show_field_dict: Dict = None, + attrs=None, props_info=None): - super().__init__('TextInput', label, required, default_value, relation_show_field_list, - relation_show_value_list, [], [], + super().__init__('TextInput', label, required, default_value, relation_show_field_dict, + {}, TriggerType.OPTION_LIST, attrs, props_info) diff --git a/ui/package.json b/ui/package.json index 2798d011a..d4dd2cc35 100644 --- a/ui/package.json +++ b/ui/package.json @@ -19,7 +19,8 @@ "nprogress": "^0.2.0", "pinia": "^2.1.6", "vue": "^3.3.4", - "vue-router": "^4.2.4" + "vue-router": "^4.2.4", + "mitt": "^3.0.0" }, "devDependencies": { "@rushstack/eslint-patch": "^1.3.2", diff --git a/ui/src/api/provider.ts b/ui/src/api/provider.ts new file mode 100644 index 000000000..2099658c1 --- /dev/null +++ b/ui/src/api/provider.ts @@ -0,0 +1,12 @@ +import { Result } from '@/request/Result' +import { get, post } from '@/request/index' +import type { Ref } from 'vue' +const trigger: ( + provider: string, + method: string, + request_body: any, + loading?: Ref +) => Promise | string>> = (provider, method, request_body, loading) => { + return post(`provider/${provider}/${method}`, {}, request_body, loading) +} +export default { trigger, get } diff --git a/ui/src/bus/index.ts b/ui/src/bus/index.ts new file mode 100644 index 000000000..c1ab0135f --- /dev/null +++ b/ui/src/bus/index.ts @@ -0,0 +1,8 @@ +import mitt from "mitt"; +const bus: any = {}; +const emitter = mitt(); +bus.on = emitter.on; +bus.off = emitter.off; +bus.emit = emitter.emit; + +export default bus; diff --git a/ui/src/components/dynamics-form/Demo.vue b/ui/src/components/dynamics-form/Demo.vue new file mode 100644 index 000000000..74a7b54bb --- /dev/null +++ b/ui/src/components/dynamics-form/Demo.vue @@ -0,0 +1,278 @@ + + + diff --git a/ui/src/components/dynamics-form/FormItem.vue b/ui/src/components/dynamics-form/FormItem.vue new file mode 100644 index 000000000..68886a460 --- /dev/null +++ b/ui/src/components/dynamics-form/FormItem.vue @@ -0,0 +1,155 @@ + + + diff --git a/ui/src/components/dynamics-form/FormItemLabel.vue b/ui/src/components/dynamics-form/FormItemLabel.vue new file mode 100644 index 000000000..b84dc1eda --- /dev/null +++ b/ui/src/components/dynamics-form/FormItemLabel.vue @@ -0,0 +1,11 @@ + + + diff --git a/ui/src/components/dynamics-form/index.ts b/ui/src/components/dynamics-form/index.ts new file mode 100644 index 000000000..ba8cbfb09 --- /dev/null +++ b/ui/src/components/dynamics-form/index.ts @@ -0,0 +1,23 @@ +import type { App } from 'vue' +import type { Dict } from '@/api/type/common' +import DynamicsForm from '@/components/dynamics-form/index.vue' +let components: Dict = import.meta.glob('@/components/dynamics-form/**/**.vue', { + eager: true +}) +components = { + ...components, + ...import.meta.glob('@/components/dynamics-form/**/**/**.vue', { + eager: true + }) +} + +const install = (app: App) => { + Object.keys(components).forEach((key: string) => { + const commentName: string = key + .substring(key.lastIndexOf('/') + 1, key.length) + .replace('.vue', '') + app.component(commentName, components[key].default) + }) + app.component('DynamicsForm', DynamicsForm) +} +export default { install } diff --git a/ui/src/components/dynamics-form/index.vue b/ui/src/components/dynamics-form/index.vue new file mode 100644 index 000000000..229562ec9 --- /dev/null +++ b/ui/src/components/dynamics-form/index.vue @@ -0,0 +1,175 @@ + + + diff --git a/ui/src/components/dynamics-form/items/PasswordInput.vue b/ui/src/components/dynamics-form/items/PasswordInput.vue new file mode 100644 index 000000000..2111d2461 --- /dev/null +++ b/ui/src/components/dynamics-form/items/PasswordInput.vue @@ -0,0 +1,5 @@ + + + diff --git a/ui/src/components/dynamics-form/items/TextInput.vue b/ui/src/components/dynamics-form/items/TextInput.vue new file mode 100644 index 000000000..46ca9b4e9 --- /dev/null +++ b/ui/src/components/dynamics-form/items/TextInput.vue @@ -0,0 +1,5 @@ + + + diff --git a/ui/src/components/dynamics-form/items/complex/ArrayObjectCard.vue b/ui/src/components/dynamics-form/items/complex/ArrayObjectCard.vue new file mode 100644 index 000000000..dcbb610d3 --- /dev/null +++ b/ui/src/components/dynamics-form/items/complex/ArrayObjectCard.vue @@ -0,0 +1,161 @@ + + + diff --git a/ui/src/components/dynamics-form/items/complex/ObjectCard.vue b/ui/src/components/dynamics-form/items/complex/ObjectCard.vue new file mode 100644 index 000000000..17b07a977 --- /dev/null +++ b/ui/src/components/dynamics-form/items/complex/ObjectCard.vue @@ -0,0 +1,82 @@ + + + diff --git a/ui/src/components/dynamics-form/items/complex/TabCard.vue b/ui/src/components/dynamics-form/items/complex/TabCard.vue new file mode 100644 index 000000000..fa7770509 --- /dev/null +++ b/ui/src/components/dynamics-form/items/complex/TabCard.vue @@ -0,0 +1,129 @@ + + + diff --git a/ui/src/components/dynamics-form/items/radio/Radio.vue b/ui/src/components/dynamics-form/items/radio/Radio.vue new file mode 100644 index 000000000..9c94a3f0b --- /dev/null +++ b/ui/src/components/dynamics-form/items/radio/Radio.vue @@ -0,0 +1,38 @@ + + + diff --git a/ui/src/components/dynamics-form/items/radio/RadioButton.vue b/ui/src/components/dynamics-form/items/radio/RadioButton.vue new file mode 100644 index 000000000..874d61dfc --- /dev/null +++ b/ui/src/components/dynamics-form/items/radio/RadioButton.vue @@ -0,0 +1,38 @@ + + + diff --git a/ui/src/components/dynamics-form/items/radio/RadioCard.vue b/ui/src/components/dynamics-form/items/radio/RadioCard.vue new file mode 100644 index 000000000..6029b90b7 --- /dev/null +++ b/ui/src/components/dynamics-form/items/radio/RadioCard.vue @@ -0,0 +1,92 @@ + + + diff --git a/ui/src/components/dynamics-form/items/select/MultiSelect.vue b/ui/src/components/dynamics-form/items/select/MultiSelect.vue new file mode 100644 index 000000000..f78f898c5 --- /dev/null +++ b/ui/src/components/dynamics-form/items/select/MultiSelect.vue @@ -0,0 +1,65 @@ + + + diff --git a/ui/src/components/dynamics-form/items/select/SingleSelect.vue b/ui/src/components/dynamics-form/items/select/SingleSelect.vue new file mode 100644 index 000000000..379908e83 --- /dev/null +++ b/ui/src/components/dynamics-form/items/select/SingleSelect.vue @@ -0,0 +1,63 @@ + + + diff --git a/ui/src/components/dynamics-form/items/table/ProgressTableItem.vue b/ui/src/components/dynamics-form/items/table/ProgressTableItem.vue new file mode 100644 index 000000000..218007b71 --- /dev/null +++ b/ui/src/components/dynamics-form/items/table/ProgressTableItem.vue @@ -0,0 +1,68 @@ + + + diff --git a/ui/src/components/dynamics-form/items/table/TableCheckbox.vue b/ui/src/components/dynamics-form/items/table/TableCheckbox.vue new file mode 100644 index 000000000..4a51f2131 --- /dev/null +++ b/ui/src/components/dynamics-form/items/table/TableCheckbox.vue @@ -0,0 +1,211 @@ + + + diff --git a/ui/src/components/dynamics-form/items/table/TableColumn.vue b/ui/src/components/dynamics-form/items/table/TableColumn.vue new file mode 100644 index 000000000..9b6989e1f --- /dev/null +++ b/ui/src/components/dynamics-form/items/table/TableColumn.vue @@ -0,0 +1,22 @@ + + + diff --git a/ui/src/components/dynamics-form/items/table/TableRadio.vue b/ui/src/components/dynamics-form/items/table/TableRadio.vue new file mode 100644 index 000000000..c9230ef96 --- /dev/null +++ b/ui/src/components/dynamics-form/items/table/TableRadio.vue @@ -0,0 +1,199 @@ + + + diff --git a/ui/src/components/dynamics-form/type.ts b/ui/src/components/dynamics-form/type.ts new file mode 100644 index 000000000..181d2e96b --- /dev/null +++ b/ui/src/components/dynamics-form/type.ts @@ -0,0 +1,172 @@ +import { Dict } from '@/api/type/common' + +interface ViewCardItem { + /** + * 类型 + */ + type: 'eval' | 'default' + /** + * 标题 + */ + title: string + /** + * 值 根据类型不一样 取值也不一样 default= row[value_field] eval `${parseFloat(row.number).toLocaleString("zh-CN",{style: "decimal",maximumFractionDigits:1})}%   ` + */ + value_field: string +} + +interface TableColumn { + /** + * 字段|组件名称|可计算的模板字符串 + */ + property: string + /** + *表头 + */ + label: string + /** + * 表数据字段 + */ + value_field?: string + + attrs?: Attrs + /** + * 类型 + */ + type: 'eval' | 'component' | 'default' + + props_info?: PropsInfo +} +interface ColorItem { + /** + * 颜色#f56c6c + */ + color: string + /** + * 进度 + */ + percentage: number +} +interface Attrs { + /** + * 提示语 + */ + placeholder?: string + /** + * 标签的长度,例如 '50px'。 作为 Form 直接子元素的 form-item 会继承该值。 可以使用 auto。 + */ + labelWidth?: string + /** + * 表单域标签的后缀 + */ + labelSuffix?: string + /** + * 星号的位置。 + */ + requireAsteriskPosition?: 'left' | 'right' + + color?: Array + + [propName: string]: any +} +interface PropsInfo { + /** + * 表格选择的card + */ + view_card?: Array + /** + * 表格选择 + */ + table_columns?: Array + /** + * 选中 message + */ + active_msg?: string + + /** + * 组件样式 + */ + style?: Dict + + /** + * el-form-item 样式 + */ + item_style?: Dict + /** + * 表单校验 这个和element校验一样 + */ + rules?: Dict + /** + * 默认 不为空校验提示 + */ + err_msg?: string + /** + *tabs的时候使用 + */ + tabs_label?: string + + [propName: string]: any +} + +interface FormField { + field: string + /** + * 输入框类型 + */ + input_type: string + /** + * 提示 + */ + label?: string + /** + * 是否 必填 + */ + required?: boolean + /** + * 默认值 + */ + default_value?: any + /** + * {field:field_value_list} 表示在 field有值 ,并且值在field_value_list中才显示 + */ + relation_show_field_dict?: Dict> + /** + * {field:field_value_list} 表示在 field有值 ,并且值在field_value_list中才 执行函数获取 数据 + */ + relation_trigger_field_dict?: Dict> + /** + * 执行器类型 OPTION_LIST请求Option_list数据 CHILD_FORMS请求子表单 + */ + trigger_type?: 'OPTION_LIST' | 'CHILD_FORMS' + /** + * 前端attr数据 + */ + attrs?: Attrs + /** + * 其他额外信息 + */ + props_info?: PropsInfo + /** + * 下拉选字段field + */ + text_field?: string + /** + * 下拉选 value + */ + value_field?: string + /** + * 下拉选数据 + */ + option_list?: Array + /** + * 供应商 + */ + provider?: string + /** + * 执行函数 + */ + method?: string + + children?: Array +} +export type { FormField } diff --git a/ui/src/components/index.ts b/ui/src/components/index.ts index 1a35fe13a..4f1114a73 100644 --- a/ui/src/components/index.ts +++ b/ui/src/components/index.ts @@ -12,7 +12,7 @@ import AppTable from './app-table/index.vue' import ReadWrite from './read-write/index.vue' import TagEllipsis from './tag-ellipsis/index.vue' import CommonList from './common-list/index.vue' - +import dynamicsForm from './dynamics-form' export default { install(app: App) { app.component(AppIcon.name, AppIcon) @@ -28,5 +28,6 @@ export default { app.component(ReadWrite.name, ReadWrite) app.component(TagEllipsis.name, TagEllipsis) app.component(CommonList.name, CommonList) + app.use(dynamicsForm) } } diff --git a/ui/src/utils/decimalFormat.ts b/ui/src/utils/decimalFormat.ts new file mode 100644 index 000000000..b9e84f9a7 --- /dev/null +++ b/ui/src/utils/decimalFormat.ts @@ -0,0 +1,16 @@ +function format(decimal?: number, digits?: number): string | undefined { + if (digits == undefined) { + digits = 0; + } + return decimal?.toLocaleString("zh-CN", { + style: "decimal", + minimumFractionDigits: digits, + maximumFractionDigits: digits, + }); +} + +const util = { + format, +}; + +export default util; diff --git a/ui/src/views/template/index.vue b/ui/src/views/template/index.vue index fc6f31e0a..4e7bfa467 100644 --- a/ui/src/views/template/index.vue +++ b/ui/src/views/template/index.vue @@ -14,7 +14,7 @@

全部模型

- +