From 2f3347feac9a746c2caeda1ebc83c5af15ba8be9 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Thu, 27 Aug 2026 19:36:46 +0800 Subject: [PATCH] feat: dynamics-form --- ui/src/components/COMPONENT_README.md | 5 +- ui/src/components/mk-dynamics-form/Demo.vue | 4 +- .../components/mk-dynamics-form/FormItem.vue | 7 +- .../constructor/BasicInfoConstructor.vue | 17 +- .../items/DatePickerConstructor.vue | 134 +++++++------ .../items/JsonInputConstructor.vue | 62 +++--- .../constructor/items/MultiRowConstructor.vue | 165 +++++++--------- .../items/MultiSelectConstructor.vue | 166 +++++++--------- .../items/PasswordInputConstructor.vue | 120 +++++------- .../items/RadioCardConstructor.vue | 166 ++++++++-------- .../constructor/items/RadioRowConstructor.vue | 158 +++++++-------- .../items/SingleSelectConstructor.vue | 164 +++++++--------- .../constructor/items/SliderConstructor.vue | 5 +- .../items/SwitchInputConstructor.vue | 2 +- .../items/TextInputConstructor.vue | 118 +++++------- .../items/TextareaInputConstructor.vue | 117 +++++------ .../items/TreeSelectConstructor.vue | 11 +- .../items/UploadInputConstructor.vue | 1 + .../constructor/visibility/ConditionRow.vue | 182 ++++++++---------- .../constructor/visibility/FieldSelector.vue | 18 +- .../constructor/visibility/index.vue | 89 ++++----- .../visibility/{index.ts => utils.ts} | 0 .../mk-dynamics-form/items/JsonInput.vue | 142 +------------- .../mk-dynamics-form/items/MultiRow.vue | 1 + .../items/common/SelectHeader.vue | 24 --- .../items/knowledge/Knowledge.vue | 5 - .../items/label/SettingLabel.vue | 75 -------- .../items/label/TooltipLabel.vue | 2 +- .../items/layout/RowLayout.vue | 7 - .../mk-dynamics-form/items/model/Model.vue | 4 - .../items/radio/RadioCard.vue | 101 ++++------ .../mk-dynamics-form/items/radio/RadioRow.vue | 1 + .../items/select/MultiSelect.vue | 5 - .../items/select/SingleSelect.vue | 21 +- .../mk-dynamics-form/items/slider/Slider.vue | 2 +- .../items/tree/TreeSelect.vue | 10 +- ui/src/components/mk-form-list/index.vue | 19 +- ui/src/styles/app.scss | 8 + ui/src/styles/element-plus.scss | 3 - ui/src/views/VIEW_README.md | 2 +- .../components/LoginSetting.vue | 8 +- ui/src/workflow-canvas/core/NodeCascader.vue | 2 +- 42 files changed, 853 insertions(+), 1300 deletions(-) rename ui/src/components/mk-dynamics-form/constructor/visibility/{index.ts => utils.ts} (100%) delete mode 100644 ui/src/components/mk-dynamics-form/items/common/SelectHeader.vue delete mode 100644 ui/src/components/mk-dynamics-form/items/label/SettingLabel.vue delete mode 100644 ui/src/components/mk-dynamics-form/items/layout/RowLayout.vue diff --git a/ui/src/components/COMPONENT_README.md b/ui/src/components/COMPONENT_README.md index d522c4ee0bd..fc4a29e6bf9 100644 --- a/ui/src/components/COMPONENT_README.md +++ b/ui/src/components/COMPONENT_README.md @@ -712,7 +712,10 @@ const roleSettings = defineModel<{ roleId: string; workspaceIds: string[] }[]>({ ``` -`addText` 设置添加按钮文案。删除按钮及第一行与后续行的对齐由组件统一处理。 +`addText` 设置添加按钮文案,`showAddButton` 默认为 `true`;添加入口由业务布局单独提供时传入 +`:show-add-button="false"`。`firstRowHasLabel` 默认为 `true`:第一行删除按钮使用 `mt-8`,后续行 +使用 `mt-0.5`;并列表单项没有 label 时传入 `:first-row-has-label="false"`。删除成功后通过 +`remove(item, index)` 返回被删除的行数据和原索引,业务组件可处理关联状态,不需要再次修改列表。 ### MkSearchList diff --git a/ui/src/components/mk-dynamics-form/Demo.vue b/ui/src/components/mk-dynamics-form/Demo.vue index 0e5f1ed6599..5f683ceb31b 100644 --- a/ui/src/components/mk-dynamics-form/Demo.vue +++ b/ui/src/components/mk-dynamics-form/Demo.vue @@ -177,7 +177,7 @@ const validateForm = async () => { - { 取消 确定 - + diff --git a/ui/src/components/mk-dynamics-form/FormItem.vue b/ui/src/components/mk-dynamics-form/FormItem.vue index 975ee969a66..62d2c7064c3 100644 --- a/ui/src/components/mk-dynamics-form/FormItem.vue +++ b/ui/src/components/mk-dynamics-form/FormItem.vue @@ -59,7 +59,7 @@ const emit = defineEmits<{ }>() const loading = ref(false) -const fieldComponentRef = ref() +const componentFormRef = ref() const triggerSubscriptions: Array<{ event: string handler: (value: unknown) => void @@ -188,7 +188,7 @@ onBeforeUnmount(() => { function validate() { if (props.formField.trigger_type === 'CHILD_FORMS') { - return fieldComponentRef.value?.validate?.() ?? Promise.resolve() + return componentFormRef.value?.validate?.() ?? Promise.resolve() } return Promise.resolve() } @@ -203,7 +203,6 @@ defineExpose({ validate }) :style="formItemStyle" :prop="formField.field" :rules="validationRules" - :class="formField.required_asterisk ? 'hide-asterisk' : ''" >