guava-ui 0.2.9 → 0.3.1

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 { Pinia } from 'pinia';\nimport type { Composer } from 'vue-i18n';\nimport type { Router } from 'vue-router';\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 23:30:13\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 // exposed model\n if (fmNode.model) return fmNode.model;\n // get model from children\n else {\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/**\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-06-15 16:23:18\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 iconName={meta.icon}></GvIcon> {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 .iconfont {\n padding-right: 5px;\n font-size: 14px;\n }\n .el-icon {\n padding-right: 5px;\n font-size: 20px;\n }\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-13 08:30:50\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-13 08:30:44\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, watch } from 'vue';\n\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\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 isShow: propTypes.bool.def(false),\n });\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu');\n\n const { t } = useBridgeI18n();\n const appStore = useAppStore();\n\n const drawerVisible = ref(appStore.getExpandMenuVisible || props.isShow);\n if (props.isShow) appStore.setExpandMenuVisible(true);\n watch(\n () => appStore.getExpandMenuVisible,\n (val) => {\n drawerVisible.value = val;\n },\n );\n watch(drawerVisible, (val) => {\n if (appStore.getExpandMenuVisible !== val) appStore.setExpandMenuVisible(val);\n });\n\n const sideWidth = computed(() => (props.collapse ? '54px' : '200px'));\n const expandHandle = () => {\n drawerVisible.value = !drawerVisible.value;\n };\n\n const cleanupDrawerOverlay = () => {\n document.body.classList.remove('el-popup-parent--hidden');\n document.body.style.removeProperty('overflow');\n document.body.style.removeProperty('padding-right');\n };\n</script>\n<template>\n <div :class=\"prefixCls\">\n <div\n class=\"expand-menu-title\"\n :class=\"{ selected: drawerVisible ? 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 ref=\"expandMenuRef\"\n v-model=\"drawerVisible\"\n :style=\"{ left: sideWidth, paddingLeft: sideWidth }\"\n class=\"sidebar-expand-drawer\"\n :with-header=\"false\"\n :append-to-body=\"true\"\n destroy-on-close\n direction=\"ltr\"\n resizable\n :modal-class=\"!collapse ? 'sidebar-expand-menu-collapse' : 'sidebar-expand-menu-unCollapse'\"\n size=\"650\"\n @closed=\"cleanupDrawerOverlay\">\n <GvMenuList @close=\"drawerVisible = 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-15 17:16:16\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\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 if (event.target instanceof HTMLInputElement) {\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\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-16 17:40:34\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-16 17:50:57\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: 字典表单项值是否为空\n */\n const isEmptyDicModelValue = (val: unknown): boolean => {\n if (val == null || val === '') return true;\n if (Array.isArray(val)) return val.length === 0;\n if (typeof val === 'object') {\n const o = val as Record<string, unknown>;\n const code = o.value ?? o.c;\n if (code != null && code !== '') return false;\n const label = o.label ?? o.v;\n return label == null || label === '';\n }\n return false;\n };\n\n /** init 内部同步 formList 时,避免 formList watch 重入触发 init */\n const isInternalFormSync = ref(false);\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 modelValue={model.value[field]}\n onUpdate:modelValue={(val) => {\n model.value[field] = val;\n }}\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 if (isInternalFormSync.value) return;\n isInternalFormSync.value = true;\n try {\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 const modelVal = model.value[item.field];\n if (modelVal !== undefined && modelVal !== item.value) v = modelVal;\n else if (originItem && (item.value !== originItem.value || item.showLabel !== originItem.showLabel)) v = item.value;\n else v = modelVal === undefined ? item.value : modelVal;\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 if (item.type === 'dic' && isEmptyDicModelValue(v) && item.showLabel) item.showLabel = item.multiple ? [] : '';\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 } finally {\n isInternalFormSync.value = false;\n }\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 if (isInternalFormSync.value) return;\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: 34px;\n margin-bottom: 14px;\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: 0px;\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-13 09:59:04\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-13 08:24:51\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-06-13 08:30:48\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, nextTick, 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 const needCloseDrawer = appStore.getExpandMenuVisible;\n if (needCloseDrawer) appStore.setExpandMenuVisible(false);\n props.menuSelect?.(index);\n\n const navigate = () => {\n if (isUrl(index)) {\n window.open(index);\n return;\n }\n push(index);\n };\n\n if (needCloseDrawer) nextTick(navigate);\n else navigate();\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-16 11:42:05\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 */\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 = (filter: Recordable<any>, tabNode?: TableInstance | null): Recordable<FilterCondition | PageInfo> => {\n const filterConditions: Recordable<FilterCondition | PageInfo> = {};\n if (!isEmpty(filter))\n Object.keys(filter).forEach((x: string) => {\n let val: string = filter[x] ? filter[x] + '' : '';\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\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-16 15:37:17\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\nconst isRequestCanceled = (error: unknown): boolean => {\n if (!error || typeof error !== 'object') return false;\n const err = error as { code?: string; name?: string; message?: string };\n return err.code === 'ERR_CANCELED' || err.name === 'CanceledError' || err.message === 'canceled';\n};\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 (fetch: AsyncFn, data: any, tabNode?: TableInstance | null) => {\n let result = {};\n\n // console.log(data);\n const filterConditions = combined(data, tabNode);\n // console.log(filterConditions);\n let exposed: any | null = null;\n if (tabNode) {\n const tabInnerNode = tabNode.$;\n exposed = tabInnerNode.exposed as any;\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n }\n if (tabNode && exposed) exposed.startLoading();\n // console.log(filterConditions);\n // console.log(fetch);\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n })\n .catch((error) => {\n if (!isRequestCanceled(error)) {\n message(error, 'error');\n console.log(error);\n }\n });\n\n if (tabNode && exposed) exposed.stopLoading();\n\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\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\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: TableInstance, 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(data, tabNode);\n // console.log(JSON.stringify(filterConditions));\n // update: 保存查询条件、方法至table对象,为分页组件使用 2022-04-18\n\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n\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 })\n .catch((error) => {\n if (!isRequestCanceled(error)) {\n message(error, 'error');\n console.log(error);\n }\n });\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-16 15:24:48\n * @version: 1.1.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 { 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, shallowRef, 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\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', 'row-click'],\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 let closeActiveDetailPopover: (() => void) | null = null;\n\n const syncDetailPopoverWidth = (popperEl?: HTMLElement | null) => {\n const poppers = popperEl ? [popperEl] : Array.from(document.querySelectorAll<HTMLElement>('.el-popover.gv-table-detail-popover'));\n poppers.forEach((el) => {\n const body = el.querySelector<HTMLElement>('.gv-table-detail-popover-body');\n if (body) el.style.width = `${Math.ceil(body.getBoundingClientRect().width)}px`;\n });\n };\n\n /** 操作列详情 Popover:随内部 detail 表格宽度自适应 */\n const getTableDetailPopoverPopperStyle = () => ({\n width: 'auto',\n minWidth: 'auto',\n maxWidth: 'min(90vw, ' + sMaxWidth.value + ')',\n });\n\n const DetailActionPopover = defineComponent({\n name: 'GvTableDetailActionPopover',\n props: {\n title: { type: String, required: true },\n actionFn: { type: Function, required: true },\n row: { type: Object, required: true },\n rowIndex: { type: Number, required: true },\n detailPlacement: { type: String, required: true },\n disabled: { type: Boolean, default: false },\n icon: { type: String, default: '' },\n text: { type: String, required: true },\n size: { type: String, default: undefined },\n perms: { type: String, default: '' },\n },\n setup(props) {\n const visible = ref(false);\n const rendered = shallowRef<VNode | null>(null);\n const loading = ref(false);\n\n const closePopover = () => {\n visible.value = false;\n };\n\n const handleOpen = async (event: Event) => {\n event.stopPropagation();\n if (loading.value || props.disabled) return;\n\n // 已打开时再次点击仅关闭,不重新查询\n if (visible.value) {\n visible.value = false;\n rendered.value = null;\n return;\n }\n\n closeActiveDetailPopover?.();\n loading.value = true;\n rendered.value = null;\n try {\n const render = await props.actionFn(props.row, props.rowIndex);\n if (!render) return;\n rendered.value = typeof render === 'function' ? render() : render;\n await nextTick();\n visible.value = true;\n closeActiveDetailPopover = closePopover;\n } catch {\n rendered.value = null;\n } finally {\n loading.value = false;\n }\n };\n\n watch(visible, (val) => {\n if (!val) {\n rendered.value = null;\n if (closeActiveDetailPopover === closePopover) closeActiveDetailPopover = null;\n }\n });\n\n const renderTrigger = () => (\n <div class=\"gv-table-action-trigger\">\n {props.icon ? (\n <ElTooltip\n content={props.text}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={props.perms}\n text={props.text}\n size={props.size}\n icon={props.icon}\n disabled={props.disabled}\n loading={loading.value}\n onClick={handleOpen}></GvButton>\n </span>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={props.text}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={props.perms}\n text={props.text}\n size={props.size}\n type=\"text\"\n disabled={props.disabled}\n loading={loading.value}\n onClick={handleOpen}>\n {props.text}\n </GvButton>\n </span>\n </ElTooltip>\n )}\n </div>\n );\n\n return () => (\n <ElPopover\n visible={visible.value}\n onUpdate:visible={(val: boolean) => {\n visible.value = val;\n }}\n title={props.title}\n placement={props.detailPlacement as TPopoverPlacement}\n trigger=\"manual\"\n showArrow={true}\n transition=\"el-zoom-in-top\"\n onAfter-enter={() => syncDetailPopoverWidth()}\n popperClass=\"gv-popconfirm gv-table-detail-popover\"\n popperStyle={getTableDetailPopoverPopperStyle()}>\n {{\n reference: renderTrigger,\n default: () => <div class=\"gv-table-detail-popover-body\">{rendered.value}</div>,\n }}\n </ElPopover>\n );\n },\n });\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 // console.log(popoverHtml);\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 message(t('table.columnFilterWarn'));\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 = 140;\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 */\n const columnFormatter = (_row: any, column: any, cellValue: any) => {\n if (cellValue === null || cellValue === undefined) return '';\n if (typeof cellValue === 'object') return cellValue.v ?? '';\n return 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>div>.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 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 /** 表头筛选 Popover:覆盖 EP 默认 150px,按内容自适应宽度 */\n const tableHeadFilterPopoverPopperStyle = {\n width: 'max-content',\n minWidth: '180px',\n maxWidth: 'min(420px, 90vw)',\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 transition=\"el-zoom-in-top\"\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 transition=\"el-zoom-in-top\"\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 /**\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 <DetailActionPopover\n title={x}\n actionFn={action[index]}\n row={scope.row}\n rowIndex={scope.$index}\n detailPlacement={detailPlacement}\n disabled={disabled}\n icon={icon}\n text={x}\n size={tableSize.value}\n perms={item}\n />\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: row click event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-16 11:02:10\n * @param {*} row\n * @param {*} column\n * @param {*} event\n */\n const rowClick = (row: Recordable<any>, column: TableColumnCtx<Recordable<any>> | null, event: MouseEvent) => {\n if (typeof attrs.onRowClick === 'function') emit('row-click', row, column, event);\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 deep: true,\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') {\n headColumnInit.value = getTableColumn();\n if (props.tableData && Object.keys(props.tableData).length > 0) headColumn.value = getTableColumn();\n }\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 if (props.tableType === 'detail')\n nextTick(() => {\n const tableRef = instance?.refs?.[vref] as TableInstance | undefined;\n tableRef?.doLayout?.();\n });\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={props.tableType === 'detail' ? { width: 'max-content', minWidth: '0px', maxWidth: sMaxWidth.value } : { width: '100%', minWidth: '0px', maxWidth: sMaxWidth.value }}>\n <GvTableBar visible={sTableBar.value}>{getTableBar()}</GvTableBar>\n {getKitBar()}\n {getTableSearch()}\n {getSortModel()}\n <div\n class={props.tableType === 'detail' ? 'gv-table__loading-wrap gv-table__loading-wrap--detail' : '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={props.tableType === 'detail' ? 'auto' : 'fixed'}\n style={props.tableType === 'detail' ? 'width: max-content' : '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 onRow-click={rowClick} // 设置行单击事件方法\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 {headColumn.value.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 &--detail {\n width: max-content;\n max-width: 100%;\n }\n }\n .gv-table__sortmode {\n float: right;\n\n & i {\n padding-right: 15px;\n font-size: $tableThFontSize;\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: 36px;\n line-height: 36px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight;\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: 36px;\n line-height: 36px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight !important;\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__body-wrapper) {\n .el-table__body-header {\n .el-table__cell {\n height: 36px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight;\n line-height: 36px;\n\n .cell {\n height: 28px;\n padding-right: 3px;\n line-height: 28px;\n color: $textColor;\n font-weight: 500 !important;\n white-space: nowrap;\n\n .render__header {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n height: 28px;\n line-height: 28px;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: $tableThFontWeight !important;\n &:hover {\n cursor: pointer;\n }\n\n .el-tooltip__trigger {\n font-weight: $tableThFontWeight !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n\n .caret-wrapper {\n flex-shrink: 0;\n float: none;\n height: 28px;\n line-height: 28px;\n margin-left: 4px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\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: 36px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight !important;\n line-height: 36px;\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","_createTextVNode","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","cleanupDrawerOverlay","_normalizeClass","_normalizeStyle","GvMenuList","GvExpandMenuPlugin","GvExpandMenu","prefixIcon","suffixIcon","maxlength","readonly","columnProp","rows","autosize","showWordLimit","inputSize","sPlaceholder","renderPrefixIcon","renderSuffixIcon","HTMLInputElement","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","isEmptyDicModelValue","isInternalFormSync","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","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","modelVal","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","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","needCloseDrawer","getExpandMenuVisible","setExpandMenuVisible","navigate","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","isRequestCanceled","err","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","refTable","tableHead","tableData","maxWidth","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","closeActiveDetailPopover","syncDetailPopoverWidth","popperEl","from","body","Math","ceil","getBoundingClientRect","getTableDetailPopoverPopperStyle","DetailActionPopover","defineComponent","actionFn","rowIndex","rendered","shallowRef","closePopover","renderTrigger","onAfter-enter","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","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","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","isRequire","validateLen","GvTableValidate","isLength","validate","handleEnterKeyDown","cellEnter","scope","srcElement","$index","renderRowEdit","sProp","cellBlur","cellChange","showLabelProp","sVal","sShowLabel","cArr","vArr","columnVref","currentVal","dtArr","dt","_columnProp","tableHeadFilterPopoverPopperStyle","renderColumnItem","tableFixed","fixed","align","formatter","hasHidden","selectable","columnFilter","multiLabel","heads","reserveSelection","sHidden","random","sFixed","sortable","multiLabels","hType","hSLabel","hSProp","hKey","hSFixed","hReserveSelection","hSortable","hSWidth","ElTableColumn","checkEditRow","tableH","rowsH","rowH","columnsH","j","inputH","renderAction","content","confirmArr","iconArr","sContent","confirms","detail","actionType","lock","onConfirm","getTableColumn","tableColumns","thd","lsTableHeadsArr","startIndex","ff","f","rownumWidth","actionHead","actionColumn","columnVNode","createChangedColumns","checkedKeys","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","rowClick","onRowClick","prevVal","typeArr","doLayout","n","tableBodyWrapper","refs","_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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AS,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,CACpB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,aACxBA,EAAO,mCACLA,CACT,EACA,IAAMngB,GAAiB,CACrB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,cACxBA,EAAO,6BACLA,CACT,EACA,SAAWngB,GAAiB,CAC1B,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,mBACxBA,EAAO,qCACLA,CACT,EACA,IAAMngB,GAAiB,CACrB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,mBACxBA,EAAO,uCACLA,CACT,CACF,ECrFMC,GAAajvB,G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"}