From 1c28238e8ab38a7ee2a125bb2f41fd55b3824011 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Fri, 14 Aug 2026 17:29:38 +0800 Subject: [PATCH] feat: form list --- ui/src/components/COMPONENT_README.md | 36 ++++++ ui/src/components/mk-form-list/index.vue | 43 +++++++ ui/src/styles/element-plus.scss | 7 ++ ui/src/views/VIEW_README.md | 5 +- .../system/identity/roles/AddMemberDrawer.vue | 85 +++++++++++-- .../components/MemberWorkspaceSetting.vue | 113 ------------------ .../system/identity/users/UserFromDrawer.vue | 98 +++++++++++++-- .../users/components/UserRoleSetting.vue | 110 ----------------- .../users/dialog/BatchSetUserRoleDialog.vue | 101 ++++++++++++++-- .../identity/workspaces/AddMemberDrawer.vue | 83 +++++++++++-- .../components/MemberRoleSetting.vue | 111 ----------------- 11 files changed, 420 insertions(+), 372 deletions(-) create mode 100644 ui/src/components/mk-form-list/index.vue delete mode 100644 ui/src/views/system/identity/roles/components/MemberWorkspaceSetting.vue delete mode 100644 ui/src/views/system/identity/users/components/UserRoleSetting.vue delete mode 100644 ui/src/views/system/identity/workspaces/components/MemberRoleSetting.vue diff --git a/ui/src/components/COMPONENT_README.md b/ui/src/components/COMPONENT_README.md index 99388f1ae91..9702e5a0c6d 100644 --- a/ui/src/components/COMPONENT_README.md +++ b/ui/src/components/COMPONENT_README.md @@ -65,6 +65,8 @@ src/components/ ├── mk-search-list/ │ ├── index.vue # 搜索框与剩余空间滚动列表,手动导入 │ └── mk-list-item.vue # 列表与业务分组列表复用的私有行结构 +├── mk-form-list/ +│ └── index.vue # 可动态增删的表单行列表,手动导入 ├── mk-workspace-dropdown/ │ └── index.vue # 工作空间选择下拉框,手动导入 └── mk-workspace-relation-tags/ @@ -76,6 +78,7 @@ Vue 模板中使用,不需要手动导入。其他共享组件必须从具体 ```ts import MkSearchList from '@/components/mk-search-list/index.vue' +import MkFormList from '@/components/mk-form-list/index.vue' import MkWorkspaceDropdown from '@/components/mk-workspace-dropdown/index.vue' import MkWorkspaceRelationTags from '@/components/mk-workspace-relation-tags/index.vue' ``` @@ -396,6 +399,39 @@ const paginationConfig = ref({ ## 手动导入组件 +### MkFormList + +用于多个业务字段组成的动态表单行,只负责重复行布局、添加和删除,不管理业务字段、校验规则或 +选项请求。通过 `v-model` 传入行数据,`defaultItem` 创建新行,列表始终至少保留一行。默认插槽 +提供 `item`、`index`,业务组件在插槽中继续声明 +`el-form-item`、字段路径和校验规则。 + +```vue + + + + + +``` + +`addText` 设置添加按钮文案。删除按钮及第一行与后续行的对齐由组件统一处理。 + ### MkSearchList 组合搜索框和占满剩余空间的滚动列表。传入 `data` 时,组件默认按 `name` 过滤并按 diff --git a/ui/src/components/mk-form-list/index.vue b/ui/src/components/mk-form-list/index.vue new file mode 100644 index 00000000000..a023b249475 --- /dev/null +++ b/ui/src/components/mk-form-list/index.vue @@ -0,0 +1,43 @@ + + + diff --git a/ui/src/styles/element-plus.scss b/ui/src/styles/element-plus.scss index 81fbd55bbba..ecbcb241938 100644 --- a/ui/src/styles/element-plus.scss +++ b/ui/src/styles/element-plus.scss @@ -566,6 +566,7 @@ /* select */ .el-select { + --el-select-disabled-border: var(--el-border-color); &__caret { color: var(--el-text-color-regular); font-size: 16px; @@ -576,6 +577,12 @@ &__wrapper { padding: 4px 12px; line-height: 22px; + &.is-disabled { + background-color: var(--mk-N200); + .el-select__caret { + color: var(--el-text-color-disabled); + } + } } &__input { height: 22px; diff --git a/ui/src/views/VIEW_README.md b/ui/src/views/VIEW_README.md index 19713bbb665..51106ca4e41 100644 --- a/ui/src/views/VIEW_README.md +++ b/ui/src/views/VIEW_README.md @@ -58,8 +58,7 @@ src/views/system/identity/users/ ├── UserListView.vue # 用户列表路由页面 ├── UserFromDrawer.vue # 用户表单抽屉 ├── components/ -│ ├── UserGroupSetting.vue # 用户组与工作空间异步联动设置 -│ └── UserRoleSetting.vue # 用户角色设置子组件 +│ └── UserGroupSetting.vue # 用户组与工作空间异步联动设置 └── dialog/ ├── BatchSetUserRoleDialog.vue # 批量设置用户角色弹窗 └── UserPwdDialog.vue # 修改用户密码弹窗 @@ -72,7 +71,7 @@ src/views/system/identity/users/ | 路由页面 | `XxxView.vue` | `WorkspaceListView.vue` | | 抽屉 | `XxxDrawer.vue` | `AddMemberDrawer.vue` | | 弹窗 | `XxxDialog.vue` | `CreateOrUpdateWorkspaceDialog.vue` | -| 页面普通组件 | 按具体业务职责使用 `PascalCase.vue` | `MemberRoleSetting.vue` | +| 页面普通组件 | 按具体业务职责使用 `PascalCase.vue` | `UserGroupSetting.vue` | 不要使用缺少组件职责后缀的页面文件名,也不要把 Dialog 命名为 Drawer 或把 Drawer 命名为 Dialog。新增或重命名文件时,应同步更新所有导入和页面功能登记。 diff --git a/ui/src/views/system/identity/roles/AddMemberDrawer.vue b/ui/src/views/system/identity/roles/AddMemberDrawer.vue index 6d1d2e13959..bb2537b1e41 100644 --- a/ui/src/views/system/identity/roles/AddMemberDrawer.vue +++ b/ui/src/views/system/identity/roles/AddMemberDrawer.vue @@ -13,7 +13,7 @@ import { } from '@/api/types' import { useStore } from '@/stores' import { MsgSuccess } from '@/utils/message' -import MemberWorkspaceSetting from './components/MemberWorkspaceSetting.vue' +import MkFormList from '@/components/mk-form-list/index.vue' defineOptions({ name: 'AddRoleMemberDrawer' }) @@ -115,15 +115,82 @@ defineExpose({ open })