From e4497e33c758ae460e303aa0433c0d00e6d60b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A5=9E=E4=BB=99=E9=83=BD=E6=B2=A1=E7=94=A8?= <615206459@qq.com> Date: Fri, 3 Jan 2025 13:42:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/crud/index.d.ts | 48 ++++++++-------- packages/crud/src/App.vue | 34 ++++++++++- packages/crud/src/components/adv/search.tsx | 56 +++++++++++++------ packages/crud/src/components/crud/helper.ts | 8 ++- packages/crud/src/components/search/index.tsx | 13 ++++- packages/crud/src/utils/form-hook.ts | 4 +- packages/crud/src/utils/vnode.tsx | 2 +- .../base/pages/main/components/process.vue | 11 ++-- src/modules/base/store/process.ts | 10 ++++ 9 files changed, 132 insertions(+), 54 deletions(-) diff --git a/packages/crud/index.d.ts b/packages/crud/index.d.ts index 612733b..21ec9c2 100644 --- a/packages/crud/index.d.ts +++ b/packages/crud/index.d.ts @@ -289,6 +289,7 @@ declare namespace ClCrud { set(key: "dict" | "style" | "service" | "permission", value: any): void; done(): void; getParams(): obj; + setParams(data: obj): void; getPermission(key?: string): boolean; rowInfo(data: obj): void; rowAdd(): void; @@ -462,25 +463,27 @@ declare namespace ClForm { [key: string]: any; } - type HookFn = ( - value: any, - options: { form: obj; prop: string; method: "submit" | "bind" } - ) => any; - - type HookKey = - | "number" - | "string" - | "split" - | "join" - | "boolean" - | "booleanNumber" - | "datetimeRange" - | "splitJoin" - | "json" - | "empty" - | AnyString; - - type HookPipe = HookKey | HookFn; + interface Hook { + Fn: (value: any, options: { form: obj; prop: string; method: "submit" | "bind" }) => any; + Key: + | "number" + | "string" + | "split" + | "join" + | "boolean" + | "booleanNumber" + | "datetimeRange" + | "splitJoin" + | "json" + | "empty" + | AnyString; + Pipe: Hook["Key"] | Hook["Fn"]; + Event: { + bind?: Hook["Pipe"] | Hook["Pipe"][]; + submit?: Hook["Pipe"] | Hook["Pipe"][]; + reset?: (prop: string) => string[]; + }; + } interface Item { type?: "tabs"; @@ -516,12 +519,7 @@ declare namespace ClForm { label?: string; renderLabel?: any; flex?: boolean; - hook?: - | HookKey - | { - bind?: HookPipe | HookPipe[]; - submit?: HookPipe | HookPipe[]; - }; + hook?: Hook["Event"] | Hook["Key"]; hidden?: boolean | ((options: { scope: obj }) => boolean); prepend?: Render.Component; component?: Render.Component; diff --git a/packages/crud/src/App.vue b/packages/crud/src/App.vue index 96bc070..0d31e13 100644 --- a/packages/crud/src/App.vue +++ b/packages/crud/src/App.vue @@ -3,6 +3,10 @@
CRUD DEMO v7
+ + @@ -40,7 +44,7 @@ diff --git a/packages/crud/src/components/adv/search.tsx b/packages/crud/src/components/adv/search.tsx index 2f49a1c..fbba44a 100644 --- a/packages/crud/src/components/adv/search.tsx +++ b/packages/crud/src/components/adv/search.tsx @@ -3,6 +3,7 @@ import { Close } from "@element-plus/icons-vue"; import { useBrowser, useConfig, useCore } from "../../hooks"; import { renderNode } from "../../utils/vnode"; import { useApi } from "../form/helper"; +import { isArray } from "lodash-es"; export default defineComponent({ name: "cl-adv-search", @@ -58,7 +59,7 @@ export default defineComponent({ function open() { visible.value = true; - nextTick(function () { + nextTick(() => { Form.value?.open({ items: config.items || [], op: { @@ -76,9 +77,30 @@ export default defineComponent({ // 重置数据 function reset() { + const d: any = {}; + + config.items?.map((e) => { + if (typeof e.hook != 'string' && e.hook?.reset) { + const props = e.hook.reset(e.prop!) + + if (isArray(props)) { + props.forEach((prop) => { + d[prop] = undefined; + }) + } + } + + d[e.prop!] = undefined; + }); + + // 重置表单 Form.value?.reset(); - emit("reset"); + + // 列表刷新 search(); + + // 重置事件 + emit("reset", d); } // 清空数据 @@ -88,24 +110,22 @@ export default defineComponent({ } // 搜素请求 - function search() { - Form.value?.submit((data) => { - function next(params: any) { - Form.value?.done(); - close(); + function search(params?: any) { + function next(data: any) { + Form.value?.done(); + close(); - return crud.refresh({ - ...params, - page: 1 - }); - } + return crud.refresh({ + ...data, + page: 1 + }); + } - if (config.onSearch) { - config.onSearch(data, { next, close }); - } else { - next(data); - } - }); + if (config.onSearch) { + config.onSearch(params, { next, close }); + } else { + next(params); + } } // 消息事件 diff --git a/packages/crud/src/components/crud/helper.ts b/packages/crud/src/components/crud/helper.ts index 6ebcca8..ea25316 100644 --- a/packages/crud/src/components/crud/helper.ts +++ b/packages/crud/src/components/crud/helper.ts @@ -220,6 +220,11 @@ export function useHelper({ config, crud, mitt }: Options) { return crud.params; } + // 替换请求参数 + function setParams(data: obj) { + merge(crud.params, data); + } + // 设置 function set(key: string, value: any) { if (!value) { @@ -276,6 +281,7 @@ export function useHelper({ config, crud, mitt }: Options) { refresh, getPermission, paramsReplace, - getParams + getParams, + setParams }; } diff --git a/packages/crud/src/components/search/index.tsx b/packages/crud/src/components/search/index.tsx index 7a56356..8db3d95 100644 --- a/packages/crud/src/components/search/index.tsx +++ b/packages/crud/src/components/search/index.tsx @@ -14,6 +14,7 @@ import { import { useApi } from "../form/helper"; import { Search, Refresh, Bottom, Top } from "@element-plus/icons-vue"; import { mitt } from "../../utils/mitt"; +import { isArray, isObject, isString } from "lodash-es"; export default defineComponent({ name: "cl-search", @@ -121,6 +122,16 @@ export default defineComponent({ const d: any = {}; config.items?.map((e) => { + if (typeof e.hook != 'string' && e.hook?.reset) { + const props = e.hook.reset(e.prop!) + + if (isArray(props)) { + props.forEach((prop) => { + d[prop] = undefined; + }) + } + } + d[e.prop!] = undefined; }); @@ -128,7 +139,7 @@ export default defineComponent({ Form.value?.reset(); // 列表刷新 - crud.refresh(d); + search(d); // 重置事件 emit("reset", d); diff --git a/packages/crud/src/utils/form-hook.ts b/packages/crud/src/utils/form-hook.ts index e4f41a0..df30051 100644 --- a/packages/crud/src/utils/form-hook.ts +++ b/packages/crud/src/utils/form-hook.ts @@ -1,6 +1,6 @@ import { isArray, isEmpty, isFunction, isObject, isString } from "lodash-es"; -export const format: { [key: string]: ClForm.HookFn } = { +export const format: { [key: string]: ClForm.Hook["Fn"] } = { number(value) { return value ? (isArray(value) ? value.map(Number) : Number(value)) : value; }, @@ -142,7 +142,7 @@ const formHook = { } }; -export function registerFormHook(name: string, fn: ClForm.HookFn) { +export function registerFormHook(name: string, fn: ClForm.Hook["Fn"]) { format[name] = fn; } diff --git a/packages/crud/src/utils/vnode.tsx b/packages/crud/src/utils/vnode.tsx index 3fce638..144f689 100644 --- a/packages/crud/src/utils/vnode.tsx +++ b/packages/crud/src/utils/vnode.tsx @@ -139,7 +139,7 @@ export function renderNode(vnode: any, options: Options) { if (placeholder) { if (!item.component.props.placeholder) { - item.component.props.placeholder = placeholder + item.label; + item.component.props.placeholder = placeholder + (item.label || ''); } } } diff --git a/src/modules/base/pages/main/components/process.vue b/src/modules/base/pages/main/components/process.vue index a1bb5bb..22a15b4 100644 --- a/src/modules/base/pages/main/components/process.vue +++ b/src/modules/base/pages/main/components/process.vue @@ -121,26 +121,29 @@ function openCM(e: any, item: Process.Item) { list: [ { label: '关闭当前', - hidden: item.fullPath !== route.path, + hidden: item.path !== route.path, callback(done) { - onDel(process.list.findIndex(e => e.fullPath == item.fullPath)); done(); + + process.close(); toPath(); } }, { label: '关闭其他', callback(done) { - process.set(process.list.filter(e => e.fullPath == item.fullPath)); done(); + + process.set(process.list.filter(e => e.fullPath == item.fullPath)); toPath(); } }, { label: '关闭所有', callback(done) { - process.clear(); done(); + + process.clear(); toPath(); } } diff --git a/src/modules/base/store/process.ts b/src/modules/base/store/process.ts index b8325c9..c5e7c01 100644 --- a/src/modules/base/store/process.ts +++ b/src/modules/base/store/process.ts @@ -26,6 +26,15 @@ export const useProcessStore = defineStore('process', function () { } } + // 关闭当前 + function close() { + const index = list.value.findIndex(e => e.active); + + if (index > -1) { + list.value.splice(index, 1); + } + } + // 移除 function remove(index: number) { list.value.splice(index, 1); @@ -54,6 +63,7 @@ export const useProcessStore = defineStore('process', function () { list, add, remove, + close, set, clear, setTitle