From 520fd74d2b4f89d6b80cac28d1b5f4dc4870fb99 Mon Sep 17 00:00:00 2001 From: icssoa <615206459@qq.com> Date: Tue, 13 Jun 2023 02:14:01 +0800 Subject: [PATCH] =?UTF-8?q?cl-form=20=E6=B7=BB=E5=8A=A0=20children=20?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/crud.code-snippets | 5 + package.json | 2 +- packages/crud/index.d.ts | 13 + packages/crud/src/components/form/helper.tsx | 4 +- packages/crud/src/components/form/index.tsx | 263 ++++++++++-------- packages/crud/src/components/index.tsx | 2 + packages/crud/src/components/table/index.tsx | 4 +- packages/crud/src/components/upsert/index.tsx | 4 +- packages/crud/src/demo/t2.vue | 8 +- packages/crud/src/demo/test.vue | 2 +- packages/crud/src/demo/upsert.vue | 41 ++- packages/crud/src/utils/vnode.tsx | 7 +- 12 files changed, 221 insertions(+), 134 deletions(-) diff --git a/.vscode/crud.code-snippets b/.vscode/crud.code-snippets index 94fba1a..02e5fab 100644 --- a/.vscode/crud.code-snippets +++ b/.vscode/crud.code-snippets @@ -58,6 +58,11 @@ " app.refresh();", " }", ");", + "", + "// 刷新", + "function refresh(params?: any) {", + " Crud.value?.refresh(params);", + "}", "", "" ], diff --git a/package.json b/package.json index 25c8306..5a84e34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "front-next", - "version": "6.3.1", + "version": "6.3.2", "scripts": { "dev": "vite --host", "build": "vite build", diff --git a/packages/crud/index.d.ts b/packages/crud/index.d.ts index 8fb2a77..0685e6f 100644 --- a/packages/crud/index.d.ts +++ b/packages/crud/index.d.ts @@ -429,6 +429,18 @@ declare namespace ClForm { size?: "medium" | "default" | "small"; [key: string]: any; }; + col?: { + span: number; + offset: number; + push: number; + pull: number; + xs: any; + sm: any; + md: any; + lg: any; + xl: any; + tag: string; + }; hook?: Hook.Form; group?: string; collapse?: boolean; @@ -443,6 +455,7 @@ declare namespace ClForm { append?: Render.Component; rules?: Rule | Rule[]; required?: boolean; + children?: Item[]; [key: string]: any; } diff --git a/packages/crud/src/components/form/helper.tsx b/packages/crud/src/components/form/helper.tsx index e391843..7e2bbc4 100644 --- a/packages/crud/src/components/form/helper.tsx +++ b/packages/crud/src/components/form/helper.tsx @@ -138,7 +138,7 @@ export function useTabs({ config, Form }: { config: Config; Form: Form }) { } // 切换 - function change(value: any, isValid: boolean = true) { + function change(value: any, isValid = true) { return new Promise((resolve: Function, reject: Function) => { function next() { active.value = value; @@ -146,7 +146,7 @@ export function useTabs({ config, Form }: { config: Config; Form: Form }) { } if (isValid) { - let isError: boolean = false; + let isError = false; const arr = config.items .filter((e: any) => e.group == active.value && !e._hidden && e.prop) diff --git a/packages/crud/src/components/form/index.tsx b/packages/crud/src/components/form/index.tsx index 4b69712..765d8b3 100644 --- a/packages/crud/src/components/form/index.tsx +++ b/packages/crud/src/components/form/index.tsx @@ -274,35 +274,44 @@ export default defineComponent({ // 设置表单数据 config.items.map((e) => { - if (e.prop) { - // 解析 prop - if (e.prop.includes(".")) { - e.prop = e.prop.replace(/\./g, "-"); + function deep(e: ClForm.Item) { + if (e.prop) { + // 解析 prop + if (e.prop.includes(".")) { + e.prop = e.prop.replace(/\./g, "-"); + } + + // prop 合并 + Tabs.mergeProp(e); + + // 绑定值 + formHook.bind({ + ...e, + value: form[e.prop] !== undefined ? form[e.prop] : cloneDeep(e.value), + form + }); + + // 表单验证 + if (e.required) { + e.rules = { + required: true, + message: `${e.label}不能为空` + }; + } + + // 子集 + if (e.children) { + e.children.forEach(deep); + } } - // prop 合并 - Tabs.mergeProp(e); - - // 绑定值 - formHook.bind({ - ...e, - value: form[e.prop] !== undefined ? form[e.prop] : cloneDeep(e.value), - form - }); - - // 表单验证 - if (e.required) { - e.rules = { - required: true, - message: `${e.label}不能为空` - }; + // 设置 tabs 默认值 + if (e.type == "tabs") { + Tabs.set(e.value); } } - // 设置 tabs 默认值 - if (e.type == "tabs") { - Tabs.set(e.value); - } + deep(e); }); // 设置默认值 @@ -337,113 +346,131 @@ export default defineComponent({ Object.assign(form, data); } - // 渲染表单及表单项 - function renderForm() { + // 渲染表单项 + function renderFormItem(e: ClForm.Item) { const { isDisabled } = config._data; - // 表单项列表 - const children = config.items.map((e) => { - if (e.type == "tabs") { - return ; - } + if (e.type == "tabs") { + return ; + } - // 是否隐藏 - e._hidden = parseFormHidden(e.hidden, { - scope: form - }); + // 是否隐藏 + e._hidden = parseFormHidden(e.hidden, { + scope: form + }); - // 分组显示 - const inGroup = - isEmpty(Tabs.active.value) || isEmpty(e.group) - ? true - : e.group === Tabs.active.value; + // 分组显示 + const inGroup = + isEmpty(Tabs.active.value) || isEmpty(e.group) + ? true + : e.group === Tabs.active.value; + + // 表单项 + const FormItem = e.component + ? h( + , + e.props, + { + label() { + return e.renderLabel + ? renderNode(e.renderLabel, { + scope: form, + render: "slot", + slots + }) + : e.label; + }, + default() { + return ( +
+
+ {["prepend", "component", "append"] + .filter((k) => e[k]) + .map((name) => { + const children = e.children && ( +
+ + {e.children.map(renderFormItem)} + +
+ ); + + const Item = renderNode(e[name], { + item: e, + prop: e.prop, + scope: form, + slots, + children, + _data: { + isDisabled + } + }); - // 表单项 - const FormItem = e.component - ? h( - , - e.props, - { - label() { - return e.renderLabel - ? renderNode(e.renderLabel, { - scope: form, - render: "slot", - slots - }) - : e.label; - }, - default() { - return ( -
-
- {["prepend", "component", "append"].map((name) => { return ( - e[name] && ( -
- {renderNode(e[name], { - item: e, - prop: e.prop, - scope: form, - slots, - _data: { - isDisabled - } - })} -
- ) +
+ {Item} +
); })} -
- - {isBoolean(e.collapse) && ( -
{ - Action.collapseItem(e); - }}> - - {e.collapse ? "查看更多" : "隐藏内容"} - -
- )}
- ); - } + + {isBoolean(e.collapse) && ( +
{ + Action.collapseItem(e); + }}> + + {e.collapse ? "查看更多" : "隐藏内容"} + +
+ )} +
+ ); } - ) - : null; + } + ) + : null; - // 隐藏 - if (e._hidden) { - return null; - } + // 隐藏 + if (e._hidden) { + return null; + } - // 行内 - if (props.inline) { - return FormItem; - } + // 行内 + if (props.inline) { + return FormItem; + } - return ( - - {FormItem} - - ); - }); + return ( + + {FormItem} + + ); + } + + // 渲染表单 + function renderForm() { + // 表单项列表 + const children = config.items.map(renderFormItem); return (
diff --git a/packages/crud/src/components/index.tsx b/packages/crud/src/components/index.tsx index 0ea6746..44c702d 100644 --- a/packages/crud/src/components/index.tsx +++ b/packages/crud/src/components/index.tsx @@ -6,6 +6,7 @@ import AdvSearch from "./adv/search"; import Flex from "./flex1"; import Form from "./form"; import FormTabs from "./form-tabs"; +import FormCard from "./form-card"; import MultiDeleteBtn from "./multi-delete-btn"; import Pagination from "./pagination"; import Query from "./query"; @@ -27,6 +28,7 @@ export const components: { [key: string]: any } = { Flex, Form, FormTabs, + FormCard, MultiDeleteBtn, Pagination, Query, diff --git a/packages/crud/src/components/table/index.tsx b/packages/crud/src/components/table/index.tsx index 0996474..37f5aa5 100644 --- a/packages/crud/src/components/table/index.tsx +++ b/packages/crud/src/components/table/index.tsx @@ -6,8 +6,6 @@ import { mergeConfig } from "../../utils"; export default defineComponent({ name: "cl-table", - emits: ["selection-change", "sort-change"], - props: { // 列配置 columns: { @@ -39,6 +37,8 @@ export default defineComponent({ } }, + emits: ["selection-change", "sort-change"], + setup(props, { emit, expose }) { const { crud } = useCore(); const { getValue, style } = useTools(); diff --git a/packages/crud/src/components/upsert/index.tsx b/packages/crud/src/components/upsert/index.tsx index 0b8dd8e..5f075d0 100644 --- a/packages/crud/src/components/upsert/index.tsx +++ b/packages/crud/src/components/upsert/index.tsx @@ -7,8 +7,6 @@ import { mergeConfig } from "../../utils"; export default defineComponent({ name: "cl-upsert", - emits: ["opened", "closed"], - props: { // 表单项 items: { @@ -37,6 +35,8 @@ export default defineComponent({ onSubmit: Function }, + emits: ["opened", "closed"], + setup(props, { slots, expose }) { const { crud } = useCore(); diff --git a/packages/crud/src/demo/t2.vue b/packages/crud/src/demo/t2.vue index 33e1b82..70721c2 100644 --- a/packages/crud/src/demo/t2.vue +++ b/packages/crud/src/demo/t2.vue @@ -1,7 +1,7 @@