guava-ui 0.2.4 → 0.2.6

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-03 13:16:25\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// ------ 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 .ht-container .ht-search__bar>.ht-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-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 .ht-container .ht-form .ht-search__bar>.ht-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 .ht-container .ht-form .ht-search__bar>.ht-button.shrink') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-form .ht-search__bar>.ht-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 .ht-container .ht-drawer__popup .ht-drawer .ht-drawer__footer>.ht-drawer__footer--inner .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-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 .ht-container .ht-table__container .ht-table__bar .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-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 .ht-container .ht-table__container .ht-table__search .ht-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>.ht-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 .ht-container .ht-dialog__popup .ht-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 .ht-container .ht-drawer__popup .ht-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-05-13 15:38:19\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-03 14:19:56\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\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 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 console.log(parent);\n await parent.exposed.resetFields?.();\n const rootForm = parent?.parent;\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 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 loadings.value = true;\n await parent?.vnode.el?.querySelector('.gv-search-bar .el-button--primary')?.click();\n loadings.value = false;\n return;\n } else if (props.bizType === 'import' || props.bizType === 'export') {\n emit('click', e, props.args);\n return;\n } else {\n loadings.value = true;\n if (type === 'confirm')\n if (buttonConfirm.value === false)\n try {\n await confirm(t('common.confirmMsg')).then(async () => {\n if (!locked.value) {\n locked.value = true;\n emit('click', e, props.args);\n locked.value = false;\n }\n });\n } catch {\n // ignore user cancel\n }\n else {\n if (!locked.value) {\n locked.value = true;\n emit('click', e, props.args);\n locked.value = false;\n }\n }\n else emit('click', e, props.args);\n // ===== loading关闭 =====\n loadings.value = false;\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 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\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 {...(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-05-15 15:11:03\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-05-15 15:22: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\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: date shortcuts\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 09:14:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-14 09:26:20\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 { 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: date picker\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:51:21\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:26:43\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 { ElDatePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type DefineComponent, type PropType } from 'vue';\n import { useI18n } from 'vue-i18n';\n import { dateRangeShortcuts, dateRangeShortcutsEn, dateShortcuts, dateShortcutsEn, dateTimeShortcuts, dateTimeShortcutsEn } from './shortcuts';\n import type { TDatePickerEmits, TDatePickerSize, TDatePickerType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('datepicker');\n\n export default defineComponent({\n name: 'GvDatePicker',\n props: {\n vref: {\n type: String,\n default: '',\n },\n modelValue: {\n type: [Date, String, Array] as PropType<TDatePickerType>,\n default: undefined,\n },\n type: {\n type: String,\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 as PropType<Date[]>,\n default: undefined,\n },\n size: {\n type: String as PropType<TDatePickerSize>,\n default: 'small',\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 as PropType<string[]>,\n default: () => [],\n },\n disabledDate: {\n type: Function as PropType<(date: Date) => boolean>,\n default: undefined,\n },\n editable: {\n type: Boolean,\n default: true,\n },\n unlink: {\n type: Boolean,\n default: false,\n },\n },\n\n emits: ['update:modelValue', 'change', 'blur', 'focus', 'pick'],\n\n setup(props, { emit }) {\n // @data\n const { locale, t } = useI18n();\n const globalSize = useGlobalConfig('size');\n const inputValue = ref(props.modelValue);\n const datepickerSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sType = computed(() => {\n if (props.type === 'date') return 'date';\n if (props.type === 'datetime') return 'datetime';\n if (props.type === 'daterange2') return 'date';\n if (props.type === 'datetimerange2') return 'datetime';\n if (props.type === 'daterange' || props.type === 'datetimerange') return 'daterange';\n return 'date';\n });\n const DatePicker = ElDatePicker as typeof ElDatePicker & DefineComponent<TDatePickerEmits>;\n\n // @watch\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n /**\n *@todo: 快捷时间选择器 - 左侧栏\n *@author: bugcao\n *@date: 2026-05-07 14:04:54\n *@version: v1.0.1\n */\n const shortcuts = computed(() => {\n const isEn = locale.value === 'en';\n if (props.type === 'date') return isEn ? dateShortcutsEn : dateShortcuts;\n if (props.type === 'datetime') return isEn ? dateTimeShortcutsEn : dateTimeShortcuts;\n if (props.type === 'daterange' || props.type === 'datetimerange') return isEn ? dateRangeShortcutsEn : dateRangeShortcuts;\n return [];\n });\n /**\n *@todo: 禁用日期函数,原属性picker-options.disabled-date\n *@author: bugcao\n *@date: 2026-05-07 14:05:08\n *@version: v1.0.1\n */\n const mergedDisabledDate = computed(() => {\n if (props.disabledDate) return props.disabledDate;\n if (props.disabledDateFunc.includes('beforeToday')) return (date: Date) => date.getTime() < Date.now() - 86400000;\n if (props.disabledDateFunc.includes('afterToday')) return (date: Date) => date.getTime() > Date.now();\n return undefined;\n });\n const handleUpdate = (value: TDatePickerType) => {\n emit('update:modelValue', value);\n };\n const handleChange = (value: TDatePickerType) => {\n emit('change', value);\n };\n const handleBlur = (e: FocusEvent) => {\n emit('blur', e);\n };\n const handleFocus = (e: FocusEvent) => {\n emit('focus', e);\n };\n const handleCalendarChange = (value: any) => {\n emit('pick', value);\n };\n\n // @render\n return () => (\n <DatePicker\n ref={props.vref || 'gv-datepicker'}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleUpdate}\n type={sType.value}\n range-separator={props.rangeSeparator || t('common.until')}\n placeholder={props.placeholder || t('common.selectDate')}\n start-placeholder={props.startPlaceholder || t('common.startDate')}\n end-placeholder={props.endPlaceholder || t('common.endDate')}\n default-time={props.defaultTime}\n shortcuts={shortcuts.value}\n disabled-date={mergedDisabledDate.value}\n format={props.format}\n value-format={props.valueFormat}\n clearable={props.clearable}\n disabled={props.disabled}\n editable={props.editable}\n unlink-panels={props.unlink}\n class={prefixCls}\n size={datepickerSize.value}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onCalendarChange={handleCalendarChange}\n />\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-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 &: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-02 21:09:19\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 { useAppStore } from '@/store/modules/app';\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 } = useI18n();\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 },\n );\n\n // @method\n const handleVisible = () => {\n dialogVisible = true;\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-03 10:33:43\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-top: 5px;\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-03 14:20:15\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, 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: ['cancel', 'update:visible'],\n\n setup(props, { slots, emit }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n\n let drawerVisible = 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 = newVal;\n if (drawerVisible)\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n },\n );\n\n // @method\n\n const handleOpen = () => {\n // this.maskVisible = true;\n // this.$emit('opened');\n };\n\n const handleClosed = () => {\n emit('update:visible', false);\n };\n\n const handleCancel = (event: Event) => {\n drawerVisible = false;\n maskVisible.value = false;\n emit('cancel', event);\n };\n\n const handleVisible = () => {\n drawerVisible = true;\n };\n\n const handleClose = () => {\n drawerVisible = false;\n maskVisible.value = 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 - 215;\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) {\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}\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 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>\n <div\n class=\"gv-drawer__body__inner\"\n style={{ maxHeight: `${drawerMaxHeight.value}px !important` }}>\n {slots.default?.()}\n </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-04-27 10:24:25\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-03-22 09:59:51\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-03 14:20:25\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 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 showWordLimit: {\n type: Boolean,\n default: true,\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 modelModifiers: {\n type: Object as PropType<Record<string, unknown>>,\n default: () => ({}),\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 // @computed\n const inputSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sPlaceholder = computed(() => props.placeholder || t('common.pleaseInput'));\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 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 emit('keydown', event);\n };\n\n // @render\n return () => {\n if (!props.visible) return null;\n return (\n <ElInput\n ref={props.vref}\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={props.showWordLimit}\n maxlength={props.maxlength}\n placeholder={sPlaceholder.value}\n disabled={getDisabled.value}\n clearable={props.clearable}\n class={prefixCls}\n style={{ display: props.visible ? '' : 'none' }}\n onInput={handleInput}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onClear={handleClear}\n onKeydown={handleKeyDown}>\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 .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 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 // @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 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-02 15:21:10\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 { 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 { debounce } from '@@/utils/index';\n import { ElOption, ElSelect, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, onMounted, 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 value: {\n type: [String, Number, Boolean, Array, Object] as PropType<string | number | boolean | 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 debounceSearch;\n let dicIcon = 'iconfont gv-icon-shujuzidian3';\n const remote = ref(false);\n const loading = ref(false);\n const loadingText = ref('loading...');\n const inputValue = ref(props.value || '');\n const inputShowLabel = ref(props.showLabel);\n const inputFilterable = ref(props.filterable);\n // let inputFilterable = props.filterable,\n const selectValue = ref(props.value);\n const options = ref<DicItem[]>([]);\n const originOptions = ref<DicItem[]>([]);\n const className = ref(`${prefixCls}`);\n const globalSize = useGlobalConfig('size');\n // const isTableDic = false; // 是否表选字典\n // @computed\n const selectSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n // @watch value\n watch(\n () => props.value,\n\n (newValue) => {\n inputValue.value = newValue || '';\n selectValue.value = newValue;\n },\n );\n\n // watch showLabel\n watch(\n () => props.showLabel,\n (newVal) => {\n if (inputValue.value) {\n inputShowLabel.value = newVal;\n\n if (inputValue.value !== null && typeof inputValue.value !== 'object')\n selectValue.value = {\n value: inputValue.value,\n\n label: newVal || inputValue.value,\n };\n else selectValue.value = inputValue.value;\n\n const hasOp = options.value.some((x) => {\n if (Array.isArray(inputValue.value))\n return inputValue.value.some((ele: any) => {\n if (typeof ele === 'object') return ele.value + '' === x.c + '';\n else return ele + '' === x.c + '';\n });\n else return x.c + '' === inputValue.value + '';\n });\n\n if (hasOp === false)\n if (!Array.isArray(inputValue.value)) {\n const op: any = {};\n op['c'] = inputValue.value + '';\n op['t'] = newVal;\n options.value.push(op);\n } else\n // 多选\n inputValue.value.forEach((x: any, index: number) => {\n const op: any = {};\n op['c'] = x.value + '';\n if (newVal) op['t'] = newVal[index];\n else op['t'] = x.label;\n options.value.push(op);\n });\n }\n },\n );\n\n // @method\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 * @param {*} event\n */\n const handleClear = (event) => {\n // add: 解决回车选中搜索字典后,清空无法重新加载问题 2022-04-10\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n else options.value = originOptions.value;\n props.clear(selectValue, props.vref, props.dicType);\n emit('clear', event);\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 remoteDictSearch = async (query?: string): Promise<void> => {\n const sDicType = props.dicType.substring(2); // 去掉T#\n // if (this.options.length === 0) { // 远程查询\n const { datas } = await props.dicRemote(sDicType, query, props.editRow);\n const ops = [];\n try {\n JSON.parse(datas).forEach((x) => {\n const op = {};\n op['c'] = x.c;\n op['t'] = x.t;\n (ops as DicItem[]).push(op as DicItem);\n });\n } catch (e) {\n // throw e\n console.log(e);\n }\n\n options.value = ops;\n if (originOptions.value.length === 0) originOptions.value = ops;\n // }\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 * @param {*} query\n */\n const remoteMethod = async (query?: string): Promise<void> => {\n loading.value = true;\n // fixme: 如果有初始化默认值,则仍需要查询表选重新查询 2022-07-08\n let defaultValFlag = false;\n if (unref(inputValue)) defaultValFlag = true;\n if (props.isreload === true || options.value.length === 0 || defaultValFlag === true) {\n // 远程查询\n options.value = originOptions.value.filter((x) => {\n // 结果集过滤\n if (x.t) {\n const f = x.t.split(']');\n if (query && f[0].indexOf(query) !== -1) return true;\n }\n if (x.c) if (query && x.c.indexOf(query) !== -1) return true;\n });\n if (options.value.length === 0)\n options.value = options.value.filter((x) => {\n if (x.t) {\n const f = x.t.split(']');\n if (query && f[0].indexOf(query) !== -1) return true;\n }\n if (x.c) if (query && x.c.indexOf(query) !== -1) return true;\n });\n // if (this.options.length === 0)\n await remoteDictSearch(query);\n } else if (query) {\n options.value = 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) if (x.c.indexOf(query) !== -1) return true;\n });\n if (options.value.length === 0)\n options.value = options.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) if (x.c.indexOf(query) !== -1) return true;\n });\n // if (this.options.length === 0)\n await remoteDictSearch(query);\n } else options.value = originOptions.value;\n if (!query)\n if (options.value.length === 0) {\n loading.value = true;\n loadingText.value = t('common.noData');\n } else {\n loading.value = false;\n loadingText.value = t('common.loading');\n }\n else loading.value = false;\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 // this.inputShowLabel = '';\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 else if (props.isreload === true || originOptions.value.length === 0)\n // else if (this.isreload === true)\n remoteMethod();\n else if (originOptions.value.length) options.value = originOptions.value;\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) => {\n let t = x.t;\n switch (lang) {\n case 'zh':\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={x.c}\n value={{ value: x.c + '', label: t }} // update: 增加字典值和代码的双返回值 2022-04-16\n // value={this.inputShowLabel ? x.c : { value: x.c, label: x.t }} // update: 增加字典值和代码的双返回值 2022-04-16\n >\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) => {\n const t = x.t;\n let val = t;\n const columns: string[] = [];\n const row = {};\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 columns.push(`<span class=\"gv-select__option--column\">${m4[1] === 'null' ? ' -- ' : m4[1]}</}</span>`);\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 + '' : x.val;\n // let dv = x.c;\n // if (typeof this.inputValue === 'object')\n // dv = { value: x.c, label: val, row: row };\n // else if (this.showLabel === undefined || this.showLabel === '')\n // if (this.bizType !== 'tableedit')\n // dv = { value: x.c, label: val, row: row };\n return (\n <ElOption\n // key = {x.c}\n key={key}\n label={val}\n // value = {dv}\n // value={this.showLabel ? dv : { value: x.c, label: val, row: row }}\n value={{ value: x.c + '', label: val, row: row }}>\n <span class=\"gv-select__option--label\">{val}</span>\n <span class=\"gv-select__option--value\">{x.c}</span>\n {columns}\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 (typeof val === 'object')\n // this.inputLabel = val.label;\n // fixme: 解决清空后调用回调方法报错问题 2022-07-26\n let labels: string = '';\n const labelArr: string[] = [];\n if (val !== '') {\n if (props.multiple === true)\n // 多选\n options.value.forEach((x) => {\n if (Array.isArray(val) && val.some((ele) => ele === x.c)) labelArr.push(x.t);\n });\n else if (val !== null && 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 /**\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 inputValue.value = value;\n emit('update:modelValue', value);\n };\n\n // created\n // if (props.dicType.startsWith('t#')) isTableDic = true;\n if (remote.value === true) className.value = 'gv-select__table';\n if (props.bizType === 'tableedit') className.value += ' tableedit';\n\n // 不采用初始化时全部加载方式,有默认值情况单独生成\n if (inputValue.value)\n if (!Array.isArray(inputValue)) {\n const op = {};\n op['c'] = inputValue.value + '';\n op['t'] = props.showLabel || inputValue;\n if (inputValue.value !== null && typeof inputValue.value !== 'object') selectValue.value = { value: inputValue.value + '', label: props.showLabel || inputValue.value + '' };\n else selectValue.value = inputValue.value;\n options.value.push(op as DicItem);\n } else {\n // 多选模式\n selectValue.value = [];\n (inputValue.value as unknown[]).forEach((x, index) => {\n if (x !== '') {\n const op = {};\n if (typeof x === 'object' && x !== null && 'value' in x) op['c'] = (x as { value: string }).value + '';\n else op['c'] = x + '';\n if (props.showLabel) op['t'] = props.showLabel[index];\n // fixme: 解决多选字典默认值不正确问题 2022-10-12\n if (selectValue.value && Array.isArray(selectValue.value)) selectValue.value.push({ value: op['c'] + '', label: op['t'] || op['c'] });\n options.value.push(op as DicItem);\n }\n // if (this.bizType === 'tableedit')\n // console.log(this.options);\n });\n }\n\n // mounted\n onMounted(() => {\n // 防抖处理\n debounceSearch = debounce(remoteMethod, 500);\n // add: 设置字典icon 2022-04-12\n if (props.dicType === undefined || props.dicType === null) {\n alert(`[ ${props.label} ] - The dicType needs to be set`, 'warning');\n return;\n } else {\n const src = props.dicType.toLowerCase();\n if (src.startsWith('e#')) dicIcon = 'iconfont gv-icon-meiju';\n else if (src.startsWith('t#')) {\n dicIcon = 'iconfont gv-icon-24gl-table';\n remote.value = true;\n }\n }\n });\n\n // render\n return () => {\n // console.log(props.visible);\n const render =\n remote.value === false ? (\n <ElSelect\n ref=\"gv-select\"\n name={props.name}\n v-model={selectValue.value}\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={props.placeholder}\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 name={props.name}\n v-model={selectValue.value}\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={props.placeholder}\n disabled={props.disabled}\n clearable={props.clearable}\n multiple={props.multiple}\n default-first-option={true}\n onClear={handleClear}\n collapseTags={props.collapseTags}\n onFocus={handleFocus}\n onBlur={handleBlur}\n filterable={inputFilterable.value}\n remote={true}\n remote-method={(query) => debounceSearch(query)}\n loading={loading.value}\n loading-text={loadingText.value}\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: 25px !important;\n\n .iconfont {\n font-size: $appTextSize;\n }\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-03 14:21:34\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 { useBridgeI18n } from '@@/bridge';\n import { ElTimePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { DefineComponent, PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TTimePickerEmits, TTimePickerSize, TTimePickerType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('timepicker');\n const TimePicker = ElTimePicker as typeof ElTimePicker & DefineComponent<TTimePickerEmits>;\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 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: 'small',\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 // @render\n return () => (\n <TimePicker\n ref={props.vref || 'gv-timepicker'}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleUpdate}\n name={props.name}\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 class={prefixCls}\n disabled-hours={mergedDisabledHours}\n disabled-minutes={mergedDisabledMinutes}\n disabled-seconds={mergedDisabledSeconds}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n />\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-04-28 16:11:10\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') info = '车牌号格式错误';\n else info = 'car number format error.';\n return info;\n },\n double: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入浮点数.';\n else info = 'please enter Double.';\n return info;\n },\n decimal: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh') 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') 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') 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') 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') 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') 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') info = '只能输入正整数.';\n else info = 'Only enter a positive integer.';\n return info;\n },\n number0: (lang: string) => {\n let info = '';\n if (lang === 'zh') 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') 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') 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') info = '电话号码格式不正确.';\n else info = 'Phone format is not correct.';\n return info;\n },\n email: (lang: string) => {\n let info = '';\n if (lang === 'zh') 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') 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') 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') 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') 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') 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-05-29 09:32:05\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' } = 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-03 14:19:09\n * @version: 1.1.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\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, 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 // console.log(x);\n let v = '';\n switch (lang) {\n case 'zh':\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 let switchDefaultVal;\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 switchDefaultVal = model.value[field] ? model.value[field] : '100201';\n break;\n case 'sf':\n switchDefaultVal = 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}\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 <ElRadioGroup\n v-model={model.value[field]}\n onChange={(val) => handleRadioDictChange(val, field, dicType, cb)}>\n {ops.map((x) =>\n format[0] === 0 ? (\n <ElRadio\n label={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 label={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 let v;\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;\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 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') ? 235 : 295;\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 < 768)\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 if (clientWidth !== 0) {\n if (clientWidth < 768)\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) => {\n let v;\n if (type === 'create') v = item.value;\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}\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 auto;\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: 2025-06-09 14:15:05\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 setup lang=\"ts\">\n import { computed, unref } from 'vue';\n import { useRouter } from 'vue-router';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useLocaleStore } from '@/store/modules/locale';\n import { useLocale } from '@/hook/web/useLocale';\n import { useStyle } from '@/hook/web/useStyle';\n\n import { ElDropdown, ElDropdownMenu, ElDropdownItem } 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 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 await switchLocale(lang);\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}\n label={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 label={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-05-29 09:35:52\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-03 14:15:42\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 const propsData = vnode.props;\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-05-30 22:27: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 */\nimport type { FilterCondition, PageInfo } from '@@/GvTable/src/types';\nimport type { TableInstance } from 'element-plus';\nimport type { VNode } from 'vue';\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 {VNode} tabNode\n * @param {Recordable} filter\n */\nexport const combined = function (tabNode: VNode, 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'] ?? 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 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-03 11:13:16\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 { 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') msgs = '操作成功';\n else msgs = 'Operate successfully';\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: any, fetch: AsyncFn, data: any) => {\n let result = {};\n const condition = combined(tabNode, data);\n if (tabNode) {\n tabNode.filterConditions = condition;\n tabNode.fetch = fetch;\n }\n if (tabNode) tabNode.startLoading();\n await fetch(condition)\n .then((res) => {\n result = res.datas;\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n if (tabNode) tabNode.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: VNode[]) => {\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 childList = (fmNode as any).subTree?.children || [];\n for (const element of childList) {\n const fmNode = element.component.subTree.component.subTree.children[0];\n if (fmNode?.type?.name === 'ElForm')\n await element\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 = {};\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') msgs = '保存成功';\n else msgs = 'Save OK.';\n }\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode = element.component.subTree.component.subTree.children[0];\n if (fmNode?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const props = fmNode.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode);\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 console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n // console.log(error);\n return null;\n }\n } else\n await fmNode\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const props = fmNode.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode);\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 console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n return;\n }\n })\n .catch(() => {\n // throw new Error(e);\n Promise.reject('The form failed validation');\n result = {};\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 = {};\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') msgs = '保存成功';\n else msgs = 'Save Ok.';\n }\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode = element.component.subTree.component.subTree.children[0];\n if (fmNode?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const filter = fmNode.props.model;\n // console.log(filter);\n // console.log(fmNode);\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 console.log(error);\n });\n } else\n await fmNode\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const filter = fmNode.props.model;\n // console.log(filter);\n // console.log(fmNode);\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 console.log(error);\n });\n })\n .catch(() => {\n result = {};\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('form 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 fmNode = element.component.subTree.component.subTree.children[0];\n // 解析检索条件\n await fmNode.component.exposed\n .validate()\n .then(async () => {\n // 拼接查询条件\n const filter = fmNode.props.model;\n // console.log(filter);\n // console.log(formList);\n const filterConditions = searchCombined(formList, filter, tabNode);\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 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('form object is null', 'error');\n return false;\n }\n let result = {};\n const condition = combined(tabNode, data);\n // console.log(JSON.stringify(filterConditions));\n // update: 保存查询条件、方法至table对象,为分页组件使用 2022-04-18\n\n tabNode.filterConditions = condition;\n tabNode.fetch = fetch;\n tabNode.startLoading();\n await fetch(condition)\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) => {\n if (x?.type?.name === '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 tabNode.stopLoading();\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 tabNode?.exposed?.startLoading();\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 tabNode?.exposed?.stopLoading();\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: 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 false;\n }\n if (result === null || result === undefined)\n // Notify.message('结果对象为空', 'error');\n return false;\n\n if (Array.isArray(result)) searchData.records.splice(0, 0, ...result);\n else\n // if (searchData.records === undefined)\n // result['rownums'] = 0;\n // else\n // if (!searchData.records[0])\n // result['rownums'] = 0;\n // else\n // result['rownums'] = (searchData.records[0].rownums - 1);\n 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)\n // Notify.message('结果对象为空', 'error');\n 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\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 return true;\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 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 const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (Object.keys(rowData).length !== 0)\n formList.forEach((x) => {\n if (rowData[x.field] !== 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 (rowData[x.field] !== null && typeof rowData[x.field] === 'object') x.value = rowData[x.field].c;\n else x.value = rowData[x.field];\n break;\n case 'date':\n if (x.dateType === 'daterange') x.value = rowData[x.field] ? rowData[x.field].split(',') : null;\n else x.value = rowData[x.field];\n break;\n case 'datetime':\n if (x.dateType === 'datetimerange') x.value = rowData[x.field] ? rowData[x.field].split(',') : null;\n else x.value = rowData[x.field];\n break;\n case 'time':\n if (x.dateType === 'timerange') x.value = rowData[x.field] ? rowData[x.field].split(',') : null;\n else x.value = rowData[x.field];\n break;\n case 'layer':\n if (Array.isArray(rowData[x.field])) x.value = rowData[x.field];\n else if (rowData[x.field]) {\n const arr = rowData[x.field].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] === rowData[x.field] + '') {\n x.value = rowData[x.field];\n x.showLabel = itemChild[1];\n break;\n }\n }\n }\n } else if (x.multiple)\n if (rowData[x.field] !== null) {\n // 多选字典\n if (typeof rowData[x.field] === 'object') {\n const c = rowData[x.field].c;\n let v;\n // if (language === 'zh')\n // v = rowData[x.field].v;\n // else\n // v = rowData[x.field].e ? rowData[x.field].e : rowData[x.field].v;\n switch (lang) {\n case 'zh':\n v = rowData[x.field].v;\n break;\n case 'en':\n v = rowData[x.field].e ? rowData[x.field].e : rowData[x.field].v;\n break;\n case 'l1':\n v = rowData[x.field].l1 ? rowData[x.field].l1 : rowData[x.field].v;\n break;\n case 'l2':\n v = rowData[x.field].l2 ? rowData[x.field].l2 : rowData[x.field].v;\n break;\n }\n\n if (c) {\n x.value = c.split(',');\n if (v) x.showLabel = v.split(',');\n } else {\n x.value = [];\n x.showLabel = [];\n }\n } else if (typeof rowData[x.field] === 'string') {\n const c = rowData[x.field];\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 = rowData[x.field];\n else if (rowData[x.field] !== null && typeof rowData[x.field] === 'object') {\n x.value = rowData[x.field].c;\n // if (language === 'zh')\n // x.showLabel = rowData[x.field].v;\n // else\n // x.showLabel = rowData[x.field].e ? rowData[x.field].e : rowData[x.field].v;\n switch (lang) {\n case 'zh':\n x.showLabel = rowData[x.field].v;\n break;\n case 'en':\n x.showLabel = rowData[x.field].e ? rowData[x.field].e : rowData[x.field].v;\n break;\n case 'l1':\n x.showLabel = rowData[x.field].l1 ? rowData[x.field].l1 : rowData[x.field].v;\n break;\n case 'l2':\n x.showLabel = rowData[x.field].l2 ? rowData[x.field].l2 : rowData[x.field].v;\n break;\n }\n } else x.value = rowData[x.field];\n\n break;\n default:\n x.value = rowData[x.field];\n break;\n }\n });\n // formList = newList;\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\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-03 14:03:03\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 { 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 { ElButton, ElButtonGroup, ElCheckbox, ElDivider, ElPagination, ElPopover, ElRadio, ElRadioGroup, ElTable, ElTableColumn, ElTooltip, ElTree, type TableInstance } from 'element-plus';\n import { computed, defineComponent, getCurrentInstance, nextTick, onMounted, ref, 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 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 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 // emit\n setup(props, { slots, expose }) {\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 alert(11);\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 const sTableFetch = props.tableFetch;\n let sPageSize = props.pageSize;\n const sDataLoaded = false; // 列表内容是否加载完成\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 popoverSearchList = 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 const renderMap = {}; // render是否加载过\n const columnSums: string[] = []; // 合计列\n const columnSumsDecimal: number[] = []; // 合计列位数\n const isIndeterminate = ref([]); // 表头筛选全选\n const scrollLeft = 0; // 列表横向滚动条\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 /**\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 Object.keys(popoverVisible.value).forEach((key) => {\n if (key !== property) popoverVisible.value[key] = false;\n });\n };\n\n const handlePopoverWrapper = (e: MouseEvent, property?: string) => {\n e.stopPropagation();\n closeAllPopover(property);\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 <label>\n <GvInput\n placeholder={`${t('table.tableSearch')}(+)..`}\n prefixIcon=\"gv-icon-sousuo\"\n size=\"small\"\n class=\"gv-table__search-input\"\n onInput={handleTableSearchInput}></GvInput>\n </label>\n </div>\n ) : null;\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').style.width;\n const clientWidth = document.body.clientWidth - 200 - 20;\n for (let i = 0; i < popOvers.length; i++)\n if (popOvers[i].style.display !== 'none')\n if (parseInt(rootEl.querySelector('.el-table__body-wrapper').scrollLeft))\n popOvers[i].style.left = parseInt(tableBodyWidth) - clientWidth + parseInt(popOvers[i].style.left) - parseInt(rootEl.querySelector('.el-table__body-wrapper').scrollLeft) + 'px';\n else popOvers[i].style.left = parseInt(popOvers[i].style.left) - parseInt(rootEl.querySelector('.el-table__body-wrapper').scrollLeft) + 'px';\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=\"small\"\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=\"small\"\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[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[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) => {\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=\"small\"\n onInput={handleColumnFilter}\n vref={prop}></GvInput>\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size=\"small\"\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size=\"small\"\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=\"small\"\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=\"small\"\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size=\"small\"\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' ? x.t : x.e}\n </ElCheckbox>\n ))}\n </div>\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size=\"small\"\n disabled=\"true\"\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size=\"small\"\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;\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 const handlePopoverSlotClick = (type: string, label: string, prop: string, dicType: string, filtercode: string, event?: MouseEvent) => {\n event?.stopPropagation();\n closeAllPopover(prop);\n popoverVisible.value[prop] = true;\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 // 初始化 列的筛选popover都是隐藏的\n popoverVisible[prop] = false;\n\n // console.log(this.popoverVisible);\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 popoverVisible[x.prop] = false;\n\n // console.log(this.popoverVisible);\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, x.prop)}\n class=\"render__header\">\n <ElPopover\n visible={popoverVisible.value[x.prop]}\n onUpdate:visible={(val: boolean) => {\n popoverVisible.value[x.prop] = val;\n }}\n trigger=\"click\"\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(hType, x.label, x.prop, x.dicType, x.filtercode, e)}>\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, prop)}\n class=\"render__header\">\n <ElPopover\n visible={popoverVisible.value[prop]}\n onUpdate:visible={(val: boolean) => {\n popoverVisible.value[prop] = val;\n }}\n trigger=\"click\"\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(type, label, prop, dicType, filtercode, e)}>\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=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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; order: string | 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: 合并表格行或合并列方法\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', () => closeAllPopover());\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 // on-row-dblclick={props.handleRowDblClick} // 设置行双击事件方法\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: 2px;\n\n :deep(.gv-table__search-input) {\n // top: -30px;\n float: right;\n width: 150px;\n\n .el-input__inner {\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: 31px;\n padding: 1px 0;\n font-size: $tableThFontSize;\n font-weight: $tableThFontWeight;\n line-height: 31px;\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 .el-popover__reference {\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 .el-popover__reference {\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 padding: 4px 8px;\n }\n\n .el-button + .el-button {\n margin-left: 5px;\n }\n\n .el-button + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .hv-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: 31px;\n padding: 1px 0;\n font-size: $tableThFontSize;\n font-weight: $tableThFontWeight !important;\n line-height: 31px;\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 .el-popover__reference {\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 .el-popover__reference {\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 padding: 4px 8px;\n }\n\n .el-button + .el-button {\n margin-left: 5px;\n }\n\n .el-button + .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: 13px;\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: 31px;\n padding: 1px 0;\n font-size: $tableThFontSize;\n font-weight: $tableThFontWeight;\n line-height: 31px;\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 .el-popover__reference {\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 padding: 4px 8px;\n }\n\n .el-button + .el-button {\n margin-left: 5px;\n }\n\n .el-button + .ht-popconfirm {\n margin-left: 5px;\n }\n\n .ht-popconfirm + .ht-popconfirm {\n margin-left: 5px;\n }\n\n .ht-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: 31px;\n padding: 1px 0;\n font-size: $tableThFontSize;\n font-weight: $tableThFontWeight !important;\n line-height: 31px;\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 .el-popover__reference {\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 padding: 4px 8px;\n }\n\n .el-button + .el-button {\n margin-left: 5px;\n }\n\n .el-button + .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-05-18 14:26:43\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-03 14:21:05\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 const classNames = targetNode ? [...targetNode.classList] : [];\n if (classNames.includes('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: 13px;\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-05-29 09:38:07\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","setIconStyle","replace","checkPerms","pm","slot","split","x","indexOf","length","arr","handleClick","console","log","exposed","resetFields","rootForm","originFormList","formList","Array","index","filtercode","showLabel","dateType","model","field","rootEl","el","dateRangeSingles","querySelectorAll","startInput","querySelector","endInput","click","then","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","useI18n","datepickerSize","sType","DatePicker","ElDatePicker","shortcuts","isEn","mergedDisabledDate","includes","getTime","handleFocus","handleCalendarChange","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","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","returnIcon","ElDrawer","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","showWordLimit","columnProp","rows","autosize","modelModifiers","inputSize","sPlaceholder","renderPrefixIcon","renderSuffixIcon","handleInput","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","debounceSearch","dicIcon","remote","loadingText","inputShowLabel","inputFilterable","selectValue","originOptions","className","selectSize","c","op","push","getSelectOptions","src","toLowerCase","xx","arr2","dictCache","dict","getDictDivision","cache","addDictCache","getDict","opts","RegExp","test","filterMethod","_opts","remoteDictSearch","sDicType","substring","datas","ops","JSON","parse","remoteMethod","defaultValFlag","f","handleVisibleChange","renderSelectOption","l1","l2","ElOption","renderTableOption","columns","row","multiColumn","v1","mm","m2","m4","vv1","mmm","mm2","mm4","labelArr","ElSelect","GvSelectPlugin","GvSelect","columnKey","require","switchType","newStatus","ElSwitch","GvSwitchPlugin","GvSwitch","TimePicker","ElTimePicker","isRange","disabledHours","disabledMinutes","disabledSeconds","timepickerSize","mergedDisabledHours","mergedDisabledMinutes","mergedDisabledSeconds","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","vm","$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","onFocus","ElRadioGroup","_slot2","ElRadio","ElRadioButton","vv","toolText","_resolveComponent","getItems","sRootEl","tabPane","offsetTop","classList","contains","clearFormValidate","clearValidate","setFormStyle","formStyle1","lastIndexOf","parseInt","clientWidth","init","formModel","formRule","difference","diff","fieldObj","oldObj","fieldObjKeys","key2","nextProps","prevProps","deep","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","saveCombined","fetchData","fetch","submit","hasMsg","fetchTable","checkForms","fmNodes","fmNode","childList","save","check","fmInnerNode","rawFmChildren","fmChildList","conditions","update","search","searchInputNode","tableEl","tableHeader","tableFixedHeader","h","columnsFixed","lenFixed","searchNoFm","toNewPageSearch","trans","crud","searchData","rownums","currentRow","rowData","items","itemChild","o","refTable","tableHead","tableData","maxWidth","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","tableRefs","tableRef","getPageInfo","current","pages","setTableRef","closeAllPopover","property","getScrollLeft","startLoading","stopLoading","transRecords","loadAction","splice","handleImport","handleExport","getImportBtn","import","buttonName","getExportBtn","export","runPageSearch","fC","fetchFn","handleSizeChange","handleCurrentChange","handleTableSearchInput","handleTableSearch","fh","strFh","y","trim","getTableSearch","handlePopoverShow","popOvers","tableBodyWidth","style","body","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","overflow","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","onClick","lock","$index","onConfirm","onAfter-enter","handleDetailPopoverShow","checkEditRow","tableColumns","thd","lsTableHeadsArr","startIndex","ff","treeNode","rownumWidth","actionHead","actionColumn","columnVNode","sortMethod","_0","order","fieldName","sortingType","sumData","sort","row1","row2","isNaN","localeCompare","oi","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","find","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","tagName","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","alert$1","confirm$1"],"mappings":"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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/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-03 13:16:25\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// ------ 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 .ht-container .ht-search__bar>.ht-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-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 .ht-container .ht-form .ht-search__bar>.ht-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 .ht-container .ht-form .ht-search__bar>.ht-button.shrink') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-form .ht-search__bar>.ht-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 .ht-container .ht-drawer__popup .ht-drawer .ht-drawer__footer>.ht-drawer__footer--inner .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-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 .ht-container .ht-table__container .ht-table__bar .ht-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .ht-container .ht-edit__bar .ht-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 .ht-container .ht-table__container .ht-table__search .ht-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>.ht-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 .ht-container .ht-dialog__popup .ht-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 .ht-container .ht-drawer__popup .ht-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-05-13 15:38:19\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-04 22:20:22\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 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 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 loadings.value = true;\n await parent?.vnode.el?.querySelector('.gv-search-bar .el-button--primary')?.click();\n loadings.value = false;\n return;\n } else if (props.bizType === 'import' || props.bizType === 'export') {\n emit('click', e, props.args);\n return;\n } else {\n loadings.value = true;\n if (type === 'confirm')\n if (buttonConfirm.value === false)\n try {\n await confirm(t('common.confirmMsg')).then(async () => {\n if (!locked.value) {\n locked.value = true;\n emit('click', e, props.args);\n locked.value = false;\n }\n });\n } catch {\n // ignore user cancel\n }\n else {\n if (!locked.value) {\n locked.value = true;\n emit('click', e, props.args);\n locked.value = false;\n }\n }\n else emit('click', e, props.args);\n // ===== loading关闭 =====\n loadings.value = false;\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 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\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 {...(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-05-15 15:11:03\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-05-15 15:22: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\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: date shortcuts\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 09:14:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-14 09:26:20\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 { 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: date picker\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:51:21\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:26:43\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 { ElDatePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type DefineComponent, type PropType } from 'vue';\n import { useI18n } from 'vue-i18n';\n import { dateRangeShortcuts, dateRangeShortcutsEn, dateShortcuts, dateShortcutsEn, dateTimeShortcuts, dateTimeShortcutsEn } from './shortcuts';\n import type { TDatePickerEmits, TDatePickerSize, TDatePickerType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('datepicker');\n\n export default defineComponent({\n name: 'GvDatePicker',\n props: {\n vref: {\n type: String,\n default: '',\n },\n modelValue: {\n type: [Date, String, Array] as PropType<TDatePickerType>,\n default: undefined,\n },\n type: {\n type: String,\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 as PropType<Date[]>,\n default: undefined,\n },\n size: {\n type: String as PropType<TDatePickerSize>,\n default: 'small',\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 as PropType<string[]>,\n default: () => [],\n },\n disabledDate: {\n type: Function as PropType<(date: Date) => boolean>,\n default: undefined,\n },\n editable: {\n type: Boolean,\n default: true,\n },\n unlink: {\n type: Boolean,\n default: false,\n },\n },\n\n emits: ['update:modelValue', 'change', 'blur', 'focus', 'pick'],\n\n setup(props, { emit }) {\n // @data\n const { locale, t } = useI18n();\n const globalSize = useGlobalConfig('size');\n const inputValue = ref(props.modelValue);\n const datepickerSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sType = computed(() => {\n if (props.type === 'date') return 'date';\n if (props.type === 'datetime') return 'datetime';\n if (props.type === 'daterange2') return 'date';\n if (props.type === 'datetimerange2') return 'datetime';\n if (props.type === 'daterange' || props.type === 'datetimerange') return 'daterange';\n return 'date';\n });\n const DatePicker = ElDatePicker as typeof ElDatePicker & DefineComponent<TDatePickerEmits>;\n\n // @watch\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n /**\n *@todo: 快捷时间选择器 - 左侧栏\n *@author: bugcao\n *@date: 2026-05-07 14:04:54\n *@version: v1.0.1\n */\n const shortcuts = computed(() => {\n const isEn = locale.value === 'en';\n if (props.type === 'date') return isEn ? dateShortcutsEn : dateShortcuts;\n if (props.type === 'datetime') return isEn ? dateTimeShortcutsEn : dateTimeShortcuts;\n if (props.type === 'daterange' || props.type === 'datetimerange') return isEn ? dateRangeShortcutsEn : dateRangeShortcuts;\n return [];\n });\n /**\n *@todo: 禁用日期函数,原属性picker-options.disabled-date\n *@author: bugcao\n *@date: 2026-05-07 14:05:08\n *@version: v1.0.1\n */\n const mergedDisabledDate = computed(() => {\n if (props.disabledDate) return props.disabledDate;\n if (props.disabledDateFunc.includes('beforeToday')) return (date: Date) => date.getTime() < Date.now() - 86400000;\n if (props.disabledDateFunc.includes('afterToday')) return (date: Date) => date.getTime() > Date.now();\n return undefined;\n });\n const handleUpdate = (value: TDatePickerType) => {\n emit('update:modelValue', value);\n };\n const handleChange = (value: TDatePickerType) => {\n emit('change', value);\n };\n const handleBlur = (e: FocusEvent) => {\n emit('blur', e);\n };\n const handleFocus = (e: FocusEvent) => {\n emit('focus', e);\n };\n const handleCalendarChange = (value: any) => {\n emit('pick', value);\n };\n\n // @render\n return () => (\n <DatePicker\n ref={props.vref || 'gv-datepicker'}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleUpdate}\n type={sType.value}\n range-separator={props.rangeSeparator || t('common.until')}\n placeholder={props.placeholder || t('common.selectDate')}\n start-placeholder={props.startPlaceholder || t('common.startDate')}\n end-placeholder={props.endPlaceholder || t('common.endDate')}\n default-time={props.defaultTime}\n shortcuts={shortcuts.value}\n disabled-date={mergedDisabledDate.value}\n format={props.format}\n value-format={props.valueFormat}\n clearable={props.clearable}\n disabled={props.disabled}\n editable={props.editable}\n unlink-panels={props.unlink}\n class={prefixCls}\n size={datepickerSize.value}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onCalendarChange={handleCalendarChange}\n />\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-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 &: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-03 14:28:40\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 { 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 },\n );\n\n // @method\n const handleVisible = () => {\n dialogVisible = true;\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-03 10:33:43\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-top: 5px;\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-03 14:20:15\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, 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: ['cancel', 'update:visible'],\n\n setup(props, { slots, emit }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n\n let drawerVisible = 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 = newVal;\n if (drawerVisible)\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n },\n );\n\n // @method\n\n const handleOpen = () => {\n // this.maskVisible = true;\n // this.$emit('opened');\n };\n\n const handleClosed = () => {\n emit('update:visible', false);\n };\n\n const handleCancel = (event: Event) => {\n drawerVisible = false;\n maskVisible.value = false;\n emit('cancel', event);\n };\n\n const handleVisible = () => {\n drawerVisible = true;\n };\n\n const handleClose = () => {\n drawerVisible = false;\n maskVisible.value = 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 - 215;\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) {\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}\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 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>\n <div\n class=\"gv-drawer__body__inner\"\n style={{ maxHeight: `${drawerMaxHeight.value}px !important` }}>\n {slots.default?.()}\n </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-04-27 10:24:25\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-03-22 09:59:51\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-04 21:28:51\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 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\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 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 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 // @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 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-04 21:47:12\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<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 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 = props.placeholder ? props.placeholder : t('common.all');\n const inputValue = ref(props.value);\n const inputShowLabel = ref(props.showLabel);\n const inputFilterable = ref(props.filterable);\n // let inputFilterable = props.filterable,\n const selectValue = ref(props.value);\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 // @watch value\n watch(\n () => props.value,\n\n (newValue) => {\n inputValue.value = newValue;\n selectValue.value = newValue;\n },\n );\n\n // watch showLabel\n watch(\n () => props.showLabel,\n (newVal) => {\n if (inputValue.value) {\n inputShowLabel.value = newVal;\n\n if (inputValue.value !== null && typeof inputValue.value !== 'object')\n selectValue.value = {\n value: inputValue.value,\n label: newVal || inputValue.value,\n };\n else selectValue.value = inputValue.value;\n const hasOp = options.value.some((x) => {\n if (Array.isArray(inputValue.value))\n return inputValue.value.some((ele: any) => {\n if (typeof ele === 'object') return ele.value + '' === x.c + '';\n else return ele + '' === x.c + '';\n });\n else return x.c + '' === inputValue.value + '';\n });\n\n if (hasOp === false)\n if (!Array.isArray(inputValue.value)) {\n const op: any = {};\n op['c'] = inputValue.value;\n op['t'] = newVal;\n options.value.push(op);\n } else\n // 多选\n inputValue.value.forEach((x: any, index: number) => {\n const op: any = {};\n op['c'] = x.value;\n if (newVal) op['t'] = newVal[index];\n else op['t'] = x.label;\n options.value.push(op);\n });\n }\n },\n );\n\n // @method\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)) return String((v as Record<string, unknown>).value ?? (v as Record<string, unknown>).c ?? '');\n return String(v);\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 return String(o.label ?? o.v ?? o.value ?? o.c ?? '');\n }\n return String(v);\n };\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) 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 * @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 (val == null || val === '' || (Array.isArray(val) && val.length === 0)) 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 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 // 不采用初始化时全部加载方式,有默认值情况单独生成\n if (inputValue.value)\n if (!Array.isArray(inputValue.value)) {\n const raw = inputValue.value;\n let code = '';\n let text = '';\n if (raw !== null && typeof raw === 'object') {\n const o = raw as Record<string, unknown>;\n code = String(o.value ?? o.c ?? '');\n text = String(o.label ?? o.v ?? props.showLabel ?? code);\n selectValue.value = getOptionValue(code, text, o.row as Record<string, unknown>);\n } else {\n code = String(raw);\n text = typeof props.showLabel === 'string' ? props.showLabel : code;\n selectValue.value = getOptionValue(code, text);\n }\n pushDefaultOption({ c: code, t: text, s: '' } as DicItem);\n } else {\n // 多选模式\n selectValue.value = [];\n (inputValue.value as unknown[]).forEach((x, index) => {\n if (x === '') return;\n const op: DicItem = { c: '', t: '', s: '' };\n if (typeof x === 'object' && x !== null && 'value' in x) {\n op.c = String((x as { value: string }).value);\n op.t = String((x as { label?: string }).label ?? props.showLabel?.[index] ?? op.c);\n } else {\n op.c = String(x);\n op.t = props.showLabel ? String(props.showLabel[index] ?? op.c) : op.c;\n }\n if (selectValue.value && Array.isArray(selectValue.value)) selectValue.value.push(getOptionValue(op.c, op.t));\n pushDefaultOption(op);\n });\n }\n\n // @render\n return () => {\n const render =\n remote.value === false ? (\n <ElSelect\n ref=\"gv-select\"\n name={props.name}\n modelValue={selectValue.value}\n valueKey=\"value\"\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={sPlaceholder}\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 name={props.name}\n modelValue={selectValue.value}\n valueKey=\"value\"\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={sPlaceholder}\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-03 14:21:34\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 { useBridgeI18n } from '@@/bridge';\n import { ElTimePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { DefineComponent, PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TTimePickerEmits, TTimePickerSize, TTimePickerType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('timepicker');\n const TimePicker = ElTimePicker as typeof ElTimePicker & DefineComponent<TTimePickerEmits>;\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 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: 'small',\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 // @render\n return () => (\n <TimePicker\n ref={props.vref || 'gv-timepicker'}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleUpdate}\n name={props.name}\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 class={prefixCls}\n disabled-hours={mergedDisabledHours}\n disabled-minutes={mergedDisabledMinutes}\n disabled-seconds={mergedDisabledSeconds}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n />\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-04 13:36:34\n * @version: 1.1.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\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, 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 // console.log(x);\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 let switchDefaultVal;\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 switchDefaultVal = model.value[field] ? model.value[field] : '100201';\n break;\n case 'sf':\n switchDefaultVal = 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}\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 <ElRadioGroup\n v-model={model.value[field]}\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 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') ? 235 : 295;\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 < 768)\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 if (clientWidth !== 0) {\n if (clientWidth < 768)\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) => {\n let v;\n if (type === 'create') v = item.value;\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}\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 auto;\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-05-29 09:35:52\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-04 22:14:30\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 const propsData = vnode.props;\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-05-30 22:27: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 */\nimport type { FilterCondition, PageInfo } from '@@/GvTable/src/types';\nimport type { TableInstance } from 'element-plus';\nimport type { VNode } from 'vue';\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 {VNode} tabNode\n * @param {Recordable} filter\n */\nexport const combined = function (tabNode: VNode, 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'] ?? 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 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-04 20:31:25\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 */\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 successfully';\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: any, fetch: AsyncFn, data: any) => {\n let result = {};\n const condition = combined(tabNode, data);\n if (tabNode) {\n tabNode.filterConditions = condition;\n tabNode.fetch = fetch;\n }\n if (tabNode) tabNode.startLoading();\n await fetch(condition)\n .then((res) => {\n result = res.datas;\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n if (tabNode) tabNode.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: VNode[]) => {\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 childList = (fmNode as any).subTree?.children || [];\n for (const element of childList) {\n const fmNode = element.component.subTree.component.subTree.children[0];\n if (fmNode?.type?.name === 'ElForm')\n await element\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 = {};\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 fmNode = element.component.subTree.component.subTree.children[0];\n if (fmNode?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const props = fmNode.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode);\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 console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n // console.log(error);\n return null;\n }\n } else\n await fmNode\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const props = fmNode.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode);\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 console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n return;\n }\n })\n .catch(() => {\n // throw new Error(e);\n Promise.reject('The form failed validation');\n result = {};\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 = {};\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 fmNode = element.component.subTree.component.subTree.children[0];\n if (fmNode?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const filter = fmNode.props.model;\n // console.log(filter);\n // console.log(fmNode);\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 console.log(error);\n });\n } else\n await fmNode\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const filter = fmNode.props.model;\n // console.log(filter);\n // console.log(fmNode);\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 console.log(error);\n });\n })\n .catch(() => {\n result = {};\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('form 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 fmNode = element.component.subTree.component.subTree.children[0];\n // 解析检索条件\n await fmNode.component.exposed\n .validate()\n .then(async () => {\n // 拼接查询条件\n const filter = fmNode.props.model;\n // console.log(filter);\n // console.log(formList);\n const filterConditions = searchCombined(formList, filter, tabNode);\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 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('form object is null', 'error');\n return false;\n }\n let result = {};\n const condition = combined(tabNode, data);\n // console.log(JSON.stringify(filterConditions));\n // update: 保存查询条件、方法至table对象,为分页组件使用 2022-04-18\n\n tabNode.filterConditions = condition;\n tabNode.fetch = fetch;\n tabNode.startLoading();\n await fetch(condition)\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) => {\n if (x?.type?.name === '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 tabNode.stopLoading();\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 tabNode?.exposed?.startLoading();\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 tabNode?.exposed?.stopLoading();\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: 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 false;\n }\n if (result === null || result === undefined)\n // Notify.message('结果对象为空', 'error');\n return false;\n\n if (Array.isArray(result)) searchData.records.splice(0, 0, ...result);\n else\n // if (searchData.records === undefined)\n // result['rownums'] = 0;\n // else\n // if (!searchData.records[0])\n // result['rownums'] = 0;\n // else\n // result['rownums'] = (searchData.records[0].rownums - 1);\n 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)\n // Notify.message('结果对象为空', 'error');\n 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\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 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: 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 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 const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang') || 'zh-CN';\n if (Object.keys(rowData).length !== 0)\n formList.forEach((x) => {\n if (rowData[x.field] !== 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 (rowData[x.field] !== null && typeof rowData[x.field] === 'object') x.value = rowData[x.field].c;\n else x.value = rowData[x.field];\n break;\n case 'date':\n if (x.dateType === 'daterange') x.value = rowData[x.field] ? rowData[x.field].split(',') : null;\n else x.value = rowData[x.field];\n break;\n case 'datetime':\n if (x.dateType === 'datetimerange') x.value = rowData[x.field] ? rowData[x.field].split(',') : null;\n else x.value = rowData[x.field];\n break;\n case 'time':\n if (x.dateType === 'timerange') x.value = rowData[x.field] ? rowData[x.field].split(',') : null;\n else x.value = rowData[x.field];\n break;\n case 'layer':\n if (Array.isArray(rowData[x.field])) x.value = rowData[x.field];\n else if (rowData[x.field]) {\n const arr = rowData[x.field].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] === rowData[x.field] + '') {\n x.value = rowData[x.field];\n x.showLabel = itemChild[1];\n break;\n }\n }\n }\n } else if (x.multiple)\n if (rowData[x.field] !== null) {\n // 多选字典\n if (typeof rowData[x.field] === 'object') {\n const dictObj = rowData[x.field];\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 rowData[x.field] === 'string') {\n const c = rowData[x.field];\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 = rowData[x.field];\n else if (rowData[x.field] !== null && typeof rowData[x.field] === 'object') {\n const dictObj = rowData[x.field];\n const code = String(dictObj.c ?? '');\n const label = getDictDisplayLabel(dictObj, lang);\n x.value = { value: code, label };\n x.showLabel = label;\n } else x.value = rowData[x.field];\n\n break;\n default:\n x.value = rowData[x.field];\n break;\n }\n });\n // formList = newList;\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\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-04 21:55:57\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 { ElButton, ElButtonGroup, ElCheckbox, ElDivider, ElPagination, ElPopover, ElRadio, ElRadioGroup, ElTable, ElTableColumn, ElTooltip, ElTree, type TableInstance } from 'element-plus';\n import { computed, defineComponent, getCurrentInstance, nextTick, onMounted, ref, 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 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 // emit\n setup(props, { slots, expose }) {\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\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 const sTableFetch = props.tableFetch;\n let sPageSize = props.pageSize;\n const sDataLoaded = false; // 列表内容是否加载完成\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 popoverSearchList = 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 const renderMap = {}; // render是否加载过\n const columnSums: string[] = []; // 合计列\n const columnSumsDecimal: number[] = []; // 合计列位数\n const isIndeterminate = ref([]); // 表头筛选全选\n const scrollLeft = 0; // 列表横向滚动条\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 /**\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 <label>\n <GvInput\n placeholder={`${t('table.tableSearch')}(+)..`}\n prefixIcon=\"gv-icon-sousuo\"\n size=\"small\"\n class=\"gv-table__search-input\"\n onInput={handleTableSearchInput}></GvInput>\n </label>\n </div>\n ) : null;\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').style.width;\n const clientWidth = document.body.clientWidth - 200 - 20;\n for (let i = 0; i < popOvers.length; i++)\n if (popOvers[i].style.display !== 'none')\n if (parseInt(rootEl.querySelector('.el-table__body-wrapper').scrollLeft))\n popOvers[i].style.left = parseInt(tableBodyWidth) - clientWidth + parseInt(popOvers[i].style.left) - parseInt(rootEl.querySelector('.el-table__body-wrapper').scrollLeft) + 'px';\n else popOvers[i].style.left = parseInt(popOvers[i].style.left) - parseInt(rootEl.querySelector('.el-table__body-wrapper').scrollLeft) + 'px';\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=\"small\"\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=\"small\"\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) => {\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=\"small\"\n onInput={handleColumnFilter}\n vref={prop}></GvInput>\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size=\"small\"\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size=\"small\"\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=\"small\"\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=\"small\"\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size=\"small\"\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=\"small\"\n disabled=\"true\"\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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=\"small\"\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: 合并表格行或合并列方法\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 // on-row-dblclick={props.handleRowDblClick} // 设置行双击事件方法\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: 2px;\n\n :deep(.gv-table__search-input) {\n // top: -30px;\n float: right;\n width: 150px;\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: 13px;\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 + .ht-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .ht-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-05-18 14:26:43\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-03 14:21:05\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 const classNames = targetNode ? [...targetNode.classList] : [];\n if (classNames.includes('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: 13px;\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-05-29 09:38:07\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","setIconStyle","replace","checkPerms","pm","slot","split","x","indexOf","length","arr","handleClick","exposed","resetFields","rootForm","originFormList","formList","Array","index","filtercode","showLabel","dateType","model","field","rootEl","el","dateRangeSingles","querySelectorAll","startInput","querySelector","endInput","click","then","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","useI18n","datepickerSize","sType","DatePicker","ElDatePicker","shortcuts","isEn","mergedDisabledDate","includes","getTime","handleFocus","handleCalendarChange","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","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","returnIcon","ElDrawer","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","handleInput","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","inputShowLabel","inputFilterable","selectValue","originOptions","className","dicSrc","toLowerCase","valueCache","Map","selectSize","c","op","push","getOptionValue","row","cached","get","obj","set","getSelectCode","getSelectLabel","o","mergeOptionsWithSelected","_opts","merged","append","sv","pushDefaultOption","getSelectOptions","src","xx","arr2","dictCache","dict","getDictDivision","cache","addDictCache","getDict","opts","RegExp","test","filterMethod","initialRemoteLoaded","pendingRemoteQuery","pendingRemotePromise","remoteRequestSeq","filterOriginOptions","remoteDictSearch","requestSeq","sDicType","substring","datas","ops","JSON","parse","console","log","remoteMethod","q","filtered","handleVisibleChange","renderSelectOption","l1","l2","ElOption","renderTableOption","columnTexts","multiColumn","v1","mm","m2","m4","vv1","mmm","mm2","mm4","labelArr","opArr","raw","ElSelect","GvSelectPlugin","GvSelect","columnKey","require","switchType","newStatus","ElSwitch","GvSwitchPlugin","GvSwitch","TimePicker","ElTimePicker","isRange","disabledHours","disabledMinutes","disabledSeconds","timepickerSize","mergedDisabledHours","mergedDisabledMinutes","mergedDisabledSeconds","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","vm","$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","onFocus","ElRadioGroup","_slot2","ElRadio","ElRadioButton","vv","toolText","_resolveComponent","getItems","sRootEl","tabPane","offsetTop","classList","contains","clearFormValidate","clearValidate","setFormStyle","formStyle1","lastIndexOf","parseInt","clientWidth","init","formModel","formRule","difference","diff","fieldObj","oldObj","fieldObjKeys","key2","nextProps","prevProps","deep","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","saveCombined","fetchData","fetch","submit","hasMsg","fetchTable","checkForms","fmNodes","fmNode","childList","save","check","fmInnerNode","rawFmChildren","fmChildList","conditions","update","search","searchInputNode","tableEl","tableHeader","tableFixedHeader","columns","h","columnsFixed","lenFixed","searchNoFm","toNewPageSearch","trans","insertResult","searchData","updateResult","rownums","currentRow","removeResult","getDictDisplayLabel","dictObj","_c","_f","_e","_d","_i","_h","_g","_k","_j","crud","rowData","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","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","trim","getTableSearch","handlePopoverShow","popOvers","tableBodyWidth","style","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","overflow","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","onClick","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","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","find","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","tagName","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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"}