guava-ui 0.2.9 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"guava-ui.umd.js","sources":["../packages/bridge/index.ts","../packages/GvBacktop/src/GvBacktop.vue","../packages/GvBacktop/index.ts","../packages/GvBadge/src/GvBadge.vue","../packages/GvBadge/index.ts","../packages/utils/index.ts","../packages/GvIcon/src/GvIcon.vue","../packages/GvIcon/index.ts","../packages/utils/gv.tree.ts","../packages/GvBreadCrumb/src/helper.ts","../packages/GvBreadCrumb/src/GvBreadCrumb.vue","../packages/GvBreadCrumb/index.ts","../packages/GvPopconfirm/src/GvPopconfirm.vue","../packages/GvPopconfirm/index.ts","../packages/hooks/web/useStorage.ts","../packages/utils/gv.notify.ts","../packages/GvButton/src/GvButton.vue","../packages/GvButton/index.ts","../packages/GvCard/src/GvCard.vue","../packages/GvCard/index.ts","../packages/GvCascader/src/GvCascader.vue","../packages/GvCascader/index.ts","../packages/GvCheckbox/src/GvCheckbox.vue","../packages/GvCheckbox/index.ts","../packages/GvCheckboxButton/src/GvCheckboxButton.vue","../packages/GvCheckboxButton/index.ts","../packages/GvCheckboxGroup/src/GvCheckboxGroup.vue","../packages/GvCheckboxGroup/index.ts","../packages/GvCol/src/GvCol.vue","../packages/GvCol/index.ts","../packages/GvDatePicker/src/datetime.ts","../packages/GvDatePicker/src/shortcuts.ts","../packages/GvDatePicker/src/GvDatePicker.vue","../packages/GvDatePicker/index.ts","../packages/GvDialog/src/drag.ts","../packages/GvDialog/src/GvDialog.vue","../packages/GvDialog/index.ts","../packages/GvDivider/src/GvDivider.vue","../packages/GvDivider/index.ts","../packages/GvDrawer/src/GvDrawer.vue","../packages/GvDrawer/index.ts","../packages/utils/gv.propTypes.ts","../packages/hooks/web/usePinyin.ts","../packages/GvExpandMenu/src/GvMenuList.vue","../packages/GvExpandMenu/src/GvExpandMenu.vue","../packages/GvExpandMenu/index.ts","../packages/GvInput/src/GvInput.vue","../packages/GvInput/index.ts","../packages/GvInputNumber/src/GvInputNumber.vue","../packages/GvInputNumber/index.ts","../packages/GvSelect/src/GvSelect.vue","../packages/GvSelect/index.ts","../packages/GvSwitch/src/GvSwitch.vue","../packages/GvSwitch/index.ts","../packages/GvTimePicker/src/GvTimePicker.vue","../packages/GvTimePicker/index.ts","../packages/utils/gv.infomsg.ts","../packages/utils/gv.validate.ts","../packages/GvForm/src/GvForm.vue","../packages/GvForm/index.ts","../packages/GvHamburger/src/GvHamburger.vue","../packages/GvHamburger/index.ts","../packages/GvLangSelect/src/GvLangSelect.vue","../packages/GvLangSelect/index.ts","../packages/GvPopover/src/GvPopover.vue","../packages/GvPopover/index.ts","../packages/GvRadio/src/GvRadio.vue","../packages/GvRadio/index.ts","../packages/GvRadioButton/src/GvRadioButton.vue","../packages/GvRadioButton/index.ts","../packages/GvRadioGroup/src/GvRadioGroup.vue","../packages/GvRadioGroup/index.ts","../packages/GvRow/src/GvRow.vue","../packages/GvRow/index.ts","../packages/GvScreenFull/src/GvScreenFull.vue","../packages/GvScreenFull/index.ts","../packages/GvSearchBar/src/GvSearchBar.vue","../packages/GvSearchBar/index.ts","../packages/GvSidebar/src/helper.ts","../packages/GvSidebar/src/components/useRenderMenuTitle.tsx","../packages/GvSidebar/src/components/useRenderMenuItem.tsx","../packages/GvSidebar/src/GvSidebar.vue","../packages/GvSidebar/index.ts","../src/assets/imgs/logo.png","../packages/GvSidebarLogo/src/GvSidebarLogo.vue","../packages/GvSidebarLogo/index.ts","../packages/GvTableBar/src/GvTableBar.vue","../packages/GvTag/src/GvTag.vue","../packages/utils/gv.table.ts","../packages/utils/gv.crud.ts","../packages/GvTable/src/GvTable.vue","../packages/GvTable/index.ts","../packages/GvTabPane/src/GvTabPane.vue","../packages/GvTabPane/index.ts","../packages/GvTabs/src/GvTabs.vue","../packages/GvTabs/index.ts","../packages/GvTag/index.ts","../packages/GvTagsView/src/GvTagsView.vue","../packages/GvTagsView/index.ts","../packages/GvTheme/src/GvTheme.vue","../packages/GvTheme/index.ts","../packages/GvTree/src/GvTree.vue","../packages/GvTree/index.ts","../packages/utils/gv.secret.ts","../packages/index.ts"],"sourcesContent":["// bridge/index.ts\nimport type { Router } from 'vue-router';\nimport type { Pinia } from 'pinia';\nimport type { Composer } from 'vue-i18n';\n\ninterface GlobalBridgeContext {\n router?: Router;\n i18n?: Composer;\n store?: Pinia;\n}\nconst globalBridgeKey = '__LIB_BRIDGE_CONTEXT__';\nconst getBridge = (): GlobalBridgeContext => {\n const g = globalThis as any;\n if (!g[globalBridgeKey]) g[globalBridgeKey] = {};\n\n return g[globalBridgeKey];\n};\nconst context: GlobalBridgeContext = {};\n\n// export function setBridgeContext(options: GlobalBridgeContext) {\n// if (options.router) context.router = options.router;\n// if (options.i18n) context.i18n = options.i18n;\n// if (options.pinia) context.pinia = options.pinia;\n// }\nexport const setBridgeContext = (ctx: GlobalBridgeContext) => {\n // console.log('setBridgeContext', ctx);\n Object.assign(getBridge(), ctx);\n};\n\nexport function useBridgeRouter(): Router {\n const router = getBridge().router;\n if (!router) throw new Error('[Bridge] router not set');\n return router;\n}\n// export function useBridgeRouter(): Router {\n// if (!context.router) throw new Error('[Bridge] Router is not injected');\n// return context.router;\n// }\n\nexport function useBridgeI18n(): Composer {\n const i18n = getBridge().i18n;\n if (!i18n) throw new Error('[Bridge] I18n is not injected');\n return i18n;\n}\n\n// export function useBridgeI18n(): Composer {\n// if (!context.i18n) throw new Error('[Bridge] I18n is not injected');\n// return context.i18n;\n// }\n\nexport function useBridgePinia(): Pinia {\n if (!context.store) throw new Error('[Bridge] Pinia is not injected');\n return context.store;\n}\n","<!--\n * @title: backtop\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:24:46\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-05-22 09:26:44\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { ElBacktop } from 'element-plus';\n import { useStyle } from '@/hook/web/useStyle';\n\n // --- define name and inheritAttrs ---\n defineOptions({\n name: 'GvBacktop', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n const { getPrefixCls, variables } = useStyle();\n\n const prefixCls = getPrefixCls('backtop');\n</script>\n\n<template>\n <ElBacktop\n :class=\"prefixCls\"\n :target=\"`.${variables.namespace}-layout-content-scrollbar .${variables.elNamespace}-scrollbar__wrap`\" />\n</template>\n","import type { App } from 'vue';\nimport GvBacktop from './src/GvBacktop.vue';\n// Define the install method on the GvButton component\nconst GvBacktopPlugin = {\n install(app: App): void {\n app.component(GvBacktop.name ?? 'GvBacktop', GvBacktop);\n },\n};\nexport default GvBacktopPlugin;\n\nexport { GvBacktop };\n","<!--\n * @title: badge component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 10:37:36\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 15:14:46\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElBadge } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n import type { TBadgeType } from './types/index';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('badge');\n\n export default defineComponent({\n name: 'GvBadge',\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [Number, String] as PropType<number | string>,\n default: '',\n },\n max: {\n type: Number,\n default: 10,\n },\n isDot: {\n type: Boolean,\n default: false,\n },\n hidden: {\n type: Boolean,\n default: false,\n },\n showZero: {\n type: Boolean,\n default: false,\n },\n color: {\n type: String,\n default: '',\n },\n type: {\n type: String as PropType<TBadgeType>,\n default: 'warning',\n },\n },\n\n setup(props, { slots }) {\n // @render\n return () => (\n <ElBadge\n value={props.value}\n max={props.max}\n type={props.type}\n hidden={props.hidden}\n isDot={props.isDot}\n showZero={props.showZero}\n color={props.color}\n class={prefixCls}>\n {slots.default?.()}\n </ElBadge>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-badge';\n .#{$prefixCls} {\n margin-top: 5px;\n margin-right: 25px;\n\n :deep(.el-badge__content) {\n height: 20px;\n line-height: 18px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvBadge from './src/GvBadge.vue';\n\nconst GvBadgePlugin = {\n install(app: App): void {\n app.component(GvBadge.name ?? 'GvBadge', GvBadge);\n },\n};\nexport default GvBadgePlugin;\n\nexport { GvBadge };\n","/*\n * @title: common utility func\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-02-27 13:25:29\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 15:00:33\n * @version: 1.0.6\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n// ------ is utils ------\nconst toString = Object.prototype.toString;\nexport const is = (val: unknown, type: string) => toString.call(val) === `[object ${type}]`;\n\nexport const isExternal = (path: string): boolean => /^(https?:|mailto:|tel:)/.test(path);\nexport const isString = (val: unknown): val is string => is(val, 'String');\nexport const isArray = (val: any): val is any[] => val && Array.isArray(val);\nexport const isError = (e: unknown): e is Error => typeof e === 'object' && e !== null && 'message' in e;\nexport const isObject = (val: any): val is Record<any, any> => val !== null && is(val, 'Object');\nexport const isDate = (val: unknown): val is Date => is(val, 'Date');\nexport const isNumber = (val: unknown): val is number => is(val, 'Number');\nexport const isBoolean = (val: unknown): val is boolean => is(val, 'Boolean');\nexport const isFunction = (val: unknown): val is (...args: any[]) => any => typeof val === 'function';\nexport const isElement = (val: unknown): val is Element => isObject(val) && !!val.tagName;\nexport const isMap = (val: unknown): val is Map<any, any> => is(val, 'Map');\nexport const isImgPath = (path: string): boolean => /(https?:\\/\\/|data:image\\/).*?\\.(png|jpg|jpeg|gif|svg|webp|ico)/gi.test(path);\nexport const isDark = (): boolean => window.matchMedia('(prefers-color-scheme: dark)').matches;\nexport const isNull = (val: unknown): val is null => val === null;\n\nexport const isEmpty = <T = unknown>(val: T): val is T => {\n if (isNull(val)) return true;\n if (val === undefined) return true;\n if (val === 'null') return true;\n if (isArray(val) || isString(val)) return val.length === 0;\n if (val instanceof Map || val instanceof Set) return val.size === 0;\n if (isObject(val)) return Object.keys(val).length === 0;\n return false;\n};\n\n/**\n * @todo: deep equal (plain object / array / date), functions compare by reference\n */\nexport const isEqual = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a === null || b === null || a === undefined || b === undefined) return false;\n if (typeof a !== typeof b) return false;\n if (isFunction(a) || isFunction(b)) return a === b;\n if (isDate(a) && isDate(b)) return a.getTime() === b.getTime();\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!isEqual(a[i], b[i])) return false;\n\n return true;\n }\n if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n if (!isEqual(a[key], b[key])) return false;\n }\n return true;\n }\n return false;\n};\n\nexport const isUrl = (path: string): boolean => {\n try {\n new URL(path);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * @todo: set html lang attr\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-24 10:37:13\n * @param {LocaleType} locale\n */\nexport const setHtmlAttrByLang = (locale: LocaleType): void => {\n document.querySelector('html')?.setAttribute('lang', locale);\n};\n\n/**\n * @todo: sleep async function\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 12:01:37\n * @param {*} timeLen\n */\nexport const sleep = async (timeLen: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, timeLen));\n/**\n * @todo: underline to camel case\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:21:09\n * @param {*} name\n */\nexport const toHump = (name: string): string => {\n if (!name) return '';\n // eslint-disable-next-line no-useless-escape\n return name.replace(/\\_(\\w)/g, function (all, letter) {\n return letter.toUpperCase();\n });\n};\n\n/**\n * @todo: camel case to underline\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:21:50\n * @param {*} name\n */\nexport const toLine = (name: string): string => name.replace(/([A-Z])/g, '_$1').toLowerCase();\n\n/**\n * 设置css style\n * @param prop\n * @param val\n * @param dom\n */\nexport const setDomCssProp = (prop: string, val: any, dom = document.documentElement): void => {\n dom.style.setProperty(prop, val);\n};\n\n/**\n * get css style\n * @param prop\n * @param dom\n * @returns\n */\nexport const getDomCssProp = (prop: string, dom = document.documentElement): string => getComputedStyle(dom).getPropertyValue(prop);\n\n/**\n * join icon class\n * @param icon\n * @returns\n */\nexport const joinIcon = function (icon) {\n let joinIcons = '';\n if (icon)\n if (icon.includes('el-icon')) joinIcons = icon;\n else if (icon.includes('gv-icon')) joinIcons = `iconfont ${icon}`;\n return joinIcons;\n};\n\n/**\n * Check if an element has a class\n * @param {HTMLElement} ele\n * @param {string} cls\n * @returns {boolean}\n */\nexport const hasClass = (ele: HTMLElement, cls: string): boolean => !!ele.className.match(new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)'));\n\n/**\n * Add class to element\n * @param {HTMLElement} ele\n * @param {string} cls\n */\nexport const addClass = (ele: HTMLElement, cls: string) => {\n if (!hasClass(ele, cls)) ele.className += ' ' + cls;\n};\n\n/**\n * Remove class from element\n * @param {HTMLElement} ele s s\n * @param {string} cls\n */\nexport const removeClass = (ele: HTMLElement, cls: string): void => {\n if (hasClass(ele, cls)) {\n const reg = new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)');\n ele.className = ele.className.replace(reg, ' ');\n }\n};\n\n/**\n * @todo: html tag has scrollbar\n * @param {*} tag\n */\nexport const hasScrollbar = (tag: any) => tag.scrollHeight > (tag.innerHeight || tag.clientHeight);\n\n/**\n * date format settings\n */\nexport const dateFormatConfig = {\n date: {\n placeholder: '选择日期', // yyyy-mm-dd\n valueFormat: 'YYYY-MM-DD',\n dateFormat: 'YYYY-MM-DD',\n },\n exactdate: {\n placeholder: '选择日期', // yyyy-mm-dd\n valueFormat: 'YYYY-MM-dd HH:mm:ss',\n dateFormat: 'YYYY-MM-DD',\n },\n datetime: {\n placeholder: '选择时间', // yyyy-mm-dd hh:mm\n valueFormat: 'YYYY-MM-DD HH:mm',\n dateFormat: 'YYYY-MM-DD HH:mm',\n },\n week: {\n placeholder: '选择周',\n dateFormat: 'YYYY 第 WW 周',\n },\n month: {\n placeholder: '选择月份', // yyyy-mm\n valueFormat: 'YYYY-MM',\n dateFormat: 'YYYY-MM',\n },\n year: {\n placeholder: '选择年份', // yyyy\n valueFormat: 'YYYY',\n dateFormat: 'YYYY',\n },\n};\n\n/**\n * @todo: 防抖函数(一段时间内只响应最后一次操作,如:input框连续输入)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:58:21\n * @param {*} func\n * @param {*} wait\n * @param {*} immediate\n */\nexport const debounce = (func: Fn, wait = 100, immediate = false) => {\n let timeout: ReturnType<typeof setTimeout> | null;\n let arg: any[];\n let context: any;\n let timestamp: number;\n let result: ReturnType<Fn>;\n const later = function () {\n // 据上一次触发时间间隔\n const last = +new Date() - timestamp;\n // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait\n if (last < wait && last > 0) timeout = setTimeout(later, wait - last);\n else {\n timeout = null;\n // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用\n if (!immediate) {\n result = func.apply(context, arg);\n if (!timeout) context = arg = null as any;\n }\n }\n };\n return function (this: any, ...args) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n context = this;\n // fixme: 解决防抖函数无法传参的问题 2022-04-19\n arg = args;\n timestamp = +new Date();\n const callNow = immediate && !timeout;\n // 如果延时不存在,重新设定延时\n if (!timeout) timeout = setTimeout(later, wait);\n if (callNow) {\n result = func.apply(context, arg);\n context = arg = null as any;\n }\n\n return result;\n };\n};\n\n/**\n * @todo: get vnode text\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 13:49:54\n * @param {VNode} vnode\n */\nexport const getVNodeText = (vnode: any): string => {\n if (!vnode) return '';\n // 1. 字符串\n if (typeof vnode === 'string') return vnode;\n // 2. 数字\n if (typeof vnode === 'number') return String(vnode);\n // 3. children 为字符串\n if (typeof vnode.children === 'string') return vnode.children.trim();\n // 4. children 为数组\n if (Array.isArray(vnode.children)) return vnode.children.map((item) => getVNodeText(item)).join('');\n // 5. slots(ElButton / 组件)\n if (vnode.children && typeof vnode.children === 'object') {\n const slots = vnode.children as Record<string, any>;\n // default slot\n if (typeof slots.default === 'function') {\n const slotNodes = slots.default();\n return slotNodes.map((item: any) => getVNodeText(item)).join('');\n }\n }\n\n return '';\n};\n\n/**\n * @todo: get vnode name\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 17:24:24\n * @param {any} vnode\n */\nexport const getVNodeName = (vnode: any): string => {\n if (!vnode) return '';\n return typeof vnode.type === 'object' && vnode.type !== null && 'name' in vnode.type ? vnode.type.name : '';\n};\n\n/**\n * @todo: 去除金额格式化方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-24 14:14:55\n * @param {*} val\n */\nexport const removeAmountFormat = (val: string): string => {\n if (val) return val.replace(/,/g, '');\n else return '0.00';\n};\n\n// when val is 0.00, change it as 0 format\nfunction zeroFormat(val: string): string {\n if (val === '0.00') return '0';\n else return val;\n}\n\nfunction numberFormat(pattern, val) {\n const oldVal = val;\n if (val < 0) val = -val;\n const _nfPattern = '[0#]+[,]?[0#]*(\\\\.[0#]+)?';\n if (!pattern || !new RegExp(_nfPattern, 'g').test(pattern)) return '0.00';\n\n if (!isNumber((val + '').replace('.', ''))) return '0.00';\n\n const strAry = pattern.match(new RegExp(_nfPattern, 'g'));\n const p1 = strAry[0].indexOf('.');\n if (p1 > 0) {\n const len = strAry[0].length - p1 - 1;\n val = Math.round(val * Math.pow(10, len)) / Math.pow(10, len);\n } else val = Math.round(val);\n\n val = val + '';\n const p2 = val.indexOf('.');\n let ret = '';\n if (p1 > 0) {\n for (let i = p1 + 1; i < strAry[0].length; i++) {\n const ch = p2 > 0 && p2 + i - p1 < val.length ? val.charAt(p2 + i - p1) : '';\n if (strAry[0].charAt(i) === '0') ret = ret + (ch === '' ? '0' : ch);\n else ret = ret + (ch === '' ? '' : ch);\n }\n ret = ret === '' ? '' : '.' + ret;\n }\n const p3 = strAry[0].indexOf(',');\n if (p3 > 0) {\n const len = p1 > 0 ? p1 - p3 - 1 : strAry[0].length - p3 - 1;\n const len2 = p2 > 0 ? p2 - 1 : val.length - 1;\n for (let i = len2; i >= 0; i--) ret = ((len2 - i + 1) % len === 0 ? ',' : '') + val.charAt(i) + ret;\n\n ret = ret.charAt(0) === ',' ? ret.substring(1, ret.length) : ret;\n } else ret = val.substring(0, p2 > 0 ? p2 : val.length) + ret;\n\n if (oldVal < 0) ret = '-' + ret;\n\n return pattern.replace(strAry[0], ret);\n}\n\n/**\n * @todo: 千位符转换\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-24 09:22:56\n * @param {*} val\n * @param {*} decimal 小数位数\n */\nexport const amountFormat = (val: string | number, decimal = 2): string => {\n let v = val + '';\n if (v === null || v === 'null' || v === '0' || v === undefined || v === 'undefined') return '0.00';\n if (v.indexOf(',') > 0) v = removeAmountFormat(v);\n let pattern = '#,###.';\n let decimalPattern = '00';\n if (decimal) decimalPattern = decimalPattern.padStart(decimal, '0');\n pattern = pattern + decimalPattern;\n return zeroFormat(numberFormat(pattern, v));\n};\n\n/**\n * @todo: set quick keys\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:38:53\n * @param {*} ev\n */\nexport const setQuickKeys = (ev) => {\n if (ev && ev.key)\n if (ev.key.toLowerCase() === 'q' && ev.ctrlKey === true) {\n // 绑定ctr + q\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-search__bar>.gv-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-edit__bar .gv-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 'r' && ev.ctrlKey === true) {\n // 绑定crt + r\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-form .gv-search__bar>.gv-button.reset') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') if (btnHtml.getAttribute('refform')) btnHtml.click();\n } else if (ev.key.toLowerCase() === 'e' && ev.ctrlKey === true) {\n // 绑定crt + e\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-form .gv-search__bar>.gv-button.shrink') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-form .gv-search__bar>.gv-button.expand') as HTMLElement;\n if (btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 's' && ev.ctrlKey === true) {\n // 绑定crt + s\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-drawer__popup .gv-drawer .gv-drawer__footer>.gv-drawer__footer--inner .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-edit__bar .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 'n' && ev.ctrlKey === true) {\n // 绑定crt + n\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-table__container .gv-table__bar .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-edit__bar .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === '=' && ev.ctrlKey === true) {\n // 绑定crt + '='\n ev.preventDefault();\n ev.stopPropagation();\n const inputHtml = document.body.querySelector('.main-container .gv-container .gv-table__container .gv-table__search .gv-table__search-input > .el-input__inner') as HTMLElement;\n if (inputHtml) inputHtml.focus();\n } else if (ev.key === 'Escape') {\n // 绑定esc关闭弹窗\n ev.preventDefault();\n ev.stopPropagation();\n const messageConfirmHtml = document.documentElement.querySelector('body>.el-message-box__wrapper') as HTMLElement;\n if (messageConfirmHtml && messageConfirmHtml.style.display !== 'none') {\n const bodyButtonHtml = messageConfirmHtml.querySelector('.el-message-box .el-message-box__btns button') as HTMLElement;\n bodyButtonHtml.click();\n } else {\n const bodyDialogHtml = document.documentElement.querySelector('body>.gv-dialog') as HTMLElement;\n if (bodyDialogHtml && bodyDialogHtml.style.display !== 'none') {\n const bodyButtonHtml = bodyDialogHtml.querySelector('.el-dialog__header button') as HTMLElement;\n bodyButtonHtml.click();\n } else {\n const dialogArr = document.body.querySelectorAll('.main-container .gv-container .gv-dialog__popup .gv-dialog') as NodeListOf<HTMLElement>;\n if (dialogArr)\n for (let i = 0; i < dialogArr.length; i++)\n if (dialogArr[i].style.display !== 'none') {\n const buttonHtml = dialogArr[i].querySelector('.el-dialog__header button') as HTMLElement;\n if (buttonHtml && buttonHtml.style.display !== 'none') {\n buttonHtml.click();\n return;\n }\n }\n\n const buttonDHtml = document.body.querySelector('.main-container .gv-container .gv-drawer__popup .gv-drawer .el-drawer__header button') as HTMLElement;\n if (buttonDHtml && buttonDHtml.style.display !== 'none') buttonDHtml.click();\n }\n }\n }\n};\n\nexport const pathResolve = (parentPath: string, path: string) => {\n if (isUrl(path)) return path;\n const childPath = path.startsWith('/') || !path ? path : `/${path}`;\n return `${parentPath}${childPath}`.replace(/\\/\\//g, '/').trim();\n};\n","<!--\n * @title: svg icon component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-01 17:02:13\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 10:50:13\n * @version: 1.0.8\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { isExternal } from '@@/utils';\n import * as Icons from '@element-plus/icons-vue';\n import { ElIcon } from 'element-plus';\n import { computed, useAttrs, type DefineComponent } from 'vue';\n const { variables } = useStyle();\n const preNameSpace = variables.namespace;\n const attrs = useAttrs();\n // --- define name and inheritAttrs ---\n defineOptions({\n name: 'GvIcon', // 定义组件名称\n inheritAttrs: false, // 默认继承属性\n });\n // --- transfer props and define default values ---\n const props = withDefaults(\n defineProps<{\n iconType?: string;\n iconName: string;\n className?: string;\n icon?: DefineComponent; // element-plus icon component\n size?: string; // 图标的font-size,单位是px\n }>(),\n {\n iconType: '', // svg | iconfont | el\n className: '',\n },\n );\n // @computed\n const isLocal = computed(() => isExternal(props.iconName));\n const iconType = computed(() => {\n if (props.iconType === 'svg') return 'svg';\n else if (props.iconType === 'iconfont') return 'iconfont';\n else if (props.iconType === 'el') return 'el';\n else if (props.iconType === '')\n if (props.iconName.startsWith('el-icon')) return 'el';\n else if (props.iconName.startsWith('gv-')) return 'iconfont';\n else return 'svg';\n else return 'svg';\n });\n const iconName = computed(() => {\n if (iconType.value === 'svg') return `#${preNameSpace}-icon-${props.iconName}`;\n else if (iconType.value === 'iconfont') return 'iconfont ' + props.iconName;\n else if (iconType.value === 'el') return props.iconName;\n else return `#${props.iconName}`;\n });\n\n // @method\n const svgClass = computed(() => {\n if (iconType.value === 'svg') return props.className ? 'svg-icon ' + props.className : 'svg-icon';\n else return props.className;\n });\n const styleExternalIcon = computed(() => ({\n mask: `url(${props.iconName}) no-repeat 50% 50%`,\n '-webkit-mask': `url(${props.iconName}) no-repeat 50% 50%`,\n }));\n\n /**\n * @todo: get element-plus icon component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:18:16\n * @param {*} computed\n */\n const iconComponent = computed(() => {\n // console.log(iconType.value);\n // console.log(props.iconName);\n if (iconType.value !== 'el') return null;\n const name = props.iconName;\n let compName = '';\n if (name.startsWith('el-icon')) {\n compName = name.replace('el-icon-', '');\n compName = compName.charAt(0).toUpperCase() + compName.slice(1);\n } else compName = name.charAt(0).toUpperCase() + name.slice(1);\n\n return Icons[compName as keyof typeof Icons];\n });\n</script>\n<template>\n <div\n v-if=\"isLocal\"\n :style=\"styleExternalIcon\"\n class=\"svg-external-icon svg-icon\"\n v-bind=\"attrs\"></div>\n <svg\n v-else-if=\"iconType === 'svg'\"\n :class=\"svgClass\"\n aria-hidden=\"true\"\n v-bind=\"attrs\">\n <use :href=\"iconName\" />\n </svg>\n <i\n v-else-if=\"iconType === 'iconfont'\"\n :class=\"[iconName, svgClass]\"\n v-bind=\"attrs\">\n </i>\n <ElIcon\n v-else-if=\"iconComponent\"\n :class=\"svgClass\">\n <component :is=\"iconComponent\" />\n </ElIcon>\n <svg\n v-else\n :class=\"svgClass\"\n :style=\"{ 'font-size': size + 'px' }\"\n aria-hidden=\"true\"\n v-bind=\"attrs\">\n <use :xlink:href=\"iconName\" />\n </svg>\n</template>\n\n<style lang=\"scss\" scoped>\n .svg-icon {\n width: 1em;\n height: 1em;\n overflow: hidden;\n vertical-align: -0.15em;\n fill: currentcolor;\n }\n\n .svg-external-icon {\n display: inline-block;\n background-color: currentcolor;\n mask-size: cover !important;\n }\n</style>\n","import type { App } from 'vue';\nimport GvIcon from './src/GvIcon.vue';\nconst GvIconPlugin = {\n install(app: App): void {\n app.component(GvIcon.name ?? 'GvIcon', GvIcon);\n },\n};\nexport default GvIconPlugin;\n\nexport { GvIcon };\n","interface TreeHelperConfig {\n id: string;\n children: string;\n pid: string;\n}\nconst DEFAULT_CONFIG: TreeHelperConfig = {\n id: 'id',\n children: 'children',\n pid: 'pid',\n};\nconst getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config);\n// tree from list\nexport const listToTree = <T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] => {\n const conf = getConfig(config) as TreeHelperConfig;\n const nodeMap = new Map();\n const result: T[] = [];\n const { id, children, pid } = conf;\n\n for (const node of list) {\n node[children] = node[children] || [];\n nodeMap.set(node[id], node);\n }\n for (const node of list) {\n const parent = nodeMap.get(node[pid]);\n (parent ? parent.children : result).push(node);\n }\n return result;\n};\n\nexport const treeToList = <T = any>(tree: any, config: Partial<TreeHelperConfig> = {}): T => {\n config = getConfig(config);\n const { children } = config;\n const result: any = [...tree];\n for (let i = 0; i < result.length; i++) {\n if (!result[i][children!]) continue;\n result.splice(i + 1, 0, ...result[i][children!]);\n }\n return result;\n};\n\nexport const findNode = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | null => {\n config = getConfig(config);\n const { children } = config;\n const list = [...tree];\n for (const node of list) {\n if (func(node)) return node;\n node[children!] && list.push(...node[children!]);\n }\n return null;\n};\n\nexport const findNodeAll = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T[] => {\n config = getConfig(config);\n const { children } = config;\n const list = [...tree];\n const result: T[] = [];\n for (const node of list) {\n func(node) && result.push(node);\n node[children!] && list.push(...node[children!]);\n }\n return result;\n};\n\nexport const findPath = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | T[] | null => {\n config = getConfig(config);\n const path: T[] = [];\n const list = [...tree];\n const visitedSet = new Set();\n const { children } = config;\n while (list.length) {\n const node = list[0];\n if (visitedSet.has(node)) {\n path.pop();\n list.shift();\n } else {\n visitedSet.add(node);\n node[children!] && list.unshift(...node[children!]);\n path.push(node);\n if (func(node)) return path;\n }\n }\n return null;\n};\n\nexport const findPathAll = (tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}) => {\n config = getConfig(config);\n const path: any[] = [];\n const list = [...tree];\n const result: any[] = [];\n const visitedSet = new Set();\n const { children } = config;\n while (list.length) {\n const node = list[0];\n if (visitedSet.has(node)) {\n path.pop();\n list.shift();\n } else {\n visitedSet.add(node);\n node[children!] && list.unshift(...node[children!]);\n path.push(node);\n func(node) && result.push([...path]);\n }\n }\n return result;\n};\n\nexport const filter = <T = any>(tree: T[], func: (n: T) => boolean, config: Partial<TreeHelperConfig> = {}): T[] => {\n config = getConfig(config);\n const children = config.children as string;\n function listFilter(list: T[]) {\n return list\n .map((node: any) => ({ ...node }))\n .filter((node) => {\n node[children] = node[children] && listFilter(node[children]);\n return func(node) || (node[children] && node[children].length);\n });\n }\n return listFilter(tree);\n};\n\nexport const forEach = <T = any>(tree: T[], func: (n: T) => any, config: Partial<TreeHelperConfig> = {}): void => {\n config = getConfig(config);\n const list: any[] = [...tree];\n const { children } = config;\n for (let i = 0; i < list.length; i++) {\n // func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿\n if (func(list[i])) return;\n\n children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]);\n }\n};\n/**\n * @description: Extract tree specified structure\n */\nexport const treeMapEach = (data: any, { children = 'children', conversion }: { children?: string; conversion: Fn }) => {\n const haveChildren = Array.isArray(data[children]) && data[children].length > 0;\n const conversionData = conversion(data) || {};\n if (haveChildren)\n return {\n ...conversionData,\n [children]: data[children].map((i: number) =>\n treeMapEach(i, {\n children,\n conversion,\n }),\n ),\n };\n else\n return {\n ...conversionData,\n };\n};\n/**\n * @description: Extract tree specified structure\n */\nexport const treeMap = <T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] => treeData.map((item) => treeMapEach(item, opt));\n\n/**\n * 递归遍历树结构\n * @param treeDatas 树\n * @param callBack 回调\n * @param parentNode 父节点\n */\nexport const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => {\n treeDatas.forEach((element) => {\n const newNode = callBack(element, parentNode) || element;\n if (element.children) eachTree(element.children, callBack, newNode);\n });\n};\n","/*\n * @title: breadcrumb helper func\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 12:55:48\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-01-30 12:12:40\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { pathResolve } from '../../utils/index';\n\nexport const filterBreadcrumb = (routes: AppRouteRecordRaw[], parentPath = ''): AppRouteRecordRaw[] => {\n const res: AppRouteRecordRaw[] = [];\n\n for (const route of routes) {\n const meta = route?.meta;\n if (route.name !== 'Root' && meta?.hidden && !meta.canTo) continue;\n\n const data: AppRouteRecordRaw = !meta?.alwaysShow && route.children?.length === 1 ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) } : { ...route };\n\n data.path = pathResolve(parentPath, data.path);\n\n if (data.children) data.children = filterBreadcrumb(data.children, data.path);\n\n if (data) res.push(data);\n }\n return res;\n};\n","<!--\n * @title: breadcrumb \n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:13:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-06 14:28:48\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { useBridgeI18n } from '@@/bridge';\n import { ElBreadcrumb, ElBreadcrumbItem } from 'element-plus';\n import { computed, defineComponent, ref, TransitionGroup, unref, watch } from 'vue';\n import { useRouter } from 'vue-router';\n import { GvIcon } from '../../GvIcon';\n import { filter, treeToList } from '../../utils/gv.tree';\n import { filterBreadcrumb } from './helper';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('breadcrumb');\n\n export default defineComponent({\n name: 'GvBreadCrumb',\n setup() {\n const appStore = useAppStore();\n const permStore = usePermsStore();\n // if you want to use the icon in breadcrumb, you can set it in appStore\n const showBreadcrumbIcon = computed(() => appStore.getShowBreadcrumbIcon);\n const { currentRoute } = useRouter();\n\n const { t } = useBridgeI18n();\n\n const levelList = ref<AppRouteRecordRaw[]>([]);\n const menuRouters = computed(() => {\n const routers = permStore.getRouters;\n return filterBreadcrumb(routers);\n });\n\n const getBreadcrumb = () => {\n const currentPath = currentRoute.value.matched.slice(-1)[0].path;\n levelList.value = filter<AppRouteRecordRaw>(unref(menuRouters), (node: AppRouteRecordRaw) => node.path === currentPath);\n };\n\n const renderBreadcrumb = () => {\n const breadcrumbList = treeToList<AppRouteRecordRaw[]>(unref(levelList));\n return breadcrumbList.map((v) => {\n const disabled = !v.redirect || v.redirect === 'noredirect';\n const meta = v.meta;\n return (\n <ElBreadcrumbItem\n to={{ path: disabled ? '' : v.path }}\n key={v.name}>\n {meta?.icon && showBreadcrumbIcon.value ? (\n <>\n <GvIcon\n iconType=\"iconfont\"\n iconName={meta.icon}\n className=\"text-[13px]\"></GvIcon>{' '}\n {t(v?.meta?.title || '')}\n </>\n ) : (\n t(v?.meta?.title || '')\n )}\n </ElBreadcrumbItem>\n );\n });\n };\n // @watch\n watch(\n () => currentRoute.value.path,\n (path) => {\n if (path.startsWith('/redirect/')) return;\n\n getBreadcrumb();\n },\n {\n immediate: true,\n },\n );\n // @created\n\n // @render\n return () => (\n <ElBreadcrumb\n separator=\"/\"\n class={`${prefixCls} flex items-center h-full ml-[10px]`}>\n <TransitionGroup\n appear\n enter-active-class=\"animate__animated animate__fadeInRight\">\n {renderBreadcrumb()}\n </TransitionGroup>\n </ElBreadcrumb>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-breadcrumb';\n .#{$prefixCls} {\n user-select: none;\n :deep(.el-breadcrumb__item) {\n display: flex;\n .el-breadcrumb__inner {\n display: flex;\n align-items: center;\n color: #afb3b9;\n cursor: text;\n //color: var(--top-header-text-color);\n //&:hover {\n // color: var(--el-color-primary);\n //}\n &.is-link {\n font-weight: 500;\n }\n }\n .iconfont {\n //font-size: $textSizeSecondary;\n }\n }\n :deep(.el-breadcrumb__item):last-child {\n .el-breadcrumb__inner:hover {\n color: #afb3b9;\n cursor: text;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvBreadCrumb from './src/GvBreadCrumb.vue';\nconst GvBreadCrumbPlugin = {\n install(app: App): void {\n app.component(GvBreadCrumb.name ?? 'GvBreadCrumb', GvBreadCrumb);\n },\n};\nexport default GvBreadCrumbPlugin;\n\nexport { GvBreadCrumb };\n","<!--\n * @title: popconfirm component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 16:43:20\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-22 16:32:45\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElPopconfirm } from 'element-plus';\n import { defineComponent, getCurrentInstance } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('popconfirm');\n\n export default defineComponent({\n name: 'GvPopconfirm',\n props: {\n title: {\n type: String,\n default: '',\n },\n },\n\n emits: ['confirm'],\n\n setup(props, { emit, slots }) {\n const instance = getCurrentInstance();\n\n const handleConfirm = (event: MouseEvent) => {\n emit('confirm', event, instance);\n };\n\n return () => (\n <ElPopconfirm\n title={props.title}\n onConfirm={handleConfirm}\n class={prefixCls}>\n {{\n reference: () => slots.reference?.(),\n }}\n </ElPopconfirm>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-popconfirm';\n .#{$prefixCls} {\n display: inline-block;\n }\n</style>\n","import type { App } from 'vue';\nimport GvPopconfirm from './src/GvPopconfirm.vue';\n\nconst GvInputPlugin = {\n install(app: App): void {\n app.component(GvPopconfirm.name ?? 'GvPopconfirm', GvPopconfirm);\n },\n};\nexport default GvInputPlugin;\n\nexport { GvPopconfirm };\n","/*\n * @title: sessionStorage and localStorage hook\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-19 16:32:15\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-04-24 17:11:28\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n// 获取传入的值的类型\nconst getValueType = (value: any): string => {\n const type = Object.prototype.toString.call(value);\n return type.slice(8, -1);\n};\n\nexport const useStorage = (type: 'sessionStorage' | 'localStorage' = 'sessionStorage'): IWebStorage => {\n const setStorage = (key: string, value: any): void => {\n const valueType = getValueType(value);\n window[type].setItem(key, JSON.stringify({ type: valueType, value }));\n };\n\n const getStorage = (key: string): any => {\n const value = window[type].getItem(key);\n if (value) {\n const { value: val } = JSON.parse(value);\n return val;\n } else return value;\n };\n\n const removeStorage = (key: string): void => {\n window[type].removeItem(key);\n };\n\n const clear = (excludes?: string[]): void => {\n // 获取排除项\n const keys = Object.keys(window[type]);\n const defaultExcludes = ['dynamicRouter', 'serverDynamicRouter'];\n const excludesArr = excludes ? [...excludes, ...defaultExcludes] : defaultExcludes;\n const excludesKeys = excludesArr ? keys.filter((key) => !excludesArr.includes(key)) : keys;\n // 排除项不清除\n excludesKeys.forEach((key) => {\n window[type].removeItem(key);\n });\n // window[type].clear()\n };\n\n return {\n setStorage,\n getStorage,\n removeStorage,\n clear,\n };\n};\n","/*\n * @title: message alert confirm\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 11:47:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:50:11\n * @version: 1.0.6\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { useStorage } from '@@/hooks/web/useStorage';\nimport { ElMessage, ElMessageBox, ElNotification } from 'element-plus';\n// import { useLocaleStoreWithOut } from '@/store/modules/locale';\nimport { isError, sleep } from './index';\n// const localeStore = useLocaleStoreInstance();\n// const { lang } = localeStore.getCurrentLocale;\n\nconst notificationTime = 5000;\nconst notificationTimeError = 6000;\nconst messageTime = 2000;\nconst messageTimeError = 5000;\ninterface ConfirmOptions {\n title?: string;\n message: string;\n confirmButtonText?: string;\n cancelButtonText?: string;\n type?: 'success' | 'warning' | 'info' | 'error';\n showCancelButton?: boolean;\n}\n/**\n * @todo: Notification - MessageBox\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 13:48:24\n * @param {unknown} msg\n * @param {MessageType} type\n * @param {string} title\n */\ntype MessageType = 'success' | 'info' | 'warning' | 'error';\n\nexport const alert = async (msg: unknown, type: MessageType = 'success') => {\n const alertObj = document.body.querySelector('body>.el-notification');\n if (alertObj) alertObj.remove();\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n let promptMsg = '提示信息';\n if (lang === 'en') promptMsg = 'Hint';\n const duration = type === 'error' ? notificationTimeError : notificationTime;\n let m = 'No message...';\n if (isError(msg)) m = msg.message || 'No message...';\n else if (typeof msg === 'string' || typeof msg === 'number' || typeof msg === 'boolean') m = String(msg);\n else if (typeof msg === 'object') m = JSON.stringify(msg);\n\n ElNotification({\n title: promptMsg,\n message: m,\n type,\n duration: duration,\n });\n await sleep(duration);\n};\n/**\n * @todo: confirm - MessageBox\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 12:03:27\n * @param {*} msg\n * @param {*} type\n */\nexport const confirm = async (msg: string, type: MessageType = 'warning') => {\n if (document.body.querySelector('body>.el-confirm')) return;\n // 返回 Promise 对象\n let msgs: string;\n const showCancelButton = true;\n msgs = '是否确定此操作?';\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n let hint = '提示信息';\n let ok = '确定';\n let cancel = '取消';\n if (msg) msgs = msg;\n else if (lang === 'en') {\n msgs = 'Are you sure you want to proceed?';\n hint = 'Hint';\n ok = 'Ok';\n cancel = 'Cancel';\n }\n\n return new Promise((resolve, reject) => {\n ElMessageBox.confirm(msgs, hint, {\n confirmButtonText: ok,\n cancelButtonText: cancel,\n type,\n showCancelButton,\n } as ConfirmOptions)\n .then(() => {\n resolve(true);\n })\n .catch(() => {\n reject(false);\n });\n });\n};\n\nexport const message = async (msg: unknown, type: MessageType = 'warning', tableedit: boolean = false) => {\n if (tableedit === false) {\n const messageObj = document.body.querySelector('body>.el-message');\n // if (messageObj) messageObj.style.display = 'none';\n if (messageObj) return;\n const notifyObj = document.body.querySelector('body>.el-notification');\n if (notifyObj) return;\n }\n let m = 'No message...';\n if (isError(msg)) m = msg.message || 'No message...';\n else if (typeof msg === 'string' || typeof msg === 'number' || typeof msg === 'boolean') m = String(msg);\n else if (typeof msg === 'object') m = JSON.stringify(msg);\n const duration = type === 'error' ? messageTimeError : messageTime;\n ElMessage({\n message: m,\n showClose: true,\n type,\n duration: duration,\n });\n await sleep(duration);\n};\n","<!--\n * @title: button component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 16:43:34\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 16:16:19\n * @version: 1.1.0\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvIcon } from '@@/GvIcon';\n import { GvPopconfirm } from '@@/GvPopconfirm';\n import { getVNodeText } from '@@/utils';\n import { confirm } from '@@/utils/gv.notify';\n import { ElButton, useGlobalConfig, type ButtonType, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, getCurrentInstance, ref, unref, watch, type Component, type PropType } from 'vue';\n import { useRoute } from 'vue-router';\n import type { BizType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('button');\n\n export default defineComponent({\n name: 'GvButton',\n props: {\n visible: {\n type: Boolean,\n default: true,\n },\n text: {\n type: String,\n default: '',\n },\n otext: {\n type: String,\n default: '',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n type: {\n type: String as PropType<ButtonType>,\n default: 'default',\n },\n link: {\n type: Boolean,\n default: false,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: [Boolean, String] as PropType<boolean | string>,\n default: false,\n },\n refForm: {\n type: String,\n required: false,\n default: undefined,\n },\n icon: {\n // type: [String, Object] as PropType<string | DefineComponent>,\n type: String,\n default: '',\n },\n nativeType: {\n type: String,\n default: 'button',\n },\n bizType: {\n type: String as PropType<BizType>,\n default: undefined,\n },\n args: {\n type: String,\n default: undefined,\n },\n confirm: {\n type: [Boolean, String],\n default: false,\n },\n perms: {\n type: String,\n default: undefined,\n },\n cb: {\n type: Function as PropType<(args?: any) => void>,\n default: () => {},\n },\n },\n\n // @emits\n emits: ['click', 'confirm'],\n\n setup(props, { emit, slots }) {\n // @data\n // const attrs = useAttrs();\n const { t } = useBridgeI18n();\n const route = useRoute();\n const appStore = useAppStore();\n const instance = getCurrentInstance();\n const globalSize = useGlobalConfig('size');\n const buttonSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const buttonConfirm = computed(() => appStore.buttonConfirm);\n const loadings = ref(props.loading);\n const locked = ref(false);\n const isShow = ref(props.visible);\n const isIf = ref(true);\n\n // @computed\n const getSlots = computed(() => {\n if (props.text && props.otext) return props.text;\n else return slots.default?.();\n });\n\n // @watch\n watch(\n () => props.loading,\n (v) => (loadings.value = v),\n );\n watch(\n () => props.visible,\n (v) => (isShow.value = v),\n );\n\n // @method\n\n const invokeClick = async (e: MouseEvent) => {\n const raw = instance?.vnode?.props?.onClick as ((event: MouseEvent, args?: string) => unknown) | ((event: MouseEvent, args?: string) => unknown)[] | undefined;\n const handlers = raw ? (Array.isArray(raw) ? raw : [raw]) : [];\n if (handlers.length === 0) {\n emit('click', e, props.args);\n return;\n }\n for (const handler of handlers) await handler(e, props.args);\n };\n\n const withLoading = async (task: () => void | Promise<void>) => {\n if (props.loading) {\n await task();\n return;\n }\n loadings.value = true;\n try {\n await task();\n } finally {\n loadings.value = false;\n }\n };\n\n const setIconStyle = () => {\n if (!props.icon) return '';\n if (props.icon.startsWith('el-icon'))\n return (\n <GvIcon\n iconType=\"el\"\n iconName={props.icon.replace('el-icon-', '')}\n />\n );\n else if (props.icon.startsWith('iconfont') || props.icon.startsWith('gv-icon'))\n return (\n <GvIcon\n iconType=\"iconfont\"\n iconName={props.icon.replace('iconfont', '')}\n />\n );\n else return <GvIcon iconName={props.icon} />;\n // 父组件如果传递了图标组件,就使用图标组件,如果传递了ep图标名称,就使用ep图标名称\n // if (typeof props.icon === 'string')\n // return (\n // <GvIcon\n // iconName={props.icon}\n // className={props.icon}\n // />\n // );\n // else {\n // const Icons = props.icon;\n // return <Icons />;\n // }\n };\n\n const checkPerms = () => {\n if (route) {\n const meta = route.meta;\n if (meta) {\n const pm = meta.pm || '';\n if (pm) {\n let filter: string = props.text || '';\n if (props.otext) filter = props.otext;\n if (filter === '') {\n const slot = slots.default?.();\n if (slot && slot[0]) filter = getVNodeText(slot[0]) || '';\n }\n if (filter) {\n const pmArr = pm.split(',');\n const perms = pmArr.filter((x) => x.indexOf(filter) !== -1);\n if (perms.length > 0) {\n const p = perms[0];\n const arr = p.split('|');\n if (arr[0] !== ' ' && arr[1] && arr[1] === 'f') {\n isShow.value = false;\n isIf.value = false;\n }\n }\n }\n }\n }\n }\n };\n\n const handleClick = async (e: MouseEvent, type?: string) => {\n // 判断是否是reset\n if (props.bizType === 'reset') {\n let parent: any = instance?.parent; // form\n while (parent && parent.type?.name !== 'ElForm') parent = parent.parent;\n await parent.exposed.resetFields?.();\n\n while (parent && parent.type?.name !== 'GvForm') parent = parent.parent;\n const rootForm = parent;\n // console.log(rootForm);\n const originFormList = rootForm?.exposed.originFormList.value;\n const formList = rootForm?.props.formList;\n // console.log(parent.props.model.value);\n if (originFormList && Array.isArray(originFormList))\n originFormList.forEach((x: any, index: number) => {\n if (x.type === 'dic') formList[index]['filtercode'] = x.filtercode; // 重置字典的filtercode\n formList[index]['value'] = x.value;\n formList[index]['showLabel'] = x.showLabel;\n formList[index]['hidden'] = x.hidden;\n formList[index]['disabled'] = x.disabled;\n // 重置日期\n if (x.dateType === 'daterange2' || x.dateType === 'datetimerange2') {\n parent.props.model.value[x.field + '-start'] = undefined;\n parent.props.model.value[x.field + '-end'] = undefined;\n parent.props.model.value[x.field] = undefined;\n }\n });\n // 重置按钮自定义回调\n await props.cb?.(props.args);\n\n const rootEl = parent?.vnode.el as HTMLElement;\n // 重置日期\n const dateRangeSingles = rootEl?.querySelectorAll('.gv-daterange__single') as NodeListOf<HTMLElement>;\n if (dateRangeSingles)\n for (let i = 0; i < dateRangeSingles.length; i++) {\n const startInput = dateRangeSingles[i].querySelector('.gv-datepicker-range-start .el-input__inner') as HTMLInputElement | null;\n if (startInput) startInput.value = '';\n const endInput = dateRangeSingles[i].querySelector('.gv-datepicker-range-end .el-input__inner') as HTMLInputElement | null;\n if (endInput) endInput.value = '';\n }\n // update: 重置后执行查询方法 2022-04-17\n await withLoading(async () => {\n const searchBtn = parent?.vnode.el?.querySelector('.gv-search-bar .el-button--primary') as HTMLElement | undefined;\n searchBtn?.click();\n });\n return;\n } else if (props.bizType === 'import' || props.bizType === 'export') {\n emit('click', e, props.args);\n return;\n }\n\n await withLoading(async () => {\n if (type === 'confirm' && buttonConfirm.value === false)\n try {\n await confirm(t('common.confirmMsg'));\n } catch {\n return;\n }\n\n if (!locked.value) {\n locked.value = true;\n try {\n await invokeClick(e);\n } finally {\n locked.value = false;\n }\n }\n });\n };\n\n // @created\n\n // @mounted\n // onMounted(() => {\n // checkPerms();\n // });\n\n // @render\n /** ===== render 渲染 ===== */\n return () => {\n // validate btn perms\n checkPerms();\n\n const classz = props.bizType ? `${prefixCls} ${props.bizType}` : `${prefixCls}`;\n if (isIf.value) {\n let renderBtn: Component;\n if (props.confirm === 'true' || props.confirm === true)\n if (buttonConfirm.value === false)\n renderBtn = (\n <ElButton\n ref=\"gv-button\"\n style={{ display: isShow.value ? '' : 'none' }}\n data-ref-form={props.refForm}\n size={buttonSize.value}\n type={props.type !== 'text' ? props.type : undefined}\n link={props.link}\n loading={loadings.value}\n disabled={!!props.disabled}\n icon={setIconStyle()}\n native-type={props.nativeType}\n onClick={(e: MouseEvent) => handleClick(e, 'confirm')}\n class={classz}>\n {getSlots.value}\n </ElButton>\n );\n else\n renderBtn = (\n <GvPopconfirm\n title={t('common.confirmMsg')}\n onConfirm={(e: MouseEvent) => handleClick(e, 'confirm')}>\n {{\n reference: () => (\n <ElButton\n ref=\"gv-button\"\n style={{ display: isShow.value ? '' : 'none' }}\n data-ref-form={props.refForm}\n size={buttonSize.value}\n type={props.type !== 'text' ? props.type : undefined}\n link={props.link}\n loading={loadings.value}\n disabled={!!props.disabled}\n icon={setIconStyle()}\n native-type={props.nativeType}\n class={classz}>\n {getSlots.value}\n </ElButton>\n ),\n }}\n </GvPopconfirm>\n );\n else\n renderBtn = (\n <ElButton\n ref=\"gv-button\"\n style={{ display: isShow.value ? '' : 'none' }}\n data-ref-form={props.refForm}\n size={buttonSize.value}\n type={props.type !== 'text' ? props.type : undefined}\n link={props.link}\n loading={loadings.value}\n disabled={!!props.disabled}\n icon={setIconStyle()}\n native-type={props.nativeType}\n onClick={(e: MouseEvent) => handleClick(e)}\n class={classz}>\n {getSlots.value}\n </ElButton>\n );\n return renderBtn;\n } else return null;\n };\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-button';\n .#{$prefixCls} {\n :deep(i + span) {\n margin-left: 5px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvButton from './src/GvButton.vue';\n\nconst GvButtonPlugin = {\n install(app: App): void {\n app.component(GvButton.name ?? 'GvButton', GvButton);\n },\n};\nexport default GvButtonPlugin;\n\nexport { GvButton };\n","<!--\n * @title: card component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 09:39:53\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 15:18:37\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCard } from 'element-plus';\n import { defineComponent } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('card');\n\n export default defineComponent({\n name: 'GvCard',\n props: {},\n setup(_props, { slots }) {\n // @method\n /**\n *@todo: 设置header标题\n *@author: bugcao\n *@date: 2026-05-09 09:31:12\n *@version: v0.0.1\n */\n const getCardHeader = () => {\n if (slots.header?.()) return <div class=\"clearfix\">{slots.header?.()}</div>;\n else return null;\n };\n\n // @render\n return () => (\n <ElCard class={prefixCls}>\n {{\n header: () => getCardHeader(),\n default: () => slots.default?.(),\n }}\n </ElCard>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-card';\n .#{$prefixCls} {\n .clearfix::before,\n .clearfix::after {\n display: table;\n content: '';\n }\n .clearfix::after {\n clear: both;\n }\n :deep(.el-card__body) {\n padding: 10px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCard from './src/GvCard.vue';\n\nconst GvCardPlugin = {\n install(app: App): void {\n app.component(GvCard.name ?? 'GvCard', GvCard);\n },\n};\nexport default GvCardPlugin;\n\nexport { GvCard };\n","<!--\n * @title: cascader component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:32:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-03 14:20:07\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import { ElCascader, useGlobalConfig, type CascaderOption, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('cascader');\n\n export default defineComponent({\n name: 'GvCascader',\n props: {\n vref: {\n type: String,\n required: false,\n default: '',\n },\n name: {\n type: String,\n required: false,\n default: undefined,\n },\n id: {\n type: String,\n required: false,\n default: undefined,\n },\n value: {\n type: Array,\n required: false,\n default: () => [],\n },\n options: {\n type: Array as PropType<CascaderOption[]>,\n required: false,\n default: () => [],\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n placeholder: {\n type: String,\n required: false,\n default: 'All', // 请选择\n },\n disabled: {\n type: Boolean,\n required: false,\n default: false,\n },\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n clearable: {\n type: Boolean,\n required: false,\n default: true,\n },\n showAllLevels: {\n type: Boolean,\n required: false,\n default: true,\n },\n separator: {\n type: String,\n required: false,\n default: ' / ',\n },\n trigger: {\n type: String,\n required: false,\n default: 'hover',\n },\n filterable: {\n type: Boolean,\n required: false,\n default: true,\n },\n multiple: {\n type: Boolean,\n required: false,\n default: false,\n },\n lazy: {\n type: Boolean,\n required: false,\n default: false,\n },\n lazyLoad: {\n type: Function as PropType<(node: any, resolve: (data: any[]) => void, reject: () => void) => void>,\n required: false,\n default: () => {},\n },\n },\n // @emit\n emits: ['input', 'blur', 'focus', 'keydown', 'change'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useBridgeI18n();\n const sOps = props.options;\n const inputValue = ref(props.value);\n const globalSize = useGlobalConfig('size');\n\n // @computed\n const cascaderSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sPlaceHolder = computed(() => (props.placeholder ? props.placeholder : t('common.pleaseInput')));\n const getDisabled = computed(() => props.disabled);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n\n // 回调参数:(value: string | number)\n // const handleInput = (val) => {\n // emit('input', val);\n // };\n const handleChange = (val) => {\n emit('change', val);\n };\n const handleBlur = (event) => {\n emit('blur', event);\n };\n /**\n * @todo: 搜索\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-10-07 15:48:09\n * @param {*} node\n * @param {*} query\n */\n const handleFilterMethod = (node, query) => {\n // console.log(node);\n const path = node.path;\n const labels = node.pathLabels;\n const data = node.data;\n if (query) {\n if (path.join(',').indexOf(query) >= 0) return true;\n if (labels.join(',').indexOf(query) >= 0) return true;\n if (data.spell)\n if (data.spell.indexOf(query) >= 0) return true;\n else {\n const pathNodes = node.pathNodes;\n return pathNodes.some((x) => {\n if (x.data.spell && x.data.spell.indexOf(query) >= 0) return true;\n });\n }\n }\n };\n\n // @render\n return (\n <ElCascader\n ref={props.vref || 'gv-cascader'}\n id={resolvedInputId.value}\n {...(props.name ? { name: props.name } : {})}\n class={prefixCls}\n v-model={inputValue.value}\n style={{ display: props.value ? '' : 'none' }}\n size={cascaderSize.value}\n placeholder={sPlaceHolder.value}\n options={sOps}\n disabled={getDisabled.value}\n show-all-levels={props.showAllLevels}\n clearable={props.clearable}\n separator={props.separator}\n filterable={props.filterable}\n filter-method={handleFilterMethod}\n debounce={400}\n onBlur={handleBlur}\n onChange={handleChange}\n collapse-tags\n props={{\n expandTrigger: props.trigger as 'click' | 'hover',\n lazy: props.lazy,\n lazyLoad: props.lazyLoad,\n multiple: props.multiple,\n }}></ElCascader>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-cascader';\n .#{$prefixCls} {\n width: 100%;\n\n :deep(.el-input) {\n &.is-focus {\n .el-input__inner {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n .el-input__inner {\n height: 30px !important;\n line-height: 30px;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCascader from './src/GvCascader.vue';\nconst GvCascaderPlugin = {\n install(app: App): void {\n app.component(GvCascader.name ?? 'GvCascader', GvCascader);\n },\n};\nexport default GvCascaderPlugin;\n\nexport { GvCascader };\n","<!--\n * @title: checkbox component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 15:50:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:51:56\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCheckbox, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { TCheckboxValueType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('checkbox');\n\n export default defineComponent({\n name: 'GvCheckbox',\n\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [Boolean, String, Number] as PropType<TCheckboxValueType>,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n indeterminate: {\n type: Boolean,\n default: false,\n },\n label: {\n type: [String, Number, Boolean] as PropType<TCheckboxValueType>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n border: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n },\n\n // @emit\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n const globalSize = useGlobalConfig('size');\n const checkboxValue = ref(props.value);\n const checkboxSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n /** 同步外部值 */\n watch(\n () => props.value,\n (val) => {\n checkboxValue.value = val;\n },\n );\n\n // @method\n /** 更新值 */\n const handleUpdate = (val: TCheckboxValueType) => {\n checkboxValue.value = val;\n emit('update:modelValue', val);\n };\n /** change事件 */\n const handleChange = (val: TCheckboxValueType) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElCheckbox\n class={prefixCls}\n modelValue={checkboxValue.value}\n onUpdate:modelValue={handleUpdate}\n label={props.label}\n indeterminate={props.indeterminate}\n disabled={props.disabled}\n border={props.border}\n size={checkboxSize.value}\n style={{ display: props.visible ? '' : 'none' }}\n onChange={handleChange}>\n {slots.default?.()}\n </ElCheckbox>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-checkbox';\n .#{$prefixCls} {\n padding: 5px 0 5px 15px;\n //font-size: $appTextSize;\n\n :deep(.el-checkbox__input) {\n .el-checkbox__inner {\n &:hover {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-focus {\n .el-checkbox__inner {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-checked {\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n\n &:hover {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n\n :deep(.el-checkbox__input.is-checked + .el-checkbox__label) {\n color: var(--primaryColor, $primaryColor);\n }\n\n :deep(.el-checkbox__label) {\n //font-size: $appTextSize;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCheckbox from './src/GvCheckbox.vue';\n\nconst GvCheckboxPlugin = {\n install(app: App): void {\n app.component(GvCheckbox.name ?? 'GvCheckbox', GvCheckbox);\n },\n};\nexport default GvCheckboxPlugin;\n\nexport { GvCheckbox };\n","<!--\n * @title: checkbox button component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 16:41:13\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:52:18\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCheckboxButton, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TCheckboxButtonValue } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('checkbox-button');\n\n export default defineComponent({\n name: 'GvCheckboxButton',\n inheritAttrs: false,\n\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [String, Number, Boolean] as PropType<TCheckboxButtonValue>,\n default: undefined,\n },\n name: {\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n indeterminate: {\n type: Boolean,\n required: false,\n default: false,\n },\n label: {\n type: [String, Number, Boolean] as PropType<TCheckboxButtonValue>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n border: {\n type: Boolean,\n required: false,\n default: false,\n },\n size: {\n type: String as PropType<'large' | 'default' | 'small'>,\n default: 'default',\n },\n },\n\n // @emit\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n const globalSize = useGlobalConfig('size');\n /** 内部值 */\n const checkboxValue = ref(props.value);\n\n // @watch\n /** 同步外部值 */\n watch(\n () => props.value,\n (val) => {\n checkboxValue.value = val;\n },\n );\n\n // @computed\n /** checkbox尺寸 */\n const checkboxButtonSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @method\n /** 更新v-model */\n const handleUpdate = (val: TCheckboxButtonValue) => {\n checkboxValue.value = val;\n emit('update:modelValue', val);\n };\n\n // @render\n return () => (\n <ElCheckboxButton\n modelValue={checkboxValue.value}\n onUpdate:modelValue={handleUpdate}\n value={props.value}\n label={props.label}\n indeterminate={props.indeterminate}\n disabled={props.disabled}\n size={checkboxButtonSize.value}\n class={prefixCls}\n border={props.border}\n style={{ display: props.visible ? '' : 'none' }}>\n {slots.default?.()}\n </ElCheckboxButton>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-checkbox-button';\n .#{$prefixCls} {\n padding: 5px 0 5px 15px;\n //font-size: $appTextSize;\n\n :deep(.el-checkbox-button__inner) {\n //font-size: $appTextSize;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCheckboxButton from './src/GvCheckboxButton.vue';\n\nconst GvCheckboxButtonPlugin = {\n install(app: App): void {\n app.component(GvCheckboxButton.name ?? 'GvCheckboxButton', GvCheckboxButton);\n },\n};\nexport default GvCheckboxButtonPlugin;\n\nexport { GvCheckboxButton };\n","<!--\n * @title: checkbox group component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 16:08:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 15:26:16\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCheckboxGroup, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TCheckboxGroupType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('checkbox-group');\n\n export default defineComponent({\n name: 'GvCheckboxGroup',\n\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: Array as PropType<TCheckboxGroupType>,\n required: false,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n size: {\n type: String as PropType<'large' | 'default' | 'small'>,\n default: 'default',\n },\n min: {\n type: Number,\n default: undefined,\n },\n max: {\n type: Number,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n\n // @emit\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n const globalSize = useGlobalConfig('size');\n\n const checkboxValue = ref(props.value);\n\n // @computed\n const checkboxGroupSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n /** 同步外部值 */\n watch(\n () => props.value,\n (val) => {\n checkboxValue.value = val;\n },\n );\n\n // @method\n /** 更新 v-model */\n const handleUpdate = (val: TCheckboxGroupType) => {\n checkboxValue.value = val;\n emit('update:modelValue', val);\n };\n /** change事件 */\n const handleChange = (val: TCheckboxGroupType) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElCheckboxGroup\n modelValue={checkboxValue.value}\n onUpdate:modelValue={handleUpdate}\n size={checkboxGroupSize.value}\n aria-label={props.label}\n min={props.min}\n max={props.max}\n disabled={props.disabled}\n class={prefixCls}\n onChange={handleChange}>\n {slots.default?.()}\n </ElCheckboxGroup>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-checkbox-group';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvCheckboxGroup from './src/GvCheckboxGroup.vue';\n\nconst GvCheckboxGroupPlugin = {\n install(app: App): void {\n app.component(GvCheckboxGroup.name ?? 'GvCheckboxGroup', GvCheckboxGroup);\n },\n};\nexport default GvCheckboxGroupPlugin;\n\nexport { GvCheckboxGroup };\n","<!--\n * @title: col component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 10:00:33\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:24:29\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCol } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('col');\n\n export default defineComponent({\n name: 'GvCol',\n props: {\n span: {\n type: Number,\n default: 24,\n },\n offset: {\n type: Number,\n default: 0,\n },\n xs: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n sm: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n md: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n lg: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n xl: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n tag: {\n type: String,\n default: 'div',\n },\n visible: {\n type: Boolean,\n default: true,\n },\n },\n setup(props, { slots }) {\n // @render\n return () => (\n <ElCol\n ref=\"gv-col\"\n style={{ display: props.visible ? '' : 'none' }}\n xs={props.xs}\n sm={props.sm}\n md={props.md}\n lg={props.lg}\n xl={props.xl}\n span={props.span}\n offset={props.offset}\n tag={props.tag}\n class={prefixCls}>\n {slots.default?.()}\n </ElCol>\n );\n },\n });\n</script>\n","import type { App } from 'vue';\nimport GvCol from './src/GvCol.vue';\n\nconst GvColPlugin = {\n install(app: App): void {\n app.component(GvCol.name ?? 'GvCol', GvCol);\n },\n};\nexport default GvColPlugin;\n\nexport { GvCol };\n","/*\n * 日期工具函数(Vue3 + TS 重构版)\n */\n\nexport type LocaleType = 'zh' | 'en' | 'english';\n\nconst localLabels = {\n monthes: {\n english: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n en: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n zh: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n },\n weekdays: {\n english: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n en: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n zh: ['日', '一', '二', '三', '四', '五', '六'],\n },\n meridians: {\n english: ['a.m.', 'p.m.'],\n en: ['AM', 'PM'],\n zh: ['上午', '下午'],\n },\n dayagos: {\n english: ['Today', 'Yesterday', 'Tomorrow', ' days ago', ' days late'],\n en: ['Today', 'Yesterday', 'Tomorrow', ' days ago', ' days late'],\n zh: ['今天', '昨天', '明天', '天前', '天后'],\n },\n};\n\nexport const toMidnight = (date: Date): Date => {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return d;\n};\n\nexport const daysAgo = (date: Date, days = 0, midnight = false): Date => {\n const result = new Date(date.getTime() - days * 8.64e7);\n return midnight ? toMidnight(result) : result;\n};\n\nexport const monthBegin = (date: Date, offset = 0): Date => {\n const days = date.getDate() - 1 - offset;\n return daysAgo(date, days, true);\n};\n\nexport const quarterBegin = (date: Date): Date => {\n const month = date.getMonth() - (date.getMonth() % 3);\n return toMidnight(new Date(date.getFullYear(), month, 1));\n};\n\nexport const yearBegin = (date: Date): Date => toMidnight(new Date(date.getFullYear(), 0, 1));\n\nconst padZero = (value: string | number, len = 2): string => String(value).padStart(len, '0');\n\nexport const strftime = (date: Date, format?: string, local: LocaleType = 'zh'): string => {\n if (!format) {\n const str = new Date(date.getTime() + 2.88e7).toISOString();\n return str.substring(0, 16).replace('T', ' ');\n }\n\n const locale = local.startsWith('zh') ? 'zh' : 'en';\n\n format = format.replace('%F', '%Y-%m-%d');\n format = format.replace(/%D|%x/g, '%m/%d/%y');\n format = format.replace(/%T|%X/g, '%H:%M:%S');\n format = format.replace('%R', '%H:%M');\n\n return format.replace(/%[A-Za-z%]/g, (f) => {\n let ans: string | number = f;\n\n switch (f) {\n case '%%':\n ans = '%';\n break;\n\n case '%Y':\n ans = date.getFullYear();\n break;\n\n case '%y':\n ans = date.getFullYear() % 100;\n break;\n\n case '%m':\n ans = date.getMonth() + 1;\n break;\n\n case '%d':\n ans = date.getDate();\n break;\n\n case '%H':\n ans = date.getHours();\n break;\n\n case '%M':\n ans = date.getMinutes();\n break;\n\n case '%S':\n ans = date.getSeconds();\n break;\n\n case '%b':\n case '%B': {\n const key = f === '%B' && locale === 'en' ? 'english' : locale;\n ans = localLabels.monthes[key][date.getMonth()];\n break;\n }\n\n case '%a':\n case '%A': {\n const key = f === '%A' && locale === 'en' ? 'english' : locale;\n ans = localLabels.weekdays[key][date.getDay()];\n break;\n }\n\n default:\n break;\n }\n\n if (['%y', '%m', '%d', '%H', '%M', '%S'].includes(f)) return padZero(ans);\n\n return String(ans);\n });\n};\n\nexport const humanize = (date: Date, local: LocaleType = 'zh'): string => {\n const locale = local.startsWith('zh') ? 'zh' : 'en';\n\n const result = strftime(date, '', locale);\n\n const today = toMidnight(new Date()).getTime();\n const current = toMidnight(date).getTime();\n\n const days = (today - current) / 8.64e7;\n\n if (days <= -10 || days >= 10) return result;\n\n const labels = localLabels.dayagos[locale];\n\n let lbl = '';\n\n if (days === 0) lbl = labels[0];\n else if (days === 1) lbl = labels[1];\n else if (days === -1) lbl = labels[2];\n else if (days >= 2) lbl = `${days}${labels[3]}`;\n else lbl = `${Math.abs(days)}${labels[4]}`;\n\n return lbl + result.substring(10, 16);\n};\n","/*\n * @title: 日期组件左侧选择日期快捷键(非区间模式)\n * @author: bugcao@163.com\n * @Date: 2022-05-14 08:33:20\n * @LastEditors: bugcao@163.com\n * @LastEditTime: 2022-05-14 08:33:20\n * @version: 0.0.1\n * @copyright: copyright (c) 2022 bugcao\n */\nimport { daysAgo, monthBegin, quarterBegin, yearBegin } from './datetime';\n\nexport interface ShortcutItem {\n text: string;\n value: Date | [Date, Date] | (() => Date | [Date, Date]);\n}\n\nconst now = () => new Date();\n\n/** 单日期快捷选择 */\nexport const dateShortcuts: ShortcutItem[] = [\n {\n text: '今天',\n value: () => now(),\n },\n {\n text: '昨天',\n value: () => daysAgo(now(), 1),\n },\n {\n text: '最近一周',\n value: () => daysAgo(now(), 7),\n },\n {\n text: '最近30天',\n value: () => daysAgo(now(), 30),\n },\n {\n text: '本月开始',\n value: () => monthBegin(now()),\n },\n {\n text: '本季开始',\n value: () => quarterBegin(now()),\n },\n];\n\n/** 英文单日期快捷选择 */\nexport const dateShortcutsEn: ShortcutItem[] = [\n {\n text: 'Today',\n value: () => now(),\n },\n {\n text: 'Yesterday',\n value: () => daysAgo(now(), 1),\n },\n {\n text: 'Last week',\n value: () => daysAgo(now(), 7),\n },\n {\n text: 'Last 30 days',\n value: () => daysAgo(now(), 30),\n },\n {\n text: 'Month start',\n value: () => monthBegin(now()),\n },\n {\n text: 'Season Start',\n value: () => quarterBegin(now()),\n },\n];\n\n/** 日期时间快捷选择 */\nexport const dateTimeShortcuts = dateShortcuts.slice(0, 3);\n\nexport const dateTimeShortcutsEn = dateShortcutsEn.slice(0, 3);\n\n/** 日期范围快捷选择 */\nexport const dateRangeShortcuts: ShortcutItem[] = [\n {\n text: '最近一周',\n value: () => {\n const start = new Date(daysAgo(now(), 7).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '最近30天',\n value: () => {\n const start = new Date(daysAgo(now(), 30).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '本月至今',\n value: () => {\n const start = new Date(monthBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '本季至今',\n value: () => {\n const start = new Date(quarterBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '今年至今',\n value: () => [yearBegin(now()), now()],\n },\n {\n text: '最近六个月',\n value: () => {\n const end = now();\n const start = new Date();\n\n start.setMonth(start.getMonth() - 6);\n\n return [start, end];\n },\n },\n];\n\n/** 英文日期范围快捷选择 */\nexport const dateRangeShortcutsEn: ShortcutItem[] = [\n {\n text: 'Last week',\n value: () => {\n const start = new Date(daysAgo(now(), 7).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Last 30 days',\n value: () => {\n const start = new Date(daysAgo(now(), 30).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Month date',\n value: () => {\n const start = new Date(monthBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Season date',\n value: () => {\n const start = new Date(quarterBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Year date',\n value: () => [yearBegin(now()), now()],\n },\n {\n text: 'Last 6 mon',\n value: () => {\n const end = now();\n const start = new Date();\n\n start.setMonth(start.getMonth() - 6);\n\n return [start, end];\n },\n },\n];\n\n/** 日历快捷选择 */\nexport const calendarShortcuts = [...dateShortcuts];\n","<!--\n * @title: 自定义日期选择组件\n * @author: bugcao@163.com\n * @date: 2026-06-08 14:52:11\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 13:45:54\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Bugcao\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElDatePicker, useGlobalConfig, type ComponentSize, type DatePickerType } from 'element-plus';\n import { computed, defineComponent, ref, unref, useAttrs, watch, type PropType } from 'vue';\n import { useI18n } from 'vue-i18n';\n import { dateRangeShortcuts, dateRangeShortcutsEn, dateShortcuts, dateShortcutsEn, dateTimeShortcuts, dateTimeShortcutsEn } from './shortcuts';\n import type { TDatePickerSize, TDatePickerType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('datepicker');\n\n export default defineComponent({\n // @define name\n name: 'GvDatePicker',\n\n // @props\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: [Date, String, Array] as PropType<TDatePickerType>,\n default: undefined,\n },\n type: {\n type: String as PropType<DatePickerType>,\n default: 'date',\n },\n format: {\n type: String,\n default: 'YYYY-MM-DD',\n },\n valueFormat: {\n type: String,\n default: 'YYYY-MM-DD',\n },\n defaultTime: {\n type: Array,\n default: undefined,\n },\n size: {\n type: String as PropType<TDatePickerSize>,\n default: 'default',\n },\n rangeSeparator: {\n type: String,\n default: undefined,\n },\n startPlaceholder: {\n type: String,\n default: undefined,\n },\n endPlaceholder: {\n type: String,\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n disabledDateFunc: {\n type: Array,\n default: () => [],\n },\n disabledDate: {\n type: Function,\n default: () => {},\n },\n editable: {\n type: Boolean,\n default: true,\n },\n unlink: {\n type: Boolean,\n default: false,\n },\n },\n\n // @emits\n emits: ['update:modelValue', 'change', 'blur', 'focus', 'pick', 'input'],\n\n setup(props, { emit }) {\n // @hooks\n const { locale, t } = useI18n();\n const attrs = useAttrs();\n const globalSize = useGlobalConfig('size');\n\n // @data\n const inputValue = ref(props.modelValue);\n\n // @watch\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @computed\n const datePickerSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n const getShortcuts = computed(() => {\n if (locale.value === 'en')\n if (props.type === 'date') return dateShortcutsEn;\n else if (props.type === 'datetime') return dateTimeShortcutsEn;\n else if (props.type === 'daterange' || props.type === 'datetimerange') return dateRangeShortcutsEn;\n else return '';\n // fixme: 查看源码是'',如果是[],则依旧会出现左边栏\n else if (props.type === 'date') return dateShortcuts;\n else if (props.type === 'datetime') return dateTimeShortcuts;\n else if (props.type === 'daterange' || props.type === 'datetimerange') return dateRangeShortcuts;\n else return ''; // fixme: 查看源码是'',如果是[],则依旧会出现左边栏\n });\n /**\n * @todo: 设置pickerOptions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-08 17:03:41\n */\n const getPickerOptions = computed(() => {\n const pickerOptions: any = {\n shortcuts: getShortcuts.value,\n };\n if (props.disabledDateFunc.includes('beforeToday'))\n // 禁止选择今天之前日期(可以选择今天)\n pickerOptions['disabledDate'] = (date: Date) => date.getTime() < Date.now() - 8.64e7;\n if (props.disabledDateFunc.includes('afterToday'))\n // 禁止选择今天之后的日期(可以选择今天)\n pickerOptions['disabledDate'] = (date: Date) => date.getTime() > Date.now();\n if (props.disabledDate) {\n const db = { disabledDate: props.disabledDate };\n return { ...pickerOptions, ...db };\n } else return { ...pickerOptions };\n });\n\n // @methods\n /**\n * @todo: 回调参数:(value: string | number)\n * @author: bugcao@163.com\n * @Date: 2026-06-08 16:03:12\n * @param {*} value\n */\n const handleInput = (value: TDatePickerType) => {\n emit('update:modelValue', value);\n emit('input', value);\n };\n /**\n * @todo: 变化时触发\n * @author: bugcao@163.com\n * @Date: 2026-06-08 15:05:50\n * @param {*} value\n */\n const handleChange = (value: string) => {\n emit('change', value);\n };\n /**\n * @todo: 失去焦点方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-08 18:39:51\n * @param {*} vm 当前vue组件对象\n */\n const handleBlur = (vm: FocusEvent) => {\n // console.log(vm);\n // const val = vm.$el.querySelector('input').value;\n // if (val) {\n // const format = vm.format;\n // if (!this.userInput)\n // this.userInput = moment(val, format.toUpperCase()).format(format.toUpperCase());\n // if (this.userInput !== 'Invalid date')\n // vm.userInput = this.userInput;\n // // picker.vue中触发value的方法\n // // vm.handleChange();\n emit('blur', vm);\n // this.userInput = '';\n // }\n };\n /**\n * @todo: 获得焦点方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-08 18:39:51\n * @param {*} vm 当前vue组件对象\n */\n const handleFocus = (vm: FocusEvent) => {\n emit('focus', vm);\n };\n /**\n * @todo: 选中日期回调:只有在range模式下有效\n * @author: bugcao@163.com\n * @Date: 2026-06-08 16:16:51\n * @param {*} maxDate\n * @param {*} minDate\n */\n const handlePick = (val: [Date, null | Date]) => {\n emit('pick', { maxDate: val[0], minDate: val[1] });\n };\n\n // @render\n return () => (\n <div class={prefixCls}>\n <ElDatePicker\n ref={props.vref || 'gv-datepicker'}\n id={resolvedInputId.value}\n name={props.name}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleInput}\n type={props.type}\n range-separator={props.rangeSeparator || t('common.until')}\n placeholder={props.placeholder || t('common.selectDate')}\n startPlaceholder={props.startPlaceholder || t('common.startDate')}\n endPlaceholder={props.endPlaceholder || t('common.endDate')}\n default-time={props.defaultTime}\n disabled-date={getPickerOptions.value?.disabledDate}\n shortcuts={getPickerOptions.value.shortcuts}\n format={props.format}\n clearable={props.clearable}\n valueFormat={props.valueFormat}\n {...({\n onCalendarChange: handlePick,\n onBlur: handleBlur,\n onFocus: handleFocus,\n onChange: handleChange,\n } as any)}\n size={datePickerSize.value}\n disabled={props.disabled}\n editable={props.editable}\n prefix-icon=\"\"\n unlink-panels={props.unlink}\n {...attrs}\n // { ...this.$listeners }\n ></ElDatePicker>\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-datepicker';\n .#{$prefixCls} {\n width: 100% !important;\n vertical-align: middle;\n :deep(.el-date-editor) {\n width: 100%;\n }\n :deep(.el-input.is-disabled) {\n .el-input__inner {\n color: $textColor;\n }\n }\n &.el-range-editor.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n :deep(.el-input__inner) {\n height: 30px;\n line-height: 30px;\n //font-size: $appTextSize;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n .el-range__close-icon {\n width: 20px;\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n .el-date-editor--daterange {\n :deep(.el-range-separator) {\n padding-right: 2px;\n padding-left: 0;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDatePicker from './src/GvDatePicker.vue';\n\nconst GvDatePickerPlugin = {\n install(app: App): void {\n app.component(GvDatePicker.name ?? 'GvDatePicker', GvDatePicker);\n },\n};\nexport default GvDatePickerPlugin;\n\nexport { GvDatePicker };\n","/*\n * @title: dialog drag\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 10:50:25\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 10:52:45\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport type { Directive } from 'vue';\n\n/** 使用 WeakSet 跟踪已绑定拖拽事件的 header 元素,避免内存泄漏 */\nconst boundElements = new WeakSet<HTMLElement>();\n\n/**\n * 初始化拖拽功能\n */\nconst initDrag = (el: HTMLElement, collapseMenu: boolean = false) => {\n /** Vue3 dialog - 支持 appendToBody 的情况 */\n let dragDom = el.querySelector('.el-dialog') as HTMLElement;\n if (!dragDom) dragDom = document.querySelector('.el-dialog') as HTMLElement;\n\n if (!dragDom) {\n console.warn('gv-drag-dialog: 未找到 dialog 元素');\n return false;\n }\n\n /** Vue3 dialog header - 支持自定义 header 和默认 header */\n let dialogHeaderEl: HTMLElement | null = null;\n dialogHeaderEl = dragDom.querySelector('.el-dialog__header') as HTMLElement;\n if (!dialogHeaderEl) dialogHeaderEl = dragDom.querySelector('.gv-dialog__title') as HTMLElement;\n\n if (!dialogHeaderEl) {\n console.warn('gv-drag-dialog: 未找到 dialog header 元素');\n return false;\n }\n\n /** 避免重复绑定 */\n if (boundElements.has(dialogHeaderEl)) return true;\n boundElements.add(dialogHeaderEl);\n\n /** 鼠标移动样式 */\n dialogHeaderEl.style.cursor = 'move';\n /** 初始化顶部 */\n dragDom.style.top = '0px';\n /** 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null) */\n const getStyle = (function () {\n if ((window.document as any).currentStyle) return (dom: HTMLElement, attr: string) => (dom as any).currentStyle[attr];\n else return (dom: HTMLElement, attr: string) => getComputedStyle(dom, null)[attr as any];\n })();\n\n dialogHeaderEl.onmousedown = (e: MouseEvent) => {\n /** 鼠标按下,计算当前元素距离可视区的距离 */\n const disX = e.clientX - dialogHeaderEl!.offsetLeft;\n const disY = e.clientY - dialogHeaderEl!.offsetTop;\n\n const dragDomWidth = dragDom.offsetWidth;\n const dragDomHeight = dragDom.offsetHeight;\n\n const screenWidth = document.body.clientWidth;\n const screenHeight = document.body.clientHeight;\n\n /** 左侧边界 */\n const minDragDomLeft = dragDom.offsetLeft;\n /** 右侧边界 */\n const menuWidth = collapseMenu ? 54 : 200;\n const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth - menuWidth;\n\n /** 上边界 */\n const minDragDomTop = dragDom.offsetTop;\n /** 下边界 */\n // 45: toolbar height;34: tags view height\n const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight - 45 - 34;\n\n /** 获取到的值带px 正则匹配替换 */\n let styL: string | number = getStyle(dragDom, 'left');\n let styT: string | number = getStyle(dragDom, 'top');\n\n /** 百分比转像素 */\n if (typeof styL === 'string' && styL.includes('%')) {\n styL = document.body.clientWidth * (+styL.replace(/%/g, '') / 100);\n styT = document.body.clientHeight * (+String(styT).replace(/%/g, '') / 100);\n } else {\n styL = +String(styL).replace(/\\px/g, '');\n styT = +String(styT).replace(/\\px/g, '');\n }\n\n /** 鼠标移动 */\n const onMouseMove = (ev: MouseEvent) => {\n /** 通过事件委托,计算移动的距离 */\n let left = ev.clientX - disX;\n let top = ev.clientY - disY;\n\n /** 边界处理 */\n if (-left > minDragDomLeft) left = -minDragDomLeft;\n else if (left > maxDragDomLeft) left = maxDragDomLeft;\n\n if (-top > minDragDomTop) top = -minDragDomTop;\n else if (top > maxDragDomTop) top = maxDragDomTop;\n\n /** 移动当前元素 */\n dragDom.style.left = `${left + Number(styL)}px`;\n dragDom.style.top = `${top + Number(styT)}px`;\n };\n\n const onMouseUp = () => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n };\n\n return true;\n};\n\nconst dragDialog: Directive = {\n /**\n * @title 挂载时调用\n * @param el 指令绑定的元素\n * @param binding 指令绑定的参数\n * @description Vue3 中需要使用 nextTick 等待 DOM 渲染完成,并通过 querySelector 查找 ElDialog 内部元素\n */\n // mounted(el: HTMLElement, binding: DirectiveBinding, vnode: VNode) {\n // // 使用 setTimeout 确保 ElDialog 已经渲染完成\n // setTimeout(() => {\n // // 尝试初始化,如果 dialog 还没打开,会在 opened 事件中再次尝试\n // initDrag(el);\n // }, 200);\n // },\n};\nexport default dragDialog;\nexport { initDrag };\n","<!--\n * @title: dialog component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-09 09:57:32\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 18:04:43\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvIcon } from '@@/GvIcon';\n import { getVNodeText, sleep } from '@@/utils';\n import { ElDialog } from 'element-plus';\n import { defineComponent, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, watch, type VNode } from 'vue';\n import { initDrag } from './drag';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('dialog');\n\n export default defineComponent({\n name: 'GvDialog',\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: false,\n },\n title: {\n type: String,\n required: false,\n default: '标题',\n },\n hasFooter: {\n type: Boolean,\n required: false,\n default: true,\n },\n width: {\n type: String,\n required: false,\n default: '75%',\n },\n height: {\n type: String,\n required: false,\n default: undefined,\n },\n nest: {\n type: Boolean,\n required: false,\n default: false,\n },\n appendToBody: {\n type: Boolean,\n required: false,\n default: false,\n },\n fullscreen: {\n type: Boolean,\n required: false,\n default: false,\n },\n maxHeight: {\n type: String,\n required: false,\n default: undefined,\n },\n closeOnClickModal: {\n type: Boolean,\n required: false,\n default: false,\n },\n closeOnPressEscape: {\n type: Boolean,\n required: false,\n default: true,\n },\n dialogClass: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['open', 'opened', 'close', 'closed', 'cancel', 'update:visible'],\n\n setup(props, { slots, emit }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n const buttonQuick = appStore.buttonQuick;\n const collapseMenus = appStore.collapseMenus;\n const instance = getCurrentInstance();\n\n let myDialogClass = props.dialogClass || prefixCls;\n let dialogVisible = props.visible;\n const maskVisible = ref(false);\n const vref = 'gv-dialog';\n const dialogMaxHeight = ref(props.height);\n let sAppendToBody = props.appendToBody;\n const modalAppendToBody = ref(false);\n let sNest = props.nest;\n let modalMask = props.nest;\n\n // @watch\n watch(\n () => props.visible,\n (newValue) => {\n // fixme: watch中跟踪visible,解决如将ht-dialog在一个vue组件中,如不设置,则第二次无法显示\n dialogVisible = newValue;\n if (dialogVisible)\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n else maskVisible.value = false;\n },\n );\n\n // @method\n const handleVisible = (visible: boolean) => {\n dialogVisible = visible;\n };\n const handleOpen = () => {\n emit('open');\n };\n const handleOpened = () => {\n emit('opened');\n nextTick(() => {\n initDrag(instance?.vnode?.el as HTMLElement, collapseMenus);\n });\n };\n const handleClose = () => {\n dialogVisible = false;\n maskVisible.value = false;\n // 延迟异步触发\n // sleep(500).then(() => {\n // this.$emit('update:visible', false);\n // });\n emit('close');\n };\n const handleClosed = () => {\n emit('update:visible', false);\n };\n\n const handleCancel = (event) => {\n dialogVisible = false;\n maskVisible.value = false;\n emit('cancel', event);\n };\n /**\n * @todo: render footer button\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 11:19:11\n */\n const renderFooterBtn = () => {\n const footer = slots.footer?.();\n footer?.forEach((x) => {\n const tag = typeof x.type === 'object' && x.type !== null ? (x.type as any).name || '' : '';\n const text = getVNodeText(x.children?.[0]) || '';\n // add: 增加text属性,判断权限使用 2023-04-18\n if (!x.props) x.props = {};\n const propsData = x.props;\n propsData.text = text;\n if (tag)\n if (text.indexOf(t('dialogBar.save')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-baocun2';\n if (buttonQuick) if (text === t('dialogBar.save')) propsData.text = t('dialogBar.save2');\n propsData.otext = t('dialogBar.save');\n } else if (text.indexOf(t('dialogBar.add')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-baocun2';\n if (buttonQuick)\n if (text === t('dialogBar.add')) {\n propsData.text = t('dialogBar.add2');\n propsData.otext = t('dialogBar.add');\n }\n } else if (text.indexOf(t('dialogBar.confirm')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.confirm')) {\n propsData.text = t('dialogBar.confirm2');\n propsData.otext = t('dialogBar.confirm');\n }\n } else if (text.indexOf(t('dialogBar.affirm')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.affirm')) {\n propsData.text = t('dialogBar.affirm2');\n propsData.otext = t('dialogBar.affirm');\n }\n } else if (text.indexOf(t('dialogBar.approve')) !== -1) {\n propsData.bizType = 'approve';\n propsData.icon = 'gv-icon-shenpi1';\n } else if (text.indexOf(t('dialogBar.download')) !== -1) {\n // if (text === t('dialogBar.download')) x.children[0].text = t('dialogBar.download2');\n propsData.bizType = 'download';\n propsData.icon = 'gv-icon-xiazai';\n } else if (text.indexOf(t('dialogBar.delete')) !== -1) {\n propsData.bizType = 'delete';\n propsData.icon = 'el-icon-delete';\n } else if (text.indexOf(t('dialogBar.reject')) !== -1) {\n propsData.bizType = 'reject';\n propsData.icon = 'gv-icon-bohui2';\n } else if (text.indexOf(t('dialogBar.export')) !== -1) {\n propsData.bizType = 'export';\n propsData.icon = 'gv-icon-daochu1';\n } else if (text.indexOf(t('dialogBar.generate')) !== -1) {\n propsData.bizType = 'generate';\n propsData.icon = 'gv-icon-zujian';\n } else if (text.indexOf(t('dialogBar.trace')) !== -1) {\n propsData.bizType = 'trace';\n propsData.icon = 'gv-icon-jiankongguanli';\n } else if (text.indexOf(t('dialogBar.receive')) !== -1) {\n propsData.bizType = 'receive';\n propsData.icon = 'gv-icon-piliangbianji1';\n } else if (text.indexOf(t('dialogBar.transfer')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-tiaobo';\n } else if (text.indexOf(t('dialogBar.circleCheck')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-huanjiance';\n } else if (text.indexOf(t('dialogBar.completed')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-xuanze';\n } else if (text.indexOf(t('dialogBar.finished')) !== -1 || text.indexOf(t('dialogBar.beCompleted')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-wangongqueren';\n } else if (text.indexOf(t('dialogBar.submit')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-tijiao';\n if (buttonQuick)\n if (text === t('dialogBar.submit')) {\n propsData.text = t('dialogBar.submit2');\n propsData.otext = t('dialogBar.submit');\n }\n }\n });\n return footer;\n };\n\n /**\n * @todo: footer render\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 10:34:41\n */\n const getFooter = () => {\n if (props.hasFooter)\n if (slots.footer?.())\n return (\n <div>\n {renderFooterBtn()}\n <GvButton\n onClick={handleCancel}\n icon=\"iconfont gv-icon-fanhui2\">\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n // <el-button type='primary' onClick={this.handleConfirm}>确 定(S)</el-button>\n else\n return (\n <div>\n <GvButton\n onClick={handleCancel}\n icon=\"iconfont gv-icon-fanhui2\">\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n };\n\n /**\n * @todo: mask\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 10:38:59\n */\n const setMask = () => {\n let mask: VNode | null = null;\n if (maskVisible.value)\n mask = (\n <div\n class=\"v-modal gv-dialog-modal z-[9]\"\n tabindex=\"0\"></div>\n );\n return mask;\n };\n\n const getMaxHeight = () => {\n if (!props.height) dialogMaxHeight.value = document.documentElement.clientHeight - 230 + 'px';\n else if (props.height.indexOf('%') === -1) dialogMaxHeight.value = parseFloat(props.height) - 180 + 'px';\n else dialogMaxHeight.value = props.height; // 百分比方式\n };\n\n // @created\n // fixme: 解决嵌套弹窗问题 2022-08-08\n const pEl = instance?.parent?.parent?.vnode.el;\n if (pEl)\n try {\n const p = pEl.closest('.gv-drawer,.gv-dialog');\n if (p) sNest = true;\n } catch {\n // error\n }\n if (sNest) {\n myDialogClass = props.dialogClass ? 'gv-dialog is-nested ' + props.dialogClass : 'gv-dialog is-nested';\n sAppendToBody = true;\n modalAppendToBody.value = true;\n modalMask = true;\n } else modalMask = false;\n\n onBeforeUnmount(() => {\n window.removeEventListener('resize', getMaxHeight);\n });\n\n // mounted\n onMounted(() => {\n // fixme: v-show属性使用单独的变量,在挂载时再显示,如在data中直接定义为true,会造成抖动 2022-04-11\n if (dialogVisible) maskVisible.value = true;\n\n nextTick(() => {\n window.addEventListener('resize', getMaxHeight);\n // 计算高度\n getMaxHeight();\n });\n });\n\n // @render\n return () => (\n <div class=\"gv-dialog__popup\">\n <ElDialog\n ref={vref}\n // route={this.route}\n modelValue={dialogVisible}\n onUpdate:modelValue={handleVisible}\n appendToBody={sAppendToBody}\n modal-append-to-body={modalAppendToBody.value}\n close-on-click-modal={props.closeOnClickModal}\n close-on-press-escape={props.closeOnPressEscape}\n showClose={true}\n destroy-on-close={true}\n fullscreen={props.fullscreen}\n modal={modalMask}\n // before-close={this.handleBeforeClose}\n onClose={handleClose}\n onClosed={handleClosed}\n onOpen={handleOpen}\n onOpened={handleOpened}\n class={myDialogClass}\n width={props.width}\n style={{ height: `${props.height}` }}>\n {{\n header: () => (\n <div class=\"gv-dialog__title\">\n <span>\n <GvIcon\n iconType=\"iconfont\"\n iconName=\"gv-icon-chuangkou01\"\n />\n {props.title}\n </span>\n </div>\n ),\n default: () => (\n <div\n class=\"gv-dialog__body__inner\"\n style={{ maxHeight: `${dialogMaxHeight.value} !important` }}>\n {slots.default?.()}\n </div>\n ),\n footer: () => <div class=\"dialog-footer\">{getFooter()}</div>,\n }}\n </ElDialog>\n {setMask()}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n .gv-dialog__popup {\n :deep(.el-modal-dialog) {\n position: absolute !important;\n &.is-nested {\n top: 100px;\n left: 14%;\n }\n .el-overlay-dialog {\n position: absolute !important;\n overflow: hidden;\n .el-dialog {\n max-height: 93.5% !important;\n margin-top: 25px !important;\n padding: 0px;\n\n .el-dialog__header {\n box-sizing: border-box;\n height: 30px;\n padding: 0 15px;\n line-height: 30px;\n background-color: #e1e5ec !important;\n border-bottom: 1px solid $borderColor;\n\n .gv-dialog__title {\n //font-size: $appTextSize;\n line-height: inherit;\n\n & i {\n padding-right: 10px;\n //font-size: $textSize;\n font-weight: bolder;\n }\n }\n\n .el-dialog__headerbtn {\n width: 16px;\n height: 25px;\n top: 2px;\n right: 12px;\n font-size: 20px;\n font-weight: bolder;\n line-height: normal;\n\n &:hover .el-dialog__close {\n color: var(--primaryColor, $primaryColor);\n }\n\n .el-dialog__close {\n font-size: 16px;\n font-weight: bolder;\n }\n }\n }\n\n .el-dialog__body {\n padding: 5px 5px 5px 15px;\n overflow: hidden;\n\n .gv-dialog__body__inner {\n padding-right: 15px;\n overflow: hidden auto;\n }\n\n .fullscreen-btn {\n position: absolute;\n top: 16px;\n right: 42px;\n padding: 5px;\n line-height: 1;\n cursor: pointer;\n\n &:hover {\n color: $primaryColor;\n }\n }\n\n .container {\n padding: 0 15px;\n }\n }\n\n .el-dialog__footer {\n .gv-popconfirm {\n padding: 1px 0 1px 8px;\n }\n\n .el-button i + span {\n margin-left: 5px;\n }\n\n padding: 5px 15px;\n border-top: 1px solid $borderColor;\n }\n }\n }\n }\n }\n\n .gv-tabs {\n .gv-dialog {\n top: -10px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDialog from './src/GvDialog.vue';\nconst GvDialogPlugin = {\n install(app: App): void {\n app.component(GvDialog.name ?? 'GvDialog', GvDialog);\n },\n};\nexport default GvDialogPlugin;\n\nexport { GvDialog };\n","<!--\n * @title: divider component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:24:57\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 18:03:45\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElDivider } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n import type { DividerDirection } from './types';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('divider');\n\n export default defineComponent({\n name: 'GvDivider',\n emits: ['setDividerShow'],\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n label: {\n type: String,\n required: true,\n default: '栏目',\n },\n position: {\n type: String,\n required: false,\n default: 'left',\n },\n direction: {\n type: String as PropType<DividerDirection>,\n required: false,\n default: 'horizontal',\n },\n target: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n\n setup(props, { emit }) {\n /**\n * @todo: click divider — toggle form visibility via parent isShow\n */\n const clickDivider = (event: MouseEvent | TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n emit('setDividerShow', !props.visible);\n };\n\n return () => (\n <div\n class={prefixCls}\n onClick={(event) => clickDivider(event)}>\n <ElDivider\n content-position={props.position}\n direction={props.direction}>\n <span class=\"title\">{props.label}</span>\n </ElDivider>\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-divider';\n .#{$prefixCls} {\n width: 100%;\n height: 20px;\n margin: 5px 0 8px 0;\n overflow: hidden;\n user-select: none;\n\n // 禁止选中文本\n &:hover {\n cursor: pointer;\n }\n :deep(.el-divider--horizontal) {\n margin: 8px 0;\n .el-divider__text {\n padding: 0 $modulePadding;\n &.is-left {\n left: -$moduleMargin;\n }\n .title {\n display: inline-block;\n height: 20px;\n //font-size: $textSizeSecondary;\n font-weight: $fontWeight;\n line-height: 20px;\n color: $textColor;\n\n &::before {\n display: inline-block;\n width: 5px;\n height: 100%;\n margin-right: 8px;\n vertical-align: middle;\n content: '';\n background-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDivider from './src/GvDivider.vue';\nconst GvDividerPlugin = {\n install(app: App): void {\n app.component(GvDivider.name ?? 'GvDivider', GvDivider);\n },\n};\nexport default GvDividerPlugin;\n\nexport { GvDivider };\n","<!--\n * @title: drawer component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-09 09:58:21\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-10 09:01:23\n * @version: 1.0.7\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvIcon } from '@@/GvIcon';\n import { getVNodeText, sleep } from '@@/utils';\n import { ElDrawer } from 'element-plus';\n import { defineComponent, nextTick, onMounted, ref, watch, type PropType, type VNode } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('drawer');\n\n export default defineComponent({\n name: 'GvDrawer',\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: false,\n },\n title: {\n type: String,\n required: false,\n default: '标题',\n },\n direction: {\n type: String as PropType<'rtl' | 'ltr' | 'ttb' | 'btt'>,\n required: false,\n default: 'rtl',\n },\n size: {\n type: [String, Number],\n required: false,\n default: '95%', // 95%\n },\n paddingHeight: {\n type: [Number],\n required: false,\n default: 100, // 100\n },\n },\n emits: ['close', 'closed', 'open', 'opened', 'cancel', 'resize', 'update:visible'],\n\n setup(props, { slots, emit }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n\n const drawerVisible = ref(props.visible);\n const maskVisible = ref(false);\n const vref = 'gv-drawer';\n const drawerMaxHeight = ref(0);\n const show = ref(false);\n const buttonQuick = appStore.buttonQuick;\n const buttonIcon = appStore.buttonIcon;\n const sPaddingHeight = appStore.drawerPaddingHeight ? appStore.drawerPaddingHeight : props.paddingHeight;\n\n // @watch\n watch(\n () => props.visible,\n (newVal) => {\n // fixme: watch中跟踪visible,解决如将ht-drawer在一个vue组件中,如不设置,则第二次无法显示\n drawerVisible.value = newVal;\n if (drawerVisible.value)\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n else maskVisible.value = false;\n },\n );\n\n // @method\n\n const handleOpen = () => {\n // this.maskVisible = true;\n emit('open');\n };\n const handleOpened = () => {\n // this.maskVisible = true;\n emit('opened');\n };\n\n const handleClosed = () => {\n emit('update:visible', false);\n };\n\n const handleResize = (evt: MouseEvent, size: number) => {\n emit('resize', evt, size);\n };\n\n const handleCancel = (event: Event) => {\n drawerVisible.value = false;\n maskVisible.value = false;\n emit('cancel', event);\n };\n\n const handleVisible = (visible: boolean) => {\n drawerVisible.value = visible;\n };\n\n const handleClose = () => {\n drawerVisible.value = false;\n maskVisible.value = false;\n emit('update:visible', false);\n // 延迟异步触发\n // sleep(500).then(() => {\n // this.$emit('update:visible', false);\n // });\n // this.$emit('close', event);\n };\n\n /**\n * @todo: set footer button shortcut\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 15:25:50\n */\n const renderFooterBtn = () => {\n const footer = slots.footer?.();\n footer?.forEach((x) => {\n const tag = typeof x.type === 'object' && x.type !== null ? (x.type as any).name || '' : '';\n const text = getVNodeText(x) || '';\n if (!x.props) x.props = {};\n const propsData = x.props;\n propsData.text = text;\n if (tag)\n if (text.indexOf(t('dialogBar.save')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-baocun2';\n if (buttonQuick)\n if (text === t('dialogBar.save')) {\n propsData.text = t('dialogBar.save2');\n propsData.otext = t('dialogBar.save');\n }\n } else if (text.indexOf(t('dialogBar.confirm')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.confirm')) {\n propsData['otext'] = t('dialogBar.confirm');\n propsData.text = t('dialogBar.confirm2');\n }\n } else if (text.indexOf(t('dialogBar.affirm')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.affirm')) {\n propsData.text = t('dialogBar.affirm2');\n propsData.otext = t('dialogBar.confirm');\n }\n } else if (text.indexOf(t('dialogBar.approve')) !== -1) {\n propsData.bizType = 'approve';\n if (buttonIcon) propsData.icon = 'gv-icon-shenpi1';\n } else if (text.indexOf(t('dialogBar.reject')) !== -1) {\n propsData.bizType = 'reject';\n if (buttonIcon) propsData.icon = 'gv-icon-bohui2';\n } else if (text.indexOf(t('dialogBar.pay')) !== -1) {\n propsData.bizType = 'pay';\n if (buttonIcon) propsData.icon = 'gv-icon-yingshoukuan';\n } else if (text.indexOf(t('dialogBar.receive')) !== -1) {\n propsData.bizType = 'receive';\n if (buttonIcon) propsData.icon = 'gv-icon-piliangbianji1';\n } else if (text.indexOf(t('dialogBar.export')) !== -1) {\n propsData.bizType = 'export';\n if (buttonIcon) propsData.icon = 'gv-icon-daochu1';\n } else if (text.indexOf(t('dialogBar.generate')) !== -1) {\n propsData.bizType = 'generate';\n if (buttonIcon) propsData.icon = 'gv-icon-zujian';\n } else if (text.indexOf(t('dialogBar.trace')) !== -1) {\n propsData.bizType = 'trace';\n if (buttonIcon) propsData.icon = 'gv-icon-jiankongguanli';\n } else if (text.indexOf(t('dialogBar.publish')) !== -1) {\n propsData.bizType = 'publish';\n if (buttonIcon) propsData.icon = 'gv-icon-fabu';\n } else if (text.indexOf(t('dialogBar.transfer')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-tiaobo';\n } else if (text.indexOf(t('dialogBar.download')) !== -1) {\n propsData.bizType = 'download';\n // if (text === t('dialogBar.download')) children[0].text = '下 载';\n if (buttonIcon) propsData.icon = 'gv-icon-xiazai';\n } else if (text.indexOf(t('dialogBar.delete')) !== -1 || text.indexOf(t('dialogBar.obsolete')) !== -1) {\n propsData.bizType = 'delete';\n if (buttonIcon) propsData.icon = 'el-icon-delete';\n if (buttonQuick) {\n if (text === t('dialogBar.obsolete')) {\n propsData.text = t('dialogBar.obsolete2');\n propsData.otext = t('dialogBar.obsolete');\n }\n if (text === t('dialogBar.delete')) {\n propsData.text = t('dialogBar.delete2');\n propsData.otext = t('dialogBar.delete');\n }\n }\n } else if (text.indexOf(t('dialogBar.submit')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-tijiao';\n if (buttonQuick)\n if (text === t('dialogBar.submit')) {\n propsData.text = t('dialogBar.submit2');\n propsData.otext = t('dialogBar.submit');\n }\n propsData['otext'] = t('dialogBar.submit');\n } else if (text.indexOf(t('dialogBar.circleCheck')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-huanjiance';\n } else if (text.indexOf(t('dialogBar.completed')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-xuanze';\n } else if (text.indexOf(t('dialogBar.settlement')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-eduguanli';\n } else if (text.indexOf(t('dialogBar.finished')) !== -1 || text.indexOf(t('dialogBar.beCompleted')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-wangongqueren';\n }\n });\n\n return footer;\n };\n\n /**\n * @todo: get footer button\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 15:38:54\n */\n const getFooter = () => {\n let returnIcon: string | undefined = 'iconfont gv-icon-fanhui2';\n if (!buttonIcon) returnIcon = undefined;\n if (slots.footer?.())\n return (\n <div class=\"gv-drawer__footer__inner\">\n {renderFooterBtn()}\n <GvButton\n onClick={handleCancel}\n icon={returnIcon}>\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n // <el-button type='primary' onClick={this.handleConfirm}>确 定(S)</el-button>\n else\n return (\n <div class=\"gv-drawer__footer__inner\">\n <GvButton\n onClick={handleCancel}\n icon={returnIcon}>\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n };\n const getMaxHeight = () => {\n drawerMaxHeight.value = document.documentElement.clientHeight - 225;\n };\n\n const setMask = () => {\n let mask: VNode | null = null;\n if (maskVisible.value)\n mask = (\n <div\n tabindex=\"0\"\n class=\"v-modal gv-dialog-drawer z-[9]\"></div>\n );\n return mask;\n };\n // @created\n\n // @mounted\n onMounted(() => {\n // 实现esc按键绑定\n // this.bindListerOnEsc();\n // fixme: v-show属性使用单独的变量,在挂载时再显示,如在data中直接定义为true,会造成抖动 2022-04-11\n if (drawerVisible.value) {\n show.value = true;\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n }\n getMaxHeight();\n nextTick(() => {});\n });\n // @render\n return () => (\n <div class=\"gv-drawer__popup\">\n <ElDrawer\n class={prefixCls}\n ref={vref}\n modelValue={drawerVisible.value}\n onUpdate:modelValue={handleVisible}\n direction={props.direction}\n appendToBody={false}\n modal-append-to-body={false}\n close-on-press-escape={true}\n showClose={true}\n close-on-click-modal={false}\n modal={false}\n onClose={handleClose}\n onClosed={handleClosed}\n onOpen={handleOpen}\n onOpened={handleOpened}\n onResize={handleResize}\n size={props.size}\n style={{ height: `calc(100vh - ${sPaddingHeight}px)` }}>\n {{\n header: () => (\n <div class=\"gv-drawer__title\">\n <span>\n <GvIcon\n style={{ display: buttonIcon ? '' : 'none' }}\n iconType=\"iconfont\"\n iconName=\"gv-icon-chuangkou01\"></GvIcon>\n {props.title}\n </span>\n </div>\n ),\n default: () => (\n <div style={{ overflow: 'hidden auto', maxHeight: `${drawerMaxHeight.value}px !important` }}>\n <div class=\"gv-drawer__body__inner\">{slots.default?.()}</div>\n </div>\n ),\n footer: () => <div class=\"gv-drawer__footer\">{getFooter()}</div>,\n }}\n </ElDrawer>\n {setMask()}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n .gv-drawer__popup {\n :deep(.el-modal-drawer) {\n position: absolute !important;\n top: 1px !important;\n height: calc(100vh - 100px) !important;\n .el-drawer {\n // width: 95% !important;\n height: 98% !important;\n margin-top: 1px !important;\n\n .el-drawer__header {\n box-sizing: border-box;\n height: 30px;\n padding: 0 15px;\n margin-bottom: 1px;\n line-height: 30px;\n background-color: #e1e5ec !important;\n border-bottom: 1px solid $borderColor;\n\n .gv-drawer__title {\n //font-size: $appTextSize;\n line-height: inherit;\n\n & i {\n padding-right: 10px;\n //font-size: $textSize;\n font-weight: bolder;\n }\n }\n\n .el-drawer__close-btn {\n top: 10px;\n right: 12px;\n line-height: normal;\n\n i {\n font-size: 16px;\n font-weight: bolder;\n }\n\n &:hover i {\n color: var(--primaryColor, $primaryColor);\n }\n\n .el-drawer__close {\n font-weight: bolder;\n }\n }\n }\n\n .el-drawer__body {\n padding: 5px 15px;\n overflow: hidden;\n\n .gv-drawer__body__inner {\n overflow: hidden auto;\n }\n\n .fullscreen-btn {\n position: absolute;\n top: 16px;\n right: 42px;\n padding: 5px;\n line-height: 1;\n cursor: pointer;\n\n &:hover {\n color: $primaryColor;\n }\n }\n\n .container {\n padding: 0 15px;\n }\n }\n\n .gv-drawer__footer {\n .gv-drawer__footer__inner {\n float: right;\n padding: 5px;\n\n .el-button i + span {\n margin-left: 5px;\n }\n }\n\n .gv-popconfirm {\n padding: 1px 0 1px 8px;\n }\n\n .el-button--default {\n margin-left: 8px;\n }\n\n width: 100%;\n border-top: 1px solid $borderColor;\n }\n }\n }\n }\n .gv-tabs {\n .gv-drawer {\n top: 10px;\n height: 93% !important;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDrawer from './src/GvDrawer.vue';\nconst GvDrawerPlugin = {\n install(app: App): void {\n app.component(GvDrawer.name ?? 'GvDrawer', GvDrawer);\n },\n};\nexport default GvDrawerPlugin;\n\nexport { GvDrawer };\n","import { type VueTypeValidableDef, type VueTypesInterface, createTypes, toValidableType } from 'vue-types';\nimport type { CSSProperties } from 'vue';\n\ntype PropTypes = VueTypesInterface & {\n readonly style: VueTypeValidableDef<CSSProperties>;\n};\nconst newPropTypes = createTypes({\n func: undefined,\n bool: undefined,\n string: undefined,\n number: undefined,\n object: undefined,\n integer: undefined,\n}) as PropTypes;\n\nclass propTypes extends newPropTypes {\n static get style(): VueTypeValidableDef<CSSProperties> {\n return toValidableType('style', {\n type: [String, Object],\n });\n }\n}\n\nexport { propTypes };\n","/*\n * @title: pinyin-pro 汉字转拼音组件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-10-10 11:21:59\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-10-10 11:22:02\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { pinyin } from 'pinyin-pro';\n/**\n * usePinyin 组合式函数\n * 提供常见的中文转拼音功能\n */\nexport function usePinyin() {\n /**\n * 中文转拼音(默认无音调、空格分隔)\n * @param text 中文字符串\n * @param withTone 是否带音调(默认 false)\n */\n const toPinyin = (text: string, withTone = false): string => {\n if (!text) return '';\n return pinyin(text, {\n toneType: withTone ? 'symbol' : 'none',\n type: 'string',\n multiple: false,\n });\n };\n\n /**\n * 获取拼音首字母\n * @param text 中文字符串\n */\n const getFirstLetter = (text: string): string => {\n if (!text) return '';\n return pinyin(text, {\n pattern: 'first',\n toneType: 'none',\n type: 'string',\n }).replace(/\\s+/g, '');\n };\n\n /**\n * 获取拼音数组(按字分隔)\n * @param text 中文字符串\n */\n const getPinyinArray = (text: string): string[] => {\n if (!text) return [];\n return pinyin(text, {\n toneType: 'none',\n type: 'array',\n });\n };\n\n return {\n toPinyin,\n getFirstLetter,\n getPinyinArray,\n };\n}\n","<!--\n * @title: expand menu list\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-04 12:37:50\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:58:26\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { usePermsStore } from '@/store/modules/perms';\n import { usePinyin } from '@@/hooks/web/usePinyin';\n import { isExternal, pathResolve, sleep } from '@@/utils';\n import { Search, Star, StarFilled } from '@element-plus/icons-vue';\n import { ElAutocomplete, ElIcon, ElTabPane, ElTabs } from 'element-plus';\n import { computed, onMounted, ref } from 'vue';\n import { useI18n } from 'vue-i18n';\n import type { RouteType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu-list');\n\n defineOptions({\n name: 'GvMenuList', // 定义组件名称\n });\n const { t } = useI18n();\n const permStore = usePermsStore();\n const pinYin = usePinyin();\n const routes = computed(() => permStore.getServerRouters);\n\n const emit = defineEmits(['close']);\n\n const menuList = ref<RouteType[]>();\n const menuPath = ref('');\n\n const fMenusList = ref<AppRouteRecordRaw[]>([]);\n\n // ------ watch hook------\n // watchEffect();\n // // [routes, menusList],\n // // [\n // // (n, o) => {\n // // this.menusList = this.generateRoutes(this.routes.value);\n // // },\n // // (list) => {\n // // // 转换拼音\n // // if (this.supportPinyinSearch) this.addPinyinField(list);\n // // },\n // // ],\n\n // ------ methods hook ------\n /**\n * @todo: generate routes\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-15 10:46:56\n * @param {*} sidebarRoutes\n * @param {*} basePath\n * @param {*} prefixTitle\n * @param {*} prefixCode\n */\n\n const generateRouter = (serverRoutes: AppRouteRecordRaw[], basePath = '/', prefixTitle: string[] = [], prefixCode: string[] = []): RouteType[] => {\n let res: RouteType[] = [];\n for (const router of serverRoutes) {\n if (router.redirect === '/404') continue;\n if (router.meta?.hidden) continue;\n const data: RouteType = {\n path: pathResolve(basePath, router.path),\n title: [...(prefixTitle as string[])],\n pinyinTitle: pinYin.getFirstLetter([...(prefixTitle as string[])].join('')),\n code: [...prefixCode],\n };\n if (router.meta && router.meta.title) {\n const i18ntitle = router.meta.title;\n const code = router.meta.code || '';\n data.title = [...data.title, i18ntitle];\n data.pinyinTitle = pinYin.getFirstLetter(data.title.join(''));\n data.code = [...data.code, String(code)];\n if (router.redirect !== 'noredirect') res.push(data);\n else if (basePath === '/') fMenusList.value.push(router);\n }\n if (router.children) {\n const tempRoutes = generateRouter(router.children, data.path, data.title);\n if (tempRoutes.length >= 1) res = [...res, ...tempRoutes];\n }\n }\n return res;\n };\n\n const handleCloseDrawer = () => {\n emit('close');\n };\n\n /**\n * @todo: click menu item handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-03-09 10:56:00\n * @param {*} item\n */\n const handleSelect = (item: RouteType) => {\n // push({ path: item.path });\n // handleCloseDrawer();\n sleep(200).then(() => {\n menuPath.value = '';\n });\n };\n\n const handleSearch = (query: string, cb: any) => {\n let res: RouteType[] = [];\n if (query !== '')\n if (Array.isArray(menuList.value))\n res = menuList.value.filter((item) => {\n if (item.title.join('').indexOf(query) !== -1) return item;\n else if (item.pinyinTitle.indexOf(query.toLowerCase()) !== -1) return item;\n else if (item.path.indexOf(query) !== -1) return item;\n });\n else res = menuList.value ?? [];\n else res = menuList.value ?? [];\n cb(res);\n };\n\n /**\n * @todo: star click handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-10-11 10:20:33\n * @param {*} star\n * @param {*} path\n * @param {*} title\n * @param {*} menuItem\n */\n const starClickHandle = (star, path, title, menuItem) => {};\n\n // ------ mounted hook ------\n onMounted(() => {\n menuList.value = generateRouter(routes.value);\n // console.log('routes', permStore.getServerRouters);\n // console.log('menuList', menuList.value);\n });\n</script>\n<template>\n <div :class=\"prefixCls\">\n <!-- search -->\n <div class=\"search\">\n <div class=\"top\">\n <ElAutocomplete\n v-model=\"menuPath\"\n value-key=\"path\"\n :fetch-suggestions=\"handleSearch\"\n :placeholder=\"t('sideBar.menuSearch')\"\n @select=\"handleSelect\">\n <template #prefix>\n <ElIcon>\n <Search />\n </ElIcon>\n </template>\n <template v-slot=\"{ item }\">\n <span class=\"name\">{{ item.title.join(' > ') }}</span>\n </template>\n </ElAutocomplete>\n </div>\n </div>\n <!-- main -->\n <div class=\"main\">\n <ElTabs tab-position=\"right\">\n <ElTabPane\n v-for=\"item in fMenusList\"\n :key=\"item.name\"\n :label=\"item.meta?.title\"\n lazy>\n <div class=\"column-wrap\">\n <div\n v-for=\"sub in item.children\"\n :key=\"sub.name\"\n class=\"box\">\n <template v-if=\"!sub.children || sub.children.length === 0\">\n <ul class=\"leaf\">\n <li>\n <ElIcon @click.stop=\"starClickHandle(sub.meta?.star, sub.path, sub.meta?.title, sub)\">\n <component :is=\"sub.meta?.star ? StarFilled : Star\" />\n </ElIcon>\n <router-link\n v-if=\"!isExternal(sub.path)\"\n :to=\"`${item.path}/${sub.path}`\"\n @click=\"handleCloseDrawer\">\n {{ sub.meta?.title }}\n </router-link>\n <a\n v-else\n :href=\"sub.path\"\n target=\"_blank\"\n rel=\"noopener\">\n {{ sub.meta?.title }}</a\n >\n </li>\n </ul>\n </template>\n <template v-else>\n <h4>{{ sub.meta?.title }}</h4>\n <ul>\n <li\n v-for=\"x in sub.children\"\n :key=\"x.name\">\n <ElIcon @click.stop=\"starClickHandle(x.meta?.star, x.name, x.meta?.title, x)\">\n <component :is=\"x.meta?.star ? StarFilled : Star\" />\n </ElIcon>\n <router-link\n v-if=\"!isExternal(sub.path)\"\n :to=\"`${item.path}/${sub.path}/${x.path}`\"\n @click=\"handleCloseDrawer\">\n {{ x.meta?.title }}\n </router-link>\n <a\n v-else\n :href=\"sub.path\"\n target=\"_blank\"\n rel=\"noopener\">\n {{ x.meta?.title }}</a\n >\n </li>\n </ul>\n </template>\n </div>\n </div>\n </ElTabPane>\n </ElTabs>\n </div>\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-expand-menu-list';\n .#{$prefixCls} {\n position: absolute;\n width: 650px;\n height: 100%;\n left: 0px;\n background: #272b2c;\n &::after {\n top: 0;\n right: 0;\n width: 150px;\n height: 100%;\n content: '';\n background: #272b2c;\n }\n :deep(.search) {\n height: 100px;\n width: 500px;\n background: #313538;\n .top {\n padding: 30px 0 0 100px;\n i {\n color: var(--left-menu-text-color);\n }\n .el-autocomplete {\n width: 300px;\n border-bottom: 1px solid #626466;\n border-radius: 0;\n .el-input {\n .el-input__wrapper {\n background: var(--left-menu-expand-bg-color);\n box-shadow: none;\n padding-left: 30px;\n .el-input__inner {\n //font-size: $appTextSize;\n color: #fff;\n border: none;\n line-height: 40px;\n height: 40px;\n }\n }\n }\n }\n }\n }\n :deep(.main) {\n position: relative;\n height: calc(100% - 100px);\n .el-tabs {\n height: 100%;\n overflow-y: auto;\n &::-webkit-scrollbar {\n display: none;\n }\n .el-tabs__header {\n position: absolute;\n top: 0;\n right: 0;\n .el-tabs__nav-wrap {\n padding: 0;\n .el-tabs__nav-scroll {\n overflow-y: auto;\n .el-tabs__nav {\n padding-bottom: $modulePadding;\n }\n }\n .el-tabs__item {\n height: 30px;\n padding: 0 0 0 15px;\n //font-size: $textSize;\n line-height: 30px;\n color: $menuText;\n &.is-active {\n font-weight: 500;\n color: #fff;\n }\n }\n &.is-right {\n width: 151px;\n }\n &::after {\n display: none;\n }\n }\n }\n .el-tabs__content {\n background: #313538;\n margin-right: 150px;\n .el-tab-pane {\n padding-right: 20px;\n }\n .column-wrap {\n column-count: 2;\n column-gap: 0;\n .box {\n padding-bottom: 10px;\n padding-left: 30px;\n -webkit-column-break-inside: avoid;\n page-break-inside: avoid;\n break-inside: avoid;\n h4 {\n margin-bottom: 12px;\n height: 32px;\n //font-size: $textSize;\n font-weight: 500;\n line-height: 32px;\n color: $menuText;\n border-bottom: 1px solid #626466;\n }\n ul {\n padding-left: 0;\n margin-top: 8px;\n list-style: none;\n &.leaf {\n margin-top: 18px;\n }\n li {\n line-height: 26px;\n i {\n //font-size: 14px;\n cursor: pointer;\n top: 2px;\n }\n .el-icon {\n color: $menuText;\n }\n a {\n padding-left: 3px;\n //font-size: $textSize;\n color: $menuText;\n transition: all 0.3s ease;\n &:hover {\n color: var(--menuActiveText, $menuActiveText);\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n</style>\n","<!--\n * @title: Expand Menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-02 09:39:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:58:12\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { propTypes } from '@@/utils/gv.propTypes';\n import { ElDrawer } from 'element-plus';\n import { computed, ref } from 'vue';\n\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import GvMenuList from './GvMenuList.vue';\n\n defineOptions({\n name: 'GvExpandMenu', // 定义组件名称\n });\n\n const props = defineProps({\n collapse: propTypes.bool.def(true),\n });\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu');\n\n const { t } = useBridgeI18n();\n\n // console.log('t', t('sideBar.menuNav'));\n const visible = ref(false);\n const sideWidth = computed(() => (props.collapse ? '54px' : '200px'));\n const expandHandle = () => {\n visible.value = !visible.value;\n };\n</script>\n<template>\n <div :class=\"prefixCls\">\n <div\n class=\"expand-menu-title\"\n :class=\"{ selected: visible ? true : false }\"\n @click.stop=\"expandHandle\">\n <i :class=\"['iconfont', 'gv-icon-wangzhandaohang']\"></i>\n <span\n v-if=\"!collapse\"\n class=\"text\"\n >{{ t('sideBar.menuNav') }}</span\n >\n </div>\n <ElDrawer\n v-model=\"visible\"\n :style=\"{ left: sideWidth, paddingLeft: sideWidth }\"\n class=\"sidebar-expand-drawer\"\n :with-header=\"false\"\n :append-to-body=\"true\"\n direction=\"ltr\"\n resizable\n :modal-class=\"!collapse ? 'sidebar-expand-menu-collapse' : 'sidebar-expand-menu-unCollapse'\"\n size=\"650\">\n <GvMenuList @close=\"visible = false\" />\n </ElDrawer>\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-expand-menu';\n .#{$prefixCls} {\n height: 40px;\n background-color: $menuBg;\n\n .expand-menu-title {\n width: 100%;\n padding-left: 14px;\n line-height: 48px;\n color: $menuText;\n cursor: pointer;\n\n &.selected,\n &:hover {\n color: var(--left-menu-text-active-color);\n background-color: $menuHover;\n }\n\n i {\n width: 24px;\n font-size: 20px;\n font-weight: 500;\n color: var(--left-menu-text-color);\n text-align: center;\n vertical-align: middle;\n }\n\n .text {\n display: inline-block;\n line-height: 48px;\n margin-left: 10px;\n //font-size: $textSize;\n color: var(--left-menu-text-color);\n vertical-align: middle;\n &:hover {\n color: var(--left-menu-text-active-color);\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvExpandMenu from './src/GvExpandMenu.vue';\nconst GvExpandMenuPlugin = {\n install(app: App): void {\n app.component(GvExpandMenu.name ?? 'GvExpandMenu', GvExpandMenu);\n },\n};\nexport default GvExpandMenuPlugin;\n\nexport { GvExpandMenu };\n","<!--\n * @title: input component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-29 09:22:45\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:58:39\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import { GvIcon } from '@@/GvIcon';\n import { ElInput, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { BizType, InputType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('input');\n\n export default defineComponent({\n name: 'GvInput',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n value: {\n type: [String, Number, undefined] as PropType<string | number | undefined>,\n default: '',\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n prefixIcon: {\n type: String,\n default: '',\n },\n suffixIcon: {\n type: String,\n default: '',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n maxlength: {\n type: Number,\n default: 30,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n readonly: {\n type: Boolean,\n default: false,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n type: {\n type: String as PropType<InputType>,\n default: 'text',\n },\n rows: {\n type: Number,\n default: 2,\n },\n autosize: {\n type: [Boolean, Object] as PropType<boolean | Record<string, any>>,\n default: false,\n },\n bizType: {\n type: String as PropType<BizType>,\n default: 'tableedit',\n },\n },\n\n emits: ['update:modelValue', 'input', 'blur', 'focus', 'clear', 'keydown'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useBridgeI18n();\n const globalSize = useGlobalConfig('size');\n const inputValue = ref(props.value);\n\n const showWordLimit = ref(false);\n\n // @computed\n const inputSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sPlaceholder = computed(() => props.placeholder || t('common.pleaseInput'));\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @watch\n watch(\n () => props.value,\n (newValue) => {\n inputValue.value = newValue;\n },\n );\n\n // @methods\n\n const renderPrefixIcon = (): JSX.Element | null => {\n if (!props.prefixIcon) return null;\n return <GvIcon iconName={props.prefixIcon} />;\n };\n\n const renderSuffixIcon = (): JSX.Element | null => {\n if (!props.suffixIcon) return null;\n return <GvIcon iconName={props.suffixIcon} />;\n };\n\n const getDisabled = computed(() => {\n if (typeof props.disabled === 'boolean') return props.disabled;\n if (typeof props.disabled === 'string') return props.disabled !== '';\n return false;\n });\n\n const handleInput = (val: string | number) => {\n inputValue.value = val;\n emit('update:modelValue', val);\n emit('input', val);\n };\n\n const handleBlur = (event: FocusEvent) => {\n showWordLimit.value = false;\n if (props.bizType === 'tableedit') emit('blur', event, inputValue.value, props.columnProp);\n else emit('blur', event, inputValue.value, props.vref);\n };\n\n const handleFocus = (event: FocusEvent) => {\n (event.target as HTMLInputElement).select();\n if (props.bizType === 'tableedit') emit('focus', event, inputValue.value, props.columnProp);\n else emit('focus', event, inputValue.value, props.vref);\n };\n\n const handleClear = (event: any) => {\n emit('clear', event);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n showWordLimit.value = true;\n emit('keydown', event);\n };\n\n // @render\n return () => {\n if (!props.visible) return null;\n return (\n <ElInput\n ref={props.vref}\n id={resolvedInputId.value}\n name={props.name}\n type={props.type}\n modelValue={inputValue.value}\n modelModifiers={{ number: true }}\n readonly={props.readonly}\n rows={props.rows}\n autosize={props.autosize}\n size={inputSize.value}\n showWordLimit={showWordLimit.value}\n maxlength={props.maxlength}\n placeholder={sPlaceholder.value}\n disabled={getDisabled.value}\n clearable={props.clearable}\n onInput={handleInput}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onClear={handleClear}\n onKeydown={handleKeyDown}\n class={prefixCls}\n style={{ display: props.visible ? '' : 'none' }}>\n {{\n prefix: () => renderPrefixIcon(),\n suffix: () => renderSuffixIcon(),\n }}\n </ElInput>\n );\n };\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-input';\n .#{$prefixCls} {\n display: flex;\n margin: 0;\n align-items: center;\n\n &.is-disabled {\n :deep(.el-input__inner) {\n color: $textColor;\n }\n }\n\n :deep(.el-input__inner) {\n &:focus {\n // border-color: var(--primaryColorHover, $primaryColorHover);\n }\n height: 30px;\n // padding-left: 10px;\n line-height: 30px;\n //font-size: $textSizeSecondary;\n }\n\n &.el-input--small {\n :deep(.el-input__inner) {\n height: 26px;\n line-height: 26px;\n }\n }\n\n :deep(.el-input__suffix .el-input__suffix-inner) {\n .el-input__count {\n font-size: 10px;\n padding-left: 5px;\n .el-input__count-inner {\n padding: 0;\n }\n }\n .el-input__icon {\n padding: 0;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvInput from './src/GvInput.vue';\n\nconst GvInputPlugin = {\n install(app: App): void {\n app.component(GvInput.name ?? 'GvInput', GvInput);\n },\n};\nexport default GvInputPlugin;\n\nexport { GvInput };\n","<!--\n * @title: input number component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:32:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-12 11:02:44\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\n import { ElInputNumber, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('input-number');\n\n export default defineComponent({\n name: 'GvInputNumber',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n value: {\n type: Number,\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n min: {\n type: Number,\n default: undefined,\n },\n max: {\n type: Number,\n default: undefined,\n },\n size: {\n type: String as PropType<ComponentSize>,\n required: false,\n default: undefined,\n },\n step: {\n type: Number,\n default: 1,\n },\n stepStrictly: {\n type: Boolean,\n default: false,\n },\n precision: {\n type: Number,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n bizType: {\n type: String,\n default: undefined,\n },\n position: {\n type: String,\n default: undefined,\n },\n },\n // @emit\n emits: ['update:modelValue', 'input', 'blur', 'focus', 'keydown', 'change'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useI18n();\n const inputValue = ref(props.value);\n const globalSize = useGlobalConfig('size');\n // @computed\n const inputSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sPlaceHolder = computed(() => (props.placeholder ? props.placeholder : t('common.pleaseInput')));\n const getDisabled = computed(() => props.disabled);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n const handleInput = (val) => {\n emit('update:modelValue', val, props.vref);\n emit('input', val, props.vref);\n };\n const handleBlur = ($event: FocusEvent) => {\n if (props.bizType === 'tableedit') emit('blur', $event, inputValue.value, props.columnProp);\n else emit('blur', $event, inputValue.value, props.vref);\n };\n\n const handleFocus = ($event: FocusEvent) => {\n if ($event.target) ($event.target as HTMLInputElement).select();\n\n if (props.bizType === 'tableedit') emit('focus', $event, inputValue.value, props.columnProp);\n else emit('focus', $event, inputValue.value, props.vref);\n };\n // const handleKeyDown = ($event: KeyboardEvent) => {\n // emit('keydown', $event);\n // };\n const handleChange = (currentValue: number, oldValue: number) => {\n emit('change', currentValue, oldValue);\n };\n\n // @render\n // 注意方法的传参必须使用箭头函数方式,避免每次 render 的时候都会自动执行一次方法\n return (\n // nativeOnkeydown={(e) => this.inputKeydown(e)}\n <ElInputNumber\n class={prefixCls}\n ref={props.vref || 'gv-input-number'}\n id={resolvedInputId.value}\n name={props.name}\n v-model={inputValue.value}\n style={{ display: props.visible ? '' : 'none' }}\n size={inputSize.value}\n placeholder={sPlaceHolder.value}\n disabled={getDisabled.value}\n controls-position={props.position}\n step={props.step}\n step-strictly={props.stepStrictly}\n precision={props.precision}\n min={props.min}\n max={props.max}\n // onKeydown={handleKeyDown}\n onInput={handleInput}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onChange={handleChange}\n // { ...this.$attrs }\n // { ...this.$listeners }\n ></ElInputNumber>\n );\n },\n });\n</script>\n<style scoped lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-input-number';\n .#{$prefixCls} {\n :deep(.el-input__inner) {\n height: 30px;\n line-height: 30px;\n\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n :deep(.el-input-number__decrease),\n :deep(.el-input-number__increase) {\n height: 28px;\n line-height: 28px;\n }\n\n :deep(.el-input-number__decrease),\n :deep(.el-input-number__increase) {\n color: var(--primaryColorHover, $primaryColorHover);\n }\n\n :deep(.el-input-number__increase):hover:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled),\n :deep(.el-input-number__decrease):hover:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled) {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n &.is-controls-right {\n // line-height: 34px; // 需要定义line-height,否则高度串行\n :deep(.el-input-number__decrease) {\n bottom: 1px;\n\n &:hover {\n color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n :deep(.el-input-number__increase) {\n &:hover {\n color: var(--primaryColorHover, $primaryColorHover);\n }\n\n top: 1px;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvInputNumber from './src/GvInputNumber.vue';\nconst GvInputNumberPlugin = {\n install(app: App): void {\n app.component(GvInputNumber.name ?? 'GvInputNumber', GvInputNumber);\n },\n};\nexport default GvInputNumberPlugin;\n\nexport { GvInputNumber };\n","<!--\n * @title: select component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-29 09:36:14\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:53:12\n * @version: 1.0.7\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useNotify } from '@/hook/web/useNotify';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { ElOption, ElSelect, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import { useI18n } from 'vue-i18n';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('select');\n export default defineComponent({\n name: 'GvSelect',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: [String, Array, Object] as PropType<string | unknown[] | Record<string, unknown>>,\n default: undefined,\n },\n value: {\n type: [String, Array, Object] as PropType<string | unknown[] | Record<string, unknown>>,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n showLabel: {\n type: [String, Array],\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined, // 请选择\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n multiple: {\n type: Boolean,\n default: false,\n },\n filterable: {\n type: Boolean,\n default: true,\n },\n dicType: {\n type: String,\n required: true,\n },\n filtercode: {\n // 过滤字典码\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n dicRemote: {\n type: Function,\n default: () => {},\n },\n cb: {\n type: Function,\n default: () => {},\n },\n clear: {\n type: Function,\n default: () => {},\n },\n isreload: {\n type: Boolean,\n default: true,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n bizType: {\n type: String,\n default: undefined,\n },\n editRow: {\n type: Object,\n default: () => {},\n },\n collapseTags: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n },\n // define emit\n emits: ['update:modelValue', 'focus', 'clear', 'change'],\n setup(props, { emit }) {\n const userStore = useUserStore();\n const appStore = useAppStore();\n const { alert } = useNotify();\n const { t, locale } = useI18n();\n\n // @data\n const lang = locale.value;\n let dicIcon = 'iconfont gv-icon-shujuzidian3';\n const remote = ref(false);\n const loading = ref(false);\n const loadingText = ref('loading...');\n const sPlaceholder = computed(() => props.placeholder || t('common.all'));\n const externalValue = computed(() => (props.modelValue !== undefined ? props.modelValue : props.value));\n const inputValue = ref(externalValue.value);\n const inputShowLabel = ref(props.showLabel);\n const inputFilterable = ref(props.filterable);\n // let inputFilterable = props.filterable,\n type SelectModel = string | unknown[] | Record<string, unknown> | undefined;\n const selectValue = ref<SelectModel>(undefined);\n const options = ref<DicItem[]>([]);\n const originOptions = ref<DicItem[]>([]);\n const className = ref(`${prefixCls}`);\n const globalSize = useGlobalConfig('size');\n\n // 表选字典 t# 需在 setup 阶段识别,不能等 mounted\n const dicSrc = props.dicType?.toLowerCase() ?? '';\n if (dicSrc.startsWith('e#')) dicIcon = 'iconfont gv-icon-meiju';\n else if (dicSrc.startsWith('t#')) {\n dicIcon = 'iconfont gv-icon-24gl-table';\n remote.value = true;\n className.value = 'gv-select__table';\n }\n if (props.bizType === 'tableedit') className.value += ' tableedit';\n\n const valueCache = new Map<string, { value: string; label: string; row?: Record<string, unknown> }>();\n\n // @computed\n const selectSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @method\n\n const isEmptyLabel = (label: unknown) => label == null || label === '';\n\n const getDictItemLabel = (item: DicItem): string => {\n switch (locale.value) {\n case 'en':\n return item.e ?? item.t ?? '';\n case 'l1':\n return item.l1 ?? item.t ?? '';\n case 'l2':\n return item.l2 ?? item.t ?? '';\n default:\n return item.t ?? '';\n }\n };\n\n const formatOptionLabel = (label: string) => {\n if (!label) return '';\n return remote.value && label.includes('[') ? label.split('[')[0] : label;\n };\n\n const findLabelInOptions = (code: string, opts: DicItem[]) => {\n const item = opts.find((x) => String(x.c) === String(code));\n if (!item) return '';\n return formatOptionLabel(getDictItemLabel(item));\n };\n\n const getOptionValue = (code: string, label: string, row?: Record<string, unknown>) => {\n const key = String(code);\n const text = String(label || key);\n const cached = valueCache.get(key);\n if (cached && cached.label === text) {\n if (row) cached.row = row;\n return cached;\n }\n const obj = row ? { value: key, label: text, row } : { value: key, label: text };\n valueCache.set(key, obj);\n return obj;\n };\n\n const getSelectCode = (v: unknown) => {\n if (v == null || v === '') return '';\n if (typeof v === 'object' && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const code = o.value ?? o.c ?? o.code;\n return code == null || code === '' ? '' : String(code).trim();\n }\n return String(v).trim();\n };\n\n const getSelectLabel = (v: unknown) => {\n if (v == null || v === '') return '';\n if (typeof v === 'object' && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const label = o.label ?? o.v;\n return label == null || label === '' ? '' : String(label).trim();\n }\n return String(v).trim();\n };\n\n const isEmptySelectValue = (raw: unknown) => {\n if (raw == null || raw === '') return true;\n if (Array.isArray(raw)) {\n if (raw.length === 0) return true;\n return raw.every((item) => {\n if (item == null || item === '') return true;\n return !getSelectCode(item) && isEmptyLabel(getSelectLabel(item));\n });\n }\n if (typeof raw === 'object') return !getSelectCode(raw) && isEmptyLabel(getSelectLabel(raw));\n return false;\n };\n\n const syncEmptyToParent = () => {\n if (externalValue.value === '') return;\n emit('update:modelValue', '');\n };\n\n const elSelectModel = computed<SelectModel>(() => (isEmptySelectValue(selectValue.value) ? undefined : selectValue.value));\n\n /**\n * @todo: 远程搜索、聚焦、清空后保留当前选中项\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-04 10:52:44\n * @param {*} _opts\n */\n const mergeOptionsWithSelected = (_opts: DicItem[]) => {\n let merged = _opts ?? [];\n const append = (code: string, label: string) => {\n if (!code || merged.some((x) => x.c + '' === code)) return;\n merged = [{ c: code, t: label || code, s: '' } as DicItem, ...merged];\n };\n const sv = selectValue.value;\n if (Array.isArray(sv)) sv.forEach((item) => append(getSelectCode(item), getSelectLabel(item) || getSelectCode(item)));\n else if (sv && !isEmptySelectValue(sv)) append(getSelectCode(sv), getSelectLabel(sv) || getSelectCode(sv));\n return merged;\n };\n\n const pushDefaultOption = (op: DicItem) => {\n options.value.push(op);\n if (remote.value) originOptions.value.push({ ...op });\n };\n\n /**\n * @todo: load dict list\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:31:44\n */\n const getSelectOptions = async () => {\n if (!props.dicType) return null;\n else {\n let ret: DicItem[] = [];\n const src = props.dicType.toLowerCase();\n if (src.startsWith('e#')) {\n // const pinyin = await require('js-pinyin');\n // 生成枚举类型字典\n const arr = src.split('#')[1].split(':');\n arr.forEach((x) => {\n const xx: DicItem = {\n c: '',\n t: '',\n s: '',\n };\n const arr2 = x.split('=');\n xx['c'] = arr2[0];\n xx['t'] = arr2[1];\n xx['s'] = '';\n ret.push(xx);\n });\n return ret;\n } else {\n const dictCache = userStore.dictCache?.[src];\n if (props.filtercode === undefined && dictCache) ret = dictCache;\n else if (props.dicType === 'xzqh') {\n // 生成字典列表\n const dict = appStore.getDictDivision;\n if (dict) {\n if (props.filtercode === undefined) {\n const cache = {};\n cache['key'] = 'xzqh';\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n }\n ret = dict;\n }\n } else {\n const dict = appStore.getDict[src];\n\n if (dict) {\n // fixme: 解决字典缓存不能缓存多个问题 2022-04-13\n if (props.filtercode === undefined) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n }\n\n ret = dict;\n }\n }\n\n // 设置是否可搜索\n // this.setFilterable(ret);\n // 增加字典码过滤\n let opts = ret;\n if (props.filtercode) {\n const reg = new RegExp(props.filtercode, 'i');\n opts = ret.filter((x) => reg.test(x.c));\n }\n return opts;\n }\n }\n };\n /**\n * @todo: 设置字典项目超过5个可搜索-- 弃用\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-10 09:42:19\n * @param {*} dict\n */\n // setFilterable(dict) {\n // if (dict && dict.length > 5)\n // inputFilterable.value = true;\n // },\n // 回调参数:(value: string | number)\n // 字典自定义过滤方法\n const filterMethod = (value) => {\n if (value)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts.filter((item) => {\n // console.log(item);\n if (\n item.c.indexOf(value) !== -1 || // value检索\n item.t?.indexOf(value) !== -1 || // label检索\n item.s.indexOf(value.toLowerCase()) !== -1 // 简拼检索\n )\n return true;\n });\n });\n else\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n };\n /**\n * @todo: handle clear event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:27\n */\n const handleClear = () => {\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n else options.value = mergeOptionsWithSelected(originOptions.value);\n\n props.clear(selectValue.value, props.vref, props.dicType);\n emit('clear');\n };\n /**\n * @todo: remote dict search method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:20:03\n * @param {*} query\n */\n const initialRemoteLoaded = ref(false);\n let pendingRemoteQuery: string | null = null;\n let pendingRemotePromise: Promise<void> | null = null;\n let remoteRequestSeq = 0;\n\n const filterOriginOptions = (query: string) =>\n originOptions.value.filter((x) => {\n if (x.t) {\n const f = x.t.split(']');\n if (f[0].indexOf(query) !== -1) return true;\n }\n if (x.c && x.c.indexOf(query) !== -1) return true;\n return false;\n });\n\n const remoteDictSearch = async (query = ''): Promise<void> => {\n if (pendingRemotePromise && pendingRemoteQuery === query) return pendingRemotePromise;\n\n const requestSeq = ++remoteRequestSeq;\n pendingRemoteQuery = query;\n\n pendingRemotePromise = (async () => {\n loading.value = true;\n try {\n const sDicType = props.dicType.substring(2);\n const { datas } = await props.dicRemote(sDicType, query, props.editRow);\n if (requestSeq !== remoteRequestSeq) return;\n\n const ops: DicItem[] = [];\n try {\n JSON.parse(datas).forEach((x: any) => {\n ops.push({ c: x.c, t: x.t, s: '' } as DicItem);\n });\n } catch (e) {\n console.log(e);\n }\n\n options.value = mergeOptionsWithSelected(ops);\n originOptions.value = [...options.value];\n initialRemoteLoaded.value = true;\n } finally {\n if (requestSeq === remoteRequestSeq) {\n loading.value = false;\n loadingText.value = options.value.length === 0 ? t('common.noData') : t('common.loading');\n }\n if (pendingRemoteQuery === query) {\n pendingRemoteQuery = null;\n pendingRemotePromise = null;\n }\n }\n })();\n\n return pendingRemotePromise;\n };\n /**\n * @todo: table dict remote load method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:11:51\n */\n const remoteMethod = async (query = ''): Promise<void> => {\n const q = String(query ?? '');\n\n if (q && originOptions.value.length > 0 && props.isreload === false) {\n const filtered = filterOriginOptions(q);\n if (filtered.length > 0) {\n options.value = mergeOptionsWithSelected(filtered);\n loading.value = false;\n return;\n }\n }\n\n const needFetch = q !== '' || props.isreload || !initialRemoteLoaded.value || originOptions.value.length === 0;\n if (!needFetch) {\n options.value = mergeOptionsWithSelected(originOptions.value);\n loading.value = false;\n return;\n }\n\n await remoteDictSearch(q);\n };\n\n const ensureDefaultOption = (code: string, text: string) => {\n if (!code) return;\n const existed = options.value.find((x) => String(x.c) === String(code));\n if (existed) {\n if (text && existed.t !== text) existed.t = text;\n return;\n }\n pushDefaultOption({ c: code, t: text || code, s: '' } as DicItem);\n };\n\n const resolveDisplayLabel = async (code: string, hint?: string): Promise<string> => {\n if (hint && hint !== code) return hint;\n const localOpts = (await getSelectOptions()) ?? [];\n let label = findLabelInOptions(code, localOpts);\n if (label) return label;\n\n label = findLabelInOptions(code, options.value);\n if (label) return label;\n\n if (remote.value && code) {\n // await remoteDictSearch(code);\n // label = findLabelInOptions(code, options.value);\n // if (label) return label;\n // await remoteDictSearch('');\n // label = findLabelInOptions(code, options.value);\n }\n\n return label || code;\n };\n\n const applySelectValue = async (raw: unknown) => {\n if (isEmptySelectValue(raw)) {\n inputValue.value = undefined as typeof inputValue.value;\n selectValue.value = undefined;\n syncEmptyToParent();\n return;\n }\n inputValue.value = raw as typeof inputValue.value;\n\n if (Array.isArray(raw)) {\n const resolved: ReturnType<typeof getOptionValue>[] = [];\n for (let index = 0; index < raw.length; index++) {\n const item = raw[index];\n if (item === '') continue;\n const code = getSelectCode(item);\n let hint = getSelectLabel(item);\n if (isEmptyLabel(hint) || hint === code) {\n const showLbl = Array.isArray(props.showLabel) ? props.showLabel[index] : undefined;\n if (showLbl && showLbl !== code) hint = String(showLbl);\n }\n const text = await resolveDisplayLabel(code, isEmptyLabel(hint) || hint === code ? undefined : hint);\n const row = typeof item === 'object' && item !== null ? ((item as Record<string, unknown>).row as Record<string, unknown>) : undefined;\n resolved.push(getOptionValue(code, text, row));\n ensureDefaultOption(code, text);\n }\n selectValue.value = resolved;\n return;\n }\n\n const code = getSelectCode(raw);\n let hint = '';\n if (typeof raw === 'object' && raw !== null) {\n const o = raw as Record<string, unknown>;\n hint = String(o.label ?? o.v ?? '');\n } else if (typeof props.showLabel === 'string') hint = props.showLabel;\n const text = await resolveDisplayLabel(code, isEmptyLabel(hint) || hint === code ? undefined : hint);\n const row = typeof raw === 'object' && raw !== null ? ((raw as Record<string, unknown>).row as Record<string, unknown>) : undefined;\n selectValue.value = getOptionValue(code, text, row);\n ensureDefaultOption(code, text);\n };\n\n watch(\n externalValue,\n (newValue) => {\n void applySelectValue(newValue);\n },\n { deep: true, immediate: true },\n );\n\n watch(\n () => props.showLabel,\n (newVal) => {\n inputShowLabel.value = newVal;\n if (!isEmptySelectValue(inputValue.value)) void applySelectValue(externalValue.value ?? inputValue.value);\n },\n );\n\n /**\n * @todo: handle focus event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:35\n * @param {*} event\n */\n const handleFocus = (event: FocusEvent) => {\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n if (remote.value === false)\n if (_opts === undefined || _opts === null || _opts.length === 0) {\n alert('The dict value does not exist', 'warning');\n return false;\n }\n options.value = _opts;\n });\n emit('focus', event);\n };\n\n /**\n * @todo: handle visible change event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:25:38\n * @param {*} val\n */\n const handleVisibleChange = () => {\n // console.log(val);\n };\n\n const handleBlur = () => {\n // // add: 解决无法重新加载问题 2022-04-10\n // if (this.remote === false)\n // this.getSelectOptions().then((_opts) => {\n // this.options = _opts;\n // });\n // else\n // this.options = this.originOptions;\n };\n\n /**\n * @todo: render select option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:37:58\n * @param {*} x\n */\n const renderSelectOption = (x: DicItem) => {\n let t = x.t;\n switch (lang) {\n case 'zh-CN':\n t = x.t;\n break;\n case 'en':\n t = x.e;\n break;\n case 'l1':\n t = x.l1;\n break;\n case 'l2':\n t = x.l2;\n break;\n default:\n t = x.t;\n break;\n }\n if (!t) t = x.t;\n return (\n <ElOption\n key={x.c + ''}\n label={t}\n value={getOptionValue(x.c + '', t ?? '')}>\n <span class=\"gv-select__option--label\">{t}</span>\n <span class=\"gv-select__option--value\">{x.c}</span>\n </ElOption>\n );\n };\n\n /**\n * @todo: render table option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:44:34\n * @param {*} x\n */\n const renderTableOption = (x: DicItem) => {\n const t = x.t;\n let val = t;\n const columnTexts: string[] = [];\n const row: Record<string, string> = {};\n let multiColumn = false;\n if (t) {\n if (t.indexOf('[') !== -1) {\n // 多列显示\n multiColumn = true;\n const v1 = t.split('[');\n val = v1[0];\n let mm = v1[1];\n mm = mm.split(']')[0];\n const m2 = mm.split(',');\n for (let i = 0; i < m2.length; i++) {\n const m3 = m2[i];\n const m4 = m3.split(':');\n row[m4[0]] = m4[1];\n columnTexts.push(m4[1] === 'null' ? ' -- ' : m4[1]);\n }\n }\n if (t.indexOf('{') !== -1) {\n // 隐藏列\n const vv1 = t.split('{');\n if (multiColumn === false) val = vv1[0];\n let mmm = vv1[1];\n mmm = mmm.split('}')[0];\n const mm2 = mmm.split(',');\n for (let i = 0; i < mm2.length; i++) {\n const mm3 = mm2[i];\n const mm4 = mm3.split(':');\n row[mm4[0]] = mm4[1];\n }\n }\n }\n let key = x.c + '';\n if (props.multiple === true) key = x.val === undefined ? x.c + '' : String(x.val);\n return (\n <ElOption\n key={key}\n label={val}\n value={getOptionValue(x.c + '', val ?? '', row)}>\n <span class=\"gv-select__option--label\">{val}</span>\n <span class=\"gv-select__option--value\">{x.c}</span>\n {columnTexts.map((text, index) => (\n <span\n key={index}\n class=\"gv-select__option--column\">\n {text}\n </span>\n ))}\n </ElOption>\n );\n };\n\n /**\n * @todo: selected call back\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:27:07\n * @param {*} val\n */\n const handleChange = async (val: any) => {\n if (isEmptySelectValue(val)) return;\n let labels: string = '';\n const labelArr: string[] = [];\n if (props.multiple === true)\n options.value.forEach((x) => {\n if (Array.isArray(val) && val.some((ele) => ele === x.c)) labelArr.push(x.t ?? '');\n });\n else if (typeof val === 'object') labels = val.label ?? '';\n else {\n const opArr = options.value.filter((x) => {\n const v = val + '';\n return x.c + '' === v;\n });\n labels = opArr[0]?.t ?? '';\n if (labels) labels = labels.split('[')[0];\n }\n if (props.bizType === 'tableedit')\n if (props.multiple === true) {\n emit('change', val, labelArr, props.columnProp);\n await props.cb(val, props.columnProp, props.dicType, labelArr, props.editRow);\n } else {\n emit('change', val, labels, props.columnProp);\n await props.cb(val, props.columnProp, props.dicType, labels, props.editRow);\n }\n else if (props.multiple === true) {\n emit('change', val, labelArr);\n await props.cb(val, props.vref, props.dicType);\n } else {\n emit('change', val, labels);\n await props.cb(val, props.vref, props.dicType);\n }\n };\n /**\n * @todo: handle update modelValue\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 11:29:17\n * @param {*} value\n */\n const handleUpdate = (value: any): void => {\n if (isEmptySelectValue(value)) {\n inputValue.value = undefined as typeof inputValue.value;\n selectValue.value = undefined;\n emit('update:modelValue', '');\n return;\n }\n inputValue.value = value;\n selectValue.value = value;\n emit('update:modelValue', value);\n };\n\n if (props.dicType === undefined || props.dicType === null) alert(`[ ${props.label} ] - The dicType needs to be set`, 'warning');\n\n // @render\n return () => {\n const render =\n remote.value === false ? (\n <ElSelect\n ref=\"gv-select\"\n id={resolvedInputId.value}\n name={props.name}\n modelValue={elSelectModel.value}\n valueKey=\"value\"\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={sPlaceholder.value}\n disabled={props.disabled}\n clearable={props.clearable}\n size={selectSize.value}\n multiple={props.multiple}\n filterable={inputFilterable.value}\n filter-method={filterMethod}\n default-first-option={true}\n collapseTags={props.collapseTags}\n onClear={handleClear}\n onFocus={handleFocus}\n onVisible-change={handleVisibleChange}\n onChange={handleChange}\n class={className.value}>\n {{\n prefix: () => <i class={dicIcon}></i>,\n default: () => options.value.map((x) => renderSelectOption(x)),\n }}\n </ElSelect>\n ) : (\n <ElSelect\n ref=\"gv-select\"\n id={resolvedInputId.value}\n name={props.name}\n modelValue={elSelectModel.value}\n valueKey=\"value\"\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={sPlaceholder.value}\n disabled={props.disabled}\n clearable={props.clearable}\n size={selectSize.value}\n multiple={props.multiple}\n default-first-option={true}\n filterable={inputFilterable.value}\n remote={true}\n remote-method={remoteMethod}\n debounce={300}\n loading={loading.value}\n loading-text={loadingText.value}\n collapseTags={props.collapseTags}\n onClear={handleClear}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n class={className.value}>\n {{\n prefix: () => <i class={dicIcon}></i>,\n default: () => options.value.map((x) => renderTableOption(x)),\n }}\n </ElSelect>\n );\n return render;\n };\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-select';\n .#{$prefixCls} {\n vertical-align: middle; // fixme: 注意必须有这个参数,否则作为一行最后的列会导致串行\n :deep(.el-select__wrapper) {\n &.is-focus {\n .el-input__inner {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n .el-select__prefix {\n left: 5px !important;\n width: 15px !important;\n\n .iconfont {\n //font-size: $appTextSize;\n }\n }\n\n .el-select__placeholder {\n //font-size: $appTextSize;\n }\n }\n\n &.tableedit {\n :deep(.el-select__wrapper) {\n .el-select__input {\n padding-right: 5px !important;\n //font-size: $appTextSize;\n }\n\n .el-select__suffix {\n width: 0;\n }\n }\n }\n }\n\n .#{$gvNamespace}-select__table {\n vertical-align: middle; // fixme: 注意必须有这个参数,否则作为一行最后的列会导致串行\n :deep(.el-select__wrapper) {\n .el-select__prefix {\n left: 5px !important;\n width: 15px !important;\n\n .iconfont {\n //font-size: $appTextSize;\n }\n }\n .el-select__selection {\n //font-size: $appTextSize;\n }\n\n &.is-focus .el-select__input {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n &.tableedit {\n :deep(.el-select__wrapper) {\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSelect from './src/GvSelect.vue';\n// Define the install method on the GvButton component\nconst GvSelectPlugin = {\n install(app: App): void {\n app.component(GvSelect.name ?? 'GvSelect', GvSelect);\n },\n};\nexport default GvSelectPlugin;\n\nexport { GvSelect };\n","<!--\n * @title: switch component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 13:26:26\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-12 09:55:07\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElSwitch } from 'element-plus';\n import { defineComponent, ref, watch, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('switch');\n export default defineComponent({\n name: 'GvSwitch',\n props: {\n value: {\n type: [Boolean, Number, String] as PropType<boolean | number | string>,\n required: false,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n columnKey: {\n type: String,\n required: false,\n default: undefined,\n },\n target: {\n type: [Number, String] as PropType<number | string>,\n require: false,\n default: '100201',\n },\n },\n\n // emit\n emits: ['change'],\n setup(props, { emit }) {\n // @data\n const val = ref(props.value);\n const switchType = ref(true);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n val.value = newVal;\n switchType.value = val.value === props.target;\n },\n );\n watch(\n () => switchType.value,\n (newVal) => {\n val.value === newVal;\n },\n );\n\n // @methods\n const handleChange = (newStatus) => {\n emit('change', newStatus, val.value);\n };\n\n // @created\n switchType.value = val.value === props.target;\n\n // @render\n return () => (\n <ElSwitch\n ref=\"gv-switch\"\n v-model={switchType.value}\n key={props.columnKey}\n disabled={props.disabled}\n // active-color='#13ce66'\n // inactive-color='#ff4949'\n onChange={handleChange}\n class={prefixCls}\n />\n );\n },\n });\n</script>\n<style scoped lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-switch';\n .#{$prefixCls} {\n &.is-checked {\n :deep(.el-switch__core) {\n background-color: #13ce66;\n border-color: #13ce66;\n }\n }\n\n :deep(.el-switch__core) {\n background-color: #b3aaaa;\n border-color: #b3aaaa;\n //background-color:#ff4949;\n //border-color:#ff4949;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSwitch from './src/GvSwitch.vue';\n// Define the install method on the GvButton component\nconst GvSwitchPlugin = {\n install(app: App): void {\n app.component(GvSwitch.name ?? 'GvSwitch', GvSwitch);\n },\n};\nexport default GvSwitchPlugin;\n\nexport { GvSwitch };\n","<!--\n * @title: time picker\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 09:18:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 13:47:53\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import { ElTimePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TTimePickerSize, TTimePickerType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('timepicker');\n\n export default defineComponent({\n name: 'GvTimePicker',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: [Date, Array, String] as PropType<TTimePickerType>,\n default: undefined,\n },\n readonly: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<TTimePickerSize>,\n default: 'default',\n },\n isRange: {\n type: Boolean,\n default: false,\n },\n disabledHours: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n disabledMinutes: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n disabledSeconds: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n rangeSeparator: {\n type: String,\n default: '-',\n },\n format: {\n type: String,\n default: 'HH:mm',\n },\n valueFormat: {\n type: String,\n default: 'HH:mm',\n },\n placeholder: {\n type: String,\n default: '00:00',\n },\n startPlaceholder: {\n type: String,\n default: '',\n },\n endPlaceholder: {\n type: String,\n default: '',\n },\n editable: {\n type: Boolean,\n default: true,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n },\n\n emits: ['update:modelValue', 'change', 'blur', 'focus'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useBridgeI18n();\n const globalSize = useGlobalConfig('size');\n const inputValue = ref<TTimePickerType>(props.modelValue);\n const timepickerSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n /**\n *@todo: 更新v-model值\n *@author: bugcao\n *@date: 2026-05-07 15:45:52\n *@version: v0.0.1\n */\n const handleUpdate = (value: TTimePickerType) => {\n inputValue.value = value;\n emit('update:modelValue', value);\n };\n /**\n *@todo: 合并禁用小时\n *@author: bugcao\n *@date: 2026-05-08 09:02:30\n *@version: v0.0.1\n */\n const mergedDisabledHours = () => props.disabledHours;\n /**\n *@todo: 合并禁用分钟\n *@author: bugcao\n *@date: 2026-05-08 09:02:30\n *@version: v0.0.1\n */\n const mergedDisabledMinutes = () => props.disabledMinutes;\n /**\n *@todo: 合并禁用秒\n *@author: bugcao\n *@date: 2026-05-08 09:02:30\n *@version: v0.0.1\n */\n const mergedDisabledSeconds = () => props.disabledSeconds;\n /**\n *@todo: 更新change事件\n *@author: bugcao\n *@date: 2026-05-07 15:46:09\n *@version: v0.0.1\n */\n const handleChange = (value: TTimePickerType) => {\n emit('change', value);\n };\n /**\n *@todo: 更新blur事件\n *@author: bugcao\n *@date: 2026-05-07 15:46:12\n *@version: v0.0.1\n */\n const handleBlur = (e: FocusEvent) => {\n emit('blur', e);\n };\n /**\n *@todo: 更新focus事件\n *@author: bugcao\n *@date: 2026-05-07 15:46:12\n *@version: v0.0.1\n */\n const handleFocus = (e: FocusEvent) => {\n emit('focus', e);\n };\n\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @render\n return () => (\n <div class={prefixCls}>\n <ElTimePicker\n ref={props.vref || 'gv-timepicker'}\n id={resolvedInputId.value}\n name={props.name}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleUpdate}\n readonly={props.readonly}\n disabled={props.disabled}\n editable={props.editable}\n clearable={props.clearable}\n is-range={props.isRange}\n range-separator={props.rangeSeparator}\n size={timepickerSize.value}\n placeholder={props.placeholder || t('common.selectTime')}\n start-placeholder={props.startPlaceholder || t('common.startTime')}\n end-placeholder={props.endPlaceholder || t('common.endTime')}\n format={props.format}\n value-format={props.valueFormat}\n disabled-hours={mergedDisabledHours}\n disabled-minutes={mergedDisabledMinutes}\n disabled-seconds={mergedDisabledSeconds}\n {...({\n onChange: handleChange,\n onBlur: handleBlur,\n onFocus: handleFocus,\n } as any)}\n />\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-timepicker';\n .#{$prefixCls} {\n width: 100%;\n vertical-align: middle;\n :deep(.el-icon-time) {\n margin-left: 1px;\n }\n &.el-range-editor.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n :deep(.el-input__wrapper) {\n &:is(.is-focus) {\n box-shadow: 0 0 0 1px var(--primaryColorHover, $primaryColorHover) inset;\n }\n }\n :deep(.el-input__inner) {\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n :deep(.el-range__close-icon) {\n width: 20px;\n }\n :deep(.el-range-separator) {\n padding-right: 2px;\n padding-left: 0;\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTimePicker from './src/GvTimePicker.vue';\n\nconst GvTimePickerPlugin = {\n install(app: App): void {\n app.component(GvTimePicker.name ?? 'GvTimePicker', GvTimePicker);\n },\n};\nexport default GvTimePickerPlugin;\n\nexport { GvTimePicker };\n","/*\n * @title: info message component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:10:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-04 22:01:59\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nconst infoMsg = {\n carNo: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '车牌号格式错误';\n else info = 'car number format error.';\n return info;\n },\n double: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入浮点数.';\n else info = 'please enter Double.';\n return info;\n },\n decimal: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh-CN') info = '小数点位数不能超过: ' + len + ' 位';\n else info = 'Number of decimal places can not be more than:' + len + '.';\n return info;\n },\n idCard: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '身份证格式不正确';\n else info = 'id card format is not correct.';\n return info;\n },\n maxLen: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能超过 ' + Math.floor(len / 2) + '个汉字或 ' + len + ' 个字符';\n else info = 'Can not exceed ' + len + ' character.';\n return info;\n },\n money: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '非0开头的数字 小数最多两位.';\n else info = \"Only input Numbers, 0 can't start, the decimal two at the most.\";\n return info;\n },\n moneyMax: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh-CN') info = '整数位最多只能是: ' + len + ' 位';\n else info = 'integer digits can only be at most: ' + len;\n return info;\n },\n letter: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能输入字母以外的字符';\n else info = \"Can't input letters outside of the characters.\";\n return info;\n },\n number: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '只能输入正整数.';\n else info = 'Only enter a positive integer.';\n return info;\n },\n number0: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '只能输入不能以0开头的正整数.';\n else info = 'Only enter a non-zero positive integer, and cannot begin with zero.';\n return info;\n },\n //Add TypeScript type annotations for lang parameter\n numberLetter: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能输入数字、字母以外的字符.';\n else info = 'Can not input Numbers, letters characters.';\n return info;\n },\n //Add TypeScript type annotations for lang parameter\n name: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能输入数字、字母、-、_和中文以外的字符.';\n else info = 'Can not enter Numbers, letters, -, _ and Chinese characters.';\n return info;\n },\n phone: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '电话号码格式不正确.';\n else info = 'Phone format is not correct.';\n return info;\n },\n email: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '邮件格式不正确.';\n else info = 'E-mail format is not correct.';\n return info;\n },\n telephone: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的固话(格式:区号+号码,如010-1234567)';\n else info = 'Telephone format is not correct.';\n return info;\n },\n ip: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的IP地址';\n else info = 'IpAddress format is not correct.';\n return info;\n },\n url: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的url地址';\n else info = 'Url format is not correct.';\n return info;\n },\n phoneTel: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的电话号码或者固话号码';\n else info = 'phone & tel format is not correct.';\n return info;\n },\n vin: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入后8位或17位(字母大写)';\n else info = 'must be 8 or 17 letters and Numbers.';\n return info;\n },\n};\nexport default infoMsg;\n","/*\n * @title: validate rules component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:09:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-04 20:32:12\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n/** ------------------- 验证规则 ------------------------\n * isAny: 默认规则,无校验\n * isAdmin: 验证是否是admin用户\n * isUrl: 验证url格式\n * isLowercase: 验证是否都是小写\n * isUppercase: 验证是否都是大写\n * isLetter: 验证是否都是字母( 不包括标点符号)\n * isEmail: 验证是否是email\n * isPhone: 验证电话号码\n * isIp: 验证是否是ip地址\n * isPhoneTel: 验证是否是手机号或者固定电话号\n * isTelephone: 验证是否是固定电话\n * isIdcard: 验证身份证号\n * isMoney:验证金额格式\n * isBigMoney: 验证金额格式(千位符格式)\n * isNumber: 验证是否是整数数字\n * isNumberLetter: 验证是否是数字和字母\n * isDouble: 验证浮点数格式\n * isName: 验证是否是名称格式\n * isVin: 验证vin码格式\n * isCarno: 验证车牌号(含新能源)\n ----------------------------------------------------\n*/\n\nimport infoMsg from './gv.infomsg';\n\n/**\n * @todo: 计算输入字符串的长度,汉字记为2 英文字母记为1\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 14:56:22\n * @param {*} val 对于多选字典,val是数组类型的字典码\n */\nconst calLength = function (val) {\n if (val === null || val.length === 0) return 0;\n let i, sum;\n sum = 0;\n // fixme: val有可能是数组,需要转化为字符串 2022-04-10\n let v = val;\n if (Array.isArray(val)) v = val.join(',');\n for (i = 0; i < v.length; i++)\n if (v.charCodeAt(i) >= 32 && v.charCodeAt(i) <= 126) sum = sum + 1;\n else sum = sum + 2;\n return sum;\n};\n\nconst vcity = {\n 11: '北京',\n 12: '天津',\n 13: '河北',\n 14: '山西',\n 15: '内蒙古',\n 21: '辽宁',\n 22: '吉林',\n 23: '黑龙江',\n 31: '上海',\n 32: '江苏',\n 33: '浙江',\n 34: '安徽',\n 35: '福建',\n 36: '江西',\n 37: '山东',\n 41: '河南',\n 42: '湖北',\n 43: '湖南',\n 44: '广东',\n 45: '广西',\n 46: '海南',\n 50: '重庆',\n 51: '四川',\n 52: '贵州',\n 53: '云南',\n 54: '西藏',\n 61: '陕西',\n 62: '甘肃',\n 63: '青海',\n 64: '宁夏',\n 65: '新疆',\n 71: '台湾',\n 81: '香港',\n 82: '澳门',\n 91: '国外',\n};\n// 校验浮点数位数\nconst checkDecimal = function (val, decimalLen) {\n let v = val + '';\n if (v && v.indexOf('.') > 0) {\n v = v.substr(v.indexOf('.') + 1, v.length);\n if (v.length <= decimalLen) return true;\n else return false;\n } else return true;\n};\n// 取身份证前两位,校验省份\nconst checkProvince = function (card) {\n const province = card.substr(0, 2);\n if (vcity[province] === undefined) return false;\n\n return true;\n};\n\n// 校验日期\nconst verifyBirthday = function (year: number, month: number, day: number, birthday: Date) {\n const now = new Date();\n const now_year = now.getFullYear();\n // 年月日是否合理\n if (birthday.getFullYear() === +year && birthday.getMonth() + 1 === +month && birthday.getDate() === +day) {\n // 判断年份的范围(3岁到100岁之间)\n const time = now_year - Number(year);\n if (time >= 3 && time <= 100) return true;\n return false;\n }\n return false;\n};\n\n// 检查生日是否正确\nconst checkBirthday = function (card) {\n const len = card.length;\n // 身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字\n if (len === 15) {\n const re_fifteen = /^(\\d{6})(\\d{2})(\\d{2})(\\d{2})(\\d{3})$/;\n const arr_data = card.match(re_fifteen);\n const year = arr_data[2];\n const month = arr_data[3];\n const day = arr_data[4];\n const birthday = new Date('19' + year + '/' + month + '/' + day);\n return verifyBirthday(Number('19' + year), month, day, birthday);\n }\n // 身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X\n if (len === 18) {\n const re_eighteen = /^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$/;\n const arr_data = card.match(re_eighteen);\n const year = arr_data[2];\n const month = arr_data[3];\n const day = arr_data[4];\n const birthday = new Date(year + '/' + month + '/' + day);\n return verifyBirthday(year, month, day, birthday);\n }\n return false;\n};\n// 15位转18位身份证号\nconst changeFivteenToEighteen = function (card) {\n if (card.length === 15) {\n const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let cardTemp = 0;\n let i;\n card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);\n for (i = 0; i < 17; i++) cardTemp += card.substr(i, 1) * arrInt[i];\n\n card += arrCh[cardTemp % 11];\n return card;\n }\n return card;\n};\n\n// 校验位的检测\nconst checkParity = function (card) {\n // 15位转18位\n card = changeFivteenToEighteen(card);\n const len = card.length;\n if (len === 18) {\n const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let cardTemp = 0;\n let valnum = '';\n for (let i = 0; i < 17; i++) cardTemp += card.substr(i, 1) * arrInt[i];\n\n valnum = arrCh[cardTemp % 11];\n if (valnum === card.substr(17, 1)) return true;\n\n return false;\n }\n return false;\n};\n\nconst htValidate = {\n isLength: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language, max = 30 } = rule;\n const len = calLength(value);\n if (len > max) callback(new Error(infoMsg.maxLen(language, max)));\n else callback();\n }\n },\n isDouble: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const reg = /^(-)?\\d+(\\.\\d+)?$/;\n const { language, decimal = 2 } = rule;\n if (!reg.test(value)) callback(new Error(infoMsg.double(language)));\n else if (checkDecimal(value, decimal)) callback();\n else callback(new Error(infoMsg.decimal(language, decimal)));\n }\n },\n isIdcard: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n // 校验长度\n const reg = /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/;\n if (!reg.test(value)) callback(new Error(infoMsg.idCard(language)));\n else if (checkProvince(value) === false)\n // 检查省份\n callback(new Error(infoMsg.idCard(language)));\n else if (checkBirthday(value) === false)\n // 校验生日\n callback(new Error(infoMsg.idCard(language)));\n else if (checkParity(value) === false)\n // 检验位的检测\n callback(new Error(infoMsg.idCard(language)));\n else callback();\n }\n },\n\n isCarno: (rule, value, callback) => {\n const { language } = rule;\n if (value === '' || value === undefined || value == null) return callback();\n else if (value.length === 7) {\n const pattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;\n if (!pattern.test(value)) callback(new Error(infoMsg.carNo(language)));\n else return callback();\n } else {\n const pattern2 = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DABCEFGHJK][A-HJ-NP-Z0-9][0-9]{4}$))/;\n if (!pattern2.test(value)) callback(new Error(infoMsg.carNo(language)));\n else return callback();\n }\n },\n\n isMoney: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return callback();\n else {\n const { language, max } = rule;\n // eslint-disable-next-line no-useless-escape\n const pattern = /^[\\-\\+]?(([1-9]\\d*)|0)(\\.\\d{1,2})?$/;\n const val = value + '';\n // var rv = val.replace(/[,]/g, '');\n if (!pattern.exec(val)) callback(new Error(infoMsg.money(language)));\n else if (val.indexOf('.') > 0)\n if (val.split('.')[0].length > max - 3)\n // 校验整数位格式只能是maxLength -3\n callback(new Error(infoMsg.moneyMax(language, max - 3)));\n else return callback();\n else if (value.length > max - 3) callback(new Error(infoMsg.moneyMax(language, max - 3)));\n else return callback();\n }\n },\n\n isBigMoney: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n // eslint-disable-next-line no-useless-escape\n const reg = /^[\\-\\+]?([0-9]\\d*|0|[1-9]\\d{0,2}(,\\d{3})*)(\\.\\d+)?$/;\n if (!reg.test(value)) callback(new Error(infoMsg.money(language)));\n else callback();\n }\n },\n\n isLetter: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^[A-Za-z]+$/;\n if (!reg.test(value)) callback(new Error(infoMsg.letter(language)));\n else callback();\n }\n },\n\n isNumber: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^\\+?[0-9][0-9]*$/;\n if (!reg.test(value)) callback(new Error(infoMsg.number(language)));\n else callback();\n }\n },\n\n isNumber0: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^\\+?[1-9][0-9]*$/;\n if (!reg.test(value)) callback(new Error(infoMsg.number0(language)));\n else callback();\n }\n },\n\n isNumberLetter: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^([a-z]|[A-Z]|[ ]|[(]|[)]|[-]|[_]|[*]|[.]|[,]|[,]|[0-9]){0,200}$/;\n if (!reg.test(value)) callback(new Error(infoMsg.numberLetter(language)));\n else callback();\n }\n },\n\n isName: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^[a-zA-Z0-9-_. \\u4E00-\\u9FA5]{0,60}$/;\n if (!reg.test(value)) callback(new Error(infoMsg.name(language)));\n else callback();\n }\n },\n\n isPhone: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const reg = /^1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\\d{8}$/;\n if (!reg.test(value)) {\n const { language = 'zh-CN' } = rule;\n callback(new Error(infoMsg.phone(language)));\n } else callback();\n }\n },\n\n isEmail: (rule, value, callback) => {\n // eslint-disable-next-line no-useless-escape\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n // eslint-disable-next-line no-useless-escape\n const reg = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n if (!reg.test(value)) callback(new Error(infoMsg.email(language)));\n else callback();\n }\n },\n\n isTelephone: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /0\\d{2}-\\d{7,8}/;\n if (!reg.test(value)) callback(new Error(infoMsg.telephone(language)));\n else callback();\n }\n },\n\n isPhoneTel: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^((0\\d{2,3}-\\d{7,8})|(1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\\d{8}))$/;\n if (!reg.test(value)) callback(new Error(infoMsg.phoneTel(language)));\n else callback();\n }\n },\n\n isIp: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$/;\n if (!reg.test(value)) callback(new Error(infoMsg.ip(language)));\n else callback();\n }\n },\n\n isUrl: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg =\n /^(https?|ftp):\\/\\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+\\.?(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\\/($|[a-zA-Z0-9.,?'\\\\+&%$#=~_-]+))*$/;\n if (!reg.test(value)) callback(new Error(infoMsg.url(language)));\n else callback();\n }\n },\n\n isVin: (rule, value, callback) => {\n const { language } = rule;\n const reg = /^[A-Z0-9]+$/;\n if (value === '' || value === undefined || value == null) callback();\n else if (value.length !== 8 && value.length !== 17) callback(new Error(infoMsg.vin(language)));\n else if (!reg.test(value)) callback(new Error(infoMsg.vin(language)));\n else callback();\n },\n};\n\nexport default htValidate;\n","<!--\n * @title: form component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:01:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 18:04:49\n * @version: 1.1.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { useBridgeI18n } from '@@/bridge';\n import { GvCascader } from '@@/GvCascader';\n import { GvDatePicker } from '@@/GvDatePicker';\n import { GvDivider } from '@@/GvDivider';\n import { GvInput } from '@@/GvInput';\n import { GvInputNumber } from '@@/GvInputNumber';\n import { GvSelect } from '@@/GvSelect';\n import { GvSwitch } from '@@/GvSwitch';\n import { GvTimePicker } from '@@/GvTimePicker';\n import { addClass, dateFormatConfig, hasScrollbar, removeClass, sleep, toHump } from '@@/utils';\n import gvValidate from '@@/utils/gv.validate';\n import { ElCol, ElForm, ElFormItem, ElInput, ElRadio, ElRadioButton, ElRadioGroup, ElRow, ElTooltip, useGlobalConfig, type ComponentSize, type FormInstance, type FormItemRule } from 'element-plus';\n import { computed, defineComponent, getCurrentInstance, nextTick, onMounted, provide, ref, Transition, unref, watch, type PropType, type VNode } from 'vue';\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('form');\n\n export default defineComponent({\n name: 'GvForm',\n props: {\n refForm: {\n type: String,\n required: true,\n },\n divider: {\n type: String,\n required: false,\n default: undefined,\n },\n isDivider: {\n type: Boolean,\n required: false,\n default: true,\n },\n formList: {\n type: Array as PropType<FormItem[]>,\n required: true,\n default: () => [],\n },\n size: {\n type: String as PropType<ComponentSize>,\n required: false,\n default: undefined,\n },\n labelWidth: {\n type: [Number, String] as PropType<number | string>,\n default: 100,\n },\n formStyle: {\n // 响应式布局 使用该参数定义width\n type: [Object],\n required: false,\n default: () => {},\n },\n scroller: {\n // 是否带有滚动条\n type: Boolean,\n required: false,\n default: true,\n },\n },\n setup(props, { slots, expose }) {\n const searchFieldsCollapsed = ref(true); // 查询 form 默认折叠超出行数字段\n // @provide\n provide('refForm', props.refForm);\n provide('formList', props.formList);\n provide('searchFieldsCollapsed', searchFieldsCollapsed);\n\n // @data\n const appStore = useAppStore();\n const userStore = useUserStore();\n const { t } = useBridgeI18n();\n\n const originFormList = ref([]);\n const instance = getCurrentInstance ? getCurrentInstance() : ({ parent: null } as any);\n\n const formRefs = ref<Record<string, FormInstance | null>>({}); // 表单实例引用,默认空对象\n const formElRef = ref<FormInstance | null>(null); // ElForm 元素引用\n\n const setFormRef = (el: FormInstance | null) => {\n formElRef.value = el;\n if (el && props.refForm) formRefs.value[props.refForm] = el;\n };\n const globalSize = useGlobalConfig('size');\n const rootNodeStyle = ref({}); // form组件根节点div样式\n const isShow = ref(true); // form表单show状态,默认显示\n const rules = ref({}); // 表单校验规则,默认空对象\n const isEditContainer = ref(false); // 是否是editContainer标签内,默认false\n const sMaxHeight = ref(0); // 表单最大高度,默认0\n const isScrollbar = ref(false); // 是否dialog中有滚动条\n const isAnchor = ref(false); // 是否锚点中列表\n const model = ref({}); // 表单数据,默认空对象\n const isDialog = ref(false); // 是否是dialog中form表单,默认false\n const colSpanNums = ref(0); // 根据form宽度或屏幕宽度计算显示列数,默认0\n const formType = ref('s'); // form类型:查询form:s、表单form:e\n const styles = ref({}); // form表单style样式,默认空对象\n\n // @computed\n const formSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const labelPosition = computed(() => appStore.labelPosition); // 表单label位置\n const searchDivider = computed(() => appStore.searchDivider); // search divider show,default: true\n const dict = computed<DicItems>(() => appStore.getDict); // 字典数据\n const dictCache = computed(() => userStore.dictCache); // 字典缓存\n\n // @exposed\n expose({\n originFormList,\n setFormRef,\n });\n // method\n const getLanguage = (lang: string, x: any) => {\n let v = '';\n switch (lang) {\n case 'zh-CN':\n v = x.t;\n break;\n case 'en':\n v = x.e;\n break;\n case 'l1':\n v = x.l1;\n break;\n case 'l2':\n v = x.l2;\n break;\n default:\n v = x.t;\n break;\n }\n if (!v) v = x.t;\n return v;\n };\n /**\n * @todo: set divider show status\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 18:12:34\n * @param {*} show\n */\n const setDividerShow = (show: boolean) => {\n isShow.value = show;\n };\n\n const getEditBar = computed(() => {\n if (slots.editbar?.())\n return (\n <ElRow\n ref-form={props.refForm}\n class=\"gv-form-editbar\">\n {slots.editbar?.()}\n </ElRow>\n );\n else return null;\n });\n\n const getDivider = computed(() => {\n let dividerRender: VNode | null = null;\n if (searchDivider.value !== false) {\n let dividerTitle: string;\n if (props.divider) dividerTitle = props.divider;\n else dividerTitle = t('common.dividerTitle');\n if (props.isDivider)\n dividerRender = (\n <GvDivider\n label={dividerTitle}\n target={props.refForm}\n visible={isShow.value}\n onSetDividerShow={setDividerShow}\n />\n );\n }\n\n return dividerRender;\n });\n\n /**\n * @todo: get dic item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 18:13:06\n * @param {*} src\n */\n const getDictItems = (src: string): DicItem[] => {\n let ret = [] as DicItem[];\n const dictCacheTmp: DicItem[] | undefined = dictCache.value?.[src];\n if (dictCacheTmp) ret = dictCacheTmp;\n else {\n // 生成字典列表\n const dictTmp: DicItem[] | undefined = dict.value[src];\n if (dictTmp) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dictTmp;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n\n ret = dictTmp;\n }\n }\n return ret;\n };\n /**\n * @todo: generate form item rules\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 20:31:59\n * @param {*} _item\n */\n const getItemRules = (_item: FormItem): FormItemRule[] => {\n const rules: FormItemRule[] = [];\n const format: FormItemFormat | undefined = _item.format;\n // 富文本不校验\n if (_item.type === 'richtext') return rules;\n if (!format) return rules;\n // ========== 必填校验 ==========\n const requiredFlag = Number(format[0]);\n if (requiredFlag === 1 && !_item.hidden)\n rules.push({\n required: true,\n message: `${t('common.pleaseInput')} ${_item.label ?? ''}`,\n trigger: 'blur',\n });\n // ========== 自定义校验 ==========\n let validateKey = 'isAny';\n if (format[1]) validateKey = toHump(String(format[1]));\n const maxLen = Number(format[2] ?? 30);\n const decimal = format.length >= 4 ? Number(format[3] ?? 0) : 0;\n const validator = gvValidate[validateKey as keyof typeof gvValidate];\n if (validator && validateKey !== 'isAny')\n rules.push({\n validator: validator,\n trigger: ['change', 'blur'],\n // Element Plus 透传参数(自定义字段)\n language: userStore.language,\n max: maxLen,\n decimal,\n } as FormItemRule);\n // ========== 长度校验 ==========\n const excluded = ['isDate', 'isDateTime', 'isTime', 'isDic'];\n if (format[2] && !excluded.includes(validateKey))\n rules.push({\n language: userStore.language,\n max: maxLen,\n validator: gvValidate['isLength'],\n trigger: ['change', 'blur'],\n } as FormItemRule);\n return rules;\n };\n const handleRadioInput = (event: any, field: string, val, formVal, disabled) => {\n if (disabled) return;\n if (val === formVal) {\n event.preventDefault();\n model.value[field] = '';\n }\n };\n const handleDateRange2Focus = (vm: any) => {\n sleep(100).then(() => {\n addClass(vm.$el.closest('.gv-daterange__single'), 'is-active');\n });\n };\n const handleDateRange2Blur = (vm: any) => {\n removeClass(vm.$el.closest('.gv-daterange__single'), 'is-active');\n };\n\n /**\n * @todo: 日期范围选择,单独选择开始日期、结束日期选择回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 19:49:03\n * @param {*} type\n * @param {*} val\n * @param {*} field\n */\n const handleDateRange2Change = (type: string, val: string | Date, field: string): void => {\n // 校验开始日期和结束日期大小\n if (type === 's')\n if (val && model.value[field + '-end']) {\n const endTime = new Date(model.value[field + '-end'] as string).getTime();\n const startTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model.value[field + '-end'] = '';\n model.value[1] = 'null';\n }\n }\n\n if (type === 'e')\n if (val && model.value[field + '-start']) {\n const startTime = new Date(model.value[field + '-start'] as string).getTime();\n const endTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model.value[field + '-start'] = '';\n // console.log(this.model);\n model.value[1] = 'null';\n }\n }\n\n if (!field) return;\n const datePicker = model.value[field];\n let dateArr = new Array(2);\n if (Array.isArray(datePicker)) {\n if (type === 's') datePicker[0] = val;\n else datePicker[1] = val;\n if (!datePicker[0]) datePicker[0] = 'null';\n if (!datePicker[1]) datePicker[1] = 'null';\n model.value[field] = datePicker.join(',');\n } else {\n if (datePicker && typeof datePicker === 'string') dateArr = datePicker.split(',');\n dateArr[0] = model.value[field + '-start'];\n dateArr[1] = model.value[field + '-end'];\n if (!dateArr[0]) dateArr[0] = 'null';\n if (!dateArr[1]) dateArr[1] = 'null';\n model.value[field] = dateArr.join(',');\n }\n };\n /**\n * @todo: switch框字典change回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-12-21 16:47:22\n * @param {*} val\n * @param {*} field\n * @param {*} dicType\n * @param {*} cb\n */\n const handleSwitchDictChange = async (val, field, dicType, cb) => {\n switch (dicType) {\n case 'yxzt':\n if (val === true) model.value[field] = '100201';\n else model.value[field] = '100202';\n break;\n case 'sf':\n if (val === true) model.value[field] = '100101';\n else model.value[field] = '100102';\n break;\n }\n if (cb)\n try {\n await cb(val, field, dicType);\n } catch (error) {\n console.log(error);\n }\n };\n /**\n * @todo: radio框字典change回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-22 15:50:15\n * @param {*} val\n * @param {*} field\n * @param {*} dicType\n * @param {*} cb\n */\n const handleRadioDictChange = async (val, field, dicType: string | undefined, cb: Fn | undefined) => {\n if (cb)\n try {\n await cb(val, field, dicType);\n } catch (error) {\n console.log(error);\n }\n };\n /**\n * @todo: 查询 form 列默认折叠 class(渲染时绑定,避免重渲染丢失)\n */\n const getSearchColClass = (index: number) => {\n if (formType.value !== 's' || !searchFieldsCollapsed.value) return undefined;\n const slot = slots.default?.()?.[0];\n const slotProps = slot?.props as Recordable | undefined;\n if (slotProps?.expand === false) return undefined;\n const showDefaultRow = appStore.searchFormRows === 1 ? 4 : 8;\n if (index >= showDefaultRow - 1) return 'gv-form-col--hidden';\n return undefined;\n };\n\n /**\n * @todo: render form item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:54:23\n * @param {*} _item\n * @param {*} _index\n */\n const renderFormItem = (_item: FormItem, _index: number): VNode => {\n const {\n type = 'text',\n label,\n field,\n hidden = false,\n disabled,\n format = [],\n placeholder,\n readonly = false,\n dateType = 'date',\n dicType,\n filtercode,\n colspan = 1,\n disabledDateFunc,\n disabledDate,\n editable = true,\n multiple = false,\n showLabel,\n size = formSize.value,\n visible = true,\n // offset,\n createRow = false, // 是否创建新row,\n dicRemote,\n cb, // 回调方法\n clear, // 清空回调\n rows, // textarea\n autosize, // textarea\n min, // input-number\n max, // input-number\n step, // input-number\n precision, // input-number\n blur = () => {},\n suffixIcon, // 后缀icon\n prefixIcon, // 前缀icon\n focus = () => {},\n change = () => {},\n defaultTime, // 时间的默认能够选择的时间\n isreload = true, // 表选字典是否重新加载\n options = [],\n lazy = false, // cascader是否懒加载\n lazyLoad = () => {}, // cascader懒加载方法\n render, // 自定义form样式\n } = _item;\n let renders;\n const isHidden = hidden === true;\n const maxLen = format[2] || 30;\n let cType = type;\n // const dateFormatConfig = dateFormatConfig;\n const validateRule = toHump(String(format[1] || ''));\n let sDateType = dateType;\n let isRange = false;\n let dateFormat = dateFormatConfig.date.valueFormat; // 日期显示格式\n let valueFormat = dateFormatConfig.date.valueFormat; // 日期绑定值格式\n if (sDateType !== 'daterange' && sDateType !== 'datetimerange' && sDateType !== 'daterange2' && sDateType !== 'datetimerange2') {\n if (validateRule === 'isDate') cType = 'date';\n if (validateRule === 'isDateTime') {\n cType = 'datetime';\n sDateType = 'datetime';\n }\n if (validateRule === 'isTime') cType = 'time';\n }\n\n if (sDateType === 'timerange') isRange = true;\n\n let ph = placeholder;\n let startPh = t('common.startDate');\n let endPh = t('common.endDate');\n // todo: 响应式布局计算\n // const cols = { span: colspan, offset: (_index) * 6 };\n let cols = colspan > 4 ? 4 : colspan; // fixme: 最大值不能超过4 2022-04-07\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') cols = 2;\n // update: 对于多选字典,默认占用列数为2列 2023-02-18\n if (multiple === true && colspan === undefined) cols = 2;\n let rangeSeparator;\n if (sDateType === 'timerange' || sDateType === 'daterange2' || sDateType === 'datetimerange2') rangeSeparator = t('common.until');\n const colSpanXs = 24;\n let colSpanSm = 12;\n let colSpanMd = 8;\n\n let colSpanLg = 6;\n if (isDialog.value === true) colSpanLg = 8;\n let colSpanXl = 4;\n if (isDialog.value === true) colSpanXl = 6;\n if (colSpanNums.value !== 0) {\n if (colSpanNums.value === 12) cols = colspan > 2 ? 2 : colspan;\n if (colSpanNums.value === 8) cols = colspan > 3 ? 3 : colspan;\n if (colSpanNums.value === 6 || colSpanNums.value === 4) cols = colspan > 4 ? 4 : colspan;\n colSpanSm = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanMd = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanLg = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanXl = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n } else {\n colSpanSm = cols * colSpanSm > 24 ? 24 : cols * colSpanSm;\n colSpanMd = cols * colSpanMd > 24 ? 24 : cols * colSpanMd;\n colSpanLg = cols * colSpanLg > 24 ? 24 : cols * colSpanLg;\n colSpanXl = cols * colSpanXl > 24 ? 24 : cols * colSpanXl;\n }\n let decimal = 2;\n let v = '';\n if (!ph)\n switch (validateRule) {\n case 'isMoney':\n ph = '0.00';\n break;\n case 'isBigMoney':\n ph = '0,000.00';\n break;\n case 'isEmail':\n ph = 'xx@xx.com';\n break;\n case 'isDouble':\n if (format.length >= 4) decimal = format[3] || 2;\n while (decimal > 0) {\n v = '0' + v;\n decimal--;\n }\n ph = '00.' + v;\n break;\n case 'isDate':\n if (sDateType === 'week') {\n ph = t('common.selectWeek'); // dateFormatConfig.week.placeholder;\n dateFormat = dateFormatConfig.week.dateFormat;\n } else if (sDateType === 'month' || sDateType === 'monthrange') {\n ph = t('common.selectMonth'); // dateFormatConfig.month.placeholder;\n startPh = ph;\n endPh = ph;\n dateFormat = dateFormatConfig.month.dateFormat;\n valueFormat = dateFormatConfig.month.valueFormat;\n } else if (sDateType === 'year') {\n ph = t('common.selectYear'); // dateFormatConfig.year.placeholder\n dateFormat = dateFormatConfig.year.dateFormat;\n valueFormat = dateFormatConfig.year.valueFormat;\n } else if (sDateType === 'daterange' || sDateType === 'daterange2') ph = t('common.selectDate');\n break;\n case 'isDateTime':\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') {\n startPh = t('common.startTime');\n endPh = t('common.endTime');\n }\n ph = t('common.selectTime'); // dateFormatConfig.datetime.placeholder;\n dateFormat = dateFormatConfig.datetime.dateFormat;\n valueFormat = dateFormatConfig.datetime.valueFormat;\n break;\n }\n let editables = editable;\n // 如果是带有禁用日期的,不可编辑,防止输入不一致问题\n if (disabledDateFunc || disabledDate) editables = false;\n let ops;\n let isTableDic = false;\n if (type === 'dic')\n if (dicType) {\n ops = getDictItems(dicType);\n if (dicType.indexOf('t#') >= 0) isTableDic = true;\n }\n\n // 设置label是否显示\n let sLabel = label;\n if (formType.value === 's') {\n sLabel = appStore.searchFormLabel === true ? label : undefined;\n if (appStore.searchFormLabel !== true) ph = label;\n }\n\n const switchDefaultVal = ref('');\n const searchColClass = getSearchColClass(_index);\n switch (cType) {\n case 'blank':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n prop={field}\n key={field}>\n <div class=\"el-input__inner gv-form__item__inner-blank\">&nbsp;</div>\n </ElFormItem>\n </ElCol>\n );\n break;\n case 'divider':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={24}\n sm={24}\n md={24}\n lg={24}\n xl={24}>\n <GvDivider label={sLabel} />\n </ElCol>\n );\n break;\n case 'render':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n {render?.(model.value[field], field)}\n </ElFormItem>\n </ElCol>\n );\n break;\n case 'text':\n renders = visible ? (\n // span={this.colSpan} {span:16,offset:4}\n // xs={24} sm={12} md={8} lg={6} xl={4}\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInput\n type=\"text\"\n vref={field}\n name={field}\n v-model={model.value[field]}\n value={model.value[field]}\n disabled={disabled}\n maxlength={maxLen}\n size={size as ComponentSize}\n placeholder={ph}\n visible={visible}\n readonly={readonly}\n onBlur={blur}\n onFocus={focus}\n suffixIcon={suffixIcon}\n prefixIcon={prefixIcon}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'textarea':\n renders = visible ? (\n // span={this.colSpan} {span:16,offset:4}\n // xs={24} sm={12} md={8} lg={6} xl={4}\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInput\n vref={field}\n name={field}\n type=\"textarea\"\n v-model={model.value[field]}\n value={model.value[field]}\n size={size as ComponentSize}\n disabled={disabled}\n maxlength={maxLen}\n placeholder={ph}\n visible={visible}\n readonly={readonly}\n rows={rows}\n autosize={autosize}\n onBlur={blur}\n onFocus={focus}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'time':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvTimePicker\n v-model={model.value[field]}\n vref={field}\n name={field}\n disabled={disabled}\n editable={editables}\n placeholder={ph}\n isRange={isRange}\n rangeSeparator={rangeSeparator}\n // format={dateFormat}\n // value-format={valueFormat}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'date':\n case 'datetime':\n if (sDateType !== 'daterange2' && sDateType !== 'datetimerange2')\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <GvDatePicker\n v-model={model.value[field]}\n modelValue={model.value[field]}\n vref={field}\n data-name={field}\n data-align={'right'}\n type={sDateType}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={disabledDate}\n editable={editables}\n placeholder={ph}\n default-time={defaultTime}\n startPlaceholder={startPh}\n endPlaceholder={endPh}\n data-visible={visible}\n onChange={change}\n />\n </ElFormItem>\n </ElCol>\n ) : null;\n else\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <div\n class=\"gv-daterange__single\"\n style=\"width: 100%;\"\n onFocus={() => void 0}>\n <GvDatePicker\n v-model={model.value[field + '-start']}\n modelValue={model.value[field + '-start']}\n vref={field + '-start'}\n data-name={field + '-start'}\n data-align={'right'}\n type={sDateType === 'daterange2' ? 'date' : 'datetime'}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={disabledDate}\n editable={editables}\n placeholder={startPh}\n default-time={defaultTime}\n data-visible={visible}\n style={{ width: '96% !important' }}\n class=\"gv-datepicker-range-start\"\n onChange={(val) => handleDateRange2Change('s', val, field)}\n onFocus={(vm) => handleDateRange2Focus(vm)}\n onBlur={(vm) => handleDateRange2Blur(vm)}\n />\n <span class=\"gv-daterange__single-separator\">{rangeSeparator}</span>\n <GvDatePicker\n v-model={model.value[field + '-end']}\n modelValue={model.value[field + '-end'] as string}\n vref={field + '-end'}\n data-name={field + '-end'}\n data-align={'right'}\n type={sDateType === 'daterange2' ? 'date' : 'datetime'}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={(date) => {\n if (sDateType === 'daterange2') return date.getTime() <= new Date(model.value[field + '-start']).getTime() - 8.64e7;\n else return date.getTime() <= new Date(model.value[field + '-start']).getTime() - 8.64e7;\n }}\n editable={editables}\n placeholder={endPh}\n default-time={defaultTime}\n data-visible={visible}\n class=\"gv-datepicker-range-end\"\n onChange={(val) => handleDateRange2Change('e', val, field)}\n onFocus={(vm) => handleDateRange2Focus(vm)}\n onBlur={(vm) => handleDateRange2Blur(vm)}\n />\n </div>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'dic':\n switch (dicType) {\n case 'yxzt':\n if (typeof model.value[field] === 'object') switchDefaultVal.value = model.value[field].value ? model.value[field].value : '100201';\n else switchDefaultVal.value = model.value[field] ? model.value[field] : '100201';\n break;\n case 'sf':\n if (typeof model.value[field] === 'object') switchDefaultVal.value = model.value[field].value ? model.value[field].value : '100101';\n else switchDefaultVal.value = model.value[field] ? model.value[field] : '100101';\n break;\n }\n if (isTableDic === false && multiple === false && formType.value === 'e' && ops && ops.length === 2 && (dicType === 'sf' || dicType === 'yxzt'))\n // 当是编辑form并且字典内容只有2个以内时\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <GvSwitch\n value={switchDefaultVal.value}\n columnKey={field}\n disabled={disabled}\n target={dicType === 'yxzt' ? '100201' : '100101'}\n onChange={(val) => handleSwitchDictChange(val, field, dicType, cb)}></GvSwitch>\n </ElFormItem>\n </ElCol>\n ) : null;\n else if (isTableDic === false && multiple === false && formType.value === 'e' && ops && ops.length === 2)\n // 当是编辑form并且字典内容只有2个以内时\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElInput\n id={`${field}__a11y-anchor`}\n modelValue=\"\"\n readonly\n validateEvent={false}\n tabindex={-1}\n aria-hidden={true}\n style={{\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: 0,\n margin: 0,\n border: 0,\n clip: 'rect(0, 0, 0, 0)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }}\n />\n <ElRadioGroup\n aria-label={sLabel}\n name={field}\n v-model={model.value[field].value}\n onChange={(val) => handleRadioDictChange(val, field, dicType, cb)}>\n {ops.map((x) =>\n format[0] === 0 ? (\n <ElRadio\n value={x.c}\n disabled={disabled}\n onChange={(event) => handleRadioInput(event, field, x.c, model.value[field], disabled)}>\n {getLanguage(userStore.language, x)}\n </ElRadio>\n ) : (\n <ElRadioButton\n value={x.c}\n disabled={disabled}>\n {getLanguage(userStore.language, x)}\n </ElRadioButton>\n ),\n )}\n </ElRadioGroup>\n </ElFormItem>\n </ElCol>\n ) : null;\n else {\n // form dic\n let v: string | undefined;\n const vv = model.value[field];\n if (typeof vv === 'object')\n if (Array.isArray(vv))\n vv.forEach((x, index) => {\n if (x)\n if (v)\n if (x.label) v += ',' + x.label;\n else v += ',' + (showLabel?.[index] ? showLabel[index] : x);\n else if (x.label) v = x.label;\n else v = showLabel?.[index] ?? x;\n });\n else {\n if (vv) v = vv.label;\n }\n else v = vv;\n let toolText = v; // 提示的文本\n if (showLabel) toolText = showLabel as string;\n\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!v}\n content={toolText ? toolText + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvSelect\n v-model={model.value[field]}\n value={model.value[field]}\n label={label}\n showLabel={showLabel}\n vref={field}\n multiple={multiple}\n dicType={dicType ?? ''}\n size={size as ComponentSize}\n disabled={disabled}\n placeholder={ph}\n filtercode={filtercode}\n visible={visible}\n dicRemote={typeof dicRemote === 'function' ? dicRemote : undefined}\n cb={cb}\n clear={clear}\n isreload={isreload}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n }\n\n break;\n case 'number':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInputNumber\n vref={field}\n name={field}\n id={field}\n v-model={model.value[field]}\n value={model.value[field]}\n disabled={disabled}\n placeholder={ph}\n visible={visible}\n size={size as ComponentSize}\n min={min}\n max={max}\n step={step}\n precision={precision}\n onBlur={blur}\n onFocus={focus}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'layer':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvCascader\n vref={field}\n v-model={model.value[field]}\n value={model.value[field]}\n disabled={disabled}\n placeholder={ph}\n size={size as ComponentSize}\n lazy={lazy}\n multiple={multiple}\n lazyLoad={lazyLoad}\n visible={visible}\n options={options}\n onBlur={blur}\n onChange={change}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n default:\n break;\n }\n if (createRow === true) return <el-row>{renders}</el-row>;\n else return renders;\n };\n\n const getItems = computed(() => {\n const res: VNode[] = [];\n props.formList.forEach((item: FormItem, index: number) => {\n res.push(renderFormItem(item, index));\n });\n return res;\n });\n\n // todo: 计算最大高度 需要增加弹出框判断逻辑,\n const getMaxHeight = (sRootEl: HTMLElement | undefined) => {\n if (isEditContainer.value) sMaxHeight.value = 0;\n else if (props.scroller === false) sMaxHeight.value = 0;\n else if (!isScrollbar.value)\n if (!isAnchor.value) {\n if (sRootEl && typeof sRootEl.closest === 'function') {\n const tabPane = sRootEl?.closest('.el-tabs') as HTMLElement | undefined;\n if (tabPane) {\n const offsetTop = tabPane.classList.contains('el-tabs--left') ? 215 : 275;\n sMaxHeight.value = document.documentElement.clientHeight - (sRootEl?.offsetTop || 0) - (tabPane?.offsetTop || 0) - offsetTop;\n } else {\n const dialog = sRootEl?.closest('.gv-dialog');\n if (!dialog) {\n const drawer = sRootEl?.closest('.gv-drawer');\n if (!drawer) sMaxHeight.value = document.documentElement.clientHeight - sRootEl.offsetTop - 75;\n // console.log(this.sMaxHeight);\n } else sMaxHeight.value = document.documentElement.clientHeight - sRootEl.offsetTop - 265;\n }\n }\n } else sMaxHeight.value = 0;\n else sMaxHeight.value = 0;\n };\n\n const clearFormValidate = () => {\n formRefs.value[props.refForm]?.clearValidate();\n };\n\n /**\n * @todo: 设置form表单样式\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-07 19:35:14\n */\n const setFormStyle = () => {\n let formStyle1;\n // console.log(props.formStyle);\n if (props.formStyle) {\n formStyle1 = props.formStyle;\n let width = formStyle1.width || 0;\n let height = formStyle1.height || 0;\n // fixme: 判断width是否是百分比\n // if (width.lastIndexOf('%') !== -1)\n // throw new Error('HtForm - [form-style] : 不支持width定义百分比');\n // if (height.lastIndexOf('%') !== -1)\n // throw new Error('HtForm - [form-style] : 不支持height定义百分比');\n // width = Math.round(this.getParentWidth * (parseInt(width) / 100) * 100) / 100;\n\n if (width.lastIndexOf('%') === -1) {\n // width固定值\n width = parseInt(width);\n if (width !== 0) {\n if (width < 762)\n // xs\n colSpanNums.value = 24;\n else if (width < 992)\n // sm\n colSpanNums.value = 12;\n else if (width < 1200)\n // md\n colSpanNums.value = 8;\n else if (width < 1920)\n // lg\n colSpanNums.value = 6;\n else colSpanNums.value = 4;\n\n rootNodeStyle.value['width'] = width + 'px';\n }\n if (height !== '100%' && height !== 0) {\n height = parseInt(height);\n rootNodeStyle.value['height'] = height + 'px';\n }\n } else rootNodeStyle.value['width'] = width;\n } else {\n const rootEl = instance?.vnode?.el as HTMLElement;\n const clientWidth = rootEl?.clientWidth;\n // console.log(clientWidth);\n if (clientWidth !== 0) {\n if (clientWidth < 762)\n // xs\n colSpanNums.value = 24;\n else if (clientWidth < 992)\n // sm\n colSpanNums.value = 12;\n else if (clientWidth < 1200)\n // md\n colSpanNums.value = 8;\n else if (clientWidth < 1920)\n // lg\n colSpanNums.value = 6;\n else colSpanNums.value = 4;\n\n rootNodeStyle.value['width'] = clientWidth + 'px';\n }\n }\n styles.value = formStyle1;\n };\n\n /**\n * @todo: form init\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 07:47:06\n * @param {*} type\n */\n const init = async (type: string) => {\n // alert(type);\n const formModel = {};\n const formRule = {};\n props.formList.forEach((item: FormItem, index: number) => {\n let v;\n if (type === 'create') v = item.value;\n else if (type === 'watch') {\n const originItem = originFormList.value[index] as FormItem | undefined;\n if (originItem && (item.value !== originItem.value || item.showLabel !== originItem.showLabel)) v = item.value;\n else v = model.value[item.field] === undefined ? item.value : model.value[item.field];\n } else v = model.value[item.field] === undefined ? item.value : model.value[item.field];\n formModel[item.field] = v;\n if (item.dateType === 'daterange2' || item.dateType === 'datetimerange2')\n if (Array.isArray(v)) {\n formModel[item.field + '-start'] = v[0] === 'null' ? undefined : v[0];\n formModel[item.field + '-end'] = v[1] === 'null' ? undefined : v[1];\n } else {\n formModel[item.field + '-start'] = '';\n formModel[item.field + '-end'] = '';\n }\n\n formRule[item.field] = getItemRules(item);\n // 设置 value属性为响应式数据\n item.value = v;\n });\n // 设置form model\n model.value = formModel;\n if (type === 'create') rules.value = formRule;\n else if (type === 'watch') rules.value = formRule;\n\n await nextTick();\n setFormStyle();\n // console.log(formRefs.value);\n clearFormValidate();\n };\n\n const difference = (newVal, oldVal) => {\n let diff = false;\n for (const key in newVal) {\n const fieldObj = newVal[key];\n const oldObj = oldVal[key];\n if (fieldObj === undefined) continue;\n else if (!oldObj) {\n diff = true;\n break;\n } else {\n const fieldObjKeys = Object.keys(fieldObj);\n for (const key2 in fieldObjKeys)\n if (\n fieldObjKeys[key2] === 'label' ||\n fieldObjKeys[key2] === 'hidden' ||\n fieldObjKeys[key2] === 'disabled' ||\n fieldObjKeys[key2] === 'format' ||\n fieldObjKeys[key2] === 'readonly' ||\n fieldObjKeys[key2] === 'filtercode' ||\n fieldObjKeys[key2] === 'multiple' ||\n fieldObjKeys[key2] === 'showLabel' ||\n fieldObjKeys[key2] === 'visible'\n )\n if (fieldObjKeys[key2] === 'format') {\n if (fieldObj[fieldObjKeys[key2]][0] !== oldObj[fieldObjKeys[key2]][0]) {\n diff = true;\n break;\n }\n if (fieldObj[fieldObjKeys[key2]][1] !== oldObj[fieldObjKeys[key2]][1]) {\n diff = true;\n break;\n }\n if (fieldObj[fieldObjKeys[key2]][2] !== oldObj[fieldObjKeys[key2]][2]) {\n diff = true;\n break;\n }\n // //if (!_.isEqual(fieldObj[fieldObjKeys[key2]], oldObj[fieldObjKeys[key2]])) {\n // diff = true;\n // break;\n // }\n } else if (fieldObj[fieldObjKeys[key2]] !== oldObj[fieldObjKeys[key2]]) {\n // console.log(key2);\n // console.log(fieldObj[fieldObjKeys[key2]]);\n // console.log(oldObj[fieldObjKeys[key2]]);\n diff = true;\n break;\n }\n }\n\n // if (!_.isEqual(newVal[key], oldVal[key]))\n }\n // console.log(diff);\n return diff;\n };\n\n // watch\n watch(\n () => props.formList,\n (nextProps, prevProps) => {\n // formList\n if (Array.isArray(nextProps) && Array.isArray(prevProps) && nextProps.length !== prevProps.length) init('watch');\n else if (difference(nextProps, originFormList.value)) init('watch');\n },\n {\n deep: true,\n },\n );\n watch(\n () => sMaxHeight.value,\n (newVal) => {\n // sMaxHeight\n if (isScrollbar.value === false)\n if (isAnchor.value === false) sMaxHeight.value = newVal;\n else sMaxHeight.value = 0;\n else sMaxHeight.value = 0;\n },\n );\n\n // @created hook\n // console.log(slots.default);\n const firstSlot = slots.default?.()?.[0];\n if (typeof firstSlot?.type === 'object' && 'name' in firstSlot.type && firstSlot?.type?.name === 'GvSearchBar') {\n formType.value = 's';\n const slotProps = firstSlot.props as Recordable | undefined;\n if (slotProps?.expand === false) searchFieldsCollapsed.value = false;\n } else formType.value = 'e';\n // 解析formList\n originFormList.value = JSON.parse(JSON.stringify(props.formList));\n init('create');\n // 判断是否是dialog弹出框中的form\n const parentNode = instance?.parent;\n // console.log(parentNode.$?.type?.name);\n if (parentNode && parentNode.type?.name === 'ElDialog') isDialog.value = true;\n else isDialog.value = false;\n\n // @mounted hook\n onMounted(() => {\n nextTick(() => {\n // get root element\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n\n // 确保 rootEl 是 HTMLElement 并且有 closest 方法\n if (rootEl && typeof rootEl.closest === 'function') {\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n const dialogBody = rootEl.closest('.gv-drawer__body__inner');\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n else {\n const dialogBody2 = rootEl.closest('.gv-dialog__body__inner');\n if (dialogBody2) isScrollbar.value = hasScrollbar(dialogBody2);\n }\n if (rootEl.closest('.gv-edit__container')) isEditContainer.value = true;\n\n // 计算maxheight;\n getMaxHeight(rootEl);\n\n window.addEventListener('resize', () => getMaxHeight(rootEl));\n }\n });\n });\n\n // @render\n return () => (\n <div\n class={prefixCls}\n style={{ ...rootNodeStyle }}>\n {getEditBar.value}\n {getDivider.value}\n <Transition name=\"el-zoom-in-top\">\n <div\n v-show={isShow.value}\n key=\"gv-form-body\"\n class={`${prefixCls}-collapse__inner`}>\n <ElForm\n ref={setFormRef}\n model={model.value}\n size={formSize.value}\n inline={false}\n label-position={labelPosition.value}\n label-width={`${props.labelWidth}px`}\n rules={rules.value}\n style={{\n ...styles.value,\n width: '100%',\n maxHeight: sMaxHeight.value === 0 ? undefined : sMaxHeight.value + 'px',\n }}>\n <ElRow\n ref-form={props.refForm}\n style={{ display: 'flex', flexWrap: 'wrap' }}>\n {getItems.value}\n {slots.default?.() && <div style={{ flex: 1, minWidth: 1 }}>{slots.default?.()}</div>}\n </ElRow>\n </ElForm>\n </div>\n </Transition>\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-form';\n .#{$prefixCls} {\n width: 100%;\n\n .#{$prefixCls}-form-editbar {\n // editbar bottom\n // border-bottom:1px solid #d9d9d9;\n // editbar top\n // border-top:1px solid #d9d9d9;\n // border-top: 1.5px solid var(--primaryColorHover, $primaryColorHover);\n padding: 0 0 2px;\n margin-top: -3px;\n }\n\n .#{$prefixCls}-collapse-wrap {\n overflow: hidden;\n }\n\n .#{$prefixCls}-collapse__inner {\n transform-origin: center top;\n }\n\n .el-form {\n overflow: hidden;\n }\n\n .el-col {\n min-height: 32px;\n margin-bottom: 12px;\n\n &[type='FIXED'] {\n height: 32px !important;\n }\n\n :deep(.el-form-item) {\n margin-bottom: 0;\n\n .el-form-item__label {\n height: 30px; // 32px\n padding-right: $modulePadding;\n //font-size: $textSizeSecondary;\n font-weight: $fontWeight;\n line-height: 30px; // 32px\n\n .label-wrap {\n display: inline-block;\n max-width: calc(100% - 10px);\n\n .el-input__inner {\n padding: 0 8px;\n border-color: $borderColor;\n\n & + span.el-input__suffix {\n right: 0;\n }\n }\n }\n }\n\n .el-form-item__content {\n line-height: 29px;\n height: 29px;\n .el-radio-group {\n .el-radio-button--small .el-radio-button__inner {\n padding: 7px;\n }\n\n .el-radio__label {\n //font-size: $appTextSize;\n }\n }\n\n .el-range-editor {\n width: 100%;\n }\n\n .el-input__prefix {\n left: 2px;\n }\n\n .#{$prefixCls}__item__inner-blank {\n width: 100%;\n height: 20px;\n line-height: 5px;\n border: 0;\n }\n\n // 日期范围选择\n .el-range-editor.el-input__inner {\n padding: 3px 5px;\n }\n\n // 日期范围选择\n .el-range__close-icon {\n width: 20px;\n }\n\n .gv-daterange__single {\n display: inline-flex !important;\n height: 32px;\n border: 1px solid #d9d9d9;\n border-radius: 4px;\n\n &:focus,\n &.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n .el-input__prefix {\n left: 2px;\n }\n\n .el-input__suffix {\n right: 2px;\n }\n\n .el-input__inner {\n padding-right: 2px;\n padding-left: 25px;\n border: 0;\n }\n\n .gv-daterange__single-separator {\n height: 32px;\n //font-size: $appTextSize;\n line-height: 32px;\n }\n }\n\n .el-form-item__error {\n margin-top: 2px;\n transform: scale(0.9);\n transform-origin: 0 50%;\n }\n }\n\n .el-select {\n width: 100%;\n\n .el-select__tags {\n height: 24px;\n overflow-y: auto;\n\n .el-select__input {\n height: inherit;\n padding-left: 15px;\n }\n }\n }\n\n .el-autocomplete {\n width: 100%;\n }\n\n .el-textarea {\n display: block;\n\n .el-textarea__inner {\n padding: 0 10px;\n\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n overflow-y: auto;\n font-family: inherit;\n }\n\n .el-input__count {\n right: 6px;\n line-height: 1;\n }\n }\n\n .el-input-number {\n width: 100%;\n\n .el-input__inner {\n text-align: left !important;\n }\n\n .el-input-number__increase:hover ~ .el-input .el-input__inner:not(.is-disabled),\n .el-input-number__decrease:hover ~ .el-input .el-input__inner:not(.is-disabled) {\n border-color: $borderColor;\n }\n }\n\n .desc-icon {\n padding: 6px;\n font-size: 18px;\n vertical-align: middle;\n }\n\n .desc-text {\n //font-size: $textSizeSecondary;\n }\n\n &.is-required .el-form-item__label {\n // color: #f5222d;\n color: #606266;\n }\n }\n }\n .el-form--label-top {\n .el-form-item {\n .el-select,\n .el-input,\n .el-radio-group {\n width: 90% !important;\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvForm from './src/GvForm.vue';\nconst GvFormPlugin = {\n install(app: App): void {\n app.component(GvForm.name ?? 'GvForm', GvForm);\n },\n};\nexport default GvFormPlugin;\n\nexport { GvForm };\n","<!--\n * @title: collapsed sidebar component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-03 13:48:02\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-03 11:18:57\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { Expand, Fold } from '@element-plus/icons-vue';\n import { ElIcon } from 'element-plus';\n import { computed, onMounted, unref } from 'vue';\n import { propTypes } from '../../utils/gv.propTypes';\n\n defineOptions({\n name: 'GvHamburger', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('hamburger');\n\n const appStore = useAppStore();\n const collapse = computed(() => appStore.getCollapseMenus);\n\n // set quick keys\n\n // @method\n // load dict\n const loadDict = async () => {\n try {\n await appStore.loadAllDict();\n } catch {\n // empty\n }\n };\n // load division\n const loadDictDivision = async () => {\n try {\n await appStore.loadDictDivision();\n } catch {\n // empty\n }\n };\n\n const toggleCollapse = () => {\n const collapsed = unref(collapse);\n appStore.setCollapseMenus(!collapsed);\n };\n\n // @created\n // @mounted\n onMounted(async () => {\n // reload dict if needed\n const currentDict = appStore.dict;\n const currentReloadDict = appStore.isLoadDict;\n if (!currentDict || Object.keys(currentDict).length === 0) await loadDict();\n else if (+currentReloadDict === 1) await loadDict();\n const currentDictDivision = appStore.dictDivision;\n if (currentDictDivision && currentDictDivision.length === 0) await loadDictDivision();\n });\n</script>\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleCollapse\">\n <div class=\"trigger\">\n <ElIcon\n :size=\"20\"\n :class=\"`${prefixCls}__icon`\">\n <Expand\n v-if=\"!collapse\"\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n <Fold\n v-else\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n </ElIcon>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-hamburger';\n .#{$prefixCls} {\n position: relative;\n z-index: 3;\n line-height: $navHeadHeight;\n background-color: #fff;\n &:hover {\n background-color: rgb(0 0 0 / 3%);\n }\n .trigger {\n display: inline-block;\n line-height: 1px;\n cursor: pointer;\n transition: color 0.3s ease;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvHamburger from './src/GvHamburger.vue';\nconst GvHamburgerPlugin = {\n install(app: App): void {\n app.component(GvHamburger.name ?? 'GvHamburger', GvHamburger);\n },\n};\nexport default GvHamburgerPlugin;\n\nexport { GvHamburger };\n","<!--\n * @title: locale lang dropdown\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-25 11:43:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-04 22:09:46\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useLocale } from '@/hook/web/useLocale';\n import { useStyle } from '@/hook/web/useStyle';\n import { useLocaleStore } from '@/store/modules/locale';\n import { useUserStore } from '@/store/modules/user';\n import { computed, unref } from 'vue';\n import { useRouter } from 'vue-router';\n import { propTypes } from '../../utils/gv.propTypes';\n\n import { ElDropdown, ElDropdownItem, ElDropdownMenu } from 'element-plus';\n\n defineOptions({\n name: 'GvLangSelect', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n defineProps({\n className: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('lang-select');\n\n const userStore = useUserStore();\n const localeStore = useLocaleStore();\n const langMap = computed(() => localeStore.getLocaleMap);\n const currentLang = computed(() => localeStore.getCurrentLocale);\n\n const router = useRouter();\n\n const handleSetLang = async (lang): Promise<void> => {\n if (lang === unref(currentLang).lang) return;\n\n const { switchLocale } = useLocale();\n userStore.setLanguage(lang);\n await switchLocale(lang);\n\n router.go(0);\n };\n</script>\n\n<template>\n <ElDropdown\n :class=\"prefixCls\"\n trigger=\"click\"\n class=\"international\"\n @command=\"handleSetLang\">\n <div>\n <GvIcon\n :class-name=\"`international-icon ${className}`\"\n icon-name=\"language\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item in langMap\"\n :key=\"item.lang\"\n :command=\"item.lang\">\n {{ item.name }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n","import type { App } from 'vue';\nimport GvLangSelect from './src/GvLangSelect.vue';\nconst GvLangSelectPlugin = {\n install(app: App): void {\n app.component(GvLangSelect.name ?? 'GvLangSelect', GvLangSelect);\n },\n};\nexport default GvLangSelectPlugin;\n\nexport { GvLangSelect };\n","<!--\n * @title: popover component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 14:04:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:33:39\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { GvIcon } from '@@/GvIcon';\n import { ElPopover } from 'element-plus';\n import { computed, defineComponent, ref, watch, type PropType } from 'vue';\n import type { TPopoverPlacement, TPopoverTrigger } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('popover');\n\n export default defineComponent({\n name: 'GvPopover',\n props: {\n vref: {\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: false,\n },\n title: {\n type: String,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n placement: {\n type: String as PropType<TPopoverPlacement>,\n default: 'bottom-start',\n },\n trigger: {\n type: String as PropType<TPopoverTrigger>,\n default: 'click',\n },\n tablePopover: {\n type: Boolean,\n default: false,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n columnType: {\n type: String,\n default: undefined,\n },\n },\n\n emits: ['update:visible', 'show', 'hide'],\n\n setup(props, { emit, slots }) {\n // @data\n const isShow = ref<boolean>(props.visible);\n\n // @watch\n watch(\n () => props.visible,\n (val) => {\n isShow.value = val;\n },\n );\n\n // @computed\n const popClass = computed(() => (props.tablePopover ? `${prefixCls} table-popover` : prefixCls));\n\n // @methods\n\n const handleUpdateVisible = (val: boolean) => {\n isShow.value = val;\n emit('update:visible', val);\n };\n\n const handleShow = () => {\n emit('show', props.columnProp);\n };\n\n const handleHide = () => {\n emit('hide', props.columnProp);\n };\n\n const handlePopoverWrapper = (e: MouseEvent) => {\n e.stopPropagation();\n // 关闭其他 popover\n // if (this.tablePopover === true)\n // this.$refs.array.forEach(element => {\n\n // });\n\n // this.$emit('click', e, this.columnProp);\n };\n\n const getReferenceSlot = () => (\n <span class=\"gv-popover-reference\">\n {props.label || props.title}\n <GvIcon\n iconType=\"el\"\n iconName=\"ArrowDown\"\n />\n </span>\n );\n\n // @render\n return () => (\n <div\n class={prefixCls}\n onClick={handlePopoverWrapper}>\n <ElPopover\n ref={props.vref || 'gv-popover'}\n visible={isShow.value}\n onUpdate:visible={handleUpdateVisible}\n title={props.title}\n placement={props.placement}\n trigger={props.trigger}\n showArrow={true}\n popperClass={`gv-popover ${popClass.value}`}\n transition=\"el-zoom-in-top\"\n onAfter-enter={handleShow}\n onAfter-leave={handleHide}\n // append-to-body={false}\n // popper-options={{ // fixme: 增加该配置会导致各种问题,兼容性不行\n // boundariesElement: 'body',\n // // gpuAcceleration: true,\n // // positionFixed: true,\n // removeOnDestroy: true\n // }}\n >\n {{\n default: () => slots.default?.(),\n reference: () => getReferenceSlot(),\n }}\n </ElPopover>\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-popover';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvPopover from './src/GvPopover.vue';\n\nconst GvPopoverPlugin = {\n install(app: App): void {\n app.component(GvPopover.name ?? 'GvPopover', GvPopover);\n },\n};\nexport default GvPopoverPlugin;\n\nexport { GvPopover };\n","<!--\n * @title: radio component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 11:52:20\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:34:53\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRadio, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { TRadioValue } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('radio');\n\n export default defineComponent({\n name: 'GvRadio',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n value: {\n type: [String, Number, Boolean] as PropType<TRadioValue>,\n default: undefined,\n },\n label: {\n type: [String, Number, Boolean] as PropType<TRadioValue>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n border: {\n type: Boolean,\n default: false,\n },\n },\n\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const radioValue = ref(props.value);\n const radioSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n radioValue.value = newVal;\n },\n );\n\n // @method\n const handleUpdate = (val: TRadioValue) => {\n radioValue.value = val;\n emit('update:modelValue', val);\n };\n\n const handleChange = (val: TRadioValue) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElRadio\n modelValue={radioValue.value}\n onUpdate:modelValue={handleUpdate}\n name={props.name}\n value={props.value ?? props.label}\n disabled={props.disabled}\n border={props.border}\n onChange={handleChange}\n size={radioSize.value}\n class={prefixCls}>\n {slots.default?.()}\n </ElRadio>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-radio';\n .#{$prefixCls} {\n padding: 5px 0;\n margin-right: 15px;\n }\n</style>\n","import type { App } from 'vue';\nimport GvRadio from './src/GvRadio.vue';\n\nconst GvRadioPlugin = {\n install(app: App): void {\n app.component(GvRadio.name ?? 'GvRadio', GvRadio);\n },\n};\nexport default GvRadioPlugin;\n\nexport { GvRadio };\n","<!--\n * @title: radio button component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 14:18:46\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:35:23\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRadioButton } from 'element-plus';\n import { defineComponent, ref, watch } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('radio-button');\n\n export default defineComponent({\n name: 'GvRadioButton',\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [String, Number, Boolean],\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n name: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['update:modelValue', 'change'],\n setup(props, { slots }) {\n // @data\n const radioValue = ref(props.value);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n radioValue.value = newVal;\n },\n );\n\n // @method\n // const handleUpdate = (val) => {\n // radioValue.value = val;\n // emit('update:modelValue', val);\n // };\n\n // @render\n return () => (\n <ElRadioButton\n value={props.value ?? props.label}\n modelValue={radioValue.value}\n name={props.name}\n disabled={props.disabled}\n class={prefixCls}>\n {slots.default?.()}\n </ElRadioButton>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-radio-button';\n .#{$prefixCls} {\n padding: 5px 0;\n margin-right: 15px;\n }\n</style>\n","import type { App } from 'vue';\nimport GvRadioButton from './src/GvRadioButton.vue';\n\nconst GvRadioButtonPlugin = {\n install(app: App): void {\n app.component(GvRadioButton.name ?? 'GvRadioGroup', GvRadioButton);\n },\n};\nexport default GvRadioButtonPlugin;\n\nexport { GvRadioButton };\n","<!--\n * @title: radio group component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 14:10:40\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 09:03:41\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRadioGroup, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { TRadioGroupValue } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('radio-group');\n\n export default defineComponent({\n name: 'GvRadioGroup',\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [String, Number, Boolean] as PropType<TRadioGroupValue>,\n default: undefined,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n },\n\n // @emits\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const radioValue = ref<TRadioGroupValue | undefined>(props.value ?? undefined);\n const radioGroupSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n radioValue.value = newVal;\n },\n );\n\n // @method\n const handleUpdate = (val: TRadioGroupValue) => {\n radioValue.value = val;\n emit('update:modelValue', val);\n };\n\n const handleChange = (val: TRadioGroupValue) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElRadioGroup\n class={prefixCls}\n aria-label={props.label}\n modelValue={radioValue.value}\n onUpdate:modelValue={handleUpdate}\n size={radioGroupSize.value}\n onChange={handleChange}>\n {slots.default?.()}\n </ElRadioGroup>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-radio-group';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvRadioGroup from './src/GvRadioGroup.vue';\n\nconst GvRadioGroupPlugin = {\n install(app: App): void {\n app.component(GvRadioGroup.name ?? 'GvRadioGroup', GvRadioGroup);\n },\n};\nexport default GvRadioGroupPlugin;\n\nexport { GvRadioGroup };\n","<!--\n * @title: row component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 09:49:52\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:36:24\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRow } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('row');\n\n export default defineComponent({\n name: 'GvRow',\n props: {\n gutter: {\n type: Number,\n default: 0,\n },\n tag: {\n type: String as PropType<string>,\n default: 'div',\n },\n },\n setup(props, { slots }) {\n return () => (\n <ElRow\n class={prefixCls}\n gutter={props.gutter}\n tag={props.tag}>\n {slots.default?.()}\n </ElRow>\n );\n },\n });\n</script>\n","import type { App } from 'vue';\nimport GvRow from './src/GvRow.vue';\n\nconst GvRowPlugin = {\n install(app: App): void {\n app.component(GvRow.name ?? 'GvRow', GvRow);\n },\n};\nexport default GvRowPlugin;\n\nexport { GvRow };\n","<!--\n * @title: screenfull\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:15:43\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-11-17 10:55:25\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { useFullscreen } from '@vueuse/core';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('screenfull');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { toggle, isFullscreen } = useFullscreen();\n\n const toggleFullscreen = () => {\n toggle();\n };\n</script>\n\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleFullscreen\">\n <GvIcon :icon-name=\"isFullscreen ? 'exit-fullscreen' : 'fullscreen'\" />\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-screenfull';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvScreenFull from './src/GvScreenFull.vue';\n// Define the install method on the GvButton component\nconst GvScreenFullPlugin = {\n install(app: App): void {\n app.component(GvScreenFull.name ?? 'GvScreenFull', GvScreenFull);\n },\n};\nexport default GvScreenFullPlugin;\n\nexport { GvScreenFull };\n","<!--\n * @title: search bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:02:29\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 16:14:17\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvIcon } from '@@/GvIcon';\n import { getVNodeText } from '@@/utils';\n import { computed, defineComponent, getCurrentInstance, inject, nextTick, onMounted, ref } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('search-bar');\n export default defineComponent({\n name: 'GvSearchBar',\n props: {\n expand: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n setup(props, { slots }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n\n const visible = ref(props.expand);\n const searchFieldsCollapsed = inject<{ value: boolean }>('searchFieldsCollapsed', ref(true));\n // const formList = inject('formList') as Recordable[];\n const refForm = inject('refForm') as string;\n const instance = getCurrentInstance(); // get current vnode\n let formNode: any = instance;\n while (formNode && formNode.type?.name !== 'ElForm') formNode = formNode?.parent;\n\n const fieldList = ref<any[]>([]);\n const searchFormRows = appStore.searchFormRows;\n const showDefaultRow = searchFormRows === 1 ? 4 : 8;\n // @mounted\n onMounted(() => {\n nextTick(() => {\n // console.log(formNode.exposed.fields);\n fieldList.value = formNode.exposed.fields;\n });\n });\n // const gvSearchExpand = ref(null);\n // const gvSearchShrink = ref(null);\n\n // @methods\n /**\n * @todo: expand search bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:45:03\n */\n const expandFields = () => {\n searchFieldsCollapsed.value = false;\n visible.value = false;\n };\n /**\n * @todo: shrink search bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:48:18\n */\n const shrinkFields = () => {\n searchFieldsCollapsed.value = true;\n visible.value = true;\n };\n /**\n * @todo: create search button\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 14:17:17\n */\n const createSearchBar = computed(() => {\n if (!fieldList.value?.length) return null;\n const searchBar: any[] = [];\n const buttonQuick = appStore.buttonQuick;\n const buttonIcon = appStore.buttonIcon;\n const defaultSlot = slots.default?.();\n if (defaultSlot) {\n defaultSlot.forEach((vnode) => {\n if (!vnode.props) vnode.props = {};\n const propsData = vnode.props;\n\n const type = vnode.type;\n if (typeof type === 'object' && 'name' in type && type.name === 'GvButton') {\n let text = getVNodeText(vnode);\n let searchBtnFlag = false;\n\n if (text === t('searchBar.search')) {\n if (buttonQuick) text = t('searchBar.search2');\n searchBtnFlag = true;\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.search');\n if (buttonIcon) propsData.icon = 'el-icon-search';\n propsData.bizType = 'search';\n }\n } else if (text === t('searchBar.seek')) {\n if (buttonQuick) text = t('searchBar.seek2');\n searchBtnFlag = true;\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.seek');\n if (buttonIcon) propsData.icon = 'el-icon-search';\n propsData.bizType = 'search';\n }\n } else if (text === t('searchBar.query')) {\n if (buttonQuick) text = t('searchBar.query2');\n searchBtnFlag = true;\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.query');\n if (buttonIcon) propsData.icon = 'el-icon-search';\n propsData.bizType = 'search';\n }\n } else if (text === t('searchBar.reset')) {\n if (buttonQuick) text = t('searchBar.reset2');\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.reset');\n if (buttonIcon) propsData.icon = 'el-icon-refreshLeft';\n propsData.bizType = 'reset';\n }\n }\n\n if (searchBtnFlag && propsData && propsData.type === undefined) propsData.type = 'primary';\n\n if (propsData) propsData.refForm = refForm;\n }\n searchBar.push(vnode);\n });\n\n // if (this.expand) {\n // add: 判断是否需要增加展开按钮 2022-04-22\n const fieldList2 = fieldList.value.filter((x) => {\n if (x.$el.hidden !== true) return true;\n });\n\n if (fieldList2.length > showDefaultRow) {\n let expandText = `${t('searchBar.expand')}`;\n if (buttonQuick) expandText = `${t('searchBar.expand')}(E)`;\n let shrinkText = `${t('searchBar.shrink')}`;\n if (buttonQuick) shrinkText = `${t('searchBar.shrink')}(E)`;\n const expand = (\n <GvButton\n link={true}\n bizType=\"expand\"\n visible={visible.value}\n onClick={expandFields}>\n {expandText} &nbsp;\n <GvIcon\n iconType=\"el\"\n iconName=\"arrowDown\"\n />\n </GvButton>\n );\n searchBar.push(expand);\n const shrink = (\n <GvButton\n link={true}\n bizType=\"shrink\"\n visible={!visible.value}\n onClick={shrinkFields}>\n {shrinkText} &nbsp;\n <GvIcon\n iconType=\"el\"\n iconName=\"arrowUp\"\n />\n </GvButton>\n );\n searchBar.push(shrink);\n }\n // }\n }\n return searchBar;\n });\n // @created\n\n // @render\n return () => <div class={prefixCls}>{createSearchBar.value}</div>;\n },\n });\n</script>\n<style scoped lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-search-bar';\n .#{$prefixCls} {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n padding-top: 0px;\n margin: 0 1px 6px 0;\n }\n</style>\n","import type { App } from 'vue';\nimport GvSearchBar from './src/GvSearchBar.vue';\n// Define the install method on the GvButton component\nconst GvSearchBarPlugin = {\n install(app: App): void {\n app.component(GvSearchBar.name ?? 'GvSearchBar', GvSearchBar);\n },\n};\nexport default GvSearchBarPlugin;\n\nexport { GvSearchBar };\n","import { ref, unref } from 'vue';\nimport { findPath } from '../../utils/gv.tree';\n\ntype OnlyOneChildType = AppRouteRecordRaw & { noShowingChildren?: boolean };\n\ninterface HasOneShowingChild {\n oneShowingChild?: boolean;\n onlyOneChild?: OnlyOneChildType;\n}\n\nexport const getAllParentPath = <T = Recordable>(treeData: T[], path: string) => {\n const menuList = findPath(treeData, (n) => n.path === path) as AppRouteRecordRaw[];\n return (menuList || []).map((item) => item.path);\n};\n\nexport const hasOneShowingChild = (parent: AppRouteRecordRaw, children: AppRouteRecordRaw[] = []): HasOneShowingChild => {\n const onlyOneChild = ref<OnlyOneChildType>();\n\n const showingChildren = children.filter((v) => {\n const meta = v.meta ?? {};\n if (meta.hidden) return false;\n else {\n // Temp set(will be used if only has one showing child)\n onlyOneChild.value = v;\n return true;\n }\n });\n\n // When there is only one child router, the child router is displayed by default\n if (showingChildren.length === 1)\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n\n // Show parent if there are no child router to display\n if (!showingChildren.length) {\n onlyOneChild.value = { ...parent, path: '', noShowingChildren: true };\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n }\n\n return {\n oneShowingChild: false,\n onlyOneChild: unref(onlyOneChild),\n };\n};\n","import { useI18n } from '@/hook/web/useI18n';\nimport type { RouteMeta } from 'vue-router';\nimport { GvIcon } from '../../../GvIcon';\nexport const useRenderMenuTitle = () => {\n const renderMenuTitle = (meta: RouteMeta) => {\n const { t } = useI18n();\n if (!meta) {\n return <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">No Title</span>;\n }\n const { title = 'Please set title', icon } = meta;\n\n return icon ? (\n <>\n <GvIcon\n iconName={meta.icon || ''}\n className=\"sub-el-icon\"></GvIcon>\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n </>\n ) : (\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n );\n };\n\n return {\n renderMenuTitle,\n };\n};\n","/*\n * @title: render menu item - useRenderMenuItem\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 15:07:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 14:34:07\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { useStyle } from '@/hook/web/useStyle';\nimport { isUrl, pathResolve } from '@@/utils';\nimport { ElMenuItem, ElSubMenu } from 'element-plus';\nimport { unref } from 'vue';\nimport { hasOneShowingChild } from '../helper';\nimport { useRenderMenuTitle } from './useRenderMenuTitle';\nconst { getPrefixCls } = useStyle();\nconst prefixCls = getPrefixCls('submenu');\n\nconst { renderMenuTitle } = useRenderMenuTitle();\n\nexport const useRenderMenuItem = (menuMode) =>\n // allRouters: AppRouteRecordRaw[] = [],\n {\n const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => {\n if (!routers || !routers.length) return null;\n return routers\n .filter((v) => !v.meta?.hidden)\n .map((v) => {\n const meta = v.meta ?? {};\n const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v, v.children);\n const fullPath = isUrl(v.path) ? String(v.path) : pathResolve(parentPath, v.path); // getAllParentPath<AppRouteRecordRaw>(allRouters, v.path).join('/')\n if (oneShowingChild && (!onlyOneChild?.children || onlyOneChild?.noShowingChildren) && !meta?.alwaysShow) {\n return (\n <ElMenuItem index={onlyOneChild ? pathResolve(fullPath, onlyOneChild.path) : fullPath}>\n {{\n default: () => renderMenuTitle(onlyOneChild ? (onlyOneChild.meta ?? meta) : meta),\n }}\n </ElMenuItem>\n );\n } else {\n return (\n <ElSubMenu\n index={fullPath}\n teleported\n class=\"nest-menu\"\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : ''}>\n {{\n title: () => renderMenuTitle(meta),\n default: () => renderMenuItem(v.children!, fullPath),\n }}\n </ElSubMenu>\n );\n }\n });\n };\n return {\n renderMenuItem,\n };\n };\n","<!--\n * @title: left menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-30 16:12:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 15:14:41\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { ElMenu, ElScrollbar } from 'element-plus';\n import { computed, defineComponent, unref, type PropType } from 'vue';\n import { useRenderMenuItem } from './components/useRenderMenuItem';\n\n import { useStyle } from '@/hook/web/useStyle';\n import { useRouter } from 'vue-router';\n import { isUrl } from '../../utils';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('sidebar');\n\n export default defineComponent({\n name: 'GvSidebar',\n props: {\n menuSelect: {\n type: Function as PropType<(index: string) => void>,\n default: undefined,\n },\n },\n setup(props) {\n const appStore = useAppStore();\n const layout = computed(() => appStore.getLayout);\n const { push, currentRoute } = useRouter();\n const permStore = usePermsStore();\n const menuMode = computed((): 'vertical' | 'horizontal' => {\n const vertical: LayoutType[] = ['default', 'topLeft', 'cutMenu'];\n\n if (vertical.includes(unref(layout))) return 'vertical';\n else return 'horizontal';\n });\n\n const routers = computed(() => (unref(layout) === 'cutMenu' ? permStore.getRouters : permStore.getRouters));\n\n // console.log(routers.value);\n\n const collapse = computed(() => appStore.getCollapseMenus);\n\n const leftMenuUniqueOpened = computed(() => appStore.getLeftMenuUniqueOpened);\n\n const activeMenu = computed(() => {\n const { meta, path } = unref(currentRoute);\n // if set path, the sidebar will highlight the path you set\n if (meta.activeMenu) return meta.activeMenu as string;\n\n return path;\n });\n\n const menuSelect = (index: string) => {\n props.menuSelect?.(index);\n\n // 自定义事件\n if (isUrl(index)) {\n window.open(index);\n return;\n }\n push(index);\n };\n\n const renderMenu = () => (\n <ElMenu\n defaultActive={unref(activeMenu)}\n mode={unref(menuMode)}\n collapse={unref(layout) === 'top' || unref(layout) === 'cutMenu' ? false : unref(collapse)}\n uniqueOpened={unref(layout) === 'top' ? false : unref(leftMenuUniqueOpened)}\n backgroundColor=\"var(--left-menu-bg-color)\"\n textColor=\"var(--left-menu-text-color)\"\n activeTextColor=\"var(--left-menu-text-active-color)\"\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : `${prefixCls}-popper--horizontal`}\n onSelect={menuSelect}>\n {{\n default: () => {\n const { renderMenuItem } = useRenderMenuItem(menuMode);\n // console.log('renderMenu', routers.value);\n return renderMenuItem(unref(routers));\n },\n }}\n </ElMenu>\n );\n const renderMenuWrap = () => {\n if (unref(layout) === 'top') return renderMenu();\n else return <ElScrollbar>{renderMenu()}</ElScrollbar>;\n };\n return () => (\n <div\n id=\"gv-sidebar\"\n class={[\n `${prefixCls} ${prefixCls}__${unref(menuMode)}`,\n 'h-[100%] overflow-hidden flex-col bg-[var(--left-menu-bg-color)]',\n {\n 'w-[var(--left-menu-min-width)]': unref(collapse) && unref(layout) !== 'cutMenu',\n 'w-[var(--left-menu-max-width)]': !unref(collapse) && unref(layout) !== 'cutMenu',\n },\n ]}>\n {renderMenuWrap()}\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-sidebar';\n\n .#{$prefixCls} {\n position: relative;\n transition: width var(--transition-time-02);\n\n :deep(.#{$elNamespace}-menu) {\n width: 100% !important;\n border-right: none;\n --el-menu-bg-color: var(--left-menu-bg-color);\n --el-menu-text-color: var(--left-menu-text-color);\n --el-menu-hover-text-color: var(--left-menu-text-active-color);\n --el-menu-active-color: var(--left-menu-text-active-color);\n --el-menu-hover-bg-color: var(--left-menu-hover-bg-color);\n\n // 设置选中时子标题的颜色\n .is-active {\n & > .#{$elNamespace}-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .#{$elNamespace}-sub-menu__title,\n .#{$elNamespace}-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-color) !important;\n }\n }\n\n // 设置选中时的高亮背景和高亮颜色\n .#{$elNamespace}-menu-item.is-active {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n }\n\n // 设置子菜单的背景颜色\n .#{$elNamespace}-menu {\n .#{$elNamespace}-sub-menu__title {\n background-color: var(--left-menu-bg-color) !important;\n }\n .#{$elNamespace}-menu-item:not(.is-active) {\n background-color: var(--left-menu-item-bg-light-color) !important;\n }\n }\n }\n\n // 折叠时的最小宽度\n :deep(.#{$elNamespace}-menu--collapse) {\n width: var(--left-menu-min-width);\n\n & > .is-active,\n & > .is-active > .#{$elNamespace}-sub-menu__title {\n position: relative;\n background-color: var(--left-menu-collapse-bg-active-color) !important;\n }\n }\n\n // 折叠动画的时候,就需要把文字给隐藏掉\n :deep(.horizontal-collapse-transition) {\n .#{$prefixCls}__title {\n display: none;\n }\n }\n\n // 水平菜单\n &__horizontal {\n height: calc(var(--top-tool-height)) !important;\n\n :deep(.#{$elNamespace}-menu--horizontal) {\n height: calc(var(--top-tool-height));\n border-bottom: none;\n // 重新设置底部高亮颜色\n & > .#{$elNamespace}-sub-menu.is-active {\n .#{$elNamespace}-sub-menu__title {\n border-bottom-color: var(--el-color-primary) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n\n &::after {\n display: none !important;\n }\n }\n\n .#{$prefixCls}__title {\n /* stylelint-disable-next-line */\n max-height: calc(var(--top-tool-height) - 2px) !important;\n /* stylelint-disable-next-line */\n line-height: calc(var(--top-tool-height) - 2px);\n }\n }\n }\n }\n</style>\n\n<style lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-sidebar-popper';\n\n .#{$prefixCls}--vertical,\n .#{$prefixCls}--horizontal {\n // 设置选中时子标题的颜色\n .is-active {\n & > .el-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .el-sub-menu__title,\n .el-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: #545658 !important;\n }\n }\n\n // 设置选中时的高亮背景\n .el-menu-item.is-active {\n position: relative;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n }\n\n $submenu-prefix-cls: '#{$gvNamespace}-submenu-popper';\n\n // 设置子菜单溢出时滚动样式\n .#{$submenu-prefix-cls}--vertical {\n max-height: 100%;\n overflow-y: auto;\n\n &::-webkit-scrollbar {\n width: 6px;\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgb(144 147 153 / 30%);\n border-radius: 4px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSidebar from './src/GvSidebar.vue';\n// Define the install method on the GvButton component\nconst GvSidebarPlugin = {\n install(app: App): void {\n app.component(GvSidebar.name ?? 'GvSidebar', GvSidebar);\n },\n};\nexport default GvSidebarPlugin;\n\nexport { GvSidebar };\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAABaCAYAAAAilKGMAAAACXBIWXMAAAZ2AAAGdgEpJm+AAAAKDGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuYTZhNjM5NjhhLCAyMDI0LzAzLzA2LTExOjUyOjA1ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmQxNjAxODBkLTVlZmUtZjc0MS1iY2RhLTdjMDBjNTc4ZTVkMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1ZDE1ZDUxNC05YzkxLTQwNTYtYTgzNS05YjZlYmRlOTQ5ZmEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB0aWZmOkltYWdlV2lkdGg9IjYzNiIgdGlmZjpJbWFnZUxlbmd0aD0iNjYwIiB0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb249IjIiIHRpZmY6U2FtcGxlc1BlclBpeGVsPSIzIiB0aWZmOlhSZXNvbHV0aW9uPSIxNDQvMSIgdGlmZjpZUmVzb2x1dGlvbj0iMTQ0LzEiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6RXhpZlZlcnNpb249IjAyMzEiIGV4aWY6Q29sb3JTcGFjZT0iNjU1MzUiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI2MzYiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSI2NjAiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTExLTI5VDEyOjQ4OjMzKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0yOVQxMjo0OToxNyswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjExIChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvanBlZyB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGltYWdlL2pwZWcgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MDg4Y2NiMi05NDFlLTQ1YmItOGZhZi02YjA5Mjc0M2Q0MDciIHN0RXZ0OndoZW49IjIwMjQtMTEtMjlUMTI6NDk6MTcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xMSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NWQxNWQ1MTQtOWM5MS00MDU2LWE4MzUtOWI2ZWJkZTk0OWZhIiBzdEV2dDp3aGVuPSIyMDI0LTExLTI5VDEyOjUxOjI0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMTEgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RSZWY6ZG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiLz4gPHRpZmY6Qml0c1BlclNhbXBsZT4gPHJkZjpTZXE+IDxyZGY6bGk+ODwvcmRmOmxpPiA8cmRmOmxpPjg8L3JkZjpsaT4gPHJkZjpsaT44PC9yZGY6bGk+IDwvcmRmOlNlcT4gPC90aWZmOkJpdHNQZXJTYW1wbGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+WfjB/QAAOnxJREFUeJztvXe4XFd19//Z+9Tp5famq2rJVnE3trGxMcY0h2KMDSb04NBCDIQQQgukvKTwQAKEEkIS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\"","<!--\n * @title: sidebar logo\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-15 14:11:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 11:46:47\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { computed, onMounted, ref, unref, watch } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('logo');\n\n const appStore = useAppStore();\n\n const show = ref(true);\n const title = computed(() => appStore.getTitle);\n const layout = computed(() => appStore.getLayout);\n const collapseMenus = computed(() => appStore.getCollapseMenus);\n\n watch(\n () => collapseMenus.value,\n (collapse: boolean) => {\n if (unref(layout) === 'topLeft' || unref(layout) === 'cutMenu') {\n show.value = true;\n return;\n }\n show.value = !collapse;\n },\n );\n\n watch(\n () => layout.value,\n (layout) => {\n if (layout === 'top' || layout === 'cutMenu') show.value = true;\n else if (unref(collapseMenus)) show.value = false;\n else show.value = true;\n },\n );\n\n onMounted(() => {\n if (unref(collapseMenus)) show.value = false;\n });\n</script>\n\n<template>\n <div>\n <router-link\n :class=\"[prefixCls, layout !== 'default' ? `${prefixCls}__Top` : '', 'flex !h-[var(--logo-height)] items-center cursor-pointer pl-[8px] relative decoration-none overflow-hidden']\"\n to=\"/\">\n <img\n src=\"@/assets/imgs/logo.png\"\n class=\"w-[calc(var(--logo-height)-10px)] h-[calc(var(--logo-height)-10px)]\" />\n <div\n v-if=\"show\"\n :class=\"[\n 'block whitespace-nowrap ml-[45px] mr-[0px] mt-[-25px] mb-[0px] text-[16px] font-bold',\n {\n 'text-[var(--logo-title-text-color)]': layout === 'default',\n 'text-[var(--top-header-text-color)]': layout === 'topLeft' || layout === 'top' || layout === 'cutMenu',\n },\n ]\">\n {{ title }}\n </div>\n </router-link>\n </div>\n</template>\n<style lang=\"scss\" scoped></style>\n","import type { App } from 'vue';\nimport GvSidebarLogo from './src/GvSidebarLogo.vue';\n// Define the install method on the GvButton component\nconst GvSidebarLogoPlugin = {\n install(app: App): void {\n app.component(GvSidebarLogo.name ?? 'GvSidebarLogo', GvSidebarLogo);\n },\n};\nexport default GvSidebarLogoPlugin;\n\nexport { GvSidebarLogo };\n","<!--\n * @title: table bar component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:46:02\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-03 14:20:53\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { getVNodeName, getVNodeText } from '@@/utils';\n import { defineComponent, getCurrentInstance, type VNode } from 'vue';\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('table-bar');\n export default defineComponent({\n name: 'GvTableBar',\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n setup(props, { slots }) {\n // @data\n const appStore = useAppStore();\n const instance = getCurrentInstance();\n const { t } = useBridgeI18n();\n // @watch\n\n // @methods\n const createTableBar = () => {\n const tableBar: VNode[] = [];\n const defaultSlots = slots.default?.();\n if (defaultSlots) {\n const parentNode = instance?.parent;\n const refForm = parentNode?.attrs['ref-form'];\n\n const buttonQuick = appStore.buttonQuick;\n const buttonIcon = appStore.buttonIcon;\n const childrenNodes = (defaultSlots[0].children as VNode[]) || [];\n childrenNodes.forEach((vnode: VNode) => {\n const propsData = vnode.props || {};\n if (getVNodeName(vnode) === 'GvButton') {\n const text = getVNodeText(vnode);\n if (text.indexOf(t('tableBar.save')) !== -1 || text.indexOf(t('tableBar.add')) !== -1 || text.indexOf(t('tableBar.append')) !== -1 || text.indexOf(t('tableBar.create')) !== -1) {\n if (text === t('tableBar.add') && buttonQuick) {\n propsData.text = t('tableBar.add2');\n propsData.otext = text;\n } else propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-add';\n propsData.bizType = 'save';\n } else if (propsData.bizType === 'export') {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-daochu1';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.refresh')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-shuaxin';\n propsData.bizType = 'refresh';\n propsData.text = t('tableBar.refresh');\n } else if (text.indexOf(t('tableBar.templateDownload')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-xiazaidaorumoban1x';\n propsData.bizType = 'downloadTemplate';\n } else if (text.indexOf(t('tableBar.dispatch')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-winfo-icon-zhipai';\n propsData.bizType = 'dispatch';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.assign')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhipai';\n propsData.bizType = 'dispatch';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.calculate')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jisuan';\n propsData.text = text;\n propsData.bizType = 'calculate';\n } else if (text.indexOf(t('tableBar.trace')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiankongguanli';\n propsData.text = text;\n propsData.bizType = 'trace';\n } else if (text.indexOf(t('tableBar.receive')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-piliangbianji1';\n propsData.text = text;\n propsData.bizType = 'receive';\n } else if (propsData.bizType === 'import') {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-daoru2';\n propsData.text = text;\n propsData.bizType = 'import';\n } else if (text.indexOf(t('tableBar.generate')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zujian';\n propsData.text = text;\n propsData.bizType = 'generate';\n } else if (text.indexOf(t('tableBar.pay')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-yingshoukuan';\n propsData.text = text;\n propsData.bizType = 'pay';\n } else if (text.indexOf(t('tableBar.check')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-xuanze';\n propsData.text = text;\n propsData.bizType = 'check';\n } else if (text.indexOf(t('tableBar.reject')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-bohui';\n propsData.text = text;\n propsData.bizType = 'reject';\n } else if (text.indexOf(t('tableBar.approve')) !== -1 || text.indexOf(t('tableBar.audit')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-shenpi2';\n propsData.text = text;\n propsData.bizType = 'approve';\n } else if (text.indexOf(t('tableBar.logging')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-rizhi1';\n propsData.bizType = 'logging';\n } else if (text.indexOf(t('tableBar.select')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-chaxun';\n propsData.bizType = 'search';\n }\n // else if (text.indexOf('派') !== -1) {\n // // propsData.text = text;\n // propsData.icon = 'el-icon-finished';\n // propsData.bizType = 'confirm';\n // }\n else if (text.indexOf(t('tableBar.detail')) !== -1 || text.indexOf(t('table.list')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-mingxi';\n propsData.bizType = 'detail';\n } else if (text.indexOf(t('tableBar.withdraw')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-fanhui5';\n propsData.bizType = 'withdraw';\n } else if (text.indexOf(t('tableBar.submit')) !== -1 || text.indexOf('提报') !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tijiao';\n propsData.bizType = 'submit';\n } else if (text.indexOf(t('tableBar.delete')) !== -1 || text.indexOf(t('tableBar.cancel')) !== -1 || text.indexOf(t('tableBar.cancel1')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-delete';\n propsData.bizType = 'delete';\n } else if (text.indexOf(t('tableBar.change')) !== -1 || text.indexOf(t('tableBar.update')) !== -1 || text.indexOf(t('tableBar.modify')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-edit-outline';\n propsData.bizType = 'update';\n } else if (text.indexOf(t('tableBar.sync')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tongbu1';\n propsData.bizType = 'update';\n } else if (text.indexOf(t('tableBar.untop')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-quxiaozhiding1';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.top')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhiding1';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.deserum')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-quxiaozhiding';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.unitPrice')) !== -1) {\n if (buttonIcon)\n // propsData.text = text;\n propsData.icon = 'iconfont gv-icon-jiangjinguize';\n else if (text.indexOf(t('tableBar.essence')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhiding';\n propsData.bizType = 'top';\n propsData.text = text;\n }\n } else if (text.indexOf(t('tableBar.relieve')) !== -1 || text.indexOf(t('tableBar.unbind')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiekou1';\n propsData.bizType = 'unbind';\n } else if (text.indexOf(t('tableBar.bind')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiekoushuoming';\n propsData.bizType = 'bind';\n } else if (text.indexOf(t('tableBar.confirm')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tianshenpi';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.notify')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-huodong';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.payment')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiage';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.transfer')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-fanhui5';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.putaway')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-top';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.soldOut')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-bottom';\n propsData.bizType = 'confirm';\n }\n propsData.refForm = refForm;\n } else if (getVNodeName(vnode) === 'ElDropdown') {\n const firstChild = vnode?.children?.[0];\n const text = getVNodeText(firstChild);\n propsData.text = text;\n propsData.icon = firstChild?.props.icon || '';\n }\n tableBar.push(vnode);\n });\n }\n return tableBar || [];\n };\n // console.log(tableBar);\n\n // @mounted\n\n // @render\n return () => (props.visible ? <div class={prefixCls}>{createTableBar()}</div> : null);\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-table-bar';\n .#{$prefixCls} {\n display: inline-block;\n height: 30px;\n padding-top: 3px;\n\n .el-dropdown {\n float: left;\n\n i {\n padding-right: 3px;\n color: var(--tableBarColor, $tableBarColor);\n\n & + span {\n margin-left: 3px;\n }\n }\n }\n\n :deep(.el-button) {\n float: left;\n height: 25px;\n padding: 2px 8px;\n margin-bottom: 2px;\n margin-left: 2px;\n color: var(--tableBarColor, $tableBarColor);\n text-align: left;\n background: #fff !important;\n border: 0;\n\n i {\n padding-right: 3px;\n color: var(--tableBarColor, $tableBarColor);\n\n & + span {\n margin-left: 3px;\n }\n }\n\n &:hover {\n background-color: rgb(0 82 156 / 5%) !important;\n }\n }\n\n .el-button.is-disabled {\n color: $textColor;\n\n :deep(i) {\n color: $textColor;\n }\n }\n }\n</style>\n","<!--\n * @title: tag component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 14:43:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:37:24\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElTag, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, unref, type PropType } from 'vue';\n import type { TTagEffect, TTagType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tag');\n\n export default defineComponent({\n name: 'GvTag',\n props: {\n type: {\n type: String as PropType<TTagType>,\n default: 'primary',\n },\n closable: {\n type: Boolean,\n default: false,\n },\n effect: {\n type: String as PropType<TTagEffect>,\n default: 'light',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n round: {\n type: Boolean,\n default: false,\n },\n },\n\n // @emits\n emits: ['click', 'close'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const tagSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @methods\n\n const handleClick = (event: MouseEvent) => {\n emit('click', event);\n };\n\n const handleClose = (event: Event) => {\n emit('close', event);\n };\n\n // @render\n return () => (\n <ElTag\n type={props.type}\n size={tagSize.value}\n round={props.round}\n closable={props.closable}\n effect={props.effect}\n class={prefixCls}\n onClick={handleClick}\n onClose={handleClose}>\n {slots.default?.()}\n </ElTag>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tag';\n .#{$prefixCls} {\n }\n</style>\n","/*\n * @title: table utils\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-09 17:50:09\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 11:28:48\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\nimport type { FilterCondition, PageInfo } from '@@/GvTable/src/types';\nimport type { TableInstance } from 'element-plus';\nimport { message } from './gv.notify';\nimport { isEmpty, toHump, toLine } from './index';\n/**\n * @todo: page info condition\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 09:09:54\n * @param {PageInfo} pi\n */\nexport const appendPageInfo = (pi?: PageInfo): PageInfo => {\n const pageInfo: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n const currentpagenum = pi && pi['currentpagenum'] ? pi['currentpagenum'] : 1;\n const recordsperpage = pi && pi['recordsperpage'] ? pi['recordsperpage'] : 10;\n const countrows = pi && pi['countrows'] ? pi['countrows'] : 0;\n const totalpage = pi && pi['totalpage'] ? pi['totalpage'] : 0;\n pageInfo['currentpagenum'] = currentpagenum;\n pageInfo['recordsperpage'] = recordsperpage;\n pageInfo['countrows'] = countrows;\n pageInfo['totalpage'] = totalpage;\n return pageInfo;\n};\n\n/**\n * @todo: common query combined filter conditions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:08:33\n * @param {TableInstance} tabNode\n * @param {Recordable} filter\n */\nexport const combined = (tabNode: TableInstance, filter: Recordable<any>): Recordable<FilterCondition | PageInfo> => {\n const filterConditions: Recordable<FilterCondition | PageInfo> = {};\n if (!isEmpty(filter))\n Object.keys(filter).forEach((x: string) => {\n let val: string = '';\n let co = 'null';\n if (!isEmpty(filter[x])) {\n let sOp = '=';\n if (typeof filter[x] === 'object')\n if (Array.isArray(filter[x] as any[])) {\n // fixme: 增加多选字典 2022-08-01\n let coo = '';\n let labels = '';\n (filter[x] as any[]).forEach((x) => {\n if (coo) {\n coo += ',' + x.value;\n labels += ',' + x.label;\n } else {\n coo = x.value;\n labels = x.label;\n }\n });\n co = coo;\n val = labels;\n } else {\n const v = filter[x] as Recordable<any>;\n co = v.value;\n val = v.label;\n }\n val = val + '';\n if (val.indexOf(',') > 0) val = val.replace(/,/g, ',');\n\n if (val.indexOf(',') > 0) if (sOp !== 'in' && sOp !== 'not in') sOp = 'in';\n const ds = toLine(x);\n const condition: FilterCondition = {\n id: '',\n ds: '',\n va: '',\n co: '',\n op: 'like',\n ac: 'null',\n ki: 'text',\n };\n let type = 'text';\n if (type !== 'dic' && (x.indexOf('id') >= 0 || x.indexOf('Id') >= 0)) type = 'number';\n\n condition['id'] = x;\n condition['ds'] = ds;\n condition['va'] = val.trim();\n condition['co'] = co;\n condition['op'] = sOp || 'like';\n condition['ac'] = 'null';\n condition['ki'] = type;\n filterConditions[x] = condition;\n }\n });\n // 拼接 pageinfo条件\n if (tabNode) {\n const pi: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n pi['recordsperpage'] = (tabNode.$.props?.['pageSize'] as number) ?? 10;\n filterConditions['pageinfo'] = appendPageInfo(pi);\n }\n return filterConditions;\n};\n\n/**\n * @todo: form search combined filter conditions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:31:41\n * @param {FormItem} formList\n * @param {Recordable} filter\n * @param {VNode} tabNode\n */\nexport const searchCombined = (formList: FormItem[], filter: Recordable<any>, tabNode: TableInstance): Recordable<FilterCondition | PageInfo> => {\n const filterConditions: Recordable<FilterCondition | PageInfo> = {};\n // console.log(formList);\n for (const item of formList) {\n const type = item.type;\n if (type !== 'blank') {\n const condition: FilterCondition = {\n id: '',\n ds: '',\n va: '',\n co: '',\n op: 'like',\n ac: 'null',\n ki: 'text',\n };\n const { action, field, op = 'like', upper = false, showLabel, dateType } = item;\n if (action === 'ignore') continue;\n let val = filter[field];\n let co = 'null';\n if (isEmpty(val)) continue;\n // 对于日期范围选择\n if (Array.isArray(val)) if (isEmpty(val[0])) continue;\n // if (type !== 'dic' && (field.indexOf('id') >= 0 || field.indexOf('Id') >= 0))\n // type = 'number';\n // console.log(val);\n let sOp = op;\n if (type === 'dic') {\n if (Array.isArray(val)) {\n // fixme: 增加多选字典 2022-08-01\n let coo = '';\n let labels = '';\n (val as any[]).forEach((x) => {\n if (coo) {\n coo += ',' + x.value;\n labels += ',' + x.label;\n } else {\n coo = x.value;\n labels = x.label;\n }\n });\n co = coo;\n val = labels;\n } else if (showLabel) {\n // 单选字典\n co = val + '';\n val = showLabel;\n } else {\n const v = val as Recordable<any>;\n co = v.value;\n val = v.label;\n }\n\n sOp = '=';\n } else if (type === 'date' || type === 'datetime' || type === 'time') {\n if (op === 'like') sOp = '=';\n if (dateType === 'daterange' || dateType === 'datetimerange' || dateType === 'timerange' || dateType === 'monthrange') val = (val as any[]).join(',');\n } else if (type === 'number') sOp = '=';\n\n let sType = type;\n if (dateType === 'monthrange') sType = 'month';\n\n val = val + '';\n if (!action && val.indexOf(',') > 0) val = val.replace(/,/g, ',');\n\n if (val.indexOf(',') > 0) if (sOp !== 'in' && sOp !== 'not in') sOp = 'in';\n\n sOp = sOp.replace(/</gi, '&lt;');\n sOp = sOp.replace(/>/gi, '&gt;');\n let ds = toLine(field);\n // 多表关联判断是否带表别名 2022-06-23\n if (ds.indexOf('@') > 0) ds = ds.replace('@', '.');\n\n if (upper === true) {\n if (co && co !== 'null') co = co.toUpperCase();\n val = val.toUpperCase();\n // 将ds转为upper函数\n ds = 'upper(' + ds + ')';\n }\n\n condition['id'] = field;\n condition['ds'] = ds;\n condition['va'] = val.trim();\n condition['co'] = co;\n condition['op'] = sOp || 'like';\n condition['ac'] = action || 'null';\n condition['ki'] = sType || 'text';\n filterConditions[field] = condition;\n }\n }\n // 拼接 pageinfo条件\n if (tabNode) {\n const pi: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n pi['recordsperpage'] = (tabNode.$.props?.['pageSize'] as number) ?? 10;\n filterConditions['pageinfo'] = appendPageInfo(pi);\n }\n return filterConditions;\n};\n\n/**\n * @todo: save combined filter conditions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:43:03\n * @param {FormItem} formList\n * @param {Recordable} filter\n */\nexport const saveCombined = (formList: FormItem[], filter: Recordable<any>): Recordable<any> => {\n const filterConditions = {};\n\n try {\n for (const item of formList) {\n const type = item.type;\n if (type !== 'blank') {\n const { action, field, showLabel } = item;\n if (action === 'ignore') continue;\n let val = filter[field];\n let co = 'null';\n if (val === undefined || val === null) continue;\n if (type === 'dic')\n if (showLabel)\n if (Array.isArray(val)) {\n // 多选字典\n let coo = '';\n const labels = '';\n val.forEach((x) => {\n let v: string;\n if (typeof x === 'object') v = x.value;\n else v = x + '';\n if (coo) coo += ',' + v;\n else coo = v;\n });\n co = coo;\n val = labels;\n } else if (typeof val === 'object') {\n co = val.value;\n val = val.label;\n } else {\n co = val + '';\n val = showLabel;\n }\n else if (Array.isArray(val)) {\n // 多选字典\n let coo = '';\n let labels = '';\n val.forEach((x) => {\n if (coo) {\n coo += ',' + x.value;\n labels += ',' + x.label;\n } else {\n coo = x.value;\n labels = x.label;\n }\n });\n co = coo;\n val = labels;\n } else if (typeof val === 'object') {\n co = val.value;\n val = val.label;\n } else\n // if (typeof val !== 'object' && item.dicType.indexOf('t#') >= 0) {\n // Notify.message('[' + field + ']: 字典值设置不正确', 'error');\n // throw new Error('[' + field + ']: 字典值设置不正确');\n // }\n co = val;\n else {\n val = val + ''; // fixme: 对于id等数字,转换为字符类型,防止indexOf出错\n co = val + '';\n }\n if (co === null || co === undefined) {\n message('[' + field + ']: dict value is null', 'error');\n throw new Error('[' + field + ']: dict value is null');\n }\n if (!action && co.indexOf(',') > 0) co = co.replace(/,/g, ',');\n const ds = toHump(field);\n\n filterConditions[ds] = co;\n }\n }\n } catch (error) {\n console.log(error);\n throw new Error('combined data error:' + error);\n }\n return filterConditions;\n};\n","/*\n * @title: crud methods utils\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-25 15:07:35\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 17:43:39\n * @version: 1.0.8\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\nimport type { PageInfo } from '@@/GvTable/src/types/index';\nimport { useStorage } from '@@/hooks/web/useStorage';\nimport type { FormInstance, TableInstance } from 'element-plus';\nimport type { ComponentInternalInstance, VNode } from 'vue';\nimport { message } from './gv.notify';\nimport { appendPageInfo, combined, saveCombined, searchCombined } from './gv.table';\nimport { getVNodeName, isEmpty } from './index';\n/**\n * @todo: common fetch data\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:55:17\n * @param {function} fetch\n * @param {any} data\n */\nconst fetchData = async (fetch: AsyncFn, data: any): Promise<any> => {\n let result = {};\n await fetch(data).then((res) => {\n result = res.datas;\n });\n\n return result;\n};\n\n/**\n * @todo: common submit fetch data\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:39:01\n */\nconst submit = async (fetch: AsyncFn, data: any, hasMsg = true, msg?: string): Promise<any> => {\n let result = {};\n let msgs: string;\n if (msg) msgs = msg;\n else {\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (lang === 'zh-CN') msgs = '操作成功';\n else msgs = 'Operate Ok';\n }\n await fetch(data).then((res) => {\n result = res.datas;\n if (hasMsg) message(msgs, 'success');\n });\n\n return result;\n};\n/**\n * @todo: common fetch table data(with pagination)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:40:36\n */\nconst fetchTable = async (tabNode: TableInstance, fetch: AsyncFn, data: any) => {\n if (tabNode === undefined || tabNode === null) {\n message('table object is null', 'error');\n return false;\n }\n let result = {};\n const tabInnerNode = tabNode.$;\n const exposed = tabInnerNode.exposed as any;\n\n const filterConditions = combined(tabNode, data);\n if (tabNode) {\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n }\n exposed.startLoading();\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n exposed.stopLoading();\n return result;\n};\n\n/**\n * @todo: validate form\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:42:22\n */\nconst checkForms = async (fmNodes: FormInstance[]) => {\n if (fmNodes === undefined || fmNodes === null) {\n message('form object is null', 'error');\n return false;\n }\n let result = true;\n for (const fmNode of fmNodes) {\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n await fmNode2.component.exposed\n .validate()\n .then(() => {\n // todo\n })\n .catch(() => {\n // throw new Error(e);\n result = false;\n Promise.reject('The form failed validation');\n });\n }\n }\n\n return result;\n};\n\n/**\n * @todo: save form\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:45:03\n */\nconst save = async (fmNode: FormInstance, fetch: AsyncFn, check = true, msg?: string) => {\n if (fmNode === undefined || fmNode === null) {\n message('form object is null', 'error');\n return false;\n }\n let result: Recordable<any> | null = {};\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n const formList = fmInnerNode.props.formList as FormItem[];\n let msgs: string;\n if (msg) msgs = msg;\n else {\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (lang === 'zh-CN') msgs = '保存成功';\n else msgs = 'Save OK.';\n }\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const props = fmNode2.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode2);\n // console.log(formList);\n let conditions = {};\n try {\n conditions = saveCombined(formList, filter);\n await fetch(conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n return null;\n }\n } else\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const props = fmNode2.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode2);\n // console.log(formList);\n let conditions = {};\n try {\n conditions = saveCombined(formList, filter);\n await fetch(conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n result = null;\n return;\n }\n })\n .catch(() => {\n // throw new Error(e);\n Promise.reject('The form failed validation');\n result = null;\n });\n }\n\n return result;\n};\n\n/**\n * @todo: update form\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:49:05\n */\nconst update = async (fmNode: FormInstance, id: number, fetch: Async2Fn, check = true, msg?: string) => {\n if (fmNode === undefined || fmNode === null) {\n message('form object is null', 'error');\n return false;\n }\n if (isEmpty(id)) {\n message('pk is null', 'error');\n return false;\n }\n let result: Recordable<any> | null = {};\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n const formList = fmInnerNode.props.formList as FormItem[];\n let msgs: string;\n if (msg) msgs = msg;\n else {\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (lang === 'zh-CN') msgs = '保存成功';\n else msgs = 'Save Ok.';\n }\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(fmNode2);\n const conditions = saveCombined(formList, filter);\n // console.log(conditions);\n\n await fetch(id, conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n } else\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(fmNode2);\n const conditions = saveCombined(formList, filter);\n // console.log(conditions);\n await fetch(id, conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n })\n .catch(() => {\n result = null;\n });\n }\n\n return result;\n};\n\n/**\n * @todo: search for list with form and table\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:11:42\n */\nconst search = async (fmNode: FormInstance, tabNode: TableInstance, fetch: AsyncFn) => {\n if (fmNode === undefined || fmNode === null) {\n message('form object is null', 'error');\n return false;\n }\n if (tabNode === undefined || tabNode === null) {\n message('table object is null', 'error');\n return false;\n }\n let result = {};\n const fmInnerNode = fmNode.$;\n const tabInnerNode = tabNode.$;\n const exposed = tabInnerNode.exposed as any;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n const formList = fmInnerNode.props.formList as FormItem[];\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n // 解析检索条件\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 拼接查询条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(formList);\n const filterConditions = searchCombined(formList, filter, tabNode);\n // console.log(filterConditions);\n // update: 保存查询条件、方法至table对象,为分页组件使用 2022-04-18\n\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n exposed.startLoading();\n\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n // fixme: 清空列表search框内容 2022-04-21\n const tabChildList = (tabNode as any).subTree?.children || [];\n const searchInputNode = tabChildList.filter((x: VNode) => {\n if (getVNodeName(x) === 'gv-input') return true;\n });\n if (searchInputNode[0]) searchInputNode[0].inputValue = '';\n // fixme: 清空列表表头筛选框 2022-12-14\n const tableEl = tabNode.$el as HTMLElement;\n const tableHeader = tableEl.querySelector('.gv-table .el-table__header-wrapper .el-table__header');\n const tableFixedHeader = tableEl.querySelector('.gv-table .el-table__fixed-header-wrapper .el-table__header');\n const columns = tableHeader?.querySelectorAll('.el-table__cell');\n const len = columns?.length || 0;\n for (let i = 0; i < len; i++) {\n const h = columns?.[i]?.querySelector('.render__header');\n if (h) if (h.children[0]) h.children[0].classList.remove('is-selected');\n }\n if (tableFixedHeader) {\n const columnsFixed = tableFixedHeader.querySelectorAll('.el-table__cell');\n const lenFixed = columnsFixed.length;\n for (let i = 0; i < lenFixed; i++) {\n const h = columnsFixed[i].querySelector('.render__header');\n if (h) if (h.children[0]) h.children[0].classList.remove('is-selected');\n }\n }\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n exposed.stopLoading();\n })\n .catch(() => {\n exposed.stopLoading();\n });\n }\n\n return result;\n};\n\n/**\n * @todo: search for list without form but with table\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:22:00\n * @param {*} tabNode\n * @param {*} fetch\n * @param {*} data\n */\nconst searchNoFm = async (tabNode: any, fetch: AsyncFn, data: any) => {\n if (tabNode === undefined || tabNode === null) {\n message('table object is null', 'error');\n return false;\n }\n const tabInnerNode = tabNode.$;\n const exposed = tabInnerNode.exposed as any;\n let result = {};\n const filterConditions = combined(tabNode, data);\n // console.log(JSON.stringify(filterConditions));\n // update: 保存查询条件、方法至table对象,为分页组件使用 2022-04-18\n\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n exposed.startLoading();\n\n exposed.startLoading();\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n // fixme: 清空列表search框内容 2022-04-21\n const tabChildList = (tabNode as any).subTree?.children || [];\n const searchInputNode = tabChildList.filter((x: VNode) => {\n if (getVNodeName(x) === 'gv-input') return true;\n });\n if (searchInputNode[0]) searchInputNode[0].inputValue = '';\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n exposed.stopLoading();\n\n return result;\n};\n\n/**\n * @todo: jump to new page search\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:23:46\n * @param {*} tabNode\n * @param {*} filterConditions\n * @param {*} fetch\n * @param {*} pageInfo\n */\nconst toNewPageSearch = async (tabNode: ComponentInternalInstance | null, filterConditions: Recordable<any>, fetch: AsyncFn, pageInfo: PageInfo) => {\n if (filterConditions === undefined || filterConditions === null) {\n console.log('分页查询失败: 过滤条件为空', 'error');\n return false;\n }\n if (fetch === undefined || fetch === null) {\n message('Paging query failed: Request method is empty', 'error');\n return false;\n }\n let result: Recordable<any> = [];\n const exposed = tabNode?.exposed;\n exposed?.startLoading();\n\n const sfc = filterConditions || {};\n if (sfc['pageinfo'] === undefined) sfc['pageinfo'] = appendPageInfo() as PageInfo;\n // 更新pageinfo\n sfc['pageinfo'].currentpagenum = pageInfo.currentpagenum;\n sfc['pageinfo'].recordsperpage = pageInfo.recordsperpage;\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n })\n .catch((error) => {\n console.log(error);\n });\n\n exposed?.stopLoading();\n\n return result;\n};\n\n/**\n * @todo: 转换单个结果集对象\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 10:11:53\n * @param {*} result\n */\nconst trans = (result) => result;\n\n/**\n * @todo: table insert row\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:27:57\n * @param {*} searchData\n * @param {*} result\n */\nconst insertResult = (searchData: Recordable<any>, result: any) => {\n if (searchData === null || searchData === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (!Array.isArray(searchData.records)) {\n message('form object is null', 'error');\n return;\n }\n if (result === null || result === undefined) return false;\n\n if (Array.isArray(result)) searchData.records.splice(0, 0, ...result);\n else searchData.records.splice(0, 0, trans(result));\n\n return true;\n};\n\n/**\n * @todo: table update row\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:28:33\n * @param {*} searchData\n * @param {*} result\n * @param {*} rownums\n */\nconst updateResult = (searchData: any, result: any, rownums: number) => {\n if (searchData === null || searchData === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (!Array.isArray(searchData.records)) {\n message('form object is null', 'error');\n return false;\n }\n if (result === null || result === undefined) return false;\n if (Array.isArray(result)) searchData.records.splice(0, 0, ...result);\n else {\n const currentRowArr = searchData.records.filter((x: any) => {\n if (x.rownums === rownums) return true;\n });\n const currentRow = currentRowArr[0];\n Object.keys(result).forEach((x) => {\n if (x !== 'rownums') currentRow[x] = result[x];\n });\n }\n return true;\n};\n\n/**\n * @todo: table remove row\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:29:10\n * @param {*} searchData\n * @param {*} index\n */\nconst removeResult = (searchData: any, index: number) => {\n if (searchData === null || searchData === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (!Array.isArray(searchData.records)) {\n message('form object is null', 'error');\n return false;\n }\n searchData.records.splice(index, 1);\n // 设置总条数 - 1\n if (searchData.total) searchData.total = searchData.total - 1;\n\n return true;\n};\n\n/**\n * @todo: 从后端字典对象 { c, v, e, l1, l2 } 取当前语言展示文本\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-03 18:21:13\n * @param {Recordable} dictObj\n * @param {string} lang\n */\nconst getDictDisplayLabel = (dictObj: Recordable<any>, lang?: string | null): string => {\n if (!dictObj || typeof dictObj !== 'object') return '';\n const locale = lang || 'zh-CN';\n switch (locale) {\n case 'en':\n return dictObj.e ?? dictObj.e ?? dictObj.v ?? '';\n case 'l1':\n return dictObj.l1 ?? dictObj.l1 ?? dictObj.v ?? '';\n case 'l2':\n return dictObj.l2 ?? dictObj.l2 ?? dictObj.v ?? '';\n case 'zh-CN':\n default:\n return dictObj.v ?? dictObj.c ?? '';\n }\n};\n\n/**\n * @todo: reset form edit\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:36:39\n * @param {FormItem[]} formList\n */\nconst resetEditValue = (formList: FormItem[]) => {\n if (formList === null || formList === undefined) {\n message('form object is null', 'error');\n return false;\n }\n formList.forEach((x) => {\n if (x.type !== 'blank' && x.keep !== true)\n switch (x.type) {\n case 'text':\n case 'textarea':\n case 'number':\n x.value = '';\n break;\n case 'date':\n x.value = '';\n break;\n case 'dic':\n x.value = '';\n x.showLabel = '';\n break;\n }\n });\n};\n\n/**\n * @todo: table set form value\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:30:16\n * @param {*} formList\n * @param {*} rowData\n */\nconst setEditValue = (formList: FormItem[], rowData: Recordable<any>) => {\n // console.log(rowData);\n if (formList === null || formList === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (rowData === null || rowData === undefined) {\n message('Set data is null', 'error');\n return false;\n }\n resetEditValue(formList);\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang') || 'zh-CN';\n if (Object.keys(rowData).length !== 0)\n formList.forEach((x) => {\n const fieldValue = rowData[x.field];\n if (fieldValue !== undefined)\n if (x.type !== 'blank' && x.keep !== true)\n // const dicType = x.dicType;\n switch (x.type) {\n case 'text':\n case 'textarea':\n case 'number':\n if (fieldValue !== null && typeof fieldValue === 'object') x.value = fieldValue.c;\n else x.value = fieldValue;\n break;\n case 'date':\n if (x.dateType === 'daterange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'datetime':\n if (x.dateType === 'datetimerange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'time':\n if (x.dateType === 'timerange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'layer':\n if (Array.isArray(fieldValue)) x.value = fieldValue;\n else if (fieldValue) {\n const arr = fieldValue.split(',');\n // const arr = [1, '2', 'a'];\n const arr2 = arr.map((x) => {\n if (!isNaN(parseInt(x))) return x * 1;\n else return x;\n });\n x.value = arr2;\n // console.log(x.value);\n } else x.value = [];\n\n break;\n case 'dic':\n // console.log(rowData[x.field]);\n // if (dicType && dicType.indexOf('t#') !== -1)\n // x.value = rowData[x.field];\n // else {\n // fixme: 增加枚举字典类型赋值 2022-11-07\n if (x.dicType && x.dicType.indexOf('e#') >= 0) {\n if (typeof x.value !== 'object') {\n const enums = x.dicType.split('#');\n const items = enums[1].split(':');\n\n for (let i = 0; i < items.length; i++) {\n const itemChild = items[i].split('=');\n if (itemChild[0] === fieldValue + '') {\n x.value = fieldValue;\n x.showLabel = itemChild[1];\n break;\n }\n }\n }\n } else if (x.multiple)\n if (fieldValue !== null) {\n // 多选字典\n if (typeof fieldValue === 'object') {\n const dictObj = fieldValue;\n const c = dictObj.c;\n const v = getDictDisplayLabel(dictObj, lang);\n\n if (c) {\n const codes = c.split(',');\n const labels = v ? v.split(',') : [];\n x.value = codes.map((code: string, i: number) => ({\n value: code,\n label: labels[i] ?? code,\n }));\n x.showLabel = labels;\n } else {\n x.value = [];\n x.showLabel = [];\n }\n } else if (typeof fieldValue === 'string') {\n const c = fieldValue;\n if (c) {\n const op = [];\n c.split(',').forEach((x) => {\n const o: Recordable<any> = {};\n o.value = x;\n (op as Recordable<any>[]).push(o);\n });\n x.value = op;\n } else x.value = [];\n }\n } else x.value = fieldValue;\n else if (fieldValue !== null && typeof fieldValue === 'object') {\n const dictObj = fieldValue;\n const code = String(dictObj.c ?? '').trim();\n const label = getDictDisplayLabel(dictObj, lang).trim();\n if (!code && !label) {\n x.value = '';\n x.showLabel = '';\n } else {\n x.value = { value: code, label: label || code };\n x.showLabel = label || code;\n }\n } else x.value = fieldValue;\n\n break;\n default:\n x.value = fieldValue;\n break;\n }\n });\n // formList = newList;\n};\n\nconst crud = {\n fetchData,\n submit,\n fetchTable,\n save,\n update,\n search,\n searchNoFm,\n toNewPageSearch,\n insertResult,\n updateResult,\n removeResult,\n setEditValue,\n resetEditValue,\n checkForms,\n};\n\nexport { crud };\n","<!--\n * @title: table component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:32:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 18:08:00\n * @version: 1.0.9\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStorage } from '@/hook/web/useStorage';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvDatePicker } from '@@/GvDatePicker';\n import { GvIcon } from '@@/GvIcon';\n import { GvInput } from '@@/GvInput';\n import { GvPopconfirm } from '@@/GvPopconfirm';\n import type { TPopoverPlacement } from '@@/GvPopover/src/types';\n import { GvTableBar } from '@@/GvTableBar';\n import GvTag from '@@/GvTag/src/GvTag.vue';\n import { debounce, hasClass, hasScrollbar, isEqual, toLine } from '@@/utils';\n import { crud } from '@@/utils/gv.crud';\n import { message } from '@@/utils/gv.notify';\n import { Operation, Refresh } from '@element-plus/icons-vue';\n import {\n ElButton,\n ElButtonGroup,\n ElCheckbox,\n ElDivider,\n ElPagination,\n ElPopover,\n ElRadio,\n ElRadioGroup,\n ElTable,\n ElTableColumn,\n ElTooltip,\n ElTree,\n useGlobalConfig,\n type ComponentSize,\n type TableColumnCtx,\n type TableInstance,\n } from 'element-plus';\n import { computed, defineComponent, getCurrentInstance, nextTick, onMounted, ref, unref, watch, type PropType, type VNode } from 'vue';\n import type { FilterCondition, PageInfo } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('table');\n /** 表头筛选 Popover:覆盖 EP 默认 150px,按内容自适应宽度 */\n const tableHeadFilterPopoverPopperStyle = {\n width: 'max-content',\n minWidth: '180px',\n maxWidth: 'min(420px, 90vw)',\n };\n export default defineComponent({\n name: 'GvTable',\n props: {\n refTable: {\n type: String,\n required: false,\n default: undefined,\n },\n tableHead: {\n type: Array as PropType<TableHeadItem[]>,\n required: true,\n default: () => [],\n },\n tableData: {\n type: Object as PropType<Recordable<any>>,\n required: false,\n default: () => {},\n },\n height: {\n type: [Number, String],\n required: false,\n default: undefined,\n },\n maxHeight: {\n type: [Number, String, undefined] as PropType<number | string | undefined>,\n required: false,\n default: undefined,\n },\n maxWidth: {\n type: [Number, String],\n required: false,\n default: undefined,\n },\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n pageSize: {\n type: Number,\n required: false,\n default: 10,\n },\n rowClassName: {\n type: Function,\n required: false,\n default: () => {},\n },\n rowStyle: {\n type: Function,\n required: false,\n default: () => {},\n },\n spanMethod: {\n type: Function,\n required: false,\n default: () => {},\n },\n cellStyle: {\n type: Function,\n required: false,\n default: () => {},\n },\n // tableImport: {\n // type: Boolean,\n // required: false,\n // default: false\n // },\n // tableExport: {\n // type: Boolean,\n // required: false,\n // default: false\n // },\n tableType: {\n type: String,\n required: false,\n default: undefined,\n },\n tableSort: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n tableKit: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n tableBar: {\n type: Boolean,\n required: false,\n default: true,\n },\n border: {\n type: Boolean,\n required: false,\n default: true,\n },\n tableFetch: {\n type: Function,\n required: false,\n default: () => {},\n },\n multi: {\n // 是否多选\n type: Boolean,\n required: false,\n default: false,\n },\n layout: {\n type: String,\n required: false,\n default: 'total, sizes, prev, pager, next, jumper',\n },\n isShowPage: {\n type: Boolean,\n required: false,\n default: true,\n },\n total: {\n type: Boolean,\n required: false,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n required: false,\n default: 'default',\n },\n tableInit: {\n type: Boolean,\n required: false,\n default: false,\n },\n beforeImport: {\n type: Function,\n required: false,\n default: undefined,\n },\n tableFilter: {\n type: Object,\n required: false,\n default: undefined,\n },\n tableCb: {\n type: Function,\n required: false,\n default: undefined,\n },\n expandRowKeys: {\n type: Array,\n required: false,\n default: undefined,\n },\n limitHeight: {\n type: Boolean,\n required: false,\n default: true,\n },\n tableAction: {\n type: String,\n required: false,\n default: 'left',\n },\n tableActionIcon: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n emits: ['row-dblclick'],\n // emit\n setup(props, { slots, expose, emit, attrs }) {\n // @data\n const appStore = useAppStore();\n const userStore = useUserStore();\n const { getStorage } = useStorage('localStorage');\n const instance = getCurrentInstance();\n let lang = 'zh-CN';\n const sTableAction = appStore.tableAction || props.tableAction;\n const sTableActionIcon = appStore.tableActionIcon;\n const sTableConfirm = appStore.buttonConfirm;\n const detailPlacement: TPopoverPlacement = sTableAction === 'left' ? 'right-start' : 'left-start';\n let sTableType = props.tableType;\n let originTableHead: TableHeadItem[] = props.tableHead;\n let tableHeads: TableHeadItem[] = [];\n const vref = 'gv-table-' + props.refTable;\n const { t } = useBridgeI18n();\n const globalSize = useGlobalConfig('size');\n\n const sHeight = props.height;\n const sMaxHeight = ref(props.maxHeight);\n const sMaxWidth = ref(props.maxWidth || '100%');\n const loading = ref(false);\n let isEditTable = false; // 是否是编辑列表\n const pageInfo = ref<PageInfo>({\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n });\n const filterConditions: FilterCondition[] = [];\n let sPageSize = props.pageSize;\n\n const resultData = ref(props.tableData);\n const recordsList = ref(props.tableData?.records || []);\n const pageSizes = [10, 20, 50, 100, 200, 500];\n let filterHeads: string[] = []; // 表头Q过滤列缓存\n const popoverVisible = ref({}); // popover筛选使用\n const exportBtnDisabled = ref(true); // 导出按钮disabled\n const exportBtnLoading = ref(false); // 导出按钮loading\n const importBtnLoading = ref(false); // 导入按钮loading\n const tableSortMode = ref(1); // 列表默认排序方式\n const exportDialogShow = ref(false); // 导出列弹出框\n const importDialogShow = ref(false); // 导入弹出框\n const sTableBar = ref(props.tableBar); // 是否显示tablebar\n const gTableBar = appStore.tableBar;\n const tableSearchShow = ref(false); // 是否带有table search框\n const sTableSort = ref(props.tableSort); // 是否显示排序模式框\n const sTableKit = ref(props.tableKit); // 是否显示工具按钮\n const showPopoverDetail = null;\n const pageLayout = ref(props.layout);\n let actionWidth: number = 0; // 操作列宽度\n let transHash: Recordable<string> | null = null; // 列表列缓存\n const headColumn = ref<VNode[]>([]); // 列表列\n const headColumnInit = ref<VNode[]>([]);\n\n const columnSums: string[] = []; // 合计列\n const columnSumsDecimal: number[] = []; // 合计列位数\n const isIndeterminate = ref([]); // 表头筛选全选\n\n let isAnchor = false; // 是否锚点中列表\n let isScrollbar = false; // 是否dialog中有滚动条\n let isEditContainer = false; // 是否是editContainer标签内\n const columnTreeList = ref([]); // 列表显示、排序数组\n const columnCheckedKeys = ref<string[]>([]); // 列表显示、排序选中数组\n const storageKey = props.refTable + '-' + userStore.loginAccount; // localStorage存储列表字段key\n let lsTableHeads = '';\n let debounceSearch;\n const tableRefs = ref<Record<string, TableInstance | null>>({}); // 表单实例引用,默认空对象\n const tableRef = ref<TableInstance | null>(null); // ElForm 元素引用\n\n // @computed\n const tableSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n /**\n * @todo: pageinfo\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 11:15:00\n */\n const getPageInfo = computed((): PageInfo => {\n const pi: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n if (resultData.value && resultData.value.records !== undefined) {\n pi['currentpagenum'] = resultData.value.current;\n pi['totalpage'] = resultData.value.pages;\n // if (this.sPageSize)\n // pi['size'] = this.sPageSize;\n // else\n pi['recordsperpage'] = resultData.value.size;\n pi['countrows'] = resultData.value.total;\n }\n return pi;\n });\n\n // @method\n\n const setTableRef = (el: TableInstance | null) => {\n tableRef.value = el;\n if (el && props.refTable) tableRefs.value[vref] = el;\n };\n\n const difference = (newVal, oldVal) => {\n let diff = false;\n for (const key in newVal)\n if (!isEqual(newVal[key], oldVal[key])) {\n diff = true;\n break;\n }\n\n return diff;\n };\n\n /**\n * @todo: close all filter popover\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 13:17:27\n * @param {*} property\n */\n const closeAllPopover = (property?: string) => {\n const next = { ...popoverVisible.value };\n Object.keys(next).forEach((key) => {\n if (key !== property) next[key] = false;\n });\n popoverVisible.value = next;\n };\n\n const ensurePopoverKey = (propKey: string) => {\n if (popoverVisible.value[propKey] === undefined) popoverVisible.value = { ...popoverVisible.value, [propKey]: false };\n };\n\n const handlePopoverWrapper = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n /** 阻止表头/表格事件冒泡,避免点击筛选面板内输入框时关闭 Popover */\n const wrapPopoverFilterBody = (body: VNode) => (\n <div\n class=\"table-popover__content\"\n onMousedown={(e: MouseEvent) => e.stopPropagation()}\n onClick={(e: MouseEvent) => e.stopPropagation()}>\n {body}\n </div>\n );\n const getScrollLeft = () => {\n closeAllPopover();\n };\n\n const startLoading = () => {\n loading.value = true;\n };\n const stopLoading = () => {\n loading.value = false;\n };\n\n /**\n * @todo: calculate max height\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-25 16:16:19\n * @param {*} rootEl\n */\n const getMaxHeight = (rootEl: HTMLElement | undefined) => {\n if (props.limitHeight)\n if (!isEditContainer)\n if (!isScrollbar)\n if (!isAnchor) {\n if (props.tableType !== 'detail')\n if (props.tableType === 'import') sMaxHeight.value = undefined;\n else if (props.maxHeight)\n // if (this.sTableType === 'expand')\n // this.sMaxHeight = undefined;\n // else\n sMaxHeight.value = props.maxHeight;\n else {\n // tab table\n // const tabPane = this.$el.closest('.el-tabs');\n const tabPane = rootEl?.closest('.el-tab-pane');\n // alert(tabPane.clientHeight);\n if (tabPane) {\n // const offsetTop = tabPane.classList.contains('el-tabs--left') ? 235 : 295;\n if (props.isShowPage) sMaxHeight.value = tabPane.clientHeight - 135;\n else sMaxHeight.value = tabPane.clientHeight - 85;\n // sMaxHeight = document.documentElement.clientHeight - tabPane.offsetTop - offsetTop;\n const dialog = rootEl?.closest('.gv-dialog');\n if (!dialog) {\n const drawer = rootEl?.closest('.gv-drawer');\n if (drawer)\n // sMaxHeight = sMaxHeight + 30;\n sMaxHeight.value = undefined;\n } else sMaxHeight.value = undefined; // sMaxHeight = sMaxHeight + 30;\n } else {\n // common table\n const dialog = rootEl?.closest('.gv-dialog');\n if (!dialog) {\n const drawer = rootEl?.closest('.gv-drawer');\n // console.log(document.documentElement.clientHeight);\n // console.log(rootEl?.offsetTop);\n if (!drawer) sMaxHeight.value = document.documentElement.clientHeight - (rootEl?.offsetTop ?? 0) - 150;\n // console.log(sMaxHeight);\n } // dialog\n else sMaxHeight.value = document.documentElement.clientHeight - (rootEl?.offsetTop ?? 0) - 265;\n }\n }\n } else sMaxHeight.value = undefined;\n else sMaxHeight.value = undefined;\n if (sMaxHeight.value && Number(sMaxHeight.value) < 150) sMaxHeight.value = undefined;\n };\n\n /**\n * @todo: trans records\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 11:33:48\n * @param {*} loadAction\n */\n const transRecords = (loadAction?: string) => {\n if (recordsList.value && recordsList.value.length > 0 && recordsList.value[0]['transHash']) {\n transHash = recordsList.value[0]['transHash'];\n recordsList.value.splice(0, 1);\n }\n // add: 增加查询回调方法 2022-11-23\n if (loadAction !== 'create' && props.tableCb) props.tableCb(recordsList.value, resultData.value);\n };\n\n /**\n * @todo: handle import btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 09:43:56\n */\n const handleImport = () => {\n if (props.beforeImport)\n if (props.beforeImport(props.refTable, tableHeads, props.tableData)) {\n importDialogShow.value = true;\n // 设置loading\n importBtnLoading.value = true;\n } else importDialogShow.value = false;\n else {\n importDialogShow.value = true;\n // 设置loading\n importBtnLoading.value = true;\n }\n };\n\n const handleExport = () => {\n exportDialogShow.value = true;\n // 设置loading\n exportBtnLoading.value = true;\n };\n\n /**\n * @todo: import btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 09:41:45\n */\n const getImportBtn = computed(() => {\n if (slots.import?.()) {\n let buttonName = t('tableBar.import');\n if (slots.import?.()[0].props?.['import-name']) buttonName = slots.import?.()[0].props?.['import-name'];\n const ref = 'gv-import-' + props.refTable;\n return (\n <GvButton\n bizType=\"import\"\n ref={ref}\n onClick={handleImport}\n loading={importBtnLoading.value}>\n {buttonName}\n </GvButton>\n );\n } else return null;\n });\n\n /**\n * @todo: get export btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-25 16:22:42\n * @param {*} computed\n */\n const getExportBtn = computed(() => {\n if (slots.export?.()) {\n let buttonName = t('common.export');\n if (slots.export?.()[0].props?.['export-name']) buttonName = slots.export?.()[0].props?.['export-name'];\n const ref = 'gv-export-' + props.refTable;\n return (\n <GvButton\n bizType=\"export\"\n ref={ref}\n onClick={handleExport}\n loading={exportBtnLoading.value}\n disabled={exportBtnDisabled.value}>\n {buttonName}\n </GvButton>\n );\n } else return null;\n });\n\n /**\n * @todo: change page size\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-22 17:24:46\n */\n const runPageSearch = async () => {\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n const fetchFn: Fn = instance?.exposed?.fetch || props.tableFetch;\n if (!fetchFn) {\n message(t('table.execSearchWarn'));\n return;\n }\n const result = await crud.toNewPageSearch(instance, fC, fetchFn, pageInfo.value);\n if (result) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n };\n\n const handleSizeChange = async (val: number) => {\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n getMaxHeight(rootEl);\n pageInfo.value.recordsperpage = val;\n pageInfo.value.currentpagenum = 1;\n sPageSize = val;\n await runPageSearch();\n };\n\n const handleCurrentChange = async (val: number) => {\n pageInfo.value.currentpagenum = val;\n await runPageSearch();\n };\n\n /**\n * @todo: 查询输入框输入响应事件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-19 15:18:03\n * @param {*} val\n */\n const handleTableSearchInput = (val) => {\n debounceSearch(val);\n };\n\n /**\n * @todo: search table input event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-26 22:06:01\n * @param {*} val\n */\n const handleTableSearch = async (val: string) => {\n const fh = {};\n let strFh = '';\n filterHeads.forEach((x: string) => {\n // fixme: 转换@为. 2022-07-20\n let y = x;\n if (y.indexOf('@') > 0) y = y.replace('@', '.');\n if (strFh === '') strFh = toLine(y);\n else strFh += ',' + toLine(y);\n });\n const v = val + '';\n fh['fields'] = strFh;\n fh['val'] = v.trim();\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n fC['searchfilter'] = fh;\n\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n if (!fetch) {\n message(t('table.execSearchWarn'));\n return;\n }\n\n // 拼接 过滤条件\n pageInfo.value.currentpagenum = 1;\n const result = await crud.toNewPageSearch(instance, fC, fetch, pageInfo.value);\n if (result && result.records) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n };\n /**\n * @todo: 列表search框\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-30 17:24:09\n */\n const getTableSearch = () =>\n tableSearchShow.value === true ? (\n <div class=\"gv-table__search\">\n <GvInput\n id=\"gv-table-search\"\n placeholder={`${t('table.tableSearch')}(+)..`}\n prefixIcon=\"gv-icon-sousuo\"\n size=\"default\"\n class=\"gv-table__search-input\"\n onInput={handleTableSearchInput}></GvInput>\n </div>\n ) : null;\n\n /**\n * @todo: table head popover show\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-08 10:43:51\n */\n const handlePopoverShow = () => {\n nextTick(() => {\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n if (rootEl) {\n const popOvers = document.querySelectorAll('body>.table-popover');\n const tableBodyWidth = (rootEl.querySelector('.el-table__body-wrapper >.el-table__body') as HTMLElement)?.style.width;\n const clientWidth = document.body.clientWidth - 200 - 20;\n for (let i = 0; i < popOvers.length; i++)\n if ((popOvers[i] as HTMLElement).style.display !== 'none') {\n const bodyWrapper = rootEl.querySelector('.el-table__body-wrapper') as HTMLElement;\n if (bodyWrapper?.scrollLeft ?? 0)\n (popOvers[i] as HTMLElement).style.left = parseInt(tableBodyWidth) - clientWidth + parseInt((popOvers[i] as HTMLElement).style.left) - (bodyWrapper?.scrollLeft ?? 0) + 'px';\n else (popOvers[i] as HTMLElement).style.left = parseInt((popOvers[i] as HTMLElement).style.left) - (bodyWrapper?.scrollLeft ?? 0) + 'px';\n }\n }\n });\n };\n const handlePopoverHide = () => {\n // this.popoverVisible[prop] = false;\n };\n\n /**\n * @todo: 列选中状态切换\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:44:01\n * @param {*} columns\n * @param {*} checkedKeys\n */\n const createChangedColumns = (columns, checkedKeys) =>\n columns.map((column) => {\n const target = { ...column };\n if (target.type !== 'action' && target.type !== 'expand') target.hasHidden = !checkedKeys.includes(target.prop);\n return target;\n });\n\n /**\n * @todo: 列顺序和选中方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:43:09\n * @param {*} data\n * @param {*} checked\n * @param {*} childChecked\n */\n const handleColumnCheckChange = (data, checked, childChecked) => {\n const checkedKeys = this.$refs['gv-table-column-tree'].$children[0].getCheckedKeys();\n const hColumns = createChangedColumns(tableHeads, checkedKeys);\n // console.log(hColumns);\n headColumn.value = getTableColumn('recreate', hColumns);\n // 存储到 localStorage\n setStoreLocal(checkedKeys, checked, data);\n };\n\n /**\n * @todo: table refresh btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:45:55\n */\n const handleTableRefresh = async () => {\n // 判断search框中是否有值\n const el = instance?.vnode?.el as HTMLElement | undefined;\n if (el) {\n const inputSearch = el.querySelector('.gv-table__search-input .el-input__inner');\n if (inputSearch && inputSearch.value !== undefined && inputSearch.value !== null && inputSearch.value !== '') {\n inputSearch.value = '';\n handleTableSearch('');\n } else {\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n // 拼接 过滤条件\n pageInfo.value.currentpagenum = 1;\n const result = await crud.toNewPageSearch(instance, fC, fetch, pageInfo.value);\n if (result && result.records) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n }\n }\n };\n\n /**\n * @todo: tablebar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 11:21:41\n */\n const getTableBar = () => {\n const btns: any[] = [];\n const defaultSlots = slots.default?.();\n if (defaultSlots && defaultSlots.length > 0)\n defaultSlots.forEach((x: VNode) => {\n // add table btn bar\n if (typeof x.type === 'object' && x.type !== null && 'name' in x.type && x.type.name === 'GvButton') btns.push(x);\n });\n // export btn\n const exportSlots = slots.export?.();\n if (exportSlots && exportSlots.length > 0)\n exportSlots.forEach(() => {\n btns.push(getExportBtn.value);\n });\n\n // import btn\n const importSlots = slots.import?.();\n if (importSlots && importSlots.length > 0)\n importSlots.forEach(() => {\n btns.push(getImportBtn.value);\n });\n\n // console.log(btns);\n return btns;\n };\n\n /**\n * @todo: get kit bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:41:30\n */\n const getKitBar = () => {\n let isVisible = true;\n if (sTableKit.value !== undefined) isVisible = sTableKit.value;\n if (props.tableType === 'import' || props.tableType === 'detail' || props.tableType === 'expand' || props.tableType === 'export') isVisible = false;\n // 行编辑去掉隐藏列功能\n if (isEditTable === true) isVisible = false;\n return isVisible === true ? (\n <div class=\"gv-table__kitbar\">\n <ElButtonGroup>\n <ElButton\n style=\"width: 37px\"\n size={tableSize.value}\n icon={Refresh}\n onClick={handleTableRefresh}\n />\n <ElPopover\n placement=\"bottom-end\"\n width=\"150\"\n trigger=\"click\">\n {{\n reference: () => (\n <ElButton\n size={tableSize.value}\n style={{ width: '37px' }}\n icon={Operation}\n />\n ),\n default: () => (\n <ElTree\n ref=\"gv-table-column-tree\"\n node-key=\"columnProp\"\n tree-data={columnTreeList}\n check-on-click-node={true}\n default-checked-keys={columnCheckedKeys.value}\n show-checkbox\n draggable\n on-check-change={handleColumnCheckChange}\n style={{ maxHeight: '450px', overflow: 'hidden auto' }}\n class=\"gv-table-column-tree\"\n />\n ),\n }}\n </ElPopover>\n </ElButtonGroup>\n </div>\n ) : null;\n };\n\n /**\n * @todo: sort mode\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 11:17:36\n */\n const getSortModel = () => {\n let isVisible = true;\n if (sTableSort.value !== undefined) isVisible = sTableSort.value;\n else isVisible = props.tableType !== 'import';\n return isVisible === true ? (\n <div\n class=\"gv-table__sortmode\"\n style={{ marginRight: `${tableSearchShow.value === true ? '10px' : '0'}` }}>\n <i class=\"iconfont gv-icon-paixu2\" />\n <ElRadioGroup\n modelValue={tableSortMode.value}\n onUpdate:modelValue={(val: number) => {\n tableSortMode.value = val;\n }}\n ref=\"gv-table-sortmode\">\n <ElRadio value={1}>{t('common.currentPage')}</ElRadio>\n <ElRadio\n value={2}\n disabled={pageInfo.value?.totalpage === 1}>\n {t('common.all')}\n </ElRadio>\n </ElRadioGroup>\n </div>\n ) : null;\n };\n\n /**\n * @todo: column filter handler\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:27:41\n * @param {*} e\n * @param {*} propField\n * @param {*} type\n */\n const columnFilterHandler = async (e: MouseEvent, propField: string, type: string) => {\n const popoverHtml = e.target.closest('.table-popover');\n const inputHtml = popoverHtml.querySelector('.gv-input .el-input__inner');\n const checkList = popoverHtml.querySelectorAll('.el-checkbox');\n const dateHtmlArr = popoverHtml.querySelectorAll('.gv-datepicker .el-range-input');\n let filterValue = '';\n switch (type) {\n case 'text':\n case 'number':\n filterValue = inputHtml.value;\n if (filterValue.length === 0)\n // Notify.alert('请输入筛选内容', 'warning');\n return;\n\n break;\n case 'date':\n filterValue = dateHtmlArr[0].value + '|' + dateHtmlArr[1].value;\n break;\n case 'dic':\n if (checkList !== null)\n for (const check of checkList)\n if (hasClass(check, 'is-checked'))\n if (check.innerText !== t('common.checkAll'))\n filterValue = filterValue !== '' ? filterValue + '|' + check.querySelector('.el-checkbox__original').value : check.querySelector('.el-checkbox__original').value;\n\n break;\n }\n if (filterValue.length === 0 || filterValue === '|') {\n message(t('table.columnFilterWarn'));\n return;\n }\n\n if (type === 'date') {\n const pattern = /\\d{4}-\\d{2}-\\d{2}\\\\|\\d{4}-\\d{2}-\\d{2}/;\n if (!pattern.test(filterValue)) {\n message(t('table.columnFilterDateWarn'));\n return;\n }\n }\n\n if (propField !== null) {\n const fh = {};\n fh[toLine(propField.replace('@', '.')) + '|' + type] = filterValue;\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n fC.value['headfilter'] = Object.assign(fC.value['headfilter'] || {}, fh);\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n // 隐藏popover\n popoverVisible.value[propField] = false;\n document.body.click();\n // 拼接 过滤条件\n const result = await crud.toNewPageSearch(this, fC, fetch, pageInfo.value);\n if (result && result.records) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n // 标识筛选列\n const tableHeader = this.$el.querySelector('.gv-table .el-table__header-wrapper .el-table__header');\n const columns = tableHeader.querySelectorAll('.el-table__cell');\n const len = columns.length;\n for (let i = 0; i < len; i++) {\n const h = columns[i].querySelector('.render__header');\n if (h && h.children[0] && h.children[0].getAttribute('columnprop') === propField) h.children[0].classList.add('is-selected');\n }\n // 标识筛选列(带fix)\n const tableFixHeader = this.$el.querySelector('.gv-table .el-table__fixed-header-wrapper .el-table__header');\n if (tableFixHeader !== null) {\n const fixColumns = tableFixHeader.querySelectorAll('.el-table__cell');\n if (fixColumns !== null) {\n const fixLen = fixColumns.length;\n for (let i = 0; i < fixLen; i++) {\n const h = fixColumns[i].querySelector('.render__header');\n if (h && h.children[0] && h.children[0].getAttribute('columnprop') === propField) h.children[0].classList.add('is-selected');\n }\n }\n }\n }\n };\n /**\n * @todo: 列表头筛选重置\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-20 10:05:08\n * @param {*} e\n */\n const columnFilterHandlerReset = async (e: MouseEvent, propField: string, type: stringType) => {\n const popoverHtml = e.target.closest('.table-popover');\n const inputHtml = popoverHtml.querySelector('.gv-input .el-input__inner');\n const checkList = popoverHtml.querySelectorAll('.el-checkbox');\n const dateHtmlArr = popoverHtml.querySelectorAll('.gv-datepicker .el-range-input');\n switch (type) {\n case 'text':\n case 'number':\n inputHtml.value = '';\n break;\n case 'date':\n dateHtmlArr[0].value = '';\n dateHtmlArr[1].value = '';\n break;\n case 'dic':\n if (checkList !== null)\n for (const check of checkList)\n if (hasClass(check, 'is-checked')) {\n // check.classList.remove('is-checked');\n check.querySelector('.el-checkbox__original').checked = false;\n check.querySelector('.el-checkbox__input').classList.remove('is-checked');\n }\n\n break;\n }\n\n if (propField !== null) {\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n const fh = fC.value['headfilter'];\n if (fh !== undefined && fh != null) delete fh[toLine(propField.replace('@', '.')) + '|' + type];\n\n fC.value['headfilter'] = Object.assign(fC.value['headfilter'] || {}, fh);\n\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n\n // 隐藏popover\n popoverVisible.value[propField] = false;\n document.body.click();\n\n if (type !== 'date') {\n const primaryBtn = popoverHtml.querySelector('.el-button--primary');\n primaryBtn.setAttribute('disabled', 'disabled');\n primaryBtn.classList.add('is-disabled');\n }\n\n // 拼接 过滤条件\n const result = await crud.toNewPageSearch(this, fC, fetch, pageInfo.value);\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n // 标识筛选列\n const tableHeader = this.$el.querySelector('.gv-table .el-table__header-wrapper .el-table__header');\n const columns = tableHeader.querySelectorAll('.el-table__cell');\n const len = columns.length;\n for (let i = 0; i < len; i++) {\n const h = columns[i].querySelector('.render__header');\n if (h) if (h.children[0]) if (h.children[0].getAttribute('columnprop') === propField) h.children[0].classList.remove('is-selected');\n }\n const tableFixedHeader = this.$el.querySelector('.gv-table .el-table__fixed-header-wrapper .el-table__header');\n // fixed: 解决列表没有锁定列时报错问题 2023-10-07\n if (tableFixedHeader) {\n const columnsFixed = tableFixedHeader.querySelectorAll('.el-table__cell');\n const lenFixed = columnsFixed.length;\n for (let i = 0; i < lenFixed; i++) {\n const h = columnsFixed[i].querySelector('.render__header');\n if (h) if (h.children[0]) if (h.children[0].getAttribute('columnprop') === propField) h.children[0].classList.remove('is-selected');\n }\n }\n }\n };\n\n /**\n * @todo: set column width by column name\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:12:01\n * @param {*} label\n * @param {*} query\n * @param {*} edit\n */\n const getColWidth = (label: string, query: boolean, edit: boolean) => {\n if (!label) return;\n let label2 = label;\n if (lang === 'en') label2 = label.toLowerCase();\n let sWidth = 0;\n if (label2.indexOf(t('table.date')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.month2')) !== -1) sWidth = 110;\n else if (label2.indexOf(t('table.month')) !== -1) sWidth = 90;\n else if (label2.indexOf(t('table.time')) !== -1) sWidth = 130;\n else if (label2.indexOf(t('table.deliveryTime')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.name')) !== -1) sWidth = 120;\n else if (label2.indexOf(t('table.userAccount')) !== -1) sWidth = 120;\n else if (label === t('table.customerName')) sWidth = 115;\n else if (label2.indexOf(t('table.approve')) !== -1) sWidth = 110;\n else if (label2.indexOf(t('table.audit')) !== -1) sWidth = 110;\n else if (label === t('table.operator')) sWidth = 110;\n else if (label2.indexOf(t('table.staff')) !== -1) sWidth = 100;\n else if (label.indexOf(t('table.whether')) !== -1) sWidth = 110;\n else if (label === t('table.enableStatus')) sWidth = 110;\n else if (label === t('table.orderStatus')) sWidth = 110;\n else if (label2 === t('table.status')) sWidth = 90;\n else if (label2.indexOf(t('table.status')) !== -1) sWidth = 90;\n else if (label === t('table.vin')) sWidth = 185;\n else if (label === t('table.carNo')) sWidth = 105;\n else if (label2.indexOf(t('table.phone')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.tel')) !== -1) sWidth = 110;\n else if (label === t('table.sex')) sWidth = 90;\n else if (label2.indexOf(t('table.type')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.amount')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.money')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.balance')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.unitPrice')) !== -1) sWidth = 95;\n else if (label2.indexOf(t('table.times')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.number')) !== -1) sWidth = 140;\n else if (label2.indexOf(t('table.code')) !== -1) sWidth = 135;\n else if (label2.indexOf(t('table.odd')) !== -1) sWidth = 230;\n else if (label2.indexOf(t('table.unit')) !== -1) sWidth = 110;\n else if (label2.indexOf('省') !== -1) sWidth = 90;\n else if (label2.indexOf('市') !== -1) sWidth = 100;\n else if (label2.indexOf('区') !== -1) sWidth = 120;\n else if (label2.indexOf(t('table.color')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.storageAge')) !== -1) sWidth = 105;\n else if (label2.indexOf(t('table.chassis')) !== -1) sWidth = 105;\n else if (label2.indexOf('排放标准') !== -1) sWidth = 115;\n else if (label2 === t('table.brand')) sWidth = 105;\n else if (label === t('table.series')) sWidth = 105;\n else if (label === t('table.strain')) sWidth = 105;\n else if (label === '运输方式') sWidth = 100;\n else if (label2.indexOf(t('table.rate')) !== -1) sWidth = 110;\n else if (label2.indexOf(t('table.level')) !== -1) sWidth = edit === true ? 140 : 115;\n // fixme: 增加表头query宽度判断 2022-04-30\n if (query === true && sWidth > 0) sWidth += 15;\n\n // fixme: 增加表头edit宽度判断 2022-06-11\n if (edit === true && sWidth > 0) sWidth += 20;\n return sWidth;\n };\n\n /**\n * @todo: table cell formatter\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:19:28\n * @param {*} row\n * @param {*} column\n * @param {*} cellValue\n * @param {*} index\n */\n const columnFormatter = (row, column, cellValue, index: number) => {\n // console.log(column);\n // console.log(cellValue);\n if (cellValue != null && cellValue.v !== undefined) return cellValue.v;\n else return cellValue === undefined ? '' : cellValue;\n };\n\n /**\n * @todo: table header search input change method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-22 09:55:46\n * @param {string} val\n */\n const handleColumnFilter = (val: string) => {\n const popoverHtmlList = Array.from(document.body.querySelectorAll<HTMLElement>('body>.table-popover'));\n let popoverHtml: HTMLElement | undefined;\n for (const pop of popoverHtmlList)\n if (pop.style.display !== 'none') {\n popoverHtml = pop;\n break;\n }\n if (!popoverHtml) return;\n const primaryBtn = popoverHtml.querySelector<HTMLElement>('.el-button--primary');\n if (!primaryBtn) return;\n if (val !== undefined && val !== null && val !== '') {\n primaryBtn.removeAttribute('disabled');\n primaryBtn.classList.remove('is-disabled');\n } else {\n primaryBtn.setAttribute('disabled', 'disabled');\n primaryBtn.classList.add('is-disabled');\n }\n };\n /**\n * @todo: set header filter\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:23:58\n * @param {string} type\n * @param {string} label\n * @param {string} prop\n * @param {string} dicType\n * @param {string} filtercode\n */\n const renderHeadFilter = (type: string, label: string, prop: string, dicType: string | undefined, filtercode: string | undefined) => {\n let render: VNode | null = null;\n let fc = filtercode !== undefined ? filtercode : '';\n switch (type) {\n case 'text':\n case 'number':\n render = (\n <div>\n <GvInput\n placeholder={`${t('table.search')} - ${label}`}\n size={tableSize.value}\n onInput={handleColumnFilter}\n vref={prop}></GvInput>\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size={tableSize.value}\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size={tableSize.value}\n onClick={(e) => columnFilterHandlerReset(e, prop, type)}>\n {t('table.reset')}\n </GvButton>\n </div>\n </div>\n );\n break;\n case 'date':\n render = (\n <div>\n <GvDatePicker\n placeholder={`${t('table.search')} - ${label}`}\n size={tableSize.value}\n type=\"daterange\"\n format={dicType}\n value-format={dicType}\n // onChange={handleColumnFilter}\n vref={prop}\n />\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size={tableSize.value}\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size={tableSize.value}\n onClick={(e) => columnFilterHandlerReset(e, prop, type)}>\n {t('table.reset')}\n </GvButton>\n </div>\n </div>\n );\n break;\n case 'dic':\n if (dicType) {\n let ret = [];\n const src = dicType.toLowerCase();\n let dictCache;\n if (this.$store && this.$store.getters) dictCache = this.$store.getters.dictCache[src];\n if (dicType !== 'xzqh' && dictCache) ret = dictCache;\n // 生成字典列表\n else if (dicType === 'xzqh') {\n if (label.indexOf('省') >= 0) fc = '0000$';\n // else if (label.indexOf('市') >= 0)\n // fc = '^[1-9][1-9][0-9][1-9]00$';\n // else if (label.indexOf('区') >= 0)\n // fc = '^[1-9][1-9][0-9][1-9][0-9][1-9]$';\n\n let dict;\n if (this.$store && this.$store.getters) dict = this.$store.getters.dictDivision;\n if (dict) {\n const cache = {};\n cache['key'] = 'xzqh';\n cache['dict'] = dict;\n this.$store.dispatch('user/addDictCache', cache);\n ret = dict;\n }\n } else {\n let dict;\n if (this.$store && this.$store.getters) dict = this.$store.getters.dict[src];\n if (dict) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dict;\n this.$store.dispatch('user/addDictCache', cache);\n ret = dict;\n }\n }\n // 设置过滤\n let ret2 = ret;\n if (fc) {\n const reg = new RegExp(fc, 'i');\n ret2 = ret.filter((x) => reg.test(x.c));\n }\n // ret.map((x) => {\n // checkList.push(x.c);\n // });\n // console.log(checkList);\n // 最大显示100个\n if (ret2 && ret2.length !== undefined && ret2.length > 0) {\n ret2.splice(50);\n render = (\n <div>\n <div>\n <ElCheckbox\n checked={false}\n key=\"checkAll\"\n label={t('common.checkAll')}\n style={{ display: 'block' }}\n indeterminate={isIndeterminate[prop]}\n onChange={handleDictCheckAll}\n class=\"gv-checkbox\">\n {t('common.checkAll')}\n </ElCheckbox>\n <ElDivider style=\"margin: 5px 0px\" />\n {ret2.map((x) => (\n <ElCheckbox\n checked={false}\n key={x.c}\n label={x.c}\n style={{ display: 'block' }}\n onChange={handleDictCheck}\n class=\"gv-checkbox\">\n {lang === 'zh-CN' ? x.t : x.e}\n </ElCheckbox>\n ))}\n </div>\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size={tableSize.value}\n disabled=\"true\"\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size={tableSize.value}\n onClick={(e) => columnFilterHandlerReset(e, prop, type)}>\n {t('table.reset')}\n </GvButton>\n </div>\n </div>\n );\n } else render = null;\n } else render = null;\n\n break;\n }\n return render ? wrapPopoverFilterBody(render) : null;\n };\n\n /**\n * @todo: open popover\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:22:13\n * @param {*} type\n * @param {*} label\n * @param {*} prop\n * @param {*} dicType\n * @param {*} filtercode\n * @param {*} event\n */\n /** 点击表头筛选箭头:仅关闭其它列 Popover,开关由 ElPopover trigger=click + v-model 处理 */\n const handlePopoverSlotClick = (event: MouseEvent, prop: string) => {\n event?.stopPropagation();\n closeAllPopover(prop);\n };\n\n /**\n * @todo: render column item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 14:37:55\n */\n const renderColumnItem = (item: TableHeadItem, index: number, loadAction: string | undefined, tableFixed: string | undefined) => {\n const {\n prop,\n label,\n fixed,\n width,\n minWidth = 135,\n align = 'left',\n formatter,\n type = 'text',\n dicType,\n query = false,\n render,\n edit = false,\n format,\n cellBlur,\n cellEnter,\n cellChange,\n hidden = false,\n hasHidden = false,\n filtercode,\n showLabel,\n dicRemote,\n isreload = true,\n cb,\n multiple = false,\n dateType = 'date',\n selectable,\n min,\n max,\n collapseTags = false, // 多选字典tag是否折叠\n showLabelProp, // 表选showLabel列\n columnFilter = true, // 表头是否带筛选\n multiLabel = '', // 多级表头\n heads, // 多级表头\n focus,\n } = item;\n let reserveSelection = false;\n if (selectable) reserveSelection = true;\n let sHidden = false;\n if (hidden === true) sHidden = true;\n if (hasHidden === true) sHidden = true;\n if (sHidden === true) return null;\n\n let sLabel = label;\n let sProp = prop;\n if (prop && prop.indexOf('@') > 0) sProp = prop.split('@')[1];\n const key = loadAction === 'create' ? Math.random() : sProp;\n\n let placement: TPopoverPlacement = 'bottom-start';\n if (index >= tableHeads.length - 2) placement = 'bottom-end';\n let sFixed = sTableType === 'expand' ? undefined : fixed;\n if (tableFixed === 'n') sFixed = undefined;\n if (sTableAction === 'right') sFixed = undefined;\n // console.log(sFixed);\n if (sFixed) sLabel = sLabel + '';\n if (query === true) {\n sLabel = sLabel + '(Q)';\n filterHeads.push(prop);\n tableSearchShow.value = true;\n }\n ensurePopoverKey(prop);\n const sortable = sTableType === 'expand' ? false : 'custom';\n\n let sWidth;\n if (width !== 'auto')\n if (width) sWidth = width;\n else sWidth = getColWidth(label, query, edit);\n if (isEditTable === false && edit === true) isEditTable = true;\n\n // 多级表头\n if (multiLabel && multiLabel !== '') {\n if (heads && Array.isArray(heads)) {\n const multiLabels: VNode[] = [];\n heads.forEach((x) => {\n const hType = x.type || 'text';\n let hSLabel = x.label;\n let hSProp = x.prop;\n if (x.prop && x.prop.indexOf('@') > 0) hSProp = x.prop.split('@')[1];\n const hKey = loadAction === 'create' ? Math.random() : hSProp;\n\n let hSFixed = sTableType === 'expand' ? undefined : x.fixed;\n if (tableFixed === 'n') hSFixed = undefined;\n // console.log(sFixed);\n if (hSFixed) hSLabel = hSLabel + '';\n if (x.query === true) {\n hSLabel = hSLabel + '(Q)';\n filterHeads.push(x.prop);\n tableSearchShow.value = true;\n }\n let hReserveSelection = false;\n if (x.selectable) hReserveSelection = true;\n // 初始化 列的筛选popover都是隐藏的\n ensurePopoverKey(x.prop);\n const hSortable = sTableType === 'expand' ? false : 'custom';\n\n let hSWidth;\n if (x.width !== 'auto')\n if (x.width) hSWidth = x.width;\n else hSWidth = getColWidth(x.label, x.query, x.edit);\n multiLabels.push(\n <ElTableColumn\n fixed={hSFixed}\n prop={hSProp}\n label={hSLabel}\n width={hSWidth}\n align={x.align}\n column-key={hSProp}\n key={hKey}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={hSortable}\n selectable={x.selectable}\n reserveSelection={hReserveSelection}\n header-align={x.align || 'left'}\n style={{ display: sHidden ? 'none' : '' }}\n sort-orders={['ascending', 'descending']}>\n {{\n header: () => (\n <div\n onClick={(e) => handlePopoverWrapper(e)}\n class=\"render__header\">\n <ElPopover\n visible={popoverVisible.value[x.prop]}\n onUpdate:visible={(val: boolean) => {\n popoverVisible.value = { ...popoverVisible.value, [x.prop]: val };\n }}\n trigger=\"click\"\n width=\"auto\"\n popperStyle={tableHeadFilterPopoverPopperStyle}\n showArrow={true}\n placement={placement}\n popperClass={`gv-popover table-popover table-popover-${props.refTable}`}\n onAfter-enter={handlePopoverShow}\n onAfter-leave={handlePopoverHide}>\n {{\n default: () => renderHeadFilter(hType, x.label, x.prop, x.dicType, x.filtercode),\n reference: () => (\n <div\n class=\"gv-table-header-filter\"\n onClick={(e) => handlePopoverSlotClick(e, x.prop)}>\n {hSLabel}\n <GvIcon\n iconType=\"el\"\n iconName=\"ArrowDown\"></GvIcon>\n </div>\n ),\n }}\n </ElPopover>\n </div>\n ),\n }}\n </ElTableColumn>,\n );\n });\n return <ElTableColumn label={multiLabel + ''}>{multiLabels}</ElTableColumn>;\n }\n } else if (typeof render === 'function') {\n // 自定义字段 render\n let className = 'gv-cell__render';\n if (edit === true) className += ' gv-cell__isedit';\n return (\n <ElTableColumn\n // fixed = {fixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n key={key}\n column-key={sProp}\n show-overflow-tooltip={false}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']}\n class-name={className}>\n {{\n default: (scope) => {\n const render1 = render(scope, sProp);\n return render1;\n },\n header: () => <div class=\"render__header\">{label}</div>,\n }}\n </ElTableColumn>\n );\n } else if (edit === true)\n return (\n <ElTableColumn\n style={{ display: sHidden ? 'none' : '' }}\n fixed={sFixed}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n key={key}\n column-key={sProp}\n show-overflow-tooltip={false}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']} // null\n // filters={this.columnFilters}\n // filter-method={this.filterHandler}\n // filter-placement='bottom-start'\n class-name=\"gv-cell__isedit\">\n {{\n default: (scope) => {\n // if (this.renderMap[`${scope.$index}-${sProp}`] === undefined) {\n const render1 = renderRowEdit(\n scope,\n label,\n sProp,\n prop,\n type,\n dicType,\n format,\n cellBlur,\n cellEnter,\n filtercode,\n showLabel,\n dicRemote,\n isreload,\n cb,\n multiple,\n dateType,\n render,\n cellChange,\n min,\n max,\n collapseTags,\n showLabelProp,\n focus,\n );\n return render1;\n },\n header: () => <div class=\"render__header\">{label}</div>,\n }}\n </ElTableColumn>\n );\n else if (type === 'tag')\n // 设置tag\n return (\n <ElTableColumn\n fixed={sFixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n key={sProp}\n column-key={sProp}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']}\n class-name=\"gv-cell__render\">\n {{\n default: (scope) =>\n scope.row[sProp] !== null && typeof scope.row[sProp] === 'object' ? (\n scope.row[sProp].v ? (\n <GvTag>{scope.row[sProp].v}</GvTag>\n ) : null\n ) : scope.row[sProp] ? (\n <GvTag>{scope.row[sProp]}</GvTag>\n ) : null,\n header: () => <div class=\"render__header\">{sLabel}</div>,\n }}\n </ElTableColumn>\n );\n else if (\n dicType !== 'company' &&\n dicType !== 'dept' &&\n dicType !== 'user' &&\n label.indexOf('市') === -1 &&\n label.indexOf('区县') === -1 &&\n label.indexOf('区/县') === -1 &&\n props.tableType !== 'list' &&\n props.tableType !== 'detail' &&\n props.tableType !== 'expand' &&\n props.tableType !== 'import'\n )\n if (columnFilter !== true)\n return (\n // add: af-table-column插件,计算列宽对于表头带有排序、(Q)等情况自适应列款不准确\n <ElTableColumn\n fixed={sFixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n column-key={sProp}\n key={key}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n selectable={selectable}\n reserveSelection={reserveSelection}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']} // null\n >\n {{\n header: () => <div class=\"render__header\">{sLabel}</div>,\n }}\n </ElTableColumn>\n );\n else\n return (\n // add: af-table-column插件,计算列宽对于表头带有排序、(Q)等情况自适应列款不准确\n <ElTableColumn\n fixed={sFixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n column-key={sProp}\n key={key}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n selectable={selectable}\n reserveSelection={reserveSelection}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']} // null\n >\n {{\n header: () => (\n <div\n onClick={(e) => handlePopoverWrapper(e)}\n class=\"render__header\">\n <ElPopover\n visible={popoverVisible.value[prop]}\n onUpdate:visible={(val: boolean) => {\n popoverVisible.value = { ...popoverVisible.value, [prop]: val };\n }}\n trigger=\"click\"\n width=\"auto\"\n popperStyle={tableHeadFilterPopoverPopperStyle}\n showArrow={true}\n placement={placement}\n popperClass={`gv-popover table-popover table-popover-${props.refTable}`}\n onAfter-enter={handlePopoverShow}\n onAfter-leave={handlePopoverHide}>\n {{\n default: () => renderHeadFilter(type, label, prop, dicType, filtercode),\n reference: () => (\n <div\n class=\"gv-table-header-filter\"\n onClick={(e) => handlePopoverSlotClick(e, prop)}>\n {sLabel}\n <GvIcon\n iconType=\"el\"\n iconName=\"ArrowDown\"></GvIcon>\n </div>\n ),\n }}\n </ElPopover>\n </div>\n ),\n }}\n </ElTableColumn>\n );\n else\n return (\n <ElTableColumn\n fixed={sFixed}\n prop={sProp}\n style={{ display: sHidden ? 'none' : '' }}\n label={sLabel}\n width={sWidth}\n align={align}\n key={sProp}\n selectable={selectable}\n reserveSelection={reserveSelection}\n column-key={sProp}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']}>\n {{\n header: () => <div class=\"render__header\">{props.tableType === 'list' ? sLabel : label}</div>,\n }}\n </ElTableColumn>\n );\n };\n\n /**\n * @todo: action column\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 14:08:55\n */\n const renderAction = (scope, content: string[], action: any[], render: Fn | undefined, confirmArr: boolean[], iconArr: string[]) => {\n let sContent = content;\n if (render) sContent = render(scope, content);\n return (\n <div class=\"flex\">\n {sContent.map((item: string, index: number) => {\n let x = item;\n let xx = 't';\n let disabled = false;\n if (item.indexOf('|') > 0) {\n const arr = item.split('|');\n x = arr[0];\n if (arr[1] === 'd') {\n xx = 't';\n disabled = true;\n // xx = arr[1];\n }\n }\n // console.log(item);\n let confirms = false;\n if (confirmArr) confirms = confirmArr[index];\n let detail = false;\n let icon = '';\n\n let actionType = '';\n if (x.indexOf(t('table.edit')) !== -1 || x.indexOf(t('table.modify')) !== -1 || x.indexOf(t('table.update')) !== -1) icon = 'el-icon-edit';\n else if (x.indexOf(t('table.delete')) !== -1 || x.indexOf(t('table.cancel')) !== -1) {\n icon = 'el-icon-delete';\n confirms = true;\n } else if (x.indexOf(t('table.add')) !== -1) icon = 'gv-icon-add';\n else if (x.indexOf(t('table.scheduling')) !== -1 || x.indexOf(t('table.production')) !== -1) icon = 'gv-icon-task';\n else if (x.indexOf(t('table.append')) !== -1) {\n actionType = '1';\n icon = 'gv-icon-baocun2';\n } else if (x.indexOf(t('table.disabled')) !== -1) {\n icon = 'gv-icon-tingyong';\n confirms = true;\n } else if (x.indexOf(t('table.cancel1')) !== -1) {\n icon = 'gv-icon-tingyong';\n confirms = true;\n } else if (x.indexOf(t('table.close')) !== -1) {\n icon = 'el-icon-circle-close';\n confirms = true;\n } else if (x.indexOf(t('table.detail')) !== -1) {\n icon = 'gv-icon-mingxi';\n detail = true;\n } else if (x.indexOf(t('table.logging')) !== -1) {\n icon = 'gv-icon-daiban';\n detail = true;\n } else if (x.indexOf(t('table.info')) !== -1 || x.indexOf(t('table.infos')) !== -1) icon = 'gv-icon-info';\n else if (x.indexOf(t('table.view')) !== -1) icon = 'gv-icon-info';\n else if (x.indexOf(t('table.message')) !== -1) icon = 'gv-icon-info';\n else if (x.indexOf(t('table.price')) !== -1) icon = 'gv-icon-jiage1';\n else if (x.indexOf(t('table.money')) !== -1) icon = 'gv-icon-jiage1';\n else if (x.indexOf(t('table.dispatch')) !== -1) icon = 'gv-icon-winfo-icon-zhipai';\n else if (x.indexOf(t('table.adjust')) !== -1) icon = 'gv-icon-wujiliandongdizhi';\n else if (x.indexOf(t('table.leaveFactory')) !== -1 || x.indexOf(t('table.delivery')) !== -1) icon = 'gv-icon-paichesonghuodan';\n else if (x.indexOf(t('table.quit')) !== -1 || x.indexOf(t('table.transfer')) !== -1) icon = 'gv-icon-zhipai';\n else if (x.indexOf(t('table.submit')) !== -1 || x.indexOf(t('table.report')) !== -1) icon = 'gv-icon-tijiao';\n else if (x.indexOf(t('table.download')) !== -1) icon = 'gv-icon-xiazai';\n else if (x.indexOf(t('table.upload')) !== -1) icon = 'gv-icon-fujian';\n else if (x.indexOf(t('table.notify')) !== -1) icon = 'gv-icon-huodong';\n else if (x.indexOf(t('table.send')) !== -1) icon = 'gv-icon-xiazaidaorumoban1x';\n else if (x.indexOf(t('table.freeze')) !== -1) icon = 'gv-icon-dongjie';\n else if (x.indexOf(t('table.apply')) !== -1) icon = 'gv-icon-biaoshilei_yuanchengshengji';\n else if (x.indexOf(t('table.unfreeze')) !== -1) icon = 'gv-icon-jiedong';\n else if (x.indexOf(t('table.qrcode')) !== -1) icon = 'gv-icon-erweima';\n else if (x.indexOf(t('table.build')) !== -1) icon = 'gv-icon-rocket';\n else if (x.indexOf(t('table.confirm')) !== -1) icon = 'gv-icon-tianshenpi';\n else if (x.indexOf(t('table.proxyPay')) !== -1) icon = 'gv-icon-bengchefenleijiageguanli';\n else if (x.indexOf(t('table.open')) !== -1) icon = 'gv-icon-addNode';\n else if (x.indexOf(t('table.audit')) !== -1) icon = 'gv-icon-shenpi2';\n else if (x.indexOf(t('table.top')) !== -1) icon = 'gv-icon-zhidingxian';\n else if (x.indexOf(t('table.publish')) !== -1) icon = 'gv-icon-fabu';\n else if (x.indexOf(t('table.withdraw')) !== -1) icon = 'gv-icon-fanhui5';\n else if (x.indexOf(t('table.cost')) !== -1) icon = 'gv-icon-yingshou';\n else if (x.indexOf(t('table.approve')) !== -1) icon = 'gv-icon-shenpi2';\n else if (x.indexOf(t('table.reject')) !== -1) icon = 'gv-icon-shenqingbohui';\n else if (x.indexOf(t('table.exec')) !== -1) icon = 'gv-icon-kaishi_yunhang';\n else if (x.indexOf(t('table.recover')) !== -1) icon = 'gv-icon-huifu1';\n else if (x.indexOf(t('table.dispose')) !== -1) icon = 'gv-icon-task';\n else if (x.indexOf(t('table.ok')) !== -1) icon = 'gv-icon-xuanze';\n else if (x.indexOf(t('table.select')) !== -1) icon = 'gv-icon-xuanze';\n else if (x.indexOf(t('table.lock')) !== -1) icon = 'el-icon-lock';\n else if (x.indexOf(t('table.unLock')) !== -1) icon = 'el-icon-unlock';\n else if (x.indexOf(t('table.enable')) !== -1) icon = 'gv-icon-yunhang';\n else if (x.indexOf(t('table.transmit')) !== -1) icon = 'gv-icon-xiada';\n else if (x.indexOf(t('table.putaway')) !== -1) icon = 'el-icon-top';\n else if (x.indexOf(t('table.soldOut')) !== -1) icon = 'el-icon-bottom';\n else if (x.indexOf(t('table.transferPeople')) !== -1) icon = 'gv-icon-zhuanpai1';\n else if (x.indexOf(t('table.copy')) !== -1) icon = 'el-icon-copy-document';\n else if (x.indexOf(t('table.followUp')) !== -1) icon = 'gv-icon-mingdangenjin';\n else if (x.indexOf(t('table.circleCheck')) !== -1) icon = 'gv-icon-huanjiance';\n else if (x.indexOf(t('table.completed')) !== -1) icon = 'gv-icon-xuanze';\n else if (x.indexOf(t('table.finished')) !== -1) icon = 'gv-icon-wangongguanli';\n else if (x.indexOf(t('table.beCompleted')) !== -1) icon = 'gv-icon-wangongqueren';\n else if (x.indexOf(t('table.openCard')) !== -1) icon = 'gv-icon-daka-copy';\n else if (x.indexOf(t('table.closeCard')) !== -1) icon = 'gv-icon-guanqia';\n else if (x.indexOf(t('table.clockIn')) !== -1) icon = 'gv-icon-qiandao';\n else if (x.indexOf(t('table.preview')) !== -1) icon = 'el-icon-view';\n else if (x.indexOf(t('table.replace')) !== -1) icon = 'gv-icon-tihuantupian';\n else if (x.indexOf(t('table.settlement')) !== -1) icon = 'gv-icon-eduguanli';\n else if (x.indexOf(t('table.inWarehouse')) !== -1) icon = 'gv-icon-caituiruku';\n else if (x.indexOf(t('table.save')) !== -1) {\n icon = 'gv-icon-baocun1';\n actionType = '1';\n } else icon = 'el-icon-document-copy';\n\n // added by andy.ten@tom.com 2024-08-14 增加自定义按钮icon\n if (iconArr && Array.isArray(iconArr) && iconArr.length > index && iconArr[index]) icon = iconArr[index];\n if (sTableActionIcon === false) icon = '';\n if (confirms === true)\n if (sTableConfirm === false)\n return icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n icon={icon}\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n confirm('是否?').then(\n () => {\n if (scope.lock === undefined || scope.lock === false) {\n if (loading.value === true) return;\n startLoading();\n scope.lock = true;\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n scope.lock = false;\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }}></GvButton>\n </span>\n </div>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n type=\"text\"\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n confirm(`${t('table.isConfirm')} ${x} ${t('table.action')} ?`).then(\n () => {\n if (scope.lock === undefined || scope.lock === false) {\n if (loading.value === true) return;\n startLoading();\n scope.lock = true;\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n scope.lock = false;\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }}>\n {x}\n </GvButton>\n </span>\n </div>\n </ElTooltip>\n );\n else\n return (\n <GvPopconfirm\n title={`${t('table.isConfirm')} ${x} ${t('table.action')} ?`}\n onConfirm={() => {\n if (scope.lock === undefined || scope.lock === false) {\n if (loading.value === true) return;\n startLoading();\n scope.lock = true;\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n scope.lock = false;\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }\n }}>\n {{\n reference: () => (\n <div class=\"gv-table-action-trigger\">\n {icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n icon={icon}\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}></GvButton>\n </span>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n type=\"text\"\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}>\n {x}\n </GvButton>\n </span>\n </ElTooltip>\n )}\n </div>\n ),\n }}\n </GvPopconfirm>\n );\n else if (detail === true)\n return (\n <ElPopover\n title={x}\n placement={detailPlacement}\n trigger=\"click\"\n showArrow={true}\n onAfter-enter={() => handleDetailPopoverShow(action, index, scope.row, scope.$index)}\n popperClass=\"gv-popconfirm\">\n {{\n reference: () => (\n <div class=\"gv-table-action-trigger\">\n {icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n icon={icon}\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}></GvButton>\n </span>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n type=\"text\"\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}>\n {x}\n </GvButton>\n </span>\n </ElTooltip>\n )}\n </div>\n ),\n default: () => showPopoverDetail,\n }}\n </ElPopover>\n );\n else\n // action btn\n return icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n visible={xx === 't'}\n disabled={disabled}\n text={x}\n size={tableSize.value}\n onClick={() => {\n // event.preventDefault();\n // event.stopPropagation();\n if (actionType === '1') {\n if (checkEditRow(scope.$index))\n try {\n startLoading();\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n } else\n try {\n startLoading();\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n }}\n icon={icon}></GvButton>\n </span>\n </div>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n visible={xx === 't'}\n disabled={disabled}\n text={x}\n size={tableSize.value}\n type=\"text\"\n onClick={() => {\n // event.preventDefault();\n // event.stopPropagation();\n startLoading();\n if (actionType === '1') {\n if (checkEditRow(scope.$index))\n try {\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n } else\n try {\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n }}>\n {x}\n </GvButton>\n </span>\n </div>\n </ElTooltip>\n );\n })}\n </div>\n );\n };\n\n /**\n * @todo: get table header columns\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 12:03:16\n * @param {*} loadAction\n * @param {*} tableColumns\n */\n const getTableColumn = (loadAction?: string, tableColumns?: TableHeadItem[]) => {\n const res: VNode[] = [];\n tableHeads = loadAction === 'recreate' ? tableColumns! : props.tableHead;\n // 从localStorage中获取已保存的列表显示信息\n if (loadAction === 'create') {\n lsTableHeads = getStorage(storageKey);\n if (lsTableHeads) {\n const thd: TableHeadItem[] = [];\n const lsTableHeadsArr = lsTableHeads.split(',');\n let startIndex = 0;\n if (tableHeads[0].type === 'expand') {\n thd[0] = { ...tableHeads[0] } as TableHeadItem;\n startIndex = 0;\n if (tableHeads[1].type === 'action') thd[1] = { ...tableHeads[1] } as TableHeadItem;\n startIndex = 1;\n } else if (tableHeads[0].type === 'action') {\n startIndex = 0;\n thd[0] = { ...tableHeads[0] } as TableHeadItem;\n }\n\n lsTableHeadsArr.forEach((x: string, index: number) => {\n const xx = x.split('|');\n const ff = tableHeads.filter((f) => f.prop === xx[0]);\n if (ff.length > 0) {\n if (ff[0].hidden !== true) {\n ff[0].hasHidden = xx[1] === 't';\n const treeNode = {\n columnProp: ff[0].prop,\n label: ff[0].label,\n };\n if (loadAction === 'create') {\n (columnTreeList.value as any[]).push(treeNode);\n if (ff[0].hasHidden !== true && xx[1] !== 't') columnCheckedKeys.value.push(ff[0].prop);\n }\n }\n thd[index + startIndex] = { ...ff[0] };\n }\n });\n tableHeads = thd;\n }\n }\n\n // 第一列为序号列\n // let fixed = this.tableType !== 'detail';\n let fixed: string | undefined = sTableAction;\n if (tableHeads[0].type === 'expand') {\n fixed = undefined as unknown as string;\n sTableType = 'expand';\n }\n\n if (sTableType === 'expand') fixed = undefined as unknown as string;\n // 如果是edit多选列表,则去掉列锁定\n let tableFixed = 'y';\n if (tableHeads.some((x) => x.multiple === true)) {\n tableFixed = 'n';\n fixed = undefined;\n }\n\n if (props.multi === true) {\n fixed = undefined;\n tableFixed = 'n';\n }\n\n // 添加展开列\n if (tableHeads[0].type === 'expand')\n res.push(\n <ElTableColumn\n type=\"expand\"\n key=\"expand\"\n column-key=\"expand\"\n prop=\"expand\"\n width=\"42\"\n fixed={fixed}>\n {{ default: (scope: any) => tableHeads[0].render?.(scope) }}\n </ElTableColumn>,\n );\n let rownumWidth = '55';\n if (pageInfo.value?.currentpagenum)\n if (pageInfo.value.currentpagenum * pageInfo.value.totalpage > 10000) rownumWidth = '65';\n else if (pageInfo.value.currentpagenum * pageInfo.value.totalpage > 1000) rownumWidth = '57';\n\n if (fixed === 'left')\n res.push(\n <ElTableColumn\n fixed={fixed}\n // prop='rownums'\n key=\"rownums\"\n column-key=\"rownums\"\n label={t('table.rownums')}\n width={rownumWidth}\n min-width={rownumWidth}>\n {{\n default: (scope) => {\n // console.log(this.pageInfo.current);\n // console.log((this.pageInfo.current === -1 ? 0 : this.pageInfo.current - 1) * (this.pageInfo.size === -1 ? 0 : this.pageInfo.size));\n if (pageInfo.value?.currentpagenum) return (pageInfo.value.currentpagenum === -1 ? 0 : pageInfo.value.currentpagenum - 1) * pageInfo.value.totalpage + scope.$index + 1;\n else return scope.$index + 1;\n },\n }}\n </ElTableColumn>,\n );\n else\n res.push(\n <ElTableColumn\n // prop='rownums'\n key=\"rownums\"\n column-key=\"rownums\"\n label={t('table.rownums')}\n width={rownumWidth}\n min-width={rownumWidth}>\n {{\n default: (scope) => {\n if (pageInfo.value?.currentpagenum) return (pageInfo.value.currentpagenum === -1 ? 0 : pageInfo.value.currentpagenum - 1) * pageInfo.value.totalpage + scope.$index + 1;\n else return scope.$index + 1;\n },\n }}\n </ElTableColumn>,\n );\n // add: 第二列判断是否是多选框 2022-06-11\n if (props.multi === true)\n if (fixed === 'left')\n res.push(\n <ElTableColumn\n fixed=\"left\"\n prop=\"multi\"\n key=\"multi\"\n type=\"selection\"\n width=\"35\"></ElTableColumn>,\n );\n else\n res.push(\n <ElTableColumn\n prop=\"multi\"\n key=\"multi\"\n type=\"selection\"\n width=\"35\"></ElTableColumn>,\n );\n\n const actionHead = tableHeads.filter((x) => x.type === 'action');\n if (sTableAction === 'left')\n if (actionHead.length > 0) {\n const content = actionHead[0].content || [];\n const action = actionHead[0].action || [];\n const render = actionHead[0].render;\n const confirmArr = actionHead[0].confirm || [];\n const icon = actionHead[0].icon || [];\n if (actionHead[0].width) actionWidth = +actionHead[0].width;\n else if (sTableActionIcon === true)\n if (content.length === 1)\n // update: 对于只有一个按钮的操作列,设置固定宽度 2022-07-13\n actionWidth = 52;\n else actionWidth = content.length === 2 ? content.length * 44 : content.length * 42;\n else if (content.length === 1) actionWidth = content.join('').length * 30;\n else if (lang === 'zh_CN') actionWidth = content.join('').length * 25;\n else actionWidth = content.join('').length * 13;\n\n const actionColumn = (\n <ElTableColumn\n label={t('table.action')}\n key=\"caozuo\"\n column-key=\"caozuo\"\n prop=\"caozuo\"\n fixed={fixed}\n width={actionWidth}>\n {{ default: (scope: any) => renderAction(scope, content, action, render, confirmArr, icon) }}\n </ElTableColumn>\n );\n res.push(actionColumn);\n }\n\n filterHeads = [];\n tableHeads.forEach((item: TableHeadItem, index: number) => {\n if (item.type !== 'expand' && item.type !== 'action') {\n const columnVNode = renderColumnItem(item, index, loadAction, tableFixed);\n if (columnVNode) res.push(columnVNode);\n if (!lsTableHeads && loadAction === 'create')\n if (item.hidden !== true) {\n const treeNode = {\n columnProp: item.prop,\n label: item.label,\n };\n (columnTreeList.value as any[]).push(treeNode);\n columnCheckedKeys.value.push(item.prop);\n }\n }\n\n // this.$set(this.tableHead, index, item);\n // if (loadAction === 'create')\n // this.$set(this.resultData, index, item);\n });\n if (sTableAction === 'right')\n if (actionHead.length > 0) {\n const content = actionHead[0].content || [];\n const action = actionHead[0].action || [];\n const render = actionHead[0].render;\n const confirmArr = actionHead[0].confirm || [];\n const icon = actionHead[0].icon || [];\n if (actionHead[0].width) actionWidth = +actionHead[0].width;\n else if (sTableActionIcon === true)\n if (content.length === 1)\n // update: 对于只有一个按钮的操作列,设置固定宽度 2022-07-13\n actionWidth = 52;\n else actionWidth = content.length === 2 ? content.length * 44 : content.length * 42;\n else if (content.length === 1)\n if (lang === 'zh_CN') actionWidth = content.join('').length * 30;\n else actionWidth = content.join('').length * 18;\n else if (lang === 'zh_CN') actionWidth = content.join('').length * 25;\n else actionWidth = content.join('').length * 13;\n\n const actionColumn = (\n <ElTableColumn\n label={t('table.action')}\n key=\"caozuo\"\n column-key=\"caozuo\"\n prop=\"caozuo\"\n fixed={fixed}\n width={actionWidth}>\n {{ default: (scope: any) => renderAction(scope, content, action, render, confirmArr, icon) }}\n </ElTableColumn>\n );\n res.push(actionColumn);\n }\n\n // this.setDataLoaded(false);\n return res;\n };\n\n /**\n * @todo: table sort\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-25 17:45:10\n */\n const sortMethod = async ({ column, prop, order }: { column: Recordable<any>; prop: string | null; order: 'ascending' | 'descending' | null }) => {\n const fieldName = prop || column?.property;\n const sortingType = order ?? column?.order ?? null;\n if (tableSortMode.value === 1) {\n // 本页排序\n let sumData = {}; // 放置总计一行数据\n recordsList.value.forEach((item) => {\n if (item.name === t('common.total')) sumData = item;\n });\n if (sortingType === null)\n recordsList.value = recordsList.value.sort((a, b) => {\n let row1 = a['rownums'];\n let row2 = b['rownums'];\n // fixme: 增加判断是否是字典项 2022-06-20\n if (row1.v) row1 = row1.v;\n\n if (row2.v) row2 = row2.v;\n if (!isNaN(Number(row1)) && !isNaN(Number(row2))) return row1 - row2;\n else return row1.toString().localeCompare(row2.toString());\n });\n else if (sortingType === 'ascending' || sortingType === null) {\n // 正序\n recordsList.value = recordsList.value.sort((a, b) => {\n let row1 = a[fieldName] || '';\n let row2 = b[fieldName] || '';\n // fixme: 增加判断是否是字典项 2022-06-20\n if (row1.v) row1 = row1.v;\n\n if (row2.v) row2 = row2.v;\n if (!isNaN(Number(row1)) && !isNaN(Number(row2))) return row1 - row2;\n else return row1.toString().localeCompare(row2.toString());\n });\n // 删除table中的总计\n recordsList.value.forEach((item, index) => {\n if (item.name === t('common.total')) recordsList.value.splice(index, 1);\n return item;\n });\n if (Object.keys(sumData).length > 0) recordsList.value.push(sumData);\n } else if (sortingType === 'descending') {\n // 倒序\n recordsList.value = recordsList.value.sort((a, b) => {\n let row1 = a[fieldName] || '';\n let row2 = b[fieldName] || '';\n // fixme: 增加判断是否是字典项 2022-06-20\n if (row1.v) row1 = row1.v;\n\n if (row2.v) row2 = row2.v;\n if (!isNaN(Number(row1)) && !isNaN(Number(row2))) return row2 - row1;\n else return row2.toString().localeCompare(row1.toString());\n });\n recordsList.value.map((item, index) => {\n if (item.name === t('common.aggregate')) recordsList.value.splice(index, 1);\n return item;\n });\n if (Object.keys(sumData).length > 0) recordsList.value.push(sumData);\n }\n } else {\n // 后端排序\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n const fetchFn = (instance?.exposed?.fetch as Fn) || props.tableFetch;\n if (!fetchFn) {\n message(t('table.execSearchWarn'));\n return;\n }\n const oi: Recordable<string> = {};\n\n oi['orderfilter'] = fieldName;\n oi['ordertype'] = sortingType === 'ascending' ? 'asc' : 'desc';\n fC['orderinfo'] = oi;\n const result = await crud.toNewPageSearch(instance, fC, fetchFn, pageInfo.value);\n if (result) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n }\n\n // 隐藏popover\n popoverVisible.value[fieldName] = false;\n document.body.click();\n };\n\n /**\n * @todo: row dblclick event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-08 11:15:41\n * @param {*} row\n * @param {*} column\n * @param {*} event\n */\n const rowDblClick = (row: Recordable<any>, column: TableColumnCtx<Recordable<any>> | null, event: MouseEvent) => {\n const target = event.target as HTMLElement | null;\n if (!target) return;\n // fixme: 屏蔽行中带有icon图标双击事件 2022-12-12\n if (target.tagName === 'I') return;\n else {\n const cell = target.closest('.el-table__cell');\n if (cell && hasClass(cell as HTMLElement, 'el-table__expand-column')) return;\n }\n if (isEditTable === false)\n if (typeof attrs.onRowDblclick === 'function') emit('row-dblclick', row, column, event);\n else {\n const tr = target.closest('.el-table__row');\n if (!tr) return;\n const tds = tr.children;\n let firstBtn: HTMLElement | null = null;\n for (let i = 0; i < tds.length; i++) {\n const btnArr = tds[i].querySelectorAll<HTMLElement>('.cell button.gv-button');\n for (let j = 0; j < btnArr.length; j++) {\n const btn = btnArr[j];\n // fixme: 解决隐藏按钮后双击仍然调用问题 2022-10-09\n if (btn && btn.style.display !== 'none') {\n firstBtn = btn;\n break;\n }\n }\n if (firstBtn) break;\n }\n firstBtn?.click();\n }\n };\n\n /**\n * @todo: 合并表格行或合并列方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-16 14:27:07\n */\n // const handleSpanMethod = (columnObj) => {\n // props.spanMethod(columnObj);\n // };\n\n // const getSummaries = (param) => {\n // const { columns, data } = param;\n // const sums = [];\n // columns.forEach((column, index) => {\n // if (column.columnKey === 'rownums') {\n // sums[index] = t('common.total');\n // return;\n // }\n // if (column.property === 'multi' || column.columnKey === 'caozuo' || column.columnKey === 'expand') return;\n // const keyIndex = columnSums.indexOf(column.property);\n // if (keyIndex !== -1) {\n // const values = data.map((item) => Number(item[column.property]));\n // if (!values.every((value) => isNaN(value))) {\n // sums[index] = values.reduce((prev, curr) => {\n // const value = Number(curr);\n // if (!isNaN(value)) return prev + curr;\n // else return prev;\n // }, 0);\n // const decimal = columnSumsDecimal[keyIndex];\n // sums[index] = amountFormat(sums[index], decimal);\n // sums[index] += '';\n // } else sums[index] = '';\n // } else return;\n // });\n // return sums;\n // };\n\n /**\n * @todo: 拖动表头改变列宽度响应事件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2024-01-07 10:16:42\n * @param {*} newWidth\n * @param {*} oldWidth\n * @param {*} column\n * @param {*} event\n */\n // const headerDragend = (newWidth, oldWidth, column, event) => {\n // // fixed: 解决fix table 表头列宽度改变时fix列高度不正确问题 2024-01-07\n // nextTick(() => {\n // // fixCellH.style.height = cellH.offsetHeight;\n // this.$refs[this.vref].doLayout();\n // const fixCellH = this.$refs[this.vref].$el.querySelector('.el-table__fixed-header-wrapper>.el-table__header .el-table__cell');\n // const cellH = this.$refs[this.vref].$el.querySelector('.el-table__header-wrapper>.el-table__header .el-table__cell');\n // // console.log(cellH.offsetHeight);\n // fixCellH.style.height = cellH.offsetHeight + 'px';\n // // console.log(fixCellH.style.height);\n // });\n // });\n\n // @watch\n watch(\n () => props.tableHead,\n (newVal, prevVal) => {\n if (newVal.length !== prevVal.length) headColumn.value = getTableColumn();\n else {\n const res = difference(newVal, originTableHead);\n if (res === true) headColumn.value = getTableColumn();\n }\n },\n );\n watch(\n () => sMaxHeight.value,\n () => {\n if (props.tableType !== 'import')\n if (isScrollbar === false)\n if (isAnchor === false) {\n if (sHeight) sMaxHeight.value = sHeight;\n } else sMaxHeight.value = undefined;\n else sMaxHeight.value = undefined;\n },\n );\n watch(\n () => props.tableData,\n (newValue) => {\n resultData.value = newValue;\n },\n );\n\n watch(\n () => resultData.value,\n (newValue) => {\n if (newValue) {\n recordsList.value = newValue.records || newValue;\n // fixme: 解决无法获取结果集时报错问题 2022-06-05\n if (recordsList.value === undefined || recordsList.value.length === undefined) recordsList.value = [];\n if (recordsList.value.length > 0 && recordsList.value[0]['transHash']) {\n transHash = recordsList.value[0]['transHash'];\n recordsList.value.splice(0, 1);\n if (headColumn.value.length === 0) {\n tableHeads.forEach((x: TableHeadItem) => {\n let sProp = x.prop;\n if (sProp && sProp.indexOf('@') > 0) sProp = sProp.split('@')[1];\n if (props.total)\n if (x.sum === true) {\n columnSums.push(sProp);\n columnSumsDecimal.push(x.decimal ? x.decimal : 2);\n x.align = 'right';\n }\n\n const trans: string | undefined = transHash?.[sProp];\n if (trans) {\n const typeArr = trans.split('|');\n switch (typeArr[0]) {\n case 'company':\n x.dicType = 'company';\n break;\n case 'dept':\n x.dicType = 'dept';\n break;\n case 'user':\n x.dicType = 'user';\n break;\n case 'dic':\n x.type = 'dic';\n x.dicType = typeArr[1];\n break;\n case 'division':\n x.type = 'dic';\n x.dicType = 'xzqh';\n break;\n case 'date':\n x.type = 'date';\n x.dateType = typeArr[1];\n break;\n }\n }\n });\n headColumn.value = getTableColumn();\n }\n } else headColumn.value = getTableColumn();\n pageInfo.value = getPageInfo.value;\n // 设置排序方式\n if (pageInfo.value.totalpage > 1) tableSortMode.value = 2;\n else tableSortMode.value = 1;\n // 设置导出按钮状态\n if (recordsList.value && recordsList.value.length > 0) exportBtnDisabled.value = false;\n else exportBtnDisabled.value = true;\n\n // 加载状态\n // this.sDataLoaded = true;\n }\n nextTick(() => {\n // 重新计算\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n getMaxHeight(rootEl);\n\n // add: 增加查询回调方法 2022-11-23\n if (props.tableCb) props.tableCb(recordsList.value, resultData.value);\n tableRef.value?.doLayout();\n });\n },\n );\n\n // @exposed\n expose({\n setTableRef,\n fetch,\n startLoading,\n stopLoading,\n filterConditions,\n });\n\n // @created\n // get localStorage table column\n const loginLang = userStore.language;\n if (loginLang === 'en') lang = 'en';\n originTableHead = JSON.parse(JSON.stringify(props.tableHead));\n // fixme: 初始化时根据结果集赋值pagesize 解决后端设置pageSize后前端无法加载问题 2022-04-30\n // if (this.tableInit === true)\n if (Object.keys(props.tableData).length === 0) headColumnInit.value = getTableColumn('create');\n if (props.tableType === 'expand') {\n sTableSort.value = false;\n sTableBar.value = false;\n } else if (props.tableType === 'detail') headColumnInit.value = getTableColumn();\n if (props.tableData && props.tableData.size) {\n sPageSize = props.tableData.size;\n // 设置排序方式\n if (props.tableData.pages > 1) tableSortMode.value = 2;\n else tableSortMode.value = 1;\n }\n\n // 设置列表按钮以及右上角按钮的全局隐藏或显示\n if (gTableBar === false) {\n sTableSort.value = false;\n sTableKit.value = false;\n sTableBar.value = true;\n }\n\n // set pageSizes\n if (pageSizes.includes(sPageSize) === false) {\n pageSizes.splice(0, 0, sPageSize);\n pageSizes.sort(function (m, n) {\n if (m < n) return -1;\n else if (m > n) return 1;\n else return 0;\n });\n }\n\n if (props.tableType === 'detail') {\n // this.sMaxHeight = '200px';\n pageLayout.value = 'total, prev, pager, next';\n // 设置detail宽度\n sMaxWidth.value = '850px';\n } else if (props.tableType === 'expand') if (!sMaxWidth.value) sMaxWidth.value = '85%';\n // this.pageLayout = 'total, prev, pager, next';\n\n transRecords('create');\n\n // @mounted\n onMounted(() => {\n debounceSearch = debounce(handleTableSearch, 500);\n nextTick(() => {\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n window.addEventListener('click', () => {\n closeAllPopover();\n });\n window.addEventListener('resize', () => getMaxHeight(rootEl));\n if (rootEl) {\n const tableBodyWrapper = rootEl.querySelector('.el-table__body-wrapper');\n if (tableBodyWrapper) tableBodyWrapper.addEventListener('scroll', getScrollLeft, false);\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor = true;\n const dialogBody = rootEl.closest('.gv-drawer__body--inner');\n if (dialogBody) isScrollbar = hasScrollbar(dialogBody);\n if (rootEl.closest('.gv-edit__container')) isEditContainer = true;\n }\n });\n });\n\n // @render\n return () => {\n pageInfo.value = getPageInfo.value;\n return props.visible ? (\n <div\n class={props.tableType === 'expand' ? 'gv-table__container gv-table__container-expand' : 'gv-table__container'}\n style={{ width: '100%', minWidth: '0px', maxWidth: sMaxWidth.value }}>\n <GvTableBar visible={sTableBar.value}>{getTableBar()}</GvTableBar>\n {getKitBar()}\n {getTableSearch()}\n {getSortModel()}\n <div\n class=\"gv-table__loading-wrap\"\n v-loading={loading.value}\n element-loading-text=\"Loading...\">\n <ElTable\n ref={vref}\n // element-loading-spinner='iconfont gv-icon-loading'\n data={recordsList.value}\n border={props.tableType === 'detail' ? false : props.border}\n highlight-current-row={true}\n table-layout=\"fixed\"\n style=\"width: 100%\"\n height={sHeight}\n max-height={sMaxHeight.value}\n stripe={true}\n row-key={(row: any) => row.rownums}\n expand-row-keys={props.expandRowKeys}\n row-style={props.rowStyle}\n cell-style={props.cellStyle}\n header-cell-class-name=\"headerStyleEvent\"\n //span-method={handleSpanMethod}\n show-summary={props.total}\n // summary-method={getSummaries}\n // toggleRowSelection\n // on-row-class-name={props.rowClassName} // 设置行class的回调方法\n onSort-change={sortMethod}\n onRow-dblclick={rowDblClick} // 设置行双击事件方法\n // on-row-click={props.handleRowClick} // 设置行单击事件方法\n // on-selection-change={handleSelectionChange} // 设置多选行事件\n // on-expand-change={handleExpandChange} // 行展开异步加载方法\n // on-header-dragend={headerDragend} // 列拖宽度方法\n class={props.tableType === 'detail' ? 'gv-table-noborder' : props.border === true ? `${prefixCls}` : 'gv-table-noborder'}>\n {props.tableData && Object.keys(props.tableData).length > 0 ? headColumn.value : headColumnInit.value}\n </ElTable>\n </div>\n <ElPagination\n style={{ display: props.isShowPage ? '' : 'none' }}\n pageSizes={pageSizes}\n pageSize={pageInfo.value.recordsperpage}\n layout={pageLayout.value}\n total={pageInfo.value.countrows}\n currentPage={pageInfo.value.currentpagenum}\n hideOnSinglePage={true}\n onUpdate:page-size={handleSizeChange}\n onUpdate:current-page={handleCurrentChange}\n class=\"gv-pagination\"></ElPagination>\n </div>\n ) : null;\n };\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n .gv-table__container {\n width: 100%;\n height: calc(100% - 10em);\n margin-top: -2px;\n\n .gv-table__loading-wrap {\n position: relative;\n width: 100%;\n }\n .gv-table__sortmode {\n float: right;\n\n & i {\n padding-right: 15px;\n //font-size: 14px;\n }\n\n :deep(.el-radio) {\n margin-right: 12px;\n\n .el-radio__input {\n &.is-checked {\n .el-radio__inner {\n background: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n\n .el-radio__label {\n //font-size: $tableThFontSize;\n }\n\n .el-radio__input.is-checked + .el-radio__label {\n color: var(--primaryColor, $primaryColor);\n }\n }\n }\n\n .gv-table__kitbar {\n position: relative;\n float: right;\n width: 74px;\n height: 28px;\n margin: 1px 0 0 8px;\n line-height: 28px;\n\n .el-button-group {\n height: 26px;\n line-height: 26px;\n\n .el-button {\n padding: 6px 8px 5px;\n }\n }\n }\n\n .gv-table__search {\n position: relative;\n float: right;\n width: 160px;\n margin-top: 3px;\n\n :deep(.gv-table__search-input) {\n // top: -30px;\n float: right;\n width: 150px;\n .el-input__wrapper {\n height: 28px;\n line-height: 28px;\n }\n .el-input__inner {\n font-size: 12px;\n padding-left: 1px !important;\n }\n }\n }\n\n .gv-table {\n border-top: 1px solid $tableBorderColor;\n border-bottom: 0;\n border-left: 1px solid $tableBorderColor;\n\n :deep(.ascending .sort-caret.ascending) {\n border-bottom-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n :deep(.descending .sort-caret.descending) {\n border-top-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n :deep(.el-table__header-wrapper) {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight;\n line-height: 34px;\n background-color: $tableThBgColor;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 1px solid $tableBorderColor;\n\n .cell {\n padding-right: 3px;\n color: $textColor;\n font-weight: 500 !important;\n .render__header {\n font-weight: 500 !important;\n }\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .is-selected {\n .gv-table-header-filter {\n color: $primaryColor;\n }\n }\n\n .render__header {\n display: inline-flex;\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n }\n }\n }\n }\n\n :deep(.el-table__body-wrapper) {\n .el-table__body {\n .el-table__row.expanded {\n .el-table__cell {\n padding: 2px 0;\n border-bottom: 1px solid $tableBorderColor;\n }\n }\n\n .el-table__expanded-cell {\n padding: 4px 2px 10px 89px;\n }\n\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 0;\n\n // border-bottom:1px solid $tableBorderColor;\n\n .cell {\n // box-sizing: border-box;\n // display: inline-block;\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n .el-button {\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n\n .gv-tag {\n box-sizing: border-box;\n display: inline-block;\n height: 22px;\n padding: 0 5px;\n //font-size: $appTextSize;\n line-height: 22px;\n color: #409eff;\n white-space: nowrap;\n background-color: #ecf5ff;\n border: 1px solid #d9ecff;\n border-radius: 4px;\n }\n }\n }\n\n .gv-cell__render {\n .cell {\n height: auto;\n }\n }\n\n .gv-cell__isedit {\n .cell {\n height: auto;\n padding: 0 5px;\n\n .gv-input {\n height: 25px;\n line-height: 25px;\n\n .el-input__inner {\n height: 25px;\n padding-left: 5px;\n line-height: 25px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-input-number {\n width: 120px;\n height: 25px;\n line-height: 25px;\n\n .el-input-number__decrease,\n .el-input-number__increase {\n height: 23px;\n line-height: 23px;\n }\n\n .el-input__inner {\n height: 25px;\n padding-left: 5px;\n line-height: 25px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-datepicker {\n height: 25px;\n //font-size: $textSizeSecondary;\n line-height: 25px;\n\n .el-input__inner {\n height: 25px;\n padding-right: 25px;\n padding-left: 25px;\n line-height: 25px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n .el-icon-date {\n height: 26px;\n line-height: 26px;\n }\n\n .el-icon-time {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n\n .gv-select {\n vertical-align: inherit !important;\n width: 100%;\n\n .el-input {\n // line-height: 28px;\n // height: 25px;\n\n // height: 28px;\n //font-size: $textSizeSecondary;\n\n // line-height: 25px;\n\n .el-input__inner {\n // height:26px !important;\n padding-right: 25px;\n padding-left: 25px;\n\n // line-height:26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n\n .el-select__tags {\n .el-tag {\n height: 22px;\n margin: 1px 0 1px 6px;\n }\n }\n }\n\n .gv-select__table {\n width: 100%;\n vertical-align: inherit !important;\n .el-input {\n // height: 25px;\n //font-size: $textSizeSecondary;\n\n // line-height: 25px;\n\n .el-input__inner {\n // height:26px;\n padding-right: 25px;\n padding-left: 25px;\n\n // line-height:26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__row:last-child {\n // &.current-row{\n // td.el-table__cell{\n // background-color: var(--defaultHover,$defaultHover);\n // }\n // }\n\n .el-table__cell {\n padding: 2px 0;\n border-bottom: 1px solid $tableBorderColor;\n }\n }\n }\n }\n\n :deep(.el-table__footer-wrapper) {\n .el-table__footer {\n .el-table__cell {\n padding: 2px 0;\n //font-size: $tableThFontSize;\n }\n }\n }\n\n :deep(.el-table__fixed),\n :deep(.el-table__fixed-right) {\n height: 100% !important;\n .el-table__fixed-header-wrapper {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight !important;\n line-height: 34px;\n background-color: $tableThBgColor;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 1px solid $tableBorderColor;\n\n .cell {\n height: 28px;\n font-weight: 500 !important;\n // display: inline-block; // flex\n padding-right: 3px;\n line-height: 28px;\n color: $textColor;\n\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .is-selected {\n .gv-table-header-filter {\n color: $primaryColor;\n }\n }\n\n .render__header {\n display: inline-block; // flex\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n\n .el-checkbox {\n .el-checkbox__input {\n .el-checkbox__inner {\n &:hover {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-checked,\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__fixed-body-wrapper {\n .el-table__body {\n .el-table__row.expanded {\n .el-table__cell {\n padding: 2px 0;\n border-bottom: 1px solid $tableBorderColor;\n }\n }\n\n .el-table__expanded-cell {\n padding: 2px;\n }\n\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n // box-sizing: border-box;\n padding: 2px 0;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 0;\n\n .cell {\n // display: inline-block; // flex\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n // padding-left: 3px;\n .el-button {\n // margin-left: 5px;\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n\n .gv-input {\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .gv-tag {\n box-sizing: border-box;\n\n // display: inline-block;\n height: 24px;\n padding: 0 5px;\n //font-size: $appTextSize;\n line-height: 24px;\n color: #409eff;\n white-space: nowrap;\n background-color: #ecf5ff;\n border: 1px solid #d9ecff;\n border-radius: 4px;\n }\n\n .el-checkbox {\n .el-checkbox__input {\n .el-checkbox__inner {\n &:hover {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-checked,\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n }\n\n .gv-cell__render {\n .cell {\n height: auto;\n }\n }\n }\n\n .el-table__row:last-child {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n // border-bottom: 1px solid $tableBorderColor;\n }\n }\n }\n }\n\n .el-table__fixed-footer-wrapper {\n .el-table__footer {\n .el-table__cell {\n padding: 2px 0;\n //font-size: $tableThFontSize;\n }\n }\n }\n }\n }\n\n .gv-table-noborder {\n :deep(.el-table__header-wrapper) {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight;\n line-height: 34px;\n\n .cell {\n height: 28px;\n padding-right: 3px;\n line-height: 28px;\n color: $textColor;\n font-weight: 500 !important;\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .render__header {\n display: inline-flex;\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n }\n }\n }\n }\n\n :deep(.el-table__body-wrapper) {\n .el-table__body {\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n\n // border-bottom:1px solid $tableBorderColor;\n\n .cell {\n // box-sizing: border-box;\n // display: inline-block;\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n .el-button {\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n }\n }\n\n .gv-cell__render {\n .cell {\n height: auto;\n }\n }\n\n .gv-cell__isedit {\n .cell {\n height: 28px;\n padding: 0 5px;\n line-height: 28px;\n\n .gv-input {\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n }\n\n .gv-input-number {\n width: 120px;\n\n .el-input-number__decrease,\n .el-input-number__increase {\n height: 23px;\n line-height: 23px;\n }\n\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-datepicker {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n padding-right: 25px;\n padding-left: 25px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n .el-icon-date {\n height: 26px;\n line-height: 26px;\n }\n\n .el-icon-time {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n\n .gv-select {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n\n .gv-select__table {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__row:last-child {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n }\n }\n }\n }\n\n :deep(.el-table__fixed),\n :deep(.el-table__fixed-right) {\n .el-table__fixed-header-wrapper {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight !important;\n line-height: 34px;\n\n .cell {\n display: inline-block; // flex\n height: 28px;\n padding-right: 3px;\n line-height: 28px;\n color: $textColor;\n font-weight: 500 !important;\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .render__header {\n display: inline-block; // flex\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n }\n }\n }\n }\n\n .el-table__fixed-body-wrapper {\n .el-table__body {\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n // box-sizing: border-box;\n padding: 2px 0;\n\n .cell {\n display: inline-block; // flex\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n .el-button {\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n }\n }\n\n .gv-cell__isedit {\n .cell {\n height: 28px;\n padding: 0 5px;\n line-height: 28px;\n\n .gv-input {\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n }\n\n .gv-input-number {\n width: 120px;\n\n .el-input-number__decrease,\n .el-input-number__increase {\n height: 23px;\n line-height: 23px;\n }\n\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-datepicker {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n padding-right: 25px;\n padding-left: 25px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n .el-icon-date {\n height: 26px;\n line-height: 26px;\n }\n\n .el-icon-time {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n\n .gv-select {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n\n .gv-select__table {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__row:last-child {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n\n .cell {\n display: inline-block; // flex\n }\n }\n }\n }\n }\n }\n }\n\n // pageinfo\n :deep(.el-pagination) {\n float: right;\n\n .el-input__inner {\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover) !important;\n }\n\n &:hover {\n border-color: var(--primaryColorHover, $primaryColorHover) !important;\n }\n }\n\n .el-pagination__total {\n left: 15px;\n //font-size: $appTextSize !important;\n // position: absolute;\n margin-right: 20px;\n font-weight: 500;\n color: var(--primaryColor, $primaryColor);\n }\n\n .el-pagination__sizes {\n // position: absolute;\n left: 65px;\n margin: 0px 10px 0 0;\n width: 100px;\n line-height: 28px;\n .el-select {\n width: 100px;\n line-height: 28px;\n .el-select__wrapper {\n //font-size: $appTextSize;\n min-height: 28px;\n }\n .el-input {\n width: 90px;\n\n .el-input__inner {\n height: 25px;\n line-height: 25px;\n }\n }\n }\n }\n\n .btn-prev,\n .btn-next {\n min-width: 25px;\n padding: 0;\n }\n\n .el-pager {\n li.active,\n li:hover {\n color: var(--primaryColor, $primaryColor);\n }\n .is-active number {\n //font-size: $appTextSize;\n }\n .number {\n min-width: 30px;\n //font-size: $appTextSize;\n font-weight: $fontWeight;\n }\n }\n\n .el-pagination__jump {\n .el-pagination__goto {\n //font-size: $appTextSize;\n }\n .el-pagination__classifier {\n //font-size: $appTextSize;\n }\n .el-pagination__editor {\n //font-size: $appTextSize;\n width: 45px;\n\n .el-input__inner {\n height: 24px;\n line-height: 24px;\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTable from './src/GvTable.vue';\n\nconst GvTablePlugin = {\n install(app: App): void {\n app.component(GvTable.name ?? 'GvTable', GvTable);\n },\n};\nexport default GvTablePlugin;\n\nexport { GvTable };\n","<!--\n * @title: tab pane component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:19:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-12 10:24:57\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { hasScrollbar } from '@@/utils';\n import { defineComponent, getCurrentInstance, nextTick, onMounted, ref } from 'vue';\n\n // const { getPrefixCls } = useStyle();\n // const prefixCls = getPrefixCls('tab-pane');\n export default defineComponent({\n name: 'GvTabPane',\n props: {\n name: {\n type: String,\n required: false,\n default: undefined,\n },\n label: {\n type: String,\n required: false,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n required: false,\n default: false,\n },\n maxHeight: {\n type: [Number, String],\n required: false,\n default: undefined,\n },\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n autoHeight: {\n type: Boolean,\n required: false,\n default: false,\n },\n },\n\n // emit\n emits: ['tab-click'],\n setup(props, { emit, slots }) {\n // @data\n const sMaxHeight = props.maxHeight;\n const isAnchor = ref(false);\n const isScrollbar = ref(false);\n const isEditContainer = ref(false);\n const instance = getCurrentInstance();\n\n // @watch\n // @methods\n\n // @mounted\n onMounted(() => {\n nextTick(() => {\n const rootEl = instance?.proxy?.$el;\n const dialogBody = rootEl.closest('<div className=\"gv\"></div>-drawer__body--inner');\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (rootEl.closest('.gv-edit__container')) isAnchor.value = true;\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (rootEl.closest('.gv-edit__container')) isEditContainer.value = true;\n if (props.autoHeight === false)\n if (isEditContainer.value === false)\n if (isScrollbar.value === false)\n if (isAnchor.value === false)\n if (!sMaxHeight) {\n const tabPane = rootEl;\n const offsetTop = tabPane.classList.contains('el-tabs--left') ? 95 : 165;\n const maxHeight = document.documentElement.clientHeight - rootEl.offsetTop - offsetTop;\n rootEl.style.maxHeight = maxHeight + 'px';\n }\n });\n });\n // @render\n return () => (\n <div\n data-name={props.name}\n data-label={props.label}\n data-disabled={props.disabled}\n style={{ overflow: 'hidden auto', maxHeight: `${props.maxHeight}` }}>\n {slots.default?.()}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tab-pane';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvTabPane from './src/GvTabPane.vue';\n\nconst GvTabsPlugin = {\n install(app: App): void {\n app.component(GvTabPane.name ?? 'GvTabPane', GvTabPane);\n },\n};\nexport default GvTabsPlugin;\n\nexport { GvTabPane };\n","<!--\n * @title: tabs component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 09:50:50\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:54:16\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { hasScrollbar } from '@@/utils';\n import { ElTabPane, ElTabs } from 'element-plus';\n import { defineComponent, getCurrentInstance, nextTick, onMounted, ref, watch, type PropType, type VNode } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tabs');\n export default defineComponent({\n name: 'GvTabs',\n props: {\n tabPosition: {\n type: String,\n default: 'left',\n },\n value: {\n type: [Number, String] as PropType<number | string>,\n default: undefined,\n },\n type: {\n type: String as PropType<'card' | 'border-card'>,\n default: undefined, // card|border-card\n },\n closable: {\n type: Boolean,\n default: false,\n },\n tabMaxHeight: {\n type: [Number, String],\n default: undefined,\n },\n },\n\n // emit\n emits: ['tab-click'],\n setup(props, { emit, slots }) {\n // @data\n const inputValue = ref(props.value);\n const tabHeight = ref('auto');\n const isAnchor = ref(false);\n const isScrollbar = ref(false);\n const panes = ref([]);\n const isEditContainer = ref(false);\n const instance = getCurrentInstance();\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @methods\n /**\n * @todo: 点击tab页响应事件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-09 09:16:37\n * @param {*} tabVm 被选中tab页实例\n */\n const handleTabClick = (tabVm) => {\n const props = tabVm.props;\n const parent = tabVm.parent;\n const tabName = props.name;\n if (tabName) parent.props.value = tabName;\n emit('tab-click', tabVm);\n };\n\n /**\n * @todo: created tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:05:03\n */\n const calcPaneInstances = () => {\n if (panes.value.length === 0)\n if (slots.default?.())\n slots.default?.().forEach((vnode) => {\n if (vnode && typeof vnode.type === 'object' && 'name' in vnode.type && vnode.type.name === 'GvTabPane') {\n const tabPane = {};\n const props = vnode.props;\n tabPane['label'] = props?.label;\n tabPane['name'] = props?.name;\n tabPane['autoHeight'] = isEditContainer.value;\n let visible = true;\n if (props?.visible === false) visible = false;\n tabPane['visible'] = visible;\n (panes.value as any[]).push(tabPane);\n }\n });\n return panes.value || [];\n };\n /**\n * @todo: 创建tabpanel\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-03 16:30:54\n */\n const createTabPane = () =>\n calcPaneInstances().map((vnode: VNode, index) => {\n const props = vnode.props;\n // console.log(vnode.name);\n return props?.visible ? (\n <ElTabPane\n // v-show={vnode.visible}\n ref=\"tabPane\"\n name={props?.name}\n label={props?.label}\n style={{ height: `${tabHeight.value} !important` }}>\n {slots.default?.()[index]}\n </ElTabPane>\n ) : null;\n });\n\n // @mounted\n onMounted(() => {\n nextTick(() => {\n const rootEl = instance?.proxy?.$el as HTMLElement | undefined;\n const dialogBody = rootEl?.closest('.gv-drawer__body--inner');\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n else {\n const dialogContainer = rootEl?.closest('.gv-container');\n if (dialogContainer) isScrollbar.value = hasScrollbar(dialogContainer);\n }\n if (rootEl?.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (rootEl?.closest('.gv-edit__container')) isEditContainer.value = true;\n if (!isEditContainer.value)\n if (isScrollbar.value === false)\n if (isAnchor.value === false) {\n // 设置tab页高度\n const drawer = rootEl?.closest('.gv-drawer');\n if (drawer) tabHeight.value = 'auto';\n // const tp = this.tabPosition === 'left' ? 170 : 230;\n // this.tabHeight = document.documentElement.clientHeight - this.$el.offsetTop - tp + 'px';\n else {\n const dialog = rootEl?.closest('.gv-dialog');\n if (dialog) tabHeight.value = 'auto';\n // const tp = this.tabPosition === 'left' ? 170 : 230;\n // this.tabHeight = document.documentElement.clientHeight - this.$el.offsetTop - tp + 'px';\n else {\n const h = document.documentElement.clientHeight - (rootEl?.offsetTop ?? 0) - 55;\n if (h < 384) tabHeight.value = '384px';\n else tabHeight.value = h + 'px';\n }\n }\n }\n });\n });\n // @render\n return () => (\n <ElTabs\n ref=\"gv-tabs\"\n v-model={inputValue.value}\n tab-position={props.tabPosition}\n type={props.type}\n closable={props.closable}\n on-tab-click={handleTabClick}\n class={prefixCls}>\n {createTabPane()}\n </ElTabs>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tabs';\n .#{$prefixCls} {\n :deep(.el-tabs__header) {\n &.is-top {\n margin: 0 0 6px;\n }\n\n .el-tabs__nav {\n .el-tabs__active-bar {\n background-color: var(--primaryColor, $primaryColor);\n }\n\n .el-tabs__item {\n //font-size: $appTextSize;\n\n &:hover {\n color: var(--primaryColor, $primaryColor);\n }\n\n &.is-active {\n color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTabs from './src/GvTabs.vue';\n\nconst GvTabsPlugin = {\n install(app: App): void {\n app.component(GvTabs.name ?? 'GvTabs', GvTabs);\n },\n};\nexport default GvTabsPlugin;\n\nexport { GvTabs };\n","import type { App } from 'vue';\nimport GvTag from './src/GvTag.vue';\n\nconst GvTagPlugin = {\n install(app: App): void {\n app.component(GvTag.name ?? 'GvTag', GvTag);\n },\n};\nexport default GvTagPlugin;\n\nexport { GvTag };\n","<!--\n * @title: navigation tags view\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-20 10:57:41\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 18:00:46\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { usePermsStore } from '@/store/modules/perms';\n import { useTagsViewStore } from '@/store/modules/tagsView';\n import { useBridgeI18n } from '@@/bridge';\n import { joinIcon, pathResolve } from '@@/utils';\n import { useEventListener } from '@vueuse/core';\n import { ElTabPane, ElTabs } from 'element-plus';\n import { cloneDeep } from 'lodash-es';\n import { computed, defineComponent, nextTick, onMounted, reactive, ref, unref, watch } from 'vue';\n import { useRouter, type RouteLocationNormalizedLoaded } from 'vue-router';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tags-view');\n export default defineComponent({\n name: 'GvTagsView',\n setup() {\n const visible = ref(false);\n const position = reactive({ x: 0, y: 0 });\n const currentKey = ref('');\n\n const { currentRoute, push, replace } = useRouter();\n const activeKey = ref<string>(unref(currentRoute).path || '/dashboard');\n const { t } = useBridgeI18n();\n const tagsViewStore = useTagsViewStore();\n const permsStore = usePermsStore();\n\n const visitedViews = computed(() => tagsViewStore.visitedViews);\n const mainAppRoutes = computed(() => permsStore.mainAppRoutes);\n\n const isRedirect = (path: string) => path.startsWith('/redirect');\n const isActive = (route) => route.path === unref(currentRoute).path;\n const isAffix = (tag) => tag.meta && tag.meta.affix;\n\n /**\n * @todo: filter affix nav menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 11:39:08\n * @param {*} mainAppRoutes\n * @param {*} basePath\n */\n const filterAffixNavMenus = (navMenus, basePath = '/'): RouteLocationNormalizedLoaded[] => {\n const affixTags: RouteLocationNormalizedLoaded[] = [];\n // console.log('navMenus:', navMenus.value);\n navMenus.value.forEach((route) => {\n if (route.meta && route.meta.affix === true) {\n const tagPath = pathResolve(basePath, route.path);\n affixTags.push({\n fullPath: tagPath,\n path: tagPath,\n name: route.name,\n meta: route.meta,\n matched: [],\n params: {},\n query: {},\n hash: '',\n redirectedFrom: undefined,\n });\n }\n });\n return affixTags;\n };\n /**\n * @todo: add affix tags\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 11:45:26\n */\n const addAffixTags = () => {\n const affixTags = filterAffixNavMenus(mainAppRoutes);\n\n for (const tagView of affixTags) if (tagView.name) tagsViewStore.addVisitedView(tagView);\n };\n /**\n * @todo: create tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:36:56\n */\n const createTabPanel = () =>\n visitedViews.value.map((v) => {\n const icons = joinIcon(v.meta?.picon);\n const closable = visitedViews.value.length > 1;\n const title = t(v.meta?.title ?? 'no-name');\n return (\n <ElTabPane\n key={String(v.path)}\n name={String(v.path)}\n label={title}\n closable={closable}>\n {{\n label: () => (\n <span class=\"tab-label\">\n {icons && <i class={icons}></i>}\n {title}\n </span>\n ),\n }}\n </ElTabPane>\n );\n });\n\n /**\n * @todo: show right context menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 17:22:53\n * @param {*} key\n */\n const showContextMenu = (key: string) => {\n currentKey.value = key;\n visible.value = true;\n };\n /**\n * @todo: close right context menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:31:06\n */\n const closeContextMenu = () => {\n visible.value = false;\n };\n /**\n * @todo: jump to link route\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-21 11:25:08\n * @param {*} routePath\n */\n const toLink = (routePath: string) => {\n const targetView = visitedViews.value.find((v) => v.path === routePath);\n activeKey.value = routePath || '/dashboard';\n\n if (targetView)\n // 使用完整的 route 对象跳转,保留 query 参数\n push({\n path: targetView.path,\n query: targetView.query || {},\n });\n else push({ path: routePath, query: {} });\n };\n /**\n * @todo: jump to last tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:31:01\n * @param {*} visitedView\n * @param {*} currentView\n */\n const toLastView = (visitedView: RouteLocationNormalizedLoaded[], currentView: RouteLocationNormalizedLoaded) => {\n const latestView = visitedView.slice(-1)[0];\n if (visitedView) {\n activeKey.value = latestView.path;\n push(latestView.path);\n } else if (currentView.name === 'Dashboard') replace({ path: '/redirect' + currentView.path });\n else push('/');\n };\n /**\n * @todo: add menu tab\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-21 10:27:35\n */\n const addNavMenu = () => {\n const name = currentRoute.value.name;\n if (name) tagsViewStore.addTagView(currentRoute.value);\n };\n\n const moveToCurrentTag = (view: RouteLocationNormalizedLoaded) => {\n // toLink(view.path);\n };\n\n /**\n * @todo: click tab event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 12:08:48\n * @param {*} tab\n */\n const clickTab = (tab) => {\n toLink(tab.props.name);\n };\n /**\n * @todo: close current tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:56:44\n * @param {*} targetKey\n */\n const closeCurrentTag = async (targetKey) => {\n const view = visitedViews.value.filter((view) => view.path === targetKey);\n if (isAffix(view[0])) return;\n\n await tagsViewStore.delTagView({ view: view[0] });\n\n // 清除缓存的search条件\n // currentRoute.value.meta.search = {};\n // 判断是否是当前标签页关闭\n if (isActive(view[0])) toLastView(visitedViews.value, view[0]);\n };\n /**\n * @todo: refresh selected tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:40:45\n */\n const refreshSelectedTag = async () => {\n tagsViewStore.delCachedView(unref(currentRoute));\n const { path, query } = unref(currentRoute);\n await nextTick();\n replace({\n path: '/redirect' + path,\n query: query,\n });\n };\n const findCurTagIndex = () => visitedViews.value.findIndex((x) => x.path === currentKey.value);\n /**\n * @todo: close right/left tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:42:33\n * @param {*} direction\n */\n const closeTagsOrientation = (direction) => {\n const index = findCurTagIndex();\n if (index === -1) return;\n let isClosed = false;\n const vV = cloneDeep(visitedViews.value);\n vV.map(({ path }, i) => {\n if (direction === 'right' && i > index) {\n if (path === unref(activeKey)) isClosed = true;\n closeCurrentTag(path);\n } else if (direction === 'left' && i < index) {\n if (path === unref(activeKey)) isClosed = true;\n closeCurrentTag(path);\n }\n });\n // 跳转至当前页\n if (isClosed) toLink(unref(currentKey));\n };\n /**\n * @todo: close other tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 11:04:12\n */\n const closeOthersTags = () => {\n const index = findCurTagIndex();\n if (index === -1) return;\n push(currentKey.value);\n\n tagsViewStore.delOthersViews(currentRoute.value).then(() => {\n moveToCurrentTag(unref(currentRoute));\n });\n };\n\n watch(\n () => [currentRoute.value.path, currentRoute.value.name],\n ([path, name], [, oldName]) => {\n // if /redirect\n if (isRedirect(path as string)) return;\n // 当前选中tab页\n activeKey.value = (path as string) || '/dashboard';\n // del notify msg\n if (oldName !== name) {\n const alertObj = document.body.querySelector('body>.el-notification');\n if (alertObj) alertObj.remove();\n }\n addNavMenu();\n // moveToCurrentTag(currentRoute.value);\n },\n );\n\n /**\n * @todo: bind right click event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 15:28:28\n */\n const tagsViewEl = ref<HTMLElement | null>(null);\n useEventListener(tagsViewEl, 'contextmenu', (ev: MouseEvent) => {\n ev.preventDefault();\n\n let targetNode: HTMLElement | null = null;\n const el = ev.target as HTMLElement;\n\n if (el.tagName === 'SPAN') targetNode = el.parentElement;\n else targetNode = el;\n\n if (targetNode?.classList.contains('el-tabs__item')) {\n const path = targetNode?.getAttribute('aria-controls')?.replace(/^pane-/, '') || '';\n if (path !== unref(currentRoute).path) toLink(path);\n\n position.x = ev.clientX || ev.pageX;\n position.y = ev.clientY || ev.pageY;\n\n showContextMenu(path);\n }\n });\n /**\n * @todo: close context menu on window click\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:39:46\n */\n useEventListener(window, 'click', () => {\n closeContextMenu();\n });\n\n // mounted hooks\n onMounted(() => {\n addAffixTags();\n addNavMenu();\n });\n return () => (\n <div\n ref={tagsViewEl}\n class={[prefixCls, 'flex w-full relative bg-[#fff] dark:bg-[var(--el-bg-color)']}>\n <ElTabs\n class=\"multi-tab\"\n type=\"card\"\n modelValue={activeKey.value}\n onUpdate:modelValue={(v: string) => (activeKey.value = v)}\n onTabClick={clickTab}\n onTabRemove={closeCurrentTag}>\n {createTabPanel()}\n </ElTabs>\n {visible.value && (\n <ul\n class=\"tagsView-contextmenu\"\n style={{ left: `${position.x + 10}px`, top: `${position.y - 10}px` }}>\n <li onClick={refreshSelectedTag}>{t('tagsView.refresh')}</li>\n {currentKey.value !== '/dashboard' && visitedViews.value.length === 2 && <li onClick={() => closeCurrentTag(currentKey.value)}>{t('tagsView.close')}</li>}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 1 && findCurTagIndex() < visitedViews.value.length - 1 && (\n <li onClick={() => closeTagsOrientation('right')}>{t('tagsView.closeRight')}</li>\n )}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 2 && findCurTagIndex() > 1 && <li onClick={() => closeTagsOrientation('left')}>{t('tagsView.closeLeft')}</li>}\n {currentKey.value === '/dashboard' && visitedViews.value.length > 1 && <li onClick={closeOthersTags}>{t('tagsView.closeOthers')}</li>}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 2 && <li onClick={closeOthersTags}>{t('tagsView.closeOthers')}</li>}\n </ul>\n )}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tags-view';\n\n .#{$prefixCls} {\n user-select: none; // 禁止选中文本\n\n .multi-tab {\n width: 100%;\n position: relative;\n :deep(.el-tabs__header) {\n margin: 0;\n border-bottom-color: $borderColor;\n height: 34px;\n line-height: 34px;\n .el-tabs__nav {\n border-color: $borderColor;\n .el-tabs__item {\n height: 34px; // 38px\n line-height: 34px; // 38px\n padding: 2px 10px 0 10px; // 0 10px\n //font-size: $textSize;\n border-left-color: $borderColor;\n\n &.is-active {\n & > span {\n font-weight: $fontWeight2;\n }\n color: var(--primaryColor, $primaryColor);\n }\n &:focus.is-focus:not(:active) {\n box-shadow: 0 0 1px 1px inset;\n }\n > span {\n font-weight: 500;\n > i {\n padding-right: 5px;\n //font-size: $textSize;\n }\n }\n }\n }\n .is-scrollable {\n .el-tabs__nav-next,\n .el-tabs__nav-prev {\n line-height: 42px;\n }\n\n i {\n font-size: 18px;\n color: rgba(0, 0, 0, 0.95);\n }\n }\n }\n .el-tabs__content {\n display: none !important;\n }\n }\n :deep(.tagsView-contextmenu) {\n position: fixed;\n top: $navHeadHeight;\n left: 300px;\n z-index: 9999;\n min-width: 90px;\n padding: 6px 0;\n list-style: none;\n background-color: #fff;\n border: 1px solid $borderColorSecondary;\n border-radius: $borderRadius;\n box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);\n li {\n line-height: 27px;\n padding: 0 15px;\n //font-size: $appTextSize;\n &:hover,\n &:focus {\n background-color: $backgroundColor;\n color: var(--primaryColorHover, $primaryColorHover);\n cursor: pointer;\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTagsView from './src/GvTagsView.vue';\n// Define the install method on the GvExpandMenu component\nconst GvTagsViewPlugin = {\n install(app: App): void {\n app.component(GvTagsView.name ?? 'GvTagsView', GvTagsView);\n },\n};\nexport default GvTagsViewPlugin;\n\nexport { GvTagsView };\n","<!--\n * @title: theme switcher\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-08-14 10:17:38\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-18 15:04:37\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { ElDropdown, ElDropdownItem, ElDropdownMenu } from 'element-plus';\n import { computed } from 'vue';\n import { propTypes } from '../../utils/gv.propTypes';\n\n defineOptions({\n name: 'GvTheme',\n inheritAttrs: true,\n });\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('theme');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const appStore = useAppStore();\n const themeOptions = computed(() => appStore.getSwitchTheme);\n const currentTheme = computed(() => appStore.getCurrentTheme);\n\n const handleSetTheme = () => {\n //appStore.setTheme(theme);\n };\n</script>\n<template>\n <ElDropdown\n trigger=\"click\"\n :class=\"prefixCls\"\n @command=\"handleSetTheme\">\n <div>\n <GvIcon\n class=\"international-icon\"\n iconName=\"theme\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item of themeOptions\"\n :key=\"item.value\"\n :disabled=\"currentTheme === item.value\"\n :command=\"item.value\">\n {{ item.label }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-theme';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvTheme from './src/GvTheme.vue';\nconst GvThemePlugin = {\n install(app: App): void {\n app.component(GvTheme.name ?? 'GvTheme', GvTheme);\n },\n};\nexport default GvThemePlugin;\n\nexport { GvTheme };\n","<!--\n * @title: tree component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 16:57:41\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:54:23\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElTree } from 'element-plus';\n import type { Node } from 'element-plus/es/components/tree/src/model/node';\n import type { FilterNodeMethodFunction, LoadFunction, RenderContentFunction, TreeComponentProps, TreeNodeData } from 'element-plus/es/components/tree/src/tree.type';\n import { defineComponent, type ComponentInternalInstance, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tree');\n\n type TreeData = Record<string, unknown>;\n\n export default defineComponent({\n name: 'GvTree',\n props: {\n treeData: {\n type: Array as PropType<TreeData[]>,\n default: () => [],\n },\n treeProps: {\n type: Object as PropType<TreeComponentProps['props']>,\n default: () => ({}),\n },\n nodeKey: {\n type: String,\n default: undefined,\n },\n lazy: {\n type: Boolean,\n default: false,\n },\n load: {\n type: Function as PropType<LoadFunction>,\n default: undefined,\n },\n showCheckbox: {\n type: Boolean,\n default: false,\n },\n draggable: {\n type: Boolean,\n default: false,\n },\n defaultExpandedKeys: {\n type: Array as PropType<(string | number)[]>,\n default: () => [],\n },\n defaultCheckedKeys: {\n type: Array as PropType<(string | number)[]>,\n default: () => [],\n },\n iconClass: {\n type: String,\n default: undefined,\n },\n defaultExpandAll: {\n type: Boolean,\n default: false,\n },\n expandOnClickNode: {\n type: Boolean,\n default: true,\n },\n checkOnClickNode: {\n type: Boolean,\n default: false,\n },\n filterNodeMethod: {\n type: Function as PropType<FilterNodeMethodFunction>,\n default: undefined,\n },\n renderContent: {\n type: Function as PropType<RenderContentFunction>,\n default: undefined,\n },\n },\n\n // @emits\n emits: ['node-click', 'node-expand', 'node-collapse', 'check', 'check-change', 'node-drop'],\n\n setup(props, { emit }) {\n // @methods\n\n const handleNodeClick = (data: TreeData, node: Node, treeNode: ComponentInternalInstance | null, event: MouseEvent) => {\n emit('node-click', data, node, treeNode, event);\n };\n\n const handleNodeExpand = (data: TreeData, node: Node, treeNode: ComponentInternalInstance | null) => {\n emit('node-expand', data, node, treeNode);\n };\n\n const handleNodeCollapse = (data: TreeData, node: Node, treeNode: ComponentInternalInstance | null) => {\n emit('node-collapse', data, node, treeNode);\n };\n\n const handleCheck = (\n data: TreeData,\n checkedInfo: {\n checkedNodes: TreeNodeData[];\n checkedKeys: (string | number)[];\n halfCheckedNodes: TreeNodeData[];\n halfCheckedKeys: (string | number)[];\n },\n ) => {\n emit('check', data, checkedInfo);\n };\n\n const handleCheckChange = (data: TreeData, checked: boolean, childChecked: boolean) => {\n emit('check-change', data, checked, childChecked);\n };\n\n const handleLazyLoad: LoadFunction = (...args) => {\n props.load?.(...args);\n };\n\n const handleNodeDrop = (draggingNode: Node, dropNode: Node, dropType: 'before' | 'after' | 'inner', event: DragEvent) => {\n emit('node-drop', draggingNode, dropNode, dropType, event);\n };\n\n // @render\n return () => (\n <ElTree\n ref=\"gv-tree\"\n data={props.treeData}\n props={props.treeProps}\n nodeKey={props.nodeKey}\n lazy={props.lazy}\n load={handleLazyLoad}\n draggable={props.draggable}\n showCheckbox={props.showCheckbox}\n defaultExpandedKeys={props.defaultExpandedKeys}\n defaultCheckedKeys={props.defaultCheckedKeys}\n icon={props.iconClass}\n highlightCurrent\n defaultExpandAll={props.defaultExpandAll}\n expandOnClickNode={props.expandOnClickNode}\n checkOnClickNode={props.checkOnClickNode}\n filterNodeMethod={props.filterNodeMethod}\n renderContent={props.renderContent}\n class={prefixCls}\n onNode-click={handleNodeClick}\n onNode-expand={handleNodeExpand}\n onNode-collapse={handleNodeCollapse}\n onNode-drop={handleNodeDrop}\n onCheck={handleCheck}\n onCheck-change={handleCheckChange}\n />\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tree';\n .#{$prefixCls} {\n :deep(.el-tree-node) {\n .el-tree-node__content {\n .el-tree-node__label {\n //font-size: $appTextSize;\n }\n .el-checkbox__input {\n &.is-checked {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTree from './src/GvTree.vue';\n\nconst GvTreePlugin = {\n install(app: App): void {\n app.component(GvTree.name ?? 'GvTree', GvTree);\n },\n};\nexport default GvTreePlugin;\n\nexport { GvTree };\n","/*\r\n * @title: encrypt\r\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\r\n * @Date: 2023-12-16 08:07:24\r\n * @LastEditors: andy.ten@tom.com\r\n * @LastEditTime: 2025-04-07 13:54:00\r\n * @version: 1.0.1\r\n * @copyright: copyright (c) 2025 Andy Xu\r\n * node: you can not copy and/or use and/or modify this program free,\r\n * please reserve the segment above.Please mail me if you have any question.\r\n */\r\n\r\nimport CryptoJS from 'crypto-js';\r\nexport const key = 'abcdefgabcdefg12';\r\nexport const encrypt = (word: any): string => {\r\n const keyStr = CryptoJS.enc.Utf8.parse(key);\r\n let ww;\r\n if (typeof word === 'object') ww = JSON.stringify(word);\r\n else ww = word;\r\n const srcs = CryptoJS.enc.Utf8.parse(ww);\r\n const encrypted = CryptoJS.AES.encrypt(srcs, keyStr, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });\r\n return encrypted.toString();\r\n};\r\nexport const decrypt = (word: string): any => {\r\n const keyStr = CryptoJS.enc.Utf8.parse(key);\r\n const decrypt = CryptoJS.AES.decrypt(word, keyStr, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });\r\n return CryptoJS.enc.Utf8.stringify(decrypt).toString();\r\n};\r\n// Randomly generate a specified number of hexadecimal keys\r\nexport const generateKey = (num: number): string => {\r\n const library = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let key = '';\r\n for (let i = 0; i < num; i++) {\r\n const randomPoz = Math.floor(Math.random() * library.length);\r\n key += library.substring(randomPoz, randomPoz + 1);\r\n }\r\n return key;\r\n};\r\n","/*\n * @title: package lib entry\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2024-11-28 18:18:44\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 09:22:01\n * @version: 1.1.2\n * @copyright: copyright (c) 2024 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport type { Pinia } from 'pinia';\nimport { setActivePinia } from 'pinia';\nimport 'uno.css'; // 引入 UnoCSS 样式\nimport type { App } from 'vue';\nimport type { Composer } from 'vue-i18n';\n\nimport { setBridgeContext } from './bridge';\nimport GvBacktopPlugin, { GvBacktop } from './GvBacktop';\nimport GvBadgePlugin, { GvBadge } from './GvBadge';\nimport GvBreadCrumbPlugin, { GvBreadCrumb } from './GvBreadCrumb';\nimport GvButtonPlugin, { GvButton } from './GvButton';\nimport GvCardPlugin, { GvCard } from './GvCard';\nimport GvCascaderPlugin, { GvCascader } from './GvCascader';\nimport GvCheckboxPlugin, { GvCheckbox } from './GvCheckbox';\nimport GvCheckboxButtonPlugin, { GvCheckboxButton } from './GvCheckboxButton';\nimport GvCheckboxGroupPlugin, { GvCheckboxGroup } from './GvCheckboxGroup';\nimport GvColPlugin, { GvCol } from './GvCol';\nimport GvDatePickerPlugin, { GvDatePicker } from './GvDatePicker';\nimport GvDialogPlugin, { GvDialog } from './GvDialog';\nimport GvDividerPlugin, { GvDivider } from './GvDivider';\nimport GvDrawerPlugin, { GvDrawer } from './GvDrawer';\nimport GvExpandMenuPlugin, { GvExpandMenu } from './GvExpandMenu';\nimport GvFormPlugin, { GvForm } from './GvForm';\nimport GvHamburgerPlugin, { GvHamburger } from './GvHamburger';\nimport GvIconPlugin, { GvIcon } from './GvIcon';\nimport GvInputPlugin, { GvInput } from './GvInput';\nimport GvInputNumberPlugin, { GvInputNumber } from './GvInputNumber';\nimport GvLangSelectPlugin, { GvLangSelect } from './GvLangSelect';\nimport GvPopconfirmPlugin, { GvPopconfirm } from './GvPopconfirm';\nimport GvPopoverPlugin, { GvPopover } from './GvPopover';\nimport GvRadioPlugin, { GvRadio } from './GvRadio';\nimport GvRadioButtonPlugin, { GvRadioButton } from './GvRadioButton';\nimport GvRadioGroupPlugin, { GvRadioGroup } from './GvRadioGroup';\nimport GvRowPlugin, { GvRow } from './GvRow';\nimport GvScreenFullPlugin, { GvScreenFull } from './GvScreenFull';\nimport GvSearchBarPlugin, { GvSearchBar } from './GvSearchBar';\nimport GvSelectPlugin, { GvSelect } from './GvSelect';\nimport GvSidebarPlugin, { GvSidebar } from './GvSidebar';\nimport GvSidebarLogoPlugin, { GvSidebarLogo } from './GvSidebarLogo';\nimport GvSwitchPlugin, { GvSwitch } from './GvSwitch';\nimport GvTablePlugin, { GvTable } from './GvTable';\nimport GvTabPanePlugin, { GvTabPane } from './GvTabPane';\nimport GvTabsPlugin, { GvTabs } from './GvTabs';\nimport GvTagPlugin, { GvTag } from './GvTag';\nimport GvTagsViewPlugin, { GvTagsView } from './GvTagsView';\nimport GvThemePlugin, { GvTheme } from './GvTheme';\nimport GvTimePickerPlugin, { GvTimePicker } from './GvTimePicker';\nimport GvTreePlugin, { GvTree } from './GvTree';\nconst components = [\n GvRowPlugin,\n GvColPlugin,\n GvInputPlugin,\n GvButtonPlugin,\n GvPopconfirmPlugin,\n GvIconPlugin,\n GvInputNumberPlugin,\n GvCascaderPlugin,\n GvSwitchPlugin,\n GvRadioButtonPlugin,\n GvCheckboxButtonPlugin,\n GvRadioGroupPlugin,\n GvBadgePlugin,\n GvTabPanePlugin,\n GvTabsPlugin,\n GvDrawerPlugin,\n GvCardPlugin,\n GvTablePlugin,\n GvPopoverPlugin,\n GvRadioPlugin,\n GvSelectPlugin,\n GvTimePickerPlugin,\n GvCheckboxGroupPlugin,\n GvCheckboxPlugin,\n GvTagPlugin,\n GvTreePlugin,\n GvFormPlugin,\n GvLangSelectPlugin,\n GvBacktopPlugin,\n GvBreadCrumbPlugin,\n GvHamburgerPlugin,\n GvScreenFullPlugin,\n GvSearchBarPlugin,\n GvSidebarPlugin,\n GvSidebarLogoPlugin,\n GvThemePlugin,\n GvDialogPlugin,\n GvExpandMenuPlugin,\n GvTagsViewPlugin,\n GvDividerPlugin,\n GvDatePickerPlugin,\n];\n\nexport type GuavaUIOptions = {\n store: Pinia;\n i18n: Composer;\n};\n\nexport const install = (app: App, options: GuavaUIOptions) => {\n if ((install as any).INSTALLED) return;\n (install as any).INSTALLED = true;\n\n setActivePinia(options.store);\n setBridgeContext(options);\n\n components.forEach((c) => c.install(app));\n};\n\nconst GuavaUI = { install };\n\n// 🔹 按需导出组件\nexport {\n GvBacktop,\n GvBadge,\n GvBreadCrumb,\n GvButton,\n GvCard,\n GvCascader,\n GvCheckbox,\n GvCheckboxButton,\n GvCheckboxGroup,\n GvCol,\n GvDatePicker,\n GvDialog,\n GvDivider,\n GvDrawer,\n GvExpandMenu,\n GvForm,\n GvHamburger,\n GvIcon,\n GvInput,\n GvInputNumber,\n GvLangSelect,\n GvPopconfirm,\n GvPopover,\n GvRadio,\n GvRadioButton,\n GvRadioGroup,\n GvRow,\n GvScreenFull,\n GvSearchBar,\n GvSelect,\n GvSidebar,\n GvSidebarLogo,\n GvSwitch,\n GvTable,\n GvTabPane,\n GvTabs,\n GvTag,\n GvTagsView,\n GvTheme,\n GvTimePicker,\n GvTree,\n};\n\n// 🔹 hooks / utils\nexport { crud } from '@@/utils/gv.crud';\n// export * from './hooks/web/useNotify';\nexport * from './hooks/web/usePinyin';\nexport * from './hooks/web/useStorage';\nexport * from './utils/gv.notify';\nexport * from './utils/gv.propTypes';\nexport * from './utils/gv.secret';\nexport * from './utils/gv.tree';\nexport * from './utils/index';\n\n// 🔹 默认导出统一安装对象\nexport { GuavaUI };\n"],"names":["globalBridgeKey","getBridge","g","setBridgeContext","ctx","useBridgeI18n","i18n","getPrefixCls","variables","useStyle","prefixCls","_createBlock","_unref","ElBacktop","GvBacktopPlugin","app","GvBacktop","_sfc_main$F","name","props","vref","type","String","default","value","Number","max","isDot","Boolean","hidden","showZero","color","setup","slots","_createVNode","ElBadge","_export_sfc","sfc","GvBadgePlugin","_a","GvBadge","toString","is","val","isExternal","path","isString","isArray","isError","isObject","isDate","isNumber","isBoolean","isFunction","isElement","isMap","isImgPath","isDark","isNull","isEmpty","isEqual","a","b","i","keysA","keysB","key","isUrl","e","setHtmlAttrByLang","locale","sleep","timeLen","__async","resolve","toHump","all","letter","toLine","setDomCssProp","prop","dom","getDomCssProp","joinIcon","icon","joinIcons","hasClass","ele","cls","addClass","removeClass","reg","hasScrollbar","tag","dateFormatConfig","debounce","func","wait","immediate","timeout","arg","context","timestamp","result","later","last","args","callNow","getVNodeText","vnode","item","getVNodeName","removeAmountFormat","zeroFormat","numberFormat","pattern","oldVal","_nfPattern","strAry","p1","len","p2","ret","ch","p3","len2","amountFormat","decimal","v","decimalPattern","setQuickKeys","ev","btnHtml","inputHtml","messageConfirmHtml","bodyDialogHtml","dialogArr","buttonHtml","buttonDHtml","pathResolve","parentPath","childPath","preNameSpace","attrs","useAttrs","__props","isLocal","computed","iconType","iconName","svgClass","styleExternalIcon","iconComponent","compName","Icons","_openBlock","_createElementBlock","_mergeProps","_createElementVNode","_hoisted_1","ElIcon","_resolveDynamicComponent","_hoisted_2","GvIconPlugin","GvIcon","DEFAULT_CONFIG","getConfig","config","listToTree","list","conf","nodeMap","id","children","pid","node","parent","treeToList","tree","findNode","findNodeAll","findPath","visitedSet","findPathAll","filter","listFilter","__spreadValues","forEach","treeMapEach","data","conversion","haveChildren","conversionData","__spreadProps","treeMap","treeData","opt","eachTree","treeDatas","callBack","parentNode","element","newNode","filterBreadcrumb","routes","res","route","meta","_isSlot","s","Object","prototype","call","_isVNode","appStore","useAppStore","permStore","usePermsStore","showBreadcrumbIcon","getShowBreadcrumbIcon","currentRoute","useRouter","t","levelList","ref","menuRouters","routers","getRouters","getBreadcrumb","currentPath","matched","slice","unref","renderBreadcrumb","map","disabled","redirect","ElBreadcrumbItem","title","watch","startsWith","_slot","ElBreadcrumb","TransitionGroup","GvBreadCrumbPlugin","GvBreadCrumb","emits","emit","instance","getCurrentInstance","handleConfirm","event","ElPopconfirm","reference","GvInputPlugin","GvPopconfirm","getValueType","useStorage","valueType","excludes","keys","defaultExcludes","excludesArr","notificationTime","notificationTimeError","messageTime","messageTimeError","alert","msg","alertObj","getStorage","lang","promptMsg","duration","m","ElNotification","confirm","msgs","showCancelButton","hint","ok","cancel","reject","ElMessageBox","message","tableedit","ElMessage","visible","text","otext","size","undefined","link","loading","refForm","required","nativeType","bizType","perms","cb","Function","useRoute","globalSize","useGlobalConfig","buttonSize","buttonConfirm","loadings","locked","isShow","isIf","getSlots","invokeClick","raw","onClick","handlers","Array","length","handler","withLoading","task","setIconStyle","replace","checkPerms","pm","slot","split","x","indexOf","arr","handleClick","exposed","resetFields","rootForm","originFormList","formList","index","filtercode","showLabel","dateType","model","field","rootEl","el","dateRangeSingles","querySelectorAll","startInput","querySelector","endInput","searchBtn","click","classz","renderBtn","display","ElButton","GvButtonPlugin","GvButton","_props","getCardHeader","header","ElCard","GvCardPlugin","GvCard","options","placeholder","clearable","showAllLevels","separator","trigger","filterable","multiple","lazy","lazyLoad","sOps","inputValue","cascaderSize","sPlaceHolder","getDisabled","resolvedInputId","newVal","handleChange","handleBlur","handleFilterMethod","query","labels","pathLabels","join","spell","pathNodes","some","ElCascader","$event","expandTrigger","GvCascaderPlugin","GvCascader","indeterminate","label","border","checkboxValue","checkboxSize","handleUpdate","ElCheckbox","GvCheckboxPlugin","GvCheckbox","inheritAttrs","checkboxButtonSize","ElCheckboxButton","GvCheckboxButtonPlugin","GvCheckboxButton","min","checkboxGroupSize","ElCheckboxGroup","GvCheckboxGroupPlugin","GvCheckboxGroup","_sfc_main$v","span","offset","xs","sm","md","lg","xl","ElCol","GvColPlugin","GvCol","toMidnight","date","d","daysAgo","days","midnight","monthBegin","quarterBegin","month","yearBegin","now","dateShortcuts","dateShortcutsEn","dateTimeShortcuts","dateTimeShortcutsEn","dateRangeShortcuts","start","end","dateRangeShortcutsEn","modelValue","Date","format","valueFormat","defaultTime","rangeSeparator","startPlaceholder","endPlaceholder","disabledDateFunc","disabledDate","editable","unlink","useI18n","datePickerSize","getShortcuts","getPickerOptions","pickerOptions","shortcuts","includes","getTime","db","handleInput","vm","handleFocus","handlePick","maxDate","minDate","ElDatePicker","onCalendarChange","onBlur","onFocus","onChange","GvDatePickerPlugin","GvDatePicker","boundElements","initDrag","collapseMenu","dragDom","dialogHeaderEl","getStyle","attr","disX","disY","dragDomWidth","dragDomHeight","screenWidth","screenHeight","minDragDomLeft","menuWidth","maxDragDomLeft","minDragDomTop","maxDragDomTop","styL","styT","onMouseMove","left","top","onMouseUp","hasFooter","width","height","nest","appendToBody","fullscreen","maxHeight","closeOnClickModal","closeOnPressEscape","dialogClass","buttonQuick","collapseMenus","myDialogClass","dialogVisible","maskVisible","dialogMaxHeight","sAppendToBody","modalAppendToBody","sNest","modalMask","newValue","then","handleVisible","handleOpen","handleOpened","nextTick","handleClose","handleClosed","handleCancel","renderFooterBtn","footer","propsData","getFooter","setMask","mask","getMaxHeight","parseFloat","document","documentElement","clientHeight","pEl","closest","onBeforeUnmount","window","removeEventListener","onMounted","addEventListener","ElDialog","GvDialogPlugin","GvDialog","position","direction","target","clickDivider","preventDefault","stopPropagation","ElDivider","GvDividerPlugin","GvDivider","paddingHeight","drawerVisible","drawerMaxHeight","show","buttonIcon","sPaddingHeight","drawerPaddingHeight","handleResize","evt","returnIcon","ElDrawer","overflow","GvDrawerPlugin","GvDrawer","newPropTypes","createTypes","propTypes","toValidableType","usePinyin","withTone","pinyin","pinYin","__emit","menuList","menuPath","fMenusList","generateRouter","serverRoutes","basePath","prefixTitle","prefixCode","router","i18ntitle","code","tempRoutes","handleCloseDrawer","handleSelect","handleSearch","_b","starClickHandle","star","menuItem","ElAutocomplete","Search","_withCtx","_hoisted_3","_toDisplayString","_hoisted_4","ElTabs","_Fragment","_renderList","ElTabPane","_hoisted_5","sub","_hoisted_6","StarFilled","Star","_hoisted_7","_component_router_link","_hoisted_8","sideWidth","expandHandle","_normalizeClass","_normalizeStyle","GvMenuList","GvExpandMenuPlugin","GvExpandMenu","prefixIcon","suffixIcon","maxlength","readonly","columnProp","rows","autosize","showWordLimit","inputSize","sPlaceholder","renderPrefixIcon","renderSuffixIcon","select","handleClear","handleKeyDown","ElInput","number","prefix","suffix","GvInput","step","stepStrictly","precision","currentValue","oldValue","ElInputNumber","GvInputNumberPlugin","GvInputNumber","dicType","dicRemote","clear","isreload","editRow","collapseTags","userStore","useUserStore","useNotify","dicIcon","remote","loadingText","externalValue","inputShowLabel","inputFilterable","selectValue","originOptions","className","dicSrc","toLowerCase","valueCache","Map","selectSize","isEmptyLabel","getDictItemLabel","l1","l2","formatOptionLabel","findLabelInOptions","opts","find","c","getOptionValue","row","cached","get","obj","set","getSelectCode","o","trim","getSelectLabel","isEmptySelectValue","every","syncEmptyToParent","elSelectModel","mergeOptionsWithSelected","_opts","merged","append","sv","pushDefaultOption","op","push","getSelectOptions","src","xx","arr2","dictCache","dict","getDictDivision","cache","addDictCache","getDict","RegExp","test","filterMethod","initialRemoteLoaded","pendingRemoteQuery","pendingRemotePromise","remoteRequestSeq","filterOriginOptions","remoteDictSearch","requestSeq","sDicType","substring","datas","ops","JSON","parse","console","log","remoteMethod","q","filtered","ensureDefaultOption","existed","resolveDisplayLabel","localOpts","applySelectValue","resolved","showLbl","deep","handleVisibleChange","renderSelectOption","ElOption","renderTableOption","columnTexts","multiColumn","v1","mm","m2","m4","vv1","mmm","mm2","mm4","labelArr","opArr","ElSelect","GvSelectPlugin","GvSelect","columnKey","require","switchType","newStatus","ElSwitch","GvSwitchPlugin","GvSwitch","isRange","disabledHours","disabledMinutes","disabledSeconds","timepickerSize","mergedDisabledHours","mergedDisabledMinutes","mergedDisabledSeconds","ElTimePicker","GvTimePickerPlugin","GvTimePicker","infoMsg","info","calLength","sum","vcity","checkDecimal","decimalLen","checkProvince","card","province","verifyBirthday","year","day","birthday","now_year","time","checkBirthday","re_fifteen","arr_data","re_eighteen","changeFivteenToEighteen","arrInt","arrCh","cardTemp","checkParity","valnum","htValidate","rule","callback","language","divider","isDivider","labelWidth","formStyle","scroller","expose","searchFieldsCollapsed","provide","formRefs","formElRef","setFormRef","rootNodeStyle","rules","isEditContainer","sMaxHeight","isScrollbar","isAnchor","isDialog","colSpanNums","formType","styles","formSize","labelPosition","searchDivider","getLanguage","setDividerShow","getEditBar","editbar","ElRow","getDivider","dividerRender","dividerTitle","getDictItems","dictCacheTmp","dictTmp","getItemRules","_item","validateKey","maxLen","validator","gvValidate","excluded","handleRadioInput","formVal","handleDateRange2Focus","$el","handleDateRange2Blur","handleDateRange2Change","endTime","startTime","datePicker","dateArr","handleSwitchDictChange","error","handleRadioDictChange","getSearchColClass","slotProps","expand","showDefaultRow","searchFormRows","renderFormItem","_index","_slot3","colspan","createRow","blur","focus","change","render","renders","isHidden","cType","validateRule","sDateType","dateFormat","ph","startPh","endPh","cols","colSpanXs","colSpanSm","colSpanMd","colSpanLg","colSpanXl","week","datetime","editables","isTableDic","sLabel","searchFormLabel","switchDefaultVal","searchColClass","ElFormItem","_createTextVNode","ElTooltip","padding","margin","clip","whiteSpace","ElRadioGroup","_slot2","ElRadio","ElRadioButton","vv","toolText","_resolveComponent","getItems","sRootEl","tabPane","offsetTop","classList","contains","clearFormValidate","clearValidate","setFormStyle","formStyle1","lastIndexOf","parseInt","clientWidth","init","formModel","formRule","originItem","difference","diff","fieldObj","oldObj","fieldObjKeys","key2","nextProps","prevProps","firstSlot","stringify","dialogBody","dialogBody2","Transition","_withDirectives","ElForm","flexWrap","flex","minWidth","_vShow","GvFormPlugin","GvForm","collapse","loadDict","loadDictDivision","toggleCollapse","collapsed","currentDict","currentReloadDict","currentDictDivision","Fold","Expand","GvHamburgerPlugin","GvHamburger","localeStore","useLocaleStore","langMap","currentLang","handleSetLang","switchLocale","useLocale","ElDropdown","ElDropdownMenu","ElDropdownItem","_component_GvIcon","GvLangSelectPlugin","GvLangSelect","placement","tablePopover","columnType","popClass","handleUpdateVisible","handleShow","handleHide","handlePopoverWrapper","getReferenceSlot","ElPopover","GvPopoverPlugin","GvPopover","radioValue","radioSize","GvRadioPlugin","GvRadio","GvRadioButtonPlugin","GvRadioButton","radioGroupSize","GvRadioGroupPlugin","GvRadioGroup","_sfc_main$c","gutter","GvRowPlugin","GvRow","toggle","isFullscreen","useFullscreen","toggleFullscreen","GvScreenFullPlugin","GvScreenFull","inject","formNode","fieldList","fields","expandFields","shrinkFields","createSearchBar","searchBar","defaultSlot","searchBtnFlag","expandText","shrinkText","shrink","GvSearchBarPlugin","GvSearchBar","hasOneShowingChild","onlyOneChild","showingChildren","useRenderMenuTitle","renderMenuTitle","useRenderMenuItem","menuMode","renderMenuItem","oneShowingChild","fullPath","noShowingChildren","alwaysShow","ElMenuItem","ElSubMenu","menuSelect","layout","getLayout","getCollapseMenus","leftMenuUniqueOpened","getLeftMenuUniqueOpened","activeMenu","open","renderMenu","ElMenu","renderMenuWrap","ElScrollbar","GvSidebarPlugin","GvSidebar","_imports_0","GvSidebarLogoPlugin","GvSidebarLogo","createTableBar","tableBar","defaultSlots","firstChild","closable","effect","round","tagSize","ElTag","appendPageInfo","pi","pageInfo","currentpagenum","recordsperpage","countrows","totalpage","combined","tabNode","filterConditions","co","sOp","coo","ds","condition","searchCombined","action","upper","sType","saveCombined","fetchData","fetch","submit","hasMsg","fetchTable","checkForms","fmNodes","fmNode","rawFmChildren","fmChildList","fmNode2","_c","save","check","fmInnerNode","conditions","update","search","searchInputNode","tableEl","tableHeader","tableFixedHeader","columns","h","columnsFixed","lenFixed","searchNoFm","toNewPageSearch","trans","insertResult","searchData","updateResult","rownums","currentRow","removeResult","getDictDisplayLabel","dictObj","_f","_e","_d","_i","_h","_g","_k","_j","resetEditValue","crud","rowData","fieldValue","items","itemChild","codes","tableHeadFilterPopoverPopperStyle","maxWidth","refTable","tableHead","tableData","pageSize","rowClassName","rowStyle","spanMethod","cellStyle","tableType","tableSort","tableKit","tableFetch","multi","isShowPage","total","tableInit","beforeImport","tableFilter","tableCb","expandRowKeys","limitHeight","tableAction","tableActionIcon","sTableAction","sTableActionIcon","sTableConfirm","detailPlacement","sTableType","originTableHead","tableHeads","sHeight","sMaxWidth","isEditTable","sPageSize","resultData","recordsList","records","pageSizes","filterHeads","popoverVisible","exportBtnDisabled","exportBtnLoading","importBtnLoading","tableSortMode","exportDialogShow","importDialogShow","sTableBar","gTableBar","tableSearchShow","sTableSort","sTableKit","showPopoverDetail","pageLayout","actionWidth","transHash","headColumn","headColumnInit","columnSumsDecimal","isIndeterminate","columnTreeList","columnCheckedKeys","storageKey","loginAccount","lsTableHeads","debounceSearch","tableRefs","tableRef","tableSize","getPageInfo","current","pages","setTableRef","closeAllPopover","property","next","ensurePopoverKey","propKey","wrapPopoverFilterBody","body","getScrollLeft","startLoading","stopLoading","transRecords","loadAction","splice","handleImport","handleExport","getImportBtn","import","buttonName","getExportBtn","export","runPageSearch","fC","fetchFn","handleSizeChange","handleCurrentChange","handleTableSearchInput","handleTableSearch","fh","strFh","y","getTableSearch","handlePopoverShow","popOvers","tableBodyWidth","style","bodyWrapper","scrollLeft","handlePopoverHide","createChangedColumns","checkedKeys","column","hasHidden","handleColumnCheckChange","checked","childChecked","$refs","$children","getCheckedKeys","hColumns","getTableColumn","setStoreLocal","handleTableRefresh","inputSearch","getTableBar","btns","exportSlots","importSlots","getKitBar","isVisible","ElButtonGroup","Refresh","Operation","ElTree","getSortModel","marginRight","columnFilterHandler","propField","popoverHtml","checkList","dateHtmlArr","filterValue","innerText","assign","getAttribute","add","tableFixHeader","fixColumns","fixLen","columnFilterHandlerReset","remove","primaryBtn","setAttribute","getColWidth","edit","label2","sWidth","columnFormatter","cellValue","handleColumnFilter","popoverHtmlList","from","pop","removeAttribute","renderHeadFilter","_slot4","_slot5","_slot6","fc","$store","getters","dictDivision","dispatch","ret2","_slot7","_slot8","_slot9","handleDictCheckAll","handleDictCheck","handlePopoverSlotClick","renderColumnItem","tableFixed","fixed","align","formatter","cellBlur","cellEnter","cellChange","selectable","showLabelProp","columnFilter","multiLabel","heads","reserveSelection","sHidden","sProp","Math","random","sFixed","sortable","multiLabels","hType","hSLabel","hSProp","hKey","hSFixed","hReserveSelection","hSortable","hSWidth","ElTableColumn","scope","renderRowEdit","renderAction","content","confirmArr","iconArr","sContent","confirms","detail","actionType","lock","$index","onConfirm","onAfter-enter","handleDetailPopoverShow","checkEditRow","tableColumns","thd","lsTableHeadsArr","startIndex","ff","f","treeNode","rownumWidth","actionHead","actionColumn","columnVNode","sortMethod","_0","order","fieldName","sortingType","sumData","sort","row1","row2","isNaN","localeCompare","oi","rowDblClick","tagName","cell","onRowDblclick","tr","tds","firstBtn","btnArr","j","btn","prevVal","typeArr","doLayout","n","tableBodyWrapper","_slot0","GvTableBar","ElTable","_resolveDirective","ElPagination","GvTablePlugin","GvTable","autoHeight","proxy","GvTabsPlugin","GvTabPane","tabPosition","tabMaxHeight","tabHeight","panes","handleTabClick","tabVm","tabName","calcPaneInstances","createTabPane","dialogContainer","GvTabs","GvTagPlugin","GvTag","reactive","currentKey","activeKey","tagsViewStore","useTagsViewStore","permsStore","visitedViews","mainAppRoutes","isRedirect","isActive","isAffix","affix","filterAffixNavMenus","navMenus","affixTags","tagPath","params","hash","redirectedFrom","addAffixTags","tagView","addVisitedView","createTabPanel","icons","picon","showContextMenu","closeContextMenu","toLink","routePath","targetView","toLastView","visitedView","currentView","latestView","addNavMenu","addTagView","moveToCurrentTag","view","clickTab","tab","closeCurrentTag","targetKey","delTagView","refreshSelectedTag","delCachedView","findCurTagIndex","findIndex","closeTagsOrientation","isClosed","cloneDeep","closeOthersTags","delOthersViews","oldName","tagsViewEl","useEventListener","targetNode","parentElement","clientX","pageX","clientY","pageY","GvTagsViewPlugin","GvTagsView","themeOptions","currentTheme","handleSetTheme","GvThemePlugin","GvTheme","treeProps","nodeKey","load","showCheckbox","draggable","defaultExpandedKeys","defaultCheckedKeys","iconClass","defaultExpandAll","expandOnClickNode","checkOnClickNode","filterNodeMethod","renderContent","handleNodeClick","handleNodeExpand","handleNodeCollapse","handleCheck","checkedInfo","handleCheckChange","handleLazyLoad","handleNodeDrop","draggingNode","dropNode","dropType","GvTreePlugin","GvTree","encrypt","word","keyStr","CryptoJS","ww","srcs","decrypt","generateKey","num","library","randomPoz","components","GvPopconfirmPlugin","GvTabPanePlugin","install","setActivePinia","GuavaUI","exports","_sfc_main$G","_sfc_main$h","_sfc_main$8","confirm$1"],"mappings":"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AIngB,IAAS,QAASmgB,EAAO,WACxBA,EAAO,iCACLA,CACT,EACA,OAAQ,CAACngB,EAAcvJ,IAAgB,CACrC,IAAI0pB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,QAAU,KAAK,MAAM1pB,EAAM,CAAC,EAAI,QAAUA,EAAM,OACxE0pB,EAAO,kBAAoB1pB,EAAM,cAC/B0pB,CACT,EACA,MAAQngB,GAAiB,CACvB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,kBACxBA,EAAO,kEACLA,CACT,EACA,SAAU,CAACngB,EAAcvJ,IAAgB,CACvC,IAAI0pB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,aAAe1pB,EAAM,OACtC,uCAAyCA,EAC9C0pB,CACT,EACA,OAASngB,GAAiB,CACxB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,cACxBA,EAAO,iDACLA,CACT,EACA,OAASngB,GAAiB,CACxB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,WACxBA,EAAO,iCACLA,CACT,EACA,QAAUngB,GAAiB,CACzB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,kBACxBA,EAAO,sEACLA,CACT,EAEA,aAAengB,GAAiB,CAC9B,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,kBACxBA,EAAO,6CACLA,CACT,EAEA,KAAOngB,GAAiB,CACtB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,yBACxBA,EAAO,+DACLA,CACT,EACA,MAAQngB,GAAiB,CACvB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,aACxBA,EAAO,+BACLA,CACT,EACA,MAAQngB,GAAiB,CACvB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,WACxBA,EAAO,gCACLA,CACT,EACA,UAAYngB,GAAiB,CAC3B,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,kCACxBA,EAAO,mCACLA,CACT,EACA,GAAKngB,GAAiB,C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"}
1
+ {"version":3,"file":"guava-ui.umd.js","sources":["../packages/bridge/index.ts","../packages/GvBacktop/src/GvBacktop.vue","../packages/GvBacktop/index.ts","../packages/GvBadge/src/GvBadge.vue","../packages/GvBadge/index.ts","../packages/utils/index.ts","../packages/GvIcon/src/GvIcon.vue","../packages/GvIcon/index.ts","../packages/utils/gv.tree.ts","../packages/GvBreadCrumb/src/helper.ts","../packages/GvBreadCrumb/src/GvBreadCrumb.vue","../packages/GvBreadCrumb/index.ts","../packages/GvPopconfirm/src/GvPopconfirm.vue","../packages/GvPopconfirm/index.ts","../packages/hooks/web/useStorage.ts","../packages/utils/gv.notify.ts","../packages/GvButton/src/GvButton.vue","../packages/GvButton/index.ts","../packages/GvCard/src/GvCard.vue","../packages/GvCard/index.ts","../packages/GvCascader/src/GvCascader.vue","../packages/GvCascader/index.ts","../packages/GvCheckbox/src/GvCheckbox.vue","../packages/GvCheckbox/index.ts","../packages/GvCheckboxButton/src/GvCheckboxButton.vue","../packages/GvCheckboxButton/index.ts","../packages/GvCheckboxGroup/src/GvCheckboxGroup.vue","../packages/GvCheckboxGroup/index.ts","../packages/GvCol/src/GvCol.vue","../packages/GvCol/index.ts","../packages/GvDatePicker/src/datetime.ts","../packages/GvDatePicker/src/shortcuts.ts","../packages/GvDatePicker/src/GvDatePicker.vue","../packages/GvDatePicker/index.ts","../packages/GvDialog/src/drag.ts","../packages/GvDialog/src/GvDialog.vue","../packages/GvDialog/index.ts","../packages/GvDivider/src/GvDivider.vue","../packages/GvDivider/index.ts","../packages/GvDrawer/src/GvDrawer.vue","../packages/GvDrawer/index.ts","../packages/utils/gv.propTypes.ts","../packages/hooks/web/usePinyin.ts","../packages/GvExpandMenu/src/GvMenuList.vue","../packages/GvExpandMenu/src/GvExpandMenu.vue","../packages/GvExpandMenu/index.ts","../packages/GvInput/src/GvInput.vue","../packages/GvInput/index.ts","../packages/GvInputNumber/src/GvInputNumber.vue","../packages/GvInputNumber/index.ts","../packages/GvSelect/src/GvSelect.vue","../packages/GvSelect/index.ts","../packages/GvSwitch/src/GvSwitch.vue","../packages/GvSwitch/index.ts","../packages/GvTimePicker/src/GvTimePicker.vue","../packages/GvTimePicker/index.ts","../packages/utils/gv.infomsg.ts","../packages/utils/gv.validate.ts","../packages/GvForm/src/GvForm.vue","../packages/GvForm/index.ts","../packages/GvHamburger/src/GvHamburger.vue","../packages/GvHamburger/index.ts","../packages/GvLangSelect/src/GvLangSelect.vue","../packages/GvLangSelect/index.ts","../packages/GvPopover/src/GvPopover.vue","../packages/GvPopover/index.ts","../packages/GvRadio/src/GvRadio.vue","../packages/GvRadio/index.ts","../packages/GvRadioButton/src/GvRadioButton.vue","../packages/GvRadioButton/index.ts","../packages/GvRadioGroup/src/GvRadioGroup.vue","../packages/GvRadioGroup/index.ts","../packages/GvRow/src/GvRow.vue","../packages/GvRow/index.ts","../packages/GvScreenFull/src/GvScreenFull.vue","../packages/GvScreenFull/index.ts","../packages/GvSearchBar/src/GvSearchBar.vue","../packages/GvSearchBar/index.ts","../packages/GvSidebar/src/helper.ts","../packages/GvSidebar/src/components/useRenderMenuTitle.tsx","../packages/GvSidebar/src/components/useRenderMenuItem.tsx","../packages/GvSidebar/src/GvSidebar.vue","../packages/GvSidebar/index.ts","../src/assets/imgs/logo.png","../packages/GvSidebarLogo/src/GvSidebarLogo.vue","../packages/GvSidebarLogo/index.ts","../packages/GvTableBar/src/GvTableBar.vue","../packages/GvTag/src/GvTag.vue","../packages/GvTree/src/GvTree.vue","../packages/GvTree/index.ts","../packages/utils/gv.table.ts","../packages/utils/gv.crud.ts","../packages/utils/gv.table.validate.ts","../packages/GvTable/src/GvTable.vue","../packages/GvTable/index.ts","../packages/GvTabPane/src/GvTabPane.vue","../packages/GvTabPane/index.ts","../packages/GvTabs/src/GvTabs.vue","../packages/GvTabs/index.ts","../packages/GvTag/index.ts","../packages/GvTagsView/src/GvTagsView.vue","../packages/GvTagsView/index.ts","../packages/GvTheme/src/GvTheme.vue","../packages/GvTheme/index.ts","../packages/utils/gv.secret.ts","../packages/index.ts"],"sourcesContent":["// bridge/index.ts\nimport type { Router } from 'vue-router';\nimport type { Pinia } from 'pinia';\nimport type { Composer } from 'vue-i18n';\n\ninterface GlobalBridgeContext {\n router?: Router;\n i18n?: Composer;\n store?: Pinia;\n}\nconst globalBridgeKey = '__LIB_BRIDGE_CONTEXT__';\nconst getBridge = (): GlobalBridgeContext => {\n const g = globalThis as any;\n if (!g[globalBridgeKey]) g[globalBridgeKey] = {};\n\n return g[globalBridgeKey];\n};\nconst context: GlobalBridgeContext = {};\n\n// export function setBridgeContext(options: GlobalBridgeContext) {\n// if (options.router) context.router = options.router;\n// if (options.i18n) context.i18n = options.i18n;\n// if (options.pinia) context.pinia = options.pinia;\n// }\nexport const setBridgeContext = (ctx: GlobalBridgeContext) => {\n // console.log('setBridgeContext', ctx);\n Object.assign(getBridge(), ctx);\n};\n\nexport function useBridgeRouter(): Router {\n const router = getBridge().router;\n if (!router) throw new Error('[Bridge] router not set');\n return router;\n}\n// export function useBridgeRouter(): Router {\n// if (!context.router) throw new Error('[Bridge] Router is not injected');\n// return context.router;\n// }\n\nexport function useBridgeI18n(): Composer {\n const i18n = getBridge().i18n;\n if (!i18n) throw new Error('[Bridge] I18n is not injected');\n return i18n;\n}\n\n// export function useBridgeI18n(): Composer {\n// if (!context.i18n) throw new Error('[Bridge] I18n is not injected');\n// return context.i18n;\n// }\n\nexport function useBridgePinia(): Pinia {\n if (!context.store) throw new Error('[Bridge] Pinia is not injected');\n return context.store;\n}\n","<!--\n * @title: backtop\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:24:46\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-05-22 09:26:44\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { ElBacktop } from 'element-plus';\n import { useStyle } from '@/hook/web/useStyle';\n\n // --- define name and inheritAttrs ---\n defineOptions({\n name: 'GvBacktop', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n const { getPrefixCls, variables } = useStyle();\n\n const prefixCls = getPrefixCls('backtop');\n</script>\n\n<template>\n <ElBacktop\n :class=\"prefixCls\"\n :target=\"`.${variables.namespace}-layout-content-scrollbar .${variables.elNamespace}-scrollbar__wrap`\" />\n</template>\n","import type { App } from 'vue';\nimport GvBacktop from './src/GvBacktop.vue';\n// Define the install method on the GvButton component\nconst GvBacktopPlugin = {\n install(app: App): void {\n app.component(GvBacktop.name ?? 'GvBacktop', GvBacktop);\n },\n};\nexport default GvBacktopPlugin;\n\nexport { GvBacktop };\n","<!--\n * @title: badge component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 10:37:36\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 15:14:46\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElBadge } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n import type { TBadgeType } from './types/index';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('badge');\n\n export default defineComponent({\n name: 'GvBadge',\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [Number, String] as PropType<number | string>,\n default: '',\n },\n max: {\n type: Number,\n default: 10,\n },\n isDot: {\n type: Boolean,\n default: false,\n },\n hidden: {\n type: Boolean,\n default: false,\n },\n showZero: {\n type: Boolean,\n default: false,\n },\n color: {\n type: String,\n default: '',\n },\n type: {\n type: String as PropType<TBadgeType>,\n default: 'warning',\n },\n },\n\n setup(props, { slots }) {\n // @render\n return () => (\n <ElBadge\n value={props.value}\n max={props.max}\n type={props.type}\n hidden={props.hidden}\n isDot={props.isDot}\n showZero={props.showZero}\n color={props.color}\n class={prefixCls}>\n {slots.default?.()}\n </ElBadge>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-badge';\n .#{$prefixCls} {\n margin-top: 5px;\n margin-right: 25px;\n\n :deep(.el-badge__content) {\n height: 20px;\n line-height: 18px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvBadge from './src/GvBadge.vue';\n\nconst GvBadgePlugin = {\n install(app: App): void {\n app.component(GvBadge.name ?? 'GvBadge', GvBadge);\n },\n};\nexport default GvBadgePlugin;\n\nexport { GvBadge };\n","/*\n * @title: common utility func\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-02-27 13:25:29\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-12 18:33:42\n * @version: 1.0.7\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\nimport type { FormInstance } from 'element-plus';\n\n// ------ is utils ------\nconst toString = Object.prototype.toString;\nexport const is = (val: unknown, type: string) => toString.call(val) === `[object ${type}]`;\n\nexport const isExternal = (path: string): boolean => /^(https?:|mailto:|tel:)/.test(path);\nexport const isString = (val: unknown): val is string => is(val, 'String');\nexport const isArray = (val: any): val is any[] => val && Array.isArray(val);\nexport const isError = (e: unknown): e is Error => typeof e === 'object' && e !== null && 'message' in e;\nexport const isObject = (val: any): val is Record<any, any> => val !== null && is(val, 'Object');\nexport const isDate = (val: unknown): val is Date => is(val, 'Date');\nexport const isNumber = (val: unknown): val is number => is(val, 'Number');\nexport const isBoolean = (val: unknown): val is boolean => is(val, 'Boolean');\nexport const isFunction = (val: unknown): val is (...args: any[]) => any => typeof val === 'function';\nexport const isElement = (val: unknown): val is Element => isObject(val) && !!val.tagName;\nexport const isMap = (val: unknown): val is Map<any, any> => is(val, 'Map');\nexport const isImgPath = (path: string): boolean => /(https?:\\/\\/|data:image\\/).*?\\.(png|jpg|jpeg|gif|svg|webp|ico)/gi.test(path);\nexport const isDark = (): boolean => window.matchMedia('(prefers-color-scheme: dark)').matches;\nexport const isNull = (val: unknown): val is null => val === null;\n\nexport const isEmpty = <T = unknown>(val: T): val is T => {\n if (isNull(val)) return true;\n if (val === undefined) return true;\n if (val === 'null') return true;\n if (isArray(val) || isString(val)) return val.length === 0;\n if (val instanceof Map || val instanceof Set) return val.size === 0;\n if (isObject(val)) return Object.keys(val).length === 0;\n return false;\n};\n\n/**\n * @todo: deep equal (plain object / array / date), functions compare by reference\n */\nexport const isEqual = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a === null || b === null || a === undefined || b === undefined) return false;\n if (typeof a !== typeof b) return false;\n if (isFunction(a) || isFunction(b)) return a === b;\n if (isDate(a) && isDate(b)) return a.getTime() === b.getTime();\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!isEqual(a[i], b[i])) return false;\n\n return true;\n }\n if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n if (!isEqual(a[key], b[key])) return false;\n }\n return true;\n }\n return false;\n};\n\nexport const isUrl = (path: string): boolean => {\n try {\n new URL(path);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * @todo: set html lang attr\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-24 10:37:13\n * @param {LocaleType} locale\n */\nexport const setHtmlAttrByLang = (locale: LocaleType): void => {\n document.querySelector('html')?.setAttribute('lang', locale);\n};\n\n/**\n * @todo: sleep async function\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 12:01:37\n * @param {*} timeLen\n */\nexport const sleep = async (timeLen: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, timeLen));\n/**\n * @todo: underline to camel case\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:21:09\n * @param {*} name\n */\nexport const toHump = (name: string): string => {\n if (!name) return '';\n // eslint-disable-next-line no-useless-escape\n return name.replace(/\\_(\\w)/g, function (all, letter) {\n return letter.toUpperCase();\n });\n};\n\n/**\n * @todo: camel case to underline\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:21:50\n * @param {*} name\n */\nexport const toLine = (name: string): string => name.replace(/([A-Z])/g, '_$1').toLowerCase();\n\n/**\n * 设置css style\n * @param prop\n * @param val\n * @param dom\n */\nexport const setDomCssProp = (prop: string, val: any, dom = document.documentElement): void => {\n dom.style.setProperty(prop, val);\n};\n\n/**\n * get css style\n * @param prop\n * @param dom\n * @returns\n */\nexport const getDomCssProp = (prop: string, dom = document.documentElement): string => getComputedStyle(dom).getPropertyValue(prop);\n\n/**\n * join icon class\n * @param icon\n * @returns\n */\nexport const joinIcon = function (icon) {\n let joinIcons = '';\n if (icon)\n if (icon.includes('el-icon')) joinIcons = icon;\n else if (icon.includes('gv-icon')) joinIcons = `iconfont ${icon}`;\n return joinIcons;\n};\n\n/**\n * Check if an element has a class\n * @param {HTMLElement} ele\n * @param {string} cls\n * @returns {boolean}\n */\nexport const hasClass = (ele: HTMLElement, cls: string): boolean => !!ele.className.match(new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)'));\n\n/**\n * Add class to element\n * @param {HTMLElement} ele\n * @param {string} cls\n */\nexport const addClass = (ele: HTMLElement, cls: string) => {\n if (!hasClass(ele, cls)) ele.className += ' ' + cls;\n};\n\n/**\n * Remove class from element\n * @param {HTMLElement} ele s s\n * @param {string} cls\n */\nexport const removeClass = (ele: HTMLElement, cls: string): void => {\n if (hasClass(ele, cls)) {\n const reg = new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)');\n ele.className = ele.className.replace(reg, ' ');\n }\n};\n\n/**\n * @todo: html tag has scrollbar\n * @param {*} tag\n */\nexport const hasScrollbar = (tag: any) => tag.scrollHeight > (tag.innerHeight || tag.clientHeight);\n\n/**\n * date format settings\n */\nexport const dateFormatConfig = {\n date: {\n placeholder: '选择日期', // yyyy-mm-dd\n valueFormat: 'YYYY-MM-DD',\n dateFormat: 'YYYY-MM-DD',\n },\n exactdate: {\n placeholder: '选择日期', // yyyy-mm-dd\n valueFormat: 'YYYY-MM-dd HH:mm:ss',\n dateFormat: 'YYYY-MM-DD',\n },\n datetime: {\n placeholder: '选择时间', // yyyy-mm-dd hh:mm\n valueFormat: 'YYYY-MM-DD HH:mm',\n dateFormat: 'YYYY-MM-DD HH:mm',\n },\n week: {\n placeholder: '选择周',\n dateFormat: 'YYYY 第 ww 周',\n valueFormat: 'YYYY[w]ww',\n },\n month: {\n placeholder: '选择月份', // yyyy-mm\n valueFormat: 'YYYY-MM',\n dateFormat: 'YYYY-MM',\n },\n year: {\n placeholder: '选择年份', // yyyy\n valueFormat: 'YYYY',\n dateFormat: 'YYYY',\n },\n};\n\n/**\n * @todo: 防抖函数(一段时间内只响应最后一次操作,如:input框连续输入)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:58:21\n * @param {*} func\n * @param {*} wait\n * @param {*} immediate\n */\nexport const debounce = (func: Fn, wait = 100, immediate = false) => {\n let timeout: ReturnType<typeof setTimeout> | null;\n let arg: any[];\n let context: any;\n let timestamp: number;\n let result: ReturnType<Fn>;\n const later = function () {\n // 据上一次触发时间间隔\n const last = +new Date() - timestamp;\n // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait\n if (last < wait && last > 0) timeout = setTimeout(later, wait - last);\n else {\n timeout = null;\n // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用\n if (!immediate) {\n result = func.apply(context, arg);\n if (!timeout) context = arg = null as any;\n }\n }\n };\n return function (this: any, ...args) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n context = this;\n // fixme: 解决防抖函数无法传参的问题 2022-04-19\n arg = args;\n timestamp = +new Date();\n const callNow = immediate && !timeout;\n // 如果延时不存在,重新设定延时\n if (!timeout) timeout = setTimeout(later, wait);\n if (callNow) {\n result = func.apply(context, arg);\n context = arg = null as any;\n }\n\n return result;\n };\n};\n\n/**\n * @todo: get form model\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-12 18:29:17\n * @param {FormInstance} fmNode\n */\nexport const getFormModel = (fmNode: FormInstance | null | undefined): Recordable<any> => {\n if (fmNode == null) return {};\n\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n let model: Recordable<any> = {};\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm') {\n const props = fmNode2.props;\n model = props.model;\n // console.log(model);\n }\n }\n return model;\n};\n/**\n * @todo: get vnode text\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 13:49:54\n * @param {VNode} vnode\n */\nexport const getVNodeText = (vnode: any): string => {\n if (!vnode) return '';\n // 1. 字符串\n if (typeof vnode === 'string') return vnode;\n // 2. 数字\n if (typeof vnode === 'number') return String(vnode);\n // 3. children 为字符串\n if (typeof vnode.children === 'string') return vnode.children.trim();\n // 4. children 为数组\n if (Array.isArray(vnode.children)) return vnode.children.map((item) => getVNodeText(item)).join('');\n // 5. slots(ElButton / 组件)\n if (vnode.children && typeof vnode.children === 'object') {\n const slots = vnode.children as Record<string, any>;\n // default slot\n if (typeof slots.default === 'function') {\n const slotNodes = slots.default();\n return slotNodes.map((item: any) => getVNodeText(item)).join('');\n }\n }\n\n return '';\n};\n\n/**\n * @todo: get vnode name\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 17:24:24\n * @param {any} vnode\n */\nexport const getVNodeName = (vnode: any): string => {\n if (!vnode) return '';\n return typeof vnode.type === 'object' && vnode.type !== null && 'name' in vnode.type ? vnode.type.name : '';\n};\n\n/**\n * @todo: 去除金额格式化方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-24 14:14:55\n * @param {*} val\n */\nexport const removeAmountFormat = (val: string): string => {\n if (val) return val.replace(/,/g, '');\n else return '0.00';\n};\n\n// when val is 0.00, change it as 0 format\nfunction zeroFormat(val: string): string {\n if (val === '0.00') return '0';\n else return val;\n}\n\nfunction numberFormat(pattern, val) {\n const oldVal = val;\n if (val < 0) val = -val;\n const _nfPattern = '[0#]+[,]?[0#]*(\\\\.[0#]+)?';\n if (!pattern || !new RegExp(_nfPattern, 'g').test(pattern)) return '0.00';\n\n if (!isNumber((val + '').replace('.', ''))) return '0.00';\n\n const strAry = pattern.match(new RegExp(_nfPattern, 'g'));\n const p1 = strAry[0].indexOf('.');\n if (p1 > 0) {\n const len = strAry[0].length - p1 - 1;\n val = Math.round(val * Math.pow(10, len)) / Math.pow(10, len);\n } else val = Math.round(val);\n\n val = val + '';\n const p2 = val.indexOf('.');\n let ret = '';\n if (p1 > 0) {\n for (let i = p1 + 1; i < strAry[0].length; i++) {\n const ch = p2 > 0 && p2 + i - p1 < val.length ? val.charAt(p2 + i - p1) : '';\n if (strAry[0].charAt(i) === '0') ret = ret + (ch === '' ? '0' : ch);\n else ret = ret + (ch === '' ? '' : ch);\n }\n ret = ret === '' ? '' : '.' + ret;\n }\n const p3 = strAry[0].indexOf(',');\n if (p3 > 0) {\n const len = p1 > 0 ? p1 - p3 - 1 : strAry[0].length - p3 - 1;\n const len2 = p2 > 0 ? p2 - 1 : val.length - 1;\n for (let i = len2; i >= 0; i--) ret = ((len2 - i + 1) % len === 0 ? ',' : '') + val.charAt(i) + ret;\n\n ret = ret.charAt(0) === ',' ? ret.substring(1, ret.length) : ret;\n } else ret = val.substring(0, p2 > 0 ? p2 : val.length) + ret;\n\n if (oldVal < 0) ret = '-' + ret;\n\n return pattern.replace(strAry[0], ret);\n}\n\n/**\n * @todo: 千位符转换\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-24 09:22:56\n * @param {*} val\n * @param {*} decimal 小数位数\n */\nexport const amountFormat = (val: string | number, decimal = 2): string => {\n let v = val + '';\n if (v === null || v === 'null' || v === '0' || v === undefined || v === 'undefined') return '0.00';\n if (v.indexOf(',') > 0) v = removeAmountFormat(v);\n let pattern = '#,###.';\n let decimalPattern = '00';\n if (decimal) decimalPattern = decimalPattern.padStart(decimal, '0');\n pattern = pattern + decimalPattern;\n return zeroFormat(numberFormat(pattern, v));\n};\n\n/**\n * @todo: set quick keys\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:38:53\n * @param {*} ev\n */\nexport const setQuickKeys = (ev) => {\n if (ev && ev.key)\n if (ev.key.toLowerCase() === 'q' && ev.ctrlKey === true) {\n // 绑定ctr + q\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-search__bar>.gv-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-edit__bar .gv-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 'r' && ev.ctrlKey === true) {\n // 绑定crt + r\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-form .gv-search__bar>.gv-button.reset') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') if (btnHtml.getAttribute('refform')) btnHtml.click();\n } else if (ev.key.toLowerCase() === 'e' && ev.ctrlKey === true) {\n // 绑定crt + e\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-form .gv-search__bar>.gv-button.shrink') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-form .gv-search__bar>.gv-button.expand') as HTMLElement;\n if (btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 's' && ev.ctrlKey === true) {\n // 绑定crt + s\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-drawer__popup .gv-drawer .gv-drawer__footer>.gv-drawer__footer--inner .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-edit__bar .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 'n' && ev.ctrlKey === true) {\n // 绑定crt + n\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-table__container .gv-table__bar .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-edit__bar .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === '=' && ev.ctrlKey === true) {\n // 绑定crt + '='\n ev.preventDefault();\n ev.stopPropagation();\n const inputHtml = document.body.querySelector('.main-container .gv-container .gv-table__container .gv-table__search .gv-table__search-input > .el-input__inner') as HTMLElement;\n if (inputHtml) inputHtml.focus();\n } else if (ev.key === 'Escape') {\n // 绑定esc关闭弹窗\n ev.preventDefault();\n ev.stopPropagation();\n const messageConfirmHtml = document.documentElement.querySelector('body>.el-message-box__wrapper') as HTMLElement;\n if (messageConfirmHtml && messageConfirmHtml.style.display !== 'none') {\n const bodyButtonHtml = messageConfirmHtml.querySelector('.el-message-box .el-message-box__btns button') as HTMLElement;\n bodyButtonHtml.click();\n } else {\n const bodyDialogHtml = document.documentElement.querySelector('body>.gv-dialog') as HTMLElement;\n if (bodyDialogHtml && bodyDialogHtml.style.display !== 'none') {\n const bodyButtonHtml = bodyDialogHtml.querySelector('.el-dialog__header button') as HTMLElement;\n bodyButtonHtml.click();\n } else {\n const dialogArr = document.body.querySelectorAll('.main-container .gv-container .gv-dialog__popup .gv-dialog') as NodeListOf<HTMLElement>;\n if (dialogArr)\n for (let i = 0; i < dialogArr.length; i++)\n if (dialogArr[i].style.display !== 'none') {\n const buttonHtml = dialogArr[i].querySelector('.el-dialog__header button') as HTMLElement;\n if (buttonHtml && buttonHtml.style.display !== 'none') {\n buttonHtml.click();\n return;\n }\n }\n\n const buttonDHtml = document.body.querySelector('.main-container .gv-container .gv-drawer__popup .gv-drawer .el-drawer__header button') as HTMLElement;\n if (buttonDHtml && buttonDHtml.style.display !== 'none') buttonDHtml.click();\n }\n }\n }\n};\n\nexport const pathResolve = (parentPath: string, path: string) => {\n if (isUrl(path)) return path;\n const childPath = path.startsWith('/') || !path ? path : `/${path}`;\n return `${parentPath}${childPath}`.replace(/\\/\\//g, '/').trim();\n};\n","<!--\n * @title: svg icon component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-01 17:02:13\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 10:50:13\n * @version: 1.0.8\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { isExternal } from '@@/utils';\n import * as Icons from '@element-plus/icons-vue';\n import { ElIcon } from 'element-plus';\n import { computed, useAttrs, type DefineComponent } from 'vue';\n const { variables } = useStyle();\n const preNameSpace = variables.namespace;\n const attrs = useAttrs();\n // --- define name and inheritAttrs ---\n defineOptions({\n name: 'GvIcon', // 定义组件名称\n inheritAttrs: false, // 默认继承属性\n });\n // --- transfer props and define default values ---\n const props = withDefaults(\n defineProps<{\n iconType?: string;\n iconName: string;\n className?: string;\n icon?: DefineComponent; // element-plus icon component\n size?: string; // 图标的font-size,单位是px\n }>(),\n {\n iconType: '', // svg | iconfont | el\n className: '',\n },\n );\n // @computed\n const isLocal = computed(() => isExternal(props.iconName));\n const iconType = computed(() => {\n if (props.iconType === 'svg') return 'svg';\n else if (props.iconType === 'iconfont') return 'iconfont';\n else if (props.iconType === 'el') return 'el';\n else if (props.iconType === '')\n if (props.iconName.startsWith('el-icon')) return 'el';\n else if (props.iconName.startsWith('gv-')) return 'iconfont';\n else return 'svg';\n else return 'svg';\n });\n const iconName = computed(() => {\n if (iconType.value === 'svg') return `#${preNameSpace}-icon-${props.iconName}`;\n else if (iconType.value === 'iconfont') return 'iconfont ' + props.iconName;\n else if (iconType.value === 'el') return props.iconName;\n else return `#${props.iconName}`;\n });\n\n // @method\n const svgClass = computed(() => {\n if (iconType.value === 'svg') return props.className ? 'svg-icon ' + props.className : 'svg-icon';\n else return props.className;\n });\n const styleExternalIcon = computed(() => ({\n mask: `url(${props.iconName}) no-repeat 50% 50%`,\n '-webkit-mask': `url(${props.iconName}) no-repeat 50% 50%`,\n }));\n\n /**\n * @todo: get element-plus icon component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:18:16\n * @param {*} computed\n */\n const iconComponent = computed(() => {\n // console.log(iconType.value);\n // console.log(props.iconName);\n if (iconType.value !== 'el') return null;\n const name = props.iconName;\n let compName = '';\n if (name.startsWith('el-icon')) {\n compName = name.replace('el-icon-', '');\n compName = compName.charAt(0).toUpperCase() + compName.slice(1);\n } else compName = name.charAt(0).toUpperCase() + name.slice(1);\n\n return Icons[compName as keyof typeof Icons];\n });\n</script>\n<template>\n <div\n v-if=\"isLocal\"\n :style=\"styleExternalIcon\"\n class=\"svg-external-icon svg-icon\"\n v-bind=\"attrs\"></div>\n <svg\n v-else-if=\"iconType === 'svg'\"\n :class=\"svgClass\"\n aria-hidden=\"true\"\n v-bind=\"attrs\">\n <use :href=\"iconName\" />\n </svg>\n <i\n v-else-if=\"iconType === 'iconfont'\"\n :class=\"[iconName, svgClass]\"\n v-bind=\"attrs\">\n </i>\n <ElIcon\n v-else-if=\"iconComponent\"\n :class=\"svgClass\">\n <component :is=\"iconComponent\" />\n </ElIcon>\n <svg\n v-else\n :class=\"svgClass\"\n :style=\"{ 'font-size': size + 'px' }\"\n aria-hidden=\"true\"\n v-bind=\"attrs\">\n <use :xlink:href=\"iconName\" />\n </svg>\n</template>\n\n<style lang=\"scss\" scoped>\n .svg-icon {\n width: 1em;\n height: 1em;\n overflow: hidden;\n vertical-align: -0.15em;\n fill: currentcolor;\n }\n\n .svg-external-icon {\n display: inline-block;\n background-color: currentcolor;\n mask-size: cover !important;\n }\n</style>\n","import type { App } from 'vue';\nimport GvIcon from './src/GvIcon.vue';\nconst GvIconPlugin = {\n install(app: App): void {\n app.component(GvIcon.name ?? 'GvIcon', GvIcon);\n },\n};\nexport default GvIconPlugin;\n\nexport { GvIcon };\n","interface TreeHelperConfig {\n id: string;\n children: string;\n pid: string;\n}\nconst DEFAULT_CONFIG: TreeHelperConfig = {\n id: 'id',\n children: 'children',\n pid: 'pid',\n};\nconst getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config);\n// tree from list\nexport const listToTree = <T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] => {\n const conf = getConfig(config) as TreeHelperConfig;\n const nodeMap = new Map();\n const result: T[] = [];\n const { id, children, pid } = conf;\n\n for (const node of list) {\n node[children] = node[children] || [];\n nodeMap.set(node[id], node);\n }\n for (const node of list) {\n const parent = nodeMap.get(node[pid]);\n (parent ? parent.children : result).push(node);\n }\n return result;\n};\n\nexport const treeToList = <T = any>(tree: any, config: Partial<TreeHelperConfig> = {}): T => {\n config = getConfig(config);\n const { children } = config;\n const result: any = [...tree];\n for (let i = 0; i < result.length; i++) {\n if (!result[i][children!]) continue;\n result.splice(i + 1, 0, ...result[i][children!]);\n }\n return result;\n};\n\nexport const findNode = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | null => {\n config = getConfig(config);\n const { children } = config;\n const list = [...tree];\n for (const node of list) {\n if (func(node)) return node;\n node[children!] && list.push(...node[children!]);\n }\n return null;\n};\n\nexport const findNodeAll = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T[] => {\n config = getConfig(config);\n const { children } = config;\n const list = [...tree];\n const result: T[] = [];\n for (const node of list) {\n func(node) && result.push(node);\n node[children!] && list.push(...node[children!]);\n }\n return result;\n};\n\nexport const findPath = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | T[] | null => {\n config = getConfig(config);\n const path: T[] = [];\n const list = [...tree];\n const visitedSet = new Set();\n const { children } = config;\n while (list.length) {\n const node = list[0];\n if (visitedSet.has(node)) {\n path.pop();\n list.shift();\n } else {\n visitedSet.add(node);\n node[children!] && list.unshift(...node[children!]);\n path.push(node);\n if (func(node)) return path;\n }\n }\n return null;\n};\n\nexport const findPathAll = (tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}) => {\n config = getConfig(config);\n const path: any[] = [];\n const list = [...tree];\n const result: any[] = [];\n const visitedSet = new Set();\n const { children } = config;\n while (list.length) {\n const node = list[0];\n if (visitedSet.has(node)) {\n path.pop();\n list.shift();\n } else {\n visitedSet.add(node);\n node[children!] && list.unshift(...node[children!]);\n path.push(node);\n func(node) && result.push([...path]);\n }\n }\n return result;\n};\n\nexport const filter = <T = any>(tree: T[], func: (n: T) => boolean, config: Partial<TreeHelperConfig> = {}): T[] => {\n config = getConfig(config);\n const children = config.children as string;\n function listFilter(list: T[]) {\n return list\n .map((node: any) => ({ ...node }))\n .filter((node) => {\n node[children] = node[children] && listFilter(node[children]);\n return func(node) || (node[children] && node[children].length);\n });\n }\n return listFilter(tree);\n};\n\nexport const forEach = <T = any>(tree: T[], func: (n: T) => any, config: Partial<TreeHelperConfig> = {}): void => {\n config = getConfig(config);\n const list: any[] = [...tree];\n const { children } = config;\n for (let i = 0; i < list.length; i++) {\n // func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿\n if (func(list[i])) return;\n\n children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]);\n }\n};\n/**\n * @description: Extract tree specified structure\n */\nexport const treeMapEach = (data: any, { children = 'children', conversion }: { children?: string; conversion: Fn }) => {\n const haveChildren = Array.isArray(data[children]) && data[children].length > 0;\n const conversionData = conversion(data) || {};\n if (haveChildren)\n return {\n ...conversionData,\n [children]: data[children].map((i: number) =>\n treeMapEach(i, {\n children,\n conversion,\n }),\n ),\n };\n else\n return {\n ...conversionData,\n };\n};\n/**\n * @description: Extract tree specified structure\n */\nexport const treeMap = <T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] => treeData.map((item) => treeMapEach(item, opt));\n\n/**\n * 递归遍历树结构\n * @param treeDatas 树\n * @param callBack 回调\n * @param parentNode 父节点\n */\nexport const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => {\n treeDatas.forEach((element) => {\n const newNode = callBack(element, parentNode) || element;\n if (element.children) eachTree(element.children, callBack, newNode);\n });\n};\n","/*\n * @title: breadcrumb helper func\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 12:55:48\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-01-30 12:12:40\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { pathResolve } from '../../utils/index';\n\nexport const filterBreadcrumb = (routes: AppRouteRecordRaw[], parentPath = ''): AppRouteRecordRaw[] => {\n const res: AppRouteRecordRaw[] = [];\n\n for (const route of routes) {\n const meta = route?.meta;\n if (route.name !== 'Root' && meta?.hidden && !meta.canTo) continue;\n\n const data: AppRouteRecordRaw = !meta?.alwaysShow && route.children?.length === 1 ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) } : { ...route };\n\n data.path = pathResolve(parentPath, data.path);\n\n if (data.children) data.children = filterBreadcrumb(data.children, data.path);\n\n if (data) res.push(data);\n }\n return res;\n};\n","<!--\n * @title: breadcrumb \n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:13:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-06 14:28:48\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { useBridgeI18n } from '@@/bridge';\n import { ElBreadcrumb, ElBreadcrumbItem } from 'element-plus';\n import { computed, defineComponent, ref, TransitionGroup, unref, watch } from 'vue';\n import { useRouter } from 'vue-router';\n import { GvIcon } from '../../GvIcon';\n import { filter, treeToList } from '../../utils/gv.tree';\n import { filterBreadcrumb } from './helper';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('breadcrumb');\n\n export default defineComponent({\n name: 'GvBreadCrumb',\n setup() {\n const appStore = useAppStore();\n const permStore = usePermsStore();\n // if you want to use the icon in breadcrumb, you can set it in appStore\n const showBreadcrumbIcon = computed(() => appStore.getShowBreadcrumbIcon);\n const { currentRoute } = useRouter();\n\n const { t } = useBridgeI18n();\n\n const levelList = ref<AppRouteRecordRaw[]>([]);\n const menuRouters = computed(() => {\n const routers = permStore.getRouters;\n return filterBreadcrumb(routers);\n });\n\n const getBreadcrumb = () => {\n const currentPath = currentRoute.value.matched.slice(-1)[0].path;\n levelList.value = filter<AppRouteRecordRaw>(unref(menuRouters), (node: AppRouteRecordRaw) => node.path === currentPath);\n };\n\n const renderBreadcrumb = () => {\n const breadcrumbList = treeToList<AppRouteRecordRaw[]>(unref(levelList));\n return breadcrumbList.map((v) => {\n const disabled = !v.redirect || v.redirect === 'noredirect';\n const meta = v.meta;\n return (\n <ElBreadcrumbItem\n to={{ path: disabled ? '' : v.path }}\n key={v.name}>\n {meta?.icon && showBreadcrumbIcon.value ? (\n <>\n <GvIcon\n iconType=\"iconfont\"\n iconName={meta.icon}\n className=\"text-[13px]\"></GvIcon>{' '}\n {t(v?.meta?.title || '')}\n </>\n ) : (\n t(v?.meta?.title || '')\n )}\n </ElBreadcrumbItem>\n );\n });\n };\n // @watch\n watch(\n () => currentRoute.value.path,\n (path) => {\n if (path.startsWith('/redirect/')) return;\n\n getBreadcrumb();\n },\n {\n immediate: true,\n },\n );\n // @created\n\n // @render\n return () => (\n <ElBreadcrumb\n separator=\"/\"\n class={`${prefixCls} flex items-center h-full ml-[10px]`}>\n <TransitionGroup\n appear\n enter-active-class=\"animate__animated animate__fadeInRight\">\n {renderBreadcrumb()}\n </TransitionGroup>\n </ElBreadcrumb>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-breadcrumb';\n .#{$prefixCls} {\n user-select: none;\n :deep(.el-breadcrumb__item) {\n display: flex;\n .el-breadcrumb__inner {\n display: flex;\n align-items: center;\n color: #afb3b9;\n cursor: text;\n //color: var(--top-header-text-color);\n //&:hover {\n // color: var(--el-color-primary);\n //}\n &.is-link {\n font-weight: 500;\n }\n }\n .iconfont {\n //font-size: $textSizeSecondary;\n }\n }\n :deep(.el-breadcrumb__item):last-child {\n .el-breadcrumb__inner:hover {\n color: #afb3b9;\n cursor: text;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvBreadCrumb from './src/GvBreadCrumb.vue';\nconst GvBreadCrumbPlugin = {\n install(app: App): void {\n app.component(GvBreadCrumb.name ?? 'GvBreadCrumb', GvBreadCrumb);\n },\n};\nexport default GvBreadCrumbPlugin;\n\nexport { GvBreadCrumb };\n","<!--\n * @title: popconfirm component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 16:43:20\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-22 16:32:45\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElPopconfirm } from 'element-plus';\n import { defineComponent, getCurrentInstance } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('popconfirm');\n\n export default defineComponent({\n name: 'GvPopconfirm',\n props: {\n title: {\n type: String,\n default: '',\n },\n },\n\n emits: ['confirm'],\n\n setup(props, { emit, slots }) {\n const instance = getCurrentInstance();\n\n const handleConfirm = (event: MouseEvent) => {\n emit('confirm', event, instance);\n };\n\n return () => (\n <ElPopconfirm\n title={props.title}\n onConfirm={handleConfirm}\n class={prefixCls}>\n {{\n reference: () => slots.reference?.(),\n }}\n </ElPopconfirm>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-popconfirm';\n .#{$prefixCls} {\n display: inline-block;\n }\n</style>\n","import type { App } from 'vue';\nimport GvPopconfirm from './src/GvPopconfirm.vue';\n\nconst GvInputPlugin = {\n install(app: App): void {\n app.component(GvPopconfirm.name ?? 'GvPopconfirm', GvPopconfirm);\n },\n};\nexport default GvInputPlugin;\n\nexport { GvPopconfirm };\n","/*\n * @title: sessionStorage and localStorage hook\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-19 16:32:15\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-04-24 17:11:28\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n// 获取传入的值的类型\nconst getValueType = (value: any): string => {\n const type = Object.prototype.toString.call(value);\n return type.slice(8, -1);\n};\n\nexport const useStorage = (type: 'sessionStorage' | 'localStorage' = 'sessionStorage'): IWebStorage => {\n const setStorage = (key: string, value: any): void => {\n const valueType = getValueType(value);\n window[type].setItem(key, JSON.stringify({ type: valueType, value }));\n };\n\n const getStorage = (key: string): any => {\n const value = window[type].getItem(key);\n if (value) {\n const { value: val } = JSON.parse(value);\n return val;\n } else return value;\n };\n\n const removeStorage = (key: string): void => {\n window[type].removeItem(key);\n };\n\n const clear = (excludes?: string[]): void => {\n // 获取排除项\n const keys = Object.keys(window[type]);\n const defaultExcludes = ['dynamicRouter', 'serverDynamicRouter'];\n const excludesArr = excludes ? [...excludes, ...defaultExcludes] : defaultExcludes;\n const excludesKeys = excludesArr ? keys.filter((key) => !excludesArr.includes(key)) : keys;\n // 排除项不清除\n excludesKeys.forEach((key) => {\n window[type].removeItem(key);\n });\n // window[type].clear()\n };\n\n return {\n setStorage,\n getStorage,\n removeStorage,\n clear,\n };\n};\n","/*\n * @title: message alert confirm\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 11:47:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:50:11\n * @version: 1.0.6\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { useStorage } from '@@/hooks/web/useStorage';\nimport { ElMessage, ElMessageBox, ElNotification } from 'element-plus';\n// import { useLocaleStoreWithOut } from '@/store/modules/locale';\nimport { isError, sleep } from './index';\n// const localeStore = useLocaleStoreInstance();\n// const { lang } = localeStore.getCurrentLocale;\n\nconst notificationTime = 5000;\nconst notificationTimeError = 6000;\nconst messageTime = 2000;\nconst messageTimeError = 5000;\ninterface ConfirmOptions {\n title?: string;\n message: string;\n confirmButtonText?: string;\n cancelButtonText?: string;\n type?: 'success' | 'warning' | 'info' | 'error';\n showCancelButton?: boolean;\n}\n/**\n * @todo: Notification - MessageBox\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 13:48:24\n * @param {unknown} msg\n * @param {MessageType} type\n * @param {string} title\n */\ntype MessageType = 'success' | 'info' | 'warning' | 'error';\n\nexport const alert = async (msg: unknown, type: MessageType = 'success') => {\n const alertObj = document.body.querySelector('body>.el-notification');\n if (alertObj) alertObj.remove();\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n let promptMsg = '提示信息';\n if (lang === 'en') promptMsg = 'Hint';\n const duration = type === 'error' ? notificationTimeError : notificationTime;\n let m = 'No message...';\n if (isError(msg)) m = msg.message || 'No message...';\n else if (typeof msg === 'string' || typeof msg === 'number' || typeof msg === 'boolean') m = String(msg);\n else if (typeof msg === 'object') m = JSON.stringify(msg);\n\n ElNotification({\n title: promptMsg,\n message: m,\n type,\n duration: duration,\n });\n await sleep(duration);\n};\n/**\n * @todo: confirm - MessageBox\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 12:03:27\n * @param {*} msg\n * @param {*} type\n */\nexport const confirm = async (msg: string, type: MessageType = 'warning') => {\n if (document.body.querySelector('body>.el-confirm')) return;\n // 返回 Promise 对象\n let msgs: string;\n const showCancelButton = true;\n msgs = '是否确定此操作?';\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n let hint = '提示信息';\n let ok = '确定';\n let cancel = '取消';\n if (msg) msgs = msg;\n else if (lang === 'en') {\n msgs = 'Are you sure you want to proceed?';\n hint = 'Hint';\n ok = 'Ok';\n cancel = 'Cancel';\n }\n\n return new Promise((resolve, reject) => {\n ElMessageBox.confirm(msgs, hint, {\n confirmButtonText: ok,\n cancelButtonText: cancel,\n type,\n showCancelButton,\n } as ConfirmOptions)\n .then(() => {\n resolve(true);\n })\n .catch(() => {\n reject(false);\n });\n });\n};\n\nexport const message = async (msg: unknown, type: MessageType = 'warning', tableedit: boolean = false) => {\n if (tableedit === false) {\n const messageObj = document.body.querySelector('body>.el-message');\n // if (messageObj) messageObj.style.display = 'none';\n if (messageObj) return;\n const notifyObj = document.body.querySelector('body>.el-notification');\n if (notifyObj) return;\n }\n let m = 'No message...';\n if (isError(msg)) m = msg.message || 'No message...';\n else if (typeof msg === 'string' || typeof msg === 'number' || typeof msg === 'boolean') m = String(msg);\n else if (typeof msg === 'object') m = JSON.stringify(msg);\n const duration = type === 'error' ? messageTimeError : messageTime;\n ElMessage({\n message: m,\n showClose: true,\n type,\n duration: duration,\n });\n await sleep(duration);\n};\n","<!--\n * @title: button component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 16:43:34\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 16:16:19\n * @version: 1.1.0\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvIcon } from '@@/GvIcon';\n import { GvPopconfirm } from '@@/GvPopconfirm';\n import { getVNodeText } from '@@/utils';\n import { confirm } from '@@/utils/gv.notify';\n import { ElButton, useGlobalConfig, type ButtonType, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, getCurrentInstance, ref, unref, watch, type Component, type PropType } from 'vue';\n import { useRoute } from 'vue-router';\n import type { BizType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('button');\n\n export default defineComponent({\n name: 'GvButton',\n props: {\n visible: {\n type: Boolean,\n default: true,\n },\n text: {\n type: String,\n default: '',\n },\n otext: {\n type: String,\n default: '',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n type: {\n type: String as PropType<ButtonType>,\n default: 'default',\n },\n link: {\n type: Boolean,\n default: false,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: [Boolean, String] as PropType<boolean | string>,\n default: false,\n },\n refForm: {\n type: String,\n required: false,\n default: undefined,\n },\n icon: {\n // type: [String, Object] as PropType<string | DefineComponent>,\n type: String,\n default: '',\n },\n nativeType: {\n type: String,\n default: 'button',\n },\n bizType: {\n type: String as PropType<BizType>,\n default: undefined,\n },\n args: {\n type: String,\n default: undefined,\n },\n confirm: {\n type: [Boolean, String],\n default: false,\n },\n perms: {\n type: String,\n default: undefined,\n },\n cb: {\n type: Function as PropType<(args?: any) => void>,\n default: () => {},\n },\n },\n\n // @emits\n emits: ['click', 'confirm'],\n\n setup(props, { emit, slots }) {\n // @data\n // const attrs = useAttrs();\n const { t } = useBridgeI18n();\n const route = useRoute();\n const appStore = useAppStore();\n const instance = getCurrentInstance();\n const globalSize = useGlobalConfig('size');\n const buttonSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const buttonConfirm = computed(() => appStore.buttonConfirm);\n const loadings = ref(props.loading);\n const locked = ref(false);\n const isShow = ref(props.visible);\n const isIf = ref(true);\n\n // @computed\n const getSlots = computed(() => {\n if (props.text && props.otext) return props.text;\n else return slots.default?.();\n });\n\n // @watch\n watch(\n () => props.loading,\n (v) => (loadings.value = v),\n );\n watch(\n () => props.visible,\n (v) => (isShow.value = v),\n );\n\n // @method\n\n const invokeClick = async (e: MouseEvent) => {\n const raw = instance?.vnode?.props?.onClick as ((event: MouseEvent, args?: string) => unknown) | ((event: MouseEvent, args?: string) => unknown)[] | undefined;\n const handlers = raw ? (Array.isArray(raw) ? raw : [raw]) : [];\n if (handlers.length === 0) {\n emit('click', e, props.args);\n return;\n }\n for (const handler of handlers) await handler(e, props.args);\n };\n\n const withLoading = async (task: () => void | Promise<void>) => {\n if (props.loading) {\n await task();\n return;\n }\n loadings.value = true;\n try {\n await task();\n } finally {\n loadings.value = false;\n }\n };\n\n const setIconStyle = () => {\n if (!props.icon) return '';\n if (props.icon.startsWith('el-icon'))\n return (\n <GvIcon\n iconType=\"el\"\n iconName={props.icon.replace('el-icon-', '')}\n />\n );\n else if (props.icon.startsWith('iconfont') || props.icon.startsWith('gv-icon'))\n return (\n <GvIcon\n iconType=\"iconfont\"\n iconName={props.icon.replace('iconfont', '')}\n />\n );\n else return <GvIcon iconName={props.icon} />;\n // 父组件如果传递了图标组件,就使用图标组件,如果传递了ep图标名称,就使用ep图标名称\n // if (typeof props.icon === 'string')\n // return (\n // <GvIcon\n // iconName={props.icon}\n // className={props.icon}\n // />\n // );\n // else {\n // const Icons = props.icon;\n // return <Icons />;\n // }\n };\n\n const checkPerms = () => {\n if (route) {\n const meta = route.meta;\n if (meta) {\n const pm = meta.pm || '';\n if (pm) {\n let filter: string = props.text || '';\n if (props.otext) filter = props.otext;\n if (filter === '') {\n const slot = slots.default?.();\n if (slot && slot[0]) filter = getVNodeText(slot[0]) || '';\n }\n if (filter) {\n const pmArr = pm.split(',');\n const perms = pmArr.filter((x) => x.indexOf(filter) !== -1);\n if (perms.length > 0) {\n const p = perms[0];\n const arr = p.split('|');\n if (arr[0] !== ' ' && arr[1] && arr[1] === 'f') {\n isShow.value = false;\n isIf.value = false;\n }\n }\n }\n }\n }\n }\n };\n\n const handleClick = async (e: MouseEvent, type?: string) => {\n // 判断是否是reset\n if (props.bizType === 'reset') {\n let parent: any = instance?.parent; // form\n while (parent && parent.type?.name !== 'ElForm') parent = parent.parent;\n await parent.exposed.resetFields?.();\n\n while (parent && parent.type?.name !== 'GvForm') parent = parent.parent;\n const rootForm = parent;\n // console.log(rootForm);\n const originFormList = rootForm?.exposed.originFormList.value;\n const formList = rootForm?.props.formList;\n // console.log(parent.props.model.value);\n if (originFormList && Array.isArray(originFormList))\n originFormList.forEach((x: any, index: number) => {\n if (x.type === 'dic') formList[index]['filtercode'] = x.filtercode; // 重置字典的filtercode\n formList[index]['value'] = x.value;\n formList[index]['showLabel'] = x.showLabel;\n formList[index]['hidden'] = x.hidden;\n formList[index]['disabled'] = x.disabled;\n // 重置日期\n if (x.dateType === 'daterange2' || x.dateType === 'datetimerange2') {\n parent.props.model.value[x.field + '-start'] = undefined;\n parent.props.model.value[x.field + '-end'] = undefined;\n parent.props.model.value[x.field] = undefined;\n }\n });\n // 重置按钮自定义回调\n await props.cb?.(props.args);\n\n const rootEl = parent?.vnode.el as HTMLElement;\n // 重置日期\n const dateRangeSingles = rootEl?.querySelectorAll('.gv-daterange__single') as NodeListOf<HTMLElement>;\n if (dateRangeSingles)\n for (let i = 0; i < dateRangeSingles.length; i++) {\n const startInput = dateRangeSingles[i].querySelector('.gv-datepicker-range-start .el-input__inner') as HTMLInputElement | null;\n if (startInput) startInput.value = '';\n const endInput = dateRangeSingles[i].querySelector('.gv-datepicker-range-end .el-input__inner') as HTMLInputElement | null;\n if (endInput) endInput.value = '';\n }\n // update: 重置后执行查询方法 2022-04-17\n await withLoading(async () => {\n const searchBtn = parent?.vnode.el?.querySelector('.gv-search-bar .el-button--primary') as HTMLElement | undefined;\n searchBtn?.click();\n });\n return;\n } else if (props.bizType === 'import' || props.bizType === 'export') {\n emit('click', e, props.args);\n return;\n }\n\n await withLoading(async () => {\n if (type === 'confirm' && buttonConfirm.value === false)\n try {\n await confirm(t('common.confirmMsg'));\n } catch {\n return;\n }\n\n if (!locked.value) {\n locked.value = true;\n try {\n await invokeClick(e);\n } finally {\n locked.value = false;\n }\n }\n });\n };\n\n // @created\n\n // @mounted\n // onMounted(() => {\n // checkPerms();\n // });\n\n // @render\n /** ===== render 渲染 ===== */\n return () => {\n // validate btn perms\n checkPerms();\n\n const classz = props.bizType ? `${prefixCls} ${props.bizType}` : `${prefixCls}`;\n if (isIf.value) {\n let renderBtn: Component;\n if (props.confirm === 'true' || props.confirm === true)\n if (buttonConfirm.value === false)\n renderBtn = (\n <ElButton\n ref=\"gv-button\"\n style={{ display: isShow.value ? '' : 'none' }}\n data-ref-form={props.refForm}\n size={buttonSize.value}\n type={props.type !== 'text' ? props.type : undefined}\n link={props.link}\n loading={loadings.value}\n disabled={!!props.disabled}\n icon={setIconStyle()}\n native-type={props.nativeType}\n onClick={(e: MouseEvent) => handleClick(e, 'confirm')}\n class={classz}>\n {getSlots.value}\n </ElButton>\n );\n else\n renderBtn = (\n <GvPopconfirm\n title={t('common.confirmMsg')}\n onConfirm={(e: MouseEvent) => handleClick(e, 'confirm')}>\n {{\n reference: () => (\n <ElButton\n ref=\"gv-button\"\n style={{ display: isShow.value ? '' : 'none' }}\n data-ref-form={props.refForm}\n size={buttonSize.value}\n type={props.type !== 'text' ? props.type : undefined}\n link={props.link}\n loading={loadings.value}\n disabled={!!props.disabled}\n icon={setIconStyle()}\n native-type={props.nativeType}\n class={classz}>\n {getSlots.value}\n </ElButton>\n ),\n }}\n </GvPopconfirm>\n );\n else\n renderBtn = (\n <ElButton\n ref=\"gv-button\"\n style={{ display: isShow.value ? '' : 'none' }}\n data-ref-form={props.refForm}\n size={buttonSize.value}\n type={props.type !== 'text' ? props.type : undefined}\n link={props.link}\n loading={loadings.value}\n disabled={!!props.disabled}\n icon={setIconStyle()}\n native-type={props.nativeType}\n onClick={(e: MouseEvent) => handleClick(e)}\n class={classz}>\n {getSlots.value}\n </ElButton>\n );\n return renderBtn;\n } else return null;\n };\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-button';\n .#{$prefixCls} {\n :deep(i + span) {\n margin-left: 5px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvButton from './src/GvButton.vue';\n\nconst GvButtonPlugin = {\n install(app: App): void {\n app.component(GvButton.name ?? 'GvButton', GvButton);\n },\n};\nexport default GvButtonPlugin;\n\nexport { GvButton };\n","<!--\n * @title: card component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 09:39:53\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 15:18:37\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCard } from 'element-plus';\n import { defineComponent } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('card');\n\n export default defineComponent({\n name: 'GvCard',\n props: {},\n setup(_props, { slots }) {\n // @method\n /**\n *@todo: 设置header标题\n *@author: bugcao\n *@date: 2026-05-09 09:31:12\n *@version: v0.0.1\n */\n const getCardHeader = () => {\n if (slots.header?.()) return <div class=\"clearfix\">{slots.header?.()}</div>;\n else return null;\n };\n\n // @render\n return () => (\n <ElCard class={prefixCls}>\n {{\n header: () => getCardHeader(),\n default: () => slots.default?.(),\n }}\n </ElCard>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-card';\n .#{$prefixCls} {\n .clearfix::before,\n .clearfix::after {\n display: table;\n content: '';\n }\n .clearfix::after {\n clear: both;\n }\n :deep(.el-card__body) {\n padding: 10px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCard from './src/GvCard.vue';\n\nconst GvCardPlugin = {\n install(app: App): void {\n app.component(GvCard.name ?? 'GvCard', GvCard);\n },\n};\nexport default GvCardPlugin;\n\nexport { GvCard };\n","<!--\n * @title: cascader component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:32:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-10 09:56:48\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import { ElCascader, useGlobalConfig, type CascaderOption, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('cascader');\n\n export default defineComponent({\n name: 'GvCascader',\n props: {\n vref: {\n type: String,\n required: false,\n default: '',\n },\n name: {\n type: String,\n required: false,\n default: undefined,\n },\n id: {\n type: String,\n required: false,\n default: undefined,\n },\n value: {\n type: Array,\n required: false,\n default: () => [],\n },\n options: {\n type: Array as PropType<CascaderOption[]>,\n required: false,\n default: () => [],\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n placeholder: {\n type: String,\n required: false,\n default: 'All', // 请选择\n },\n disabled: {\n type: Boolean,\n required: false,\n default: false,\n },\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n clearable: {\n type: Boolean,\n required: false,\n default: true,\n },\n showAllLevels: {\n type: Boolean,\n required: false,\n default: true,\n },\n separator: {\n type: String,\n required: false,\n default: ' / ',\n },\n trigger: {\n type: String,\n required: false,\n default: 'hover',\n },\n filterable: {\n type: Boolean,\n required: false,\n default: true,\n },\n multiple: {\n type: Boolean,\n required: false,\n default: false,\n },\n lazy: {\n type: Boolean,\n required: false,\n default: false,\n },\n lazyLoad: {\n type: Function as PropType<(node: any, resolve: (data: any[]) => void, reject: () => void) => void>,\n required: false,\n default: () => {},\n },\n },\n // @emit\n emits: ['input', 'blur', 'focus', 'keydown', 'change'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useBridgeI18n();\n const sOps = props.options;\n const inputValue = ref(props.value);\n const globalSize = useGlobalConfig('size');\n\n // @computed\n const cascaderSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sPlaceHolder = computed(() => (props.placeholder ? props.placeholder : t('common.pleaseInput')));\n const getDisabled = computed(() => props.disabled);\n // const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n\n // 回调参数:(value: string | number)\n // const handleInput = (val) => {\n // emit('input', val);\n // };\n const handleChange = (val) => {\n emit('change', val);\n };\n const handleBlur = (event) => {\n emit('blur', event);\n };\n /**\n * @todo: 搜索\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-10-07 15:48:09\n * @param {*} node\n * @param {*} query\n */\n const handleFilterMethod = (node, query) => {\n // console.log(node);\n const path = node.path;\n const labels = node.pathLabels;\n const data = node.data;\n if (query) {\n if (path.join(',').indexOf(query) >= 0) return true;\n if (labels.join(',').indexOf(query) >= 0) return true;\n if (data.spell)\n if (data.spell.indexOf(query) >= 0) return true;\n else {\n const pathNodes = node.pathNodes;\n return pathNodes.some((x) => {\n if (x.data.spell && x.data.spell.indexOf(query) >= 0) return true;\n });\n }\n }\n };\n\n // @render\n return (\n <ElCascader\n ref={props.vref || 'gv-cascader'}\n //id={resolvedInputId.value}\n {...(props.name ? { name: props.name } : {})}\n class={prefixCls}\n v-model={inputValue.value}\n style={{ display: props.value ? '' : 'none' }}\n size={cascaderSize.value}\n placeholder={sPlaceHolder.value}\n options={sOps}\n disabled={getDisabled.value}\n show-all-levels={props.showAllLevels}\n clearable={props.clearable}\n separator={props.separator}\n filterable={props.filterable}\n filter-method={handleFilterMethod}\n debounce={400}\n onBlur={handleBlur}\n onChange={handleChange}\n collapse-tags\n props={{\n expandTrigger: props.trigger as 'click' | 'hover',\n lazy: props.lazy,\n lazyLoad: props.lazyLoad,\n multiple: props.multiple,\n }}></ElCascader>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-cascader';\n .#{$prefixCls} {\n width: 100%;\n\n :deep(.el-input) {\n &.is-focus {\n .el-input__inner {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n .el-input__inner {\n //height: 30px !important;\n //line-height: 30px;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCascader from './src/GvCascader.vue';\nconst GvCascaderPlugin = {\n install(app: App): void {\n app.component(GvCascader.name ?? 'GvCascader', GvCascader);\n },\n};\nexport default GvCascaderPlugin;\n\nexport { GvCascader };\n","<!--\n * @title: checkbox component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 15:50:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:51:56\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCheckbox, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { TCheckboxValueType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('checkbox');\n\n export default defineComponent({\n name: 'GvCheckbox',\n\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [Boolean, String, Number] as PropType<TCheckboxValueType>,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n indeterminate: {\n type: Boolean,\n default: false,\n },\n label: {\n type: [String, Number, Boolean] as PropType<TCheckboxValueType>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n border: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n },\n\n // @emit\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n const globalSize = useGlobalConfig('size');\n const checkboxValue = ref(props.value);\n const checkboxSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n /** 同步外部值 */\n watch(\n () => props.value,\n (val) => {\n checkboxValue.value = val;\n },\n );\n\n // @method\n /** 更新值 */\n const handleUpdate = (val: TCheckboxValueType) => {\n checkboxValue.value = val;\n emit('update:modelValue', val);\n };\n /** change事件 */\n const handleChange = (val: TCheckboxValueType) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElCheckbox\n class={prefixCls}\n modelValue={checkboxValue.value}\n onUpdate:modelValue={handleUpdate}\n label={props.label}\n indeterminate={props.indeterminate}\n disabled={props.disabled}\n border={props.border}\n size={checkboxSize.value}\n style={{ display: props.visible ? '' : 'none' }}\n onChange={handleChange}>\n {slots.default?.()}\n </ElCheckbox>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-checkbox';\n .#{$prefixCls} {\n padding: 5px 0 5px 15px;\n //font-size: $appTextSize;\n\n :deep(.el-checkbox__input) {\n .el-checkbox__inner {\n &:hover {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-focus {\n .el-checkbox__inner {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-checked {\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n\n &:hover {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n\n :deep(.el-checkbox__input.is-checked + .el-checkbox__label) {\n color: var(--primaryColor, $primaryColor);\n }\n\n :deep(.el-checkbox__label) {\n //font-size: $appTextSize;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCheckbox from './src/GvCheckbox.vue';\n\nconst GvCheckboxPlugin = {\n install(app: App): void {\n app.component(GvCheckbox.name ?? 'GvCheckbox', GvCheckbox);\n },\n};\nexport default GvCheckboxPlugin;\n\nexport { GvCheckbox };\n","<!--\n * @title: checkbox button component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 16:41:13\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:52:18\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCheckboxButton, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TCheckboxButtonValue } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('checkbox-button');\n\n export default defineComponent({\n name: 'GvCheckboxButton',\n inheritAttrs: false,\n\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [String, Number, Boolean] as PropType<TCheckboxButtonValue>,\n default: undefined,\n },\n name: {\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n indeterminate: {\n type: Boolean,\n required: false,\n default: false,\n },\n label: {\n type: [String, Number, Boolean] as PropType<TCheckboxButtonValue>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n border: {\n type: Boolean,\n required: false,\n default: false,\n },\n size: {\n type: String as PropType<'large' | 'default' | 'small'>,\n default: 'default',\n },\n },\n\n // @emit\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n const globalSize = useGlobalConfig('size');\n /** 内部值 */\n const checkboxValue = ref(props.value);\n\n // @watch\n /** 同步外部值 */\n watch(\n () => props.value,\n (val) => {\n checkboxValue.value = val;\n },\n );\n\n // @computed\n /** checkbox尺寸 */\n const checkboxButtonSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @method\n /** 更新v-model */\n const handleUpdate = (val: TCheckboxButtonValue) => {\n checkboxValue.value = val;\n emit('update:modelValue', val);\n };\n\n // @render\n return () => (\n <ElCheckboxButton\n modelValue={checkboxValue.value}\n onUpdate:modelValue={handleUpdate}\n value={props.value}\n label={props.label}\n indeterminate={props.indeterminate}\n disabled={props.disabled}\n size={checkboxButtonSize.value}\n class={prefixCls}\n border={props.border}\n style={{ display: props.visible ? '' : 'none' }}>\n {slots.default?.()}\n </ElCheckboxButton>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-checkbox-button';\n .#{$prefixCls} {\n padding: 5px 0 5px 15px;\n //font-size: $appTextSize;\n\n :deep(.el-checkbox-button__inner) {\n //font-size: $appTextSize;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCheckboxButton from './src/GvCheckboxButton.vue';\n\nconst GvCheckboxButtonPlugin = {\n install(app: App): void {\n app.component(GvCheckboxButton.name ?? 'GvCheckboxButton', GvCheckboxButton);\n },\n};\nexport default GvCheckboxButtonPlugin;\n\nexport { GvCheckboxButton };\n","<!--\n * @title: checkbox group component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 16:08:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 15:26:16\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCheckboxGroup, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TCheckboxGroupType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('checkbox-group');\n\n export default defineComponent({\n name: 'GvCheckboxGroup',\n\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: Array as PropType<TCheckboxGroupType>,\n required: false,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n size: {\n type: String as PropType<'large' | 'default' | 'small'>,\n default: 'default',\n },\n min: {\n type: Number,\n default: undefined,\n },\n max: {\n type: Number,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n\n // @emit\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n const globalSize = useGlobalConfig('size');\n\n const checkboxValue = ref(props.value);\n\n // @computed\n const checkboxGroupSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n /** 同步外部值 */\n watch(\n () => props.value,\n (val) => {\n checkboxValue.value = val;\n },\n );\n\n // @method\n /** 更新 v-model */\n const handleUpdate = (val: TCheckboxGroupType) => {\n checkboxValue.value = val;\n emit('update:modelValue', val);\n };\n /** change事件 */\n const handleChange = (val: TCheckboxGroupType) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElCheckboxGroup\n modelValue={checkboxValue.value}\n onUpdate:modelValue={handleUpdate}\n size={checkboxGroupSize.value}\n aria-label={props.label}\n min={props.min}\n max={props.max}\n disabled={props.disabled}\n class={prefixCls}\n onChange={handleChange}>\n {slots.default?.()}\n </ElCheckboxGroup>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-checkbox-group';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvCheckboxGroup from './src/GvCheckboxGroup.vue';\n\nconst GvCheckboxGroupPlugin = {\n install(app: App): void {\n app.component(GvCheckboxGroup.name ?? 'GvCheckboxGroup', GvCheckboxGroup);\n },\n};\nexport default GvCheckboxGroupPlugin;\n\nexport { GvCheckboxGroup };\n","<!--\n * @title: col component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 10:00:33\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:24:29\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCol } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('col');\n\n export default defineComponent({\n name: 'GvCol',\n props: {\n span: {\n type: Number,\n default: 24,\n },\n offset: {\n type: Number,\n default: 0,\n },\n xs: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n sm: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n md: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n lg: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n xl: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n tag: {\n type: String,\n default: 'div',\n },\n visible: {\n type: Boolean,\n default: true,\n },\n },\n setup(props, { slots }) {\n // @render\n return () => (\n <ElCol\n ref=\"gv-col\"\n style={{ display: props.visible ? '' : 'none' }}\n xs={props.xs}\n sm={props.sm}\n md={props.md}\n lg={props.lg}\n xl={props.xl}\n span={props.span}\n offset={props.offset}\n tag={props.tag}\n class={prefixCls}>\n {slots.default?.()}\n </ElCol>\n );\n },\n });\n</script>\n","import type { App } from 'vue';\nimport GvCol from './src/GvCol.vue';\n\nconst GvColPlugin = {\n install(app: App): void {\n app.component(GvCol.name ?? 'GvCol', GvCol);\n },\n};\nexport default GvColPlugin;\n\nexport { GvCol };\n","/*\n * 日期工具函数(Vue3 + TS 重构版)\n */\n\nexport type LocaleType = 'zh' | 'en' | 'english';\n\nconst localLabels = {\n monthes: {\n english: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n en: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n zh: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n },\n weekdays: {\n english: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n en: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n zh: ['日', '一', '二', '三', '四', '五', '六'],\n },\n meridians: {\n english: ['a.m.', 'p.m.'],\n en: ['AM', 'PM'],\n zh: ['上午', '下午'],\n },\n dayagos: {\n english: ['Today', 'Yesterday', 'Tomorrow', ' days ago', ' days late'],\n en: ['Today', 'Yesterday', 'Tomorrow', ' days ago', ' days late'],\n zh: ['今天', '昨天', '明天', '天前', '天后'],\n },\n};\n\nexport const toMidnight = (date: Date): Date => {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return d;\n};\n\nexport const daysAgo = (date: Date, days = 0, midnight = false): Date => {\n const result = new Date(date.getTime() - days * 8.64e7);\n return midnight ? toMidnight(result) : result;\n};\n\nexport const monthBegin = (date: Date, offset = 0): Date => {\n const days = date.getDate() - 1 - offset;\n return daysAgo(date, days, true);\n};\n\nexport const quarterBegin = (date: Date): Date => {\n const month = date.getMonth() - (date.getMonth() % 3);\n return toMidnight(new Date(date.getFullYear(), month, 1));\n};\n\nexport const yearBegin = (date: Date): Date => toMidnight(new Date(date.getFullYear(), 0, 1));\n\nconst padZero = (value: string | number, len = 2): string => String(value).padStart(len, '0');\n\nexport const strftime = (date: Date, format?: string, local: LocaleType = 'zh'): string => {\n if (!format) {\n const str = new Date(date.getTime() + 2.88e7).toISOString();\n return str.substring(0, 16).replace('T', ' ');\n }\n\n const locale = local.startsWith('zh') ? 'zh' : 'en';\n\n format = format.replace('%F', '%Y-%m-%d');\n format = format.replace(/%D|%x/g, '%m/%d/%y');\n format = format.replace(/%T|%X/g, '%H:%M:%S');\n format = format.replace('%R', '%H:%M');\n\n return format.replace(/%[A-Za-z%]/g, (f) => {\n let ans: string | number = f;\n\n switch (f) {\n case '%%':\n ans = '%';\n break;\n\n case '%Y':\n ans = date.getFullYear();\n break;\n\n case '%y':\n ans = date.getFullYear() % 100;\n break;\n\n case '%m':\n ans = date.getMonth() + 1;\n break;\n\n case '%d':\n ans = date.getDate();\n break;\n\n case '%H':\n ans = date.getHours();\n break;\n\n case '%M':\n ans = date.getMinutes();\n break;\n\n case '%S':\n ans = date.getSeconds();\n break;\n\n case '%b':\n case '%B': {\n const key = f === '%B' && locale === 'en' ? 'english' : locale;\n ans = localLabels.monthes[key][date.getMonth()];\n break;\n }\n\n case '%a':\n case '%A': {\n const key = f === '%A' && locale === 'en' ? 'english' : locale;\n ans = localLabels.weekdays[key][date.getDay()];\n break;\n }\n\n default:\n break;\n }\n\n if (['%y', '%m', '%d', '%H', '%M', '%S'].includes(f)) return padZero(ans);\n\n return String(ans);\n });\n};\n\nexport const humanize = (date: Date, local: LocaleType = 'zh'): string => {\n const locale = local.startsWith('zh') ? 'zh' : 'en';\n\n const result = strftime(date, '', locale);\n\n const today = toMidnight(new Date()).getTime();\n const current = toMidnight(date).getTime();\n\n const days = (today - current) / 8.64e7;\n\n if (days <= -10 || days >= 10) return result;\n\n const labels = localLabels.dayagos[locale];\n\n let lbl = '';\n\n if (days === 0) lbl = labels[0];\n else if (days === 1) lbl = labels[1];\n else if (days === -1) lbl = labels[2];\n else if (days >= 2) lbl = `${days}${labels[3]}`;\n else lbl = `${Math.abs(days)}${labels[4]}`;\n\n return lbl + result.substring(10, 16);\n};\n","/*\n * @title: 日期组件左侧选择日期快捷键(非区间模式)\n * @author: bugcao@163.com\n * @Date: 2022-05-14 08:33:20\n * @LastEditors: bugcao@163.com\n * @LastEditTime: 2022-05-14 08:33:20\n * @version: 0.0.1\n * @copyright: copyright (c) 2022 bugcao\n */\nimport { daysAgo, monthBegin, quarterBegin, yearBegin } from './datetime';\n\nexport interface ShortcutItem {\n text: string;\n value: Date | [Date, Date] | (() => Date | [Date, Date]);\n}\n\nconst now = () => new Date();\n\n/** 单日期快捷选择 */\nexport const dateShortcuts: ShortcutItem[] = [\n {\n text: '今天',\n value: () => now(),\n },\n {\n text: '昨天',\n value: () => daysAgo(now(), 1),\n },\n {\n text: '最近一周',\n value: () => daysAgo(now(), 7),\n },\n {\n text: '最近30天',\n value: () => daysAgo(now(), 30),\n },\n {\n text: '本月开始',\n value: () => monthBegin(now()),\n },\n {\n text: '本季开始',\n value: () => quarterBegin(now()),\n },\n];\n\n/** 英文单日期快捷选择 */\nexport const dateShortcutsEn: ShortcutItem[] = [\n {\n text: 'Today',\n value: () => now(),\n },\n {\n text: 'Yesterday',\n value: () => daysAgo(now(), 1),\n },\n {\n text: 'Last week',\n value: () => daysAgo(now(), 7),\n },\n {\n text: 'Last 30 days',\n value: () => daysAgo(now(), 30),\n },\n {\n text: 'Month start',\n value: () => monthBegin(now()),\n },\n {\n text: 'Season Start',\n value: () => quarterBegin(now()),\n },\n];\n\n/** 日期时间快捷选择 */\nexport const dateTimeShortcuts = dateShortcuts.slice(0, 3);\n\nexport const dateTimeShortcutsEn = dateShortcutsEn.slice(0, 3);\n\n/** 日期范围快捷选择 */\nexport const dateRangeShortcuts: ShortcutItem[] = [\n {\n text: '最近一周',\n value: () => {\n const start = new Date(daysAgo(now(), 7).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '最近30天',\n value: () => {\n const start = new Date(daysAgo(now(), 30).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '本月至今',\n value: () => {\n const start = new Date(monthBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '本季至今',\n value: () => {\n const start = new Date(quarterBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '今年至今',\n value: () => [yearBegin(now()), now()],\n },\n {\n text: '最近六个月',\n value: () => {\n const end = now();\n const start = new Date();\n\n start.setMonth(start.getMonth() - 6);\n\n return [start, end];\n },\n },\n];\n\n/** 英文日期范围快捷选择 */\nexport const dateRangeShortcutsEn: ShortcutItem[] = [\n {\n text: 'Last week',\n value: () => {\n const start = new Date(daysAgo(now(), 7).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Last 30 days',\n value: () => {\n const start = new Date(daysAgo(now(), 30).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Month date',\n value: () => {\n const start = new Date(monthBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Season date',\n value: () => {\n const start = new Date(quarterBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Year date',\n value: () => [yearBegin(now()), now()],\n },\n {\n text: 'Last 6 mon',\n value: () => {\n const end = now();\n const start = new Date();\n\n start.setMonth(start.getMonth() - 6);\n\n return [start, end];\n },\n },\n];\n\n/** 日历快捷选择 */\nexport const calendarShortcuts = [...dateShortcuts];\n","<!--\n * @title: 自定义日期选择组件\n * @author: bugcao@163.com\n * @date: 2026-06-08 14:52:11\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-12 13:21:04\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Bugcao\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElDatePicker, useGlobalConfig, type ComponentSize, type DatePickerType } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import { useI18n } from 'vue-i18n';\n import { dateRangeShortcuts, dateRangeShortcutsEn, dateShortcuts, dateShortcutsEn, dateTimeShortcuts, dateTimeShortcutsEn, type ShortcutItem } from './shortcuts';\n import type { TDatePickerSize, TDatePickerType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('datepicker');\n\n export default defineComponent({\n // @define name\n name: 'GvDatePicker',\n\n // @props\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: [Date, String, Array] as PropType<TDatePickerType>,\n default: undefined,\n },\n type: {\n type: String as PropType<DatePickerType>,\n default: 'date',\n },\n format: {\n type: String,\n default: 'YYYY-MM-DD',\n },\n valueFormat: {\n type: String,\n default: 'YYYY-MM-DD',\n },\n defaultTime: {\n type: Array,\n default: undefined,\n },\n size: {\n type: String as PropType<TDatePickerSize>,\n default: 'default',\n },\n rangeSeparator: {\n type: String,\n default: undefined,\n },\n startPlaceholder: {\n type: String,\n default: undefined,\n },\n endPlaceholder: {\n type: String,\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n disabledDateFunc: {\n type: Array,\n default: () => [],\n },\n disabledDate: {\n type: Function,\n default: undefined,\n },\n editable: {\n type: Boolean,\n default: true,\n },\n unlink: {\n type: Boolean,\n default: false,\n },\n showWeekNumber: {\n type: Boolean,\n default: true,\n },\n },\n\n // @emits\n emits: ['update:modelValue', 'change', 'blur', 'focus', 'pick', 'input'],\n\n setup(props, { emit }) {\n // @hooks\n const { locale, t } = useI18n();\n\n const globalSize = useGlobalConfig('size');\n\n // @data\n const inputValue = ref(props.modelValue);\n\n // @watch\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @computed\n const datePickerSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n const getShortcuts = computed((): ShortcutItem[] | undefined => {\n if (locale.value === 'en') {\n if (props.type === 'date') return dateShortcutsEn;\n if (props.type === 'datetime') return dateTimeShortcutsEn;\n if (props.type === 'daterange' || props.type === 'datetimerange') return dateRangeShortcutsEn;\n return undefined;\n }\n if (props.type === 'date') return dateShortcuts;\n if (props.type === 'datetime') return dateTimeShortcuts;\n if (props.type === 'daterange' || props.type === 'datetimerange') return dateRangeShortcuts;\n return undefined;\n });\n /**\n * @todo: 设置pickerOptions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-08 17:03:41\n */\n const getPickerOptions = computed(() => {\n const pickerOptions: Record<string, unknown> = {};\n if (props.disabledDateFunc.includes('beforeToday'))\n // 禁止选择今天之前日期(可以选择今天)\n pickerOptions['disabledDate'] = (date: Date) => date.getTime() < Date.now() - 8.64e7;\n if (props.disabledDateFunc.includes('afterToday')) pickerOptions['disabledDate'] = (date: Date) => date.getTime() > Date.now();\n if (typeof props.disabledDate === 'function') pickerOptions['disabledDate'] = props.disabledDate;\n return pickerOptions;\n });\n\n // @methods\n\n const handleInput = (value: TDatePickerType) => {\n emit('update:modelValue', value);\n emit('input', value);\n };\n\n const handleChange = (value: string) => {\n emit('change', value);\n };\n\n const handleBlur = (vm: FocusEvent) => {\n // console.log(vm);\n // const val = vm.$el.querySelector('input').value;\n // if (val) {\n // const format = vm.format;\n // if (!this.userInput)\n // this.userInput = moment(val, format.toUpperCase()).format(format.toUpperCase());\n // if (this.userInput !== 'Invalid date')\n // vm.userInput = this.userInput;\n // // picker.vue中触发value的方法\n // // vm.handleChange();\n emit('blur', vm);\n // this.userInput = '';\n // }\n };\n\n const handleFocus = (vm: FocusEvent) => {\n emit('focus', vm);\n };\n\n const handlePick = (val: [Date, null | Date]) => {\n emit('pick', { maxDate: val[0], minDate: val[1] });\n };\n\n // @render\n return () => (\n <div class={prefixCls}>\n <ElDatePicker\n ref={props.vref || 'gv-datepicker'}\n id={resolvedInputId.value}\n name={props.name}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleInput}\n type={props.type}\n show-week-number={props.showWeekNumber}\n range-separator={props.rangeSeparator || t('common.until')}\n placeholder={props.placeholder || t('common.selectDate')}\n startPlaceholder={props.startPlaceholder || t('common.startDate')}\n endPlaceholder={props.endPlaceholder || t('common.endDate')}\n {...(Array.isArray(props.defaultTime) ? { defaultTime: props.defaultTime } : {})}\n {...(typeof getPickerOptions.value.disabledDate === 'function' ? { disabledDate: getPickerOptions.value.disabledDate as (date: Date) => boolean } : {})}\n {...(getShortcuts.value ? { shortcuts: getShortcuts.value } : {})}\n format={props.format}\n clearable={props.clearable}\n valueFormat={props.valueFormat}\n {...({\n onCalendarChange: handlePick,\n onBlur: handleBlur,\n onFocus: handleFocus,\n onChange: handleChange,\n } as any)}\n size={datePickerSize.value}\n disabled={props.disabled}\n editable={props.editable}\n unlink-panels={props.unlink}></ElDatePicker>\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-datepicker';\n .#{$prefixCls} {\n width: 100% !important;\n vertical-align: middle;\n :deep(.el-date-editor) {\n width: 100%;\n }\n :deep(.el-input.is-disabled) {\n .el-input__inner {\n color: $textColor;\n }\n }\n &.el-range-editor.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n :deep(.el-input__inner) {\n //height: 30px;\n //line-height: 30px;\n //font-size: $appTextSize;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n .el-range__close-icon {\n width: 20px;\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n .el-date-editor--daterange {\n :deep(.el-range-separator) {\n padding-right: 2px;\n padding-left: 0;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDatePicker from './src/GvDatePicker.vue';\n\nconst GvDatePickerPlugin = {\n install(app: App): void {\n app.component(GvDatePicker.name ?? 'GvDatePicker', GvDatePicker);\n },\n};\nexport default GvDatePickerPlugin;\n\nexport { GvDatePicker };\n","/*\n * @title: dialog drag\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 10:50:25\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 10:52:45\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport type { Directive } from 'vue';\n\n/** 使用 WeakSet 跟踪已绑定拖拽事件的 header 元素,避免内存泄漏 */\nconst boundElements = new WeakSet<HTMLElement>();\n\n/**\n * 初始化拖拽功能\n */\nconst initDrag = (el: HTMLElement, collapseMenu: boolean = false) => {\n /** Vue3 dialog - 支持 appendToBody 的情况 */\n let dragDom = el.querySelector('.el-dialog') as HTMLElement;\n if (!dragDom) dragDom = document.querySelector('.el-dialog') as HTMLElement;\n\n if (!dragDom) {\n console.warn('gv-drag-dialog: 未找到 dialog 元素');\n return false;\n }\n\n /** Vue3 dialog header - 支持自定义 header 和默认 header */\n let dialogHeaderEl: HTMLElement | null = null;\n dialogHeaderEl = dragDom.querySelector('.el-dialog__header') as HTMLElement;\n if (!dialogHeaderEl) dialogHeaderEl = dragDom.querySelector('.gv-dialog__title') as HTMLElement;\n\n if (!dialogHeaderEl) {\n console.warn('gv-drag-dialog: 未找到 dialog header 元素');\n return false;\n }\n\n /** 避免重复绑定 */\n if (boundElements.has(dialogHeaderEl)) return true;\n boundElements.add(dialogHeaderEl);\n\n /** 鼠标移动样式 */\n dialogHeaderEl.style.cursor = 'move';\n /** 初始化顶部 */\n dragDom.style.top = '0px';\n /** 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null) */\n const getStyle = (function () {\n if ((window.document as any).currentStyle) return (dom: HTMLElement, attr: string) => (dom as any).currentStyle[attr];\n else return (dom: HTMLElement, attr: string) => getComputedStyle(dom, null)[attr as any];\n })();\n\n dialogHeaderEl.onmousedown = (e: MouseEvent) => {\n /** 鼠标按下,计算当前元素距离可视区的距离 */\n const disX = e.clientX - dialogHeaderEl!.offsetLeft;\n const disY = e.clientY - dialogHeaderEl!.offsetTop;\n\n const dragDomWidth = dragDom.offsetWidth;\n const dragDomHeight = dragDom.offsetHeight;\n\n const screenWidth = document.body.clientWidth;\n const screenHeight = document.body.clientHeight;\n\n /** 左侧边界 */\n const minDragDomLeft = dragDom.offsetLeft;\n /** 右侧边界 */\n const menuWidth = collapseMenu ? 54 : 200;\n const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth - menuWidth;\n\n /** 上边界 */\n const minDragDomTop = dragDom.offsetTop;\n /** 下边界 */\n // 45: toolbar height;34: tags view height\n const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight - 45 - 34;\n\n /** 获取到的值带px 正则匹配替换 */\n let styL: string | number = getStyle(dragDom, 'left');\n let styT: string | number = getStyle(dragDom, 'top');\n\n /** 百分比转像素 */\n if (typeof styL === 'string' && styL.includes('%')) {\n styL = document.body.clientWidth * (+styL.replace(/%/g, '') / 100);\n styT = document.body.clientHeight * (+String(styT).replace(/%/g, '') / 100);\n } else {\n styL = +String(styL).replace(/\\px/g, '');\n styT = +String(styT).replace(/\\px/g, '');\n }\n\n /** 鼠标移动 */\n const onMouseMove = (ev: MouseEvent) => {\n /** 通过事件委托,计算移动的距离 */\n let left = ev.clientX - disX;\n let top = ev.clientY - disY;\n\n /** 边界处理 */\n if (-left > minDragDomLeft) left = -minDragDomLeft;\n else if (left > maxDragDomLeft) left = maxDragDomLeft;\n\n if (-top > minDragDomTop) top = -minDragDomTop;\n else if (top > maxDragDomTop) top = maxDragDomTop;\n\n /** 移动当前元素 */\n dragDom.style.left = `${left + Number(styL)}px`;\n dragDom.style.top = `${top + Number(styT)}px`;\n };\n\n const onMouseUp = () => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n };\n\n return true;\n};\n\nconst dragDialog: Directive = {\n /**\n * @title 挂载时调用\n * @param el 指令绑定的元素\n * @param binding 指令绑定的参数\n * @description Vue3 中需要使用 nextTick 等待 DOM 渲染完成,并通过 querySelector 查找 ElDialog 内部元素\n */\n // mounted(el: HTMLElement, binding: DirectiveBinding, vnode: VNode) {\n // // 使用 setTimeout 确保 ElDialog 已经渲染完成\n // setTimeout(() => {\n // // 尝试初始化,如果 dialog 还没打开,会在 opened 事件中再次尝试\n // initDrag(el);\n // }, 200);\n // },\n};\nexport default dragDialog;\nexport { initDrag };\n","<!--\n * @title: dialog component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-09 09:57:32\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 18:04:43\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvIcon } from '@@/GvIcon';\n import { getVNodeText, sleep } from '@@/utils';\n import { ElDialog } from 'element-plus';\n import { defineComponent, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, watch, type VNode } from 'vue';\n import { initDrag } from './drag';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('dialog');\n\n export default defineComponent({\n name: 'GvDialog',\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: false,\n },\n title: {\n type: String,\n required: false,\n default: '标题',\n },\n hasFooter: {\n type: Boolean,\n required: false,\n default: true,\n },\n width: {\n type: String,\n required: false,\n default: '75%',\n },\n height: {\n type: String,\n required: false,\n default: undefined,\n },\n nest: {\n type: Boolean,\n required: false,\n default: false,\n },\n appendToBody: {\n type: Boolean,\n required: false,\n default: false,\n },\n fullscreen: {\n type: Boolean,\n required: false,\n default: false,\n },\n maxHeight: {\n type: String,\n required: false,\n default: undefined,\n },\n closeOnClickModal: {\n type: Boolean,\n required: false,\n default: false,\n },\n closeOnPressEscape: {\n type: Boolean,\n required: false,\n default: true,\n },\n dialogClass: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['open', 'opened', 'close', 'closed', 'cancel', 'update:visible'],\n\n setup(props, { slots, emit }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n const buttonQuick = appStore.buttonQuick;\n const collapseMenus = appStore.collapseMenus;\n const instance = getCurrentInstance();\n\n let myDialogClass = props.dialogClass || prefixCls;\n let dialogVisible = props.visible;\n const maskVisible = ref(false);\n const vref = 'gv-dialog';\n const dialogMaxHeight = ref(props.height);\n let sAppendToBody = props.appendToBody;\n const modalAppendToBody = ref(false);\n let sNest = props.nest;\n let modalMask = props.nest;\n\n // @watch\n watch(\n () => props.visible,\n (newValue) => {\n // fixme: watch中跟踪visible,解决如将ht-dialog在一个vue组件中,如不设置,则第二次无法显示\n dialogVisible = newValue;\n if (dialogVisible)\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n else maskVisible.value = false;\n },\n );\n\n // @method\n const handleVisible = (visible: boolean) => {\n dialogVisible = visible;\n };\n const handleOpen = () => {\n emit('open');\n };\n const handleOpened = () => {\n emit('opened');\n nextTick(() => {\n initDrag(instance?.vnode?.el as HTMLElement, collapseMenus);\n });\n };\n const handleClose = () => {\n dialogVisible = false;\n maskVisible.value = false;\n // 延迟异步触发\n // sleep(500).then(() => {\n // this.$emit('update:visible', false);\n // });\n emit('close');\n };\n const handleClosed = () => {\n emit('update:visible', false);\n };\n\n const handleCancel = (event) => {\n dialogVisible = false;\n maskVisible.value = false;\n emit('cancel', event);\n };\n /**\n * @todo: render footer button\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 11:19:11\n */\n const renderFooterBtn = () => {\n const footer = slots.footer?.();\n footer?.forEach((x) => {\n const tag = typeof x.type === 'object' && x.type !== null ? (x.type as any).name || '' : '';\n const text = getVNodeText(x.children?.[0]) || '';\n // add: 增加text属性,判断权限使用 2023-04-18\n if (!x.props) x.props = {};\n const propsData = x.props;\n propsData.text = text;\n if (tag)\n if (text.indexOf(t('dialogBar.save')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-baocun2';\n if (buttonQuick) if (text === t('dialogBar.save')) propsData.text = t('dialogBar.save2');\n propsData.otext = t('dialogBar.save');\n } else if (text.indexOf(t('dialogBar.add')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-baocun2';\n if (buttonQuick)\n if (text === t('dialogBar.add')) {\n propsData.text = t('dialogBar.add2');\n propsData.otext = t('dialogBar.add');\n }\n } else if (text.indexOf(t('dialogBar.confirm')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.confirm')) {\n propsData.text = t('dialogBar.confirm2');\n propsData.otext = t('dialogBar.confirm');\n }\n } else if (text.indexOf(t('dialogBar.affirm')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.affirm')) {\n propsData.text = t('dialogBar.affirm2');\n propsData.otext = t('dialogBar.affirm');\n }\n } else if (text.indexOf(t('dialogBar.approve')) !== -1) {\n propsData.bizType = 'approve';\n propsData.icon = 'gv-icon-shenpi1';\n } else if (text.indexOf(t('dialogBar.download')) !== -1) {\n // if (text === t('dialogBar.download')) x.children[0].text = t('dialogBar.download2');\n propsData.bizType = 'download';\n propsData.icon = 'gv-icon-xiazai';\n } else if (text.indexOf(t('dialogBar.delete')) !== -1) {\n propsData.bizType = 'delete';\n propsData.icon = 'el-icon-delete';\n } else if (text.indexOf(t('dialogBar.reject')) !== -1) {\n propsData.bizType = 'reject';\n propsData.icon = 'gv-icon-bohui2';\n } else if (text.indexOf(t('dialogBar.export')) !== -1) {\n propsData.bizType = 'export';\n propsData.icon = 'gv-icon-daochu1';\n } else if (text.indexOf(t('dialogBar.generate')) !== -1) {\n propsData.bizType = 'generate';\n propsData.icon = 'gv-icon-zujian';\n } else if (text.indexOf(t('dialogBar.trace')) !== -1) {\n propsData.bizType = 'trace';\n propsData.icon = 'gv-icon-jiankongguanli';\n } else if (text.indexOf(t('dialogBar.receive')) !== -1) {\n propsData.bizType = 'receive';\n propsData.icon = 'gv-icon-piliangbianji1';\n } else if (text.indexOf(t('dialogBar.transfer')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-tiaobo';\n } else if (text.indexOf(t('dialogBar.circleCheck')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-huanjiance';\n } else if (text.indexOf(t('dialogBar.completed')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-xuanze';\n } else if (text.indexOf(t('dialogBar.finished')) !== -1 || text.indexOf(t('dialogBar.beCompleted')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-wangongqueren';\n } else if (text.indexOf(t('dialogBar.submit')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-tijiao';\n if (buttonQuick)\n if (text === t('dialogBar.submit')) {\n propsData.text = t('dialogBar.submit2');\n propsData.otext = t('dialogBar.submit');\n }\n }\n });\n return footer;\n };\n\n /**\n * @todo: footer render\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 10:34:41\n */\n const getFooter = () => {\n if (props.hasFooter)\n if (slots.footer?.())\n return (\n <div>\n {renderFooterBtn()}\n <GvButton\n onClick={handleCancel}\n icon=\"iconfont gv-icon-fanhui2\">\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n // <el-button type='primary' onClick={this.handleConfirm}>确 定(S)</el-button>\n else\n return (\n <div>\n <GvButton\n onClick={handleCancel}\n icon=\"iconfont gv-icon-fanhui2\">\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n };\n\n /**\n * @todo: mask\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 10:38:59\n */\n const setMask = () => {\n let mask: VNode | null = null;\n if (maskVisible.value)\n mask = (\n <div\n class=\"v-modal gv-dialog-modal z-[9]\"\n tabindex=\"0\"></div>\n );\n return mask;\n };\n\n const getMaxHeight = () => {\n if (!props.height) dialogMaxHeight.value = document.documentElement.clientHeight - 230 + 'px';\n else if (props.height.indexOf('%') === -1) dialogMaxHeight.value = parseFloat(props.height) - 180 + 'px';\n else dialogMaxHeight.value = props.height; // 百分比方式\n };\n\n // @created\n // fixme: 解决嵌套弹窗问题 2022-08-08\n const pEl = instance?.parent?.parent?.vnode.el;\n if (pEl)\n try {\n const p = pEl.closest('.gv-drawer,.gv-dialog');\n if (p) sNest = true;\n } catch {\n // error\n }\n if (sNest) {\n myDialogClass = props.dialogClass ? 'gv-dialog is-nested ' + props.dialogClass : 'gv-dialog is-nested';\n sAppendToBody = true;\n modalAppendToBody.value = true;\n modalMask = true;\n } else modalMask = false;\n\n onBeforeUnmount(() => {\n window.removeEventListener('resize', getMaxHeight);\n });\n\n // mounted\n onMounted(() => {\n // fixme: v-show属性使用单独的变量,在挂载时再显示,如在data中直接定义为true,会造成抖动 2022-04-11\n if (dialogVisible) maskVisible.value = true;\n\n nextTick(() => {\n window.addEventListener('resize', getMaxHeight);\n // 计算高度\n getMaxHeight();\n });\n });\n\n // @render\n return () => (\n <div class=\"gv-dialog__popup\">\n <ElDialog\n ref={vref}\n // route={this.route}\n modelValue={dialogVisible}\n onUpdate:modelValue={handleVisible}\n appendToBody={sAppendToBody}\n modal-append-to-body={modalAppendToBody.value}\n close-on-click-modal={props.closeOnClickModal}\n close-on-press-escape={props.closeOnPressEscape}\n showClose={true}\n destroy-on-close={true}\n fullscreen={props.fullscreen}\n modal={modalMask}\n // before-close={this.handleBeforeClose}\n onClose={handleClose}\n onClosed={handleClosed}\n onOpen={handleOpen}\n onOpened={handleOpened}\n class={myDialogClass}\n width={props.width}\n style={{ height: `${props.height}` }}>\n {{\n header: () => (\n <div class=\"gv-dialog__title\">\n <span>\n <GvIcon\n iconType=\"iconfont\"\n iconName=\"gv-icon-chuangkou01\"\n />\n {props.title}\n </span>\n </div>\n ),\n default: () => (\n <div\n class=\"gv-dialog__body__inner\"\n style={{ maxHeight: `${dialogMaxHeight.value} !important` }}>\n {slots.default?.()}\n </div>\n ),\n footer: () => <div class=\"dialog-footer\">{getFooter()}</div>,\n }}\n </ElDialog>\n {setMask()}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n .gv-dialog__popup {\n :deep(.el-modal-dialog) {\n position: absolute !important;\n &.is-nested {\n top: 100px;\n left: 14%;\n }\n .el-overlay-dialog {\n position: absolute !important;\n overflow: hidden;\n .el-dialog {\n max-height: 93.5% !important;\n margin-top: 25px !important;\n padding: 0px;\n\n .el-dialog__header {\n box-sizing: border-box;\n height: 30px;\n padding: 0 15px;\n line-height: 30px;\n background-color: #e1e5ec !important;\n border-bottom: 1px solid $borderColor;\n\n .gv-dialog__title {\n //font-size: $appTextSize;\n line-height: inherit;\n\n & i {\n padding-right: 10px;\n //font-size: $textSize;\n font-weight: bolder;\n }\n }\n\n .el-dialog__headerbtn {\n width: 16px;\n height: 25px;\n top: 2px;\n right: 12px;\n font-size: 20px;\n font-weight: bolder;\n line-height: normal;\n\n &:hover .el-dialog__close {\n color: var(--primaryColor, $primaryColor);\n }\n\n .el-dialog__close {\n font-size: 16px;\n font-weight: bolder;\n }\n }\n }\n\n .el-dialog__body {\n padding: 5px 5px 5px 15px;\n overflow: hidden;\n\n .gv-dialog__body__inner {\n padding-right: 15px;\n overflow: hidden auto;\n }\n\n .fullscreen-btn {\n position: absolute;\n top: 16px;\n right: 42px;\n padding: 5px;\n line-height: 1;\n cursor: pointer;\n\n &:hover {\n color: $primaryColor;\n }\n }\n\n .container {\n padding: 0 15px;\n }\n }\n\n .el-dialog__footer {\n .gv-popconfirm {\n padding: 1px 0 1px 8px;\n }\n\n .el-button i + span {\n margin-left: 5px;\n }\n\n padding: 5px 15px;\n border-top: 1px solid $borderColor;\n }\n }\n }\n }\n }\n\n .gv-tabs {\n .gv-dialog {\n top: -10px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDialog from './src/GvDialog.vue';\nconst GvDialogPlugin = {\n install(app: App): void {\n app.component(GvDialog.name ?? 'GvDialog', GvDialog);\n },\n};\nexport default GvDialogPlugin;\n\nexport { GvDialog };\n","<!--\n * @title: divider component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:24:57\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 18:03:45\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElDivider } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n import type { DividerDirection } from './types';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('divider');\n\n export default defineComponent({\n name: 'GvDivider',\n emits: ['setDividerShow'],\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n label: {\n type: String,\n required: true,\n default: '栏目',\n },\n position: {\n type: String,\n required: false,\n default: 'left',\n },\n direction: {\n type: String as PropType<DividerDirection>,\n required: false,\n default: 'horizontal',\n },\n target: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n\n setup(props, { emit }) {\n /**\n * @todo: click divider — toggle form visibility via parent isShow\n */\n const clickDivider = (event: MouseEvent | TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n emit('setDividerShow', !props.visible);\n };\n\n return () => (\n <div\n class={prefixCls}\n onClick={(event) => clickDivider(event)}>\n <ElDivider\n content-position={props.position}\n direction={props.direction}>\n <span class=\"title\">{props.label}</span>\n </ElDivider>\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-divider';\n .#{$prefixCls} {\n width: 100%;\n height: 20px;\n margin: 5px 0 8px 0;\n overflow: hidden;\n user-select: none;\n\n // 禁止选中文本\n &:hover {\n cursor: pointer;\n }\n :deep(.el-divider--horizontal) {\n margin: 8px 0;\n .el-divider__text {\n padding: 0 $modulePadding;\n &.is-left {\n left: -$moduleMargin;\n }\n .title {\n display: inline-block;\n height: 20px;\n //font-size: $textSizeSecondary;\n font-weight: $fontWeight;\n line-height: 20px;\n color: $textColor;\n\n &::before {\n display: inline-block;\n width: 5px;\n height: 100%;\n margin-right: 8px;\n vertical-align: middle;\n content: '';\n background-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDivider from './src/GvDivider.vue';\nconst GvDividerPlugin = {\n install(app: App): void {\n app.component(GvDivider.name ?? 'GvDivider', GvDivider);\n },\n};\nexport default GvDividerPlugin;\n\nexport { GvDivider };\n","<!--\n * @title: drawer component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-09 09:58:21\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-10 09:01:23\n * @version: 1.0.7\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvIcon } from '@@/GvIcon';\n import { getVNodeText, sleep } from '@@/utils';\n import { ElDrawer } from 'element-plus';\n import { defineComponent, nextTick, onMounted, ref, watch, type PropType, type VNode } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('drawer');\n\n export default defineComponent({\n name: 'GvDrawer',\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: false,\n },\n title: {\n type: String,\n required: false,\n default: '标题',\n },\n direction: {\n type: String as PropType<'rtl' | 'ltr' | 'ttb' | 'btt'>,\n required: false,\n default: 'rtl',\n },\n size: {\n type: [String, Number],\n required: false,\n default: '95%', // 95%\n },\n paddingHeight: {\n type: [Number],\n required: false,\n default: 100, // 100\n },\n },\n emits: ['close', 'closed', 'open', 'opened', 'cancel', 'resize', 'update:visible'],\n\n setup(props, { slots, emit }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n\n const drawerVisible = ref(props.visible);\n const maskVisible = ref(false);\n const vref = 'gv-drawer';\n const drawerMaxHeight = ref(0);\n const show = ref(false);\n const buttonQuick = appStore.buttonQuick;\n const buttonIcon = appStore.buttonIcon;\n const sPaddingHeight = appStore.drawerPaddingHeight ? appStore.drawerPaddingHeight : props.paddingHeight;\n\n // @watch\n watch(\n () => props.visible,\n (newVal) => {\n // fixme: watch中跟踪visible,解决如将ht-drawer在一个vue组件中,如不设置,则第二次无法显示\n drawerVisible.value = newVal;\n if (drawerVisible.value)\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n else maskVisible.value = false;\n },\n );\n\n // @method\n\n const handleOpen = () => {\n // this.maskVisible = true;\n emit('open');\n };\n const handleOpened = () => {\n // this.maskVisible = true;\n emit('opened');\n };\n\n const handleClosed = () => {\n emit('update:visible', false);\n };\n\n const handleResize = (evt: MouseEvent, size: number) => {\n emit('resize', evt, size);\n };\n\n const handleCancel = (event: Event) => {\n drawerVisible.value = false;\n maskVisible.value = false;\n emit('cancel', event);\n };\n\n const handleVisible = (visible: boolean) => {\n drawerVisible.value = visible;\n };\n\n const handleClose = () => {\n drawerVisible.value = false;\n maskVisible.value = false;\n emit('update:visible', false);\n // 延迟异步触发\n // sleep(500).then(() => {\n // this.$emit('update:visible', false);\n // });\n // this.$emit('close', event);\n };\n\n /**\n * @todo: set footer button shortcut\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 15:25:50\n */\n const renderFooterBtn = () => {\n const footer = slots.footer?.();\n footer?.forEach((x) => {\n const tag = typeof x.type === 'object' && x.type !== null ? (x.type as any).name || '' : '';\n const text = getVNodeText(x) || '';\n if (!x.props) x.props = {};\n const propsData = x.props;\n propsData.text = text;\n if (tag)\n if (text.indexOf(t('dialogBar.save')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-baocun2';\n if (buttonQuick)\n if (text === t('dialogBar.save')) {\n propsData.text = t('dialogBar.save2');\n propsData.otext = t('dialogBar.save');\n }\n } else if (text.indexOf(t('dialogBar.confirm')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.confirm')) {\n propsData['otext'] = t('dialogBar.confirm');\n propsData.text = t('dialogBar.confirm2');\n }\n } else if (text.indexOf(t('dialogBar.affirm')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.affirm')) {\n propsData.text = t('dialogBar.affirm2');\n propsData.otext = t('dialogBar.confirm');\n }\n } else if (text.indexOf(t('dialogBar.approve')) !== -1) {\n propsData.bizType = 'approve';\n if (buttonIcon) propsData.icon = 'gv-icon-shenpi1';\n } else if (text.indexOf(t('dialogBar.reject')) !== -1) {\n propsData.bizType = 'reject';\n if (buttonIcon) propsData.icon = 'gv-icon-bohui2';\n } else if (text.indexOf(t('dialogBar.pay')) !== -1) {\n propsData.bizType = 'pay';\n if (buttonIcon) propsData.icon = 'gv-icon-yingshoukuan';\n } else if (text.indexOf(t('dialogBar.receive')) !== -1) {\n propsData.bizType = 'receive';\n if (buttonIcon) propsData.icon = 'gv-icon-piliangbianji1';\n } else if (text.indexOf(t('dialogBar.export')) !== -1) {\n propsData.bizType = 'export';\n if (buttonIcon) propsData.icon = 'gv-icon-daochu1';\n } else if (text.indexOf(t('dialogBar.generate')) !== -1) {\n propsData.bizType = 'generate';\n if (buttonIcon) propsData.icon = 'gv-icon-zujian';\n } else if (text.indexOf(t('dialogBar.trace')) !== -1) {\n propsData.bizType = 'trace';\n if (buttonIcon) propsData.icon = 'gv-icon-jiankongguanli';\n } else if (text.indexOf(t('dialogBar.publish')) !== -1) {\n propsData.bizType = 'publish';\n if (buttonIcon) propsData.icon = 'gv-icon-fabu';\n } else if (text.indexOf(t('dialogBar.transfer')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-tiaobo';\n } else if (text.indexOf(t('dialogBar.download')) !== -1) {\n propsData.bizType = 'download';\n // if (text === t('dialogBar.download')) children[0].text = '下 载';\n if (buttonIcon) propsData.icon = 'gv-icon-xiazai';\n } else if (text.indexOf(t('dialogBar.delete')) !== -1 || text.indexOf(t('dialogBar.obsolete')) !== -1) {\n propsData.bizType = 'delete';\n if (buttonIcon) propsData.icon = 'el-icon-delete';\n if (buttonQuick) {\n if (text === t('dialogBar.obsolete')) {\n propsData.text = t('dialogBar.obsolete2');\n propsData.otext = t('dialogBar.obsolete');\n }\n if (text === t('dialogBar.delete')) {\n propsData.text = t('dialogBar.delete2');\n propsData.otext = t('dialogBar.delete');\n }\n }\n } else if (text.indexOf(t('dialogBar.submit')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-tijiao';\n if (buttonQuick)\n if (text === t('dialogBar.submit')) {\n propsData.text = t('dialogBar.submit2');\n propsData.otext = t('dialogBar.submit');\n }\n propsData['otext'] = t('dialogBar.submit');\n } else if (text.indexOf(t('dialogBar.circleCheck')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-huanjiance';\n } else if (text.indexOf(t('dialogBar.completed')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-xuanze';\n } else if (text.indexOf(t('dialogBar.settlement')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-eduguanli';\n } else if (text.indexOf(t('dialogBar.finished')) !== -1 || text.indexOf(t('dialogBar.beCompleted')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-wangongqueren';\n }\n });\n\n return footer;\n };\n\n /**\n * @todo: get footer button\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 15:38:54\n */\n const getFooter = () => {\n let returnIcon: string | undefined = 'iconfont gv-icon-fanhui2';\n if (!buttonIcon) returnIcon = undefined;\n if (slots.footer?.())\n return (\n <div class=\"gv-drawer__footer__inner\">\n {renderFooterBtn()}\n <GvButton\n onClick={handleCancel}\n icon={returnIcon}>\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n // <el-button type='primary' onClick={this.handleConfirm}>确 定(S)</el-button>\n else\n return (\n <div class=\"gv-drawer__footer__inner\">\n <GvButton\n onClick={handleCancel}\n icon={returnIcon}>\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n };\n const getMaxHeight = () => {\n drawerMaxHeight.value = document.documentElement.clientHeight - 225;\n };\n\n const setMask = () => {\n let mask: VNode | null = null;\n if (maskVisible.value)\n mask = (\n <div\n tabindex=\"0\"\n class=\"v-modal gv-dialog-drawer z-[9]\"></div>\n );\n return mask;\n };\n // @created\n\n // @mounted\n onMounted(() => {\n // 实现esc按键绑定\n // this.bindListerOnEsc();\n // fixme: v-show属性使用单独的变量,在挂载时再显示,如在data中直接定义为true,会造成抖动 2022-04-11\n if (drawerVisible.value) {\n show.value = true;\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n }\n getMaxHeight();\n nextTick(() => {});\n });\n // @render\n return () => (\n <div class=\"gv-drawer__popup\">\n <ElDrawer\n class={prefixCls}\n ref={vref}\n modelValue={drawerVisible.value}\n onUpdate:modelValue={handleVisible}\n direction={props.direction}\n appendToBody={false}\n modal-append-to-body={false}\n close-on-press-escape={true}\n showClose={true}\n close-on-click-modal={false}\n modal={false}\n onClose={handleClose}\n onClosed={handleClosed}\n onOpen={handleOpen}\n onOpened={handleOpened}\n onResize={handleResize}\n size={props.size}\n style={{ height: `calc(100vh - ${sPaddingHeight}px)` }}>\n {{\n header: () => (\n <div class=\"gv-drawer__title\">\n <span>\n <GvIcon\n style={{ display: buttonIcon ? '' : 'none' }}\n iconType=\"iconfont\"\n iconName=\"gv-icon-chuangkou01\"></GvIcon>\n {props.title}\n </span>\n </div>\n ),\n default: () => (\n <div style={{ overflow: 'hidden auto', maxHeight: `${drawerMaxHeight.value}px !important` }}>\n <div class=\"gv-drawer__body__inner\">{slots.default?.()}</div>\n </div>\n ),\n footer: () => <div class=\"gv-drawer__footer\">{getFooter()}</div>,\n }}\n </ElDrawer>\n {setMask()}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n .gv-drawer__popup {\n :deep(.el-modal-drawer) {\n position: absolute !important;\n top: 1px !important;\n height: calc(100vh - 100px) !important;\n .el-drawer {\n // width: 95% !important;\n height: 98% !important;\n margin-top: 1px !important;\n\n .el-drawer__header {\n box-sizing: border-box;\n height: 30px;\n padding: 0 15px;\n margin-bottom: 1px;\n line-height: 30px;\n background-color: #e1e5ec !important;\n border-bottom: 1px solid $borderColor;\n\n .gv-drawer__title {\n //font-size: $appTextSize;\n line-height: inherit;\n\n & i {\n padding-right: 10px;\n //font-size: $textSize;\n font-weight: bolder;\n }\n }\n\n .el-drawer__close-btn {\n top: 10px;\n right: 12px;\n line-height: normal;\n\n i {\n font-size: 16px;\n font-weight: bolder;\n }\n\n &:hover i {\n color: var(--primaryColor, $primaryColor);\n }\n\n .el-drawer__close {\n font-weight: bolder;\n }\n }\n }\n\n .el-drawer__body {\n padding: 5px 15px;\n overflow: hidden;\n\n .gv-drawer__body__inner {\n overflow: hidden auto;\n }\n\n .fullscreen-btn {\n position: absolute;\n top: 16px;\n right: 42px;\n padding: 5px;\n line-height: 1;\n cursor: pointer;\n\n &:hover {\n color: $primaryColor;\n }\n }\n\n .container {\n padding: 0 15px;\n }\n }\n\n .gv-drawer__footer {\n .gv-drawer__footer__inner {\n float: right;\n padding: 5px;\n\n .el-button i + span {\n margin-left: 5px;\n }\n }\n\n .gv-popconfirm {\n padding: 1px 0 1px 8px;\n }\n\n .el-button--default {\n margin-left: 8px;\n }\n\n width: 100%;\n border-top: 1px solid $borderColor;\n }\n }\n }\n }\n .gv-tabs {\n .gv-drawer {\n top: 10px;\n height: 93% !important;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDrawer from './src/GvDrawer.vue';\nconst GvDrawerPlugin = {\n install(app: App): void {\n app.component(GvDrawer.name ?? 'GvDrawer', GvDrawer);\n },\n};\nexport default GvDrawerPlugin;\n\nexport { GvDrawer };\n","import { type VueTypeValidableDef, type VueTypesInterface, createTypes, toValidableType } from 'vue-types';\nimport type { CSSProperties } from 'vue';\n\ntype PropTypes = VueTypesInterface & {\n readonly style: VueTypeValidableDef<CSSProperties>;\n};\nconst newPropTypes = createTypes({\n func: undefined,\n bool: undefined,\n string: undefined,\n number: undefined,\n object: undefined,\n integer: undefined,\n}) as PropTypes;\n\nclass propTypes extends newPropTypes {\n static get style(): VueTypeValidableDef<CSSProperties> {\n return toValidableType('style', {\n type: [String, Object],\n });\n }\n}\n\nexport { propTypes };\n","/*\n * @title: pinyin-pro 汉字转拼音组件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-10-10 11:21:59\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-10-10 11:22:02\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { pinyin } from 'pinyin-pro';\n/**\n * usePinyin 组合式函数\n * 提供常见的中文转拼音功能\n */\nexport function usePinyin() {\n /**\n * 中文转拼音(默认无音调、空格分隔)\n * @param text 中文字符串\n * @param withTone 是否带音调(默认 false)\n */\n const toPinyin = (text: string, withTone = false): string => {\n if (!text) return '';\n return pinyin(text, {\n toneType: withTone ? 'symbol' : 'none',\n type: 'string',\n multiple: false,\n });\n };\n\n /**\n * 获取拼音首字母\n * @param text 中文字符串\n */\n const getFirstLetter = (text: string): string => {\n if (!text) return '';\n return pinyin(text, {\n pattern: 'first',\n toneType: 'none',\n type: 'string',\n }).replace(/\\s+/g, '');\n };\n\n /**\n * 获取拼音数组(按字分隔)\n * @param text 中文字符串\n */\n const getPinyinArray = (text: string): string[] => {\n if (!text) return [];\n return pinyin(text, {\n toneType: 'none',\n type: 'array',\n });\n };\n\n return {\n toPinyin,\n getFirstLetter,\n getPinyinArray,\n };\n}\n","<!--\n * @title: expand menu list\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-04 12:37:50\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:58:26\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { usePermsStore } from '@/store/modules/perms';\n import { usePinyin } from '@@/hooks/web/usePinyin';\n import { isExternal, pathResolve, sleep } from '@@/utils';\n import { Search, Star, StarFilled } from '@element-plus/icons-vue';\n import { ElAutocomplete, ElIcon, ElTabPane, ElTabs } from 'element-plus';\n import { computed, onMounted, ref } from 'vue';\n import { useI18n } from 'vue-i18n';\n import type { RouteType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu-list');\n\n defineOptions({\n name: 'GvMenuList', // 定义组件名称\n });\n const { t } = useI18n();\n const permStore = usePermsStore();\n const pinYin = usePinyin();\n const routes = computed(() => permStore.getServerRouters);\n\n const emit = defineEmits(['close']);\n\n const menuList = ref<RouteType[]>();\n const menuPath = ref('');\n\n const fMenusList = ref<AppRouteRecordRaw[]>([]);\n\n // ------ watch hook------\n // watchEffect();\n // // [routes, menusList],\n // // [\n // // (n, o) => {\n // // this.menusList = this.generateRoutes(this.routes.value);\n // // },\n // // (list) => {\n // // // 转换拼音\n // // if (this.supportPinyinSearch) this.addPinyinField(list);\n // // },\n // // ],\n\n // ------ methods hook ------\n /**\n * @todo: generate routes\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-15 10:46:56\n * @param {*} sidebarRoutes\n * @param {*} basePath\n * @param {*} prefixTitle\n * @param {*} prefixCode\n */\n\n const generateRouter = (serverRoutes: AppRouteRecordRaw[], basePath = '/', prefixTitle: string[] = [], prefixCode: string[] = []): RouteType[] => {\n let res: RouteType[] = [];\n for (const router of serverRoutes) {\n if (router.redirect === '/404') continue;\n if (router.meta?.hidden) continue;\n const data: RouteType = {\n path: pathResolve(basePath, router.path),\n title: [...(prefixTitle as string[])],\n pinyinTitle: pinYin.getFirstLetter([...(prefixTitle as string[])].join('')),\n code: [...prefixCode],\n };\n if (router.meta && router.meta.title) {\n const i18ntitle = router.meta.title;\n const code = router.meta.code || '';\n data.title = [...data.title, i18ntitle];\n data.pinyinTitle = pinYin.getFirstLetter(data.title.join(''));\n data.code = [...data.code, String(code)];\n if (router.redirect !== 'noredirect') res.push(data);\n else if (basePath === '/') fMenusList.value.push(router);\n }\n if (router.children) {\n const tempRoutes = generateRouter(router.children, data.path, data.title);\n if (tempRoutes.length >= 1) res = [...res, ...tempRoutes];\n }\n }\n return res;\n };\n\n const handleCloseDrawer = () => {\n emit('close');\n };\n\n /**\n * @todo: click menu item handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-03-09 10:56:00\n * @param {*} item\n */\n const handleSelect = (item: RouteType) => {\n // push({ path: item.path });\n // handleCloseDrawer();\n sleep(200).then(() => {\n menuPath.value = '';\n });\n };\n\n const handleSearch = (query: string, cb: any) => {\n let res: RouteType[] = [];\n if (query !== '')\n if (Array.isArray(menuList.value))\n res = menuList.value.filter((item) => {\n if (item.title.join('').indexOf(query) !== -1) return item;\n else if (item.pinyinTitle.indexOf(query.toLowerCase()) !== -1) return item;\n else if (item.path.indexOf(query) !== -1) return item;\n });\n else res = menuList.value ?? [];\n else res = menuList.value ?? [];\n cb(res);\n };\n\n /**\n * @todo: star click handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-10-11 10:20:33\n * @param {*} star\n * @param {*} path\n * @param {*} title\n * @param {*} menuItem\n */\n const starClickHandle = (star, path, title, menuItem) => {};\n\n // ------ mounted hook ------\n onMounted(() => {\n menuList.value = generateRouter(routes.value);\n // console.log('routes', permStore.getServerRouters);\n // console.log('menuList', menuList.value);\n });\n</script>\n<template>\n <div :class=\"prefixCls\">\n <!-- search -->\n <div class=\"search\">\n <div class=\"top\">\n <ElAutocomplete\n v-model=\"menuPath\"\n value-key=\"path\"\n :fetch-suggestions=\"handleSearch\"\n :placeholder=\"t('sideBar.menuSearch')\"\n @select=\"handleSelect\">\n <template #prefix>\n <ElIcon>\n <Search />\n </ElIcon>\n </template>\n <template v-slot=\"{ item }\">\n <span class=\"name\">{{ item.title.join(' > ') }}</span>\n </template>\n </ElAutocomplete>\n </div>\n </div>\n <!-- main -->\n <div class=\"main\">\n <ElTabs tab-position=\"right\">\n <ElTabPane\n v-for=\"item in fMenusList\"\n :key=\"item.name\"\n :label=\"item.meta?.title\"\n lazy>\n <div class=\"column-wrap\">\n <div\n v-for=\"sub in item.children\"\n :key=\"sub.name\"\n class=\"box\">\n <template v-if=\"!sub.children || sub.children.length === 0\">\n <ul class=\"leaf\">\n <li>\n <ElIcon @click.stop=\"starClickHandle(sub.meta?.star, sub.path, sub.meta?.title, sub)\">\n <component :is=\"sub.meta?.star ? StarFilled : Star\" />\n </ElIcon>\n <router-link\n v-if=\"!isExternal(sub.path)\"\n :to=\"`${item.path}/${sub.path}`\"\n @click=\"handleCloseDrawer\">\n {{ sub.meta?.title }}\n </router-link>\n <a\n v-else\n :href=\"sub.path\"\n target=\"_blank\"\n rel=\"noopener\">\n {{ sub.meta?.title }}</a\n >\n </li>\n </ul>\n </template>\n <template v-else>\n <h4>{{ sub.meta?.title }}</h4>\n <ul>\n <li\n v-for=\"x in sub.children\"\n :key=\"x.name\">\n <ElIcon @click.stop=\"starClickHandle(x.meta?.star, x.name, x.meta?.title, x)\">\n <component :is=\"x.meta?.star ? StarFilled : Star\" />\n </ElIcon>\n <router-link\n v-if=\"!isExternal(sub.path)\"\n :to=\"`${item.path}/${sub.path}/${x.path}`\"\n @click=\"handleCloseDrawer\">\n {{ x.meta?.title }}\n </router-link>\n <a\n v-else\n :href=\"sub.path\"\n target=\"_blank\"\n rel=\"noopener\">\n {{ x.meta?.title }}</a\n >\n </li>\n </ul>\n </template>\n </div>\n </div>\n </ElTabPane>\n </ElTabs>\n </div>\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-expand-menu-list';\n .#{$prefixCls} {\n position: absolute;\n width: 650px;\n height: 100%;\n left: 0px;\n background: #272b2c;\n &::after {\n top: 0;\n right: 0;\n width: 150px;\n height: 100%;\n content: '';\n background: #272b2c;\n }\n :deep(.search) {\n height: 100px;\n width: 500px;\n background: #313538;\n .top {\n padding: 30px 0 0 100px;\n i {\n color: var(--left-menu-text-color);\n }\n .el-autocomplete {\n width: 300px;\n border-bottom: 1px solid #626466;\n border-radius: 0;\n .el-input {\n .el-input__wrapper {\n background: var(--left-menu-expand-bg-color);\n box-shadow: none;\n padding-left: 30px;\n .el-input__inner {\n //font-size: $appTextSize;\n color: #fff;\n border: none;\n line-height: 40px;\n height: 40px;\n }\n }\n }\n }\n }\n }\n :deep(.main) {\n position: relative;\n height: calc(100% - 100px);\n .el-tabs {\n height: 100%;\n overflow-y: auto;\n &::-webkit-scrollbar {\n display: none;\n }\n .el-tabs__header {\n position: absolute;\n top: 0;\n right: 0;\n .el-tabs__nav-wrap {\n padding: 0;\n .el-tabs__nav-scroll {\n overflow-y: auto;\n .el-tabs__nav {\n padding-bottom: $modulePadding;\n }\n }\n .el-tabs__item {\n height: 30px;\n padding: 0 0 0 15px;\n //font-size: $textSize;\n line-height: 30px;\n color: $menuText;\n &.is-active {\n font-weight: 500;\n color: #fff;\n }\n }\n &.is-right {\n width: 151px;\n }\n &::after {\n display: none;\n }\n }\n }\n .el-tabs__content {\n background: #313538;\n margin-right: 150px;\n .el-tab-pane {\n padding-right: 20px;\n }\n .column-wrap {\n column-count: 2;\n column-gap: 0;\n .box {\n padding-bottom: 10px;\n padding-left: 30px;\n -webkit-column-break-inside: avoid;\n page-break-inside: avoid;\n break-inside: avoid;\n h4 {\n margin-bottom: 12px;\n height: 32px;\n //font-size: $textSize;\n font-weight: 500;\n line-height: 32px;\n color: $menuText;\n border-bottom: 1px solid #626466;\n }\n ul {\n padding-left: 0;\n margin-top: 8px;\n list-style: none;\n &.leaf {\n margin-top: 18px;\n }\n li {\n line-height: 26px;\n i {\n //font-size: 14px;\n cursor: pointer;\n top: 2px;\n }\n .el-icon {\n color: $menuText;\n }\n a {\n padding-left: 3px;\n //font-size: $textSize;\n color: $menuText;\n transition: all 0.3s ease;\n &:hover {\n color: var(--menuActiveText, $menuActiveText);\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n</style>\n","<!--\n * @title: Expand Menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-02 09:39:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:58:12\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { propTypes } from '@@/utils/gv.propTypes';\n import { ElDrawer } from 'element-plus';\n import { computed, ref } from 'vue';\n\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import GvMenuList from './GvMenuList.vue';\n\n defineOptions({\n name: 'GvExpandMenu', // 定义组件名称\n });\n\n const props = defineProps({\n collapse: propTypes.bool.def(true),\n });\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu');\n\n const { t } = useBridgeI18n();\n\n // console.log('t', t('sideBar.menuNav'));\n const visible = ref(false);\n const sideWidth = computed(() => (props.collapse ? '54px' : '200px'));\n const expandHandle = () => {\n visible.value = !visible.value;\n };\n</script>\n<template>\n <div :class=\"prefixCls\">\n <div\n class=\"expand-menu-title\"\n :class=\"{ selected: visible ? true : false }\"\n @click.stop=\"expandHandle\">\n <i :class=\"['iconfont', 'gv-icon-wangzhandaohang']\"></i>\n <span\n v-if=\"!collapse\"\n class=\"text\"\n >{{ t('sideBar.menuNav') }}</span\n >\n </div>\n <ElDrawer\n v-model=\"visible\"\n :style=\"{ left: sideWidth, paddingLeft: sideWidth }\"\n class=\"sidebar-expand-drawer\"\n :with-header=\"false\"\n :append-to-body=\"true\"\n direction=\"ltr\"\n resizable\n :modal-class=\"!collapse ? 'sidebar-expand-menu-collapse' : 'sidebar-expand-menu-unCollapse'\"\n size=\"650\">\n <GvMenuList @close=\"visible = false\" />\n </ElDrawer>\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-expand-menu';\n .#{$prefixCls} {\n height: 40px;\n background-color: $menuBg;\n\n .expand-menu-title {\n width: 100%;\n padding-left: 14px;\n line-height: 48px;\n color: $menuText;\n cursor: pointer;\n\n &.selected,\n &:hover {\n color: var(--left-menu-text-active-color);\n background-color: $menuHover;\n }\n\n i {\n width: 24px;\n font-size: 20px;\n font-weight: 500;\n color: var(--left-menu-text-color);\n text-align: center;\n vertical-align: middle;\n }\n\n .text {\n display: inline-block;\n line-height: 48px;\n margin-left: 10px;\n //font-size: $textSize;\n color: var(--left-menu-text-color);\n vertical-align: middle;\n &:hover {\n color: var(--left-menu-text-active-color);\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvExpandMenu from './src/GvExpandMenu.vue';\nconst GvExpandMenuPlugin = {\n install(app: App): void {\n app.component(GvExpandMenu.name ?? 'GvExpandMenu', GvExpandMenu);\n },\n};\nexport default GvExpandMenuPlugin;\n\nexport { GvExpandMenu };\n","<!--\n * @title: input component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-29 09:22:45\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-10 14:49:22\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import { GvIcon } from '@@/GvIcon';\n import { ElInput, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { BizType, InputType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('input');\n\n export default defineComponent({\n name: 'GvInput',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n value: {\n type: [String, Number, undefined] as PropType<string | number | undefined>,\n default: '',\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n prefixIcon: {\n type: String,\n default: '',\n },\n suffixIcon: {\n type: String,\n default: '',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n maxlength: {\n type: Number,\n default: 30,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n readonly: {\n type: Boolean,\n default: false,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n type: {\n type: String as PropType<InputType>,\n default: 'text',\n },\n rows: {\n type: Number,\n default: 2,\n },\n autosize: {\n type: [Boolean, Object] as PropType<boolean | Record<string, any>>,\n default: false,\n },\n bizType: {\n type: String as PropType<BizType>,\n default: 'tableedit',\n },\n },\n\n emits: ['update:modelValue', 'input', 'blur', 'focus', 'clear', 'keydown'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useBridgeI18n();\n const globalSize = useGlobalConfig('size');\n const inputValue = ref(props.value);\n\n const showWordLimit = ref(false);\n\n // @computed\n const inputSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sPlaceholder = computed(() => props.placeholder || t('common.pleaseInput'));\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @watch\n watch(\n () => props.value,\n (newValue) => {\n inputValue.value = newValue;\n },\n );\n\n // @methods\n\n const renderPrefixIcon = (): JSX.Element | null => {\n if (!props.prefixIcon) return null;\n return <GvIcon iconName={props.prefixIcon} />;\n };\n\n const renderSuffixIcon = (): JSX.Element | null => {\n if (!props.suffixIcon) return null;\n return <GvIcon iconName={props.suffixIcon} />;\n };\n\n const getDisabled = computed(() => {\n if (typeof props.disabled === 'boolean') return props.disabled;\n if (typeof props.disabled === 'string') return props.disabled !== '';\n return false;\n });\n\n const handleInput = (val: string | number) => {\n inputValue.value = val;\n emit('update:modelValue', val);\n emit('input', val);\n };\n\n const handleBlur = (event: FocusEvent) => {\n showWordLimit.value = false;\n if (props.bizType === 'tableedit') emit('blur', event, inputValue.value, props.columnProp);\n else emit('blur', event, inputValue.value, props.vref);\n };\n\n const handleFocus = (event: FocusEvent) => {\n (event.target as HTMLInputElement).select();\n if (props.bizType === 'tableedit') emit('focus', event, inputValue.value, props.columnProp);\n else emit('focus', event, inputValue.value, props.vref);\n };\n\n const handleClear = (event: any) => {\n emit('clear', event);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n showWordLimit.value = true;\n emit('keydown', event);\n };\n\n // @render\n return () => {\n if (!props.visible) return null;\n return (\n <ElInput\n ref={props.vref}\n id={resolvedInputId.value}\n name={props.name}\n type={props.type}\n modelValue={inputValue.value}\n modelModifiers={{ number: true }}\n readonly={props.readonly}\n rows={props.rows}\n autosize={props.autosize}\n size={inputSize.value}\n showWordLimit={showWordLimit.value}\n maxlength={props.maxlength}\n placeholder={sPlaceholder.value}\n disabled={getDisabled.value}\n clearable={props.clearable}\n onInput={handleInput}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onClear={handleClear}\n onKeydown={handleKeyDown}\n class={prefixCls}\n style={{ display: props.visible ? '' : 'none' }}>\n {{\n prefix: () => renderPrefixIcon(),\n suffix: () => renderSuffixIcon(),\n }}\n </ElInput>\n );\n };\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-input';\n .#{$prefixCls} {\n display: flex;\n margin: 0;\n align-items: center;\n\n &.is-disabled {\n :deep(.el-input__inner) {\n color: $textColor;\n }\n }\n\n :deep(.el-input__inner) {\n &:focus {\n // border-color: var(--primaryColorHover, $primaryColorHover);\n }\n //height: 30px;\n // padding-left: 10px;\n //line-height: 30px;\n //font-size: $textSizeSecondary;\n }\n\n &.el-input--small {\n :deep(.el-input__inner) {\n //height: 26px;\n //line-height: 26px;\n }\n }\n\n :deep(.el-input__suffix .el-input__suffix-inner) {\n .el-input__count {\n font-size: 10px;\n padding-left: 5px;\n .el-input__count-inner {\n padding: 0;\n }\n }\n .el-input__icon {\n padding: 0;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvInput from './src/GvInput.vue';\n\nconst GvInputPlugin = {\n install(app: App): void {\n app.component(GvInput.name ?? 'GvInput', GvInput);\n },\n};\nexport default GvInputPlugin;\n\nexport { GvInput };\n","<!--\n * @title: input number component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:32:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-12 12:07:39\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\n import { ElInputNumber, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('input-number');\n\n export default defineComponent({\n name: 'GvInputNumber',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n value: {\n type: Number,\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n min: {\n type: Number,\n default: undefined,\n },\n max: {\n type: Number,\n default: undefined,\n },\n size: {\n type: String as PropType<ComponentSize>,\n required: false,\n default: undefined,\n },\n step: {\n type: Number,\n default: 1,\n },\n stepStrictly: {\n type: Boolean,\n default: false,\n },\n precision: {\n type: Number,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n bizType: {\n type: String,\n default: undefined,\n },\n position: {\n type: String,\n default: undefined,\n },\n },\n // @emit\n emits: ['update:modelValue', 'input', 'blur', 'focus', 'keydown', 'change'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useI18n();\n const inputValue = ref(props.value);\n const globalSize = useGlobalConfig('size');\n // @computed\n const inputSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sPlaceHolder = computed(() => (props.placeholder ? props.placeholder : t('common.pleaseInput')));\n const getDisabled = computed(() => props.disabled);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n const handleInput = (val) => {\n emit('update:modelValue', val, props.vref);\n emit('input', val, props.vref);\n };\n const handleBlur = ($event: FocusEvent) => {\n if (props.bizType === 'tableedit') emit('blur', $event, inputValue.value, props.columnProp);\n else emit('blur', $event, inputValue.value, props.vref);\n };\n\n const handleFocus = ($event: FocusEvent) => {\n if ($event.target) ($event.target as HTMLInputElement).select();\n\n if (props.bizType === 'tableedit') emit('focus', $event, inputValue.value, props.columnProp);\n else emit('focus', $event, inputValue.value, props.vref);\n };\n // const handleKeyDown = ($event: KeyboardEvent) => {\n // emit('keydown', $event);\n // };\n const handleChange = (currentValue: number, oldValue: number) => {\n emit('change', currentValue, oldValue);\n };\n\n // @render\n // 注意方法的传参必须使用箭头函数方式,避免每次 render 的时候都会自动执行一次方法\n return () => (\n // nativeOnkeydown={(e) => this.inputKeydown(e)}\n <ElInputNumber\n class={prefixCls}\n ref={props.vref || 'gv-input-number'}\n id={resolvedInputId.value}\n name={props.name}\n modelValue={inputValue.value}\n onUpdate:modelValue={(v: number) => (inputValue.value = v)}\n style={{ display: props.visible ? '' : 'none' }}\n size={inputSize.value}\n placeholder={sPlaceHolder.value}\n disabled={getDisabled.value}\n controls-position={props.position}\n step={props.step}\n step-strictly={props.stepStrictly}\n precision={props.precision}\n min={props.min}\n max={props.max}\n // onKeydown={handleKeyDown}\n onInput={handleInput}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onChange={handleChange}\n // { ...this.$attrs }\n // { ...this.$listeners }\n />\n );\n },\n });\n</script>\n<style scoped lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-input-number';\n .#{$prefixCls} {\n :deep(.el-input__inner) {\n //height: 30px;\n //line-height: 30px;\n\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n :deep(.el-input-number__decrease),\n :deep(.el-input-number__increase) {\n height: 28px;\n line-height: 28px;\n }\n\n :deep(.el-input-number__decrease),\n :deep(.el-input-number__increase) {\n color: var(--primaryColorHover, $primaryColorHover);\n }\n\n :deep(.el-input-number__increase):hover:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled),\n :deep(.el-input-number__decrease):hover:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled) {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n &.is-controls-right {\n // line-height: 34px; // 需要定义line-height,否则高度串行\n :deep(.el-input-number__decrease) {\n bottom: 1px;\n\n &:hover {\n color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n :deep(.el-input-number__increase) {\n &:hover {\n color: var(--primaryColorHover, $primaryColorHover);\n }\n\n top: 1px;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvInputNumber from './src/GvInputNumber.vue';\nconst GvInputNumberPlugin = {\n install(app: App): void {\n app.component(GvInputNumber.name ?? 'GvInputNumber', GvInputNumber);\n },\n};\nexport default GvInputNumberPlugin;\n\nexport { GvInputNumber };\n","<!--\n * @title: select component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-29 09:36:14\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:53:12\n * @version: 1.0.7\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useNotify } from '@/hook/web/useNotify';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { ElOption, ElSelect, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import { useI18n } from 'vue-i18n';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('select');\n export default defineComponent({\n name: 'GvSelect',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: [String, Array, Object] as PropType<string | unknown[] | Record<string, unknown>>,\n default: undefined,\n },\n value: {\n type: [String, Array, Object] as PropType<string | unknown[] | Record<string, unknown>>,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n showLabel: {\n type: [String, Array],\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined, // 请选择\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n multiple: {\n type: Boolean,\n default: false,\n },\n filterable: {\n type: Boolean,\n default: true,\n },\n dicType: {\n type: String,\n required: true,\n },\n filtercode: {\n // 过滤字典码\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n dicRemote: {\n type: Function,\n default: () => {},\n },\n cb: {\n type: Function,\n default: () => {},\n },\n clear: {\n type: Function,\n default: () => {},\n },\n isreload: {\n type: Boolean,\n default: true,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n bizType: {\n type: String,\n default: undefined,\n },\n editRow: {\n type: Object,\n default: () => {},\n },\n collapseTags: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n },\n // define emit\n emits: ['update:modelValue', 'focus', 'clear', 'change'],\n setup(props, { emit }) {\n const userStore = useUserStore();\n const appStore = useAppStore();\n const { alert } = useNotify();\n const { t, locale } = useI18n();\n\n // @data\n const lang = locale.value;\n let dicIcon = 'iconfont gv-icon-shujuzidian3';\n const remote = ref(false);\n const loading = ref(false);\n const loadingText = ref('loading...');\n const sPlaceholder = computed(() => props.placeholder || t('common.all'));\n const externalValue = computed(() => (props.modelValue !== undefined ? props.modelValue : props.value));\n const inputValue = ref(externalValue.value);\n const inputShowLabel = ref(props.showLabel);\n const inputFilterable = ref(props.filterable);\n // let inputFilterable = props.filterable,\n type SelectModel = string | unknown[] | Record<string, unknown> | undefined;\n const selectValue = ref<SelectModel>(undefined);\n const options = ref<DicItem[]>([]);\n const originOptions = ref<DicItem[]>([]);\n const className = ref(`${prefixCls}`);\n const globalSize = useGlobalConfig('size');\n\n // 表选字典 t# 需在 setup 阶段识别,不能等 mounted\n const dicSrc = props.dicType?.toLowerCase() ?? '';\n if (dicSrc.startsWith('e#')) dicIcon = 'iconfont gv-icon-meiju';\n else if (dicSrc.startsWith('t#')) {\n dicIcon = 'iconfont gv-icon-24gl-table';\n remote.value = true;\n className.value = 'gv-select__table';\n }\n if (props.bizType === 'tableedit') className.value += ' tableedit';\n\n const valueCache = new Map<string, { value: string; label: string; row?: Record<string, unknown> }>();\n\n // @computed\n const selectSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @method\n\n const isEmptyLabel = (label: unknown) => label == null || label === '';\n\n const getDictItemLabel = (item: DicItem): string => {\n switch (locale.value) {\n case 'en':\n return item.e ?? item.t ?? '';\n case 'l1':\n return item.l1 ?? item.t ?? '';\n case 'l2':\n return item.l2 ?? item.t ?? '';\n default:\n return item.t ?? '';\n }\n };\n\n const formatOptionLabel = (label: string) => {\n if (!label) return '';\n return remote.value && label.includes('[') ? label.split('[')[0] : label;\n };\n\n const findLabelInOptions = (code: string, opts: DicItem[]) => {\n const item = opts.find((x) => String(x.c) === String(code));\n if (!item) return '';\n return formatOptionLabel(getDictItemLabel(item));\n };\n\n const getOptionValue = (code: string, label: string, row?: Record<string, unknown>) => {\n const key = String(code);\n const text = String(label || key);\n const cached = valueCache.get(key);\n if (cached && cached.label === text) {\n if (row) cached.row = row;\n return cached;\n }\n const obj = row ? { value: key, label: text, row } : { value: key, label: text };\n valueCache.set(key, obj);\n return obj;\n };\n\n const getSelectCode = (v: unknown) => {\n if (v == null || v === '') return '';\n if (typeof v === 'object' && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const code = o.value ?? o.c ?? o.code;\n return code == null || code === '' ? '' : String(code).trim();\n }\n return String(v).trim();\n };\n\n const getSelectLabel = (v: unknown) => {\n if (v == null || v === '') return '';\n if (typeof v === 'object' && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const label = o.label ?? o.v;\n return label == null || label === '' ? '' : String(label).trim();\n }\n return String(v).trim();\n };\n\n const isEmptySelectValue = (raw: unknown) => {\n if (raw == null || raw === '') return true;\n if (Array.isArray(raw)) {\n if (raw.length === 0) return true;\n return raw.every((item) => {\n if (item == null || item === '') return true;\n return !getSelectCode(item) && isEmptyLabel(getSelectLabel(item));\n });\n }\n if (typeof raw === 'object') return !getSelectCode(raw) && isEmptyLabel(getSelectLabel(raw));\n return false;\n };\n\n const syncEmptyToParent = () => {\n if (externalValue.value === '') return;\n emit('update:modelValue', '');\n };\n\n const elSelectModel = computed<SelectModel>(() => (isEmptySelectValue(selectValue.value) ? undefined : selectValue.value));\n\n /**\n * @todo: 远程搜索、聚焦、清空后保留当前选中项\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-04 10:52:44\n * @param {*} _opts\n */\n const mergeOptionsWithSelected = (_opts: DicItem[]) => {\n let merged = _opts ?? [];\n const append = (code: string, label: string) => {\n if (!code || merged.some((x) => x.c + '' === code)) return;\n merged = [{ c: code, t: label || code, s: '' } as DicItem, ...merged];\n };\n const sv = selectValue.value;\n if (Array.isArray(sv)) sv.forEach((item) => append(getSelectCode(item), getSelectLabel(item) || getSelectCode(item)));\n else if (sv && !isEmptySelectValue(sv)) append(getSelectCode(sv), getSelectLabel(sv) || getSelectCode(sv));\n return merged;\n };\n\n const pushDefaultOption = (op: DicItem) => {\n options.value.push(op);\n if (remote.value) originOptions.value.push({ ...op });\n };\n\n /**\n * @todo: load dict list\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:31:44\n */\n const getSelectOptions = async () => {\n if (!props.dicType) return null;\n else {\n let ret: DicItem[] = [];\n const src = props.dicType.toLowerCase();\n if (src.startsWith('e#')) {\n // const pinyin = await require('js-pinyin');\n // 生成枚举类型字典\n const arr = src.split('#')[1].split(':');\n arr.forEach((x) => {\n const xx: DicItem = {\n c: '',\n t: '',\n s: '',\n };\n const arr2 = x.split('=');\n xx['c'] = arr2[0];\n xx['t'] = arr2[1];\n xx['s'] = '';\n ret.push(xx);\n });\n return ret;\n } else {\n const dictCache = userStore.dictCache?.[src];\n if (props.filtercode === undefined && dictCache) ret = dictCache;\n else if (props.dicType === 'xzqh') {\n // 生成字典列表\n const dict = appStore.getDictDivision;\n if (dict) {\n if (props.filtercode === undefined) {\n const cache = {};\n cache['key'] = 'xzqh';\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n }\n ret = dict;\n }\n } else {\n const dict = appStore.getDict[src];\n\n if (dict) {\n // fixme: 解决字典缓存不能缓存多个问题 2022-04-13\n if (props.filtercode === undefined) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n }\n\n ret = dict;\n }\n }\n\n // 设置是否可搜索\n // this.setFilterable(ret);\n // 增加字典码过滤\n let opts = ret;\n if (props.filtercode) {\n const reg = new RegExp(props.filtercode, 'i');\n opts = ret.filter((x) => reg.test(x.c));\n }\n return opts;\n }\n }\n };\n /**\n * @todo: 设置字典项目超过5个可搜索-- 弃用\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-10 09:42:19\n * @param {*} dict\n */\n // setFilterable(dict) {\n // if (dict && dict.length > 5)\n // inputFilterable.value = true;\n // },\n // 回调参数:(value: string | number)\n // 字典自定义过滤方法\n const filterMethod = (value) => {\n if (value)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts.filter((item) => {\n // console.log(item);\n if (\n item.c.indexOf(value) !== -1 || // value检索\n item.t?.indexOf(value) !== -1 || // label检索\n item.s.indexOf(value.toLowerCase()) !== -1 // 简拼检索\n )\n return true;\n });\n });\n else\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n };\n /**\n * @todo: handle clear event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:27\n */\n const handleClear = () => {\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n else options.value = mergeOptionsWithSelected(originOptions.value);\n\n props.clear(selectValue.value, props.vref, props.dicType);\n emit('clear');\n };\n /**\n * @todo: remote dict search method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:20:03\n * @param {*} query\n */\n const initialRemoteLoaded = ref(false);\n let pendingRemoteQuery: string | null = null;\n let pendingRemotePromise: Promise<void> | null = null;\n let remoteRequestSeq = 0;\n\n const filterOriginOptions = (query: string) =>\n originOptions.value.filter((x) => {\n if (x.t) {\n const f = x.t.split(']');\n if (f[0].indexOf(query) !== -1) return true;\n }\n if (x.c && x.c.indexOf(query) !== -1) return true;\n return false;\n });\n\n const remoteDictSearch = async (query = ''): Promise<void> => {\n if (pendingRemotePromise && pendingRemoteQuery === query) return pendingRemotePromise;\n\n const requestSeq = ++remoteRequestSeq;\n pendingRemoteQuery = query;\n\n pendingRemotePromise = (async () => {\n loading.value = true;\n try {\n const sDicType = props.dicType.substring(2);\n const { datas } = await props.dicRemote(sDicType, query, props.editRow);\n if (requestSeq !== remoteRequestSeq) return;\n\n const ops: DicItem[] = [];\n try {\n JSON.parse(datas).forEach((x: any) => {\n ops.push({ c: x.c, t: x.t, s: '' } as DicItem);\n });\n } catch (e) {\n console.log(e);\n }\n\n options.value = mergeOptionsWithSelected(ops);\n originOptions.value = [...options.value];\n initialRemoteLoaded.value = true;\n } finally {\n if (requestSeq === remoteRequestSeq) {\n loading.value = false;\n loadingText.value = options.value.length === 0 ? t('common.noData') : t('common.loading');\n }\n if (pendingRemoteQuery === query) {\n pendingRemoteQuery = null;\n pendingRemotePromise = null;\n }\n }\n })();\n\n return pendingRemotePromise;\n };\n /**\n * @todo: table dict remote load method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:11:51\n */\n const remoteMethod = async (query = ''): Promise<void> => {\n const q = String(query ?? '');\n\n if (q && originOptions.value.length > 0 && props.isreload === false) {\n const filtered = filterOriginOptions(q);\n if (filtered.length > 0) {\n options.value = mergeOptionsWithSelected(filtered);\n loading.value = false;\n return;\n }\n }\n\n const needFetch = q !== '' || props.isreload || !initialRemoteLoaded.value || originOptions.value.length === 0;\n if (!needFetch) {\n options.value = mergeOptionsWithSelected(originOptions.value);\n loading.value = false;\n return;\n }\n\n await remoteDictSearch(q);\n };\n\n const ensureDefaultOption = (code: string, text: string) => {\n if (!code) return;\n const existed = options.value.find((x) => String(x.c) === String(code));\n if (existed) {\n if (text && existed.t !== text) existed.t = text;\n return;\n }\n pushDefaultOption({ c: code, t: text || code, s: '' } as DicItem);\n };\n\n const resolveDisplayLabel = async (code: string, hint?: string): Promise<string> => {\n if (hint && hint !== code) return hint;\n const localOpts = (await getSelectOptions()) ?? [];\n let label = findLabelInOptions(code, localOpts);\n if (label) return label;\n\n label = findLabelInOptions(code, options.value);\n if (label) return label;\n\n if (remote.value && code) {\n // await remoteDictSearch(code);\n // label = findLabelInOptions(code, options.value);\n // if (label) return label;\n // await remoteDictSearch('');\n // label = findLabelInOptions(code, options.value);\n }\n\n return label || code;\n };\n\n const applySelectValue = async (raw: unknown) => {\n if (isEmptySelectValue(raw)) {\n inputValue.value = undefined as typeof inputValue.value;\n selectValue.value = undefined;\n syncEmptyToParent();\n return;\n }\n inputValue.value = raw as typeof inputValue.value;\n\n if (Array.isArray(raw)) {\n const resolved: ReturnType<typeof getOptionValue>[] = [];\n for (let index = 0; index < raw.length; index++) {\n const item = raw[index];\n if (item === '') continue;\n const code = getSelectCode(item);\n let hint = getSelectLabel(item);\n if (isEmptyLabel(hint) || hint === code) {\n const showLbl = Array.isArray(props.showLabel) ? props.showLabel[index] : undefined;\n if (showLbl && showLbl !== code) hint = String(showLbl);\n }\n const text = await resolveDisplayLabel(code, isEmptyLabel(hint) || hint === code ? undefined : hint);\n const row = typeof item === 'object' && item !== null ? ((item as Record<string, unknown>).row as Record<string, unknown>) : undefined;\n resolved.push(getOptionValue(code, text, row));\n ensureDefaultOption(code, text);\n }\n selectValue.value = resolved;\n return;\n }\n\n const code = getSelectCode(raw);\n let hint = '';\n if (typeof raw === 'object' && raw !== null) {\n const o = raw as Record<string, unknown>;\n hint = String(o.label ?? o.v ?? '');\n } else if (typeof props.showLabel === 'string') hint = props.showLabel;\n const text = await resolveDisplayLabel(code, isEmptyLabel(hint) || hint === code ? undefined : hint);\n const row = typeof raw === 'object' && raw !== null ? ((raw as Record<string, unknown>).row as Record<string, unknown>) : undefined;\n selectValue.value = getOptionValue(code, text, row);\n ensureDefaultOption(code, text);\n };\n\n watch(\n externalValue,\n (newValue) => {\n void applySelectValue(newValue);\n },\n { deep: true, immediate: true },\n );\n\n watch(\n () => props.showLabel,\n (newVal) => {\n inputShowLabel.value = newVal;\n if (!isEmptySelectValue(inputValue.value)) void applySelectValue(externalValue.value ?? inputValue.value);\n },\n );\n\n /**\n * @todo: handle focus event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:35\n * @param {*} event\n */\n const handleFocus = (event: FocusEvent) => {\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n if (remote.value === false)\n if (_opts === undefined || _opts === null || _opts.length === 0) {\n alert('The dict value does not exist', 'warning');\n return false;\n }\n options.value = _opts;\n });\n emit('focus', event);\n };\n\n /**\n * @todo: handle visible change event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:25:38\n * @param {*} val\n */\n const handleVisibleChange = () => {\n // console.log(val);\n };\n\n const handleBlur = () => {\n // // add: 解决无法重新加载问题 2022-04-10\n // if (this.remote === false)\n // this.getSelectOptions().then((_opts) => {\n // this.options = _opts;\n // });\n // else\n // this.options = this.originOptions;\n };\n\n /**\n * @todo: render select option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:37:58\n * @param {*} x\n */\n const renderSelectOption = (x: DicItem) => {\n let t = x.t;\n switch (lang) {\n case 'zh-CN':\n t = x.t;\n break;\n case 'en':\n t = x.e;\n break;\n case 'l1':\n t = x.l1;\n break;\n case 'l2':\n t = x.l2;\n break;\n default:\n t = x.t;\n break;\n }\n if (!t) t = x.t;\n return (\n <ElOption\n key={x.c + ''}\n label={t}\n value={getOptionValue(x.c + '', t ?? '')}>\n <span class=\"gv-select__option--label\">{t}</span>\n <span class=\"gv-select__option--value\">{x.c}</span>\n </ElOption>\n );\n };\n\n /**\n * @todo: render table option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:44:34\n * @param {*} x\n */\n const renderTableOption = (x: DicItem) => {\n const t = x.t;\n let val = t;\n const columnTexts: string[] = [];\n const row: Record<string, string> = {};\n let multiColumn = false;\n if (t) {\n if (t.indexOf('[') !== -1) {\n // 多列显示\n multiColumn = true;\n const v1 = t.split('[');\n val = v1[0];\n let mm = v1[1];\n mm = mm.split(']')[0];\n const m2 = mm.split(',');\n for (let i = 0; i < m2.length; i++) {\n const m3 = m2[i];\n const m4 = m3.split(':');\n row[m4[0]] = m4[1];\n columnTexts.push(m4[1] === 'null' ? ' -- ' : m4[1]);\n }\n }\n if (t.indexOf('{') !== -1) {\n // 隐藏列\n const vv1 = t.split('{');\n if (multiColumn === false) val = vv1[0];\n let mmm = vv1[1];\n mmm = mmm.split('}')[0];\n const mm2 = mmm.split(',');\n for (let i = 0; i < mm2.length; i++) {\n const mm3 = mm2[i];\n const mm4 = mm3.split(':');\n row[mm4[0]] = mm4[1];\n }\n }\n }\n let key = x.c + '';\n if (props.multiple === true) key = x.val === undefined ? x.c + '' : String(x.val);\n return (\n <ElOption\n key={key}\n label={val}\n value={getOptionValue(x.c + '', val ?? '', row)}>\n <span class=\"gv-select__option--label\">{val}</span>\n <span class=\"gv-select__option--value\">{x.c}</span>\n {columnTexts.map((text, index) => (\n <span\n key={index}\n class=\"gv-select__option--column\">\n {text}\n </span>\n ))}\n </ElOption>\n );\n };\n\n /**\n * @todo: selected call back\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:27:07\n * @param {*} val\n */\n const handleChange = async (val: any) => {\n if (isEmptySelectValue(val)) return;\n let labels: string = '';\n const labelArr: string[] = [];\n if (props.multiple === true)\n options.value.forEach((x) => {\n if (Array.isArray(val) && val.some((ele) => ele === x.c)) labelArr.push(x.t ?? '');\n });\n else if (typeof val === 'object') labels = val.label ?? '';\n else {\n const opArr = options.value.filter((x) => {\n const v = val + '';\n return x.c + '' === v;\n });\n labels = opArr[0]?.t ?? '';\n if (labels) labels = labels.split('[')[0];\n }\n if (props.bizType === 'tableedit')\n if (props.multiple === true) {\n emit('change', val, labelArr, props.columnProp);\n await props.cb(val, props.columnProp, props.dicType, labelArr, props.editRow);\n } else {\n emit('change', val, labels, props.columnProp);\n await props.cb(val, props.columnProp, props.dicType, labels, props.editRow);\n }\n else if (props.multiple === true) {\n emit('change', val, labelArr);\n await props.cb(val, props.vref, props.dicType);\n } else {\n emit('change', val, labels);\n await props.cb(val, props.vref, props.dicType);\n }\n };\n /**\n * @todo: handle update modelValue\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 11:29:17\n * @param {*} value\n */\n const handleUpdate = (value: any): void => {\n if (isEmptySelectValue(value)) {\n inputValue.value = undefined as typeof inputValue.value;\n selectValue.value = undefined;\n emit('update:modelValue', '');\n return;\n }\n inputValue.value = value;\n selectValue.value = value;\n emit('update:modelValue', value);\n };\n\n if (props.dicType === undefined || props.dicType === null) alert(`[ ${props.label} ] - The dicType needs to be set`, 'warning');\n\n // @render\n return () => {\n const render =\n remote.value === false ? (\n <ElSelect\n ref=\"gv-select\"\n id={resolvedInputId.value}\n name={props.name}\n modelValue={elSelectModel.value}\n valueKey=\"value\"\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={sPlaceholder.value}\n disabled={props.disabled}\n clearable={props.clearable}\n size={selectSize.value}\n multiple={props.multiple}\n filterable={inputFilterable.value}\n filter-method={filterMethod}\n default-first-option={true}\n collapseTags={props.collapseTags}\n onClear={handleClear}\n onFocus={handleFocus}\n onVisible-change={handleVisibleChange}\n onChange={handleChange}\n class={className.value}>\n {{\n prefix: () => <i class={dicIcon}></i>,\n default: () => options.value.map((x) => renderSelectOption(x)),\n }}\n </ElSelect>\n ) : (\n <ElSelect\n ref=\"gv-select\"\n id={resolvedInputId.value}\n name={props.name}\n modelValue={elSelectModel.value}\n valueKey=\"value\"\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={sPlaceholder.value}\n disabled={props.disabled}\n clearable={props.clearable}\n size={selectSize.value}\n multiple={props.multiple}\n default-first-option={true}\n filterable={inputFilterable.value}\n remote={true}\n remote-method={remoteMethod}\n debounce={300}\n loading={loading.value}\n loading-text={loadingText.value}\n collapseTags={props.collapseTags}\n onClear={handleClear}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n class={className.value}>\n {{\n prefix: () => <i class={dicIcon}></i>,\n default: () => options.value.map((x) => renderTableOption(x)),\n }}\n </ElSelect>\n );\n return render;\n };\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-select';\n .#{$prefixCls} {\n vertical-align: middle; // fixme: 注意必须有这个参数,否则作为一行最后的列会导致串行\n :deep(.el-select__wrapper) {\n &.is-focus {\n .el-input__inner {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n .el-select__prefix {\n left: 5px !important;\n width: 15px !important;\n\n .iconfont {\n //font-size: $appTextSize;\n }\n }\n\n .el-select__placeholder {\n //font-size: $appTextSize;\n }\n }\n\n &.tableedit {\n :deep(.el-select__wrapper) {\n .el-select__input {\n padding-right: 5px !important;\n //font-size: $appTextSize;\n }\n\n .el-select__suffix {\n width: 0;\n }\n }\n }\n }\n\n .#{$gvNamespace}-select__table {\n vertical-align: middle; // fixme: 注意必须有这个参数,否则作为一行最后的列会导致串行\n :deep(.el-select__wrapper) {\n .el-select__prefix {\n left: 5px !important;\n width: 15px !important;\n\n .iconfont {\n //font-size: $appTextSize;\n }\n }\n .el-select__selection {\n //font-size: $appTextSize;\n }\n\n &.is-focus .el-select__input {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n &.tableedit {\n :deep(.el-select__wrapper) {\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSelect from './src/GvSelect.vue';\n// Define the install method on the GvButton component\nconst GvSelectPlugin = {\n install(app: App): void {\n app.component(GvSelect.name ?? 'GvSelect', GvSelect);\n },\n};\nexport default GvSelectPlugin;\n\nexport { GvSelect };\n","<!--\n * @title: switch component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 13:26:26\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-12 09:55:07\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElSwitch } from 'element-plus';\n import { defineComponent, ref, watch, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('switch');\n export default defineComponent({\n name: 'GvSwitch',\n props: {\n value: {\n type: [Boolean, Number, String] as PropType<boolean | number | string>,\n required: false,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n columnKey: {\n type: String,\n required: false,\n default: undefined,\n },\n target: {\n type: [Number, String] as PropType<number | string>,\n require: false,\n default: '100201',\n },\n },\n\n // emit\n emits: ['change'],\n setup(props, { emit }) {\n // @data\n const val = ref(props.value);\n const switchType = ref(true);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n val.value = newVal;\n switchType.value = val.value === props.target;\n },\n );\n watch(\n () => switchType.value,\n (newVal) => {\n val.value === newVal;\n },\n );\n\n // @methods\n const handleChange = (newStatus) => {\n emit('change', newStatus, val.value);\n };\n\n // @created\n switchType.value = val.value === props.target;\n\n // @render\n return () => (\n <ElSwitch\n ref=\"gv-switch\"\n v-model={switchType.value}\n key={props.columnKey}\n disabled={props.disabled}\n // active-color='#13ce66'\n // inactive-color='#ff4949'\n onChange={handleChange}\n class={prefixCls}\n />\n );\n },\n });\n</script>\n<style scoped lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-switch';\n .#{$prefixCls} {\n &.is-checked {\n :deep(.el-switch__core) {\n background-color: #13ce66;\n border-color: #13ce66;\n }\n }\n\n :deep(.el-switch__core) {\n background-color: #b3aaaa;\n border-color: #b3aaaa;\n //background-color:#ff4949;\n //border-color:#ff4949;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSwitch from './src/GvSwitch.vue';\n// Define the install method on the GvButton component\nconst GvSwitchPlugin = {\n install(app: App): void {\n app.component(GvSwitch.name ?? 'GvSwitch', GvSwitch);\n },\n};\nexport default GvSwitchPlugin;\n\nexport { GvSwitch };\n","<!--\n * @title: time picker\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 09:18:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 13:47:53\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import { ElTimePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TTimePickerSize, TTimePickerType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('timepicker');\n\n export default defineComponent({\n name: 'GvTimePicker',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: [Date, Array, String] as PropType<TTimePickerType>,\n default: undefined,\n },\n readonly: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<TTimePickerSize>,\n default: 'default',\n },\n isRange: {\n type: Boolean,\n default: false,\n },\n disabledHours: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n disabledMinutes: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n disabledSeconds: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n rangeSeparator: {\n type: String,\n default: '-',\n },\n format: {\n type: String,\n default: 'HH:mm',\n },\n valueFormat: {\n type: String,\n default: 'HH:mm',\n },\n placeholder: {\n type: String,\n default: '00:00',\n },\n startPlaceholder: {\n type: String,\n default: '',\n },\n endPlaceholder: {\n type: String,\n default: '',\n },\n editable: {\n type: Boolean,\n default: true,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n },\n\n emits: ['update:modelValue', 'change', 'blur', 'focus'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useBridgeI18n();\n const globalSize = useGlobalConfig('size');\n const inputValue = ref<TTimePickerType>(props.modelValue);\n const timepickerSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n /**\n *@todo: 更新v-model值\n *@author: bugcao\n *@date: 2026-05-07 15:45:52\n *@version: v0.0.1\n */\n const handleUpdate = (value: TTimePickerType) => {\n inputValue.value = value;\n emit('update:modelValue', value);\n };\n /**\n *@todo: 合并禁用小时\n *@author: bugcao\n *@date: 2026-05-08 09:02:30\n *@version: v0.0.1\n */\n const mergedDisabledHours = () => props.disabledHours;\n /**\n *@todo: 合并禁用分钟\n *@author: bugcao\n *@date: 2026-05-08 09:02:30\n *@version: v0.0.1\n */\n const mergedDisabledMinutes = () => props.disabledMinutes;\n /**\n *@todo: 合并禁用秒\n *@author: bugcao\n *@date: 2026-05-08 09:02:30\n *@version: v0.0.1\n */\n const mergedDisabledSeconds = () => props.disabledSeconds;\n /**\n *@todo: 更新change事件\n *@author: bugcao\n *@date: 2026-05-07 15:46:09\n *@version: v0.0.1\n */\n const handleChange = (value: TTimePickerType) => {\n emit('change', value);\n };\n /**\n *@todo: 更新blur事件\n *@author: bugcao\n *@date: 2026-05-07 15:46:12\n *@version: v0.0.1\n */\n const handleBlur = (e: FocusEvent) => {\n emit('blur', e);\n };\n /**\n *@todo: 更新focus事件\n *@author: bugcao\n *@date: 2026-05-07 15:46:12\n *@version: v0.0.1\n */\n const handleFocus = (e: FocusEvent) => {\n emit('focus', e);\n };\n\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @render\n return () => (\n <div class={prefixCls}>\n <ElTimePicker\n ref={props.vref || 'gv-timepicker'}\n id={resolvedInputId.value}\n name={props.name}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleUpdate}\n readonly={props.readonly}\n disabled={props.disabled}\n editable={props.editable}\n clearable={props.clearable}\n is-range={props.isRange}\n range-separator={props.rangeSeparator}\n size={timepickerSize.value}\n placeholder={props.placeholder || t('common.selectTime')}\n start-placeholder={props.startPlaceholder || t('common.startTime')}\n end-placeholder={props.endPlaceholder || t('common.endTime')}\n format={props.format}\n value-format={props.valueFormat}\n disabled-hours={mergedDisabledHours}\n disabled-minutes={mergedDisabledMinutes}\n disabled-seconds={mergedDisabledSeconds}\n {...({\n onChange: handleChange,\n onBlur: handleBlur,\n onFocus: handleFocus,\n } as any)}\n />\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-timepicker';\n .#{$prefixCls} {\n width: 100%;\n vertical-align: middle;\n :deep(.el-icon-time) {\n margin-left: 1px;\n }\n &.el-range-editor.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n :deep(.el-input__wrapper) {\n &:is(.is-focus) {\n box-shadow: 0 0 0 1px var(--primaryColorHover, $primaryColorHover) inset;\n }\n }\n :deep(.el-input__inner) {\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n :deep(.el-range__close-icon) {\n width: 20px;\n }\n :deep(.el-range-separator) {\n padding-right: 2px;\n padding-left: 0;\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTimePicker from './src/GvTimePicker.vue';\n\nconst GvTimePickerPlugin = {\n install(app: App): void {\n app.component(GvTimePicker.name ?? 'GvTimePicker', GvTimePicker);\n },\n};\nexport default GvTimePickerPlugin;\n\nexport { GvTimePicker };\n","/*\n * @title: info message component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:10:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-04 22:01:59\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nconst infoMsg = {\n carNo: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '车牌号格式错误';\n else info = 'car number format error.';\n return info;\n },\n double: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入浮点数.';\n else info = 'please enter Double.';\n return info;\n },\n decimal: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh-CN') info = '小数点位数不能超过: ' + len + ' 位';\n else info = 'Number of decimal places can not be more than:' + len + '.';\n return info;\n },\n idCard: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '身份证格式不正确';\n else info = 'id card format is not correct.';\n return info;\n },\n maxLen: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能超过 ' + Math.floor(len / 2) + '个汉字或 ' + len + ' 个字符';\n else info = 'Can not exceed ' + len + ' character.';\n return info;\n },\n money: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '非0开头的数字 小数最多两位.';\n else info = \"Only input Numbers, 0 can't start, the decimal two at the most.\";\n return info;\n },\n moneyMax: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh-CN') info = '整数位最多只能是: ' + len + ' 位';\n else info = 'integer digits can only be at most: ' + len;\n return info;\n },\n letter: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能输入字母以外的字符';\n else info = \"Can't input letters outside of the characters.\";\n return info;\n },\n number: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '只能输入正整数.';\n else info = 'Only enter a positive integer.';\n return info;\n },\n number0: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '只能输入不能以0开头的正整数.';\n else info = 'Only enter a non-zero positive integer, and cannot begin with zero.';\n return info;\n },\n //Add TypeScript type annotations for lang parameter\n numberLetter: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能输入数字、字母以外的字符.';\n else info = 'Can not input Numbers, letters characters.';\n return info;\n },\n //Add TypeScript type annotations for lang parameter\n name: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能输入数字、字母、-、_和中文以外的字符.';\n else info = 'Can not enter Numbers, letters, -, _ and Chinese characters.';\n return info;\n },\n phone: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '电话号码格式不正确.';\n else info = 'Phone format is not correct.';\n return info;\n },\n email: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '邮件格式不正确.';\n else info = 'E-mail format is not correct.';\n return info;\n },\n telephone: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的固话(格式:区号+号码,如010-1234567)';\n else info = 'Telephone format is not correct.';\n return info;\n },\n ip: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的IP地址';\n else info = 'IpAddress format is not correct.';\n return info;\n },\n url: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的url地址';\n else info = 'Url format is not correct.';\n return info;\n },\n phoneTel: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的电话号码或者固话号码';\n else info = 'phone & tel format is not correct.';\n return info;\n },\n vin: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入后8位或17位(字母大写)';\n else info = 'must be 8 or 17 letters and Numbers.';\n return info;\n },\n};\nexport default infoMsg;\n","/*\n * @title: validate rules component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:09:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-10 14:02:26\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n/** ------------------- 验证规则 ------------------------\n * isAny: 默认规则,无校验\n * isAdmin: 验证是否是admin用户\n * isUrl: 验证url格式\n * isLowercase: 验证是否都是小写\n * isUppercase: 验证是否都是大写\n * isLetter: 验证是否都是字母( 不包括标点符号)\n * isEmail: 验证是否是email\n * isPhone: 验证电话号码\n * isIp: 验证是否是ip地址\n * isPhoneTel: 验证是否是手机号或者固定电话号\n * isTelephone: 验证是否是固定电话\n * isIdcard: 验证身份证号\n * isMoney:验证金额格式\n * isBigMoney: 验证金额格式(千位符格式)\n * isNumber: 验证是否是整数数字\n * isNumberLetter: 验证是否是数字和字母\n * isDouble: 验证浮点数格式\n * isName: 验证是否是名称格式\n * isVin: 验证vin码格式\n * isCarno: 验证车牌号(含新能源)\n ----------------------------------------------------\n*/\n\nimport infoMsg from './gv.infomsg';\n\n/**\n * @todo: 计算输入字符串的长度,汉字记为2 英文字母记为1\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 14:56:22\n * @param {*} val 对于多选字典,val是数组类型的字典码\n */\nconst calLength = (val: string[] | string) => {\n if (val === null || val.length === 0) return 0;\n let i, sum;\n sum = 0;\n // fixme: val有可能是数组,需要转化为字符串 2022-04-10\n const v = Array.isArray(val) ? val.join(',') : val;\n for (i = 0; i < v.length; i++)\n if (v.charCodeAt(i) >= 32 && v.charCodeAt(i) <= 126) sum = sum + 1;\n else sum = sum + 2;\n\n return sum;\n};\n\nconst vcity = {\n 11: '北京',\n 12: '天津',\n 13: '河北',\n 14: '山西',\n 15: '内蒙古',\n 21: '辽宁',\n 22: '吉林',\n 23: '黑龙江',\n 31: '上海',\n 32: '江苏',\n 33: '浙江',\n 34: '安徽',\n 35: '福建',\n 36: '江西',\n 37: '山东',\n 41: '河南',\n 42: '湖北',\n 43: '湖南',\n 44: '广东',\n 45: '广西',\n 46: '海南',\n 50: '重庆',\n 51: '四川',\n 52: '贵州',\n 53: '云南',\n 54: '西藏',\n 61: '陕西',\n 62: '甘肃',\n 63: '青海',\n 64: '宁夏',\n 65: '新疆',\n 71: '台湾',\n 81: '香港',\n 82: '澳门',\n 91: '国外',\n};\n// 校验浮点数位数\nconst checkDecimal = function (val, decimalLen) {\n let v = val + '';\n if (v && v.indexOf('.') > 0) {\n v = v.substr(v.indexOf('.') + 1, v.length);\n if (v.length <= decimalLen) return true;\n else return false;\n } else return true;\n};\n// 取身份证前两位,校验省份\nconst checkProvince = function (card) {\n const province = card.substr(0, 2);\n if (vcity[province] === undefined) return false;\n\n return true;\n};\n\n// 校验日期\nconst verifyBirthday = function (year: number, month: number, day: number, birthday: Date) {\n const now = new Date();\n const now_year = now.getFullYear();\n // 年月日是否合理\n if (birthday.getFullYear() === +year && birthday.getMonth() + 1 === +month && birthday.getDate() === +day) {\n // 判断年份的范围(3岁到100岁之间)\n const time = now_year - Number(year);\n if (time >= 3 && time <= 100) return true;\n return false;\n }\n return false;\n};\n\n// 检查生日是否正确\nconst checkBirthday = function (card) {\n const len = card.length;\n // 身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字\n if (len === 15) {\n const re_fifteen = /^(\\d{6})(\\d{2})(\\d{2})(\\d{2})(\\d{3})$/;\n const arr_data = card.match(re_fifteen);\n const year = arr_data[2];\n const month = arr_data[3];\n const day = arr_data[4];\n const birthday = new Date('19' + year + '/' + month + '/' + day);\n return verifyBirthday(Number('19' + year), month, day, birthday);\n }\n // 身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X\n if (len === 18) {\n const re_eighteen = /^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$/;\n const arr_data = card.match(re_eighteen);\n const year = arr_data[2];\n const month = arr_data[3];\n const day = arr_data[4];\n const birthday = new Date(year + '/' + month + '/' + day);\n return verifyBirthday(year, month, day, birthday);\n }\n return false;\n};\n// 15位转18位身份证号\nconst changeFivteenToEighteen = function (card) {\n if (card.length === 15) {\n const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let cardTemp = 0;\n let i;\n card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);\n for (i = 0; i < 17; i++) cardTemp += card.substr(i, 1) * arrInt[i];\n\n card += arrCh[cardTemp % 11];\n return card;\n }\n return card;\n};\n\n// 校验位的检测\nconst checkParity = function (card) {\n // 15位转18位\n card = changeFivteenToEighteen(card);\n const len = card.length;\n if (len === 18) {\n const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let cardTemp = 0;\n let valnum = '';\n for (let i = 0; i < 17; i++) cardTemp += card.substr(i, 1) * arrInt[i];\n\n valnum = arrCh[cardTemp % 11];\n if (valnum === card.substr(17, 1)) return true;\n\n return false;\n }\n return false;\n};\n\nconst htValidate = {\n isLength: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language, max = 30 } = rule;\n const len = calLength(value);\n if (len > max) callback(new Error(infoMsg.maxLen(language, max)));\n else callback();\n }\n },\n isDouble: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const reg = /^(-)?\\d+(\\.\\d+)?$/;\n const { language, decimal = 2 } = rule;\n if (!reg.test(value)) callback(new Error(infoMsg.double(language)));\n else if (checkDecimal(value, decimal)) callback();\n else callback(new Error(infoMsg.decimal(language, decimal)));\n }\n },\n isIdcard: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n // 校验长度\n const reg = /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/;\n if (!reg.test(value)) callback(new Error(infoMsg.idCard(language)));\n else if (checkProvince(value) === false)\n // 检查省份\n callback(new Error(infoMsg.idCard(language)));\n else if (checkBirthday(value) === false)\n // 校验生日\n callback(new Error(infoMsg.idCard(language)));\n else if (checkParity(value) === false)\n // 检验位的检测\n callback(new Error(infoMsg.idCard(language)));\n else callback();\n }\n },\n\n isCarno: (rule, value, callback) => {\n const { language } = rule;\n if (value === '' || value === undefined || value == null) return callback();\n else if (value.length === 7) {\n const pattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;\n if (!pattern.test(value)) callback(new Error(infoMsg.carNo(language)));\n else return callback();\n } else {\n const pattern2 = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DABCEFGHJK][A-HJ-NP-Z0-9][0-9]{4}$))/;\n if (!pattern2.test(value)) callback(new Error(infoMsg.carNo(language)));\n else return callback();\n }\n },\n\n isMoney: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return callback();\n else {\n const { language, max } = rule;\n // eslint-disable-next-line no-useless-escape\n const pattern = /^[\\-\\+]?(([1-9]\\d*)|0)(\\.\\d{1,2})?$/;\n const val = value + '';\n // var rv = val.replace(/[,]/g, '');\n if (!pattern.exec(val)) callback(new Error(infoMsg.money(language)));\n else if (val.indexOf('.') > 0)\n if (val.split('.')[0].length > max - 3)\n // 校验整数位格式只能是maxLength -3\n callback(new Error(infoMsg.moneyMax(language, max - 3)));\n else return callback();\n else if (value.length > max - 3) callback(new Error(infoMsg.moneyMax(language, max - 3)));\n else return callback();\n }\n },\n\n isBigMoney: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n // eslint-disable-next-line no-useless-escape\n const reg = /^[\\-\\+]?([0-9]\\d*|0|[1-9]\\d{0,2}(,\\d{3})*)(\\.\\d+)?$/;\n if (!reg.test(value)) callback(new Error(infoMsg.money(language)));\n else callback();\n }\n },\n\n isLetter: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^[A-Za-z]+$/;\n if (!reg.test(value)) callback(new Error(infoMsg.letter(language)));\n else callback();\n }\n },\n\n isNumber: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^\\+?[0-9][0-9]*$/;\n if (!reg.test(value)) callback(new Error(infoMsg.number(language)));\n else callback();\n }\n },\n\n isNumber0: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^\\+?[1-9][0-9]*$/;\n if (!reg.test(value)) callback(new Error(infoMsg.number0(language)));\n else callback();\n }\n },\n\n isNumberLetter: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^([a-z]|[A-Z]|[ ]|[(]|[)]|[-]|[_]|[*]|[.]|[,]|[,]|[0-9]){0,200}$/;\n if (!reg.test(value)) callback(new Error(infoMsg.numberLetter(language)));\n else callback();\n }\n },\n\n isName: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^[a-zA-Z0-9-_. \\u4E00-\\u9FA5]{0,60}$/;\n if (!reg.test(value)) callback(new Error(infoMsg.name(language)));\n else callback();\n }\n },\n\n isPhone: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const reg = /^1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\\d{8}$/;\n if (!reg.test(value)) {\n const { language = 'zh-CN' } = rule;\n callback(new Error(infoMsg.phone(language)));\n } else callback();\n }\n },\n\n isEmail: (rule, value, callback) => {\n // eslint-disable-next-line no-useless-escape\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n // eslint-disable-next-line no-useless-escape\n const reg = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n if (!reg.test(value)) callback(new Error(infoMsg.email(language)));\n else callback();\n }\n },\n\n isTelephone: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /0\\d{2}-\\d{7,8}/;\n if (!reg.test(value)) callback(new Error(infoMsg.telephone(language)));\n else callback();\n }\n },\n\n isPhoneTel: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^((0\\d{2,3}-\\d{7,8})|(1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\\d{8}))$/;\n if (!reg.test(value)) callback(new Error(infoMsg.phoneTel(language)));\n else callback();\n }\n },\n\n isIp: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$/;\n if (!reg.test(value)) callback(new Error(infoMsg.ip(language)));\n else callback();\n }\n },\n\n isUrl: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg =\n /^(https?|ftp):\\/\\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+\\.?(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\\/($|[a-zA-Z0-9.,?'\\\\+&%$#=~_-]+))*$/;\n if (!reg.test(value)) callback(new Error(infoMsg.url(language)));\n else callback();\n }\n },\n\n isVin: (rule, value, callback) => {\n const { language } = rule;\n const reg = /^[A-Z0-9]+$/;\n if (value === '' || value === undefined || value == null) callback();\n else if (value.length !== 8 && value.length !== 17) callback(new Error(infoMsg.vin(language)));\n else if (!reg.test(value)) callback(new Error(infoMsg.vin(language)));\n else callback();\n },\n};\n\nexport default htValidate;\n","<!--\n * @title: form component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:01:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-12 18:17:12\n * @version: 1.1.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { useBridgeI18n } from '@@/bridge';\n import { GvCascader } from '@@/GvCascader';\n import { GvDatePicker } from '@@/GvDatePicker';\n import { GvDivider } from '@@/GvDivider';\n import { GvInput } from '@@/GvInput';\n import { GvInputNumber } from '@@/GvInputNumber';\n import { GvSelect } from '@@/GvSelect';\n import { GvSwitch } from '@@/GvSwitch';\n import { GvTimePicker } from '@@/GvTimePicker';\n import { addClass, dateFormatConfig, hasScrollbar, removeClass, sleep, toHump } from '@@/utils';\n import gvValidate from '@@/utils/gv.validate';\n import {\n ElCol,\n ElForm,\n ElFormItem,\n ElInput,\n ElRadio,\n ElRadioButton,\n ElRadioGroup,\n ElRow,\n ElTooltip,\n useGlobalConfig,\n type ComponentSize,\n type DatePickerType,\n type FormInstance,\n type FormItemRule,\n } from 'element-plus';\n import { computed, defineComponent, getCurrentInstance, nextTick, onMounted, provide, ref, Transition, unref, watch, type PropType, type VNode } from 'vue';\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('form');\n\n export default defineComponent({\n name: 'GvForm',\n props: {\n refForm: {\n type: String,\n required: true,\n },\n divider: {\n type: String,\n required: false,\n default: undefined,\n },\n isDivider: {\n type: Boolean,\n required: false,\n default: true,\n },\n formList: {\n type: Array as PropType<FormItem[]>,\n required: true,\n default: () => [],\n },\n size: {\n type: String as PropType<ComponentSize>,\n required: false,\n default: undefined,\n },\n labelWidth: {\n type: [Number, String] as PropType<number | string>,\n default: 100,\n },\n formStyle: {\n // 响应式布局 使用该参数定义width\n type: [Object],\n required: false,\n default: () => {},\n },\n scroller: {\n // 是否带有滚动条\n type: Boolean,\n required: false,\n default: true,\n },\n },\n setup(props, { slots, expose }) {\n const searchFieldsCollapsed = ref(true); // 查询 form 默认折叠超出行数字段\n // @provide\n provide('refForm', props.refForm);\n provide('formList', props.formList);\n provide('searchFieldsCollapsed', searchFieldsCollapsed);\n\n // @data\n const appStore = useAppStore();\n const userStore = useUserStore();\n const { t } = useBridgeI18n();\n\n const originFormList = ref([]);\n const instance = getCurrentInstance ? getCurrentInstance() : ({ parent: null } as any);\n\n const formRefs = ref<Record<string, FormInstance | null>>({}); // 表单实例引用,默认空对象\n const formElRef = ref<FormInstance | null>(null); // ElForm 元素引用\n\n const setFormRef = (el: FormInstance | null) => {\n formElRef.value = el;\n if (el && props.refForm) formRefs.value[props.refForm] = el;\n };\n const globalSize = useGlobalConfig('size');\n const rootNodeStyle = ref({}); // form组件根节点div样式\n const isShow = ref(true); // form表单show状态,默认显示\n const rules = ref({}); // 表单校验规则,默认空对象\n const isEditContainer = ref(false); // 是否是editContainer标签内,默认false\n const sMaxHeight = ref(0); // 表单最大高度,默认0\n const isScrollbar = ref(false); // 是否dialog中有滚动条\n const isAnchor = ref(false); // 是否锚点中列表\n const model = ref({}); // 表单数据,默认空对象\n const isDialog = ref(false); // 是否是dialog中form表单,默认false\n const colSpanNums = ref(0); // 根据form宽度或屏幕宽度计算显示列数,默认0\n const formType = ref('s'); // form类型:查询form:s、表单form:e\n const styles = ref({}); // form表单style样式,默认空对象\n\n // @computed\n\n const formSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const labelPosition = computed(() => appStore.labelPosition); // 表单label位置\n const searchDivider = computed(() => appStore.searchDivider); // search divider show,default: true\n const dict = computed<DicItems>(() => appStore.getDict); // 字典数据\n const dictCache = computed(() => userStore.dictCache); // 字典缓存\n /**\n * @todo: 查询 form 列默认折叠 class(单次遍历预计算,避免每项重复循环)\n */\n const searchColClassMap = computed(() => {\n if (formType.value !== 's' || !searchFieldsCollapsed.value) return {} as Record<number, string>;\n const slot = slots.default?.()?.[0];\n const slotProps = slot?.props as Recordable | undefined;\n if (slotProps?.expand === false) return {} as Record<number, string>;\n\n const showDefaultRow = appStore.searchFormRows === 1 ? 4 : 8;\n const classMap: Record<number, string> = {};\n let visibleIndex = 0;\n\n props.formList.forEach((item, index) => {\n if (item?.hidden === true) return;\n if (visibleIndex >= showDefaultRow - 1) classMap[index] = 'gv-form-col--hidden';\n visibleIndex++;\n });\n\n return classMap;\n });\n\n // @exposed\n expose({\n originFormList,\n model,\n setFormRef,\n });\n // method\n const getLanguage = (lang: string, x: any) => {\n let v = '';\n switch (lang) {\n case 'zh-CN':\n v = x.t;\n break;\n case 'en':\n v = x.e;\n break;\n case 'l1':\n v = x.l1;\n break;\n case 'l2':\n v = x.l2;\n break;\n default:\n v = x.t;\n break;\n }\n if (!v) v = x.t;\n return v;\n };\n /**\n * @todo: set divider show status\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 18:12:34\n * @param {*} show\n */\n const setDividerShow = (show: boolean) => {\n isShow.value = show;\n };\n\n const getEditBar = computed(() => {\n if (slots.editbar?.())\n return (\n <ElRow\n ref-form={props.refForm}\n class=\"gv-form-editbar\">\n {slots.editbar?.()}\n </ElRow>\n );\n else return null;\n });\n\n const getDivider = computed(() => {\n let dividerRender: VNode | null = null;\n if (searchDivider.value !== false) {\n let dividerTitle: string;\n if (props.divider) dividerTitle = props.divider;\n else dividerTitle = t('common.dividerTitle');\n if (props.isDivider)\n dividerRender = (\n <GvDivider\n label={dividerTitle}\n target={props.refForm}\n visible={isShow.value}\n onSetDividerShow={setDividerShow}\n />\n );\n }\n\n return dividerRender;\n });\n\n /**\n * @todo: get dic item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 18:13:06\n * @param {*} src\n */\n const getDictItems = (src: string): DicItem[] => {\n let ret = [] as DicItem[];\n const dictCacheTmp: DicItem[] | undefined = dictCache.value?.[src];\n if (dictCacheTmp) ret = dictCacheTmp;\n else {\n // 生成字典列表\n const dictTmp: DicItem[] | undefined = dict.value[src];\n if (dictTmp) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dictTmp;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n\n ret = dictTmp;\n }\n }\n return ret;\n };\n /**\n * @todo: generate form item rules\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 20:31:59\n * @param {*} _item\n */\n const getItemRules = (_item: FormItem): FormItemRule[] => {\n const rules: FormItemRule[] = [];\n const format: FormItemFormat | undefined = _item.format;\n // 富文本不校验\n if (_item.type === 'richtext') return rules;\n if (!format) return rules;\n // ========== 必填校验 ==========\n const requiredFlag = Number(format[0]);\n if (requiredFlag === 1 && !_item.hidden)\n rules.push({\n required: true,\n message: `${t('common.pleaseInput')} ${_item.label ?? ''}`,\n trigger: 'blur',\n });\n // ========== 自定义校验 ==========\n let validateKey = 'isAny';\n if (format[1]) validateKey = toHump(String(format[1]));\n const maxLen = Number(format[2] ?? 30);\n const decimal = format.length >= 4 ? Number(format[3] ?? 0) : 0;\n const validator = gvValidate[validateKey as keyof typeof gvValidate];\n if (validator && validateKey !== 'isAny')\n rules.push({\n validator: validator,\n trigger: ['change', 'blur'],\n // Element Plus 透传参数(自定义字段)\n language: userStore.language,\n max: maxLen,\n decimal,\n } as FormItemRule);\n // ========== 长度校验 ==========\n const excluded = ['isDate', 'isDateTime', 'isTime', 'isDic'];\n if (format[2] && !excluded.includes(validateKey))\n rules.push({\n language: userStore.language,\n max: maxLen,\n validator: gvValidate['isLength'],\n trigger: ['change', 'blur'],\n } as FormItemRule);\n return rules;\n };\n const getDicRadioValue = (fieldVal: unknown): string | number | undefined => {\n if (fieldVal === null || fieldVal === undefined || fieldVal === '') return undefined;\n if (typeof fieldVal === 'object') {\n const obj = fieldVal as Record<string, unknown>;\n return (obj.value ?? obj.c) as string | number | undefined;\n }\n return fieldVal as string | number;\n };\n\n const setDicRadioValue = (field: string, val: string | number | boolean | undefined) => {\n model.value[field] = val === undefined || val === null ? '' : val;\n };\n\n const handleDateRange2Focus = (vm: any) => {\n sleep(100).then(() => {\n addClass(vm.$el.closest('.gv-daterange__single'), 'is-active');\n });\n };\n const handleDateRange2Blur = (vm: any) => {\n removeClass(vm.$el.closest('.gv-daterange__single'), 'is-active');\n };\n\n /**\n * @todo: 日期范围选择,单独选择开始日期、结束日期选择回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 19:49:03\n * @param {*} type\n * @param {*} val\n * @param {*} field\n */\n const handleDateRange2Change = (type: string, val: string | Date, field: string): void => {\n // 校验开始日期和结束日期大小\n if (type === 's')\n if (val && model.value[field + '-end']) {\n const endTime = new Date(model.value[field + '-end'] as string).getTime();\n const startTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model.value[field + '-end'] = '';\n model.value[1] = 'null';\n }\n }\n\n if (type === 'e')\n if (val && model.value[field + '-start']) {\n const startTime = new Date(model.value[field + '-start'] as string).getTime();\n const endTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model.value[field + '-start'] = '';\n // console.log(this.model);\n model.value[1] = 'null';\n }\n }\n\n if (!field) return;\n const datePicker = model.value[field];\n let dateArr = new Array(2);\n if (Array.isArray(datePicker)) {\n if (type === 's') datePicker[0] = val;\n else datePicker[1] = val;\n if (!datePicker[0]) datePicker[0] = 'null';\n if (!datePicker[1]) datePicker[1] = 'null';\n model.value[field] = datePicker.join(',');\n } else {\n if (datePicker && typeof datePicker === 'string') dateArr = datePicker.split(',');\n dateArr[0] = model.value[field + '-start'];\n dateArr[1] = model.value[field + '-end'];\n if (!dateArr[0]) dateArr[0] = 'null';\n if (!dateArr[1]) dateArr[1] = 'null';\n model.value[field] = dateArr.join(',');\n }\n };\n /**\n * @todo: switch框字典change回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-12-21 16:47:22\n * @param {*} val\n * @param {*} field\n * @param {*} dicType\n * @param {*} cb\n */\n const handleSwitchDictChange = async (val, field, dicType, cb) => {\n switch (dicType) {\n case 'yxzt':\n if (val === true) model.value[field] = '100201';\n else model.value[field] = '100202';\n break;\n case 'sf':\n if (val === true) model.value[field] = '100101';\n else model.value[field] = '100102';\n break;\n }\n if (cb)\n try {\n await cb(val, field, dicType);\n } catch (error) {\n console.log(error);\n }\n };\n /**\n * @todo: radio框字典change回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-22 15:50:15\n * @param {*} val\n * @param {*} field\n * @param {*} dicType\n * @param {*} cb\n */\n const handleRadioDictChange = async (val, field, dicType: string | undefined, cb: Fn | undefined) => {\n if (cb)\n try {\n await cb(val, field, dicType);\n } catch (error) {\n console.log(error);\n }\n };\n\n const handleRadioToggle = (field: string, val: string | number, disabled: boolean, dicType: string | undefined, cb: Fn | undefined) => {\n if (disabled) return;\n if (String(val) !== String(getDicRadioValue(model.value[field]))) return;\n nextTick(() => {\n setDicRadioValue(field, '');\n handleRadioDictChange('', field, dicType, cb);\n });\n };\n\n /**\n * @todo: render form item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:54:23\n * @param {*} _item\n * @param {*} _index\n */\n const renderFormItem = (_item: FormItem, _index: number): VNode => {\n const {\n type = 'text',\n label,\n field,\n hidden = false,\n disabled,\n format = [],\n placeholder,\n readonly = false,\n dateType = 'date',\n dicType,\n filtercode,\n colspan = 1,\n disabledDateFunc,\n disabledDate,\n editable = true,\n multiple = false,\n showLabel,\n size = formSize.value,\n visible = true,\n // offset,\n createRow = false, // 是否创建新row,\n dicRemote,\n cb, // 回调方法\n clear, // 清空回调\n rows, // textarea\n autosize, // textarea\n min, // input-number\n max, // input-number\n step, // input-number\n precision, // input-number\n blur = () => {},\n suffixIcon, // 后缀icon\n prefixIcon, // 前缀icon\n focus = () => {},\n change = () => {},\n defaultTime, // 时间的默认能够选择的时间\n isreload = true, // 表选字典是否重新加载\n options = [],\n lazy = false, // cascader是否懒加载\n lazyLoad = () => {}, // cascader懒加载方法\n render, // 自定义form样式\n } = _item;\n let renders;\n const isHidden = hidden === true;\n const searchColClass = searchColClassMap.value[_index];\n const maxLen = format[2] || 30;\n let cType = type;\n // const dateFormatConfig = dateFormatConfig;\n const validateRule = toHump(String(format[1] || ''));\n let sDateType = dateType;\n let isRange = false;\n let dateFormat = dateFormatConfig.date.valueFormat; // 日期显示格式\n let valueFormat = dateFormatConfig.date.valueFormat; // 日期绑定值格式\n if (sDateType !== 'daterange' && sDateType !== 'datetimerange' && sDateType !== 'daterange2' && sDateType !== 'datetimerange2') {\n if (validateRule === 'isDate') cType = 'date';\n if (validateRule === 'isDateTime') {\n cType = 'datetime';\n sDateType = 'datetime';\n }\n if (validateRule === 'isTime') cType = 'time';\n }\n\n if (sDateType === 'timerange') isRange = true;\n\n let ph = placeholder;\n let startPh = t('common.startDate');\n let endPh = t('common.endDate');\n // todo: 响应式布局计算\n // const cols = { span: colspan, offset: (_index) * 6 };\n let cols = colspan > 4 ? 4 : colspan; // fixme: 最大值不能超过4 2022-04-07\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') cols = 2;\n // update: 对于多选字典,默认占用列数为2列 2023-02-18\n if (multiple === true && colspan === undefined) cols = 2;\n let rangeSeparator;\n if (sDateType === 'timerange' || sDateType === 'daterange2' || sDateType === 'datetimerange2') rangeSeparator = t('common.until');\n const colSpanXs = 24;\n let colSpanSm = 12;\n let colSpanMd = 8;\n\n let colSpanLg = 6;\n if (isDialog.value === true) colSpanLg = 8;\n let colSpanXl = 4;\n if (isDialog.value === true) colSpanXl = 6;\n if (colSpanNums.value !== 0) {\n if (colSpanNums.value === 12) cols = colspan > 2 ? 2 : colspan;\n if (colSpanNums.value === 8) cols = colspan > 3 ? 3 : colspan;\n if (colSpanNums.value === 6 || colSpanNums.value === 4) cols = colspan > 4 ? 4 : colspan;\n colSpanSm = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanMd = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanLg = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanXl = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n } else {\n colSpanSm = cols * colSpanSm > 24 ? 24 : cols * colSpanSm;\n colSpanMd = cols * colSpanMd > 24 ? 24 : cols * colSpanMd;\n colSpanLg = cols * colSpanLg > 24 ? 24 : cols * colSpanLg;\n colSpanXl = cols * colSpanXl > 24 ? 24 : cols * colSpanXl;\n }\n let decimal = 2;\n let v = '';\n if (!ph)\n switch (validateRule) {\n case 'isMoney':\n ph = '0.00';\n break;\n case 'isBigMoney':\n ph = '0,000.00';\n break;\n case 'isEmail':\n ph = 'xx@xx.com';\n break;\n case 'isDouble':\n if (format.length >= 4) decimal = format[3] || 2;\n while (decimal > 0) {\n v = '0' + v;\n decimal--;\n }\n ph = '00.' + v;\n break;\n case 'isDate':\n if (sDateType === 'week') {\n ph = t('common.selectWeek'); // dateFormatConfig.week.placeholder;\n dateFormat = dateFormatConfig.week.dateFormat;\n valueFormat = dateFormatConfig.week.valueFormat;\n } else if (sDateType === 'month' || sDateType === 'monthrange') {\n ph = t('common.selectMonth'); // dateFormatConfig.month.placeholder;\n startPh = ph;\n endPh = ph;\n dateFormat = dateFormatConfig.month.dateFormat;\n valueFormat = dateFormatConfig.month.valueFormat;\n } else if (sDateType === 'year') {\n ph = t('common.selectYear'); // dateFormatConfig.year.placeholder\n dateFormat = dateFormatConfig.year.dateFormat;\n valueFormat = dateFormatConfig.year.valueFormat;\n } else if (sDateType === 'daterange' || sDateType === 'daterange2') ph = t('common.selectDate');\n break;\n case 'isDateTime':\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') {\n startPh = t('common.startTime');\n endPh = t('common.endTime');\n }\n ph = t('common.selectTime'); // dateFormatConfig.datetime.placeholder;\n dateFormat = dateFormatConfig.datetime.dateFormat;\n valueFormat = dateFormatConfig.datetime.valueFormat;\n break;\n }\n let editables = editable;\n // 如果是带有禁用日期的,不可编辑,防止输入不一致问题\n if (disabledDateFunc || disabledDate) editables = false;\n let ops;\n let isTableDic = false;\n if (type === 'dic')\n if (dicType) {\n ops = getDictItems(dicType);\n if (dicType.indexOf('t#') >= 0) isTableDic = true;\n }\n\n // 设置label是否显示\n let sLabel = label;\n if (formType.value === 's') {\n sLabel = appStore.searchFormLabel === true ? label : undefined;\n if (appStore.searchFormLabel !== true) ph = label;\n }\n\n const switchDefaultVal = ref('');\n switch (cType) {\n case 'blank':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n prop={field}\n key={field}>\n <div class=\"el-input__inner gv-form__item__inner-blank\">&nbsp;</div>\n </ElFormItem>\n </ElCol>\n );\n break;\n case 'divider':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={24}\n sm={24}\n md={24}\n lg={24}\n xl={24}\n data-hidden={isHidden}>\n <GvDivider label={sLabel} />\n </ElCol>\n );\n break;\n case 'render':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n {render?.(model.value[field], field)}\n </ElFormItem>\n </ElCol>\n );\n break;\n case 'text':\n renders = visible ? (\n // span={this.colSpan} {span:16,offset:4}\n // xs={24} sm={12} md={8} lg={6} xl={4}\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInput\n type=\"text\"\n vref={field}\n name={field}\n v-model={model.value[field]}\n value={model.value[field]}\n disabled={disabled}\n maxlength={maxLen}\n size={size as ComponentSize}\n placeholder={ph}\n visible={visible}\n readonly={readonly}\n onBlur={blur}\n onFocus={focus}\n suffixIcon={suffixIcon}\n prefixIcon={prefixIcon}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'textarea':\n renders = visible ? (\n // span={this.colSpan} {span:16,offset:4}\n // xs={24} sm={12} md={8} lg={6} xl={4}\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInput\n vref={field}\n name={field}\n type=\"textarea\"\n v-model={model.value[field]}\n value={model.value[field]}\n size={size as ComponentSize}\n disabled={disabled}\n maxlength={maxLen}\n placeholder={ph}\n visible={visible}\n readonly={readonly}\n rows={rows}\n autosize={autosize}\n onBlur={blur}\n onFocus={focus}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'time':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvTimePicker\n v-model={model.value[field]}\n vref={field}\n name={field}\n disabled={disabled}\n editable={editables}\n placeholder={ph}\n isRange={isRange}\n rangeSeparator={rangeSeparator}\n // format={dateFormat}\n // value-format={valueFormat}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'date':\n case 'datetime':\n if (sDateType !== 'daterange2' && sDateType !== 'datetimerange2')\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <GvDatePicker\n v-model={model.value[field]}\n modelValue={model.value[field]}\n vref={field}\n data-name={field}\n data-align={'right'}\n type={sDateType as DatePickerType}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={disabledDate}\n editable={editables}\n placeholder={ph}\n default-time={defaultTime}\n startPlaceholder={startPh}\n endPlaceholder={endPh}\n data-visible={visible}\n onChange={change}\n />\n </ElFormItem>\n </ElCol>\n ) : null;\n else\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <div\n class=\"gv-daterange__single\"\n style=\"width: 100%;\"\n onFocus={() => void 0}>\n <GvDatePicker\n v-model={model.value[field + '-start']}\n modelValue={model.value[field + '-start']}\n vref={field + '-start'}\n data-name={field + '-start'}\n data-align={'right'}\n type={sDateType === 'daterange2' ? 'date' : 'datetime'}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={disabledDate}\n editable={editables}\n placeholder={startPh}\n default-time={defaultTime}\n data-visible={visible}\n style={{ width: '96% !important' }}\n class=\"gv-datepicker-range-start\"\n onChange={(val) => handleDateRange2Change('s', val, field)}\n onFocus={(vm) => handleDateRange2Focus(vm)}\n onBlur={(vm) => handleDateRange2Blur(vm)}\n />\n <span class=\"gv-daterange__single-separator\">{rangeSeparator}</span>\n <GvDatePicker\n v-model={model.value[field + '-end']}\n modelValue={model.value[field + '-end'] as string}\n vref={field + '-end'}\n data-name={field + '-end'}\n data-align={'right'}\n type={sDateType === 'daterange2' ? 'date' : 'datetime'}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={(date) => {\n if (sDateType === 'daterange2') return date.getTime() <= new Date(model.value[field + '-start']).getTime() - 8.64e7;\n else return date.getTime() <= new Date(model.value[field + '-start']).getTime() - 8.64e7;\n }}\n editable={editables}\n placeholder={endPh}\n default-time={defaultTime}\n data-visible={visible}\n class=\"gv-datepicker-range-end\"\n onChange={(val) => handleDateRange2Change('e', val, field)}\n onFocus={(vm) => handleDateRange2Focus(vm)}\n onBlur={(vm) => handleDateRange2Blur(vm)}\n />\n </div>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'dic':\n switch (dicType) {\n case 'yxzt':\n if (typeof model.value[field] === 'object') switchDefaultVal.value = model.value[field].value ? model.value[field].value : '100201';\n else switchDefaultVal.value = model.value[field] ? model.value[field] : '100201';\n break;\n case 'sf':\n if (typeof model.value[field] === 'object') switchDefaultVal.value = model.value[field].value ? model.value[field].value : '100101';\n else switchDefaultVal.value = model.value[field] ? model.value[field] : '100101';\n break;\n }\n if (isTableDic === false && multiple === false && formType.value === 'e' && ops && ops.length === 2 && (dicType === 'sf' || dicType === 'yxzt'))\n // 当是编辑form并且字典内容只有2个以内时\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <GvSwitch\n value={switchDefaultVal.value}\n columnKey={field}\n disabled={disabled}\n target={dicType === 'yxzt' ? '100201' : '100101'}\n onChange={(val) => handleSwitchDictChange(val, field, dicType, cb)}></GvSwitch>\n </ElFormItem>\n </ElCol>\n ) : null;\n else if (isTableDic === false && multiple === false && formType.value === 'e' && ops && ops.length === 2)\n // 当是编辑form并且字典内容只有2个以内时\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElInput\n id={`${field}__a11y-anchor`}\n modelValue=\"\"\n readonly\n validateEvent={false}\n tabindex={-1}\n aria-hidden={true}\n style={{\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: 0,\n margin: 0,\n border: 0,\n clip: 'rect(0, 0, 0, 0)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }}\n />\n <ElRadioGroup\n aria-label={sLabel}\n name={field}\n modelValue={getDicRadioValue(model.value[field])}\n onUpdate:modelValue={(val) => {\n setDicRadioValue(field, val);\n handleRadioDictChange(val, field, dicType, cb);\n }}>\n {ops.map((x) =>\n format[0] === 0 ? (\n <ElRadio\n value={x.c}\n disabled={disabled}\n {...({\n onMousedown: () => handleRadioToggle(field, x.c, !!disabled, dicType, cb),\n } as Record<string, unknown>)}>\n {getLanguage(userStore.language, x)}\n </ElRadio>\n ) : (\n <ElRadioButton\n value={x.c}\n disabled={disabled}\n {...({\n onMousedown: () => handleRadioToggle(field, x.c, !!disabled, dicType, cb),\n } as Record<string, unknown>)}>\n {getLanguage(userStore.language, x)}\n </ElRadioButton>\n ),\n )}\n </ElRadioGroup>\n </ElFormItem>\n </ElCol>\n ) : null;\n else {\n // form dic\n let v: string | undefined;\n const vv = model.value[field];\n if (typeof vv === 'object')\n if (Array.isArray(vv))\n vv.forEach((x, index) => {\n if (x)\n if (v)\n if (x.label) v += ',' + x.label;\n else v += ',' + (showLabel?.[index] ? showLabel[index] : x);\n else if (x.label) v = x.label;\n else v = showLabel?.[index] ?? x;\n });\n else {\n if (vv) v = vv.label;\n }\n else v = vv;\n let toolText = v; // 提示的文本\n if (showLabel) toolText = showLabel as string;\n\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!v}\n content={toolText ? toolText + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvSelect\n v-model={model.value[field]}\n value={model.value[field]}\n label={label}\n showLabel={showLabel}\n vref={field}\n multiple={multiple}\n dicType={dicType ?? ''}\n size={size as ComponentSize}\n disabled={disabled}\n placeholder={ph}\n filtercode={filtercode}\n visible={visible}\n dicRemote={typeof dicRemote === 'function' ? dicRemote : undefined}\n cb={cb}\n clear={clear}\n isreload={isreload}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n }\n\n break;\n case 'number':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInputNumber\n vref={field}\n name={field}\n id={field}\n v-model={model.value[field]}\n value={model.value[field]}\n disabled={disabled}\n placeholder={ph}\n visible={visible}\n size={size as ComponentSize}\n min={min}\n max={max}\n step={step}\n precision={precision}\n onBlur={blur}\n onFocus={focus}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'layer':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}\n data-hidden={isHidden}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvCascader\n vref={field}\n v-model={model.value[field]}\n value={model.value[field]}\n disabled={disabled}\n placeholder={ph}\n size={size as ComponentSize}\n lazy={lazy}\n multiple={multiple}\n lazyLoad={lazyLoad}\n visible={visible}\n options={options}\n onBlur={blur}\n onChange={change}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n default:\n break;\n }\n if (createRow === true) return <el-row>{renders}</el-row>;\n else return renders;\n };\n\n const getItems = computed(() => {\n const res: VNode[] = [];\n props.formList.forEach((item: FormItem, index: number) => {\n res.push(renderFormItem(item, index));\n });\n return res;\n });\n\n // todo: 计算最大高度 需要增加弹出框判断逻辑,\n const getMaxHeight = (sRootEl: HTMLElement | undefined) => {\n if (isEditContainer.value) sMaxHeight.value = 0;\n else if (props.scroller === false) sMaxHeight.value = 0;\n else if (!isScrollbar.value)\n if (!isAnchor.value) {\n if (sRootEl && typeof sRootEl.closest === 'function') {\n const tabPane = sRootEl?.closest('.el-tabs') as HTMLElement | undefined;\n if (tabPane) {\n const offsetTop = tabPane.classList.contains('el-tabs--left') ? 215 : 275;\n sMaxHeight.value = document.documentElement.clientHeight - (sRootEl?.offsetTop || 0) - (tabPane?.offsetTop || 0) - offsetTop;\n } else {\n const dialog = sRootEl?.closest('.gv-dialog');\n if (!dialog) {\n const drawer = sRootEl?.closest('.gv-drawer');\n if (!drawer) sMaxHeight.value = document.documentElement.clientHeight - sRootEl.offsetTop - 75;\n // console.log(this.sMaxHeight);\n } else sMaxHeight.value = document.documentElement.clientHeight - sRootEl.offsetTop - 265;\n }\n }\n } else sMaxHeight.value = 0;\n else sMaxHeight.value = 0;\n };\n\n const clearFormValidate = () => {\n formRefs.value[props.refForm]?.clearValidate();\n };\n\n /**\n * @todo: 设置form表单样式\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-07 19:35:14\n */\n const setFormStyle = () => {\n let formStyle1;\n // console.log(props.formStyle);\n if (props.formStyle) {\n formStyle1 = props.formStyle;\n let width = formStyle1.width || 0;\n let height = formStyle1.height || 0;\n // fixme: 判断width是否是百分比\n // if (width.lastIndexOf('%') !== -1)\n // throw new Error('HtForm - [form-style] : 不支持width定义百分比');\n // if (height.lastIndexOf('%') !== -1)\n // throw new Error('HtForm - [form-style] : 不支持height定义百分比');\n // width = Math.round(this.getParentWidth * (parseInt(width) / 100) * 100) / 100;\n\n if (width.lastIndexOf('%') === -1) {\n // width固定值\n width = parseInt(width);\n if (width !== 0) {\n if (width < 762)\n // xs\n colSpanNums.value = 24;\n else if (width < 992)\n // sm\n colSpanNums.value = 12;\n else if (width < 1200)\n // md\n colSpanNums.value = 8;\n else if (width < 1920)\n // lg\n colSpanNums.value = 6;\n else colSpanNums.value = 4;\n\n rootNodeStyle.value['width'] = width + 'px';\n }\n if (height !== '100%' && height !== 0) {\n height = parseInt(height);\n rootNodeStyle.value['height'] = height + 'px';\n }\n } else rootNodeStyle.value['width'] = width;\n } else {\n const rootEl = instance?.vnode?.el as HTMLElement;\n const clientWidth = rootEl?.clientWidth;\n // console.log(clientWidth);\n if (clientWidth !== 0) {\n if (clientWidth < 762)\n // xs\n colSpanNums.value = 24;\n else if (clientWidth < 992)\n // sm\n colSpanNums.value = 12;\n else if (clientWidth < 1200)\n // md\n colSpanNums.value = 8;\n else if (clientWidth < 1920)\n // lg\n colSpanNums.value = 6;\n else colSpanNums.value = 4;\n\n rootNodeStyle.value['width'] = clientWidth + 'px';\n }\n }\n styles.value = formStyle1;\n };\n\n /**\n * @todo: form init\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 07:47:06\n * @param {*} type\n */\n const init = async (type: string) => {\n // alert(type);\n const formModel = {};\n const formRule = {};\n props.formList.forEach((item: FormItem, index: number) => {\n let v;\n if (type === 'create') v = item.value;\n else if (type === 'watch') {\n const originItem = originFormList.value[index] as FormItem | undefined;\n if (originItem && (item.value !== originItem.value || item.showLabel !== originItem.showLabel)) v = item.value;\n else v = model.value[item.field] === undefined ? item.value : model.value[item.field];\n } else v = model.value[item.field] === undefined ? item.value : model.value[item.field];\n formModel[item.field] = v;\n if (item.dateType === 'daterange2' || item.dateType === 'datetimerange2')\n if (Array.isArray(v)) {\n formModel[item.field + '-start'] = v[0] === 'null' ? undefined : v[0];\n formModel[item.field + '-end'] = v[1] === 'null' ? undefined : v[1];\n } else {\n formModel[item.field + '-start'] = '';\n formModel[item.field + '-end'] = '';\n }\n\n formRule[item.field] = getItemRules(item);\n // 设置 value属性为响应式数据\n item.value = v;\n });\n // 设置form model\n model.value = formModel;\n if (type === 'create') rules.value = formRule;\n else if (type === 'watch') rules.value = formRule;\n\n await nextTick();\n setFormStyle();\n // console.log(formRefs.value);\n clearFormValidate();\n };\n\n const difference = (newVal, oldVal) => {\n let diff = false;\n for (const key in newVal) {\n const fieldObj = newVal[key];\n const oldObj = oldVal[key];\n if (fieldObj === undefined) continue;\n else if (!oldObj) {\n diff = true;\n break;\n } else {\n const fieldObjKeys = Object.keys(fieldObj);\n for (const key2 in fieldObjKeys)\n if (\n fieldObjKeys[key2] === 'label' ||\n fieldObjKeys[key2] === 'hidden' ||\n fieldObjKeys[key2] === 'disabled' ||\n fieldObjKeys[key2] === 'format' ||\n fieldObjKeys[key2] === 'readonly' ||\n fieldObjKeys[key2] === 'filtercode' ||\n fieldObjKeys[key2] === 'multiple' ||\n fieldObjKeys[key2] === 'showLabel' ||\n fieldObjKeys[key2] === 'visible'\n )\n if (fieldObjKeys[key2] === 'format') {\n if (fieldObj[fieldObjKeys[key2]][0] !== oldObj[fieldObjKeys[key2]][0]) {\n diff = true;\n break;\n }\n if (fieldObj[fieldObjKeys[key2]][1] !== oldObj[fieldObjKeys[key2]][1]) {\n diff = true;\n break;\n }\n if (fieldObj[fieldObjKeys[key2]][2] !== oldObj[fieldObjKeys[key2]][2]) {\n diff = true;\n break;\n }\n // //if (!_.isEqual(fieldObj[fieldObjKeys[key2]], oldObj[fieldObjKeys[key2]])) {\n // diff = true;\n // break;\n // }\n } else if (fieldObj[fieldObjKeys[key2]] !== oldObj[fieldObjKeys[key2]]) {\n // console.log(key2);\n // console.log(fieldObj[fieldObjKeys[key2]]);\n // console.log(oldObj[fieldObjKeys[key2]]);\n diff = true;\n break;\n }\n }\n\n // if (!_.isEqual(newVal[key], oldVal[key]))\n }\n // console.log(diff);\n return diff;\n };\n\n // watch\n watch(\n () => props.formList,\n (nextProps, prevProps) => {\n // formList\n if (Array.isArray(nextProps) && Array.isArray(prevProps) && nextProps.length !== prevProps.length) init('watch');\n else if (difference(nextProps, originFormList.value)) init('watch');\n },\n {\n deep: true,\n },\n );\n watch(\n () => sMaxHeight.value,\n (newVal) => {\n // sMaxHeight\n if (isScrollbar.value === false)\n if (isAnchor.value === false) sMaxHeight.value = newVal;\n else sMaxHeight.value = 0;\n else sMaxHeight.value = 0;\n },\n );\n\n // @created hook\n // console.log(slots.default);\n const firstSlot = slots.default?.()?.[0];\n if (typeof firstSlot?.type === 'object' && 'name' in firstSlot.type && firstSlot?.type?.name === 'GvSearchBar') {\n formType.value = 's';\n const slotProps = firstSlot.props as Recordable | undefined;\n if (slotProps?.expand === false) searchFieldsCollapsed.value = false;\n } else formType.value = 'e';\n // 解析formList\n originFormList.value = JSON.parse(JSON.stringify(props.formList));\n init('create');\n // 判断是否是dialog弹出框中的form\n const parentNode = instance?.parent;\n // console.log(parentNode.$?.type?.name);\n if (parentNode && parentNode.type?.name === 'ElDialog') isDialog.value = true;\n else isDialog.value = false;\n // @mounted hook\n onMounted(() => {\n nextTick(() => {\n // get root element\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n // 确保 rootEl 是 HTMLElement 并且有 closest 方法\n if (rootEl && typeof rootEl.closest === 'function') {\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n const dialogBody = rootEl.closest('.gv-drawer__body__inner');\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n else {\n const dialogBody2 = rootEl.closest('.gv-dialog__body__inner');\n if (dialogBody2) isScrollbar.value = hasScrollbar(dialogBody2);\n }\n if (rootEl.closest('.gv-edit__container')) isEditContainer.value = true;\n\n // 计算maxheight;\n getMaxHeight(rootEl);\n\n window.addEventListener('resize', () => getMaxHeight(rootEl));\n }\n });\n });\n\n // @render\n return () => (\n <div\n class={prefixCls}\n style={{ ...rootNodeStyle }}>\n {getEditBar.value}\n {getDivider.value}\n <Transition name=\"el-zoom-in-top\">\n <div\n v-show={isShow.value}\n key=\"gv-form-body\"\n class={`${prefixCls}-collapse__inner`}>\n <ElForm\n ref={setFormRef}\n model={model.value}\n size={formSize.value}\n inline={false}\n label-position={labelPosition.value}\n label-width={`${props.labelWidth}px`}\n rules={rules.value}\n style={{\n ...styles.value,\n width: '100%',\n maxHeight: sMaxHeight.value === 0 ? undefined : sMaxHeight.value + 'px',\n }}>\n <ElRow\n ref-form={props.refForm}\n style={{ display: 'flex', flexWrap: 'wrap' }}>\n {getItems.value}\n {slots.default?.() && <div style={{ flex: 1, minWidth: 1 }}>{slots.default?.()}</div>}\n </ElRow>\n </ElForm>\n </div>\n </Transition>\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-form';\n .#{$prefixCls} {\n width: 100%;\n\n .#{$prefixCls}-form-editbar {\n // editbar bottom\n // border-bottom:1px solid #d9d9d9;\n // editbar top\n // border-top:1px solid #d9d9d9;\n // border-top: 1.5px solid var(--primaryColorHover, $primaryColorHover);\n padding: 0 0 2px;\n margin-top: -3px;\n }\n\n .#{$prefixCls}-collapse-wrap {\n overflow: hidden;\n }\n\n .#{$prefixCls}-collapse__inner {\n transform-origin: center top;\n }\n\n .el-form {\n overflow: hidden;\n }\n\n .el-col {\n min-height: 32px;\n margin-bottom: 12px;\n\n &[type='FIXED'] {\n height: 32px !important;\n }\n\n :deep(.el-form-item) {\n margin-bottom: 0;\n\n .el-form-item__label {\n //height: 30px; // 32px\n padding-right: $modulePadding;\n //font-size: $textSizeSecondary;\n font-weight: $fontWeight;\n //line-height: 30px; // 32px\n\n .label-wrap {\n display: inline-block;\n max-width: calc(100% - 10px);\n\n .el-input__inner {\n padding: 0 8px;\n border-color: $borderColor;\n\n & + span.el-input__suffix {\n right: 0;\n }\n }\n }\n }\n\n .el-form-item__content {\n //line-height: 29px;\n //height: 29px;\n .el-radio-group {\n .el-radio-button--small .el-radio-button__inner {\n padding: 7px;\n }\n\n .el-radio__label {\n //font-size: $appTextSize;\n }\n }\n\n .el-range-editor {\n width: 100%;\n }\n\n .el-input__prefix {\n left: 2px;\n }\n\n .#{$prefixCls}__item__inner-blank {\n width: 100%;\n height: 20px;\n line-height: 5px;\n border: 0;\n }\n\n // 日期范围选择\n .el-range-editor.el-input__inner {\n padding: 3px 5px;\n }\n\n // 日期范围选择\n .el-range__close-icon {\n width: 20px;\n }\n\n .gv-daterange__single {\n display: inline-flex !important;\n height: 32px;\n border: 1px solid #d9d9d9;\n border-radius: 4px;\n\n &:focus,\n &.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n .el-input__prefix {\n left: 2px;\n }\n\n .el-input__suffix {\n right: 2px;\n }\n\n .el-input__inner {\n padding-right: 2px;\n padding-left: 25px;\n border: 0;\n }\n\n .gv-daterange__single-separator {\n //height: 32px;\n //font-size: $appTextSize;\n //line-height: 32px;\n }\n }\n\n .el-form-item__error {\n margin-top: 2px;\n transform: scale(0.9);\n transform-origin: 0 50%;\n }\n }\n\n .el-select {\n width: 100%;\n\n .el-select__tags {\n height: 24px;\n overflow-y: auto;\n\n .el-select__input {\n height: inherit;\n padding-left: 15px;\n }\n }\n }\n\n .el-autocomplete {\n width: 100%;\n }\n\n .el-textarea {\n display: block;\n\n .el-textarea__inner {\n padding: 0 10px;\n\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n overflow-y: auto;\n font-family: inherit;\n }\n\n .el-input__count {\n right: 6px;\n line-height: 1;\n }\n }\n\n .el-input-number {\n width: 100%;\n\n .el-input__inner {\n text-align: left !important;\n }\n\n .el-input-number__increase:hover ~ .el-input .el-input__inner:not(.is-disabled),\n .el-input-number__decrease:hover ~ .el-input .el-input__inner:not(.is-disabled) {\n border-color: $borderColor;\n }\n }\n\n .desc-icon {\n padding: 6px;\n font-size: 18px;\n vertical-align: middle;\n }\n\n .desc-text {\n //font-size: $textSizeSecondary;\n }\n\n &.is-required .el-form-item__label {\n // color: #f5222d;\n color: #606266;\n }\n }\n }\n .el-form--label-top {\n .el-form-item {\n .el-select,\n .el-input,\n .el-radio-group {\n width: 90% !important;\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvForm from './src/GvForm.vue';\nconst GvFormPlugin = {\n install(app: App): void {\n app.component(GvForm.name ?? 'GvForm', GvForm);\n },\n};\nexport default GvFormPlugin;\n\nexport { GvForm };\n","<!--\n * @title: collapsed sidebar component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-03 13:48:02\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-03 11:18:57\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { Expand, Fold } from '@element-plus/icons-vue';\n import { ElIcon } from 'element-plus';\n import { computed, onMounted, unref } from 'vue';\n import { propTypes } from '../../utils/gv.propTypes';\n\n defineOptions({\n name: 'GvHamburger', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('hamburger');\n\n const appStore = useAppStore();\n const collapse = computed(() => appStore.getCollapseMenus);\n\n // set quick keys\n\n // @method\n // load dict\n const loadDict = async () => {\n try {\n await appStore.loadAllDict();\n } catch {\n // empty\n }\n };\n // load division\n const loadDictDivision = async () => {\n try {\n await appStore.loadDictDivision();\n } catch {\n // empty\n }\n };\n\n const toggleCollapse = () => {\n const collapsed = unref(collapse);\n appStore.setCollapseMenus(!collapsed);\n };\n\n // @created\n // @mounted\n onMounted(async () => {\n // reload dict if needed\n const currentDict = appStore.dict;\n const currentReloadDict = appStore.isLoadDict;\n if (!currentDict || Object.keys(currentDict).length === 0) await loadDict();\n else if (+currentReloadDict === 1) await loadDict();\n const currentDictDivision = appStore.dictDivision;\n if (currentDictDivision && currentDictDivision.length === 0) await loadDictDivision();\n });\n</script>\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleCollapse\">\n <div class=\"trigger\">\n <ElIcon\n :size=\"20\"\n :class=\"`${prefixCls}__icon`\">\n <Expand\n v-if=\"!collapse\"\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n <Fold\n v-else\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n </ElIcon>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-hamburger';\n .#{$prefixCls} {\n position: relative;\n z-index: 3;\n line-height: $navHeadHeight;\n background-color: #fff;\n &:hover {\n background-color: rgb(0 0 0 / 3%);\n }\n .trigger {\n display: inline-block;\n line-height: 1px;\n cursor: pointer;\n transition: color 0.3s ease;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvHamburger from './src/GvHamburger.vue';\nconst GvHamburgerPlugin = {\n install(app: App): void {\n app.component(GvHamburger.name ?? 'GvHamburger', GvHamburger);\n },\n};\nexport default GvHamburgerPlugin;\n\nexport { GvHamburger };\n","<!--\n * @title: locale lang dropdown\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-25 11:43:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-04 22:09:46\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useLocale } from '@/hook/web/useLocale';\n import { useStyle } from '@/hook/web/useStyle';\n import { useLocaleStore } from '@/store/modules/locale';\n import { useUserStore } from '@/store/modules/user';\n import { computed, unref } from 'vue';\n import { useRouter } from 'vue-router';\n import { propTypes } from '../../utils/gv.propTypes';\n\n import { ElDropdown, ElDropdownItem, ElDropdownMenu } from 'element-plus';\n\n defineOptions({\n name: 'GvLangSelect', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n defineProps({\n className: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('lang-select');\n\n const userStore = useUserStore();\n const localeStore = useLocaleStore();\n const langMap = computed(() => localeStore.getLocaleMap);\n const currentLang = computed(() => localeStore.getCurrentLocale);\n\n const router = useRouter();\n\n const handleSetLang = async (lang): Promise<void> => {\n if (lang === unref(currentLang).lang) return;\n\n const { switchLocale } = useLocale();\n userStore.setLanguage(lang);\n await switchLocale(lang);\n\n router.go(0);\n };\n</script>\n\n<template>\n <ElDropdown\n :class=\"prefixCls\"\n trigger=\"click\"\n class=\"international\"\n @command=\"handleSetLang\">\n <div>\n <GvIcon\n :class-name=\"`international-icon ${className}`\"\n icon-name=\"language\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item in langMap\"\n :key=\"item.lang\"\n :command=\"item.lang\">\n {{ item.name }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n","import type { App } from 'vue';\nimport GvLangSelect from './src/GvLangSelect.vue';\nconst GvLangSelectPlugin = {\n install(app: App): void {\n app.component(GvLangSelect.name ?? 'GvLangSelect', GvLangSelect);\n },\n};\nexport default GvLangSelectPlugin;\n\nexport { GvLangSelect };\n","<!--\n * @title: popover component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 14:04:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:33:39\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { GvIcon } from '@@/GvIcon';\n import { ElPopover } from 'element-plus';\n import { computed, defineComponent, ref, watch, type PropType } from 'vue';\n import type { TPopoverPlacement, TPopoverTrigger } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('popover');\n\n export default defineComponent({\n name: 'GvPopover',\n props: {\n vref: {\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: false,\n },\n title: {\n type: String,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n placement: {\n type: String as PropType<TPopoverPlacement>,\n default: 'bottom-start',\n },\n trigger: {\n type: String as PropType<TPopoverTrigger>,\n default: 'click',\n },\n tablePopover: {\n type: Boolean,\n default: false,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n columnType: {\n type: String,\n default: undefined,\n },\n },\n\n emits: ['update:visible', 'show', 'hide'],\n\n setup(props, { emit, slots }) {\n // @data\n const isShow = ref<boolean>(props.visible);\n\n // @watch\n watch(\n () => props.visible,\n (val) => {\n isShow.value = val;\n },\n );\n\n // @computed\n const popClass = computed(() => (props.tablePopover ? `${prefixCls} table-popover` : prefixCls));\n\n // @methods\n\n const handleUpdateVisible = (val: boolean) => {\n isShow.value = val;\n emit('update:visible', val);\n };\n\n const handleShow = () => {\n emit('show', props.columnProp);\n };\n\n const handleHide = () => {\n emit('hide', props.columnProp);\n };\n\n const handlePopoverWrapper = (e: MouseEvent) => {\n e.stopPropagation();\n // 关闭其他 popover\n // if (this.tablePopover === true)\n // this.$refs.array.forEach(element => {\n\n // });\n\n // this.$emit('click', e, this.columnProp);\n };\n\n const getReferenceSlot = () => (\n <span class=\"gv-popover-reference\">\n {props.label || props.title}\n <GvIcon\n iconType=\"el\"\n iconName=\"ArrowDown\"\n />\n </span>\n );\n\n // @render\n return () => (\n <div\n class={prefixCls}\n onClick={handlePopoverWrapper}>\n <ElPopover\n ref={props.vref || 'gv-popover'}\n visible={isShow.value}\n onUpdate:visible={handleUpdateVisible}\n title={props.title}\n placement={props.placement}\n trigger={props.trigger}\n showArrow={true}\n popperClass={`gv-popover ${popClass.value}`}\n transition=\"el-zoom-in-top\"\n onAfter-enter={handleShow}\n onAfter-leave={handleHide}\n // append-to-body={false}\n // popper-options={{ // fixme: 增加该配置会导致各种问题,兼容性不行\n // boundariesElement: 'body',\n // // gpuAcceleration: true,\n // // positionFixed: true,\n // removeOnDestroy: true\n // }}\n >\n {{\n default: () => slots.default?.(),\n reference: () => getReferenceSlot(),\n }}\n </ElPopover>\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-popover';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvPopover from './src/GvPopover.vue';\n\nconst GvPopoverPlugin = {\n install(app: App): void {\n app.component(GvPopover.name ?? 'GvPopover', GvPopover);\n },\n};\nexport default GvPopoverPlugin;\n\nexport { GvPopover };\n","<!--\n * @title: radio component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 11:52:20\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:34:53\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRadio, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { TRadioValue } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('radio');\n\n export default defineComponent({\n name: 'GvRadio',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n value: {\n type: [String, Number, Boolean] as PropType<TRadioValue>,\n default: undefined,\n },\n label: {\n type: [String, Number, Boolean] as PropType<TRadioValue>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n border: {\n type: Boolean,\n default: false,\n },\n },\n\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const radioValue = ref(props.value);\n const radioSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n radioValue.value = newVal;\n },\n );\n\n // @method\n const handleUpdate = (val: TRadioValue) => {\n radioValue.value = val;\n emit('update:modelValue', val);\n };\n\n const handleChange = (val: TRadioValue) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElRadio\n modelValue={radioValue.value}\n onUpdate:modelValue={handleUpdate}\n name={props.name}\n value={props.value ?? props.label}\n disabled={props.disabled}\n border={props.border}\n onChange={handleChange}\n size={radioSize.value}\n class={prefixCls}>\n {slots.default?.()}\n </ElRadio>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-radio';\n .#{$prefixCls} {\n padding: 5px 0;\n margin-right: 15px;\n }\n</style>\n","import type { App } from 'vue';\nimport GvRadio from './src/GvRadio.vue';\n\nconst GvRadioPlugin = {\n install(app: App): void {\n app.component(GvRadio.name ?? 'GvRadio', GvRadio);\n },\n};\nexport default GvRadioPlugin;\n\nexport { GvRadio };\n","<!--\n * @title: radio button component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 14:18:46\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:35:23\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRadioButton } from 'element-plus';\n import { defineComponent, ref, watch } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('radio-button');\n\n export default defineComponent({\n name: 'GvRadioButton',\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [String, Number, Boolean],\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n name: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['update:modelValue', 'change'],\n setup(props, { slots }) {\n // @data\n const radioValue = ref(props.value);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n radioValue.value = newVal;\n },\n );\n\n // @method\n // const handleUpdate = (val) => {\n // radioValue.value = val;\n // emit('update:modelValue', val);\n // };\n\n // @render\n return () => (\n <ElRadioButton\n value={props.value ?? props.label}\n modelValue={radioValue.value}\n name={props.name}\n disabled={props.disabled}\n class={prefixCls}>\n {slots.default?.()}\n </ElRadioButton>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-radio-button';\n .#{$prefixCls} {\n padding: 5px 0;\n margin-right: 15px;\n }\n</style>\n","import type { App } from 'vue';\nimport GvRadioButton from './src/GvRadioButton.vue';\n\nconst GvRadioButtonPlugin = {\n install(app: App): void {\n app.component(GvRadioButton.name ?? 'GvRadioGroup', GvRadioButton);\n },\n};\nexport default GvRadioButtonPlugin;\n\nexport { GvRadioButton };\n","<!--\n * @title: radio group component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 14:10:40\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 09:03:41\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRadioGroup, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { TRadioGroupValue } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('radio-group');\n\n export default defineComponent({\n name: 'GvRadioGroup',\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [String, Number, Boolean] as PropType<TRadioGroupValue>,\n default: undefined,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n },\n\n // @emits\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const radioValue = ref<TRadioGroupValue | undefined>(props.value ?? undefined);\n const radioGroupSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n radioValue.value = newVal;\n },\n );\n\n // @method\n const handleUpdate = (val: TRadioGroupValue) => {\n radioValue.value = val;\n emit('update:modelValue', val);\n };\n\n const handleChange = (val: TRadioGroupValue) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElRadioGroup\n class={prefixCls}\n aria-label={props.label}\n modelValue={radioValue.value}\n onUpdate:modelValue={handleUpdate}\n size={radioGroupSize.value}\n onChange={handleChange}>\n {slots.default?.()}\n </ElRadioGroup>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-radio-group';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvRadioGroup from './src/GvRadioGroup.vue';\n\nconst GvRadioGroupPlugin = {\n install(app: App): void {\n app.component(GvRadioGroup.name ?? 'GvRadioGroup', GvRadioGroup);\n },\n};\nexport default GvRadioGroupPlugin;\n\nexport { GvRadioGroup };\n","<!--\n * @title: row component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 09:49:52\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:36:24\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRow } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('row');\n\n export default defineComponent({\n name: 'GvRow',\n props: {\n gutter: {\n type: Number,\n default: 0,\n },\n tag: {\n type: String as PropType<string>,\n default: 'div',\n },\n },\n setup(props, { slots }) {\n return () => (\n <ElRow\n class={prefixCls}\n gutter={props.gutter}\n tag={props.tag}>\n {slots.default?.()}\n </ElRow>\n );\n },\n });\n</script>\n","import type { App } from 'vue';\nimport GvRow from './src/GvRow.vue';\n\nconst GvRowPlugin = {\n install(app: App): void {\n app.component(GvRow.name ?? 'GvRow', GvRow);\n },\n};\nexport default GvRowPlugin;\n\nexport { GvRow };\n","<!--\n * @title: screenfull\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:15:43\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-11-17 10:55:25\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { useFullscreen } from '@vueuse/core';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('screenfull');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { toggle, isFullscreen } = useFullscreen();\n\n const toggleFullscreen = () => {\n toggle();\n };\n</script>\n\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleFullscreen\">\n <GvIcon :icon-name=\"isFullscreen ? 'exit-fullscreen' : 'fullscreen'\" />\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-screenfull';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvScreenFull from './src/GvScreenFull.vue';\n// Define the install method on the GvButton component\nconst GvScreenFullPlugin = {\n install(app: App): void {\n app.component(GvScreenFull.name ?? 'GvScreenFull', GvScreenFull);\n },\n};\nexport default GvScreenFullPlugin;\n\nexport { GvScreenFull };\n","<!--\n * @title: search bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:02:29\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-12 16:41:40\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvIcon } from '@@/GvIcon';\n import { getVNodeText } from '@@/utils';\n import { computed, defineComponent, getCurrentInstance, inject, nextTick, onMounted, ref } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('search-bar');\n export default defineComponent({\n name: 'GvSearchBar',\n props: {\n expand: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n setup(props, { slots }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n\n const visible = ref(props.expand);\n const searchFieldsCollapsed = inject<{ value: boolean }>('searchFieldsCollapsed', ref(true));\n // const formList = inject('formList') as Recordable[];\n const refForm = inject('refForm') as string;\n const instance = getCurrentInstance(); // get current vnode\n let formNode: any = instance;\n while (formNode && formNode.type?.name !== 'ElForm') formNode = formNode?.parent;\n\n const fieldList = ref<any[]>([]);\n const searchFormRows = appStore.searchFormRows;\n const showDefaultRow = searchFormRows === 1 ? 4 : 8;\n // @mounted\n onMounted(() => {\n nextTick(() => {\n // console.log(formNode.exposed.fields);\n fieldList.value = formNode.exposed.fields;\n });\n });\n // const gvSearchExpand = ref(null);\n // const gvSearchShrink = ref(null);\n\n // @methods\n /**\n * @todo: expand search bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:45:03\n */\n const expandFields = () => {\n searchFieldsCollapsed.value = false;\n visible.value = false;\n };\n /**\n * @todo: shrink search bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:48:18\n */\n const shrinkFields = () => {\n searchFieldsCollapsed.value = true;\n visible.value = true;\n };\n /**\n * @todo: create search button\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 14:17:17\n */\n const createSearchBar = computed(() => {\n if (!fieldList.value?.length) return null;\n const searchBar: any[] = [];\n const buttonQuick = appStore.buttonQuick;\n const buttonIcon = appStore.buttonIcon;\n const defaultSlot = slots.default?.();\n if (defaultSlot) {\n defaultSlot.forEach((vnode) => {\n if (!vnode.props) vnode.props = {};\n const propsData = vnode.props;\n\n const type = vnode.type;\n if (typeof type === 'object' && 'name' in type && type.name === 'GvButton') {\n let text = getVNodeText(vnode);\n let searchBtnFlag = false;\n\n if (text === t('searchBar.search')) {\n if (buttonQuick) text = t('searchBar.search2');\n searchBtnFlag = true;\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.search');\n if (buttonIcon) propsData.icon = 'el-icon-search';\n propsData.bizType = 'search';\n }\n } else if (text === t('searchBar.seek')) {\n if (buttonQuick) text = t('searchBar.seek2');\n searchBtnFlag = true;\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.seek');\n if (buttonIcon) propsData.icon = 'el-icon-search';\n propsData.bizType = 'search';\n }\n } else if (text === t('searchBar.query')) {\n if (buttonQuick) text = t('searchBar.query2');\n searchBtnFlag = true;\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.query');\n if (buttonIcon) propsData.icon = 'el-icon-search';\n propsData.bizType = 'search';\n }\n } else if (text === t('searchBar.reset')) {\n if (buttonQuick) text = t('searchBar.reset2');\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.reset');\n if (buttonIcon) propsData.icon = 'el-icon-refreshLeft';\n propsData.bizType = 'reset';\n }\n }\n\n if (searchBtnFlag && propsData && propsData.type === undefined) propsData.type = 'primary';\n\n if (propsData) propsData.refForm = refForm;\n }\n searchBar.push(vnode);\n });\n\n // if (this.expand) {\n // add: 判断是否需要增加展开按钮 2022-04-22\n const fieldList2 = fieldList.value.filter((x) => x.$el?.parentElement.style?.display !== 'none');\n console.log(fieldList2);\n if (fieldList2.length > showDefaultRow - 1) {\n let expandText = `${t('searchBar.expand')}`;\n if (buttonQuick) expandText = `${t('searchBar.expand')}(E)`;\n let shrinkText = `${t('searchBar.shrink')}`;\n if (buttonQuick) shrinkText = `${t('searchBar.shrink')}(E)`;\n const expand = (\n <GvButton\n link={true}\n bizType=\"expand\"\n visible={visible.value}\n onClick={expandFields}>\n {expandText} &nbsp;\n <GvIcon\n iconType=\"el\"\n iconName=\"arrowDown\"\n />\n </GvButton>\n );\n searchBar.push(expand);\n const shrink = (\n <GvButton\n link={true}\n bizType=\"shrink\"\n visible={!visible.value}\n onClick={shrinkFields}>\n {shrinkText} &nbsp;\n <GvIcon\n iconType=\"el\"\n iconName=\"arrowUp\"\n />\n </GvButton>\n );\n searchBar.push(shrink);\n }\n // }\n }\n return searchBar;\n });\n // @created\n\n // @render\n return () => <div class={prefixCls}>{createSearchBar.value}</div>;\n },\n });\n</script>\n<style scoped lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-search-bar';\n .#{$prefixCls} {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n padding-top: 0px;\n margin: 0 1px 6px 0;\n }\n</style>\n","import type { App } from 'vue';\nimport GvSearchBar from './src/GvSearchBar.vue';\n// Define the install method on the GvButton component\nconst GvSearchBarPlugin = {\n install(app: App): void {\n app.component(GvSearchBar.name ?? 'GvSearchBar', GvSearchBar);\n },\n};\nexport default GvSearchBarPlugin;\n\nexport { GvSearchBar };\n","import { ref, unref } from 'vue';\nimport { findPath } from '../../utils/gv.tree';\n\ntype OnlyOneChildType = AppRouteRecordRaw & { noShowingChildren?: boolean };\n\ninterface HasOneShowingChild {\n oneShowingChild?: boolean;\n onlyOneChild?: OnlyOneChildType;\n}\n\nexport const getAllParentPath = <T = Recordable>(treeData: T[], path: string) => {\n const menuList = findPath(treeData, (n) => n.path === path) as AppRouteRecordRaw[];\n return (menuList || []).map((item) => item.path);\n};\n\nexport const hasOneShowingChild = (parent: AppRouteRecordRaw, children: AppRouteRecordRaw[] = []): HasOneShowingChild => {\n const onlyOneChild = ref<OnlyOneChildType>();\n\n const showingChildren = children.filter((v) => {\n const meta = v.meta ?? {};\n if (meta.hidden) return false;\n else {\n // Temp set(will be used if only has one showing child)\n onlyOneChild.value = v;\n return true;\n }\n });\n\n // When there is only one child router, the child router is displayed by default\n if (showingChildren.length === 1)\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n\n // Show parent if there are no child router to display\n if (!showingChildren.length) {\n onlyOneChild.value = { ...parent, path: '', noShowingChildren: true };\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n }\n\n return {\n oneShowingChild: false,\n onlyOneChild: unref(onlyOneChild),\n };\n};\n","import { useI18n } from '@/hook/web/useI18n';\nimport type { RouteMeta } from 'vue-router';\nimport { GvIcon } from '../../../GvIcon';\nexport const useRenderMenuTitle = () => {\n const renderMenuTitle = (meta: RouteMeta) => {\n const { t } = useI18n();\n if (!meta) {\n return <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">No Title</span>;\n }\n const { title = 'Please set title', icon } = meta;\n\n return icon ? (\n <>\n <GvIcon\n iconName={meta.icon || ''}\n className=\"sub-el-icon\"></GvIcon>\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n </>\n ) : (\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n );\n };\n\n return {\n renderMenuTitle,\n };\n};\n","/*\n * @title: render menu item - useRenderMenuItem\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 15:07:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 14:34:07\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { useStyle } from '@/hook/web/useStyle';\nimport { isUrl, pathResolve } from '@@/utils';\nimport { ElMenuItem, ElSubMenu } from 'element-plus';\nimport { unref } from 'vue';\nimport { hasOneShowingChild } from '../helper';\nimport { useRenderMenuTitle } from './useRenderMenuTitle';\nconst { getPrefixCls } = useStyle();\nconst prefixCls = getPrefixCls('submenu');\n\nconst { renderMenuTitle } = useRenderMenuTitle();\n\nexport const useRenderMenuItem = (menuMode) =>\n // allRouters: AppRouteRecordRaw[] = [],\n {\n const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => {\n if (!routers || !routers.length) return null;\n return routers\n .filter((v) => !v.meta?.hidden)\n .map((v) => {\n const meta = v.meta ?? {};\n const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v, v.children);\n const fullPath = isUrl(v.path) ? String(v.path) : pathResolve(parentPath, v.path); // getAllParentPath<AppRouteRecordRaw>(allRouters, v.path).join('/')\n if (oneShowingChild && (!onlyOneChild?.children || onlyOneChild?.noShowingChildren) && !meta?.alwaysShow) {\n return (\n <ElMenuItem index={onlyOneChild ? pathResolve(fullPath, onlyOneChild.path) : fullPath}>\n {{\n default: () => renderMenuTitle(onlyOneChild ? (onlyOneChild.meta ?? meta) : meta),\n }}\n </ElMenuItem>\n );\n } else {\n return (\n <ElSubMenu\n index={fullPath}\n teleported\n class=\"nest-menu\"\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : ''}>\n {{\n title: () => renderMenuTitle(meta),\n default: () => renderMenuItem(v.children!, fullPath),\n }}\n </ElSubMenu>\n );\n }\n });\n };\n return {\n renderMenuItem,\n };\n };\n","<!--\n * @title: left menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-30 16:12:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 15:14:41\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { ElMenu, ElScrollbar } from 'element-plus';\n import { computed, defineComponent, unref, type PropType } from 'vue';\n import { useRenderMenuItem } from './components/useRenderMenuItem';\n\n import { useStyle } from '@/hook/web/useStyle';\n import { useRouter } from 'vue-router';\n import { isUrl } from '../../utils';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('sidebar');\n\n export default defineComponent({\n name: 'GvSidebar',\n props: {\n menuSelect: {\n type: Function as PropType<(index: string) => void>,\n default: undefined,\n },\n },\n setup(props) {\n const appStore = useAppStore();\n const layout = computed(() => appStore.getLayout);\n const { push, currentRoute } = useRouter();\n const permStore = usePermsStore();\n const menuMode = computed((): 'vertical' | 'horizontal' => {\n const vertical: LayoutType[] = ['default', 'topLeft', 'cutMenu'];\n\n if (vertical.includes(unref(layout))) return 'vertical';\n else return 'horizontal';\n });\n\n const routers = computed(() => (unref(layout) === 'cutMenu' ? permStore.getRouters : permStore.getRouters));\n\n // console.log(routers.value);\n\n const collapse = computed(() => appStore.getCollapseMenus);\n\n const leftMenuUniqueOpened = computed(() => appStore.getLeftMenuUniqueOpened);\n\n const activeMenu = computed(() => {\n const { meta, path } = unref(currentRoute);\n // if set path, the sidebar will highlight the path you set\n if (meta.activeMenu) return meta.activeMenu as string;\n\n return path;\n });\n\n const menuSelect = (index: string) => {\n props.menuSelect?.(index);\n\n // 自定义事件\n if (isUrl(index)) {\n window.open(index);\n return;\n }\n push(index);\n };\n\n const renderMenu = () => (\n <ElMenu\n defaultActive={unref(activeMenu)}\n mode={unref(menuMode)}\n collapse={unref(layout) === 'top' || unref(layout) === 'cutMenu' ? false : unref(collapse)}\n uniqueOpened={unref(layout) === 'top' ? false : unref(leftMenuUniqueOpened)}\n backgroundColor=\"var(--left-menu-bg-color)\"\n textColor=\"var(--left-menu-text-color)\"\n activeTextColor=\"var(--left-menu-text-active-color)\"\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : `${prefixCls}-popper--horizontal`}\n onSelect={menuSelect}>\n {{\n default: () => {\n const { renderMenuItem } = useRenderMenuItem(menuMode);\n // console.log('renderMenu', routers.value);\n return renderMenuItem(unref(routers));\n },\n }}\n </ElMenu>\n );\n const renderMenuWrap = () => {\n if (unref(layout) === 'top') return renderMenu();\n else return <ElScrollbar>{renderMenu()}</ElScrollbar>;\n };\n return () => (\n <div\n id=\"gv-sidebar\"\n class={[\n `${prefixCls} ${prefixCls}__${unref(menuMode)}`,\n 'h-[100%] overflow-hidden flex-col bg-[var(--left-menu-bg-color)]',\n {\n 'w-[var(--left-menu-min-width)]': unref(collapse) && unref(layout) !== 'cutMenu',\n 'w-[var(--left-menu-max-width)]': !unref(collapse) && unref(layout) !== 'cutMenu',\n },\n ]}>\n {renderMenuWrap()}\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-sidebar';\n\n .#{$prefixCls} {\n position: relative;\n transition: width var(--transition-time-02);\n\n :deep(.#{$elNamespace}-menu) {\n width: 100% !important;\n border-right: none;\n --el-menu-bg-color: var(--left-menu-bg-color);\n --el-menu-text-color: var(--left-menu-text-color);\n --el-menu-hover-text-color: var(--left-menu-text-active-color);\n --el-menu-active-color: var(--left-menu-text-active-color);\n --el-menu-hover-bg-color: var(--left-menu-hover-bg-color);\n\n // 设置选中时子标题的颜色\n .is-active {\n & > .#{$elNamespace}-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .#{$elNamespace}-sub-menu__title,\n .#{$elNamespace}-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-color) !important;\n }\n }\n\n // 设置选中时的高亮背景和高亮颜色\n .#{$elNamespace}-menu-item.is-active {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n }\n\n // 设置子菜单的背景颜色\n .#{$elNamespace}-menu {\n .#{$elNamespace}-sub-menu__title {\n background-color: var(--left-menu-bg-color) !important;\n }\n .#{$elNamespace}-menu-item:not(.is-active) {\n background-color: var(--left-menu-item-bg-light-color) !important;\n }\n }\n }\n\n // 折叠时的最小宽度\n :deep(.#{$elNamespace}-menu--collapse) {\n width: var(--left-menu-min-width);\n\n & > .is-active,\n & > .is-active > .#{$elNamespace}-sub-menu__title {\n position: relative;\n background-color: var(--left-menu-collapse-bg-active-color) !important;\n }\n }\n\n // 折叠动画的时候,就需要把文字给隐藏掉\n :deep(.horizontal-collapse-transition) {\n .#{$prefixCls}__title {\n display: none;\n }\n }\n\n // 水平菜单\n &__horizontal {\n height: calc(var(--top-tool-height)) !important;\n\n :deep(.#{$elNamespace}-menu--horizontal) {\n height: calc(var(--top-tool-height));\n border-bottom: none;\n // 重新设置底部高亮颜色\n & > .#{$elNamespace}-sub-menu.is-active {\n .#{$elNamespace}-sub-menu__title {\n border-bottom-color: var(--el-color-primary) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n\n &::after {\n display: none !important;\n }\n }\n\n .#{$prefixCls}__title {\n /* stylelint-disable-next-line */\n max-height: calc(var(--top-tool-height) - 2px) !important;\n /* stylelint-disable-next-line */\n line-height: calc(var(--top-tool-height) - 2px);\n }\n }\n }\n }\n</style>\n\n<style lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-sidebar-popper';\n\n .#{$prefixCls}--vertical,\n .#{$prefixCls}--horizontal {\n // 设置选中时子标题的颜色\n .is-active {\n & > .el-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .el-sub-menu__title,\n .el-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: #545658 !important;\n }\n }\n\n // 设置选中时的高亮背景\n .el-menu-item.is-active {\n position: relative;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n }\n\n $submenu-prefix-cls: '#{$gvNamespace}-submenu-popper';\n\n // 设置子菜单溢出时滚动样式\n .#{$submenu-prefix-cls}--vertical {\n max-height: 100%;\n overflow-y: auto;\n\n &::-webkit-scrollbar {\n width: 6px;\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgb(144 147 153 / 30%);\n border-radius: 4px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSidebar from './src/GvSidebar.vue';\n// Define the install method on the GvButton component\nconst GvSidebarPlugin = {\n install(app: App): void {\n app.component(GvSidebar.name ?? 'GvSidebar', GvSidebar);\n },\n};\nexport default GvSidebarPlugin;\n\nexport { GvSidebar };\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAABaCAYAAAAilKGMAAAACXBIWXMAAAZ2AAAGdgEpJm+AAAAKDGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuYTZhNjM5NjhhLCAyMDI0LzAzLzA2LTExOjUyOjA1ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmQxNjAxODBkLTVlZmUtZjc0MS1iY2RhLTdjMDBjNTc4ZTVkMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1ZDE1ZDUxNC05YzkxLTQwNTYtYTgzNS05YjZlYmRlOTQ5ZmEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB0aWZmOkltYWdlV2lkdGg9IjYzNiIgdGlmZjpJbWFnZUxlbmd0aD0iNjYwIiB0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb249IjIiIHRpZmY6U2FtcGxlc1BlclBpeGVsPSIzIiB0aWZmOlhSZXNvbHV0aW9uPSIxNDQvMSIgdGlmZjpZUmVzb2x1dGlvbj0iMTQ0LzEiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6RXhpZlZlcnNpb249IjAyMzEiIGV4aWY6Q29sb3JTcGFjZT0iNjU1MzUiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI2MzYiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSI2NjAiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTExLTI5VDEyOjQ4OjMzKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0yOVQxMjo0OToxNyswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjExIChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvanBlZyB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGltYWdlL2pwZWcgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MDg4Y2NiMi05NDFlLTQ1YmItOGZhZi02YjA5Mjc0M2Q0MDciIHN0RXZ0OndoZW49IjIwMjQtMTEtMjlUMTI6NDk6MTcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xMSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NWQxNWQ1MTQtOWM5MS00MDU2LWE4MzUtOWI2ZWJkZTk0OWZhIiBzdEV2dDp3aGVuPSIyMDI0LTExLTI5VDEyOjUxOjI0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMTEgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RSZWY6ZG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiLz4gPHRpZmY6Qml0c1BlclNhbXBsZT4gPHJkZjpTZXE+IDxyZGY6bGk+ODwvcmRmOmxpPiA8cmRmOmxpPjg8L3JkZjpsaT4gPHJkZjpsaT44PC9yZGY6bGk+IDwvcmRmOlNlcT4gPC90aWZmOkJpdHNQZXJTYW1wbGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+WfjB/QAAOnxJREFUeJztvXe4XFd19//Z+9Tp5famq2rJVnE3trGxMcY0h2KMDSb04NBCDIQQQgukvKTwQAKEEkIS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\"","<!--\n * @title: sidebar logo\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-15 14:11:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 11:46:47\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { computed, onMounted, ref, unref, watch } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('logo');\n\n const appStore = useAppStore();\n\n const show = ref(true);\n const title = computed(() => appStore.getTitle);\n const layout = computed(() => appStore.getLayout);\n const collapseMenus = computed(() => appStore.getCollapseMenus);\n\n watch(\n () => collapseMenus.value,\n (collapse: boolean) => {\n if (unref(layout) === 'topLeft' || unref(layout) === 'cutMenu') {\n show.value = true;\n return;\n }\n show.value = !collapse;\n },\n );\n\n watch(\n () => layout.value,\n (layout) => {\n if (layout === 'top' || layout === 'cutMenu') show.value = true;\n else if (unref(collapseMenus)) show.value = false;\n else show.value = true;\n },\n );\n\n onMounted(() => {\n if (unref(collapseMenus)) show.value = false;\n });\n</script>\n\n<template>\n <div>\n <router-link\n :class=\"[prefixCls, layout !== 'default' ? `${prefixCls}__Top` : '', 'flex !h-[var(--logo-height)] items-center cursor-pointer pl-[8px] relative decoration-none overflow-hidden']\"\n to=\"/\">\n <img\n src=\"@/assets/imgs/logo.png\"\n class=\"w-[calc(var(--logo-height)-10px)] h-[calc(var(--logo-height)-10px)]\" />\n <div\n v-if=\"show\"\n :class=\"[\n 'block whitespace-nowrap ml-[45px] mr-[0px] mt-[-25px] mb-[0px] text-[16px] font-bold',\n {\n 'text-[var(--logo-title-text-color)]': layout === 'default',\n 'text-[var(--top-header-text-color)]': layout === 'topLeft' || layout === 'top' || layout === 'cutMenu',\n },\n ]\">\n {{ title }}\n </div>\n </router-link>\n </div>\n</template>\n<style lang=\"scss\" scoped></style>\n","import type { App } from 'vue';\nimport GvSidebarLogo from './src/GvSidebarLogo.vue';\n// Define the install method on the GvButton component\nconst GvSidebarLogoPlugin = {\n install(app: App): void {\n app.component(GvSidebarLogo.name ?? 'GvSidebarLogo', GvSidebarLogo);\n },\n};\nexport default GvSidebarLogoPlugin;\n\nexport { GvSidebarLogo };\n","<!--\n * @title: table bar component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:46:02\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-03 14:20:53\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { getVNodeName, getVNodeText } from '@@/utils';\n import { defineComponent, getCurrentInstance, type VNode } from 'vue';\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('table-bar');\n export default defineComponent({\n name: 'GvTableBar',\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n setup(props, { slots }) {\n // @data\n const appStore = useAppStore();\n const instance = getCurrentInstance();\n const { t } = useBridgeI18n();\n // @watch\n\n // @methods\n const createTableBar = () => {\n const tableBar: VNode[] = [];\n const defaultSlots = slots.default?.();\n if (defaultSlots) {\n const parentNode = instance?.parent;\n const refForm = parentNode?.attrs['ref-form'];\n\n const buttonQuick = appStore.buttonQuick;\n const buttonIcon = appStore.buttonIcon;\n const childrenNodes = (defaultSlots[0].children as VNode[]) || [];\n childrenNodes.forEach((vnode: VNode) => {\n const propsData = vnode.props || {};\n if (getVNodeName(vnode) === 'GvButton') {\n const text = getVNodeText(vnode);\n if (text.indexOf(t('tableBar.save')) !== -1 || text.indexOf(t('tableBar.add')) !== -1 || text.indexOf(t('tableBar.append')) !== -1 || text.indexOf(t('tableBar.create')) !== -1) {\n if (text === t('tableBar.add') && buttonQuick) {\n propsData.text = t('tableBar.add2');\n propsData.otext = text;\n } else propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-add';\n propsData.bizType = 'save';\n } else if (propsData.bizType === 'export') {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-daochu1';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.refresh')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-shuaxin';\n propsData.bizType = 'refresh';\n propsData.text = t('tableBar.refresh');\n } else if (text.indexOf(t('tableBar.templateDownload')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-xiazaidaorumoban1x';\n propsData.bizType = 'downloadTemplate';\n } else if (text.indexOf(t('tableBar.dispatch')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-winfo-icon-zhipai';\n propsData.bizType = 'dispatch';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.assign')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhipai';\n propsData.bizType = 'dispatch';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.calculate')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jisuan';\n propsData.text = text;\n propsData.bizType = 'calculate';\n } else if (text.indexOf(t('tableBar.trace')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiankongguanli';\n propsData.text = text;\n propsData.bizType = 'trace';\n } else if (text.indexOf(t('tableBar.receive')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-piliangbianji1';\n propsData.text = text;\n propsData.bizType = 'receive';\n } else if (propsData.bizType === 'import') {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-daoru2';\n propsData.text = text;\n propsData.bizType = 'import';\n } else if (text.indexOf(t('tableBar.generate')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zujian';\n propsData.text = text;\n propsData.bizType = 'generate';\n } else if (text.indexOf(t('tableBar.pay')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-yingshoukuan';\n propsData.text = text;\n propsData.bizType = 'pay';\n } else if (text.indexOf(t('tableBar.check')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-xuanze';\n propsData.text = text;\n propsData.bizType = 'check';\n } else if (text.indexOf(t('tableBar.reject')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-bohui';\n propsData.text = text;\n propsData.bizType = 'reject';\n } else if (text.indexOf(t('tableBar.approve')) !== -1 || text.indexOf(t('tableBar.audit')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-shenpi2';\n propsData.text = text;\n propsData.bizType = 'approve';\n } else if (text.indexOf(t('tableBar.logging')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-rizhi1';\n propsData.bizType = 'logging';\n } else if (text.indexOf(t('tableBar.select')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-chaxun';\n propsData.bizType = 'search';\n }\n // else if (text.indexOf('派') !== -1) {\n // // propsData.text = text;\n // propsData.icon = 'el-icon-finished';\n // propsData.bizType = 'confirm';\n // }\n else if (text.indexOf(t('tableBar.detail')) !== -1 || text.indexOf(t('table.list')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-mingxi';\n propsData.bizType = 'detail';\n } else if (text.indexOf(t('tableBar.withdraw')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-fanhui5';\n propsData.bizType = 'withdraw';\n } else if (text.indexOf(t('tableBar.submit')) !== -1 || text.indexOf('提报') !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tijiao';\n propsData.bizType = 'submit';\n } else if (text.indexOf(t('tableBar.delete')) !== -1 || text.indexOf(t('tableBar.cancel')) !== -1 || text.indexOf(t('tableBar.cancel1')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-delete';\n propsData.bizType = 'delete';\n } else if (text.indexOf(t('tableBar.change')) !== -1 || text.indexOf(t('tableBar.update')) !== -1 || text.indexOf(t('tableBar.modify')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-edit-outline';\n propsData.bizType = 'update';\n } else if (text.indexOf(t('tableBar.sync')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tongbu1';\n propsData.bizType = 'update';\n } else if (text.indexOf(t('tableBar.untop')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-quxiaozhiding1';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.top')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhiding1';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.deserum')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-quxiaozhiding';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.unitPrice')) !== -1) {\n if (buttonIcon)\n // propsData.text = text;\n propsData.icon = 'iconfont gv-icon-jiangjinguize';\n else if (text.indexOf(t('tableBar.essence')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhiding';\n propsData.bizType = 'top';\n propsData.text = text;\n }\n } else if (text.indexOf(t('tableBar.relieve')) !== -1 || text.indexOf(t('tableBar.unbind')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiekou1';\n propsData.bizType = 'unbind';\n } else if (text.indexOf(t('tableBar.bind')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiekoushuoming';\n propsData.bizType = 'bind';\n } else if (text.indexOf(t('tableBar.confirm')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tianshenpi';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.notify')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-huodong';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.payment')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiage';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.transfer')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-fanhui5';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.putaway')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-top';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.soldOut')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-bottom';\n propsData.bizType = 'confirm';\n }\n propsData.refForm = refForm;\n } else if (getVNodeName(vnode) === 'ElDropdown') {\n const firstChild = vnode?.children?.[0];\n const text = getVNodeText(firstChild);\n propsData.text = text;\n propsData.icon = firstChild?.props.icon || '';\n }\n tableBar.push(vnode);\n });\n }\n return tableBar || [];\n };\n // console.log(tableBar);\n\n // @mounted\n\n // @render\n return () => (props.visible ? <div class={prefixCls}>{createTableBar()}</div> : null);\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-table-bar';\n .#{$prefixCls} {\n display: inline-block;\n height: 30px;\n padding-top: 3px;\n\n .el-dropdown {\n float: left;\n\n i {\n padding-right: 3px;\n color: var(--tableBarColor, $tableBarColor);\n\n & + span {\n margin-left: 3px;\n }\n }\n }\n\n :deep(.el-button) {\n float: left;\n height: 25px;\n padding: 2px 8px;\n margin-bottom: 2px;\n margin-left: 2px;\n color: var(--tableBarColor, $tableBarColor);\n text-align: left;\n background: #fff !important;\n border: 0;\n\n i {\n padding-right: 3px;\n color: var(--tableBarColor, $tableBarColor);\n\n & + span {\n margin-left: 3px;\n }\n }\n\n &:hover {\n background-color: rgb(0 82 156 / 5%) !important;\n }\n }\n\n .el-button.is-disabled {\n color: $textColor;\n\n :deep(i) {\n color: $textColor;\n }\n }\n }\n</style>\n","<!--\n * @title: tag component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 14:43:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:37:24\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElTag, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, unref, type PropType } from 'vue';\n import type { TTagEffect, TTagType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tag');\n\n export default defineComponent({\n name: 'GvTag',\n props: {\n type: {\n type: String as PropType<TTagType>,\n default: 'primary',\n },\n closable: {\n type: Boolean,\n default: false,\n },\n effect: {\n type: String as PropType<TTagEffect>,\n default: 'light',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n round: {\n type: Boolean,\n default: false,\n },\n },\n\n // @emits\n emits: ['click', 'close'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const tagSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @methods\n\n const handleClick = (event: MouseEvent) => {\n emit('click', event);\n };\n\n const handleClose = (event: Event) => {\n emit('close', event);\n };\n\n // @render\n return () => (\n <ElTag\n type={props.type}\n size={tagSize.value}\n round={props.round}\n closable={props.closable}\n effect={props.effect}\n class={prefixCls}\n onClick={handleClick}\n onClose={handleClose}>\n {slots.default?.()}\n </ElTag>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tag';\n .#{$prefixCls} {\n }\n</style>\n","<!--\n * @title: tree component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 16:57:41\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-10 17:04:53\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElTree } from 'element-plus';\n import type TreeNode from 'element-plus/es/components/tree/src/model/node';\n import type { AllowDropFunction, FilterNodeMethodFunction, LoadFunction, RenderContentFunction, TreeComponentProps, TreeNodeData } from 'element-plus/es/components/tree/src/tree.type';\n import { defineComponent, ref, type ComponentInternalInstance, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tree');\n\n type TreeData = Record<string, unknown>;\n\n export default defineComponent({\n name: 'GvTree',\n props: {\n treeData: {\n type: Array as PropType<TreeData[]>,\n default: () => [],\n },\n treeProps: {\n type: Object as PropType<TreeComponentProps['props']>,\n default: () => ({}),\n },\n nodeKey: {\n type: String,\n default: undefined,\n },\n lazy: {\n type: Boolean,\n default: false,\n },\n load: {\n type: Function as PropType<LoadFunction>,\n default: undefined,\n },\n showCheckbox: {\n type: Boolean,\n default: false,\n },\n draggable: {\n type: Boolean,\n default: false,\n },\n allowDrop: {\n type: Function as PropType<AllowDropFunction>,\n default: undefined,\n },\n defaultExpandedKeys: {\n type: Array as PropType<(string | number)[]>,\n default: () => [],\n },\n defaultCheckedKeys: {\n type: Array as PropType<(string | number)[]>,\n default: () => [],\n },\n iconClass: {\n type: String,\n default: undefined,\n },\n defaultExpandAll: {\n type: Boolean,\n default: false,\n },\n expandOnClickNode: {\n type: Boolean,\n default: true,\n },\n checkOnClickNode: {\n type: Boolean,\n default: false,\n },\n filterNodeMethod: {\n type: Function as PropType<FilterNodeMethodFunction>,\n default: undefined,\n },\n renderContent: {\n type: Function as PropType<RenderContentFunction>,\n default: undefined,\n },\n },\n\n // @emits\n emits: ['node-click', 'node-expand', 'node-collapse', 'check', 'check-change', 'node-drop'],\n\n setup(props, { emit, expose }) {\n const treeRef = ref<InstanceType<typeof ElTree> | null>(null);\n\n expose({\n getCheckedKeys: (leafOnly?: boolean) => treeRef.value?.getCheckedKeys(leafOnly) ?? [],\n getTreeNodeData: () => {\n const store = (treeRef.value as { store?: { root?: { childNodes?: TreeNode[] } } } | null)?.store;\n const childNodes = store?.root?.childNodes;\n if (childNodes?.length) return childNodes.map((node) => node.data as TreeData);\n return props.treeData;\n },\n });\n\n // @methods\n\n const handleNodeClick = (data: TreeData, node: TreeNode, treeNode: ComponentInternalInstance | null, event: MouseEvent) => {\n emit('node-click', data, node, treeNode, event);\n };\n\n const handleNodeExpand = (data: TreeData, node: TreeNode, treeNode: ComponentInternalInstance | null) => {\n emit('node-expand', data, node, treeNode);\n };\n\n const handleNodeCollapse = (data: TreeData, node: TreeNode, treeNode: ComponentInternalInstance | null) => {\n emit('node-collapse', data, node, treeNode);\n };\n\n const handleCheck = (\n data: TreeData,\n checkedInfo: {\n checkedNodes: TreeNodeData[];\n checkedKeys: (string | number)[];\n halfCheckedNodes: TreeNodeData[];\n halfCheckedKeys: (string | number)[];\n },\n ) => {\n emit('check', data, checkedInfo);\n };\n\n const handleCheckChange = (data: TreeData, checked: boolean, childChecked: boolean) => {\n emit('check-change', data, checked, childChecked);\n };\n\n const handleLazyLoad: LoadFunction = (...args) => {\n props.load?.(...args);\n };\n\n const handleNodeDrop = (draggingNode: TreeNode, dropNode: TreeNode, dropType: 'before' | 'after' | 'inner', event: DragEvent) => {\n emit('node-drop', draggingNode, dropNode, dropType, event);\n };\n\n // @render\n return () => (\n <ElTree\n ref={treeRef}\n class={prefixCls}\n data={props.treeData}\n props={props.treeProps}\n nodeKey={props.nodeKey}\n lazy={props.lazy}\n load={handleLazyLoad}\n draggable={props.draggable}\n allowDrop={props.allowDrop}\n showCheckbox={props.showCheckbox}\n defaultExpandedKeys={props.defaultExpandedKeys}\n defaultCheckedKeys={props.defaultCheckedKeys}\n icon={props.iconClass}\n highlightCurrent\n defaultExpandAll={props.defaultExpandAll}\n expandOnClickNode={props.expandOnClickNode}\n checkOnClickNode={props.checkOnClickNode}\n filterNodeMethod={props.filterNodeMethod}\n renderContent={props.renderContent}\n onNode-click={handleNodeClick}\n onNode-expand={handleNodeExpand}\n onNode-collapse={handleNodeCollapse}\n onNode-drop={handleNodeDrop}\n onCheck={handleCheck}\n onCheck-change={handleCheckChange}\n />\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tree';\n .#{$prefixCls} {\n :deep(.el-tree-node) {\n .el-tree-node__content {\n .el-tree-node__label {\n //font-size: $appTextSize;\n }\n .el-checkbox__input {\n &.is-checked {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTree from './src/GvTree.vue';\n\nconst GvTreePlugin = {\n install(app: App): void {\n app.component(GvTree.name ?? 'GvTree', GvTree);\n },\n};\nexport default GvTreePlugin;\n\nexport { GvTree };\n","/*\n * @title: table utils\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-09 17:50:09\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 11:28:48\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\nimport type { FilterCondition, PageInfo } from '@@/GvTable/src/types';\nimport type { TableInstance } from 'element-plus';\nimport { message } from './gv.notify';\nimport { isEmpty, toHump, toLine } from './index';\n/**\n * @todo: page info condition\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 09:09:54\n * @param {PageInfo} pi\n */\nexport const appendPageInfo = (pi?: PageInfo): PageInfo => {\n const pageInfo: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n const currentpagenum = pi && pi['currentpagenum'] ? pi['currentpagenum'] : 1;\n const recordsperpage = pi && pi['recordsperpage'] ? pi['recordsperpage'] : 10;\n const countrows = pi && pi['countrows'] ? pi['countrows'] : 0;\n const totalpage = pi && pi['totalpage'] ? pi['totalpage'] : 0;\n pageInfo['currentpagenum'] = currentpagenum;\n pageInfo['recordsperpage'] = recordsperpage;\n pageInfo['countrows'] = countrows;\n pageInfo['totalpage'] = totalpage;\n return pageInfo;\n};\n\n/**\n * @todo: common query combined filter conditions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:08:33\n * @param {TableInstance} tabNode\n * @param {Recordable} filter\n */\nexport const combined = (tabNode: TableInstance, filter: Recordable<any>): Recordable<FilterCondition | PageInfo> => {\n const filterConditions: Recordable<FilterCondition | PageInfo> = {};\n if (!isEmpty(filter))\n Object.keys(filter).forEach((x: string) => {\n let val: string = '';\n let co = 'null';\n if (!isEmpty(filter[x])) {\n let sOp = '=';\n if (typeof filter[x] === 'object')\n if (Array.isArray(filter[x] as any[])) {\n // fixme: 增加多选字典 2022-08-01\n let coo = '';\n let labels = '';\n (filter[x] as any[]).forEach((x) => {\n if (coo) {\n coo += ',' + x.value;\n labels += ',' + x.label;\n } else {\n coo = x.value;\n labels = x.label;\n }\n });\n co = coo;\n val = labels;\n } else {\n const v = filter[x] as Recordable<any>;\n co = v.value;\n val = v.label;\n }\n val = val + '';\n if (val.indexOf(',') > 0) val = val.replace(/,/g, ',');\n\n if (val.indexOf(',') > 0) if (sOp !== 'in' && sOp !== 'not in') sOp = 'in';\n const ds = toLine(x);\n const condition: FilterCondition = {\n id: '',\n ds: '',\n va: '',\n co: '',\n op: 'like',\n ac: 'null',\n ki: 'text',\n };\n let type = 'text';\n if (type !== 'dic' && (x.indexOf('id') >= 0 || x.indexOf('Id') >= 0)) type = 'number';\n\n condition['id'] = x;\n condition['ds'] = ds;\n condition['va'] = val.trim();\n condition['co'] = co;\n condition['op'] = sOp || 'like';\n condition['ac'] = 'null';\n condition['ki'] = type;\n filterConditions[x] = condition;\n }\n });\n // 拼接 pageinfo条件\n if (tabNode) {\n const pi: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n pi['recordsperpage'] = (tabNode.$.props?.['pageSize'] as number) ?? 10;\n filterConditions['pageinfo'] = appendPageInfo(pi);\n }\n return filterConditions;\n};\n\n/**\n * @todo: form search combined filter conditions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:31:41\n * @param {FormItem} formList\n * @param {Recordable} filter\n * @param {VNode} tabNode\n */\nexport const searchCombined = (formList: FormItem[], filter: Recordable<any>, tabNode: TableInstance): Recordable<FilterCondition | PageInfo> => {\n const filterConditions: Recordable<FilterCondition | PageInfo> = {};\n // console.log(formList);\n for (const item of formList) {\n const type = item.type;\n if (type !== 'blank') {\n const condition: FilterCondition = {\n id: '',\n ds: '',\n va: '',\n co: '',\n op: 'like',\n ac: 'null',\n ki: 'text',\n };\n const { action, field, op = 'like', upper = false, showLabel, dateType } = item;\n if (action === 'ignore') continue;\n let val = filter[field];\n let co = 'null';\n if (isEmpty(val)) continue;\n // 对于日期范围选择\n if (Array.isArray(val)) if (isEmpty(val[0])) continue;\n // if (type !== 'dic' && (field.indexOf('id') >= 0 || field.indexOf('Id') >= 0))\n // type = 'number';\n // console.log(val);\n let sOp = op;\n if (type === 'dic') {\n if (Array.isArray(val)) {\n // fixme: 增加多选字典 2022-08-01\n let coo = '';\n let labels = '';\n (val as any[]).forEach((x) => {\n if (coo) {\n coo += ',' + x.value;\n labels += ',' + x.label;\n } else {\n coo = x.value;\n labels = x.label;\n }\n });\n co = coo;\n val = labels;\n } else if (showLabel) {\n // 单选字典\n co = val + '';\n val = showLabel;\n } else {\n const v = val as Recordable<any>;\n co = v.value;\n val = v.label;\n }\n\n sOp = '=';\n } else if (type === 'date' || type === 'datetime' || type === 'time') {\n if (op === 'like') sOp = '=';\n if (dateType === 'daterange' || dateType === 'datetimerange' || dateType === 'timerange' || dateType === 'monthrange') val = (val as any[]).join(',');\n } else if (type === 'number') sOp = '=';\n\n let sType = type;\n if (dateType === 'monthrange') sType = 'month';\n\n val = val + '';\n if (!action && val.indexOf(',') > 0) val = val.replace(/,/g, ',');\n\n if (val.indexOf(',') > 0) if (sOp !== 'in' && sOp !== 'not in') sOp = 'in';\n\n sOp = sOp.replace(/</gi, '&lt;');\n sOp = sOp.replace(/>/gi, '&gt;');\n let ds = toLine(field);\n // 多表关联判断是否带表别名 2022-06-23\n if (ds.indexOf('@') > 0) ds = ds.replace('@', '.');\n\n if (upper === true) {\n if (co && co !== 'null') co = co.toUpperCase();\n val = val.toUpperCase();\n // 将ds转为upper函数\n ds = 'upper(' + ds + ')';\n }\n\n condition['id'] = field;\n condition['ds'] = ds;\n condition['va'] = val.trim();\n condition['co'] = co;\n condition['op'] = sOp || 'like';\n condition['ac'] = action || 'null';\n condition['ki'] = sType || 'text';\n filterConditions[field] = condition;\n }\n }\n // 拼接 pageinfo条件\n if (tabNode) {\n const pi: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n pi['recordsperpage'] = (tabNode.$.props?.['pageSize'] as number) ?? 10;\n filterConditions['pageinfo'] = appendPageInfo(pi);\n }\n return filterConditions;\n};\n\n/**\n * @todo: save combined filter conditions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:43:03\n * @param {FormItem} formList\n * @param {Recordable} filter\n */\nexport const saveCombined = (formList: FormItem[], filter: Recordable<any>): Recordable<any> => {\n const filterConditions = {};\n\n try {\n for (const item of formList) {\n const type = item.type;\n if (type !== 'blank') {\n const { action, field, showLabel } = item;\n if (action === 'ignore') continue;\n let val = filter[field];\n let co = 'null';\n if (val === undefined || val === null) continue;\n if (type === 'dic')\n if (showLabel)\n if (Array.isArray(val)) {\n // 多选字典\n let coo = '';\n const labels = '';\n val.forEach((x) => {\n let v: string;\n if (typeof x === 'object') v = x.value;\n else v = x + '';\n if (coo) coo += ',' + v;\n else coo = v;\n });\n co = coo;\n val = labels;\n } else if (typeof val === 'object') {\n co = val.value;\n val = val.label;\n } else {\n co = val + '';\n val = showLabel;\n }\n else if (Array.isArray(val)) {\n // 多选字典\n let coo = '';\n let labels = '';\n val.forEach((x) => {\n if (coo) {\n coo += ',' + x.value;\n labels += ',' + x.label;\n } else {\n coo = x.value;\n labels = x.label;\n }\n });\n co = coo;\n val = labels;\n } else if (typeof val === 'object') {\n co = val.value;\n val = val.label;\n } else\n // if (typeof val !== 'object' && item.dicType.indexOf('t#') >= 0) {\n // Notify.message('[' + field + ']: 字典值设置不正确', 'error');\n // throw new Error('[' + field + ']: 字典值设置不正确');\n // }\n co = val;\n else {\n val = val + ''; // fixme: 对于id等数字,转换为字符类型,防止indexOf出错\n co = val + '';\n }\n if (co === null || co === undefined) {\n message('[' + field + ']: dict value is null', 'error');\n throw new Error('[' + field + ']: dict value is null');\n }\n if (!action && co.indexOf(',') > 0) co = co.replace(/,/g, ',');\n const ds = toHump(field);\n\n filterConditions[ds] = co;\n }\n }\n } catch (error) {\n console.log(error);\n throw new Error('combined data error:' + error);\n }\n return filterConditions;\n};\n","/*\n * @title: crud methods utils\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-25 15:07:35\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 17:43:39\n * @version: 1.0.8\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\nimport type { PageInfo } from '@@/GvTable/src/types/index';\nimport { useStorage } from '@@/hooks/web/useStorage';\nimport type { FormInstance, TableInstance } from 'element-plus';\nimport type { ComponentInternalInstance, VNode } from 'vue';\nimport { message } from './gv.notify';\nimport { appendPageInfo, combined, saveCombined, searchCombined } from './gv.table';\nimport { getVNodeName, isEmpty } from './index';\n/**\n * @todo: common fetch data\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:55:17\n * @param {function} fetch\n * @param {any} data\n */\nconst fetchData = async (fetch: AsyncFn, data: any): Promise<any> => {\n let result = {};\n await fetch(data).then((res) => {\n result = res.datas;\n });\n\n return result;\n};\n\n/**\n * @todo: common submit fetch data\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:39:01\n */\nconst submit = async (fetch: AsyncFn, data: any, hasMsg = true, msg?: string): Promise<any> => {\n let result = {};\n let msgs: string;\n if (msg) msgs = msg;\n else {\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (lang === 'zh-CN') msgs = '操作成功';\n else msgs = 'Operate Ok';\n }\n await fetch(data).then((res) => {\n result = res.datas;\n if (hasMsg) message(msgs, 'success');\n });\n\n return result;\n};\n/**\n * @todo: common fetch table data(with pagination)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:40:36\n */\nconst fetchTable = async (tabNode: TableInstance, fetch: AsyncFn, data: any) => {\n if (tabNode === undefined || tabNode === null) {\n message('table object is null', 'error');\n return false;\n }\n let result = {};\n const tabInnerNode = tabNode.$;\n const exposed = tabInnerNode.exposed as any;\n\n const filterConditions = combined(tabNode, data);\n if (tabNode) {\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n }\n exposed.startLoading();\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n exposed.stopLoading();\n return result;\n};\n\n/**\n * @todo: validate form\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:42:22\n */\nconst checkForms = async (fmNodes: FormInstance[]) => {\n if (fmNodes === undefined || fmNodes === null) {\n message('form object is null', 'error');\n return false;\n }\n let result = true;\n for (const fmNode of fmNodes) {\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n await fmNode2.component.exposed\n .validate()\n .then(() => {\n // todo\n })\n .catch(() => {\n // throw new Error(e);\n result = false;\n Promise.reject('The form failed validation');\n });\n }\n }\n\n return result;\n};\n\n/**\n * @todo: save form\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:45:03\n */\nconst save = async (fmNode: FormInstance, fetch: AsyncFn, check = true, msg?: string) => {\n if (fmNode === undefined || fmNode === null) {\n message('form object is null', 'error');\n return false;\n }\n let result: Recordable<any> | null = {};\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n const formList = fmInnerNode.props.formList as FormItem[];\n let msgs: string;\n if (msg) msgs = msg;\n else {\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (lang === 'zh-CN') msgs = '保存成功';\n else msgs = 'Save OK.';\n }\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const props = fmNode2.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode2);\n // console.log(formList);\n let conditions = {};\n try {\n conditions = saveCombined(formList, filter);\n await fetch(conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n return null;\n }\n } else\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const props = fmNode2.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode2);\n // console.log(formList);\n let conditions = {};\n try {\n conditions = saveCombined(formList, filter);\n await fetch(conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n result = null;\n return;\n }\n })\n .catch(() => {\n // throw new Error(e);\n Promise.reject('The form failed validation');\n result = null;\n });\n }\n\n return result;\n};\n\n/**\n * @todo: update form\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:49:05\n */\nconst update = async (fmNode: FormInstance, id: number, fetch: Async2Fn, check = true, msg?: string) => {\n if (fmNode === undefined || fmNode === null) {\n message('form object is null', 'error');\n return false;\n }\n if (isEmpty(id)) {\n message('pk is null', 'error');\n return false;\n }\n let result: Recordable<any> | null = {};\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n const formList = fmInnerNode.props.formList as FormItem[];\n let msgs: string;\n if (msg) msgs = msg;\n else {\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (lang === 'zh-CN') msgs = '保存成功';\n else msgs = 'Save Ok.';\n }\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(fmNode2);\n const conditions = saveCombined(formList, filter);\n // console.log(conditions);\n\n await fetch(id, conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n } else\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(fmNode2);\n const conditions = saveCombined(formList, filter);\n // console.log(conditions);\n await fetch(id, conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n })\n .catch(() => {\n result = null;\n });\n }\n\n return result;\n};\n\n/**\n * @todo: search for list with form and table\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:11:42\n */\nconst search = async (fmNode: FormInstance, tabNode: TableInstance, fetch: AsyncFn) => {\n if (fmNode === undefined || fmNode === null) {\n message('form object is null', 'error');\n return false;\n }\n if (tabNode === undefined || tabNode === null) {\n message('table object is null', 'error');\n return false;\n }\n let result = {};\n const fmInnerNode = fmNode.$;\n const tabInnerNode = tabNode.$;\n const exposed = tabInnerNode.exposed as any;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n const formList = fmInnerNode.props.formList as FormItem[];\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n // 解析检索条件\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 拼接查询条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(formList);\n const filterConditions = searchCombined(formList, filter, tabNode);\n // console.log(filterConditions);\n // update: 保存查询条件、方法至table对象,为分页组件使用 2022-04-18\n\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n exposed.startLoading();\n\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n // fixme: 清空列表search框内容 2022-04-21\n const tabChildList = (tabNode as any).subTree?.children || [];\n const searchInputNode = tabChildList.filter((x: VNode) => {\n if (getVNodeName(x) === 'gv-input') return true;\n });\n if (searchInputNode[0]) searchInputNode[0].inputValue = '';\n // fixme: 清空列表表头筛选框 2022-12-14\n const tableEl = tabNode.$el as HTMLElement;\n const tableHeader = tableEl.querySelector('.gv-table .el-table__header-wrapper .el-table__header');\n const tableFixedHeader = tableEl.querySelector('.gv-table .el-table__fixed-header-wrapper .el-table__header');\n const columns = tableHeader?.querySelectorAll('.el-table__cell');\n const len = columns?.length || 0;\n for (let i = 0; i < len; i++) {\n const h = columns?.[i]?.querySelector('.render__header');\n if (h) if (h.children[0]) h.children[0].classList.remove('is-selected');\n }\n if (tableFixedHeader) {\n const columnsFixed = tableFixedHeader.querySelectorAll('.el-table__cell');\n const lenFixed = columnsFixed.length;\n for (let i = 0; i < lenFixed; i++) {\n const h = columnsFixed[i].querySelector('.render__header');\n if (h) if (h.children[0]) h.children[0].classList.remove('is-selected');\n }\n }\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n exposed.stopLoading();\n })\n .catch(() => {\n exposed.stopLoading();\n });\n }\n\n return result;\n};\n\n/**\n * @todo: search for list without form but with table\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:22:00\n * @param {*} tabNode\n * @param {*} fetch\n * @param {*} data\n */\nconst searchNoFm = async (tabNode: any, fetch: AsyncFn, data: any) => {\n if (tabNode === undefined || tabNode === null) {\n message('table object is null', 'error');\n return false;\n }\n const tabInnerNode = tabNode.$;\n const exposed = tabInnerNode.exposed as any;\n let result = {};\n const filterConditions = combined(tabNode, data);\n // console.log(JSON.stringify(filterConditions));\n // update: 保存查询条件、方法至table对象,为分页组件使用 2022-04-18\n\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n exposed.startLoading();\n\n exposed.startLoading();\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n // fixme: 清空列表search框内容 2022-04-21\n const tabChildList = (tabNode as any).subTree?.children || [];\n const searchInputNode = tabChildList.filter((x: VNode) => {\n if (getVNodeName(x) === 'gv-input') return true;\n });\n if (searchInputNode[0]) searchInputNode[0].inputValue = '';\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n exposed.stopLoading();\n\n return result;\n};\n\n/**\n * @todo: jump to new page search\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:23:46\n * @param {*} tabNode\n * @param {*} filterConditions\n * @param {*} fetch\n * @param {*} pageInfo\n */\nconst toNewPageSearch = async (tabNode: ComponentInternalInstance | null, filterConditions: Recordable<any>, fetch: AsyncFn, pageInfo: PageInfo) => {\n if (filterConditions === undefined || filterConditions === null) {\n console.log('分页查询失败: 过滤条件为空', 'error');\n return false;\n }\n if (fetch === undefined || fetch === null) {\n message('Paging query failed: Request method is empty', 'error');\n return false;\n }\n let result: Recordable<any> = [];\n const exposed = tabNode?.exposed;\n exposed?.startLoading();\n\n const sfc = filterConditions || {};\n if (sfc['pageinfo'] === undefined) sfc['pageinfo'] = appendPageInfo() as PageInfo;\n // 更新pageinfo\n sfc['pageinfo'].currentpagenum = pageInfo.currentpagenum;\n sfc['pageinfo'].recordsperpage = pageInfo.recordsperpage;\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n })\n .catch((error) => {\n console.log(error);\n });\n\n exposed?.stopLoading();\n\n return result;\n};\n\n/**\n * @todo: 转换单个结果集对象\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 10:11:53\n * @param {*} result\n */\nconst trans = (result) => result;\n\n/**\n * @todo: table insert row\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:27:57\n * @param {*} searchData\n * @param {*} result\n */\nconst insertResult = (searchData: Recordable<any>, result: any) => {\n if (searchData === null || searchData === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (!Array.isArray(searchData.records)) {\n message('form object is null', 'error');\n return;\n }\n if (result === null || result === undefined) return false;\n\n if (Array.isArray(result)) searchData.records.splice(0, 0, ...result);\n else searchData.records.splice(0, 0, trans(result));\n\n return true;\n};\n\n/**\n * @todo: table update row\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:28:33\n * @param {*} searchData\n * @param {*} result\n * @param {*} rownums\n */\nconst updateResult = (searchData: any, result: any, rownums: number) => {\n if (searchData === null || searchData === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (!Array.isArray(searchData.records)) {\n message('form object is null', 'error');\n return false;\n }\n if (result === null || result === undefined) return false;\n if (Array.isArray(result)) searchData.records.splice(0, 0, ...result);\n else {\n const currentRowArr = searchData.records.filter((x: any) => {\n if (x.rownums === rownums) return true;\n });\n const currentRow = currentRowArr[0];\n Object.keys(result).forEach((x) => {\n if (x !== 'rownums') currentRow[x] = result[x];\n });\n }\n return true;\n};\n\n/**\n * @todo: table remove row\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:29:10\n * @param {*} searchData\n * @param {*} index\n */\nconst removeResult = (searchData: any, index: number) => {\n if (searchData === null || searchData === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (!Array.isArray(searchData.records)) {\n message('form object is null', 'error');\n return false;\n }\n searchData.records.splice(index, 1);\n // 设置总条数 - 1\n if (searchData.total) searchData.total = searchData.total - 1;\n\n return true;\n};\n\n/**\n * @todo: 从后端字典对象 { c, v, e, l1, l2 } 取当前语言展示文本\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-03 18:21:13\n * @param {Recordable} dictObj\n * @param {string} lang\n */\nconst getDictDisplayLabel = (dictObj: Recordable<any>, lang?: string | null): string => {\n if (!dictObj || typeof dictObj !== 'object') return '';\n const locale = lang || 'zh-CN';\n switch (locale) {\n case 'en':\n return dictObj.e ?? dictObj.e ?? dictObj.v ?? '';\n case 'l1':\n return dictObj.l1 ?? dictObj.l1 ?? dictObj.v ?? '';\n case 'l2':\n return dictObj.l2 ?? dictObj.l2 ?? dictObj.v ?? '';\n case 'zh-CN':\n default:\n return dictObj.v ?? dictObj.c ?? '';\n }\n};\n\n/**\n * @todo: reset form edit\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:36:39\n * @param {FormItem[]} formList\n */\nconst resetEditValue = (formList: FormItem[]) => {\n if (formList === null || formList === undefined) {\n message('form object is null', 'error');\n return false;\n }\n formList.forEach((x) => {\n if (x.type !== 'blank' && x.keep !== true)\n switch (x.type) {\n case 'text':\n case 'textarea':\n case 'number':\n x.value = '';\n break;\n case 'date':\n x.value = '';\n break;\n case 'dic':\n x.value = '';\n x.showLabel = '';\n break;\n }\n });\n};\n\n/**\n * @todo: table set form value\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:30:16\n * @param {*} formList\n * @param {*} rowData\n */\nconst setEditValue = (formList: FormItem[], rowData: Recordable<any>) => {\n // console.log(rowData);\n if (formList === null || formList === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (rowData === null || rowData === undefined) {\n message('Set data is null', 'error');\n return false;\n }\n resetEditValue(formList);\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang') || 'zh-CN';\n if (Object.keys(rowData).length !== 0)\n formList.forEach((x) => {\n const fieldValue = rowData[x.field];\n if (fieldValue !== undefined)\n if (x.type !== 'blank' && x.keep !== true)\n // const dicType = x.dicType;\n switch (x.type) {\n case 'text':\n case 'textarea':\n case 'number':\n if (fieldValue !== null && typeof fieldValue === 'object') x.value = fieldValue.c;\n else x.value = fieldValue;\n break;\n case 'date':\n if (x.dateType === 'daterange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'datetime':\n if (x.dateType === 'datetimerange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'time':\n if (x.dateType === 'timerange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'layer':\n if (Array.isArray(fieldValue)) x.value = fieldValue;\n else if (fieldValue) {\n const arr = fieldValue.split(',');\n // const arr = [1, '2', 'a'];\n const arr2 = arr.map((x) => {\n if (!isNaN(parseInt(x))) return x * 1;\n else return x;\n });\n x.value = arr2;\n // console.log(x.value);\n } else x.value = [];\n\n break;\n case 'dic':\n // console.log(rowData[x.field]);\n // if (dicType && dicType.indexOf('t#') !== -1)\n // x.value = rowData[x.field];\n // else {\n // fixme: 增加枚举字典类型赋值 2022-11-07\n if (x.dicType && x.dicType.indexOf('e#') >= 0) {\n if (typeof x.value !== 'object') {\n const enums = x.dicType.split('#');\n const items = enums[1].split(':');\n\n for (let i = 0; i < items.length; i++) {\n const itemChild = items[i].split('=');\n if (itemChild[0] === fieldValue + '') {\n x.value = fieldValue;\n x.showLabel = itemChild[1];\n break;\n }\n }\n }\n } else if (x.multiple)\n if (fieldValue !== null) {\n // 多选字典\n if (typeof fieldValue === 'object') {\n const dictObj = fieldValue;\n const c = dictObj.c;\n const v = getDictDisplayLabel(dictObj, lang);\n\n if (c) {\n const codes = c.split(',');\n const labels = v ? v.split(',') : [];\n x.value = codes.map((code: string, i: number) => ({\n value: code,\n label: labels[i] ?? code,\n }));\n x.showLabel = labels;\n } else {\n x.value = [];\n x.showLabel = [];\n }\n } else if (typeof fieldValue === 'string') {\n const c = fieldValue;\n if (c) {\n const op = [];\n c.split(',').forEach((x) => {\n const o: Recordable<any> = {};\n o.value = x;\n (op as Recordable<any>[]).push(o);\n });\n x.value = op;\n } else x.value = [];\n }\n } else x.value = fieldValue;\n else if (fieldValue !== null && typeof fieldValue === 'object') {\n const dictObj = fieldValue;\n const code = String(dictObj.c ?? '').trim();\n const label = getDictDisplayLabel(dictObj, lang).trim();\n if (!code && !label) {\n x.value = '';\n x.showLabel = '';\n } else {\n x.value = { value: code, label: label || code };\n x.showLabel = label || code;\n }\n } else x.value = fieldValue;\n\n break;\n default:\n x.value = fieldValue;\n break;\n }\n });\n // formList = newList;\n};\n\nconst crud = {\n fetchData,\n submit,\n fetchTable,\n save,\n update,\n search,\n searchNoFm,\n toNewPageSearch,\n insertResult,\n updateResult,\n removeResult,\n setEditValue,\n resetEditValue,\n checkForms,\n};\n\nexport { crud };\n","/*\n * @title: table edit row validate rules component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:09:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-10 14:02:40\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n/** ------------------- 验证规则 ------------------------\n * isAny: 默认规则,无校验\n * isAdmin: 验证是否是admin用户\n * isUrl: 验证url格式\n * isLowercase: 验证是否都是小写\n * isUppercase: 验证是否都是大写\n * isLetter: 验证是否都是字母( 不包括标点符号)\n * isEmail: 验证是否是email\n * isPhone: 验证电话号码\n * isIp: 验证是否是ip地址\n * isPhoneTel: 验证是否是手机号或者固定电话号\n * isTelephone: 验证是否是固定电话\n * isIdcard: 验证身份证号\n * isMoney:验证金额格式\n * isBigMoney: 验证金额格式(千位符格式)\n * isNumber: 验证是否是整数数字\n * isNumberLetter: 验证是否是数字和字母\n * isDouble: 验证浮点数格式\n * isName: 验证是否是名称格式\n * isVin: 验证vin码格式\n * isCarno: 验证车牌号(含新能源)\n ----------------------------------------------------\n*/\n\nimport infoMsg from './gv.infomsg';\n\n/**\n * @todo: 计算输入字符串的长度,汉字记为2 英文字母记为1\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 14:56:22\n * @param {*} val 对于多选字典,val是数组类型的字典码\n */\nconst calLength = (val: string[] | string) => {\n if (val === null || val.length === 0) return 0;\n let i, sum;\n sum = 0;\n // fixme: val有可能是数组,需要转化为字符串 2022-04-10\n const v = Array.isArray(val) ? val.join(',') : val;\n for (i = 0; i < v.length; i++)\n if (v.charCodeAt(i) >= 32 && v.charCodeAt(i) <= 126) sum = sum + 1;\n else sum = sum + 2;\n\n return sum;\n};\n\nconst vcity = {\n 11: '北京',\n 12: '天津',\n 13: '河北',\n 14: '山西',\n 15: '内蒙古',\n 21: '辽宁',\n 22: '吉林',\n 23: '黑龙江',\n 31: '上海',\n 32: '江苏',\n 33: '浙江',\n 34: '安徽',\n 35: '福建',\n 36: '江西',\n 37: '山东',\n 41: '河南',\n 42: '湖北',\n 43: '湖南',\n 44: '广东',\n 45: '广西',\n 46: '海南',\n 50: '重庆',\n 51: '四川',\n 52: '贵州',\n 53: '云南',\n 54: '西藏',\n 61: '陕西',\n 62: '甘肃',\n 63: '青海',\n 64: '宁夏',\n 65: '新疆',\n 71: '台湾',\n 81: '香港',\n 82: '澳门',\n 91: '国外',\n};\n\n// 取身份证前两位,校验省份\nconst checkProvince = function (card) {\n const province = card.substr(0, 2);\n if (vcity[province] === undefined) return false;\n\n return true;\n};\n\n// 校验日期\nconst verifyBirthday = function (year, month, day, birthday) {\n const now = new Date();\n const now_year = now.getFullYear();\n // 年月日是否合理\n if (birthday.getFullYear() === +year && birthday.getMonth() + 1 === +month && birthday.getDate() === +day) {\n // 判断年份的范围(3岁到100岁之间)\n const time = now_year - year;\n if (time >= 3 && time <= 100) return true;\n return false;\n }\n return false;\n};\n\n// 检查生日是否正确\nconst checkBirthday = function (card) {\n const len = card.length;\n // 身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字\n if (len === 15) {\n const re_fifteen = /^(\\d{6})(\\d{2})(\\d{2})(\\d{2})(\\d{3})$/;\n const arr_data = card.match(re_fifteen);\n const year = arr_data[2];\n const month = arr_data[3];\n const day = arr_data[4];\n const birthday = new Date('19' + year + '/' + month + '/' + day);\n return verifyBirthday('19' + year, month, day, birthday);\n }\n // 身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X\n if (len === 18) {\n const re_eighteen = /^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$/;\n const arr_data = card.match(re_eighteen);\n const year = arr_data[2];\n const month = arr_data[3];\n const day = arr_data[4];\n const birthday = new Date(year + '/' + month + '/' + day);\n return verifyBirthday(year, month, day, birthday);\n }\n return false;\n};\n\n// 15位转18位身份证号\nconst changeFivteenToEighteen = function (card) {\n if (card.length === 15) {\n const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let cardTemp = 0;\n let i;\n card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);\n for (i = 0; i < 17; i++) cardTemp += card.substr(i, 1) * arrInt[i];\n\n card += arrCh[cardTemp % 11];\n return card;\n }\n return card;\n};\n\n// 校验位的检测\nconst checkParity = function (card) {\n // 15位转18位\n card = changeFivteenToEighteen(card);\n const len = card.length;\n if (len === 18) {\n const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let cardTemp = 0;\n let valnum = '';\n for (let i = 0; i < 17; i++) cardTemp += card.substr(i, 1) * arrInt[i];\n\n valnum = arrCh[cardTemp % 11];\n if (valnum === card.substr(17, 1)) return true;\n\n return false;\n }\n return false;\n};\n\nconst htTableValidate = {\n /**\n * @todo: 校验长度是否符合\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 14:48:17\n */\n isLength: (language, value, max) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const len = calLength(value);\n if (len > max) return infoMsg.maxLen(language, max);\n else return true;\n }\n },\n /**\n * @todo: 验证浮点数格式\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:54:58\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isDouble: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg = /^\\d+(\\.\\d+)?$/;\n if (!reg.test(value)) return infoMsg.double(language);\n else return true;\n }\n },\n /**\n * @todo: 验证身份证号\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:54:58\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isIdcard: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n // 校验长度\n const reg = /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/;\n if (!reg.test(value)) return infoMsg.idCard(language);\n else if (checkProvince(value) === false)\n // 检查省份\n return infoMsg.idCard(language);\n else if (checkBirthday(value) === false)\n // 校验生日\n return infoMsg.idCard(language);\n else if (checkParity(value) === false)\n // 检验位的检测\n return infoMsg.idCard(language);\n else return true;\n }\n },\n\n /**\n * @todo: 验证车牌号(含新能源)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:55:38\n * @param {*} handle\n */\n isCarno: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else if (value.length === 7) {\n const pattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;\n if (!pattern.test(value)) return infoMsg.carNo(language);\n else return true;\n } else {\n const pattern2 = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DABCEFGHJK][A-HJ-NP-Z0-9][0-9]{4}$))/;\n if (!pattern2.test(value)) callback(new Error(infoMsg.carNo(language)));\n else return true;\n }\n },\n\n /**\n * @todo: 验证金额格式(不能以0开头,小数点只能是2位)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 15:38:24\n */\n isMoney: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const { max } = rule;\n // eslint-disable-next-line no-useless-escape\n const pattern = /^[\\-\\+]?(([1-9]\\d*)|0)(\\.\\d{1,2})?$/;\n const val = value + '';\n // var rv = val.replace(/[,]/g, '');\n if (!pattern.exec(val)) return infoMsg.money(language);\n else if (val.indexOf('.') > 0)\n if (val.split('.')[0].length > max - 3)\n // 校验整数位格式只能是maxLength -3\n return infoMsg.moneyMax(language, max - 3);\n else return true;\n else if (val.length > max - 3) callback(new Error(infoMsg.moneyMax(language, max - 3)));\n else return true;\n }\n },\n /**\n * @todo: 验证带千位符金额格式\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:48:15\n * @param {*} str\n */\n isBigMoney: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n // eslint-disable-next-line no-useless-escape\n const reg = /^[\\-\\+]?([0-9]\\d*|0|[1-9]\\d{0,2}(,\\d{3})*)(\\.\\d+)?$/;\n if (!reg.test(value)) return infoMsg.money(language);\n else return true;\n }\n },\n /**\n * @todo: 验证是否都是字母( 不包括标点符号)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:48:15\n * @param {*} str\n */\n isLetter: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg = /^[A-Za-z]+$/;\n if (!reg.test(value)) return infoMsg.letter(language);\n else return true;\n }\n },\n /**\n * @todo: 验证是否是整数数字\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\n */\n isNumber: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg = /^\\+?[0-9][0-9]*$/;\n if (!reg.test(value)) return infoMsg.number(language);\n else return true;\n }\n },\n /**\n * @todo: 验证是否是整数数字(不能以0开始)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\n */\n isNumber0: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg = /^\\+?[1-9][0-9]*$/;\n if (!reg.test(value)) return infoMsg.number0(language);\n else return true;\n }\n },\n /**\n * @todo: 验证是否数字和字母\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\n */\n isNumberLetter: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg = /^([a-z]|[A-Z]|[ ]|[(]|[)]|[-]|[_]|[*]|[.]|[,]|[,]|[0-9]){0,200}$/;\n if (!reg.test(value)) return infoMsg.numberLetter(language);\n else return true;\n }\n },\n /**\n * @todo: 验证是否数字和字母\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\n */\n isName: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg = /^[a-zA-Z0-9-_. \\u4E00-\\u9FA5]{0,60}$/;\n if (!reg.test(value)) return infoMsg.name(language);\n else return true;\n }\n },\n\n /**\n * @todo: 验证电话号码\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:41:04\n * @param {*} phone\n */\n isPhone: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg = /^1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\\d{8}$/;\n if (!reg.test(value)) return infoMsg.phone(language);\n else return true;\n }\n },\n\n /**\n * @todo: 验证是否email\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:40:50\n * @param {*} email\n */\n isEmail: (language, rule, value, callback) => {\n // eslint-disable-next-line no-useless-escape\n if (value === '' || value === undefined || value == null) return true;\n else {\n // eslint-disable-next-line no-useless-escape\n const reg = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n if (!reg.test(value)) return infoMsg.email(language);\n else return true;\n }\n },\n /**\n * @todo: 验证是否是固定电话\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:39:10\n */\n isTelephone: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg = /0\\d{2}-\\d{7,8}/;\n if (!reg.test(value)) return infoMsg.telephone(language);\n else return true;\n }\n },\n /**\n * @todo: 验证手机号码或者固话\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:51:38\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isPhoneTel: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg = /^((0\\d{2,3}-\\d{7,8})|(1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\\d{8}))$/;\n if (!reg.test(value)) return infoMsg.phoneTel(language);\n else return true;\n }\n },\n /**\n * @todo: 验证是否是ip地址\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:50:44\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isIp: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg = /^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$/;\n if (!reg.test(value)) return infoMsg.ip(language);\n else return true;\n }\n },\n /**\n * @todo: 验证是否是url\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:42:31\n * @param {*} url\n */\n isUrl: (language, rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return true;\n else {\n const reg =\n /^(https?|ftp):\\/\\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+\\.?(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\\/($|[a-zA-Z0-9.,?'\\\\+&%$#=~_-]+))*$/;\n if (!reg.test(value)) return infoMsg.url(language);\n else return true;\n }\n },\n /**\n * @todo: 验证vin\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-05-01 19:31:14\n */\n isVin: (language, rule, value, callback) => {\n const reg = /^[A-Z0-9]+$/;\n // console.log(reg.test(value));\n if (value === '' || value === undefined || value == null) return true;\n else if (value.length !== 8 && value.length !== 17) return infoMsg.vin(language);\n else if (!reg.test(value)) return infoMsg.vin(language);\n else return true;\n },\n};\n\nexport default htTableValidate;\n","<!--\n * @title: table component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:32:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-11 09:49:27\n * @version: 1.1.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStorage } from '@/hook/web/useStorage';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvDatePicker } from '@@/GvDatePicker';\n import { GvIcon } from '@@/GvIcon';\n import { GvInput } from '@@/GvInput';\n import { GvInputNumber } from '@@/GvInputNumber';\n import { GvPopconfirm } from '@@/GvPopconfirm';\n import type { TPopoverPlacement } from '@@/GvPopover/src/types';\n import { GvSelect } from '@@/GvSelect';\n import { GvTableBar } from '@@/GvTableBar';\n import GvTag from '@@/GvTag/src/GvTag.vue';\n import { GvTree } from '@@/GvTree';\n import { dateFormatConfig, debounce, hasClass, hasScrollbar, isEqual, toLine } from '@@/utils';\n import { crud } from '@@/utils/gv.crud';\n import { confirm, message } from '@@/utils/gv.notify';\n import GvTableValidate from '@@/utils/gv.table.validate';\n import { Operation, Refresh } from '@element-plus/icons-vue';\n import {\n ElButton,\n ElButtonGroup,\n ElCheckbox,\n ElDivider,\n ElPagination,\n ElPopover,\n ElRadio,\n ElRadioGroup,\n ElTable,\n ElTableColumn,\n ElTooltip,\n useGlobalConfig,\n type ComponentSize,\n type TableColumnCtx,\n type TableInstance,\n } from 'element-plus';\n import type { AllowDropFunction } from 'element-plus/es/components/tree/src/tree.type';\n import { computed, defineComponent, getCurrentInstance, nextTick, onMounted, ref, unref, watch, type PropType, type VNode } from 'vue';\n import type { FilterCondition, PageInfo } from './types';\n\n type ColumnTreeNode = { columnProp: string; label: string };\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('table');\n /** 表头筛选 Popover:覆盖 EP 默认 150px,按内容自适应宽度 */\n const tableHeadFilterPopoverPopperStyle = {\n width: 'max-content',\n minWidth: '180px',\n maxWidth: 'min(420px, 90vw)',\n };\n export default defineComponent({\n name: 'GvTable',\n props: {\n refTable: {\n type: String,\n required: false,\n default: undefined,\n },\n tableHead: {\n type: Array as PropType<TableHeadItem[]>,\n required: true,\n default: () => [],\n },\n tableData: {\n type: Object as PropType<Recordable<any>>,\n required: false,\n default: () => {},\n },\n height: {\n type: [Number, String],\n required: false,\n default: undefined,\n },\n maxHeight: {\n type: [Number, String, undefined] as PropType<number | string | undefined>,\n required: false,\n default: undefined,\n },\n maxWidth: {\n type: [Number, String],\n required: false,\n default: undefined,\n },\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n pageSize: {\n type: Number,\n required: false,\n default: 10,\n },\n rowClassName: {\n type: Function,\n required: false,\n default: () => {},\n },\n rowStyle: {\n type: Function,\n required: false,\n default: () => {},\n },\n spanMethod: {\n type: Function,\n required: false,\n default: () => {},\n },\n cellStyle: {\n type: Function,\n required: false,\n default: () => {},\n },\n // tableImport: {\n // type: Boolean,\n // required: false,\n // default: false\n // },\n // tableExport: {\n // type: Boolean,\n // required: false,\n // default: false\n // },\n tableType: {\n type: String,\n required: false,\n default: undefined,\n },\n tableSort: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n tableKit: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n tableBar: {\n type: Boolean,\n required: false,\n default: true,\n },\n border: {\n type: Boolean,\n required: false,\n default: true,\n },\n tableFetch: {\n type: Function,\n required: false,\n default: () => {},\n },\n multi: {\n // 是否多选\n type: Boolean,\n required: false,\n default: false,\n },\n layout: {\n type: String,\n required: false,\n default: 'total, sizes, prev, pager, next, jumper',\n },\n isShowPage: {\n type: Boolean,\n required: false,\n default: true,\n },\n total: {\n type: Boolean,\n required: false,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n required: false,\n default: 'default',\n },\n tableInit: {\n type: Boolean,\n required: false,\n default: false,\n },\n beforeImport: {\n type: Function,\n required: false,\n default: undefined,\n },\n tableFilter: {\n type: Object,\n required: false,\n default: undefined,\n },\n tableCb: {\n type: Function,\n required: false,\n default: undefined,\n },\n expandRowKeys: {\n type: Array,\n required: false,\n default: undefined,\n },\n limitHeight: {\n type: Boolean,\n required: false,\n default: true,\n },\n tableAction: {\n type: String,\n required: false,\n default: 'left',\n },\n tableActionIcon: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n emits: ['row-dblclick'],\n // emit\n setup(props, { slots, expose, emit, attrs }) {\n // @data\n const appStore = useAppStore();\n const userStore = useUserStore();\n const { getStorage, setStorage } = useStorage('localStorage');\n const instance = getCurrentInstance();\n let lang = 'zh-CN';\n const sTableAction = appStore.tableAction || props.tableAction;\n const sTableActionIcon = appStore.tableActionIcon;\n const sTableConfirm = appStore.buttonConfirm;\n const detailPlacement: TPopoverPlacement = sTableAction === 'left' ? 'right-start' : 'left-start';\n let sTableType = props.tableType;\n let originTableHead: TableHeadItem[] = props.tableHead;\n let tableHeads: TableHeadItem[] = [];\n const vref = 'gv-table-' + props.refTable;\n const { t } = useBridgeI18n();\n const globalSize = useGlobalConfig('size');\n\n const sHeight = props.height;\n const sMaxHeight = ref(props.maxHeight);\n const sMaxWidth = ref(props.maxWidth || '100%');\n const loading = ref(false);\n let isEditTable = false; // 是否是编辑列表\n const pageInfo = ref<PageInfo>({\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n });\n const filterConditions: FilterCondition[] = [];\n let sPageSize = props.pageSize;\n\n const resultData = ref(props.tableData);\n const recordsList = ref(props.tableData?.records || []);\n const pageSizes = [10, 20, 50, 100, 200, 500];\n let filterHeads: string[] = []; // 表头Q过滤列缓存\n const popoverVisible = ref({}); // popover筛选使用\n const exportBtnDisabled = ref(true); // 导出按钮disabled\n const exportBtnLoading = ref(false); // 导出按钮loading\n const importBtnLoading = ref(false); // 导入按钮loading\n const tableSortMode = ref(1); // 列表默认排序方式\n const exportDialogShow = ref(false); // 导出列弹出框\n const importDialogShow = ref(false); // 导入弹出框\n const sTableBar = ref(props.tableBar); // 是否显示tablebar\n const gTableBar = appStore.tableBar;\n const tableSearchShow = ref(false); // 是否带有table search框\n const sTableSort = ref(props.tableSort); // 是否显示排序模式框\n const sTableKit = ref(props.tableKit); // 是否显示工具按钮\n const showPopoverDetail = ref<VNode | null>(null);\n const pageLayout = ref(props.layout);\n let actionWidth: number = 0; // 操作列宽度\n let transHash: Recordable<string> | null = null; // 列表列缓存\n const headColumn = ref<VNode[]>([]); // 列表列\n const headColumnInit = ref<VNode[]>([]);\n\n const columnSums: string[] = []; // 合计列\n const columnSumsDecimal: number[] = []; // 合计列位数\n const isIndeterminate = ref([]); // 表头筛选全选\n\n let isAnchor = false; // 是否锚点中列表\n let isScrollbar = false; // 是否dialog中有滚动条\n let isEditContainer = false; // 是否是editContainer标签内\n const columnTreeList = ref<ColumnTreeNode[]>([]); // 列表显示、排序数组\n const columnCheckedKeys = ref<string[]>([]); // 列表显示、排序选中数组\n const columnTreeRef = ref<{ getCheckedKeys?: (leafOnly?: boolean) => (string | number)[]; getTreeNodeData?: () => ColumnTreeNode[] } | null>(null);\n const TABLE_FIELD_STORAGE_KEY = 'export-table-fields-' + userStore.loginAccount;\n\n const getTableFieldStore = (): Record<string, string> => {\n const store = getStorage(TABLE_FIELD_STORAGE_KEY);\n return store && typeof store === 'object' ? store : {};\n };\n\n const getTableFieldsFromStorage = (): string => {\n if (!props.refTable) return '';\n const value = getTableFieldStore()[props.refTable];\n return typeof value === 'string' ? value : '';\n };\n\n const setTableFieldsToStorage = (value: string) => {\n if (!props.refTable) return;\n const store = getTableFieldStore();\n store[props.refTable] = value;\n setStorage(TABLE_FIELD_STORAGE_KEY, store);\n };\n\n let lsTableHeads = '';\n let debounceSearch;\n const tableRefs = ref<Record<string, TableInstance | null>>({}); // 表单实例引用,默认空对象\n const tableRef = ref<TableInstance | null>(null); // ElForm 元素引用\n const loginLang = userStore.language;\n if (loginLang === 'en') lang = 'en';\n\n // @computed\n const tableSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n /**\n * @todo: pageinfo\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 11:15:00\n */\n const getPageInfo = computed((): PageInfo => {\n const pi: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n if (resultData.value && resultData.value.records !== undefined) {\n pi['currentpagenum'] = resultData.value.current;\n pi['totalpage'] = resultData.value.pages;\n // if (this.sPageSize)\n // pi['size'] = this.sPageSize;\n // else\n pi['recordsperpage'] = resultData.value.size;\n pi['countrows'] = resultData.value.total;\n }\n return pi;\n });\n\n // @method\n\n const setTableRef = (el: TableInstance | null) => {\n tableRef.value = el;\n if (el && props.refTable) tableRefs.value[vref] = el;\n };\n\n const difference = (newVal, oldVal) => {\n let diff = false;\n for (const key in newVal)\n if (!isEqual(newVal[key], oldVal[key])) {\n diff = true;\n break;\n }\n\n return diff;\n };\n\n /**\n * @todo: close all filter popover\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 13:17:27\n * @param {*} property\n */\n const closeAllPopover = (property?: string) => {\n const next = { ...popoverVisible.value };\n Object.keys(next).forEach((key) => {\n if (key !== property) next[key] = false;\n });\n popoverVisible.value = next;\n };\n\n const ensurePopoverKey = (propKey: string) => {\n if (popoverVisible.value[propKey] === undefined) popoverVisible.value = { ...popoverVisible.value, [propKey]: false };\n };\n\n const handlePopoverWrapper = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n /** 阻止表头/表格事件冒泡,避免点击筛选面板内输入框时关闭 Popover */\n const wrapPopoverFilterBody = (body: VNode) => (\n <div\n class=\"table-popover__content\"\n onMousedown={(e: MouseEvent) => e.stopPropagation()}\n onClick={(e: MouseEvent) => e.stopPropagation()}>\n {body}\n </div>\n );\n const getScrollLeft = () => {\n closeAllPopover();\n };\n\n const startLoading = () => {\n loading.value = true;\n };\n const stopLoading = () => {\n loading.value = false;\n };\n\n /**\n * @todo: calculate max height\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-25 16:16:19\n * @param {*} rootEl\n */\n const getMaxHeight = (rootEl: HTMLElement | undefined) => {\n if (props.limitHeight)\n if (!isEditContainer)\n if (!isScrollbar)\n if (!isAnchor) {\n if (props.tableType !== 'detail')\n if (props.tableType === 'import') sMaxHeight.value = undefined;\n else if (props.maxHeight)\n // if (this.sTableType === 'expand')\n // this.sMaxHeight = undefined;\n // else\n sMaxHeight.value = props.maxHeight;\n else {\n // tab table\n // const tabPane = this.$el.closest('.el-tabs');\n const tabPane = rootEl?.closest('.el-tab-pane');\n // alert(tabPane.clientHeight);\n if (tabPane) {\n // const offsetTop = tabPane.classList.contains('el-tabs--left') ? 235 : 295;\n if (props.isShowPage) sMaxHeight.value = tabPane.clientHeight - 135;\n else sMaxHeight.value = tabPane.clientHeight - 85;\n // sMaxHeight = document.documentElement.clientHeight - tabPane.offsetTop - offsetTop;\n const dialog = rootEl?.closest('.gv-dialog');\n if (!dialog) {\n const drawer = rootEl?.closest('.gv-drawer');\n if (drawer)\n // sMaxHeight = sMaxHeight + 30;\n sMaxHeight.value = undefined;\n } else sMaxHeight.value = undefined; // sMaxHeight = sMaxHeight + 30;\n } else {\n // common table\n const dialog = rootEl?.closest('.gv-dialog');\n if (!dialog) {\n const drawer = rootEl?.closest('.gv-drawer');\n // console.log(document.documentElement.clientHeight);\n // console.log(rootEl?.offsetTop);\n if (!drawer) sMaxHeight.value = document.documentElement.clientHeight - (rootEl?.offsetTop ?? 0) - 150;\n // console.log(sMaxHeight);\n } // dialog\n else sMaxHeight.value = document.documentElement.clientHeight - (rootEl?.offsetTop ?? 0) - 265;\n }\n }\n } else sMaxHeight.value = undefined;\n else sMaxHeight.value = undefined;\n if (sMaxHeight.value && Number(sMaxHeight.value) < 150) sMaxHeight.value = undefined;\n };\n\n /**\n * @todo: trans records\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 11:33:48\n * @param {*} loadAction\n */\n const transRecords = (loadAction?: string) => {\n if (recordsList.value && recordsList.value.length > 0 && recordsList.value[0]['transHash']) {\n transHash = recordsList.value[0]['transHash'];\n recordsList.value.splice(0, 1);\n }\n // add: 增加查询回调方法 2022-11-23\n if (loadAction !== 'create' && props.tableCb) props.tableCb(recordsList.value, resultData.value);\n };\n\n /**\n * @todo: handle import btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 09:43:56\n */\n const handleImport = () => {\n if (props.beforeImport)\n if (props.beforeImport(props.refTable, tableHeads, props.tableData)) {\n importDialogShow.value = true;\n // 设置loading\n importBtnLoading.value = true;\n } else importDialogShow.value = false;\n else {\n importDialogShow.value = true;\n // 设置loading\n importBtnLoading.value = true;\n }\n };\n\n const handleExport = () => {\n exportDialogShow.value = true;\n // 设置loading\n exportBtnLoading.value = true;\n };\n\n /**\n * @todo: import btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 09:41:45\n */\n const getImportBtn = computed(() => {\n if (slots.import?.()) {\n let buttonName = t('tableBar.import');\n if (slots.import?.()[0].props?.['import-name']) buttonName = slots.import?.()[0].props?.['import-name'];\n const ref = 'gv-import-' + props.refTable;\n return (\n <GvButton\n bizType=\"import\"\n ref={ref}\n onClick={handleImport}\n loading={importBtnLoading.value}>\n {buttonName}\n </GvButton>\n );\n } else return null;\n });\n\n /**\n * @todo: get export btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-25 16:22:42\n * @param {*} computed\n */\n const getExportBtn = computed(() => {\n if (slots.export?.()) {\n let buttonName = t('common.export');\n if (slots.export?.()[0].props?.['export-name']) buttonName = slots.export?.()[0].props?.['export-name'];\n const ref = 'gv-export-' + props.refTable;\n return (\n <GvButton\n bizType=\"export\"\n ref={ref}\n onClick={handleExport}\n loading={exportBtnLoading.value}\n disabled={exportBtnDisabled.value}>\n {buttonName}\n </GvButton>\n );\n } else return null;\n });\n\n /**\n * @todo: change page size\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-22 17:24:46\n */\n const runPageSearch = async () => {\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n const fetchFn: Fn = instance?.exposed?.fetch || props.tableFetch;\n if (!fetchFn) {\n message(t('table.execSearchWarn'));\n return;\n }\n const result = await crud.toNewPageSearch(instance, fC, fetchFn, pageInfo.value);\n if (result) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n };\n\n const handleSizeChange = async (val: number) => {\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n getMaxHeight(rootEl);\n pageInfo.value.recordsperpage = val;\n pageInfo.value.currentpagenum = 1;\n sPageSize = val;\n await runPageSearch();\n };\n\n const handleCurrentChange = async (val: number) => {\n pageInfo.value.currentpagenum = val;\n await runPageSearch();\n };\n\n /**\n * @todo: 查询输入框输入响应事件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-19 15:18:03\n * @param {*} val\n */\n const handleTableSearchInput = (val) => {\n debounceSearch(val);\n };\n\n /**\n * @todo: search table input event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-26 22:06:01\n * @param {*} val\n */\n const handleTableSearch = async (val: string) => {\n const fh = {};\n let strFh = '';\n filterHeads.forEach((x: string) => {\n // fixme: 转换@为. 2022-07-20\n let y = x;\n if (y.indexOf('@') > 0) y = y.replace('@', '.');\n if (strFh === '') strFh = toLine(y);\n else strFh += ',' + toLine(y);\n });\n const v = val + '';\n fh['fields'] = strFh;\n fh['val'] = v.trim();\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n fC['searchfilter'] = fh;\n\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n if (!fetch) {\n message(t('table.execSearchWarn'));\n return;\n }\n\n // 拼接 过滤条件\n pageInfo.value.currentpagenum = 1;\n const result = await crud.toNewPageSearch(instance, fC, fetch, pageInfo.value);\n if (result && result.records) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n };\n /**\n * @todo: 列表search框\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-30 17:24:09\n */\n const getTableSearch = () =>\n tableSearchShow.value === true ? (\n <div class=\"gv-table__search\">\n <GvInput\n id=\"gv-table-search\"\n placeholder={`${t('table.tableSearch')}(+)..`}\n prefixIcon=\"gv-icon-sousuo\"\n size=\"default\"\n class=\"gv-table__search-input\"\n onInput={handleTableSearchInput}></GvInput>\n </div>\n ) : null;\n\n /**\n * @todo: table head popover show\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-08 10:43:51\n */\n const handlePopoverShow = () => {\n nextTick(() => {\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n if (rootEl) {\n const popOvers = document.querySelectorAll('body>div>.table-popover');\n const tableBodyWidth = (rootEl.querySelector('.el-table__body-wrapper >.el-table__body') as HTMLElement)?.style.width;\n const clientWidth = document.body.clientWidth - 200 - 20;\n for (let i = 0; i < popOvers.length; i++)\n if ((popOvers[i] as HTMLElement).style.display !== 'none') {\n const bodyWrapper = rootEl.querySelector('.el-table__body-wrapper') as HTMLElement;\n if (bodyWrapper?.scrollLeft ?? 0)\n (popOvers[i] as HTMLElement).style.left = parseInt(tableBodyWidth) - clientWidth + parseInt((popOvers[i] as HTMLElement).style.left) - (bodyWrapper?.scrollLeft ?? 0) + 'px';\n else (popOvers[i] as HTMLElement).style.left = parseInt((popOvers[i] as HTMLElement).style.left) - (bodyWrapper?.scrollLeft ?? 0) + 'px';\n }\n }\n });\n };\n const handlePopoverHide = () => {\n // this.popoverVisible[prop] = false;\n };\n\n /**\n * @todo: table refresh btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:45:55\n */\n const handleTableRefresh = async () => {\n // 判断search框中是否有值\n const el = instance?.vnode?.el as HTMLElement | undefined;\n if (el) {\n const inputSearch = el.querySelector('.gv-table__search-input .el-input__inner') as HTMLInputElement;\n if (inputSearch && inputSearch.value !== undefined && inputSearch.value !== null && inputSearch.value !== '') {\n inputSearch.value = '';\n handleTableSearch('');\n } else {\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n // 拼接 过滤条件\n pageInfo.value.currentpagenum = 1;\n const result = await crud.toNewPageSearch(instance, fC, fetch, pageInfo.value);\n if (result && result.records) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n }\n }\n };\n\n /**\n * @todo: tablebar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 11:21:41\n */\n const getTableBar = () => {\n const btns: any[] = [];\n const defaultSlots = slots.default?.();\n if (defaultSlots && defaultSlots.length > 0)\n defaultSlots.forEach((x: VNode) => {\n // add table btn bar\n if (typeof x.type === 'object' && x.type !== null && 'name' in x.type && x.type.name === 'GvButton') btns.push(x);\n });\n // export btn\n const exportSlots = slots.export?.();\n if (exportSlots && exportSlots.length > 0)\n exportSlots.forEach(() => {\n btns.push(getExportBtn.value);\n });\n\n // import btn\n const importSlots = slots.import?.();\n if (importSlots && importSlots.length > 0)\n importSlots.forEach(() => {\n btns.push(getImportBtn.value);\n });\n\n // console.log(btns);\n return btns;\n };\n\n /**\n * @todo: sort mode\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 11:17:36\n */\n const getSortModel = () => {\n let isVisible = true;\n if (sTableSort.value !== undefined) isVisible = sTableSort.value;\n else isVisible = props.tableType !== 'import';\n return isVisible === true ? (\n <div\n class=\"gv-table__sortmode\"\n style={{ marginRight: `${tableSearchShow.value === true ? '10px' : '0'}` }}>\n <i class=\"iconfont gv-icon-paixu2\" />\n <ElRadioGroup\n modelValue={tableSortMode.value}\n onUpdate:modelValue={(val: number) => {\n tableSortMode.value = val;\n }}\n ref=\"gv-table-sortmode\">\n <ElRadio value={1}>{t('common.currentPage')}</ElRadio>\n <ElRadio\n value={2}\n disabled={pageInfo.value?.totalpage === 1}>\n {t('common.all')}\n </ElRadio>\n </ElRadioGroup>\n </div>\n ) : null;\n };\n\n /**\n * @todo: column filter handler\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:27:41\n * @param {*} e\n * @param {*} propField\n * @param {*} type\n */\n const columnFilterHandler = async (e: MouseEvent, propField: string, type: string) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const popoverHtml = target.closest('.table-popover');\n if (!popoverHtml) return;\n const inputHtml = popoverHtml.querySelector<HTMLInputElement>('.gv-input .el-input__inner');\n const checkList = popoverHtml.querySelectorAll('.el-checkbox');\n const dateHtmlArr = popoverHtml.querySelectorAll<HTMLInputElement>('.gv-datepicker .el-range-input');\n let filterValue = '';\n switch (type) {\n case 'text':\n case 'number':\n if (!inputHtml) return;\n filterValue = inputHtml.value;\n if (filterValue.length === 0)\n // Notify.alert('请输入筛选内容', 'warning');\n return;\n\n break;\n case 'date':\n if (dateHtmlArr.length < 2) return;\n filterValue = dateHtmlArr[0].value + '|' + dateHtmlArr[1].value;\n break;\n case 'dic':\n for (const check of Array.from(checkList))\n if (check instanceof HTMLElement && hasClass(check, 'is-checked'))\n if (check.textContent !== t('common.checkAll')) {\n const original = check.querySelector<HTMLInputElement>('.el-checkbox__original');\n if (original) filterValue = filterValue !== '' ? `${filterValue}|${original.value}` : original.value;\n }\n\n break;\n }\n if (filterValue.length === 0 || filterValue === '|') {\n message(t('table.columnFilterWarn'));\n return;\n }\n\n if (type === 'date') {\n const pattern = /\\d{4}-\\d{2}-\\d{2}\\\\|\\d{4}-\\d{2}-\\d{2}/;\n if (!pattern.test(filterValue)) {\n message(t('table.columnFilterDateWarn'));\n return;\n }\n }\n\n if (propField !== null) {\n const fh = {};\n fh[toLine(propField.replace('@', '.')) + '|' + type] = filterValue;\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n fC['headfilter'] = Object.assign(fC['headfilter'] || {}, fh);\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n // 隐藏popover\n popoverVisible.value[propField] = false;\n document.body.click();\n // 拼接 过滤条件\n const result = await crud.toNewPageSearch(instance, fC, fetch, pageInfo.value);\n if (result && result.records) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n // 标识筛选列\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n if (rootEl) {\n const tableHeader = rootEl.querySelector('.gv-table .el-table__header-wrapper .el-table__header') as HTMLElement | undefined;\n const columns = tableHeader?.querySelectorAll('.el-table__cell');\n const len = columns?.length ?? 0;\n for (let i = 0; i < len; i++) {\n const h = columns?.[i]?.querySelector('.render__header');\n // console.log(h);\n if (h && h.children[0] && h.children[0].getAttribute('data-columnprop') === propField) h.children[0].classList.add('is-selected');\n }\n const tableFixHeader = rootEl.querySelector('.gv-table .el-table__fixed-header-wrapper .el-table__header') as HTMLElement | undefined;\n if (tableFixHeader !== null) {\n const fixColumns = tableFixHeader?.querySelectorAll('.el-table__cell');\n if (fixColumns !== null) {\n const fixLen = fixColumns?.length ?? 0;\n for (let i = 0; i < fixLen; i++) {\n const h = fixColumns?.[i]?.querySelector('.render__header');\n if (h && h.children[0] && h.children[0].getAttribute('data-columnprop') === propField) h.children[0].classList.add('is-selected');\n }\n }\n }\n }\n }\n };\n\n /**\n * @todo: column filter handler rest\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-10 13:11:59\n * @param {*} e\n * @param {*} propField\n * @param {*} type\n */\n const columnFilterHandlerReset = async (e: MouseEvent, propField: string, type: string) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const popoverHtml = target.closest('.table-popover');\n if (!popoverHtml) return;\n const inputHtml = popoverHtml.querySelector<HTMLInputElement>('.gv-input .el-input__inner');\n const checkList = popoverHtml.querySelectorAll('.el-checkbox');\n const dateHtmlArr = popoverHtml.querySelectorAll<HTMLInputElement>('.gv-datepicker .el-range-input');\n switch (type) {\n case 'text':\n case 'number':\n if (inputHtml) inputHtml.value = '';\n break;\n case 'date':\n dateHtmlArr[0].value = '';\n dateHtmlArr[1].value = '';\n break;\n case 'dic':\n if (checkList !== null)\n for (const check of Array.from(checkList))\n if (check instanceof HTMLElement && hasClass(check, 'is-checked')) {\n // check.classList.remove('is-checked');\n (check.querySelector('.el-checkbox__original') as HTMLInputElement).checked = false;\n (check.querySelector('.el-checkbox__input') as HTMLInputElement).classList.remove('is-checked');\n }\n\n break;\n }\n\n if (propField !== null) {\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n const filterKey = toLine(propField.replace('@', '.')) + '|' + type;\n const prevHeadfilter = fC['headfilter'];\n if (prevHeadfilter != null) fC['headfilter'] = Object.fromEntries(Object.entries(prevHeadfilter).filter(([key]) => key !== filterKey));\n\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n\n // 隐藏popover\n popoverVisible.value[propField] = false;\n document.body.click();\n\n if (type !== 'date') {\n const primaryBtn = popoverHtml.querySelector('.el-button--primary') as HTMLButtonElement;\n primaryBtn.setAttribute('disabled', 'disabled');\n primaryBtn.classList.add('is-disabled');\n }\n\n // 拼接 过滤条件\n const result = await crud.toNewPageSearch(instance, fC, fetch, pageInfo.value);\n if (result && result.records) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n // 标识筛选列\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n if (rootEl) {\n const tableHeader = rootEl.querySelector('.gv-table .el-table__header-wrapper .el-table__header') as HTMLElement | undefined;\n const columns = tableHeader?.querySelectorAll('.el-table__cell') || [];\n const len = columns.length || 0;\n for (let i = 0; i < len; i++) {\n const h = columns[i].querySelector('.render__header');\n if (h) if (h.children[0]) if (h.children[0].getAttribute('data-columnprop') === propField) h.children[0].classList.remove('is-selected');\n }\n const tableFixedHeader = rootEl.querySelector('.gv-table .el-table__fixed-header-wrapper .el-table__header') as HTMLElement | undefined;\n // fixed: 解决列表没有锁定列时报错问题 2023-10-07\n if (tableFixedHeader !== null) {\n const columnsFixed = tableFixedHeader?.querySelectorAll('.el-table__cell') || [];\n const lenFixed = columnsFixed.length || 0;\n for (let i = 0; i < lenFixed; i++) {\n const h = columnsFixed[i].querySelector('.render__header');\n if (h) if (h.children[0]) if (h.children[0].getAttribute('data-columnprop') === propField) h.children[0].classList.remove('is-selected');\n }\n }\n }\n }\n };\n\n /**\n * @todo: set column width by column name\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:12:01\n * @param {*} label\n * @param {*} query\n * @param {*} edit\n */\n const getColWidth = (label: string, query: boolean, edit: boolean) => {\n if (!label) return;\n let label2 = label;\n if (lang === 'en') label2 = label.toLowerCase();\n let sWidth = 0;\n if (label2.indexOf(t('table.date')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.month2')) !== -1) sWidth = 110;\n else if (label2.indexOf(t('table.month')) !== -1) sWidth = 90;\n else if (label2.indexOf(t('table.time')) !== -1) sWidth = 130;\n else if (label2.indexOf(t('table.deliveryTime')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.name')) !== -1) sWidth = 120;\n else if (label2.indexOf(t('table.userAccount')) !== -1) sWidth = 120;\n else if (label === t('table.customerName')) sWidth = 115;\n else if (label2.indexOf(t('table.approve')) !== -1) sWidth = 110;\n else if (label2.indexOf(t('table.audit')) !== -1) sWidth = 110;\n else if (label === t('table.operator')) sWidth = 110;\n else if (label2.indexOf(t('table.staff')) !== -1) sWidth = 100;\n else if (label.indexOf(t('table.whether')) !== -1) sWidth = 110;\n else if (label === t('table.enableStatus')) sWidth = 110;\n else if (label === t('table.orderStatus')) sWidth = 110;\n else if (label2 === t('table.status')) sWidth = 90;\n else if (label2.indexOf(t('table.status')) !== -1) sWidth = 90;\n else if (label === t('table.vin')) sWidth = 185;\n else if (label === t('table.carNo')) sWidth = 105;\n else if (label2.indexOf(t('table.phone')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.tel')) !== -1) sWidth = 110;\n else if (label === t('table.sex')) sWidth = 90;\n else if (label2.indexOf(t('table.type')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.amount')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.money')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.balance')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.unitPrice')) !== -1) sWidth = 95;\n else if (label2.indexOf(t('table.times')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.number')) !== -1) sWidth = 140;\n else if (label2.indexOf(t('table.code')) !== -1) sWidth = 135;\n else if (label2.indexOf(t('table.odd')) !== -1) sWidth = 230;\n else if (label2.indexOf(t('table.unit')) !== -1) sWidth = 110;\n else if (label2.indexOf('省') !== -1) sWidth = 90;\n else if (label2.indexOf('市') !== -1) sWidth = 100;\n else if (label2.indexOf('区') !== -1) sWidth = 120;\n else if (label2.indexOf(t('table.color')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.storageAge')) !== -1) sWidth = 105;\n else if (label2.indexOf(t('table.chassis')) !== -1) sWidth = 105;\n else if (label2.indexOf('排放标准') !== -1) sWidth = 115;\n else if (label2 === t('table.brand')) sWidth = 105;\n else if (label === t('table.series')) sWidth = 105;\n else if (label === t('table.strain')) sWidth = 105;\n else if (label === '运输方式') sWidth = 100;\n else if (label2.indexOf(t('table.rate')) !== -1) sWidth = 110;\n else if (label2.indexOf(t('table.level')) !== -1) sWidth = edit === true ? 140 : 115;\n // fixme: 增加表头query宽度判断 2022-04-30\n if (query === true && sWidth > 0) sWidth += 15;\n\n // fixme: 增加表头edit宽度判断 2022-06-11\n if (edit === true && sWidth > 0) sWidth += 20;\n return sWidth;\n };\n\n /**\n * @todo: table cell formatter\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:19:28\n * @param {*} row\n * @param {*} column\n * @param {*} cellValue\n * @param {*} index\n */\n const columnFormatter = (_row: any, _column: any, cellValue: any, _index: number) => {\n // console.log(column);\n // console.log(cellValue);\n if (cellValue != null && cellValue.v !== undefined) return cellValue.v;\n else return cellValue === undefined ? '' : cellValue;\n };\n\n /**\n * @todo: table header search input change method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-22 09:55:46\n * @param {string} val\n */\n const handleColumnFilter = (val: string) => {\n const popoverHtmlList = Array.from(document.body.querySelectorAll<HTMLElement>('body>div>.table-popover'));\n let popoverHtml: HTMLElement | undefined;\n for (const pop of popoverHtmlList)\n if (pop.style.display !== 'none') {\n popoverHtml = pop;\n break;\n }\n // console.log(popoverHtml);\n if (!popoverHtml) return;\n const primaryBtn = popoverHtml.querySelector<HTMLElement>('.el-button--primary');\n if (!primaryBtn) return;\n if (val !== undefined && val !== null && val !== '') {\n primaryBtn.removeAttribute('disabled');\n primaryBtn.classList.remove('is-disabled');\n } else {\n primaryBtn.setAttribute('disabled', 'disabled');\n primaryBtn.classList.add('is-disabled');\n }\n };\n\n /**\n * @todo: head filter dict check all\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-10 13:24:06\n * @param {*} val\n */\n const handleDictCheckAll = (val: boolean) => {\n const popoverHtmlList = document.body.querySelectorAll('body>.table-popover');\n let popoverHtml;\n for (const pop of Array.from(popoverHtmlList))\n if ((pop as HTMLElement).style.display !== 'none') {\n popoverHtml = pop;\n break;\n }\n const primaryBtn = popoverHtml.querySelector('.el-button--primary');\n if (val === true) {\n primaryBtn.removeAttribute('disabled');\n primaryBtn.classList.remove('is-disabled');\n // 全部选中\n const checkList = popoverHtml.querySelectorAll('label.el-checkbox');\n checkList.forEach((x, index) => {\n if (index > 0) {\n x.classList.add('is-checked');\n x.querySelector('.el-checkbox__input').classList.add('is-checked');\n x.querySelector('.el-checkbox__original').checked = true;\n }\n });\n } else {\n // 全部取消选中\n const checkList = popoverHtml.querySelectorAll('label.el-checkbox');\n checkList.forEach((x, index) => {\n if (index > 0) {\n x.classList.remove('is-checked');\n x.querySelector('.el-checkbox__input').classList.remove('is-checked');\n x.querySelector('.el-checkbox__original').checked = false;\n }\n });\n primaryBtn.setAttribute('disabled', 'disabled');\n primaryBtn.classList.add('is-disabled');\n }\n };\n\n /**\n * @todo: 列筛选 点击字典列表节点方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-20 15:33:44\n * @param {*} checked\n */\n const handleDictCheck = (checked: boolean) => {\n const curCheck = window.event?.target as HTMLInputElement | undefined;\n const popoverHtmlList = document.body.querySelectorAll('body>div>.table-popover');\n let popoverHtml;\n for (const pop of Array.from(popoverHtmlList))\n if (pop.style.display !== 'none') {\n popoverHtml = pop;\n break;\n }\n const primaryBtn = popoverHtml.querySelector('.el-button--primary');\n if (checked === true) {\n primaryBtn.removeAttribute('disabled');\n primaryBtn.classList.remove('is-disabled');\n // 设置全选标识\n const checkList = popoverHtml.querySelectorAll('label.el-checkbox');\n let allCheck = true;\n checkList.forEach((x, index) => {\n if (index > 0)\n if (curCheck?.value !== (x.querySelector('.el-checkbox__original') as HTMLInputElement).value)\n if (!hasClass(x, 'is-checked')) {\n allCheck = false;\n return;\n }\n });\n if (!allCheck) checkList[0].querySelector('.el-checkbox__input').classList.add('is-indeterminate');\n else {\n checkList[0].querySelector('.el-checkbox__input').classList.remove('is-indeterminate');\n checkList[0].classList.add('is-checked');\n checkList[0].querySelector('.el-checkbox__input').classList.add('is-checked');\n checkList[0].querySelector('.el-checkbox__original').checked = true;\n }\n } else {\n const checkList = popoverHtml.querySelectorAll('.el-checkbox');\n let checkFlag = false;\n for (const check of checkList)\n if (curCheck?.value !== (check.querySelector('.el-checkbox__original') as HTMLInputElement).value && hasClass(check, 'is-checked')) {\n checkFlag = true;\n break;\n }\n if (checkFlag === true) {\n const primaryBtn = popoverHtml.querySelector('.el-button--primary');\n primaryBtn.removeAttribute('disabled');\n primaryBtn.classList.remove('is-disabled');\n } else {\n primaryBtn.setAttribute('disabled', 'disabled');\n primaryBtn.classList.add('is-disabled');\n }\n // 设置全选标识\n let allCheck = true;\n checkList.forEach((x, index) => {\n if (index > 0)\n if (curCheck?.value !== (x.querySelector('.el-checkbox__original') as HTMLInputElement).value)\n if (hasClass(x, 'is-checked')) {\n allCheck = false;\n return;\n }\n });\n if (!allCheck) checkList[0].querySelector('.el-checkbox__input').classList.add('is-indeterminate');\n else {\n checkList[0].querySelector('.el-checkbox__input').classList.remove('is-indeterminate');\n checkList[0].classList.remove('is-checked');\n checkList[0].querySelector('.el-checkbox__input').classList.remove('is-checked');\n checkList[0].querySelector('.el-checkbox__original').checked = false;\n }\n }\n };\n\n /**\n * @todo: set header filter\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:23:58\n * @param {string} type\n * @param {string} label\n * @param {string} prop\n * @param {string} dicType\n * @param {string} filtercode\n */\n const renderHeadFilter = (type: string, label: string, prop: string, dicType: string | undefined, filtercode: string | undefined) => {\n let render: VNode | null = null;\n let fc = filtercode !== undefined ? filtercode : '';\n switch (type) {\n case 'text':\n case 'number':\n render = (\n <div>\n <GvInput\n placeholder={`${t('table.search')} - ${label}`}\n size={tableSize.value}\n onInput={handleColumnFilter}\n vref={prop}></GvInput>\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size={tableSize.value}\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size={tableSize.value}\n onClick={(e) => columnFilterHandlerReset(e, prop, type)}>\n {t('table.reset')}\n </GvButton>\n </div>\n </div>\n );\n break;\n case 'date':\n render = (\n <div>\n <GvDatePicker\n placeholder={`${t('table.search')} - ${label}`}\n size={tableSize.value}\n type=\"daterange\"\n format={dicType}\n value-format={dicType}\n // onChange={handleColumnFilter}\n vref={prop}\n />\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size={tableSize.value}\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size={tableSize.value}\n onClick={(e) => columnFilterHandlerReset(e, prop, type)}>\n {t('table.reset')}\n </GvButton>\n </div>\n </div>\n );\n break;\n case 'dic':\n if (dicType) {\n let ret: DicItem[] = [];\n const src = dicType.toLowerCase();\n const dictCache = userStore.dictCache?.[src];\n\n if (dicType !== 'xzqh' && dictCache) ret = dictCache;\n // 生成字典列表\n else if (dicType === 'xzqh') {\n if (label.indexOf('省') >= 0) fc = '0000$';\n // else if (label.indexOf('市') >= 0)\n // fc = '^[1-9][1-9][0-9][1-9]00$';\n // else if (label.indexOf('区') >= 0)\n // fc = '^[1-9][1-9][0-9][1-9][0-9][1-9]$';\n\n const dictXZQH = appStore.getDictDivision;\n\n if (dictXZQH) {\n const cache = {};\n cache['key'] = 'xzqh';\n cache['dict'] = dictXZQH;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n ret = dictXZQH;\n }\n } else {\n const dict = appStore.getDict[src];\n if (dict) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n ret = dict;\n }\n }\n // 设置过滤\n let ret2 = ret;\n if (fc) {\n const reg = new RegExp(fc, 'i');\n ret2 = ret.filter((x) => reg.test(x.c));\n }\n // ret.map((x) => {\n // checkList.push(x.c);\n // });\n // console.log(checkList);\n // 最大显示100个\n if (ret2 && ret2.length !== undefined && ret2.length > 0) {\n ret2.splice(50);\n render = (\n <div>\n <div>\n <ElCheckbox\n checked={false}\n key=\"checkAll\"\n label={t('common.checkAll')}\n style={{ display: 'block' }}\n indeterminate={isIndeterminate[prop]}\n onChange={handleDictCheckAll}\n class=\"gv-checkbox\">\n {t('common.checkAll')}\n </ElCheckbox>\n <ElDivider style=\"margin: 5px 0px\" />\n {ret2.map((x) => (\n <ElCheckbox\n checked={false}\n key={x.c}\n label={x.c}\n style={{ display: 'block' }}\n onChange={handleDictCheck}\n class=\"gv-checkbox\">\n {lang === 'zh-CN' ? x.t : x.e}\n </ElCheckbox>\n ))}\n </div>\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size={tableSize.value}\n disabled=\"true\"\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size={tableSize.value}\n onClick={(e) => columnFilterHandlerReset(e, prop, type)}>\n {t('table.reset')}\n </GvButton>\n </div>\n </div>\n );\n } else render = null;\n } else render = null;\n\n break;\n }\n return render ? wrapPopoverFilterBody(render) : null;\n };\n\n /**\n * @todo: open popover\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:22:13\n * @param {*} type\n * @param {*} label\n * @param {*} prop\n * @param {*} dicType\n * @param {*} filtercode\n * @param {*} event\n */\n /** 点击表头筛选箭头:仅关闭其它列 Popover,开关由 ElPopover trigger=click + v-model 处理 */\n const handlePopoverSlotClick = (event: MouseEvent, prop: string) => {\n event?.stopPropagation();\n closeAllPopover(prop);\n };\n\n /**\n * @todo: cell check\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-10 13:29:28\n * @param {*} obj\n * @param {*} label\n * @param {*} format\n * @param {*} newVal\n * @param {*} rowIndex\n */\n const cellCheck = (obj: HTMLElement, label: string, format: FormItemFormat, newVal: any, rowIndex: number) => {\n if (!format) {\n message(`${label} ${t('table.editCheckFormat')}`);\n return false;\n }\n const isRequire = format[0];\n const rule = format[1];\n const maxLen = format[2];\n // console.log(label);\n // 校验是否必填\n if (isRequire === 1)\n if (newVal === null || newVal === undefined || newVal === '') {\n message(`${t('common.which')} ${rowIndex + 1} ${t('common.row')}: ${t('common.pleaseInput')} ${label}`);\n obj.classList.add('is-error');\n return false;\n } else if (Array.isArray(newVal) && newVal.length === 0) {\n message(`${t('common.which')} ${rowIndex + 1} ${t('common.row')}: ${t('common.pleaseInput')} ${label}`);\n obj.classList.add('is-error');\n return false;\n } else if (typeof newVal === 'object' && newVal.c === '') {\n message(`${t('common.which')} ${rowIndex + 1} ${t('common.row')}: ${t('common.pleaseInput')} ${label}`);\n obj.classList.add('is-error');\n return false;\n }\n\n // 校验最大长度\n const validateLen = GvTableValidate.isLength(lang, newVal, maxLen);\n if (validateLen !== true) {\n message(`${t('common.which')} ${rowIndex + 1} ${t('common.row')}: ${validateLen}`, 'warning', true);\n obj.classList.add('is-error');\n return false;\n }\n // 校验格式\n if (rule !== 'isAny')\n if (GvTableValidate[rule]) {\n const validate = GvTableValidate[rule](lang, rule, newVal);\n if (validate !== true) {\n message(`${t('common.which')} ${rowIndex + 1} ${t('common.row')}: ${validate}`, 'warning', true);\n obj.classList.add('is-error');\n return false;\n }\n }\n return true;\n };\n\n /**\n * @todo: row edit enter event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-10 14:50:06\n * @param {*} event\n * @param {*} cellEnter\n * @param {*} row\n * @param {*} value\n * @param {*} prop\n * @param {*} scope\n * @param {*} prop\n */\n const handleEnterKeyDown = (event: KeyboardEvent, cellEnter: (event: KeyboardEvent, row: any, value: string, prop: string) => void, scope: any, prop: string) => {\n // 回车事件\n if (event.key === 'Enter')\n if (cellEnter) {\n cellEnter(event, scope.row, event.srcElement.value, prop);\n recordsList.value[scope.$index] = scope.row;\n }\n };\n\n /**\n * @todo: 行编辑转换\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-06-17 10:59:29\n * @param {*} scope\n * @param {*} label\n * @param {*} prop\n * @param {*} type\n * @param {*} format\n * @param {*} dicType\n * @param {*} cellBlur 失去焦点回调方法\n * @param {*} filtercode 字典过滤代码\n */\n const renderRowEdit = (\n scope,\n label,\n sProp,\n prop,\n type,\n dicType,\n format,\n cellBlur,\n cellEnter,\n filtercode,\n showLabel,\n dicRemote,\n isreload,\n cb,\n multiple,\n dateType,\n render,\n cellChange,\n min,\n max,\n collapseTags,\n showLabelProp,\n focus,\n ) => {\n let renders: VNode | null = null;\n const val = scope.row[sProp];\n let sVal = val;\n let sShowLabel = showLabel;\n if (showLabelProp) sShowLabel = scope.row[showLabelProp];\n if (multiple === true) {\n if (sVal !== undefined && sVal !== null)\n if (typeof val === 'object')\n if (!Array.isArray(val))\n if (val.c !== '') {\n const cArr = val.c.split(',');\n const vArr = val.v.split(',');\n sVal = [];\n sShowLabel = [];\n for (let i = 0; i < cArr.length; i++) {\n sVal.push({\n value: cArr[i],\n label: vArr[i],\n });\n sShowLabel.push(vArr[i]);\n }\n } else {\n sVal = [];\n sShowLabel = [];\n }\n else {\n sShowLabel = [];\n val.forEach((x) => {\n sShowLabel.push(x.label);\n });\n }\n else if (val !== '') {\n const cArr = val.split(',');\n let vArr = [];\n if (sShowLabel) vArr = sShowLabel.split(',');\n sVal = [];\n sShowLabel = [];\n for (let i = 0; i < cArr.length; i++) {\n sVal.push({\n value: cArr[i],\n label: vArr.length > i ? vArr[i] : '',\n });\n sShowLabel.push(vArr[i]);\n }\n } else {\n sVal = [];\n sShowLabel = [];\n }\n\n scope.row[sProp] = sVal;\n } else if (val !== null && typeof val === 'object') {\n sVal = val.c + '';\n sShowLabel = val.v;\n }\n const columnVref = `${vref}-${sProp}`;\n if (!format) {\n message(`${t('common.edit')}${t('common.column')} [ ${sProp} ] ${t('table.editCheckFormat2')}`);\n return;\n }\n let sDateType = dateType;\n if (sDateType === 'yyyy-MM-dd') sDateType = 'date';\n if (sDateType === 'yyyy-MM-dd HH:mm') sDateType = 'datetime';\n let dateFormat = dateFormatConfig.date.valueFormat; // 日期显示格式\n let valueFormat = dateFormatConfig.date.valueFormat; // 日期绑定值格式\n if (sDateType === 'datetime') {\n dateFormat = dateFormatConfig.datetime.dateFormat;\n valueFormat = dateFormatConfig.datetime.valueFormat;\n }\n switch (type) {\n case 'text':\n renders = (\n <div>\n <GvInput\n value={sVal}\n vref={columnVref}\n clearable={false}\n size=\"small\"\n maxlength={format[2]}\n onInput={(newVal) => {\n scope.row[sProp] = newVal;\n }}\n onBlur={(event, newVal) => {\n if (cellCheck(event.srcElement, label, format, newVal, scope.$index)) {\n event.srcElement.classList.remove('is-error');\n // scope.row.edit = true;\n if (typeof cellBlur === 'function')\n // scope.row[prop] = newVal;\n cellBlur(event, scope.row, newVal, sProp);\n recordsList.value[scope.$index] = scope.row;\n }\n }}\n onKeydown={(event) => {\n handleEnterKeyDown(event, cellEnter, scope, sProp);\n }}\n columnProp={sProp}\n bizType=\"tableedit\"\n />\n </div>\n );\n break;\n case 'number':\n renders = (\n <div>\n <GvInputNumber\n value={val}\n vref={columnVref}\n size=\"small\"\n min={min}\n max={max}\n onChange={(currentVal, oldVal) => {\n if (typeof cellChange === 'function') cellChange(scope.row, currentVal, oldVal, sProp);\n recordsList.value[scope.$index] = scope.row;\n }}\n onInput={(newVal) => {\n scope.row[sProp] = newVal;\n }}\n onBlur={(event, newVal) => {\n if (cellCheck(event.srcElement, label, format, newVal, scope.$index)) {\n event.srcElement.classList.remove('is-error');\n // scope.row.edit = true;\n if (typeof cellBlur === 'function')\n // scope.row[prop] = newVal;\n cellBlur(event, scope.row, newVal, sProp);\n recordsList.value[scope.$index] = scope.row;\n }\n }}\n columnProp={sProp}\n bizType=\"tableedit\"\n />\n </div>\n );\n break;\n case 'date':\n case 'datetime':\n renders = (\n <div>\n <GvDatePicker\n v-model={sVal}\n modelValue={sVal}\n vref={columnVref}\n type={sDateType}\n clearable={false}\n format={dateFormat}\n value-format={valueFormat}\n // startPlaceholder={startPh}\n // endPlaceholder={endPh}\n onInput={(newVal) => {\n scope.row[sProp] = newVal;\n }}\n />\n </div>\n );\n break;\n case 'dic':\n if (dicType.indexOf('t#') >= 0) {\n const dtArr = tableHeads.filter((x) => x.prop === prop);\n const dt = scope.row['dt-' + sProp] || dtArr[0].dicType;\n let v;\n const vv = sShowLabel || sVal;\n if (typeof vv === 'object')\n if (Array.isArray(vv))\n vv.forEach((x) => {\n if (x)\n if (v) v += ',' + (x.label ? x.label : x);\n else v = x.label ? x.label : x;\n });\n else {\n if (vv) v = vv.label;\n }\n else v = vv;\n renders = (\n <div>\n <ElTooltip\n content={v ? v + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvSelect\n value={sVal}\n vref={columnVref}\n dicType={dt}\n clearable={false}\n showLabel={sShowLabel}\n filtercode={filtercode}\n dicRemote={dicRemote}\n isreload={isreload}\n multiple={multiple}\n collapseTags={collapseTags}\n editRow={scope.row}\n cb={cb}\n onFocus={async () => {\n scope.row['dt-' + sProp] = dt;\n if (focus) await focus(scope, dicType, sVal);\n }}\n onChange={(newVal, labels, _columnProp) => {\n if (multiple === true) scope.row[sProp] = newVal;\n else if (newVal !== null && typeof newVal === 'object')\n if (scope.row[sProp] === null) scope.row[sProp] = { c: newVal.value, v: labels };\n else scope.row[sProp] = { c: newVal.value, v: labels };\n // scope.row[sProp].c = newVal.value;\n // scope.row[sProp].v = labels;\n else scope.row[sProp] = { c: newVal.value, v: labels };\n scope.row['dt-' + sProp] = dt;\n }}\n columnProp={sProp}\n bizType=\"tableedit\"\n />\n </ElTooltip>\n </div>\n );\n } else {\n let v;\n const vv = sShowLabel || sVal;\n if (typeof vv === 'object')\n if (Array.isArray(vv))\n vv.forEach((x) => {\n if (x)\n if (v) v += ',' + (x.label ? x.label : x);\n else v = x.label ? x.label : x;\n });\n else {\n if (vv) v = vv.label;\n }\n else v = vv;\n renders = (\n <div>\n <ElTooltip\n content={v ? v + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvSelect\n value={sVal}\n vref={columnVref}\n dicType={dicType}\n clearable={false}\n showLabel={sShowLabel}\n filtercode={filtercode}\n multiple={multiple}\n cb={cb}\n collapseTags={collapseTags}\n editRow={scope.row}\n onChange={(newVal, labels, _columnProp) => {\n if (multiple === true)\n // const c = [];\n // if (newVal && Array.isArray(newVal))\n // newVal.forEach((x) => {\n // c.push({ 'c': x.c, 't': x.t });\n // });\n scope.row[sProp] = newVal;\n else if (newVal !== null && typeof newVal === 'object') {\n scope.row[sProp].c = newVal.value;\n scope.row[sProp].v = newVal.label;\n } else {\n scope.row[sProp].c = newVal;\n scope.row[sProp].v = labels;\n }\n }}\n columnProp={sProp}\n bizType=\"tableedit\"\n />\n </ElTooltip>\n </div>\n );\n }\n\n break;\n }\n\n return renders;\n };\n\n /**\n * @todo: render column item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 14:37:55\n */\n const renderColumnItem = (item: TableHeadItem, index: number, loadAction: string | undefined, tableFixed: string | undefined) => {\n const {\n prop,\n label,\n fixed,\n width,\n minWidth = 135,\n align = 'left',\n formatter,\n type = 'text',\n dicType,\n query = false,\n render,\n edit = false,\n format,\n cellBlur,\n cellEnter,\n cellChange,\n hidden = false,\n hasHidden = false,\n filtercode,\n showLabel,\n dicRemote,\n isreload = true,\n cb,\n multiple = false,\n dateType = 'date',\n selectable,\n min,\n max,\n collapseTags = false, // 多选字典tag是否折叠\n showLabelProp, // 表选showLabel列\n columnFilter = true, // 表头是否带筛选\n multiLabel, // 多级表头\n heads, // 多级表头\n focus,\n } = item;\n let reserveSelection = false;\n if (selectable) reserveSelection = true;\n let sHidden = false;\n if (hidden === true) sHidden = true;\n if (hasHidden === true) sHidden = true;\n if (sHidden === true) return null;\n\n let sLabel = label;\n let sProp = prop;\n if (prop && prop.indexOf('@') > 0) sProp = prop.split('@')[1];\n const key = loadAction === 'create' ? Math.random() : sProp;\n\n let placement: TPopoverPlacement = 'bottom-start';\n if (index >= tableHeads.length - 2) placement = 'bottom-end';\n let sFixed = sTableType === 'expand' ? undefined : fixed;\n if (tableFixed === 'n') sFixed = undefined;\n if (sTableAction === 'right') sFixed = undefined;\n // console.log(sFixed);\n if (sFixed) sLabel = sLabel + '';\n if (query === true) {\n sLabel = sLabel + '(Q)';\n filterHeads.push(prop);\n tableSearchShow.value = true;\n }\n ensurePopoverKey(prop);\n const sortable = sTableType === 'expand' ? false : 'custom';\n\n let sWidth;\n if (width !== 'auto')\n if (width) sWidth = width;\n else sWidth = getColWidth(label, query, edit);\n if (isEditTable === false && edit === true) isEditTable = true;\n\n // 多级表头\n if (multiLabel) {\n if (heads && Array.isArray(heads)) {\n const multiLabels: VNode[] = [];\n heads.forEach((x) => {\n const hType = x.type || 'text';\n let hSLabel = x.label;\n let hSProp = x.prop;\n if (x.prop && x.prop.indexOf('@') > 0) hSProp = x.prop.split('@')[1];\n const hKey = loadAction === 'create' ? Math.random() : hSProp;\n\n let hSFixed = sTableType === 'expand' ? undefined : x.fixed;\n if (tableFixed === 'n') hSFixed = undefined;\n // console.log(sFixed);\n if (hSFixed) hSLabel = hSLabel + '';\n if (x.query === true) {\n hSLabel = hSLabel + '(Q)';\n filterHeads.push(x.prop);\n tableSearchShow.value = true;\n }\n let hReserveSelection = false;\n if (x.selectable) hReserveSelection = true;\n // 初始化 列的筛选popover都是隐藏的\n ensurePopoverKey(x.prop);\n const hSortable = sTableType === 'expand' ? false : 'custom';\n\n let hSWidth;\n if (x.width !== 'auto')\n if (x.width) hSWidth = x.width;\n else hSWidth = getColWidth(x.label, x.query, x.edit);\n multiLabels.push(\n <ElTableColumn\n fixed={hSFixed}\n prop={hSProp}\n label={hSLabel}\n width={hSWidth}\n align={x.align}\n column-key={hSProp}\n key={hKey}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={hSortable}\n selectable={x.selectable}\n reserveSelection={hReserveSelection}\n header-align={x.align || 'left'}\n style={{ display: sHidden ? 'none' : '' }}\n sort-orders={['ascending', 'descending']}>\n {{\n header: () => (\n <div\n onClick={(e) => handlePopoverWrapper(e)}\n class=\"render__header\">\n <ElPopover\n visible={popoverVisible.value[x.prop]}\n onUpdate:visible={(val: boolean) => {\n popoverVisible.value = { ...popoverVisible.value, [x.prop]: val };\n }}\n trigger=\"click\"\n width=\"auto\"\n popperStyle={tableHeadFilterPopoverPopperStyle}\n showArrow={true}\n placement={placement}\n popperClass={`gv-popover table-popover table-popover-${props.refTable}`}\n onAfter-enter={handlePopoverShow}\n onAfter-leave={handlePopoverHide}>\n {{\n default: () => renderHeadFilter(hType, x.label, x.prop, x.dicType, x.filtercode),\n reference: () => (\n <div\n class=\"gv-table-header-filter\"\n onClick={(e) => handlePopoverSlotClick(e, x.prop)}\n data-label={label}\n data-columnProp={prop}\n data-columnType={hType}>\n {hSLabel}\n <GvIcon\n iconType=\"el\"\n iconName=\"ArrowDown\"></GvIcon>\n </div>\n ),\n }}\n </ElPopover>\n </div>\n ),\n }}\n </ElTableColumn>,\n );\n });\n return <ElTableColumn data-label={multiLabel}>{multiLabels}</ElTableColumn>;\n }\n } else if (typeof render === 'function') {\n // 自定义字段 render\n let className = 'gv-cell__render';\n if (edit === true) className += ' gv-cell__isedit';\n return (\n <ElTableColumn\n // fixed = {fixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n key={key}\n column-key={sProp}\n show-overflow-tooltip={false}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']}\n class-name={className}>\n {{\n default: (scope) => {\n const render1 = render(scope, sProp);\n return render1;\n },\n header: () => <div class=\"render__header\">{label}</div>,\n }}\n </ElTableColumn>\n );\n } else if (edit === true)\n return (\n <ElTableColumn\n style={{ display: sHidden ? 'none' : '' }}\n fixed={sFixed}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n key={key}\n column-key={sProp}\n show-overflow-tooltip={false}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']} // null\n // filters={this.columnFilters}\n // filter-method={this.filterHandler}\n // filter-placement='bottom-start'\n class-name=\"gv-cell__isedit\">\n {{\n default: (scope) => {\n // if (this.renderMap[`${scope.$index}-${sProp}`] === undefined) {\n const render1 = renderRowEdit(\n scope,\n label,\n sProp,\n prop,\n type,\n dicType,\n format,\n cellBlur,\n cellEnter,\n filtercode,\n showLabel,\n dicRemote,\n isreload,\n cb,\n multiple,\n dateType,\n render,\n cellChange,\n min,\n max,\n collapseTags,\n showLabelProp,\n focus,\n );\n return render1;\n },\n header: () => <div class=\"render__header\">{label}</div>,\n }}\n </ElTableColumn>\n );\n else if (type === 'tag')\n // 设置tag\n return (\n <ElTableColumn\n fixed={sFixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n key={sProp}\n column-key={sProp}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']}\n class-name=\"gv-cell__render\">\n {{\n default: (scope) =>\n scope.row[sProp] !== null && typeof scope.row[sProp] === 'object' ? (\n scope.row[sProp].v ? (\n <GvTag>{scope.row[sProp].v}</GvTag>\n ) : null\n ) : scope.row[sProp] ? (\n <GvTag>{scope.row[sProp]}</GvTag>\n ) : null,\n header: () => <div class=\"render__header\">{sLabel}</div>,\n }}\n </ElTableColumn>\n );\n else if (\n dicType !== 'company' &&\n dicType !== 'dept' &&\n dicType !== 'user' &&\n label.indexOf('市') === -1 &&\n label.indexOf('区县') === -1 &&\n label.indexOf('区/县') === -1 &&\n props.tableType !== 'list' &&\n props.tableType !== 'detail' &&\n props.tableType !== 'expand' &&\n props.tableType !== 'import'\n )\n if (columnFilter !== true)\n return (\n // add: af-table-column插件,计算列宽对于表头带有排序、(Q)等情况自适应列款不准确\n <ElTableColumn\n fixed={sFixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n column-key={sProp}\n key={key}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n selectable={selectable}\n reserveSelection={reserveSelection}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']} // null\n >\n {{\n header: () => <div class=\"render__header\">{sLabel}</div>,\n }}\n </ElTableColumn>\n );\n else\n return (\n // add: af-table-column插件,计算列宽对于表头带有排序、(Q)等情况自适应列款不准确\n <ElTableColumn\n fixed={sFixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n column-key={sProp}\n key={key}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n selectable={selectable}\n reserveSelection={reserveSelection}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']} // null\n >\n {{\n header: () => (\n <div\n onClick={(e) => handlePopoverWrapper(e)}\n class=\"render__header\">\n <ElPopover\n visible={popoverVisible.value[prop]}\n onUpdate:visible={(val: boolean) => {\n popoverVisible.value = { ...popoverVisible.value, [prop]: val };\n }}\n trigger=\"click\"\n width=\"auto\"\n popperStyle={tableHeadFilterPopoverPopperStyle}\n showArrow={true}\n placement={placement}\n popperClass={`gv-popover table-popover table-popover-${props.refTable}`}\n onAfter-enter={handlePopoverShow}\n onAfter-leave={handlePopoverHide}>\n {{\n default: () => renderHeadFilter(type, label, prop, dicType, filtercode),\n reference: () => (\n <div\n class=\"gv-table-header-filter\"\n onClick={(e) => handlePopoverSlotClick(e, prop)}\n data-label={label}\n data-columnProp={prop}\n data-columnType={type}>\n {sLabel}\n <GvIcon\n iconType=\"el\"\n iconName=\"ArrowDown\"></GvIcon>\n </div>\n ),\n }}\n </ElPopover>\n </div>\n ),\n }}\n </ElTableColumn>\n );\n else\n return (\n <ElTableColumn\n fixed={sFixed}\n prop={sProp}\n style={{ display: sHidden ? 'none' : '' }}\n label={sLabel}\n width={sWidth}\n align={align}\n key={sProp}\n selectable={selectable}\n reserveSelection={reserveSelection}\n column-key={sProp}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']}>\n {{\n header: () => <div class=\"render__header\">{props.tableType === 'list' ? sLabel : label}</div>,\n }}\n </ElTableColumn>\n );\n };\n\n /**\n * @todo: edit row check\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-10 13:27:42\n * @param {*} index\n */\n const checkEditRow = (index: number) => {\n let checkFlag = true;\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n const tableH = rootEl?.querySelector('.el-table__body-wrapper .el-table__body') as HTMLElement | undefined;\n if (!tableH) return false;\n\n const rowsH = tableH.querySelectorAll('.el-table__row');\n for (let i = 0; i < rowsH.length; i++) {\n if (i !== index) continue;\n const rowH = rowsH[i];\n let offset = 1;\n const columnsH = rowH.querySelectorAll<HTMLElement>('.el-table__cell');\n for (let j = 0; j < columnsH.length; j++) {\n if (hasClass(columnsH[j], 'el-table__expand-column'))\n // offset++;\n continue;\n\n if (hasClass(columnsH[j], 'el-table-column--selection')) {\n offset++;\n continue;\n }\n if (hasClass(columnsH[j], 'ht-cell__isedit')) {\n const inputH = columnsH[j].querySelector<HTMLInputElement>('.el-input .el-input__inner,.el-input-number .el-input__inner');\n if (inputH) {\n const val = recordsList[i][tableHeads[j - offset].prop];\n checkFlag = cellCheck(inputH, tableHeads[j - offset].label, tableHeads[j - offset].format as FormItemFormat, val, i);\n if (!checkFlag) {\n inputH.focus();\n break;\n }\n }\n }\n }\n if (!checkFlag) break;\n }\n return checkFlag;\n };\n\n const handleDetailPopoverShow = async (action: any[], index: number, row: any, $index: number) => {\n action[index](row, $index)\n .then((render) => {\n showPopoverDetail.value = render;\n })\n .catch(() => {\n showPopoverDetail.value = null;\n });\n };\n\n /**\n * @todo: action column\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 14:08:55\n */\n const renderAction = (scope, content: string[], action: any[], render: Fn | undefined, confirmArr: boolean[], iconArr: string[]) => {\n let sContent = content;\n if (render) sContent = render(scope, content);\n return (\n <div class=\"flex\">\n {sContent.map((item: string, index: number) => {\n let x = item;\n let xx = 't';\n let disabled = false;\n if (item.indexOf('|') > 0) {\n const arr = item.split('|');\n x = arr[0];\n if (arr[1] === 'd') {\n xx = 't';\n disabled = true;\n // xx = arr[1];\n }\n }\n // console.log(item);\n let confirms = false;\n if (confirmArr) confirms = confirmArr[index];\n let detail = false;\n let icon = '';\n\n let actionType = '';\n if (x.indexOf(t('table.edit')) !== -1 || x.indexOf(t('table.modify')) !== -1 || x.indexOf(t('table.update')) !== -1) icon = 'el-icon-edit';\n else if (x.indexOf(t('table.delete')) !== -1 || x.indexOf(t('table.cancel')) !== -1) {\n icon = 'el-icon-delete';\n confirms = true;\n } else if (x.indexOf(t('table.add')) !== -1) icon = 'gv-icon-add';\n else if (x.indexOf(t('table.scheduling')) !== -1 || x.indexOf(t('table.production')) !== -1) icon = 'gv-icon-task';\n else if (x.indexOf(t('table.append')) !== -1) {\n actionType = '1';\n icon = 'gv-icon-baocun2';\n } else if (x.indexOf(t('table.disabled')) !== -1) {\n icon = 'gv-icon-tingyong';\n confirms = true;\n } else if (x.indexOf(t('table.cancel1')) !== -1) {\n icon = 'gv-icon-tingyong';\n confirms = true;\n } else if (x.indexOf(t('table.close')) !== -1) {\n icon = 'el-icon-circle-close';\n confirms = true;\n } else if (x.indexOf(t('table.detail')) !== -1) {\n icon = 'gv-icon-mingxi';\n detail = true;\n } else if (x.indexOf(t('table.logging')) !== -1) {\n icon = 'gv-icon-daiban';\n detail = true;\n } else if (x.indexOf(t('table.info')) !== -1 || x.indexOf(t('table.infos')) !== -1) icon = 'gv-icon-info';\n else if (x.indexOf(t('table.view')) !== -1) icon = 'gv-icon-info';\n else if (x.indexOf(t('table.message')) !== -1) icon = 'gv-icon-info';\n else if (x.indexOf(t('table.price')) !== -1) icon = 'gv-icon-jiage1';\n else if (x.indexOf(t('table.money')) !== -1) icon = 'gv-icon-jiage1';\n else if (x.indexOf(t('table.dispatch')) !== -1) icon = 'gv-icon-winfo-icon-zhipai';\n else if (x.indexOf(t('table.adjust')) !== -1) icon = 'gv-icon-wujiliandongdizhi';\n else if (x.indexOf(t('table.leaveFactory')) !== -1 || x.indexOf(t('table.delivery')) !== -1) icon = 'gv-icon-paichesonghuodan';\n else if (x.indexOf(t('table.quit')) !== -1 || x.indexOf(t('table.transfer')) !== -1) icon = 'gv-icon-zhipai';\n else if (x.indexOf(t('table.submit')) !== -1 || x.indexOf(t('table.report')) !== -1) icon = 'gv-icon-tijiao';\n else if (x.indexOf(t('table.download')) !== -1) icon = 'gv-icon-xiazai';\n else if (x.indexOf(t('table.upload')) !== -1) icon = 'gv-icon-fujian';\n else if (x.indexOf(t('table.notify')) !== -1) icon = 'gv-icon-huodong';\n else if (x.indexOf(t('table.send')) !== -1) icon = 'gv-icon-xiazaidaorumoban1x';\n else if (x.indexOf(t('table.freeze')) !== -1) icon = 'gv-icon-dongjie';\n else if (x.indexOf(t('table.apply')) !== -1) icon = 'gv-icon-biaoshilei_yuanchengshengji';\n else if (x.indexOf(t('table.unfreeze')) !== -1) icon = 'gv-icon-jiedong';\n else if (x.indexOf(t('table.qrcode')) !== -1) icon = 'gv-icon-erweima';\n else if (x.indexOf(t('table.build')) !== -1) icon = 'gv-icon-rocket';\n else if (x.indexOf(t('table.confirm')) !== -1) icon = 'gv-icon-tianshenpi';\n else if (x.indexOf(t('table.proxyPay')) !== -1) icon = 'gv-icon-bengchefenleijiageguanli';\n else if (x.indexOf(t('table.open')) !== -1) icon = 'gv-icon-addNode';\n else if (x.indexOf(t('table.audit')) !== -1) icon = 'gv-icon-shenpi2';\n else if (x.indexOf(t('table.top')) !== -1) icon = 'gv-icon-zhidingxian';\n else if (x.indexOf(t('table.publish')) !== -1) icon = 'gv-icon-fabu';\n else if (x.indexOf(t('table.withdraw')) !== -1) icon = 'gv-icon-fanhui5';\n else if (x.indexOf(t('table.cost')) !== -1) icon = 'gv-icon-yingshou';\n else if (x.indexOf(t('table.approve')) !== -1) icon = 'gv-icon-shenpi2';\n else if (x.indexOf(t('table.reject')) !== -1) icon = 'gv-icon-shenqingbohui';\n else if (x.indexOf(t('table.exec')) !== -1) icon = 'gv-icon-kaishi_yunhang';\n else if (x.indexOf(t('table.recover')) !== -1) icon = 'gv-icon-huifu1';\n else if (x.indexOf(t('table.dispose')) !== -1) icon = 'gv-icon-task';\n else if (x.indexOf(t('table.ok')) !== -1) icon = 'gv-icon-xuanze';\n else if (x.indexOf(t('table.select')) !== -1) icon = 'gv-icon-xuanze';\n else if (x.indexOf(t('table.lock')) !== -1) icon = 'el-icon-lock';\n else if (x.indexOf(t('table.unLock')) !== -1) icon = 'el-icon-unlock';\n else if (x.indexOf(t('table.enable')) !== -1) icon = 'gv-icon-yunhang';\n else if (x.indexOf(t('table.transmit')) !== -1) icon = 'gv-icon-xiada';\n else if (x.indexOf(t('table.putaway')) !== -1) icon = 'el-icon-top';\n else if (x.indexOf(t('table.soldOut')) !== -1) icon = 'el-icon-bottom';\n else if (x.indexOf(t('table.transferPeople')) !== -1) icon = 'gv-icon-zhuanpai1';\n else if (x.indexOf(t('table.copy')) !== -1) icon = 'el-icon-copy-document';\n else if (x.indexOf(t('table.followUp')) !== -1) icon = 'gv-icon-mingdangenjin';\n else if (x.indexOf(t('table.circleCheck')) !== -1) icon = 'gv-icon-huanjiance';\n else if (x.indexOf(t('table.completed')) !== -1) icon = 'gv-icon-xuanze';\n else if (x.indexOf(t('table.finished')) !== -1) icon = 'gv-icon-wangongguanli';\n else if (x.indexOf(t('table.beCompleted')) !== -1) icon = 'gv-icon-wangongqueren';\n else if (x.indexOf(t('table.openCard')) !== -1) icon = 'gv-icon-daka-copy';\n else if (x.indexOf(t('table.closeCard')) !== -1) icon = 'gv-icon-guanqia';\n else if (x.indexOf(t('table.clockIn')) !== -1) icon = 'gv-icon-qiandao';\n else if (x.indexOf(t('table.preview')) !== -1) icon = 'el-icon-view';\n else if (x.indexOf(t('table.replace')) !== -1) icon = 'gv-icon-tihuantupian';\n else if (x.indexOf(t('table.settlement')) !== -1) icon = 'gv-icon-eduguanli';\n else if (x.indexOf(t('table.inWarehouse')) !== -1) icon = 'gv-icon-caituiruku';\n else if (x.indexOf(t('table.save')) !== -1) {\n icon = 'gv-icon-baocun1';\n actionType = '1';\n } else icon = 'el-icon-document-copy';\n\n // added by andy.ten@tom.com 2024-08-14 增加自定义按钮icon\n if (iconArr && Array.isArray(iconArr) && iconArr.length > index && iconArr[index]) icon = iconArr[index];\n if (sTableActionIcon === false) icon = '';\n if (confirms === true)\n if (sTableConfirm === false)\n return icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n icon={icon}\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n confirm('是否?').then(\n () => {\n if (scope.lock === undefined || scope.lock === false) {\n if (loading.value === true) return;\n startLoading();\n scope.lock = true;\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n scope.lock = false;\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }}></GvButton>\n </span>\n </div>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n type=\"text\"\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n confirm(`${t('table.isConfirm')} ${x} ${t('table.action')} ?`).then(\n () => {\n if (scope.lock === undefined || scope.lock === false) {\n if (loading.value === true) return;\n startLoading();\n scope.lock = true;\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n scope.lock = false;\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }}>\n {x}\n </GvButton>\n </span>\n </div>\n </ElTooltip>\n );\n else\n return (\n <GvPopconfirm\n title={`${t('table.isConfirm')} ${x} ${t('table.action')} ?`}\n onConfirm={() => {\n if (scope.lock === undefined || scope.lock === false) {\n if (loading.value === true) return;\n startLoading();\n scope.lock = true;\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n scope.lock = false;\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }\n }}>\n {{\n reference: () => (\n <div class=\"gv-table-action-trigger\">\n {icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n icon={icon}\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}></GvButton>\n </span>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n type=\"text\"\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}>\n {x}\n </GvButton>\n </span>\n </ElTooltip>\n )}\n </div>\n ),\n }}\n </GvPopconfirm>\n );\n else if (detail === true)\n return (\n <ElPopover\n title={x}\n placement={detailPlacement}\n trigger=\"click\"\n showArrow={true}\n onAfter-enter={() => handleDetailPopoverShow(action, index, scope.row, scope.$index)}\n popperClass=\"gv-popconfirm\">\n {{\n reference: () => (\n <div class=\"gv-table-action-trigger\">\n {icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n icon={icon}\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}></GvButton>\n </span>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n type=\"text\"\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}>\n {x}\n </GvButton>\n </span>\n </ElTooltip>\n )}\n </div>\n ),\n default: () => showPopoverDetail.value,\n }}\n </ElPopover>\n );\n else\n // action btn\n return icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n visible={xx === 't'}\n disabled={disabled}\n text={x}\n size={tableSize.value}\n onClick={() => {\n // event.preventDefault();\n // event.stopPropagation();\n if (actionType === '1') {\n if (checkEditRow(scope.$index))\n try {\n startLoading();\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n } else\n try {\n startLoading();\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n }}\n icon={icon}></GvButton>\n </span>\n </div>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n visible={xx === 't'}\n disabled={disabled}\n text={x}\n size={tableSize.value}\n type=\"text\"\n onClick={() => {\n // event.preventDefault();\n // event.stopPropagation();\n startLoading();\n if (actionType === '1') {\n if (checkEditRow(scope.$index))\n try {\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n } else\n try {\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n }}>\n {x}\n </GvButton>\n </span>\n </div>\n </ElTooltip>\n );\n })}\n </div>\n );\n };\n\n /**\n * @todo: get table header columns\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 12:03:16\n * @param {*} loadAction\n * @param {*} tableColumns\n */\n const getTableColumn = (loadAction?: string, tableColumns?: TableHeadItem[]) => {\n const res: VNode[] = [];\n tableHeads = loadAction === 'recreate' ? tableColumns! : props.tableHead;\n // 从localStorage中获取已保存的列表显示信息\n if (loadAction === 'create') {\n lsTableHeads = getTableFieldsFromStorage();\n if (lsTableHeads) {\n const thd: TableHeadItem[] = [];\n const lsTableHeadsArr = lsTableHeads.split(',');\n let startIndex = 0;\n if (tableHeads[0].type === 'expand') {\n thd[0] = { ...tableHeads[0] } as TableHeadItem;\n startIndex = 0;\n if (tableHeads[1].type === 'action') thd[1] = { ...tableHeads[1] } as TableHeadItem;\n startIndex = 1;\n } else if (tableHeads[0].type === 'action') {\n startIndex = 0;\n thd[0] = { ...tableHeads[0] } as TableHeadItem;\n }\n\n lsTableHeadsArr.forEach((x: string, index: number) => {\n const xx = x.split('|');\n const ff = tableHeads.filter((f) => f.prop === xx[0]);\n if (ff.length > 0) {\n if (ff[0].hidden !== true) {\n ff[0].hasHidden = xx[1] === 't';\n const treeNode = {\n columnProp: ff[0].prop,\n label: ff[0].label,\n };\n if (loadAction === 'create') {\n (columnTreeList.value as any[]).push(treeNode);\n if (ff[0].hasHidden !== true && xx[1] !== 't') columnCheckedKeys.value.push(ff[0].prop);\n }\n }\n thd[index + startIndex] = { ...ff[0] };\n }\n });\n tableHeads = thd;\n }\n }\n\n // 第一列为序号列\n // let fixed = this.tableType !== 'detail';\n let fixed: string | undefined = sTableAction;\n if (tableHeads[0].type === 'expand') {\n fixed = undefined as unknown as string;\n sTableType = 'expand';\n }\n\n if (sTableType === 'expand') fixed = undefined as unknown as string;\n // 如果是edit多选列表,则去掉列锁定\n let tableFixed = 'y';\n if (tableHeads.some((x) => x.multiple === true)) {\n tableFixed = 'n';\n fixed = undefined;\n }\n\n if (props.multi === true) {\n fixed = undefined;\n tableFixed = 'n';\n }\n\n // 添加展开列\n if (tableHeads[0].type === 'expand')\n res.push(\n <ElTableColumn\n type=\"expand\"\n key=\"expand\"\n column-key=\"expand\"\n prop=\"expand\"\n width=\"42\"\n fixed={fixed}>\n {{ default: (scope: any) => tableHeads[0].render?.(scope) }}\n </ElTableColumn>,\n );\n let rownumWidth = '55';\n if (pageInfo.value?.currentpagenum)\n if (pageInfo.value.currentpagenum * pageInfo.value.totalpage > 10000) rownumWidth = '65';\n else if (pageInfo.value.currentpagenum * pageInfo.value.totalpage > 1000) rownumWidth = '57';\n\n if (fixed === 'left')\n res.push(\n <ElTableColumn\n fixed={fixed}\n // prop='rownums'\n key=\"rownums\"\n column-key=\"rownums\"\n label={t('table.rownums')}\n width={rownumWidth}\n min-width={rownumWidth}>\n {{\n default: (scope) => {\n // console.log(this.pageInfo.current);\n // console.log((this.pageInfo.current === -1 ? 0 : this.pageInfo.current - 1) * (this.pageInfo.size === -1 ? 0 : this.pageInfo.size));\n if (pageInfo.value?.currentpagenum) return (pageInfo.value.currentpagenum === -1 ? 0 : pageInfo.value.currentpagenum - 1) * pageInfo.value.totalpage + scope.$index + 1;\n else return scope.$index + 1;\n },\n }}\n </ElTableColumn>,\n );\n else\n res.push(\n <ElTableColumn\n // prop='rownums'\n key=\"rownums\"\n column-key=\"rownums\"\n label={t('table.rownums')}\n width={rownumWidth}\n min-width={rownumWidth}>\n {{\n default: (scope) => {\n if (pageInfo.value?.currentpagenum) return (pageInfo.value.currentpagenum === -1 ? 0 : pageInfo.value.currentpagenum - 1) * pageInfo.value.totalpage + scope.$index + 1;\n else return scope.$index + 1;\n },\n }}\n </ElTableColumn>,\n );\n // add: 第二列判断是否是多选框 2022-06-11\n if (props.multi === true)\n if (fixed === 'left')\n res.push(\n <ElTableColumn\n fixed=\"left\"\n prop=\"multi\"\n key=\"multi\"\n type=\"selection\"\n width=\"35\"></ElTableColumn>,\n );\n else\n res.push(\n <ElTableColumn\n prop=\"multi\"\n key=\"multi\"\n type=\"selection\"\n width=\"35\"></ElTableColumn>,\n );\n\n const actionHead = tableHeads.filter((x) => x.type === 'action');\n if (sTableAction === 'left')\n if (actionHead.length > 0) {\n const content = actionHead[0].content || [];\n const action = actionHead[0].action || [];\n const render = actionHead[0].render;\n const confirmArr = actionHead[0].confirm || [];\n const icon = actionHead[0].icon || [];\n if (actionHead[0].width) actionWidth = +actionHead[0].width;\n else if (sTableActionIcon === true)\n if (content.length === 1)\n // update: 对于只有一个按钮的操作列,设置固定宽度 2022-07-13\n actionWidth = 52;\n else actionWidth = content.length === 2 ? content.length * 44 : content.length * 42;\n else if (content.length === 1) actionWidth = content.join('').length * 30;\n else if (lang === 'zh_CN') actionWidth = content.join('').length * 25;\n else actionWidth = content.join('').length * 13;\n\n const actionColumn = (\n <ElTableColumn\n label={t('table.action')}\n key=\"caozuo\"\n column-key=\"caozuo\"\n prop=\"caozuo\"\n fixed={fixed}\n width={actionWidth}>\n {{ default: (scope: any) => renderAction(scope, content, action, render, confirmArr, icon) }}\n </ElTableColumn>\n );\n res.push(actionColumn);\n }\n\n filterHeads = [];\n tableHeads.forEach((item: TableHeadItem, index: number) => {\n if (item.type !== 'expand' && item.type !== 'action') {\n const columnVNode = renderColumnItem(item, index, loadAction, tableFixed);\n if (columnVNode) res.push(columnVNode);\n if (!lsTableHeads && loadAction === 'create')\n if (item.hidden !== true) {\n const treeNode = {\n columnProp: item.prop,\n label: item.label,\n };\n (columnTreeList.value as any[]).push(treeNode);\n columnCheckedKeys.value.push(item.prop);\n }\n }\n // this.$set(this.tableHead, index, item);\n // if (loadAction === 'create')\n // this.$set(this.resultData, index, item);\n });\n if (sTableAction === 'right')\n if (actionHead.length > 0) {\n const content = actionHead[0].content || [];\n const action = actionHead[0].action || [];\n const render = actionHead[0].render;\n const confirmArr = actionHead[0].confirm || [];\n const icon = actionHead[0].icon || [];\n if (actionHead[0].width) actionWidth = +actionHead[0].width;\n else if (sTableActionIcon === true)\n if (content.length === 1)\n // update: 对于只有一个按钮的操作列,设置固定宽度 2022-07-13\n actionWidth = 52;\n else actionWidth = content.length === 2 ? content.length * 44 : content.length * 42;\n else if (content.length === 1)\n if (lang === 'zh_CN') actionWidth = content.join('').length * 30;\n else actionWidth = content.join('').length * 18;\n else if (lang === 'zh_CN') actionWidth = content.join('').length * 25;\n else actionWidth = content.join('').length * 13;\n\n const actionColumn = (\n <ElTableColumn\n label={t('table.action')}\n key=\"caozuo\"\n column-key=\"caozuo\"\n prop=\"caozuo\"\n fixed={fixed}\n width={actionWidth}>\n {{ default: (scope: any) => renderAction(scope, content, action, render, confirmArr, icon) }}\n </ElTableColumn>\n );\n res.push(actionColumn);\n }\n\n // this.setDataLoaded(false);\n return res;\n };\n\n /**\n * @todo: 列选中状态切换\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:44:01\n * @param {*} columns\n * @param {*} checkedKeys\n */\n const createChangedColumns = (columns, checkedKeys) =>\n columns.map((column) => {\n const target = { ...column };\n if (target.type !== 'action' && target.type !== 'expand') target.hasHidden = !checkedKeys.includes(target.prop);\n return target;\n });\n\n /**\n * @todo: set store local\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-10 17:33:58\n * @param {*} checkedKeys\n * @param {*} data\n * @param {*} checked\n */\n const setStoreLocal = (checkedKeys: (string | number)[], data: { columnProp?: string }, checked: boolean) => {\n const c: string[] = [];\n const orderedProps = columnTreeList.value.map((node) => node.columnProp);\n const headMap = new Map(tableHeads.map((x) => [x.prop, x]));\n const orderedHeads = orderedProps.map((prop) => headMap.get(prop)).filter((x): x is TableHeadItem => !!x);\n const restHeads = tableHeads.filter((x) => !orderedProps.includes(x.prop));\n [...orderedHeads, ...restHeads].forEach((x) => {\n if (x.type !== 'action' && x.type !== 'expand') {\n if (checkedKeys.includes(x.prop))\n // 第一个|: 代表hasHidden 第二个|: 代表hidden\n c.push(x.prop + '|' + 'f' + '|' + (x.hidden === true ? 't' : 'f'));\n else c.push(x.prop + '|' + 't' + '|' + (x.hidden === true ? 't' : 'f'));\n if (data.columnProp === x.prop) x.hasHidden = !checked;\n }\n });\n setTableFieldsToStorage(c.join(','));\n };\n\n const reorderTableHeadsByTree = (treeList: ColumnTreeNode[]) => {\n const dataOrder = treeList.map((node) => tableHeads.find((x) => x.prop === node.columnProp)).filter((x): x is TableHeadItem => !!x && x.type !== 'expand' && x.type !== 'action');\n const result: TableHeadItem[] = [];\n let dataIdx = 0;\n tableHeads.forEach((col) => {\n if (col.type === 'expand' || col.type === 'action') result.push(col);\n else if (dataIdx < dataOrder.length) result.push(dataOrder[dataIdx++]);\n });\n return result;\n };\n\n const applyColumnTreeOrder = (treeList: ColumnTreeNode[]) => {\n const checkedKeys = columnTreeRef.value?.getCheckedKeys?.() ?? columnCheckedKeys.value;\n const reorderedHeads = reorderTableHeadsByTree(treeList);\n tableHeads = reorderedHeads;\n headColumn.value = getTableColumn('recreate', createChangedColumns(reorderedHeads, checkedKeys));\n setStoreLocal(checkedKeys, {}, false);\n };\n\n const allowColumnTreeDrop: AllowDropFunction = (_draggingNode, _dropNode, type) => type !== 'inner';\n\n const handleColumnNodeDrop = () => {\n nextTick(() => {\n const treeData = columnTreeRef.value?.getTreeNodeData?.() ?? columnTreeList.value;\n columnTreeList.value = [...treeData];\n applyColumnTreeOrder(columnTreeList.value);\n });\n };\n\n /**\n * @todo: tree column check change\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:43:09\n * @param {*} data\n * @param {*} checked\n * @param {*} childChecked\n */\n const handleColumnCheckChange = (data: any, checked: boolean, _childChecked: boolean) => {\n const checkedKeys = columnTreeRef.value?.getCheckedKeys?.() ?? [];\n const hColumns = createChangedColumns(tableHeads, checkedKeys);\n // console.log(hColumns);\n headColumn.value = getTableColumn('recreate', hColumns);\n // 存储到 localStorage\n setStoreLocal(checkedKeys, data, checked);\n };\n\n /**\n * @todo: get kit bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:41:30\n */\n const getKitBar = () => {\n let isVisible = true;\n if (sTableKit.value !== undefined) isVisible = sTableKit.value;\n if (props.tableType === 'import' || props.tableType === 'detail' || props.tableType === 'expand' || props.tableType === 'export') isVisible = false;\n // 行编辑去掉隐藏列功能\n if (isEditTable === true) isVisible = false;\n return isVisible === true ? (\n <div class=\"gv-table__kitbar\">\n <ElButtonGroup>\n <ElButton\n style=\"width: 37px\"\n size={tableSize.value}\n icon={Refresh}\n onClick={handleTableRefresh}\n />\n <ElPopover\n placement=\"bottom-end\"\n width=\"150\"\n trigger=\"click\">\n {{\n reference: () => (\n <ElButton\n size={tableSize.value}\n style={{ width: '37px' }}\n icon={Operation}\n />\n ),\n default: () => (\n <GvTree\n ref={columnTreeRef}\n nodeKey=\"columnProp\"\n treeData={columnTreeList.value}\n checkOnClickNode={true}\n defaultCheckedKeys={columnCheckedKeys.value}\n showCheckbox\n draggable\n allowDrop={allowColumnTreeDrop}\n onCheck-change={handleColumnCheckChange}\n onNode-drop={handleColumnNodeDrop}\n style={{ maxHeight: '450px', overflow: 'hidden auto' }}\n class=\"gv-table-column-tree\"\n />\n ),\n }}\n </ElPopover>\n </ElButtonGroup>\n </div>\n ) : null;\n };\n\n /**\n * @todo: table sort\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-25 17:45:10\n */\n const sortMethod = async ({ column, prop, order }: { column: Recordable<any>; prop: string | null; order: 'ascending' | 'descending' | null }) => {\n const fieldName = prop || column?.property;\n const sortingType = order ?? column?.order ?? null;\n if (tableSortMode.value === 1) {\n // 本页排序\n let sumData = {}; // 放置总计一行数据\n recordsList.value.forEach((item) => {\n if (item.name === t('common.total')) sumData = item;\n });\n if (sortingType === null)\n recordsList.value = recordsList.value.sort((a, b) => {\n let row1 = a['rownums'];\n let row2 = b['rownums'];\n // fixme: 增加判断是否是字典项 2022-06-20\n if (row1.v) row1 = row1.v;\n\n if (row2.v) row2 = row2.v;\n if (!isNaN(Number(row1)) && !isNaN(Number(row2))) return row1 - row2;\n else return row1.toString().localeCompare(row2.toString());\n });\n else if (sortingType === 'ascending' || sortingType === null) {\n // 正序\n recordsList.value = recordsList.value.sort((a, b) => {\n let row1 = a[fieldName] || '';\n let row2 = b[fieldName] || '';\n // fixme: 增加判断是否是字典项 2022-06-20\n if (row1.v) row1 = row1.v;\n\n if (row2.v) row2 = row2.v;\n if (!isNaN(Number(row1)) && !isNaN(Number(row2))) return row1 - row2;\n else return row1.toString().localeCompare(row2.toString());\n });\n // 删除table中的总计\n recordsList.value.forEach((item, index) => {\n if (item.name === t('common.total')) recordsList.value.splice(index, 1);\n return item;\n });\n if (Object.keys(sumData).length > 0) recordsList.value.push(sumData);\n } else if (sortingType === 'descending') {\n // 倒序\n recordsList.value = recordsList.value.sort((a, b) => {\n let row1 = a[fieldName] || '';\n let row2 = b[fieldName] || '';\n // fixme: 增加判断是否是字典项 2022-06-20\n if (row1.v) row1 = row1.v;\n\n if (row2.v) row2 = row2.v;\n if (!isNaN(Number(row1)) && !isNaN(Number(row2))) return row2 - row1;\n else return row2.toString().localeCompare(row1.toString());\n });\n recordsList.value.map((item, index) => {\n if (item.name === t('common.aggregate')) recordsList.value.splice(index, 1);\n return item;\n });\n if (Object.keys(sumData).length > 0) recordsList.value.push(sumData);\n }\n } else {\n // 后端排序\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n const fetchFn = (instance?.exposed?.fetch as Fn) || props.tableFetch;\n if (!fetchFn) {\n message(t('table.execSearchWarn'));\n return;\n }\n const oi: Recordable<string> = {};\n\n oi['orderfilter'] = fieldName;\n oi['ordertype'] = sortingType === 'ascending' ? 'asc' : 'desc';\n fC['orderinfo'] = oi;\n const result = await crud.toNewPageSearch(instance, fC, fetchFn, pageInfo.value);\n if (result) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n }\n\n // 隐藏popover\n popoverVisible.value[fieldName] = false;\n document.body.click();\n };\n\n /**\n * @todo: row dblclick event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-08 11:15:41\n * @param {*} row\n * @param {*} column\n * @param {*} event\n */\n const rowDblClick = (row: Recordable<any>, column: TableColumnCtx<Recordable<any>> | null, event: MouseEvent) => {\n const target = event.target as HTMLElement | null;\n if (!target) return;\n // fixme: 屏蔽行中带有icon图标双击事件 2022-12-12\n if (target.tagName === 'I') return;\n else {\n const cell = target.closest('.el-table__cell');\n if (cell && hasClass(cell as HTMLElement, 'el-table__expand-column')) return;\n }\n if (isEditTable === false)\n if (typeof attrs.onRowDblclick === 'function') emit('row-dblclick', row, column, event);\n else {\n const tr = target.closest('.el-table__row');\n if (!tr) return;\n const tds = tr.children;\n let firstBtn: HTMLElement | null = null;\n for (let i = 0; i < tds.length; i++) {\n const btnArr = tds[i].querySelectorAll<HTMLElement>('.cell button.gv-button');\n for (let j = 0; j < btnArr.length; j++) {\n const btn = btnArr[j];\n // fixme: 解决隐藏按钮后双击仍然调用问题 2022-10-09\n if (btn && btn.style.display !== 'none') {\n firstBtn = btn;\n break;\n }\n }\n if (firstBtn) break;\n }\n firstBtn?.click();\n }\n };\n\n /**\n * @todo: 合并表格行或合并列方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-16 14:27:07\n */\n // const handleSpanMethod = (columnObj) => {\n // props.spanMethod(columnObj);\n // };\n\n // const getSummaries = (param) => {\n // const { columns, data } = param;\n // const sums = [];\n // columns.forEach((column, index) => {\n // if (column.columnKey === 'rownums') {\n // sums[index] = t('common.total');\n // return;\n // }\n // if (column.property === 'multi' || column.columnKey === 'caozuo' || column.columnKey === 'expand') return;\n // const keyIndex = columnSums.indexOf(column.property);\n // if (keyIndex !== -1) {\n // const values = data.map((item) => Number(item[column.property]));\n // if (!values.every((value) => isNaN(value))) {\n // sums[index] = values.reduce((prev, curr) => {\n // const value = Number(curr);\n // if (!isNaN(value)) return prev + curr;\n // else return prev;\n // }, 0);\n // const decimal = columnSumsDecimal[keyIndex];\n // sums[index] = amountFormat(sums[index], decimal);\n // sums[index] += '';\n // } else sums[index] = '';\n // } else return;\n // });\n // return sums;\n // };\n\n /**\n * @todo: 拖动表头改变列宽度响应事件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2024-01-07 10:16:42\n * @param {*} newWidth\n * @param {*} oldWidth\n * @param {*} column\n * @param {*} event\n */\n // const headerDragend = (newWidth, oldWidth, column, event) => {\n // // fixed: 解决fix table 表头列宽度改变时fix列高度不正确问题 2024-01-07\n // nextTick(() => {\n // // fixCellH.style.height = cellH.offsetHeight;\n // this.$refs[this.vref].doLayout();\n // const fixCellH = this.$refs[this.vref].$el.querySelector('.el-table__fixed-header-wrapper>.el-table__header .el-table__cell');\n // const cellH = this.$refs[this.vref].$el.querySelector('.el-table__header-wrapper>.el-table__header .el-table__cell');\n // // console.log(cellH.offsetHeight);\n // fixCellH.style.height = cellH.offsetHeight + 'px';\n // // console.log(fixCellH.style.height);\n // });\n // });\n\n // @watch\n watch(\n () => props.tableHead,\n (newVal, prevVal) => {\n if (newVal.length !== prevVal.length) headColumn.value = getTableColumn();\n else {\n const res = difference(newVal, originTableHead);\n if (res === true) headColumn.value = getTableColumn();\n }\n },\n );\n watch(\n () => sMaxHeight.value,\n () => {\n if (props.tableType !== 'import')\n if (isScrollbar === false)\n if (isAnchor === false) {\n if (sHeight) sMaxHeight.value = sHeight;\n } else sMaxHeight.value = undefined;\n else sMaxHeight.value = undefined;\n },\n );\n watch(\n () => props.tableData,\n (newValue) => {\n resultData.value = newValue;\n },\n );\n\n watch(\n () => resultData.value,\n (newValue) => {\n if (newValue) {\n recordsList.value = newValue.records || newValue;\n // fixme: 解决无法获取结果集时报错问题 2022-06-05\n if (recordsList.value === undefined || recordsList.value.length === undefined) recordsList.value = [];\n if (recordsList.value.length > 0 && recordsList.value[0]['transHash']) {\n transHash = recordsList.value[0]['transHash'];\n recordsList.value.splice(0, 1);\n if (headColumn.value.length === 0) {\n tableHeads.forEach((x: TableHeadItem) => {\n let sProp = x.prop;\n if (sProp && sProp.indexOf('@') > 0) sProp = sProp.split('@')[1];\n if (props.total)\n if (x.sum === true) {\n columnSums.push(sProp);\n columnSumsDecimal.push(x.decimal ? x.decimal : 2);\n x.align = 'right';\n }\n\n const trans: string | undefined = transHash?.[sProp];\n if (trans) {\n const typeArr = trans.split('|');\n switch (typeArr[0]) {\n case 'company':\n x.dicType = 'company';\n break;\n case 'dept':\n x.dicType = 'dept';\n break;\n case 'user':\n x.dicType = 'user';\n break;\n case 'dic':\n x.type = 'dic';\n x.dicType = typeArr[1];\n break;\n case 'division':\n x.type = 'dic';\n x.dicType = 'xzqh';\n break;\n case 'date':\n x.type = 'date';\n x.dateType = typeArr[1];\n break;\n }\n }\n });\n headColumn.value = getTableColumn();\n }\n } else headColumn.value = getTableColumn();\n pageInfo.value = getPageInfo.value;\n // 设置排序方式\n if (pageInfo.value.totalpage > 1) tableSortMode.value = 2;\n else tableSortMode.value = 1;\n // 设置导出按钮状态\n if (recordsList.value && recordsList.value.length > 0) exportBtnDisabled.value = false;\n else exportBtnDisabled.value = true;\n\n // 加载状态\n // this.sDataLoaded = true;\n }\n nextTick(() => {\n // 重新计算\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n getMaxHeight(rootEl);\n\n // add: 增加查询回调方法 2022-11-23\n if (props.tableCb) props.tableCb(recordsList.value, resultData.value);\n tableRef.value?.doLayout();\n });\n },\n );\n\n // @exposed\n expose({\n setTableRef,\n fetch,\n startLoading,\n stopLoading,\n filterConditions,\n });\n\n // @created\n // get localStorage table column\n originTableHead = JSON.parse(JSON.stringify(props.tableHead));\n // fixme: 初始化时根据结果集赋值pagesize 解决后端设置pageSize后前端无法加载问题 2022-04-30\n // if (this.tableInit === true)\n if (Object.keys(props.tableData).length === 0) headColumnInit.value = getTableColumn('create');\n if (props.tableType === 'expand') {\n sTableSort.value = false;\n sTableBar.value = false;\n } else if (props.tableType === 'detail') headColumnInit.value = getTableColumn();\n if (props.tableData && props.tableData.size) {\n sPageSize = props.tableData.size;\n // 设置排序方式\n if (props.tableData.pages > 1) tableSortMode.value = 2;\n else tableSortMode.value = 1;\n }\n\n // 设置列表按钮以及右上角按钮的全局隐藏或显示\n if (gTableBar === false) {\n sTableSort.value = false;\n sTableKit.value = false;\n sTableBar.value = true;\n }\n\n // set pageSizes\n if (pageSizes.includes(sPageSize) === false) {\n pageSizes.splice(0, 0, sPageSize);\n pageSizes.sort(function (m, n) {\n if (m < n) return -1;\n else if (m > n) return 1;\n else return 0;\n });\n }\n\n if (props.tableType === 'detail') {\n // this.sMaxHeight = '200px';\n pageLayout.value = 'total, prev, pager, next';\n // 设置detail宽度\n sMaxWidth.value = '850px';\n } else if (props.tableType === 'expand') if (!sMaxWidth.value) sMaxWidth.value = '85%';\n // this.pageLayout = 'total, prev, pager, next';\n\n transRecords('create');\n\n // @mounted\n onMounted(() => {\n debounceSearch = debounce(handleTableSearch, 500);\n nextTick(() => {\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n window.addEventListener('click', () => {\n closeAllPopover();\n });\n window.addEventListener('resize', () => getMaxHeight(rootEl));\n if (rootEl) {\n const tableBodyWrapper = rootEl.querySelector('.el-table__body-wrapper');\n if (tableBodyWrapper) tableBodyWrapper.addEventListener('scroll', getScrollLeft, false);\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor = true;\n const dialogBody = rootEl.closest('.gv-drawer__body--inner');\n if (dialogBody) isScrollbar = hasScrollbar(dialogBody);\n if (rootEl.closest('.gv-edit__container')) isEditContainer = true;\n }\n });\n });\n\n // @render\n return () => {\n pageInfo.value = getPageInfo.value;\n return props.visible ? (\n <div\n class={props.tableType === 'expand' ? 'gv-table__container gv-table__container-expand' : 'gv-table__container'}\n style={{ width: '100%', minWidth: '0px', maxWidth: sMaxWidth.value }}>\n <GvTableBar visible={sTableBar.value}>{getTableBar()}</GvTableBar>\n {getKitBar()}\n {getTableSearch()}\n {getSortModel()}\n <div\n class=\"gv-table__loading-wrap\"\n v-loading={loading.value}\n element-loading-text=\"Loading...\">\n <ElTable\n ref={vref}\n // element-loading-spinner='iconfont gv-icon-loading'\n data={recordsList.value}\n border={props.tableType === 'detail' ? false : props.border}\n highlight-current-row={true}\n table-layout=\"fixed\"\n style=\"width: 100%\"\n height={sHeight}\n max-height={sMaxHeight.value}\n stripe={true}\n row-key={(row: any) => row.rownums}\n expand-row-keys={props.expandRowKeys}\n row-style={props.rowStyle}\n cell-style={props.cellStyle}\n header-cell-class-name=\"headerStyleEvent\"\n //span-method={handleSpanMethod}\n show-summary={props.total}\n // summary-method={getSummaries}\n // toggleRowSelection\n // on-row-class-name={props.rowClassName} // 设置行class的回调方法\n onSort-change={sortMethod}\n onRow-dblclick={rowDblClick} // 设置行双击事件方法\n // on-row-click={props.handleRowClick} // 设置行单击事件方法\n // on-selection-change={handleSelectionChange} // 设置多选行事件\n // on-expand-change={handleExpandChange} // 行展开异步加载方法\n // on-header-dragend={headerDragend} // 列拖宽度方法\n class={props.tableType === 'detail' ? 'gv-table-noborder' : props.border === true ? `${prefixCls}` : 'gv-table-noborder'}>\n {props.tableData && Object.keys(props.tableData).length > 0 ? headColumn.value : headColumnInit.value}\n </ElTable>\n </div>\n <ElPagination\n style={{ display: props.isShowPage ? '' : 'none' }}\n pageSizes={pageSizes}\n pageSize={pageInfo.value.recordsperpage}\n layout={pageLayout.value}\n total={pageInfo.value.countrows}\n currentPage={pageInfo.value.currentpagenum}\n hideOnSinglePage={true}\n onUpdate:page-size={handleSizeChange}\n onUpdate:current-page={handleCurrentChange}\n class=\"gv-pagination\"></ElPagination>\n </div>\n ) : null;\n };\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n .gv-table__container {\n width: 100%;\n height: calc(100% - 10em);\n margin-top: -2px;\n\n .gv-table__loading-wrap {\n position: relative;\n width: 100%;\n }\n .gv-table__sortmode {\n float: right;\n\n & i {\n padding-right: 15px;\n //font-size: 14px;\n }\n\n :deep(.el-radio) {\n margin-right: 12px;\n\n .el-radio__input {\n &.is-checked {\n .el-radio__inner {\n background: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n\n .el-radio__label {\n //font-size: $tableThFontSize;\n }\n\n .el-radio__input.is-checked + .el-radio__label {\n color: var(--primaryColor, $primaryColor);\n }\n }\n }\n\n .gv-table__kitbar {\n position: relative;\n float: right;\n width: 74px;\n height: 28px;\n margin: 1px 0 0 8px;\n line-height: 28px;\n\n .el-button-group {\n height: 26px;\n line-height: 26px;\n\n .el-button {\n padding: 6px 8px 5px;\n }\n }\n }\n\n .gv-table__search {\n position: relative;\n float: right;\n width: 160px;\n margin-top: 3px;\n\n :deep(.gv-table__search-input) {\n // top: -30px;\n float: right;\n width: 150px;\n .el-input__wrapper {\n height: 28px;\n line-height: 28px;\n }\n .el-input__inner {\n font-size: 12px;\n padding-left: 1px !important;\n }\n }\n }\n\n .gv-table {\n border-top: 1px solid $tableBorderColor;\n border-bottom: 0;\n border-left: 1px solid $tableBorderColor;\n\n :deep(.ascending .sort-caret.ascending) {\n border-bottom-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n :deep(.descending .sort-caret.descending) {\n border-top-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n :deep(.el-table__header-wrapper) {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight;\n line-height: 34px;\n background-color: $tableThBgColor;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 1px solid $tableBorderColor;\n\n .cell {\n padding-right: 3px;\n color: $textColor;\n font-weight: 500 !important;\n .render__header {\n font-weight: 500 !important;\n }\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .is-selected {\n color: #cf2931;\n }\n\n .render__header {\n display: inline-flex;\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n }\n }\n }\n }\n\n :deep(.el-table__body-wrapper) {\n .el-table__body {\n .el-table__row.expanded {\n .el-table__cell {\n padding: 2px 0;\n border-bottom: 1px solid $tableBorderColor;\n }\n }\n\n .el-table__expanded-cell {\n padding: 4px 2px 10px 89px;\n }\n\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 0;\n\n // border-bottom:1px solid $tableBorderColor;\n\n .cell {\n // box-sizing: border-box;\n // display: inline-block;\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n .el-button {\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n\n .gv-tag {\n box-sizing: border-box;\n display: inline-block;\n height: 22px;\n padding: 0 5px;\n //font-size: $appTextSize;\n line-height: 22px;\n color: #409eff;\n white-space: nowrap;\n background-color: #ecf5ff;\n border: 1px solid #d9ecff;\n border-radius: 4px;\n }\n }\n }\n\n .gv-cell__render {\n .cell {\n height: auto;\n }\n }\n\n .gv-cell__isedit {\n .cell {\n height: auto;\n padding: 0 5px;\n\n .gv-input {\n height: 25px;\n line-height: 25px;\n\n .el-input__inner {\n height: 25px;\n padding-left: 5px;\n line-height: 25px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-input-number {\n width: 120px;\n height: 25px;\n line-height: 25px;\n\n .el-input-number__decrease,\n .el-input-number__increase {\n height: 23px;\n line-height: 23px;\n }\n\n .el-input__inner {\n height: 25px;\n padding-left: 5px;\n line-height: 25px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-datepicker {\n height: 25px;\n //font-size: $textSizeSecondary;\n line-height: 25px;\n\n .el-input__inner {\n height: 25px;\n padding-right: 25px;\n padding-left: 25px;\n line-height: 25px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n .el-icon-date {\n height: 26px;\n line-height: 26px;\n }\n\n .el-icon-time {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n\n .gv-select {\n vertical-align: inherit !important;\n width: 100%;\n\n .el-input {\n // line-height: 28px;\n // height: 25px;\n\n // height: 28px;\n //font-size: $textSizeSecondary;\n\n // line-height: 25px;\n\n .el-input__inner {\n // height:26px !important;\n padding-right: 25px;\n padding-left: 25px;\n\n // line-height:26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n\n .el-select__tags {\n .el-tag {\n height: 22px;\n margin: 1px 0 1px 6px;\n }\n }\n }\n\n .gv-select__table {\n width: 100%;\n vertical-align: inherit !important;\n .el-input {\n // height: 25px;\n //font-size: $textSizeSecondary;\n\n // line-height: 25px;\n\n .el-input__inner {\n // height:26px;\n padding-right: 25px;\n padding-left: 25px;\n\n // line-height:26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__row:last-child {\n // &.current-row{\n // td.el-table__cell{\n // background-color: var(--defaultHover,$defaultHover);\n // }\n // }\n\n .el-table__cell {\n padding: 2px 0;\n border-bottom: 1px solid $tableBorderColor;\n }\n }\n }\n }\n\n :deep(.el-table__footer-wrapper) {\n .el-table__footer {\n .el-table__cell {\n padding: 2px 0;\n //font-size: $tableThFontSize;\n }\n }\n }\n\n :deep(.el-table__fixed),\n :deep(.el-table__fixed-right) {\n height: 100% !important;\n .el-table__fixed-header-wrapper {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight !important;\n line-height: 34px;\n background-color: $tableThBgColor;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 1px solid $tableBorderColor;\n\n .cell {\n height: 28px;\n font-weight: 500 !important;\n // display: inline-block; // flex\n padding-right: 3px;\n line-height: 28px;\n color: $textColor;\n\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .is-selected {\n color: #cf2931;\n }\n\n .render__header {\n display: inline-block; // flex\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n\n .el-checkbox {\n .el-checkbox__input {\n .el-checkbox__inner {\n &:hover {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-checked,\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__fixed-body-wrapper {\n .el-table__body {\n .el-table__row.expanded {\n .el-table__cell {\n padding: 2px 0;\n border-bottom: 1px solid $tableBorderColor;\n }\n }\n\n .el-table__expanded-cell {\n padding: 2px;\n }\n\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n // box-sizing: border-box;\n padding: 2px 0;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 0;\n\n .cell {\n // display: inline-block; // flex\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n // padding-left: 3px;\n .el-button {\n // margin-left: 5px;\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n\n .gv-input {\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .gv-tag {\n box-sizing: border-box;\n\n // display: inline-block;\n height: 24px;\n padding: 0 5px;\n //font-size: $appTextSize;\n line-height: 24px;\n color: #409eff;\n white-space: nowrap;\n background-color: #ecf5ff;\n border: 1px solid #d9ecff;\n border-radius: 4px;\n }\n\n .el-checkbox {\n .el-checkbox__input {\n .el-checkbox__inner {\n &:hover {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-checked,\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n }\n\n .gv-cell__render {\n .cell {\n height: auto;\n }\n }\n }\n\n .el-table__row:last-child {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n // border-bottom: 1px solid $tableBorderColor;\n }\n }\n }\n }\n\n .el-table__fixed-footer-wrapper {\n .el-table__footer {\n .el-table__cell {\n padding: 2px 0;\n //font-size: $tableThFontSize;\n }\n }\n }\n }\n }\n\n .gv-table-noborder {\n :deep(.el-table__header-wrapper) {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight;\n line-height: 34px;\n\n .cell {\n height: 28px;\n padding-right: 3px;\n line-height: 28px;\n color: $textColor;\n font-weight: 500 !important;\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .render__header {\n display: inline-flex;\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n }\n }\n }\n }\n\n :deep(.el-table__body-wrapper) {\n .el-table__body {\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n\n // border-bottom:1px solid $tableBorderColor;\n\n .cell {\n // box-sizing: border-box;\n // display: inline-block;\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n .el-button {\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n }\n }\n\n .gv-cell__render {\n .cell {\n height: auto;\n }\n }\n\n .gv-cell__isedit {\n .cell {\n height: 28px;\n padding: 0 5px;\n line-height: 28px;\n\n .gv-input {\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n }\n\n .gv-input-number {\n width: 120px;\n\n .el-input-number__decrease,\n .el-input-number__increase {\n height: 23px;\n line-height: 23px;\n }\n\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-datepicker {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n padding-right: 25px;\n padding-left: 25px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n .el-icon-date {\n height: 26px;\n line-height: 26px;\n }\n\n .el-icon-time {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n\n .gv-select {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n\n .gv-select__table {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__row:last-child {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n }\n }\n }\n }\n\n :deep(.el-table__fixed),\n :deep(.el-table__fixed-right) {\n .el-table__fixed-header-wrapper {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight !important;\n line-height: 34px;\n\n .cell {\n display: inline-block; // flex\n height: 28px;\n padding-right: 3px;\n line-height: 28px;\n color: $textColor;\n font-weight: 500 !important;\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .render__header {\n display: inline-block; // flex\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n }\n }\n }\n }\n\n .el-table__fixed-body-wrapper {\n .el-table__body {\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n // box-sizing: border-box;\n padding: 2px 0;\n\n .cell {\n display: inline-block; // flex\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n .el-button {\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n }\n }\n\n .gv-cell__isedit {\n .cell {\n height: 28px;\n padding: 0 5px;\n line-height: 28px;\n\n .gv-input {\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n }\n\n .gv-input-number {\n width: 120px;\n\n .el-input-number__decrease,\n .el-input-number__increase {\n height: 23px;\n line-height: 23px;\n }\n\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-datepicker {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n padding-right: 25px;\n padding-left: 25px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n .el-icon-date {\n height: 26px;\n line-height: 26px;\n }\n\n .el-icon-time {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n\n .gv-select {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n\n .gv-select__table {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__row:last-child {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n\n .cell {\n display: inline-block; // flex\n }\n }\n }\n }\n }\n }\n }\n\n // pageinfo\n :deep(.el-pagination) {\n float: right;\n\n .el-input__inner {\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover) !important;\n }\n\n &:hover {\n border-color: var(--primaryColorHover, $primaryColorHover) !important;\n }\n }\n\n .el-pagination__total {\n left: 15px;\n //font-size: $appTextSize !important;\n // position: absolute;\n margin-right: 20px;\n font-weight: 500;\n color: var(--primaryColor, $primaryColor);\n }\n\n .el-pagination__sizes {\n // position: absolute;\n left: 65px;\n margin: 0px 10px 0 0;\n width: 100px;\n line-height: 28px;\n .el-select {\n width: 100px;\n line-height: 28px;\n .el-select__wrapper {\n //font-size: $appTextSize;\n min-height: 28px;\n }\n .el-input {\n width: 90px;\n\n .el-input__inner {\n height: 25px;\n line-height: 25px;\n }\n }\n }\n }\n\n .btn-prev,\n .btn-next {\n min-width: 25px;\n padding: 0;\n }\n\n .el-pager {\n li.active,\n li:hover {\n color: var(--primaryColor, $primaryColor);\n }\n .is-active number {\n //font-size: $appTextSize;\n }\n .number {\n min-width: 30px;\n //font-size: $appTextSize;\n font-weight: $fontWeight;\n }\n }\n\n .el-pagination__jump {\n .el-pagination__goto {\n //font-size: $appTextSize;\n }\n .el-pagination__classifier {\n //font-size: $appTextSize;\n }\n .el-pagination__editor {\n //font-size: $appTextSize;\n width: 45px;\n\n .el-input__inner {\n height: 24px;\n line-height: 24px;\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTable from './src/GvTable.vue';\n\nconst GvTablePlugin = {\n install(app: App): void {\n app.component(GvTable.name ?? 'GvTable', GvTable);\n },\n};\nexport default GvTablePlugin;\n\nexport { GvTable };\n","<!--\n * @title: tab pane component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:19:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-12 10:24:57\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { hasScrollbar } from '@@/utils';\n import { defineComponent, getCurrentInstance, nextTick, onMounted, ref } from 'vue';\n\n // const { getPrefixCls } = useStyle();\n // const prefixCls = getPrefixCls('tab-pane');\n export default defineComponent({\n name: 'GvTabPane',\n props: {\n name: {\n type: String,\n required: false,\n default: undefined,\n },\n label: {\n type: String,\n required: false,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n required: false,\n default: false,\n },\n maxHeight: {\n type: [Number, String],\n required: false,\n default: undefined,\n },\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n autoHeight: {\n type: Boolean,\n required: false,\n default: false,\n },\n },\n\n // emit\n emits: ['tab-click'],\n setup(props, { emit, slots }) {\n // @data\n const sMaxHeight = props.maxHeight;\n const isAnchor = ref(false);\n const isScrollbar = ref(false);\n const isEditContainer = ref(false);\n const instance = getCurrentInstance();\n\n // @watch\n // @methods\n\n // @mounted\n onMounted(() => {\n nextTick(() => {\n const rootEl = instance?.proxy?.$el;\n const dialogBody = rootEl.closest('<div className=\"gv\"></div>-drawer__body--inner');\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (rootEl.closest('.gv-edit__container')) isAnchor.value = true;\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (rootEl.closest('.gv-edit__container')) isEditContainer.value = true;\n if (props.autoHeight === false)\n if (isEditContainer.value === false)\n if (isScrollbar.value === false)\n if (isAnchor.value === false)\n if (!sMaxHeight) {\n const tabPane = rootEl;\n const offsetTop = tabPane.classList.contains('el-tabs--left') ? 95 : 165;\n const maxHeight = document.documentElement.clientHeight - rootEl.offsetTop - offsetTop;\n rootEl.style.maxHeight = maxHeight + 'px';\n }\n });\n });\n // @render\n return () => (\n <div\n data-name={props.name}\n data-label={props.label}\n data-disabled={props.disabled}\n style={{ overflow: 'hidden auto', maxHeight: `${props.maxHeight}` }}>\n {slots.default?.()}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tab-pane';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvTabPane from './src/GvTabPane.vue';\n\nconst GvTabsPlugin = {\n install(app: App): void {\n app.component(GvTabPane.name ?? 'GvTabPane', GvTabPane);\n },\n};\nexport default GvTabsPlugin;\n\nexport { GvTabPane };\n","<!--\n * @title: tabs component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 09:50:50\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-12 11:53:36\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { hasScrollbar } from '@@/utils';\n import { ElTabPane, ElTabs } from 'element-plus';\n import { defineComponent, Fragment, getCurrentInstance, nextTick, onMounted, ref, watch, type PropType, type VNode } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tabs');\n export default defineComponent({\n name: 'GvTabs',\n props: {\n tabPosition: {\n type: String as PropType<'left' | 'right' | 'bottom' | 'top'>,\n default: 'left',\n },\n defaultValue: {\n type: [Number, String] as PropType<number | string>,\n default: 0,\n },\n modelValue: {\n type: [Number, String] as PropType<number | string>,\n default: 0,\n },\n type: {\n type: String as PropType<'card' | 'border-card'>,\n default: undefined, // card|border-card\n },\n closable: {\n type: Boolean,\n default: false,\n },\n tabMaxHeight: {\n type: [Number, String],\n default: undefined,\n },\n },\n\n // emit\n emits: ['tab-click'],\n setup(props, { emit, slots }) {\n // @data\n const inputValue = ref(props.modelValue);\n const tabHeight = ref('auto');\n const isAnchor = ref(false);\n const isScrollbar = ref(false);\n const isEditContainer = ref(false);\n const instance = getCurrentInstance();\n\n const isTabPaneVnode = (vnode: VNode) => {\n if (!vnode || typeof vnode.type !== 'object' || vnode.type === null) return false;\n const componentName = 'name' in vnode.type ? (vnode.type as { name?: string }).name : '';\n return componentName === 'GvTabPane' || componentName === 'ElTabPane';\n };\n\n const flattenVnodes = (vnodes: VNode[]): VNode[] => {\n const result: VNode[] = [];\n vnodes.forEach((vnode) => {\n if (vnode.type === Fragment) {\n const children = vnode.children as VNode[] | null;\n if (Array.isArray(children)) result.push(...flattenVnodes(children));\n } else result.push(vnode);\n });\n return result;\n };\n\n const getPaneContent = (vnode: VNode) => {\n const children = vnode.children as { default?: () => VNode[] } | null | undefined;\n if (children && typeof children === 'object' && !Array.isArray(children) && typeof children.default === 'function') return children.default();\n return null;\n };\n\n const getTabPanes = () => {\n const slotVnodes = slots.default?.() ?? [];\n const result: { label?: string; name?: string | number; visible: boolean; vnode: VNode }[] = [];\n flattenVnodes(slotVnodes).forEach((vnode) => {\n if (!isTabPaneVnode(vnode)) return;\n const paneProps = (vnode.props ?? {}) as Record<string, unknown>;\n result.push({\n label: paneProps.label as string | undefined,\n name: paneProps.name as string | number | undefined,\n visible: paneProps.visible !== false,\n vnode,\n });\n });\n return result;\n };\n\n // @watch\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @methods\n /**\n * @todo: 点击tab页响应事件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-09 09:16:37\n * @param {*} tabVm 被选中tab页实例\n */\n const handleTabClick = (tabVm) => {\n const tabName = tabVm.props?.name;\n if (tabName !== undefined && tabName !== null) inputValue.value = tabName;\n emit('tab-click', tabVm);\n };\n\n /**\n * @todo: 创建 tabpanel\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-03 16:30:54\n */\n const createTabPane = () =>\n getTabPanes().map((pane, index) => {\n if (!pane.visible) return null;\n return (\n <ElTabPane\n key={pane.name ?? pane.label ?? index}\n name={pane.name}\n label={pane.label}\n style={{ height: tabHeight.value }}>\n {getPaneContent(pane.vnode)}\n </ElTabPane>\n );\n });\n\n // @mounted\n onMounted(() => {\n nextTick(() => {\n const rootEl = instance?.proxy?.$el as HTMLElement | undefined;\n const dialogBody = rootEl?.closest('.gv-drawer__body--inner');\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n else {\n const dialogContainer = rootEl?.closest('.gv-container');\n if (dialogContainer) isScrollbar.value = hasScrollbar(dialogContainer);\n }\n if (rootEl?.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (rootEl?.closest('.gv-edit__container')) isEditContainer.value = true;\n if (!isEditContainer.value)\n if (isScrollbar.value === false)\n if (isAnchor.value === false) {\n // 设置tab页高度\n const drawer = rootEl?.closest('.gv-drawer');\n if (drawer) tabHeight.value = 'auto';\n // const tp = this.tabPosition === 'left' ? 170 : 230;\n // this.tabHeight = document.documentElement.clientHeight - this.$el.offsetTop - tp + 'px';\n else {\n const dialog = rootEl?.closest('.gv-dialog');\n if (dialog) tabHeight.value = 'auto';\n // const tp = this.tabPosition === 'left' ? 170 : 230;\n // this.tabHeight = document.documentElement.clientHeight - this.$el.offsetTop - tp + 'px';\n else {\n const h = document.documentElement.clientHeight - (rootEl?.offsetTop ?? 0) - 55;\n if (h < 384) tabHeight.value = '384px';\n else tabHeight.value = h + 'px';\n }\n }\n }\n });\n });\n // @render\n return () => (\n <ElTabs\n ref=\"gv-tabs\"\n modelValue={inputValue.value}\n onUpdate:modelValue={(v: string) => (inputValue.value = v)}\n default-value={props.defaultValue}\n tabPosition={props.tabPosition}\n type={props.type}\n closable={props.closable}\n onTabClick={handleTabClick}\n class={prefixCls}>\n {createTabPane()}\n </ElTabs>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tabs';\n .#{$prefixCls} {\n :deep(.el-tabs__header) {\n &.is-top {\n margin: 0 0 6px;\n }\n\n .el-tabs__nav {\n .el-tabs__active-bar {\n background-color: var(--primaryColor, $primaryColor);\n }\n\n .el-tabs__item {\n //font-size: $appTextSize;\n\n &:hover {\n color: var(--primaryColor, $primaryColor);\n }\n\n &.is-active {\n color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTabs from './src/GvTabs.vue';\n\nconst GvTabsPlugin = {\n install(app: App): void {\n app.component(GvTabs.name ?? 'GvTabs', GvTabs);\n },\n};\nexport default GvTabsPlugin;\n\nexport { GvTabs };\n","import type { App } from 'vue';\nimport GvTag from './src/GvTag.vue';\n\nconst GvTagPlugin = {\n install(app: App): void {\n app.component(GvTag.name ?? 'GvTag', GvTag);\n },\n};\nexport default GvTagPlugin;\n\nexport { GvTag };\n","<!--\n * @title: navigation tags view\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-20 10:57:41\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 18:00:46\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { usePermsStore } from '@/store/modules/perms';\n import { useTagsViewStore } from '@/store/modules/tagsView';\n import { useBridgeI18n } from '@@/bridge';\n import { joinIcon, pathResolve } from '@@/utils';\n import { useEventListener } from '@vueuse/core';\n import { ElTabPane, ElTabs } from 'element-plus';\n import { cloneDeep } from 'lodash-es';\n import { computed, defineComponent, nextTick, onMounted, reactive, ref, unref, watch } from 'vue';\n import { useRouter, type RouteLocationNormalizedLoaded } from 'vue-router';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tags-view');\n export default defineComponent({\n name: 'GvTagsView',\n setup() {\n const visible = ref(false);\n const position = reactive({ x: 0, y: 0 });\n const currentKey = ref('');\n\n const { currentRoute, push, replace } = useRouter();\n const activeKey = ref<string>(unref(currentRoute).path || '/dashboard');\n const { t } = useBridgeI18n();\n const tagsViewStore = useTagsViewStore();\n const permsStore = usePermsStore();\n\n const visitedViews = computed(() => tagsViewStore.visitedViews);\n const mainAppRoutes = computed(() => permsStore.mainAppRoutes);\n\n const isRedirect = (path: string) => path.startsWith('/redirect');\n const isActive = (route) => route.path === unref(currentRoute).path;\n const isAffix = (tag) => tag.meta && tag.meta.affix;\n\n /**\n * @todo: filter affix nav menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 11:39:08\n * @param {*} mainAppRoutes\n * @param {*} basePath\n */\n const filterAffixNavMenus = (navMenus, basePath = '/'): RouteLocationNormalizedLoaded[] => {\n const affixTags: RouteLocationNormalizedLoaded[] = [];\n // console.log('navMenus:', navMenus.value);\n navMenus.value.forEach((route) => {\n if (route.meta && route.meta.affix === true) {\n const tagPath = pathResolve(basePath, route.path);\n affixTags.push({\n fullPath: tagPath,\n path: tagPath,\n name: route.name,\n meta: route.meta,\n matched: [],\n params: {},\n query: {},\n hash: '',\n redirectedFrom: undefined,\n });\n }\n });\n return affixTags;\n };\n /**\n * @todo: add affix tags\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 11:45:26\n */\n const addAffixTags = () => {\n const affixTags = filterAffixNavMenus(mainAppRoutes);\n\n for (const tagView of affixTags) if (tagView.name) tagsViewStore.addVisitedView(tagView);\n };\n /**\n * @todo: create tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:36:56\n */\n const createTabPanel = () =>\n visitedViews.value.map((v) => {\n const icons = joinIcon(v.meta?.picon);\n const closable = visitedViews.value.length > 1;\n const title = t(v.meta?.title ?? 'no-name');\n return (\n <ElTabPane\n key={String(v.path)}\n name={String(v.path)}\n label={title}\n closable={closable}>\n {{\n label: () => (\n <span class=\"tab-label\">\n {icons && <i class={icons}></i>}\n {title}\n </span>\n ),\n }}\n </ElTabPane>\n );\n });\n\n /**\n * @todo: show right context menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 17:22:53\n * @param {*} key\n */\n const showContextMenu = (key: string) => {\n currentKey.value = key;\n visible.value = true;\n };\n /**\n * @todo: close right context menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:31:06\n */\n const closeContextMenu = () => {\n visible.value = false;\n };\n /**\n * @todo: jump to link route\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-21 11:25:08\n * @param {*} routePath\n */\n const toLink = (routePath: string) => {\n const targetView = visitedViews.value.find((v) => v.path === routePath);\n activeKey.value = routePath || '/dashboard';\n\n if (targetView)\n // 使用完整的 route 对象跳转,保留 query 参数\n push({\n path: targetView.path,\n query: targetView.query || {},\n });\n else push({ path: routePath, query: {} });\n };\n /**\n * @todo: jump to last tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:31:01\n * @param {*} visitedView\n * @param {*} currentView\n */\n const toLastView = (visitedView: RouteLocationNormalizedLoaded[], currentView: RouteLocationNormalizedLoaded) => {\n const latestView = visitedView.slice(-1)[0];\n if (visitedView) {\n activeKey.value = latestView.path;\n push(latestView.path);\n } else if (currentView.name === 'Dashboard') replace({ path: '/redirect' + currentView.path });\n else push('/');\n };\n /**\n * @todo: add menu tab\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-21 10:27:35\n */\n const addNavMenu = () => {\n const name = currentRoute.value.name;\n if (name) tagsViewStore.addTagView(currentRoute.value);\n };\n\n const moveToCurrentTag = (view: RouteLocationNormalizedLoaded) => {\n // toLink(view.path);\n };\n\n /**\n * @todo: click tab event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 12:08:48\n * @param {*} tab\n */\n const clickTab = (tab) => {\n toLink(tab.props.name);\n };\n /**\n * @todo: close current tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:56:44\n * @param {*} targetKey\n */\n const closeCurrentTag = async (targetKey) => {\n const view = visitedViews.value.filter((view) => view.path === targetKey);\n if (isAffix(view[0])) return;\n\n await tagsViewStore.delTagView({ view: view[0] });\n\n // 清除缓存的search条件\n // currentRoute.value.meta.search = {};\n // 判断是否是当前标签页关闭\n if (isActive(view[0])) toLastView(visitedViews.value, view[0]);\n };\n /**\n * @todo: refresh selected tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:40:45\n */\n const refreshSelectedTag = async () => {\n tagsViewStore.delCachedView(unref(currentRoute));\n const { path, query } = unref(currentRoute);\n await nextTick();\n replace({\n path: '/redirect' + path,\n query: query,\n });\n };\n const findCurTagIndex = () => visitedViews.value.findIndex((x) => x.path === currentKey.value);\n /**\n * @todo: close right/left tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:42:33\n * @param {*} direction\n */\n const closeTagsOrientation = (direction) => {\n const index = findCurTagIndex();\n if (index === -1) return;\n let isClosed = false;\n const vV = cloneDeep(visitedViews.value);\n vV.map(({ path }, i) => {\n if (direction === 'right' && i > index) {\n if (path === unref(activeKey)) isClosed = true;\n closeCurrentTag(path);\n } else if (direction === 'left' && i < index) {\n if (path === unref(activeKey)) isClosed = true;\n closeCurrentTag(path);\n }\n });\n // 跳转至当前页\n if (isClosed) toLink(unref(currentKey));\n };\n /**\n * @todo: close other tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 11:04:12\n */\n const closeOthersTags = () => {\n const index = findCurTagIndex();\n if (index === -1) return;\n push(currentKey.value);\n\n tagsViewStore.delOthersViews(currentRoute.value).then(() => {\n moveToCurrentTag(unref(currentRoute));\n });\n };\n\n watch(\n () => [currentRoute.value.path, currentRoute.value.name],\n ([path, name], [, oldName]) => {\n // if /redirect\n if (isRedirect(path as string)) return;\n // 当前选中tab页\n activeKey.value = (path as string) || '/dashboard';\n // del notify msg\n if (oldName !== name) {\n const alertObj = document.body.querySelector('body>.el-notification');\n if (alertObj) alertObj.remove();\n }\n addNavMenu();\n // moveToCurrentTag(currentRoute.value);\n },\n );\n\n /**\n * @todo: bind right click event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 15:28:28\n */\n const tagsViewEl = ref<HTMLElement | null>(null);\n useEventListener(tagsViewEl, 'contextmenu', (ev: MouseEvent) => {\n ev.preventDefault();\n\n let targetNode: HTMLElement | null = null;\n const el = ev.target as HTMLElement;\n\n if (el.tagName === 'SPAN') targetNode = el.parentElement;\n else targetNode = el;\n\n if (targetNode?.classList.contains('el-tabs__item')) {\n const path = targetNode?.getAttribute('aria-controls')?.replace(/^pane-/, '') || '';\n if (path !== unref(currentRoute).path) toLink(path);\n\n position.x = ev.clientX || ev.pageX;\n position.y = ev.clientY || ev.pageY;\n\n showContextMenu(path);\n }\n });\n /**\n * @todo: close context menu on window click\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:39:46\n */\n useEventListener(window, 'click', () => {\n closeContextMenu();\n });\n\n // mounted hooks\n onMounted(() => {\n addAffixTags();\n addNavMenu();\n });\n return () => (\n <div\n ref={tagsViewEl}\n class={[prefixCls, 'flex w-full relative bg-[#fff] dark:bg-[var(--el-bg-color)']}>\n <ElTabs\n class=\"multi-tab\"\n type=\"card\"\n modelValue={activeKey.value}\n onUpdate:modelValue={(v: string) => (activeKey.value = v)}\n onTabClick={clickTab}\n onTabRemove={closeCurrentTag}>\n {createTabPanel()}\n </ElTabs>\n {visible.value && (\n <ul\n class=\"tagsView-contextmenu\"\n style={{ left: `${position.x + 10}px`, top: `${position.y - 10}px` }}>\n <li onClick={refreshSelectedTag}>{t('tagsView.refresh')}</li>\n {currentKey.value !== '/dashboard' && visitedViews.value.length === 2 && <li onClick={() => closeCurrentTag(currentKey.value)}>{t('tagsView.close')}</li>}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 1 && findCurTagIndex() < visitedViews.value.length - 1 && (\n <li onClick={() => closeTagsOrientation('right')}>{t('tagsView.closeRight')}</li>\n )}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 2 && findCurTagIndex() > 1 && <li onClick={() => closeTagsOrientation('left')}>{t('tagsView.closeLeft')}</li>}\n {currentKey.value === '/dashboard' && visitedViews.value.length > 1 && <li onClick={closeOthersTags}>{t('tagsView.closeOthers')}</li>}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 2 && <li onClick={closeOthersTags}>{t('tagsView.closeOthers')}</li>}\n </ul>\n )}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tags-view';\n\n .#{$prefixCls} {\n user-select: none; // 禁止选中文本\n\n .multi-tab {\n width: 100%;\n position: relative;\n :deep(.el-tabs__header) {\n margin: 0;\n border-bottom-color: $borderColor;\n height: 34px;\n line-height: 34px;\n .el-tabs__nav {\n border-color: $borderColor;\n .el-tabs__item {\n height: 34px; // 38px\n line-height: 34px; // 38px\n padding: 2px 10px 0 10px; // 0 10px\n //font-size: $textSize;\n border-left-color: $borderColor;\n\n &.is-active {\n & > span {\n font-weight: $fontWeight2;\n }\n color: var(--primaryColor, $primaryColor);\n }\n &:focus.is-focus:not(:active) {\n box-shadow: 0 0 1px 1px inset;\n }\n > span {\n font-weight: 500;\n > i {\n padding-right: 5px;\n //font-size: $textSize;\n }\n }\n }\n }\n .is-scrollable {\n .el-tabs__nav-next,\n .el-tabs__nav-prev {\n line-height: 42px;\n }\n\n i {\n font-size: 18px;\n color: rgba(0, 0, 0, 0.95);\n }\n }\n }\n .el-tabs__content {\n display: none !important;\n }\n }\n :deep(.tagsView-contextmenu) {\n position: fixed;\n top: $navHeadHeight;\n left: 300px;\n z-index: 9999;\n min-width: 90px;\n padding: 6px 0;\n list-style: none;\n background-color: #fff;\n border: 1px solid $borderColorSecondary;\n border-radius: $borderRadius;\n box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);\n li {\n line-height: 27px;\n padding: 0 15px;\n //font-size: $appTextSize;\n &:hover,\n &:focus {\n background-color: $backgroundColor;\n color: var(--primaryColorHover, $primaryColorHover);\n cursor: pointer;\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTagsView from './src/GvTagsView.vue';\n// Define the install method on the GvExpandMenu component\nconst GvTagsViewPlugin = {\n install(app: App): void {\n app.component(GvTagsView.name ?? 'GvTagsView', GvTagsView);\n },\n};\nexport default GvTagsViewPlugin;\n\nexport { GvTagsView };\n","<!--\n * @title: theme switcher\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-08-14 10:17:38\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-18 15:04:37\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { ElDropdown, ElDropdownItem, ElDropdownMenu } from 'element-plus';\n import { computed } from 'vue';\n import { propTypes } from '../../utils/gv.propTypes';\n\n defineOptions({\n name: 'GvTheme',\n inheritAttrs: true,\n });\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('theme');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const appStore = useAppStore();\n const themeOptions = computed(() => appStore.getSwitchTheme);\n const currentTheme = computed(() => appStore.getCurrentTheme);\n\n const handleSetTheme = () => {\n //appStore.setTheme(theme);\n };\n</script>\n<template>\n <ElDropdown\n trigger=\"click\"\n :class=\"prefixCls\"\n @command=\"handleSetTheme\">\n <div>\n <GvIcon\n class=\"international-icon\"\n iconName=\"theme\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item of themeOptions\"\n :key=\"item.value\"\n :disabled=\"currentTheme === item.value\"\n :command=\"item.value\">\n {{ item.label }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-theme';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvTheme from './src/GvTheme.vue';\nconst GvThemePlugin = {\n install(app: App): void {\n app.component(GvTheme.name ?? 'GvTheme', GvTheme);\n },\n};\nexport default GvThemePlugin;\n\nexport { GvTheme };\n","/*\r\n * @title: encrypt\r\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\r\n * @Date: 2023-12-16 08:07:24\r\n * @LastEditors: andy.ten@tom.com\r\n * @LastEditTime: 2025-04-07 13:54:00\r\n * @version: 1.0.1\r\n * @copyright: copyright (c) 2025 Andy Xu\r\n * node: you can not copy and/or use and/or modify this program free,\r\n * please reserve the segment above.Please mail me if you have any question.\r\n */\r\n\r\nimport CryptoJS from 'crypto-js';\r\nexport const key = 'abcdefgabcdefg12';\r\nexport const encrypt = (word: any): string => {\r\n const keyStr = CryptoJS.enc.Utf8.parse(key);\r\n let ww;\r\n if (typeof word === 'object') ww = JSON.stringify(word);\r\n else ww = word;\r\n const srcs = CryptoJS.enc.Utf8.parse(ww);\r\n const encrypted = CryptoJS.AES.encrypt(srcs, keyStr, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });\r\n return encrypted.toString();\r\n};\r\nexport const decrypt = (word: string): any => {\r\n const keyStr = CryptoJS.enc.Utf8.parse(key);\r\n const decrypt = CryptoJS.AES.decrypt(word, keyStr, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });\r\n return CryptoJS.enc.Utf8.stringify(decrypt).toString();\r\n};\r\n// Randomly generate a specified number of hexadecimal keys\r\nexport const generateKey = (num: number): string => {\r\n const library = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let key = '';\r\n for (let i = 0; i < num; i++) {\r\n const randomPoz = Math.floor(Math.random() * library.length);\r\n key += library.substring(randomPoz, randomPoz + 1);\r\n }\r\n return key;\r\n};\r\n","/*\n * @title: package lib entry\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2024-11-28 18:18:44\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-12 16:09:34\n * @version: 1.1.2\n * @copyright: copyright (c) 2024 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport type { Pinia } from 'pinia';\nimport { setActivePinia } from 'pinia';\nimport 'uno.css'; // 引入 UnoCSS 样式\nimport type { App } from 'vue';\nimport type { Composer } from 'vue-i18n';\n\nimport { setBridgeContext } from './bridge';\nimport GvBacktopPlugin, { GvBacktop } from './GvBacktop';\nimport GvBadgePlugin, { GvBadge } from './GvBadge';\nimport GvBreadCrumbPlugin, { GvBreadCrumb } from './GvBreadCrumb';\nimport GvButtonPlugin, { GvButton } from './GvButton';\nimport GvCardPlugin, { GvCard } from './GvCard';\nimport GvCascaderPlugin, { GvCascader } from './GvCascader';\nimport GvCheckboxPlugin, { GvCheckbox } from './GvCheckbox';\nimport GvCheckboxButtonPlugin, { GvCheckboxButton } from './GvCheckboxButton';\nimport GvCheckboxGroupPlugin, { GvCheckboxGroup } from './GvCheckboxGroup';\nimport GvColPlugin, { GvCol } from './GvCol';\nimport GvDatePickerPlugin, { GvDatePicker } from './GvDatePicker';\nimport GvDialogPlugin, { GvDialog } from './GvDialog';\nimport GvDividerPlugin, { GvDivider } from './GvDivider';\nimport GvDrawerPlugin, { GvDrawer } from './GvDrawer';\nimport GvExpandMenuPlugin, { GvExpandMenu } from './GvExpandMenu';\nimport GvFormPlugin, { GvForm } from './GvForm';\nimport GvHamburgerPlugin, { GvHamburger } from './GvHamburger';\nimport GvIconPlugin, { GvIcon } from './GvIcon';\nimport GvInputPlugin, { GvInput } from './GvInput';\nimport GvInputNumberPlugin, { GvInputNumber } from './GvInputNumber';\nimport GvLangSelectPlugin, { GvLangSelect } from './GvLangSelect';\nimport GvPopconfirmPlugin, { GvPopconfirm } from './GvPopconfirm';\nimport GvPopoverPlugin, { GvPopover } from './GvPopover';\nimport GvRadioPlugin, { GvRadio } from './GvRadio';\nimport GvRadioButtonPlugin, { GvRadioButton } from './GvRadioButton';\nimport GvRadioGroupPlugin, { GvRadioGroup } from './GvRadioGroup';\nimport GvRowPlugin, { GvRow } from './GvRow';\nimport GvScreenFullPlugin, { GvScreenFull } from './GvScreenFull';\nimport GvSearchBarPlugin, { GvSearchBar } from './GvSearchBar';\nimport GvSelectPlugin, { GvSelect } from './GvSelect';\nimport GvSidebarPlugin, { GvSidebar } from './GvSidebar';\nimport GvSidebarLogoPlugin, { GvSidebarLogo } from './GvSidebarLogo';\nimport GvSwitchPlugin, { GvSwitch } from './GvSwitch';\nimport GvTablePlugin, { GvTable } from './GvTable';\nimport GvTabPanePlugin, { GvTabPane } from './GvTabPane';\nimport GvTabsPlugin, { GvTabs } from './GvTabs';\nimport GvTagPlugin, { GvTag } from './GvTag';\nimport GvTagsViewPlugin, { GvTagsView } from './GvTagsView';\nimport GvThemePlugin, { GvTheme } from './GvTheme';\nimport GvTimePickerPlugin, { GvTimePicker } from './GvTimePicker';\nimport GvTreePlugin, { GvTree } from './GvTree';\nconst components = [\n GvRowPlugin,\n GvColPlugin,\n GvInputPlugin,\n GvButtonPlugin,\n GvPopconfirmPlugin,\n GvIconPlugin,\n GvInputNumberPlugin,\n GvCascaderPlugin,\n GvSwitchPlugin,\n GvRadioButtonPlugin,\n GvCheckboxButtonPlugin,\n GvRadioGroupPlugin,\n GvBadgePlugin,\n GvTabPanePlugin,\n GvTabsPlugin,\n GvDrawerPlugin,\n GvCardPlugin,\n GvTablePlugin,\n GvPopoverPlugin,\n GvRadioPlugin,\n GvSelectPlugin,\n GvTimePickerPlugin,\n GvCheckboxGroupPlugin,\n GvCheckboxPlugin,\n GvTagPlugin,\n GvTreePlugin,\n GvFormPlugin,\n GvLangSelectPlugin,\n GvBacktopPlugin,\n GvBreadCrumbPlugin,\n GvHamburgerPlugin,\n GvScreenFullPlugin,\n GvSearchBarPlugin,\n GvSidebarPlugin,\n GvSidebarLogoPlugin,\n GvThemePlugin,\n GvDialogPlugin,\n GvExpandMenuPlugin,\n GvTagsViewPlugin,\n GvDividerPlugin,\n GvDatePickerPlugin,\n];\n\nexport type GuavaUIOptions = {\n store: Pinia;\n i18n: Composer;\n};\n\nexport const install = (app: App, options: GuavaUIOptions) => {\n if ((install as any).INSTALLED) return;\n (install as any).INSTALLED = true;\n\n setActivePinia(options.store);\n setBridgeContext(options);\n\n components.forEach((c) => c.install(app));\n};\n\nconst GuavaUI = { install };\n\n// 🔹 按需导出组件\nexport {\n GvBacktop,\n GvBadge,\n GvBreadCrumb,\n GvButton,\n GvCard,\n GvCascader,\n GvCheckbox,\n GvCheckboxButton,\n GvCheckboxGroup,\n GvCol,\n GvDatePicker,\n GvDialog,\n GvDivider,\n GvDrawer,\n GvExpandMenu,\n GvForm,\n GvHamburger,\n GvIcon,\n GvInput,\n GvInputNumber,\n GvLangSelect,\n GvPopconfirm,\n GvPopover,\n GvRadio,\n GvRadioButton,\n GvRadioGroup,\n GvRow,\n GvScreenFull,\n GvSearchBar,\n GvSelect,\n GvSidebar,\n GvSidebarLogo,\n GvSwitch,\n GvTable,\n GvTabPane,\n GvTabs,\n GvTag,\n GvTagsView,\n GvTheme,\n GvTimePicker,\n GvTree,\n};\n\n// 🔹 hooks / utils\nexport { crud } from '@@/utils/gv.crud';\n// export * from './hooks/web/useNotify';\nexport * from './hooks/web/usePinyin';\nexport * from './hooks/web/useStorage';\nexport * from './utils/gv.notify';\nexport * from './utils/gv.propTypes';\nexport * from './utils/gv.secret';\nexport * from './utils/gv.tree';\nexport * from './utils/index';\n\n// 🔹 默认导出统一安装对象\nexport { GuavaUI };\n"],"names":["globalBridgeKey","getBridge","g","setBridgeContext","ctx","useBridgeI18n","i18n","getPrefixCls","variables","useStyle","prefixCls","_createBlock","_unref","ElBacktop","GvBacktopPlugin","app","GvBacktop","_sfc_main$F","name","props","vref","type","String","default","value","Number","max","isDot","Boolean","hidden","showZero","color","setup","slots","_createVNode","ElBadge","_export_sfc","sfc","GvBadgePlugin","_a","GvBadge","toString","is","val","isExternal","path","isString","isArray","isError","isObject","isDate","isNumber","isBoolean","isFunction","isElement","isMap","isImgPath","isDark","isNull","isEmpty","isEqual","a","b","i","keysA","keysB","key","isUrl","e","setHtmlAttrByLang","locale","sleep","timeLen","__async","resolve","toHump","all","letter","toLine","setDomCssProp","prop","dom","getDomCssProp","joinIcon","icon","joinIcons","hasClass","ele","cls","addClass","removeClass","reg","hasScrollbar","tag","dateFormatConfig","debounce","func","wait","immediate","timeout","arg","context","timestamp","result","later","last","args","callNow","getFormModel","fmNode","rawFmChildren","fmChildList","model","element","_b","fmNode2","_c","getVNodeText","vnode","item","getVNodeName","removeAmountFormat","zeroFormat","numberFormat","pattern","oldVal","_nfPattern","strAry","p1","len","p2","ret","ch","p3","len2","amountFormat","decimal","v","decimalPattern","setQuickKeys","ev","btnHtml","inputHtml","messageConfirmHtml","bodyDialogHtml","dialogArr","buttonHtml","buttonDHtml","pathResolve","parentPath","childPath","preNameSpace","attrs","useAttrs","__props","isLocal","computed","iconType","iconName","svgClass","styleExternalIcon","iconComponent","compName","Icons","_openBlock","_createElementBlock","_mergeProps","_createElementVNode","_hoisted_1","ElIcon","_resolveDynamicComponent","_hoisted_2","GvIconPlugin","GvIcon","DEFAULT_CONFIG","getConfig","config","listToTree","list","conf","nodeMap","id","children","pid","node","parent","treeToList","tree","findNode","findNodeAll","findPath","visitedSet","findPathAll","filter","listFilter","__spreadValues","forEach","treeMapEach","data","conversion","haveChildren","conversionData","__spreadProps","treeMap","treeData","opt","eachTree","treeDatas","callBack","parentNode","newNode","filterBreadcrumb","routes","res","route","meta","_isSlot","s","Object","prototype","call","_isVNode","appStore","useAppStore","permStore","usePermsStore","showBreadcrumbIcon","getShowBreadcrumbIcon","currentRoute","useRouter","t","levelList","ref","menuRouters","routers","getRouters","getBreadcrumb","currentPath","matched","slice","unref","renderBreadcrumb","map","disabled","redirect","ElBreadcrumbItem","title","watch","startsWith","_slot","ElBreadcrumb","TransitionGroup","GvBreadCrumbPlugin","GvBreadCrumb","emits","emit","instance","getCurrentInstance","handleConfirm","event","ElPopconfirm","reference","GvInputPlugin","GvPopconfirm","getValueType","useStorage","valueType","excludes","keys","defaultExcludes","excludesArr","notificationTime","notificationTimeError","messageTime","messageTimeError","alert","msg","alertObj","getStorage","lang","promptMsg","duration","m","ElNotification","confirm","msgs","showCancelButton","hint","ok","cancel","reject","ElMessageBox","message","tableedit","ElMessage","visible","text","otext","size","undefined","link","loading","refForm","required","nativeType","bizType","perms","cb","Function","useRoute","globalSize","useGlobalConfig","buttonSize","buttonConfirm","loadings","locked","isShow","isIf","getSlots","invokeClick","raw","onClick","handlers","Array","length","handler","withLoading","task","setIconStyle","replace","checkPerms","pm","slot","split","x","indexOf","arr","handleClick","exposed","resetFields","rootForm","originFormList","formList","index","filtercode","showLabel","dateType","field","rootEl","el","dateRangeSingles","querySelectorAll","startInput","querySelector","endInput","searchBtn","click","classz","renderBtn","display","ElButton","GvButtonPlugin","GvButton","_props","getCardHeader","header","ElCard","GvCardPlugin","GvCard","options","placeholder","clearable","showAllLevels","separator","trigger","filterable","multiple","lazy","lazyLoad","sOps","inputValue","cascaderSize","sPlaceHolder","getDisabled","newVal","handleChange","handleBlur","handleFilterMethod","query","labels","pathLabels","join","spell","pathNodes","some","ElCascader","$event","expandTrigger","GvCascaderPlugin","GvCascader","indeterminate","label","border","checkboxValue","checkboxSize","handleUpdate","ElCheckbox","GvCheckboxPlugin","GvCheckbox","inheritAttrs","checkboxButtonSize","ElCheckboxButton","GvCheckboxButtonPlugin","GvCheckboxButton","min","checkboxGroupSize","ElCheckboxGroup","GvCheckboxGroupPlugin","GvCheckboxGroup","_sfc_main$v","span","offset","xs","sm","md","lg","xl","ElCol","GvColPlugin","GvCol","toMidnight","date","d","daysAgo","days","midnight","monthBegin","quarterBegin","month","yearBegin","now","dateShortcuts","dateShortcutsEn","dateTimeShortcuts","dateTimeShortcutsEn","dateRangeShortcuts","start","end","dateRangeShortcutsEn","modelValue","Date","format","valueFormat","defaultTime","rangeSeparator","startPlaceholder","endPlaceholder","disabledDateFunc","disabledDate","editable","unlink","showWeekNumber","useI18n","datePickerSize","resolvedInputId","getShortcuts","getPickerOptions","pickerOptions","includes","getTime","handleInput","vm","handleFocus","handlePick","maxDate","minDate","ElDatePicker","shortcuts","onCalendarChange","onBlur","onFocus","onChange","GvDatePickerPlugin","GvDatePicker","boundElements","initDrag","collapseMenu","dragDom","dialogHeaderEl","getStyle","attr","disX","disY","dragDomWidth","dragDomHeight","screenWidth","screenHeight","minDragDomLeft","menuWidth","maxDragDomLeft","minDragDomTop","maxDragDomTop","styL","styT","onMouseMove","left","top","onMouseUp","hasFooter","width","height","nest","appendToBody","fullscreen","maxHeight","closeOnClickModal","closeOnPressEscape","dialogClass","buttonQuick","collapseMenus","myDialogClass","dialogVisible","maskVisible","dialogMaxHeight","sAppendToBody","modalAppendToBody","sNest","modalMask","newValue","then","handleVisible","handleOpen","handleOpened","nextTick","handleClose","handleClosed","handleCancel","renderFooterBtn","footer","propsData","getFooter","setMask","mask","getMaxHeight","parseFloat","document","documentElement","clientHeight","pEl","closest","onBeforeUnmount","window","removeEventListener","onMounted","addEventListener","ElDialog","GvDialogPlugin","GvDialog","position","direction","target","clickDivider","preventDefault","stopPropagation","ElDivider","GvDividerPlugin","GvDivider","paddingHeight","drawerVisible","drawerMaxHeight","show","buttonIcon","sPaddingHeight","drawerPaddingHeight","handleResize","evt","returnIcon","ElDrawer","overflow","GvDrawerPlugin","GvDrawer","newPropTypes","createTypes","propTypes","toValidableType","usePinyin","withTone","pinyin","pinYin","__emit","menuList","menuPath","fMenusList","generateRouter","serverRoutes","basePath","prefixTitle","prefixCode","router","i18ntitle","code","tempRoutes","handleCloseDrawer","handleSelect","handleSearch","starClickHandle","star","menuItem","ElAutocomplete","Search","_withCtx","_hoisted_3","_toDisplayString","_hoisted_4","ElTabs","_Fragment","_renderList","ElTabPane","_hoisted_5","sub","_hoisted_6","StarFilled","Star","_hoisted_7","_component_router_link","_hoisted_8","sideWidth","expandHandle","_normalizeClass","_normalizeStyle","GvMenuList","GvExpandMenuPlugin","GvExpandMenu","prefixIcon","suffixIcon","maxlength","readonly","columnProp","rows","autosize","showWordLimit","inputSize","sPlaceholder","renderPrefixIcon","renderSuffixIcon","select","handleClear","handleKeyDown","ElInput","number","prefix","suffix","GvInput","step","stepStrictly","precision","currentValue","oldValue","ElInputNumber","GvInputNumberPlugin","GvInputNumber","dicType","dicRemote","clear","isreload","editRow","collapseTags","userStore","useUserStore","useNotify","dicIcon","remote","loadingText","externalValue","inputShowLabel","inputFilterable","selectValue","originOptions","className","dicSrc","toLowerCase","valueCache","Map","selectSize","isEmptyLabel","getDictItemLabel","l1","l2","formatOptionLabel","findLabelInOptions","opts","find","c","getOptionValue","row","cached","get","obj","set","getSelectCode","o","trim","getSelectLabel","isEmptySelectValue","every","syncEmptyToParent","elSelectModel","mergeOptionsWithSelected","_opts","merged","append","sv","pushDefaultOption","op","push","getSelectOptions","src","xx","arr2","dictCache","dict","getDictDivision","cache","addDictCache","getDict","RegExp","test","filterMethod","initialRemoteLoaded","pendingRemoteQuery","pendingRemotePromise","remoteRequestSeq","filterOriginOptions","remoteDictSearch","requestSeq","sDicType","substring","datas","ops","JSON","parse","console","log","remoteMethod","q","filtered","ensureDefaultOption","existed","resolveDisplayLabel","localOpts","applySelectValue","resolved","showLbl","deep","handleVisibleChange","renderSelectOption","ElOption","renderTableOption","columnTexts","multiColumn","v1","mm","m2","m4","vv1","mmm","mm2","mm4","labelArr","opArr","ElSelect","GvSelectPlugin","GvSelect","columnKey","require","switchType","newStatus","ElSwitch","GvSwitchPlugin","GvSwitch","isRange","disabledHours","disabledMinutes","disabledSeconds","timepickerSize","mergedDisabledHours","mergedDisabledMinutes","mergedDisabledSeconds","ElTimePicker","GvTimePickerPlugin","GvTimePicker","infoMsg","info","calLength","sum","vcity","checkDecimal","decimalLen","checkProvince","card","province","verifyBirthday","year","day","birthday","now_year","time","checkBirthday","re_fifteen","arr_data","re_eighteen","changeFivteenToEighteen","arrInt","arrCh","cardTemp","checkParity","valnum","htValidate","rule","callback","language","divider","isDivider","labelWidth","formStyle","scroller","expose","searchFieldsCollapsed","provide","formRefs","formElRef","setFormRef","rootNodeStyle","rules","isEditContainer","sMaxHeight","isScrollbar","isAnchor","isDialog","colSpanNums","formType","styles","formSize","labelPosition","searchDivider","searchColClassMap","slotProps","expand","showDefaultRow","searchFormRows","classMap","visibleIndex","getLanguage","setDividerShow","getEditBar","editbar","ElRow","getDivider","dividerRender","dividerTitle","getDictItems","dictCacheTmp","dictTmp","getItemRules","_item","validateKey","maxLen","validator","gvValidate","excluded","getDicRadioValue","fieldVal","setDicRadioValue","handleDateRange2Focus","$el","handleDateRange2Blur","handleDateRange2Change","endTime","startTime","datePicker","dateArr","handleSwitchDictChange","error","handleRadioDictChange","handleRadioToggle","renderFormItem","_index","_slot3","colspan","createRow","blur","focus","change","render","renders","isHidden","searchColClass","cType","validateRule","sDateType","dateFormat","ph","startPh","endPh","cols","colSpanXs","colSpanSm","colSpanMd","colSpanLg","colSpanXl","week","datetime","editables","isTableDic","sLabel","searchFormLabel","switchDefaultVal","ElFormItem","_createTextVNode","ElTooltip","padding","margin","clip","whiteSpace","ElRadioGroup","_slot2","ElRadio","onMousedown","ElRadioButton","vv","toolText","_resolveComponent","getItems","sRootEl","tabPane","offsetTop","classList","contains","clearFormValidate","clearValidate","setFormStyle","formStyle1","lastIndexOf","parseInt","clientWidth","init","formModel","formRule","originItem","difference","diff","fieldObj","oldObj","fieldObjKeys","key2","nextProps","prevProps","firstSlot","stringify","dialogBody","dialogBody2","Transition","_withDirectives","ElForm","flexWrap","flex","minWidth","_vShow","GvFormPlugin","GvForm","collapse","loadDict","loadDictDivision","toggleCollapse","collapsed","currentDict","currentReloadDict","currentDictDivision","Fold","Expand","GvHamburgerPlugin","GvHamburger","localeStore","useLocaleStore","langMap","currentLang","handleSetLang","switchLocale","useLocale","ElDropdown","ElDropdownMenu","ElDropdownItem","_component_GvIcon","GvLangSelectPlugin","GvLangSelect","placement","tablePopover","columnType","popClass","handleUpdateVisible","handleShow","handleHide","handlePopoverWrapper","getReferenceSlot","ElPopover","GvPopoverPlugin","GvPopover","radioValue","radioSize","GvRadioPlugin","GvRadio","GvRadioButtonPlugin","GvRadioButton","radioGroupSize","GvRadioGroupPlugin","GvRadioGroup","_sfc_main$c","gutter","GvRowPlugin","GvRow","toggle","isFullscreen","useFullscreen","toggleFullscreen","GvScreenFullPlugin","GvScreenFull","inject","formNode","fieldList","fields","expandFields","shrinkFields","createSearchBar","searchBar","defaultSlot","searchBtnFlag","fieldList2","parentElement","style","expandText","shrinkText","shrink","GvSearchBarPlugin","GvSearchBar","hasOneShowingChild","onlyOneChild","showingChildren","useRenderMenuTitle","renderMenuTitle","useRenderMenuItem","menuMode","renderMenuItem","oneShowingChild","fullPath","noShowingChildren","alwaysShow","ElMenuItem","ElSubMenu","menuSelect","layout","getLayout","getCollapseMenus","leftMenuUniqueOpened","getLeftMenuUniqueOpened","activeMenu","open","renderMenu","ElMenu","renderMenuWrap","ElScrollbar","GvSidebarPlugin","GvSidebar","_imports_0","GvSidebarLogoPlugin","GvSidebarLogo","createTableBar","tableBar","defaultSlots","firstChild","closable","effect","round","tagSize","ElTag","treeProps","nodeKey","load","showCheckbox","draggable","allowDrop","defaultExpandedKeys","defaultCheckedKeys","iconClass","defaultExpandAll","expandOnClickNode","checkOnClickNode","filterNodeMethod","renderContent","treeRef","getCheckedKeys","leafOnly","getTreeNodeData","store","childNodes","root","handleNodeClick","treeNode","handleNodeExpand","handleNodeCollapse","handleCheck","checkedInfo","handleCheckChange","checked","childChecked","handleLazyLoad","handleNodeDrop","draggingNode","dropNode","dropType","ElTree","GvTreePlugin","GvTree","appendPageInfo","pi","pageInfo","currentpagenum","recordsperpage","countrows","totalpage","combined","tabNode","filterConditions","co","sOp","coo","ds","condition","searchCombined","action","upper","sType","saveCombined","fetchData","fetch","submit","hasMsg","fetchTable","checkForms","fmNodes","save","check","fmInnerNode","conditions","update","search","searchInputNode","tableEl","tableHeader","tableFixedHeader","columns","h","columnsFixed","lenFixed","searchNoFm","toNewPageSearch","trans","insertResult","searchData","updateResult","rownums","currentRow","removeResult","getDictDisplayLabel","dictObj","_f","_e","_d","_i","_h","_g","_k","_j","resetEditValue","crud","rowData","fieldValue","items","itemChild","codes","htTableValidate","tableHeadFilterPopoverPopperStyle","maxWidth","refTable","tableHead","tableData","pageSize","rowClassName","rowStyle","spanMethod","cellStyle","tableType","tableSort","tableKit","tableFetch","multi","isShowPage","total","tableInit","beforeImport","tableFilter","tableCb","expandRowKeys","limitHeight","tableAction","tableActionIcon","setStorage","sTableAction","sTableActionIcon","sTableConfirm","detailPlacement","sTableType","originTableHead","tableHeads","sHeight","sMaxWidth","isEditTable","sPageSize","resultData","recordsList","records","pageSizes","filterHeads","popoverVisible","exportBtnDisabled","exportBtnLoading","importBtnLoading","tableSortMode","exportDialogShow","importDialogShow","sTableBar","gTableBar","tableSearchShow","sTableSort","sTableKit","showPopoverDetail","pageLayout","actionWidth","transHash","headColumn","headColumnInit","columnSumsDecimal","isIndeterminate","columnTreeList","columnCheckedKeys","columnTreeRef","TABLE_FIELD_STORAGE_KEY","loginAccount","getTableFieldStore","getTableFieldsFromStorage","setTableFieldsToStorage","lsTableHeads","debounceSearch","tableRefs","tableRef","tableSize","getPageInfo","current","pages","setTableRef","closeAllPopover","property","next","ensurePopoverKey","propKey","wrapPopoverFilterBody","body","getScrollLeft","startLoading","stopLoading","transRecords","loadAction","splice","handleImport","handleExport","getImportBtn","import","buttonName","getExportBtn","export","runPageSearch","fC","fetchFn","handleSizeChange","handleCurrentChange","handleTableSearchInput","handleTableSearch","fh","strFh","y","getTableSearch","handlePopoverShow","popOvers","tableBodyWidth","bodyWrapper","scrollLeft","handlePopoverHide","handleTableRefresh","inputSearch","getTableBar","btns","exportSlots","importSlots","getSortModel","isVisible","marginRight","columnFilterHandler","propField","Element","popoverHtml","checkList","dateHtmlArr","filterValue","from","HTMLElement","textContent","original","assign","getAttribute","add","tableFixHeader","fixColumns","fixLen","columnFilterHandlerReset","remove","filterKey","prevHeadfilter","fromEntries","entries","primaryBtn","setAttribute","getColWidth","edit","label2","sWidth","columnFormatter","_row","_column","cellValue","handleColumnFilter","popoverHtmlList","pop","removeAttribute","handleDictCheckAll","handleDictCheck","curCheck","allCheck","checkFlag","renderHeadFilter","_slot4","_slot5","_slot6","fc","dictXZQH","ret2","_slot7","_slot8","_slot9","handlePopoverSlotClick","cellCheck","rowIndex","isRequire","validateLen","GvTableValidate","isLength","validate","handleEnterKeyDown","cellEnter","scope","srcElement","$index","renderRowEdit","sProp","cellBlur","cellChange","showLabelProp","sVal","sShowLabel","cArr","vArr","columnVref","currentVal","dtArr","dt","_columnProp","renderColumnItem","tableFixed","fixed","align","formatter","hasHidden","selectable","columnFilter","multiLabel","heads","reserveSelection","sHidden","Math","random","sFixed","sortable","multiLabels","hType","hSLabel","hSProp","hKey","hSFixed","hReserveSelection","hSortable","hSWidth","ElTableColumn","checkEditRow","tableH","rowsH","rowH","columnsH","j","inputH","handleDetailPopoverShow","catch","renderAction","content","confirmArr","iconArr","sContent","confirms","detail","actionType","lock","onConfirm","onAfter-enter","getTableColumn","tableColumns","thd","lsTableHeadsArr","startIndex","ff","f","rownumWidth","actionHead","actionColumn","columnVNode","createChangedColumns","checkedKeys","column","setStoreLocal","orderedProps","headMap","orderedHeads","restHeads","reorderTableHeadsByTree","treeList","dataOrder","dataIdx","col","applyColumnTreeOrder","reorderedHeads","allowColumnTreeDrop","_draggingNode","_dropNode","handleColumnNodeDrop","handleColumnCheckChange","_childChecked","hColumns","getKitBar","ElButtonGroup","Refresh","Operation","sortMethod","_0","order","fieldName","sortingType","sumData","sort","row1","row2","isNaN","localeCompare","oi","rowDblClick","tagName","cell","onRowDblclick","tr","tds","firstBtn","btnArr","btn","prevVal","typeArr","doLayout","n","tableBodyWrapper","_slot0","GvTableBar","ElTable","_resolveDirective","ElPagination","GvTablePlugin","GvTable","autoHeight","proxy","GvTabsPlugin","GvTabPane","tabPosition","defaultValue","tabMaxHeight","tabHeight","isTabPaneVnode","componentName","flattenVnodes","vnodes","Fragment","getPaneContent","getTabPanes","slotVnodes","paneProps","handleTabClick","tabVm","tabName","createTabPane","pane","dialogContainer","GvTabs","GvTagPlugin","GvTag","reactive","currentKey","activeKey","tagsViewStore","useTagsViewStore","permsStore","visitedViews","mainAppRoutes","isRedirect","isActive","isAffix","affix","filterAffixNavMenus","navMenus","affixTags","tagPath","params","hash","redirectedFrom","addAffixTags","tagView","addVisitedView","createTabPanel","icons","picon","showContextMenu","closeContextMenu","toLink","routePath","targetView","toLastView","visitedView","currentView","latestView","addNavMenu","addTagView","moveToCurrentTag","view","clickTab","tab","closeCurrentTag","targetKey","delTagView","refreshSelectedTag","delCachedView","findCurTagIndex","findIndex","closeTagsOrientation","isClosed","cloneDeep","closeOthersTags","delOthersViews","oldName","tagsViewEl","useEventListener","targetNode","clientX","pageX","clientY","pageY","GvTagsViewPlugin","GvTagsView","themeOptions","currentTheme","handleSetTheme","GvThemePlugin","GvTheme","encrypt","word","keyStr","CryptoJS","ww","srcs","decrypt","generateKey","num","library","randomPoz","components","GvPopconfirmPlugin","GvTabPanePlugin","install","setActivePinia","GuavaUI","exports","_sfc_main$G","_sfc_main$h","_sfc_main$8"],"mappings":"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"}