guava-ui 0.2.7 → 0.2.9
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.
- package/README.md +13 -0
- package/lib/guava-ui.es.js +3841 -3644
- package/lib/guava-ui.es.js.map +1 -1
- package/lib/guava-ui.umd.js +2 -2
- package/lib/guava-ui.umd.js.map +1 -1
- package/lib/index.css +1 -1
- package/lib/types/index.d.ts +168 -74
- package/package.json +1 -1
package/lib/guava-ui.umd.js.map
CHANGED
|
@@ -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-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-08 08:39:36\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-08 08:58:59\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\n // @method\n\n const isEmptyLabel = (label: unknown) => label == null || label === '';\n\n const getDictItemLabel = (item: DicItem): string => {\n switch (locale.value) {\n case 'en':\n return item.e ?? item.t ?? '';\n case 'l1':\n return item.l1 ?? item.t ?? '';\n case 'l2':\n return item.l2 ?? item.t ?? '';\n default:\n return item.t ?? '';\n }\n };\n\n const formatOptionLabel = (label: string) => {\n if (!label) return '';\n return remote.value && label.includes('[') ? label.split('[')[0] : label;\n };\n\n const findLabelInOptions = (code: string, opts: DicItem[]) => {\n const item = opts.find((x) => String(x.c) === String(code));\n if (!item) return '';\n return formatOptionLabel(getDictItemLabel(item));\n };\n\n const getOptionValue = (code: string, label: string, row?: Record<string, unknown>) => {\n const key = String(code);\n const text = String(label || key);\n const cached = valueCache.get(key);\n if (cached && cached.label === text) {\n if (row) cached.row = row;\n return cached;\n }\n const obj = row ? { value: key, label: text, row } : { value: key, label: text };\n valueCache.set(key, obj);\n return obj;\n };\n\n const getSelectCode = (v: unknown) => {\n if (v == null || v === '') return '';\n if (typeof v === 'object' && !Array.isArray(v)) 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 const ensureDefaultOption = (code: string, text: string) => {\n if (!code) return;\n const existed = options.value.find((x) => String(x.c) === String(code));\n if (existed) {\n if (text && existed.t !== text) existed.t = text;\n return;\n }\n pushDefaultOption({ c: code, t: text || code, s: '' } as DicItem);\n };\n\n const resolveDisplayLabel = async (code: string, hint?: string): Promise<string> => {\n if (hint && hint !== code) return hint;\n\n const localOpts = (await getSelectOptions()) ?? [];\n let label = findLabelInOptions(code, localOpts);\n if (label) return label;\n\n label = findLabelInOptions(code, options.value);\n if (label) return label;\n\n if (remote.value && code) {\n await remoteDictSearch(code);\n label = findLabelInOptions(code, options.value);\n if (label) return label;\n await remoteDictSearch('');\n label = findLabelInOptions(code, options.value);\n }\n\n return label || code;\n };\n\n const applySelectValue = async (raw: unknown) => {\n inputValue.value = raw as typeof inputValue.value;\n if (raw == null || raw === '') {\n selectValue.value = raw as typeof selectValue.value;\n return;\n }\n\n if (Array.isArray(raw)) {\n const resolved: ReturnType<typeof getOptionValue>[] = [];\n for (let index = 0; index < raw.length; index++) {\n const item = raw[index];\n if (item === '') continue;\n const code = getSelectCode(item);\n let hint = getSelectLabel(item);\n if (isEmptyLabel(hint) || hint === code) {\n const showLbl = Array.isArray(props.showLabel) ? props.showLabel[index] : undefined;\n if (showLbl && showLbl !== code) hint = String(showLbl);\n }\n const text = await resolveDisplayLabel(code, isEmptyLabel(hint) || hint === code ? undefined : hint);\n const row = typeof item === 'object' && item !== null ? ((item as Record<string, unknown>).row as Record<string, unknown>) : undefined;\n resolved.push(getOptionValue(code, text, row));\n ensureDefaultOption(code, text);\n }\n selectValue.value = resolved;\n return;\n }\n\n const code = getSelectCode(raw);\n let hint = '';\n if (typeof raw === 'object' && raw !== null) {\n const o = raw as Record<string, unknown>;\n hint = String(o.label ?? o.v ?? '');\n } else if (typeof props.showLabel === 'string') hint = props.showLabel;\n const text = await resolveDisplayLabel(code, isEmptyLabel(hint) || hint === code ? undefined : hint);\n const row = typeof raw === 'object' && raw !== null ? ((raw as Record<string, unknown>).row as Record<string, unknown>) : undefined;\n selectValue.value = getOptionValue(code, text, row);\n ensureDefaultOption(code, text);\n };\n\n watch(\n () => props.value,\n (newValue) => {\n void applySelectValue(newValue);\n },\n { deep: true },\n );\n\n watch(\n () => props.showLabel,\n (newVal) => {\n inputShowLabel.value = newVal;\n if (inputValue.value) void applySelectValue(props.value ?? inputValue.value);\n },\n );\n\n /**\n * @todo: handle focus event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:35\n * @param {*} event\n */\n const handleFocus = (event: FocusEvent) => {\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n if (remote.value === false)\n if (_opts === undefined || _opts === null || _opts.length === 0) {\n alert('The dict value does not exist', 'warning');\n return false;\n }\n options.value = _opts;\n });\n emit('focus', event);\n };\n\n /**\n * @todo: handle visible change event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:25:38\n * @param {*} val\n */\n const handleVisibleChange = () => {\n // console.log(val);\n };\n\n const handleBlur = () => {\n // // add: 解决无法重新加载问题 2022-04-10\n // if (this.remote === false)\n // this.getSelectOptions().then((_opts) => {\n // this.options = _opts;\n // });\n // else\n // this.options = this.originOptions;\n };\n\n /**\n * @todo: render select option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:37:58\n * @param {*} x\n */\n const renderSelectOption = (x: DicItem) => {\n let t = x.t;\n switch (lang) {\n case 'zh-CN':\n t = x.t;\n break;\n case 'en':\n t = x.e;\n break;\n case 'l1':\n t = x.l1;\n break;\n case 'l2':\n t = x.l2;\n break;\n default:\n t = x.t;\n break;\n }\n if (!t) t = x.t;\n return (\n <ElOption\n key={x.c + ''}\n label={t}\n value={getOptionValue(x.c + '', t ?? '')}>\n <span class=\"gv-select__option--label\">{t}</span>\n <span class=\"gv-select__option--value\">{x.c}</span>\n </ElOption>\n );\n };\n\n /**\n * @todo: render table option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:44:34\n * @param {*} x\n */\n const renderTableOption = (x: DicItem) => {\n const t = x.t;\n let val = t;\n const columnTexts: string[] = [];\n const row: Record<string, string> = {};\n let multiColumn = false;\n if (t) {\n if (t.indexOf('[') !== -1) {\n // 多列显示\n multiColumn = true;\n const v1 = t.split('[');\n val = v1[0];\n let mm = v1[1];\n mm = mm.split(']')[0];\n const m2 = mm.split(',');\n for (let i = 0; i < m2.length; i++) {\n const m3 = m2[i];\n const m4 = m3.split(':');\n row[m4[0]] = m4[1];\n columnTexts.push(m4[1] === 'null' ? ' -- ' : m4[1]);\n }\n }\n if (t.indexOf('{') !== -1) {\n // 隐藏列\n const vv1 = t.split('{');\n if (multiColumn === false) val = vv1[0];\n let mmm = vv1[1];\n mmm = mmm.split('}')[0];\n const mm2 = mmm.split(',');\n for (let i = 0; i < mm2.length; i++) {\n const mm3 = mm2[i];\n const mm4 = mm3.split(':');\n row[mm4[0]] = mm4[1];\n }\n }\n }\n let key = x.c + '';\n if (props.multiple === true) key = x.val === undefined ? x.c + '' : String(x.val);\n return (\n <ElOption\n key={key}\n label={val}\n value={getOptionValue(x.c + '', val ?? '', row)}>\n <span class=\"gv-select__option--label\">{val}</span>\n <span class=\"gv-select__option--value\">{x.c}</span>\n {columnTexts.map((text, index) => (\n <span\n key={index}\n class=\"gv-select__option--column\">\n {text}\n </span>\n ))}\n </ElOption>\n );\n };\n\n /**\n * @todo: selected call back\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:27:07\n * @param {*} val\n */\n const handleChange = async (val: any) => {\n if (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 void applySelectValue(props.value);\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-08 09:26:28\n * @version: 1.1.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 { 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 let v = '';\n switch (lang) {\n case 'zh-CN':\n v = x.t;\n break;\n case 'en':\n v = x.e;\n break;\n case 'l1':\n v = x.l1;\n break;\n case 'l2':\n v = x.l2;\n break;\n default:\n v = x.t;\n break;\n }\n if (!v) v = x.t;\n return v;\n };\n /**\n * @todo: set divider show status\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 18:12:34\n * @param {*} show\n */\n const setDividerShow = (show: boolean) => {\n isShow.value = show;\n };\n\n const getEditBar = computed(() => {\n if (slots.editbar?.())\n return (\n <ElRow\n ref-form={props.refForm}\n class=\"gv-form-editbar\">\n {slots.editbar?.()}\n </ElRow>\n );\n else return null;\n });\n\n const getDivider = computed(() => {\n let dividerRender: VNode | null = null;\n if (searchDivider.value !== false) {\n let dividerTitle: string;\n if (props.divider) dividerTitle = props.divider;\n else dividerTitle = t('common.dividerTitle');\n if (props.isDivider)\n dividerRender = (\n <GvDivider\n label={dividerTitle}\n target={props.refForm}\n visible={isShow.value}\n onSetDividerShow={setDividerShow}\n />\n );\n }\n\n return dividerRender;\n });\n\n /**\n * @todo: get dic item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 18:13:06\n * @param {*} src\n */\n const getDictItems = (src: string): DicItem[] => {\n let ret = [] as DicItem[];\n const dictCacheTmp: DicItem[] | undefined = dictCache.value?.[src];\n if (dictCacheTmp) ret = dictCacheTmp;\n else {\n // 生成字典列表\n const dictTmp: DicItem[] | undefined = dict.value[src];\n if (dictTmp) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dictTmp;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n\n ret = dictTmp;\n }\n }\n return ret;\n };\n /**\n * @todo: generate form item rules\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 20:31:59\n * @param {*} _item\n */\n const getItemRules = (_item: FormItem): FormItemRule[] => {\n const rules: FormItemRule[] = [];\n const format: FormItemFormat | undefined = _item.format;\n // 富文本不校验\n if (_item.type === 'richtext') return rules;\n if (!format) return rules;\n // ========== 必填校验 ==========\n const requiredFlag = Number(format[0]);\n if (requiredFlag === 1 && !_item.hidden)\n rules.push({\n required: true,\n message: `${t('common.pleaseInput')} ${_item.label ?? ''}`,\n trigger: 'blur',\n });\n // ========== 自定义校验 ==========\n let validateKey = 'isAny';\n if (format[1]) validateKey = toHump(String(format[1]));\n const maxLen = Number(format[2] ?? 30);\n const decimal = format.length >= 4 ? Number(format[3] ?? 0) : 0;\n const validator = gvValidate[validateKey as keyof typeof gvValidate];\n if (validator && validateKey !== 'isAny')\n rules.push({\n validator: validator,\n trigger: ['change', 'blur'],\n // Element Plus 透传参数(自定义字段)\n language: userStore.language,\n max: maxLen,\n decimal,\n } as FormItemRule);\n // ========== 长度校验 ==========\n const excluded = ['isDate', 'isDateTime', 'isTime', 'isDic'];\n if (format[2] && !excluded.includes(validateKey))\n rules.push({\n language: userStore.language,\n max: maxLen,\n validator: gvValidate['isLength'],\n trigger: ['change', 'blur'],\n } as FormItemRule);\n return rules;\n };\n const handleRadioInput = (event: any, field: string, val, formVal, disabled) => {\n if (disabled) return;\n if (val === formVal) {\n event.preventDefault();\n model.value[field] = '';\n }\n };\n const handleDateRange2Focus = (vm: any) => {\n sleep(100).then(() => {\n addClass(vm.$el.closest('.gv-daterange__single'), 'is-active');\n });\n };\n const handleDateRange2Blur = (vm: any) => {\n removeClass(vm.$el.closest('.gv-daterange__single'), 'is-active');\n };\n\n /**\n * @todo: 日期范围选择,单独选择开始日期、结束日期选择回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 19:49:03\n * @param {*} type\n * @param {*} val\n * @param {*} field\n */\n const handleDateRange2Change = (type: string, val: string | Date, field: string): void => {\n // 校验开始日期和结束日期大小\n if (type === 's')\n if (val && model.value[field + '-end']) {\n const endTime = new Date(model.value[field + '-end'] as string).getTime();\n const startTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model.value[field + '-end'] = '';\n model.value[1] = 'null';\n }\n }\n\n if (type === 'e')\n if (val && model.value[field + '-start']) {\n const startTime = new Date(model.value[field + '-start'] as string).getTime();\n const endTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model.value[field + '-start'] = '';\n // console.log(this.model);\n model.value[1] = 'null';\n }\n }\n\n if (!field) return;\n const datePicker = model.value[field];\n let dateArr = new Array(2);\n if (Array.isArray(datePicker)) {\n if (type === 's') datePicker[0] = val;\n else datePicker[1] = val;\n if (!datePicker[0]) datePicker[0] = 'null';\n if (!datePicker[1]) datePicker[1] = 'null';\n model.value[field] = datePicker.join(',');\n } else {\n if (datePicker && typeof datePicker === 'string') dateArr = datePicker.split(',');\n dateArr[0] = model.value[field + '-start'];\n dateArr[1] = model.value[field + '-end'];\n if (!dateArr[0]) dateArr[0] = 'null';\n if (!dateArr[1]) dateArr[1] = 'null';\n model.value[field] = dateArr.join(',');\n }\n };\n /**\n * @todo: switch框字典change回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-12-21 16:47:22\n * @param {*} val\n * @param {*} field\n * @param {*} dicType\n * @param {*} cb\n */\n const handleSwitchDictChange = async (val, field, dicType, cb) => {\n switch (dicType) {\n case 'yxzt':\n if (val === true) model.value[field] = '100201';\n else model.value[field] = '100202';\n break;\n case 'sf':\n if (val === true) model.value[field] = '100101';\n else model.value[field] = '100102';\n break;\n }\n if (cb)\n try {\n await cb(val, field, dicType);\n } catch (error) {\n console.log(error);\n }\n };\n /**\n * @todo: radio框字典change回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-22 15:50:15\n * @param {*} val\n * @param {*} field\n * @param {*} dicType\n * @param {*} cb\n */\n const handleRadioDictChange = async (val, field, dicType: string | undefined, cb: Fn | undefined) => {\n if (cb)\n try {\n await cb(val, field, dicType);\n } catch (error) {\n console.log(error);\n }\n };\n /**\n * @todo: 查询 form 列默认折叠 class(渲染时绑定,避免重渲染丢失)\n */\n const getSearchColClass = (index: number) => {\n if (formType.value !== 's' || !searchFieldsCollapsed.value) return undefined;\n const slot = slots.default?.()?.[0];\n const slotProps = slot?.props as Recordable | undefined;\n if (slotProps?.expand === false) return undefined;\n const showDefaultRow = appStore.searchFormRows === 1 ? 4 : 8;\n if (index >= showDefaultRow - 1) return 'gv-form-col--hidden';\n return undefined;\n };\n\n /**\n * @todo: render form item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:54:23\n * @param {*} _item\n * @param {*} _index\n */\n const renderFormItem = (_item: FormItem, _index: number): VNode => {\n const {\n type = 'text',\n label,\n field,\n hidden = false,\n disabled,\n format = [],\n placeholder,\n readonly = false,\n dateType = 'date',\n dicType,\n filtercode,\n colspan = 1,\n disabledDateFunc,\n disabledDate,\n editable = true,\n multiple = false,\n showLabel,\n size = formSize.value,\n visible = true,\n // offset,\n createRow = false, // 是否创建新row,\n dicRemote,\n cb, // 回调方法\n clear, // 清空回调\n rows, // textarea\n autosize, // textarea\n min, // input-number\n max, // input-number\n step, // input-number\n precision, // input-number\n blur = () => {},\n suffixIcon, // 后缀icon\n prefixIcon, // 前缀icon\n focus = () => {},\n change = () => {},\n defaultTime, // 时间的默认能够选择的时间\n isreload = true, // 表选字典是否重新加载\n options = [],\n lazy = false, // cascader是否懒加载\n lazyLoad = () => {}, // cascader懒加载方法\n render, // 自定义form样式\n } = _item;\n let renders;\n const isHidden = hidden === true;\n const maxLen = format[2] || 30;\n let cType = type;\n // const dateFormatConfig = dateFormatConfig;\n const validateRule = toHump(String(format[1] || ''));\n let sDateType = dateType;\n let isRange = false;\n let dateFormat = dateFormatConfig.date.valueFormat; // 日期显示格式\n let valueFormat = dateFormatConfig.date.valueFormat; // 日期绑定值格式\n if (sDateType !== 'daterange' && sDateType !== 'datetimerange' && sDateType !== 'daterange2' && sDateType !== 'datetimerange2') {\n if (validateRule === 'isDate') cType = 'date';\n if (validateRule === 'isDateTime') {\n cType = 'datetime';\n sDateType = 'datetime';\n }\n if (validateRule === 'isTime') cType = 'time';\n }\n\n if (sDateType === 'timerange') isRange = true;\n\n let ph = placeholder;\n let startPh = t('common.startDate');\n let endPh = t('common.endDate');\n // todo: 响应式布局计算\n // const cols = { span: colspan, offset: (_index) * 6 };\n let cols = colspan > 4 ? 4 : colspan; // fixme: 最大值不能超过4 2022-04-07\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') cols = 2;\n // update: 对于多选字典,默认占用列数为2列 2023-02-18\n if (multiple === true && colspan === undefined) cols = 2;\n let rangeSeparator;\n if (sDateType === 'timerange' || sDateType === 'daterange2' || sDateType === 'datetimerange2') rangeSeparator = t('common.until');\n const colSpanXs = 24;\n let colSpanSm = 12;\n let colSpanMd = 8;\n\n let colSpanLg = 6;\n if (isDialog.value === true) colSpanLg = 8;\n let colSpanXl = 4;\n if (isDialog.value === true) colSpanXl = 6;\n if (colSpanNums.value !== 0) {\n if (colSpanNums.value === 12) cols = colspan > 2 ? 2 : colspan;\n if (colSpanNums.value === 8) cols = colspan > 3 ? 3 : colspan;\n if (colSpanNums.value === 6 || colSpanNums.value === 4) cols = colspan > 4 ? 4 : colspan;\n colSpanSm = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanMd = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanLg = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanXl = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n } else {\n colSpanSm = cols * colSpanSm > 24 ? 24 : cols * colSpanSm;\n colSpanMd = cols * colSpanMd > 24 ? 24 : cols * colSpanMd;\n colSpanLg = cols * colSpanLg > 24 ? 24 : cols * colSpanLg;\n colSpanXl = cols * colSpanXl > 24 ? 24 : cols * colSpanXl;\n }\n let decimal = 2;\n let v = '';\n if (!ph)\n switch (validateRule) {\n case 'isMoney':\n ph = '0.00';\n break;\n case 'isBigMoney':\n ph = '0,000.00';\n break;\n case 'isEmail':\n ph = 'xx@xx.com';\n break;\n case 'isDouble':\n if (format.length >= 4) decimal = format[3] || 2;\n while (decimal > 0) {\n v = '0' + v;\n decimal--;\n }\n ph = '00.' + v;\n break;\n case 'isDate':\n if (sDateType === 'week') {\n ph = t('common.selectWeek'); // dateFormatConfig.week.placeholder;\n dateFormat = dateFormatConfig.week.dateFormat;\n } else if (sDateType === 'month' || sDateType === 'monthrange') {\n ph = t('common.selectMonth'); // dateFormatConfig.month.placeholder;\n startPh = ph;\n endPh = ph;\n dateFormat = dateFormatConfig.month.dateFormat;\n valueFormat = dateFormatConfig.month.valueFormat;\n } else if (sDateType === 'year') {\n ph = t('common.selectYear'); // dateFormatConfig.year.placeholder\n dateFormat = dateFormatConfig.year.dateFormat;\n valueFormat = dateFormatConfig.year.valueFormat;\n } else if (sDateType === 'daterange' || sDateType === 'daterange2') ph = t('common.selectDate');\n break;\n case 'isDateTime':\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') {\n startPh = t('common.startTime');\n endPh = t('common.endTime');\n }\n ph = t('common.selectTime'); // dateFormatConfig.datetime.placeholder;\n dateFormat = dateFormatConfig.datetime.dateFormat;\n valueFormat = dateFormatConfig.datetime.valueFormat;\n break;\n }\n let editables = editable;\n // 如果是带有禁用日期的,不可编辑,防止输入不一致问题\n if (disabledDateFunc || disabledDate) editables = false;\n let ops;\n let isTableDic = false;\n if (type === 'dic')\n if (dicType) {\n ops = getDictItems(dicType);\n if (dicType.indexOf('t#') >= 0) isTableDic = true;\n }\n\n // 设置label是否显示\n let sLabel = label;\n if (formType.value === 's') {\n sLabel = appStore.searchFormLabel === true ? label : undefined;\n if (appStore.searchFormLabel !== true) ph = label;\n }\n\n const switchDefaultVal = ref('');\n const searchColClass = getSearchColClass(_index);\n switch (cType) {\n case 'blank':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n prop={field}\n key={field}>\n <div class=\"el-input__inner gv-form__item__inner-blank\"> </div>\n </ElFormItem>\n </ElCol>\n );\n break;\n case 'divider':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={24}\n sm={24}\n md={24}\n lg={24}\n xl={24}>\n <GvDivider label={sLabel} />\n </ElCol>\n );\n break;\n case 'render':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n {render?.(model.value[field], field)}\n </ElFormItem>\n </ElCol>\n );\n break;\n case 'text':\n renders = visible ? (\n // span={this.colSpan} {span:16,offset:4}\n // xs={24} sm={12} md={8} lg={6} xl={4}\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInput\n type=\"text\"\n vref={field}\n name={field}\n v-model={model.value[field]}\n value={model.value[field]}\n disabled={disabled}\n maxlength={maxLen}\n size={size as ComponentSize}\n placeholder={ph}\n visible={visible}\n readonly={readonly}\n onBlur={blur}\n onFocus={focus}\n suffixIcon={suffixIcon}\n prefixIcon={prefixIcon}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'textarea':\n renders = visible ? (\n // span={this.colSpan} {span:16,offset:4}\n // xs={24} sm={12} md={8} lg={6} xl={4}\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInput\n vref={field}\n name={field}\n type=\"textarea\"\n v-model={model.value[field]}\n value={model.value[field]}\n size={size as ComponentSize}\n disabled={disabled}\n maxlength={maxLen}\n placeholder={ph}\n visible={visible}\n readonly={readonly}\n rows={rows}\n autosize={autosize}\n onBlur={blur}\n onFocus={focus}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'time':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvTimePicker\n v-model={model.value[field]}\n vref={field}\n name={field}\n disabled={disabled}\n editable={editables}\n placeholder={ph}\n isRange={isRange}\n rangeSeparator={rangeSeparator}\n // format={dateFormat}\n // value-format={valueFormat}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'date':\n case 'datetime':\n if (sDateType !== 'daterange2' && sDateType !== 'datetimerange2')\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <GvDatePicker\n v-model={model.value[field]}\n modelValue={model.value[field]}\n vref={field}\n data-name={field}\n data-align={'right'}\n type={sDateType}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={disabledDate}\n editable={editables}\n placeholder={ph}\n default-time={defaultTime}\n startPlaceholder={startPh}\n endPlaceholder={endPh}\n data-visible={visible}\n onChange={change}\n />\n </ElFormItem>\n </ElCol>\n ) : null;\n else\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <div\n class=\"gv-daterange__single\"\n style=\"width: 100%;\"\n onFocus={() => void 0}>\n <GvDatePicker\n v-model={model.value[field + '-start']}\n modelValue={model.value[field + '-start']}\n vref={field + '-start'}\n data-name={field + '-start'}\n data-align={'right'}\n type={sDateType === 'daterange2' ? 'date' : 'datetime'}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={disabledDate}\n editable={editables}\n placeholder={startPh}\n default-time={defaultTime}\n data-visible={visible}\n style={{ width: '96% !important' }}\n class=\"gv-datepicker-range-start\"\n onChange={(val) => handleDateRange2Change('s', val, field)}\n onFocus={(vm) => handleDateRange2Focus(vm)}\n onBlur={(vm) => handleDateRange2Blur(vm)}\n />\n <span class=\"gv-daterange__single-separator\">{rangeSeparator}</span>\n <GvDatePicker\n v-model={model.value[field + '-end']}\n modelValue={model.value[field + '-end'] as string}\n vref={field + '-end'}\n data-name={field + '-end'}\n data-align={'right'}\n type={sDateType === 'daterange2' ? 'date' : 'datetime'}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={(date) => {\n if (sDateType === 'daterange2') return date.getTime() <= new Date(model.value[field + '-start']).getTime() - 8.64e7;\n else return date.getTime() <= new Date(model.value[field + '-start']).getTime() - 8.64e7;\n }}\n editable={editables}\n placeholder={endPh}\n default-time={defaultTime}\n data-visible={visible}\n class=\"gv-datepicker-range-end\"\n onChange={(val) => handleDateRange2Change('e', val, field)}\n onFocus={(vm) => handleDateRange2Focus(vm)}\n onBlur={(vm) => handleDateRange2Blur(vm)}\n />\n </div>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'dic':\n switch (dicType) {\n case 'yxzt':\n if (typeof model.value[field] === 'object') switchDefaultVal.value = model.value[field].value ? model.value[field].value : '100201';\n else switchDefaultVal.value = model.value[field] ? model.value[field] : '100201';\n break;\n case 'sf':\n if (typeof model.value[field] === 'object') switchDefaultVal.value = model.value[field].value ? model.value[field].value : '100101';\n else switchDefaultVal.value = model.value[field] ? model.value[field] : '100101';\n break;\n }\n if (isTableDic === false && multiple === false && formType.value === 'e' && ops && ops.length === 2 && (dicType === 'sf' || dicType === 'yxzt'))\n // 当是编辑form并且字典内容只有2个以内时\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <GvSwitch\n value={switchDefaultVal.value}\n columnKey={field}\n disabled={disabled}\n target={dicType === 'yxzt' ? '100201' : '100101'}\n onChange={(val) => handleSwitchDictChange(val, field, dicType, cb)}></GvSwitch>\n </ElFormItem>\n </ElCol>\n ) : null;\n else if (isTableDic === false && multiple === false && formType.value === 'e' && ops && ops.length === 2) {\n const radioValue = ref(model.value[field].value ? model.value[field].value : model.value[field]);\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={radioValue.value}\n onChange={(val) => handleRadioDictChange(val, field, dicType, cb)}>\n {ops.map((x) =>\n format[0] === 0 ? (\n <ElRadio\n value={x.c}\n disabled={disabled}\n onChange={(event) => handleRadioInput(event, field, x.c, model.value[field], disabled)}>\n {getLanguage(userStore.language, x)}\n </ElRadio>\n ) : (\n <ElRadioButton\n value={x.c}\n disabled={disabled}>\n {getLanguage(userStore.language, x)}\n </ElRadioButton>\n ),\n )}\n </ElRadioGroup>\n </ElFormItem>\n </ElCol>\n ) : null;\n } else {\n // form dic\n let v: string | undefined;\n const vv = model.value[field];\n if (typeof vv === 'object')\n if (Array.isArray(vv))\n vv.forEach((x, index) => {\n if (x)\n if (v)\n if (x.label) v += ',' + x.label;\n else v += ',' + (showLabel?.[index] ? showLabel[index] : x);\n else if (x.label) v = x.label;\n else v = showLabel?.[index] ?? x;\n });\n else {\n if (vv) v = vv.label;\n }\n else v = vv;\n let toolText = v; // 提示的文本\n if (showLabel) toolText = showLabel as string;\n\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!v}\n content={toolText ? toolText + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvSelect\n v-model={model.value[field]}\n value={model.value[field]}\n label={label}\n showLabel={showLabel}\n vref={field}\n multiple={multiple}\n dicType={dicType ?? ''}\n size={size as ComponentSize}\n disabled={disabled}\n placeholder={ph}\n filtercode={filtercode}\n visible={visible}\n dicRemote={typeof dicRemote === 'function' ? dicRemote : undefined}\n cb={cb}\n clear={clear}\n isreload={isreload}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n }\n\n break;\n case 'number':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInputNumber\n vref={field}\n 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 < 762)\n // xs\n colSpanNums.value = 24;\n else if (width < 992)\n // sm\n colSpanNums.value = 12;\n else if (width < 1200)\n // md\n colSpanNums.value = 8;\n else if (width < 1920)\n // lg\n colSpanNums.value = 6;\n else colSpanNums.value = 4;\n\n rootNodeStyle.value['width'] = width + 'px';\n }\n if (height !== '100%' && height !== 0) {\n height = parseInt(height);\n rootNodeStyle.value['height'] = height + 'px';\n }\n } else rootNodeStyle.value['width'] = width;\n } else {\n const rootEl = instance?.vnode?.el as HTMLElement;\n const clientWidth = rootEl?.clientWidth;\n // console.log(clientWidth);\n if (clientWidth !== 0) {\n if (clientWidth < 762)\n // xs\n colSpanNums.value = 24;\n else if (clientWidth < 992)\n // sm\n colSpanNums.value = 12;\n else if (clientWidth < 1200)\n // md\n colSpanNums.value = 8;\n else if (clientWidth < 1920)\n // lg\n colSpanNums.value = 6;\n else colSpanNums.value = 4;\n\n rootNodeStyle.value['width'] = clientWidth + 'px';\n }\n }\n styles.value = formStyle1;\n };\n\n /**\n * @todo: form init\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 07:47:06\n * @param {*} type\n */\n const init = async (type: string) => {\n // alert(type);\n const formModel = {};\n const formRule = {};\n props.formList.forEach((item: FormItem) => {\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.value}\n size={formSize.value}\n inline={false}\n label-position={labelPosition.value}\n label-width={`${props.labelWidth}px`}\n rules={rules.value}\n style={{\n ...styles.value,\n width: '100%',\n maxHeight: sMaxHeight.value === 0 ? undefined : sMaxHeight.value + 'px',\n }}>\n <ElRow\n ref-form={props.refForm}\n style={{ display: 'flex', flexWrap: 'wrap' }}>\n {getItems.value}\n {slots.default?.() && <div style={{ flex: 1, minWidth: 1 }}>{slots.default?.()}</div>}\n </ElRow>\n </ElForm>\n </div>\n </Transition>\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-form';\n .#{$prefixCls} {\n width: 100%;\n\n .#{$prefixCls}-form-editbar {\n // editbar bottom\n // border-bottom:1px solid #d9d9d9;\n // editbar top\n // border-top:1px solid #d9d9d9;\n // border-top: 1.5px solid var(--primaryColorHover, $primaryColorHover);\n padding: 0 0 2px;\n margin-top: -3px;\n }\n\n .#{$prefixCls}-collapse-wrap {\n overflow: hidden;\n }\n\n .#{$prefixCls}-collapse__inner {\n transform-origin: center top;\n }\n\n .el-form {\n overflow: hidden 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-06-08 09:03:41\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRadioGroup, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { TRadioGroupValue } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('radio-group');\n\n export default defineComponent({\n name: 'GvRadioGroup',\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [String, Number, Boolean] as PropType<TRadioGroupValue>,\n default: undefined,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n },\n\n // @emits\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const radioValue = ref<TRadioGroupValue | undefined>(props.value ?? undefined);\n const radioGroupSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n radioValue.value = newVal;\n },\n );\n\n // @method\n const handleUpdate = (val: TRadioGroupValue) => {\n radioValue.value = val;\n emit('update:modelValue', val);\n };\n\n const handleChange = (val: TRadioGroupValue) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElRadioGroup\n class={prefixCls}\n aria-label={props.label}\n modelValue={radioValue.value}\n onUpdate:modelValue={handleUpdate}\n size={radioGroupSize.value}\n onChange={handleChange}>\n {slots.default?.()}\n </ElRadioGroup>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-radio-group';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvRadioGroup from './src/GvRadioGroup.vue';\n\nconst GvRadioGroupPlugin = {\n install(app: App): void {\n app.component(GvRadioGroup.name ?? 'GvRadioGroup', GvRadioGroup);\n },\n};\nexport default GvRadioGroupPlugin;\n\nexport { GvRadioGroup };\n","<!--\n * @title: row component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 09:49:52\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:36:24\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRow } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('row');\n\n export default defineComponent({\n name: 'GvRow',\n props: {\n gutter: {\n type: Number,\n default: 0,\n },\n tag: {\n type: String as PropType<string>,\n default: 'div',\n },\n },\n setup(props, { slots }) {\n return () => (\n <ElRow\n class={prefixCls}\n gutter={props.gutter}\n tag={props.tag}>\n {slots.default?.()}\n </ElRow>\n );\n },\n });\n</script>\n","import type { App } from 'vue';\nimport GvRow from './src/GvRow.vue';\n\nconst GvRowPlugin = {\n install(app: App): void {\n app.component(GvRow.name ?? 'GvRow', GvRow);\n },\n};\nexport default GvRowPlugin;\n\nexport { GvRow };\n","<!--\n * @title: screenfull\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:15:43\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-11-17 10:55:25\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { useFullscreen } from '@vueuse/core';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('screenfull');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { toggle, isFullscreen } = useFullscreen();\n\n const toggleFullscreen = () => {\n toggle();\n };\n</script>\n\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleFullscreen\">\n <GvIcon :icon-name=\"isFullscreen ? 'exit-fullscreen' : 'fullscreen'\" />\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-screenfull';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvScreenFull from './src/GvScreenFull.vue';\n// Define the install method on the GvButton component\nconst GvScreenFullPlugin = {\n install(app: App): void {\n app.component(GvScreenFull.name ?? 'GvScreenFull', GvScreenFull);\n },\n};\nexport default GvScreenFullPlugin;\n\nexport { GvScreenFull };\n","<!--\n * @title: search bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:02:29\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-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} \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} \n <GvIcon\n iconType=\"el\"\n iconName=\"arrowUp\"\n />\n </GvButton>\n );\n searchBar.push(shrink);\n }\n // }\n }\n return searchBar;\n });\n // @created\n\n // @render\n return () => <div class={prefixCls}>{createSearchBar.value}</div>;\n },\n });\n</script>\n<style scoped lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-search-bar';\n .#{$prefixCls} {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n padding-top: 0px;\n margin: 0 1px 6px 0;\n }\n</style>\n","import type { App } from 'vue';\nimport GvSearchBar from './src/GvSearchBar.vue';\n// Define the install method on the GvButton component\nconst GvSearchBarPlugin = {\n install(app: App): void {\n app.component(GvSearchBar.name ?? 'GvSearchBar', GvSearchBar);\n },\n};\nexport default GvSearchBarPlugin;\n\nexport { GvSearchBar };\n","import { ref, unref } from 'vue';\nimport { findPath } from '../../utils/gv.tree';\n\ntype OnlyOneChildType = AppRouteRecordRaw & { noShowingChildren?: boolean };\n\ninterface HasOneShowingChild {\n oneShowingChild?: boolean;\n onlyOneChild?: OnlyOneChildType;\n}\n\nexport const getAllParentPath = <T = Recordable>(treeData: T[], path: string) => {\n const menuList = findPath(treeData, (n) => n.path === path) as AppRouteRecordRaw[];\n return (menuList || []).map((item) => item.path);\n};\n\nexport const hasOneShowingChild = (parent: AppRouteRecordRaw, children: AppRouteRecordRaw[] = []): HasOneShowingChild => {\n const onlyOneChild = ref<OnlyOneChildType>();\n\n const showingChildren = children.filter((v) => {\n const meta = v.meta ?? {};\n if (meta.hidden) return false;\n else {\n // Temp set(will be used if only has one showing child)\n onlyOneChild.value = v;\n return true;\n }\n });\n\n // When there is only one child router, the child router is displayed by default\n if (showingChildren.length === 1)\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n\n // Show parent if there are no child router to display\n if (!showingChildren.length) {\n onlyOneChild.value = { ...parent, path: '', noShowingChildren: true };\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n }\n\n return {\n oneShowingChild: false,\n onlyOneChild: unref(onlyOneChild),\n };\n};\n","import { useI18n } from '@/hook/web/useI18n';\nimport type { RouteMeta } from 'vue-router';\nimport { GvIcon } from '../../../GvIcon';\nexport const useRenderMenuTitle = () => {\n const renderMenuTitle = (meta: RouteMeta) => {\n const { t } = useI18n();\n if (!meta) {\n return <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">No Title</span>;\n }\n const { title = 'Please set title', icon } = meta;\n\n return icon ? (\n <>\n <GvIcon\n iconName={meta.icon || ''}\n className=\"sub-el-icon\"></GvIcon>\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n </>\n ) : (\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n );\n };\n\n return {\n renderMenuTitle,\n };\n};\n","/*\n * @title: render menu item - useRenderMenuItem\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 15:07:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 14:34:07\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { useStyle } from '@/hook/web/useStyle';\nimport { isUrl, pathResolve } from '@@/utils';\nimport { ElMenuItem, ElSubMenu } from 'element-plus';\nimport { unref } from 'vue';\nimport { hasOneShowingChild } from '../helper';\nimport { useRenderMenuTitle } from './useRenderMenuTitle';\nconst { getPrefixCls } = useStyle();\nconst prefixCls = getPrefixCls('submenu');\n\nconst { renderMenuTitle } = useRenderMenuTitle();\n\nexport const useRenderMenuItem = (menuMode) =>\n // allRouters: AppRouteRecordRaw[] = [],\n {\n const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => {\n if (!routers || !routers.length) return null;\n return routers\n .filter((v) => !v.meta?.hidden)\n .map((v) => {\n const meta = v.meta ?? {};\n const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v, v.children);\n const fullPath = isUrl(v.path) ? String(v.path) : pathResolve(parentPath, v.path); // getAllParentPath<AppRouteRecordRaw>(allRouters, v.path).join('/')\n if (oneShowingChild && (!onlyOneChild?.children || onlyOneChild?.noShowingChildren) && !meta?.alwaysShow) {\n return (\n <ElMenuItem index={onlyOneChild ? pathResolve(fullPath, onlyOneChild.path) : fullPath}>\n {{\n default: () => renderMenuTitle(onlyOneChild ? (onlyOneChild.meta ?? meta) : meta),\n }}\n </ElMenuItem>\n );\n } else {\n return (\n <ElSubMenu\n index={fullPath}\n teleported\n class=\"nest-menu\"\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : ''}>\n {{\n title: () => renderMenuTitle(meta),\n default: () => renderMenuItem(v.children!, fullPath),\n }}\n </ElSubMenu>\n );\n }\n });\n };\n return {\n renderMenuItem,\n };\n };\n","<!--\n * @title: left menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-30 16:12:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 15:14:41\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { ElMenu, ElScrollbar } from 'element-plus';\n import { computed, defineComponent, unref, type PropType } from 'vue';\n import { useRenderMenuItem } from './components/useRenderMenuItem';\n\n import { useStyle } from '@/hook/web/useStyle';\n import { useRouter } from 'vue-router';\n import { isUrl } from '../../utils';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('sidebar');\n\n export default defineComponent({\n name: 'GvSidebar',\n props: {\n menuSelect: {\n type: Function as PropType<(index: string) => void>,\n default: undefined,\n },\n },\n setup(props) {\n const appStore = useAppStore();\n const layout = computed(() => appStore.getLayout);\n const { push, currentRoute } = useRouter();\n const permStore = usePermsStore();\n const menuMode = computed((): 'vertical' | 'horizontal' => {\n const vertical: LayoutType[] = ['default', 'topLeft', 'cutMenu'];\n\n if (vertical.includes(unref(layout))) return 'vertical';\n else return 'horizontal';\n });\n\n const routers = computed(() => (unref(layout) === 'cutMenu' ? permStore.getRouters : permStore.getRouters));\n\n // console.log(routers.value);\n\n const collapse = computed(() => appStore.getCollapseMenus);\n\n const leftMenuUniqueOpened = computed(() => appStore.getLeftMenuUniqueOpened);\n\n const activeMenu = computed(() => {\n const { meta, path } = unref(currentRoute);\n // if set path, the sidebar will highlight the path you set\n if (meta.activeMenu) return meta.activeMenu as string;\n\n return path;\n });\n\n const menuSelect = (index: string) => {\n props.menuSelect?.(index);\n\n // 自定义事件\n if (isUrl(index)) {\n window.open(index);\n return;\n }\n push(index);\n };\n\n const renderMenu = () => (\n <ElMenu\n defaultActive={unref(activeMenu)}\n mode={unref(menuMode)}\n collapse={unref(layout) === 'top' || unref(layout) === 'cutMenu' ? false : unref(collapse)}\n uniqueOpened={unref(layout) === 'top' ? false : unref(leftMenuUniqueOpened)}\n backgroundColor=\"var(--left-menu-bg-color)\"\n textColor=\"var(--left-menu-text-color)\"\n activeTextColor=\"var(--left-menu-text-active-color)\"\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : `${prefixCls}-popper--horizontal`}\n onSelect={menuSelect}>\n {{\n default: () => {\n const { renderMenuItem } = useRenderMenuItem(menuMode);\n // console.log('renderMenu', routers.value);\n return renderMenuItem(unref(routers));\n },\n }}\n </ElMenu>\n );\n const renderMenuWrap = () => {\n if (unref(layout) === 'top') return renderMenu();\n else return <ElScrollbar>{renderMenu()}</ElScrollbar>;\n };\n return () => (\n <div\n id=\"gv-sidebar\"\n class={[\n `${prefixCls} ${prefixCls}__${unref(menuMode)}`,\n 'h-[100%] overflow-hidden flex-col bg-[var(--left-menu-bg-color)]',\n {\n 'w-[var(--left-menu-min-width)]': unref(collapse) && unref(layout) !== 'cutMenu',\n 'w-[var(--left-menu-max-width)]': !unref(collapse) && unref(layout) !== 'cutMenu',\n },\n ]}>\n {renderMenuWrap()}\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-sidebar';\n\n .#{$prefixCls} {\n position: relative;\n transition: width var(--transition-time-02);\n\n :deep(.#{$elNamespace}-menu) {\n width: 100% !important;\n border-right: none;\n --el-menu-bg-color: var(--left-menu-bg-color);\n --el-menu-text-color: var(--left-menu-text-color);\n --el-menu-hover-text-color: var(--left-menu-text-active-color);\n --el-menu-active-color: var(--left-menu-text-active-color);\n --el-menu-hover-bg-color: var(--left-menu-hover-bg-color);\n\n // 设置选中时子标题的颜色\n .is-active {\n & > .#{$elNamespace}-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .#{$elNamespace}-sub-menu__title,\n .#{$elNamespace}-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-color) !important;\n }\n }\n\n // 设置选中时的高亮背景和高亮颜色\n .#{$elNamespace}-menu-item.is-active {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n }\n\n // 设置子菜单的背景颜色\n .#{$elNamespace}-menu {\n .#{$elNamespace}-sub-menu__title {\n background-color: var(--left-menu-bg-color) !important;\n }\n .#{$elNamespace}-menu-item:not(.is-active) {\n background-color: var(--left-menu-item-bg-light-color) !important;\n }\n }\n }\n\n // 折叠时的最小宽度\n :deep(.#{$elNamespace}-menu--collapse) {\n width: var(--left-menu-min-width);\n\n & > .is-active,\n & > .is-active > .#{$elNamespace}-sub-menu__title {\n position: relative;\n background-color: var(--left-menu-collapse-bg-active-color) !important;\n }\n }\n\n // 折叠动画的时候,就需要把文字给隐藏掉\n :deep(.horizontal-collapse-transition) {\n .#{$prefixCls}__title {\n display: none;\n }\n }\n\n // 水平菜单\n &__horizontal {\n height: calc(var(--top-tool-height)) !important;\n\n :deep(.#{$elNamespace}-menu--horizontal) {\n height: calc(var(--top-tool-height));\n border-bottom: none;\n // 重新设置底部高亮颜色\n & > .#{$elNamespace}-sub-menu.is-active {\n .#{$elNamespace}-sub-menu__title {\n border-bottom-color: var(--el-color-primary) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n\n &::after {\n display: none !important;\n }\n }\n\n .#{$prefixCls}__title {\n /* stylelint-disable-next-line */\n max-height: calc(var(--top-tool-height) - 2px) !important;\n /* stylelint-disable-next-line */\n line-height: calc(var(--top-tool-height) - 2px);\n }\n }\n }\n }\n</style>\n\n<style lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-sidebar-popper';\n\n .#{$prefixCls}--vertical,\n .#{$prefixCls}--horizontal {\n // 设置选中时子标题的颜色\n .is-active {\n & > .el-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .el-sub-menu__title,\n .el-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: #545658 !important;\n }\n }\n\n // 设置选中时的高亮背景\n .el-menu-item.is-active {\n position: relative;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n }\n\n $submenu-prefix-cls: '#{$gvNamespace}-submenu-popper';\n\n // 设置子菜单溢出时滚动样式\n .#{$submenu-prefix-cls}--vertical {\n max-height: 100%;\n overflow-y: auto;\n\n &::-webkit-scrollbar {\n width: 6px;\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgb(144 147 153 / 30%);\n border-radius: 4px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSidebar from './src/GvSidebar.vue';\n// Define the install method on the GvButton component\nconst GvSidebarPlugin = {\n install(app: App): void {\n app.component(GvSidebar.name ?? 'GvSidebar', GvSidebar);\n },\n};\nexport default GvSidebarPlugin;\n\nexport { GvSidebar };\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAABaCAYAAAAilKGMAAAACXBIWXMAAAZ2AAAGdgEpJm+AAAAKDGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuYTZhNjM5NjhhLCAyMDI0LzAzLzA2LTExOjUyOjA1ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmQxNjAxODBkLTVlZmUtZjc0MS1iY2RhLTdjMDBjNTc4ZTVkMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1ZDE1ZDUxNC05YzkxLTQwNTYtYTgzNS05YjZlYmRlOTQ5ZmEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB0aWZmOkltYWdlV2lkdGg9IjYzNiIgdGlmZjpJbWFnZUxlbmd0aD0iNjYwIiB0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb249IjIiIHRpZmY6U2FtcGxlc1BlclBpeGVsPSIzIiB0aWZmOlhSZXNvbHV0aW9uPSIxNDQvMSIgdGlmZjpZUmVzb2x1dGlvbj0iMTQ0LzEiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6RXhpZlZlcnNpb249IjAyMzEiIGV4aWY6Q29sb3JTcGFjZT0iNjU1MzUiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI2MzYiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSI2NjAiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTExLTI5VDEyOjQ4OjMzKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0yOVQxMjo0OToxNyswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjExIChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvanBlZyB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGltYWdlL2pwZWcgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MDg4Y2NiMi05NDFlLTQ1YmItOGZhZi02YjA5Mjc0M2Q0MDciIHN0RXZ0OndoZW49IjIwMjQtMTEtMjlUMTI6NDk6MTcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xMSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NWQxNWQ1MTQtOWM5MS00MDU2LWE4MzUtOWI2ZWJkZTk0OWZhIiBzdEV2dDp3aGVuPSIyMDI0LTExLTI5VDEyOjUxOjI0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMTEgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RSZWY6ZG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiLz4gPHRpZmY6Qml0c1BlclNhbXBsZT4gPHJkZjpTZXE+IDxyZGY6bGk+ODwvcmRmOmxpPiA8cmRmOmxpPjg8L3JkZjpsaT4gPHJkZjpsaT44PC9yZGY6bGk+IDwvcmRmOlNlcT4gPC90aWZmOkJpdHNQZXJTYW1wbGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+WfjB/QAAOnxJREFUeJztvXe4XFd19//Z+9Tp5famq2rJVnE3trGxMcY0h2KMDSb04NBCDIQQQgukvKTwQAKEEkIS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\"","<!--\n * @title: sidebar logo\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-15 14:11:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 11:46:47\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { computed, onMounted, ref, unref, watch } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('logo');\n\n const appStore = useAppStore();\n\n const show = ref(true);\n const title = computed(() => appStore.getTitle);\n const layout = computed(() => appStore.getLayout);\n const collapseMenus = computed(() => appStore.getCollapseMenus);\n\n watch(\n () => collapseMenus.value,\n (collapse: boolean) => {\n if (unref(layout) === 'topLeft' || unref(layout) === 'cutMenu') {\n show.value = true;\n return;\n }\n show.value = !collapse;\n },\n );\n\n watch(\n () => layout.value,\n (layout) => {\n if (layout === 'top' || layout === 'cutMenu') show.value = true;\n else if (unref(collapseMenus)) show.value = false;\n else show.value = true;\n },\n );\n\n onMounted(() => {\n if (unref(collapseMenus)) show.value = false;\n });\n</script>\n\n<template>\n <div>\n <router-link\n :class=\"[prefixCls, layout !== 'default' ? `${prefixCls}__Top` : '', 'flex !h-[var(--logo-height)] items-center cursor-pointer pl-[8px] relative decoration-none overflow-hidden']\"\n to=\"/\">\n <img\n src=\"@/assets/imgs/logo.png\"\n class=\"w-[calc(var(--logo-height)-10px)] h-[calc(var(--logo-height)-10px)]\" />\n <div\n v-if=\"show\"\n :class=\"[\n 'block whitespace-nowrap ml-[45px] mr-[0px] mt-[-25px] mb-[0px] text-[16px] font-bold',\n {\n 'text-[var(--logo-title-text-color)]': layout === 'default',\n 'text-[var(--top-header-text-color)]': layout === 'topLeft' || layout === 'top' || layout === 'cutMenu',\n },\n ]\">\n {{ title }}\n </div>\n </router-link>\n </div>\n</template>\n<style lang=\"scss\" scoped></style>\n","import type { App } from 'vue';\nimport GvSidebarLogo from './src/GvSidebarLogo.vue';\n// Define the install method on the GvButton component\nconst GvSidebarLogoPlugin = {\n install(app: App): void {\n app.component(GvSidebarLogo.name ?? 'GvSidebarLogo', GvSidebarLogo);\n },\n};\nexport default GvSidebarLogoPlugin;\n\nexport { GvSidebarLogo };\n","<!--\n * @title: table bar component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:46:02\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-03 14:20:53\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { getVNodeName, getVNodeText } from '@@/utils';\n import { defineComponent, getCurrentInstance, type VNode } from 'vue';\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('table-bar');\n export default defineComponent({\n name: 'GvTableBar',\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n setup(props, { slots }) {\n // @data\n const appStore = useAppStore();\n const instance = getCurrentInstance();\n const { t } = useBridgeI18n();\n // @watch\n\n // @methods\n const createTableBar = () => {\n const tableBar: VNode[] = [];\n const defaultSlots = slots.default?.();\n if (defaultSlots) {\n const parentNode = instance?.parent;\n const refForm = parentNode?.attrs['ref-form'];\n\n const buttonQuick = appStore.buttonQuick;\n const buttonIcon = appStore.buttonIcon;\n const childrenNodes = (defaultSlots[0].children as VNode[]) || [];\n childrenNodes.forEach((vnode: VNode) => {\n const propsData = vnode.props || {};\n if (getVNodeName(vnode) === 'GvButton') {\n const text = getVNodeText(vnode);\n if (text.indexOf(t('tableBar.save')) !== -1 || text.indexOf(t('tableBar.add')) !== -1 || text.indexOf(t('tableBar.append')) !== -1 || text.indexOf(t('tableBar.create')) !== -1) {\n if (text === t('tableBar.add') && buttonQuick) {\n propsData.text = t('tableBar.add2');\n propsData.otext = text;\n } else propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-add';\n propsData.bizType = 'save';\n } else if (propsData.bizType === 'export') {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-daochu1';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.refresh')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-shuaxin';\n propsData.bizType = 'refresh';\n propsData.text = t('tableBar.refresh');\n } else if (text.indexOf(t('tableBar.templateDownload')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-xiazaidaorumoban1x';\n propsData.bizType = 'downloadTemplate';\n } else if (text.indexOf(t('tableBar.dispatch')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-winfo-icon-zhipai';\n propsData.bizType = 'dispatch';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.assign')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhipai';\n propsData.bizType = 'dispatch';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.calculate')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jisuan';\n propsData.text = text;\n propsData.bizType = 'calculate';\n } else if (text.indexOf(t('tableBar.trace')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiankongguanli';\n propsData.text = text;\n propsData.bizType = 'trace';\n } else if (text.indexOf(t('tableBar.receive')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-piliangbianji1';\n propsData.text = text;\n propsData.bizType = 'receive';\n } else if (propsData.bizType === 'import') {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-daoru2';\n propsData.text = text;\n propsData.bizType = 'import';\n } else if (text.indexOf(t('tableBar.generate')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zujian';\n propsData.text = text;\n propsData.bizType = 'generate';\n } else if (text.indexOf(t('tableBar.pay')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-yingshoukuan';\n propsData.text = text;\n propsData.bizType = 'pay';\n } else if (text.indexOf(t('tableBar.check')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-xuanze';\n propsData.text = text;\n propsData.bizType = 'check';\n } else if (text.indexOf(t('tableBar.reject')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-bohui';\n propsData.text = text;\n propsData.bizType = 'reject';\n } else if (text.indexOf(t('tableBar.approve')) !== -1 || text.indexOf(t('tableBar.audit')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-shenpi2';\n propsData.text = text;\n propsData.bizType = 'approve';\n } else if (text.indexOf(t('tableBar.logging')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-rizhi1';\n propsData.bizType = 'logging';\n } else if (text.indexOf(t('tableBar.select')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-chaxun';\n propsData.bizType = 'search';\n }\n // else if (text.indexOf('派') !== -1) {\n // // propsData.text = text;\n // propsData.icon = 'el-icon-finished';\n // propsData.bizType = 'confirm';\n // }\n else if (text.indexOf(t('tableBar.detail')) !== -1 || text.indexOf(t('table.list')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-mingxi';\n propsData.bizType = 'detail';\n } else if (text.indexOf(t('tableBar.withdraw')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-fanhui5';\n propsData.bizType = 'withdraw';\n } else if (text.indexOf(t('tableBar.submit')) !== -1 || text.indexOf('提报') !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tijiao';\n propsData.bizType = 'submit';\n } else if (text.indexOf(t('tableBar.delete')) !== -1 || text.indexOf(t('tableBar.cancel')) !== -1 || text.indexOf(t('tableBar.cancel1')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-delete';\n propsData.bizType = 'delete';\n } else if (text.indexOf(t('tableBar.change')) !== -1 || text.indexOf(t('tableBar.update')) !== -1 || text.indexOf(t('tableBar.modify')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-edit-outline';\n propsData.bizType = 'update';\n } else if (text.indexOf(t('tableBar.sync')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tongbu1';\n propsData.bizType = 'update';\n } else if (text.indexOf(t('tableBar.untop')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-quxiaozhiding1';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.top')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhiding1';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.deserum')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-quxiaozhiding';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.unitPrice')) !== -1) {\n if (buttonIcon)\n // propsData.text = text;\n propsData.icon = 'iconfont gv-icon-jiangjinguize';\n else if (text.indexOf(t('tableBar.essence')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhiding';\n propsData.bizType = 'top';\n propsData.text = text;\n }\n } else if (text.indexOf(t('tableBar.relieve')) !== -1 || text.indexOf(t('tableBar.unbind')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiekou1';\n propsData.bizType = 'unbind';\n } else if (text.indexOf(t('tableBar.bind')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiekoushuoming';\n propsData.bizType = 'bind';\n } else if (text.indexOf(t('tableBar.confirm')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tianshenpi';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.notify')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-huodong';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.payment')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiage';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.transfer')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-fanhui5';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.putaway')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-top';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.soldOut')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-bottom';\n propsData.bizType = 'confirm';\n }\n propsData.refForm = refForm;\n } else if (getVNodeName(vnode) === 'ElDropdown') {\n const firstChild = vnode?.children?.[0];\n const text = getVNodeText(firstChild);\n propsData.text = text;\n propsData.icon = firstChild?.props.icon || '';\n }\n tableBar.push(vnode);\n });\n }\n return tableBar || [];\n };\n // console.log(tableBar);\n\n // @mounted\n\n // @render\n return () => (props.visible ? <div class={prefixCls}>{createTableBar()}</div> : null);\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-table-bar';\n .#{$prefixCls} {\n display: inline-block;\n height: 30px;\n padding-top: 3px;\n\n .el-dropdown {\n float: left;\n\n i {\n padding-right: 3px;\n color: var(--tableBarColor, $tableBarColor);\n\n & + span {\n margin-left: 3px;\n }\n }\n }\n\n :deep(.el-button) {\n float: left;\n height: 25px;\n padding: 2px 8px;\n margin-bottom: 2px;\n margin-left: 2px;\n color: var(--tableBarColor, $tableBarColor);\n text-align: left;\n background: #fff !important;\n border: 0;\n\n i {\n padding-right: 3px;\n color: var(--tableBarColor, $tableBarColor);\n\n & + span {\n margin-left: 3px;\n }\n }\n\n &:hover {\n background-color: rgb(0 82 156 / 5%) !important;\n }\n }\n\n .el-button.is-disabled {\n color: $textColor;\n\n :deep(i) {\n color: $textColor;\n }\n }\n }\n</style>\n","<!--\n * @title: tag component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 14:43:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:37:24\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElTag, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, unref, type PropType } from 'vue';\n import type { TTagEffect, TTagType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tag');\n\n export default defineComponent({\n name: 'GvTag',\n props: {\n type: {\n type: String as PropType<TTagType>,\n default: 'primary',\n },\n closable: {\n type: Boolean,\n default: false,\n },\n effect: {\n type: String as PropType<TTagEffect>,\n default: 'light',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n round: {\n type: Boolean,\n default: false,\n },\n },\n\n // @emits\n emits: ['click', 'close'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const tagSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @methods\n\n const handleClick = (event: MouseEvent) => {\n emit('click', event);\n };\n\n const handleClose = (event: Event) => {\n emit('close', event);\n };\n\n // @render\n return () => (\n <ElTag\n type={props.type}\n size={tagSize.value}\n round={props.round}\n closable={props.closable}\n effect={props.effect}\n class={prefixCls}\n onClick={handleClick}\n onClose={handleClose}>\n {slots.default?.()}\n </ElTag>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tag';\n .#{$prefixCls} {\n }\n</style>\n","/*\n * @title: table utils\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-09 17:50:09\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 08:47:14\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 // console.log(formList);\n for (const item of formList) {\n const type = item.type;\n if (type !== 'blank') {\n const condition: FilterCondition = {\n id: '',\n ds: '',\n va: '',\n co: '',\n op: 'like',\n ac: 'null',\n ki: 'text',\n };\n const { action, field, op = 'like', upper = false, showLabel, dateType } = item;\n if (action === 'ignore') continue;\n let val = filter[field];\n let co = 'null';\n if (isEmpty(val)) continue;\n // 对于日期范围选择\n if (Array.isArray(val)) if (isEmpty(val[0])) continue;\n // if (type !== 'dic' && (field.indexOf('id') >= 0 || field.indexOf('Id') >= 0))\n // type = 'number';\n // console.log(val);\n let sOp = op;\n if (type === 'dic') {\n if (Array.isArray(val)) {\n // fixme: 增加多选字典 2022-08-01\n let coo = '';\n let labels = '';\n (val as any[]).forEach((x) => {\n if (coo) {\n coo += ',' + x.value;\n labels += ',' + x.label;\n } else {\n coo = x.value;\n labels = x.label;\n }\n });\n co = coo;\n val = labels;\n } else if (showLabel) {\n // 单选字典\n co = val + '';\n val = showLabel;\n } else {\n const v = val as Recordable<any>;\n co = v.value;\n val = v.label;\n }\n\n sOp = '=';\n } else if (type === 'date' || type === 'datetime' || type === 'time') {\n if (op === 'like') sOp = '=';\n if (dateType === 'daterange' || dateType === 'datetimerange' || dateType === 'timerange' || dateType === 'monthrange') val = (val as any[]).join(',');\n } else if (type === 'number') sOp = '=';\n\n let sType = type;\n if (dateType === 'monthrange') sType = 'month';\n\n val = val + '';\n if (!action && val.indexOf(',') > 0) val = val.replace(/,/g, ',');\n\n if (val.indexOf(',') > 0) if (sOp !== 'in' && sOp !== 'not in') sOp = 'in';\n\n sOp = sOp.replace(/</gi, '<');\n sOp = sOp.replace(/>/gi, '>');\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-08 09:36:49\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 */\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: FormInstance[]) => {\n if (fmNodes === undefined || fmNodes === null) {\n message('form object is null', 'error');\n return false;\n }\n let result = true;\n for (const fmNode of fmNodes) {\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n await fmNode2.component.exposed\n .validate()\n .then(() => {\n // todo\n })\n .catch(() => {\n // throw new Error(e);\n result = false;\n Promise.reject('The form failed validation');\n });\n }\n }\n\n return result;\n};\n\n/**\n * @todo: save form\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:45:03\n */\nconst save = async (fmNode: FormInstance, fetch: AsyncFn, check = true, msg?: string) => {\n if (fmNode === undefined || fmNode === null) {\n message('form object is null', 'error');\n return false;\n }\n let result = {};\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n const formList = fmInnerNode.props.formList as FormItem[];\n let msgs: string;\n if (msg) msgs = msg;\n else {\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (lang === 'zh-CN') msgs = '保存成功';\n else msgs = 'Save OK.';\n }\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const props = fmNode2.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode2);\n // console.log(formList);\n let conditions = {};\n try {\n conditions = saveCombined(formList, filter);\n await fetch(conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n // console.log(error);\n return null;\n }\n } else\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const props = fmNode2.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode2);\n // console.log(formList);\n let conditions = {};\n try {\n conditions = saveCombined(formList, filter);\n await fetch(conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n 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 fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(fmNode2);\n const conditions = saveCombined(formList, filter);\n // console.log(conditions);\n\n await fetch(id, conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n } else\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(fmNode2);\n const conditions = saveCombined(formList, filter);\n // console.log(conditions);\n await fetch(id, conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n 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 fmNode2 = element.component.subTree.component.subTree.children[0];\n // 解析检索条件\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 拼接查询条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(formList);\n const filterConditions = searchCombined(formList, filter, tabNode);\n // console.log(filterConditions);\n // update: 保存查询条件、方法至table对象,为分页组件使用 2022-04-18\n\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n exposed.startLoading();\n\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n // fixme: 清空列表search框内容 2022-04-21\n const tabChildList = (tabNode as any).subTree?.children || [];\n const searchInputNode = tabChildList.filter((x: VNode) => {\n if (getVNodeName(x) === 'gv-input') return true;\n });\n if (searchInputNode[0]) searchInputNode[0].inputValue = '';\n // fixme: 清空列表表头筛选框 2022-12-14\n const tableEl = tabNode.$el as HTMLElement;\n const tableHeader = tableEl.querySelector('.gv-table .el-table__header-wrapper .el-table__header');\n const tableFixedHeader = tableEl.querySelector('.gv-table .el-table__fixed-header-wrapper .el-table__header');\n const columns = tableHeader?.querySelectorAll('.el-table__cell');\n const len = columns?.length || 0;\n for (let i = 0; i < len; i++) {\n const h = columns?.[i]?.querySelector('.render__header');\n if (h) if (h.children[0]) h.children[0].classList.remove('is-selected');\n }\n if (tableFixedHeader) {\n const columnsFixed = tableFixedHeader.querySelectorAll('.el-table__cell');\n const lenFixed = columnsFixed.length;\n for (let i = 0; i < lenFixed; i++) {\n const h = columnsFixed[i].querySelector('.render__header');\n if (h) if (h.children[0]) h.children[0].classList.remove('is-selected');\n }\n }\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n exposed.stopLoading();\n })\n .catch(() => {\n exposed.stopLoading();\n });\n }\n\n return result;\n};\n\n/**\n * @todo: search for list without form but with table\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:22:00\n * @param {*} tabNode\n * @param {*} fetch\n * @param {*} data\n */\nconst searchNoFm = async (tabNode: any, fetch: AsyncFn, data: any) => {\n if (tabNode === undefined || tabNode === null) {\n message('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 console.log(rowData);\n if (formList === null || formList === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (rowData === null || rowData === undefined) {\n message('Set data is null', 'error');\n return false;\n }\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang') || 'zh-CN';\n if (Object.keys(rowData).length !== 0)\n formList.forEach((x) => {\n const fieldValue = rowData[x.field];\n if (fieldValue !== undefined)\n if (x.type !== 'blank' && x.keep !== true)\n // const dicType = x.dicType;\n switch (x.type) {\n case 'text':\n case 'textarea':\n case 'number':\n if (fieldValue !== null && typeof fieldValue === 'object') x.value = fieldValue.c;\n else x.value = fieldValue;\n break;\n case 'date':\n if (x.dateType === 'daterange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'datetime':\n if (x.dateType === 'datetimerange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'time':\n if (x.dateType === 'timerange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'layer':\n if (Array.isArray(fieldValue)) x.value = fieldValue;\n else if (fieldValue) {\n const arr = fieldValue.split(',');\n // const arr = [1, '2', 'a'];\n const arr2 = arr.map((x) => {\n if (!isNaN(parseInt(x))) return x * 1;\n else return x;\n });\n x.value = arr2;\n // console.log(x.value);\n } else x.value = [];\n\n break;\n case 'dic':\n // console.log(rowData[x.field]);\n // if (dicType && dicType.indexOf('t#') !== -1)\n // x.value = rowData[x.field];\n // else {\n // fixme: 增加枚举字典类型赋值 2022-11-07\n if (x.dicType && x.dicType.indexOf('e#') >= 0) {\n if (typeof x.value !== 'object') {\n const enums = x.dicType.split('#');\n const items = enums[1].split(':');\n\n for (let i = 0; i < items.length; i++) {\n const itemChild = items[i].split('=');\n if (itemChild[0] === fieldValue + '') {\n x.value = fieldValue;\n x.showLabel = itemChild[1];\n break;\n }\n }\n }\n } else if (x.multiple)\n if (fieldValue !== null) {\n // 多选字典\n if (typeof fieldValue === 'object') {\n const dictObj = fieldValue;\n const c = dictObj.c;\n const v = getDictDisplayLabel(dictObj, lang);\n\n if (c) {\n const codes = c.split(',');\n const labels = v ? v.split(',') : [];\n x.value = codes.map((code: string, i: number) => ({\n value: code,\n label: labels[i] ?? code,\n }));\n x.showLabel = labels;\n } else {\n x.value = [];\n x.showLabel = [];\n }\n } else if (typeof fieldValue === 'string') {\n const c = fieldValue;\n if (c) {\n const op = [];\n c.split(',').forEach((x) => {\n const o: Recordable<any> = {};\n o.value = x;\n (op as Recordable<any>[]).push(o);\n });\n x.value = op;\n } else x.value = [];\n }\n } else x.value = fieldValue;\n else if (fieldValue !== null && typeof fieldValue === 'object') {\n const dictObj = fieldValue;\n const code = String(dictObj.c ?? '');\n const label = getDictDisplayLabel(dictObj, lang);\n x.value = { value: code, label };\n x.showLabel = label;\n } else x.value = fieldValue;\n\n break;\n default:\n x.value = fieldValue;\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","isEmptyLabel","getDictItemLabel","l1","l2","formatOptionLabel","findLabelInOptions","opts","find","c","getOptionValue","row","cached","get","obj","set","getSelectCode","getSelectLabel","o","mergeOptionsWithSelected","_opts","merged","append","sv","pushDefaultOption","op","push","getSelectOptions","src","xx","arr2","dictCache","dict","getDictDivision","cache","addDictCache","getDict","RegExp","test","filterMethod","initialRemoteLoaded","pendingRemoteQuery","pendingRemotePromise","remoteRequestSeq","filterOriginOptions","remoteDictSearch","requestSeq","sDicType","substring","datas","ops","JSON","parse","console","log","remoteMethod","q","filtered","ensureDefaultOption","existed","resolveDisplayLabel","localOpts","applySelectValue","raw","resolved","showLbl","deep","handleVisibleChange","renderSelectOption","ElOption","renderTableOption","columnTexts","multiColumn","v1","mm","m2","m4","vv1","mmm","mm2","mm4","labelArr","opArr","ElSelect","GvSelectPlugin","GvSelect","columnKey","require","switchType","newStatus","ElSwitch","GvSwitchPlugin","GvSwitch","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","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","_slot3","radioValue","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","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","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","rawFmChildren","fmChildList","fmNode2","_c","save","check","fmInnerNode","conditions","update","search","searchInputNode","tableEl","tableHeader","tableFixedHeader","columns","h","columnsFixed","lenFixed","searchNoFm","toNewPageSearch","trans","insertResult","searchData","updateResult","rownums","currentRow","removeResult","getDictDisplayLabel","dictObj","_f","_e","_d","_i","_h","_g","_k","_j","crud","rowData","fieldValue","items","itemChild","codes","tableHeadFilterPopoverPopperStyle","maxWidth","refTable","tableHead","tableData","pageSize","rowClassName","rowStyle","spanMethod","cellStyle","tableType","tableSort","tableKit","tableFetch","multi","isShowPage","total","tableInit","beforeImport","tableFilter","tableCb","expandRowKeys","limitHeight","tableAction","tableActionIcon","sTableAction","sTableActionIcon","sTableConfirm","detailPlacement","sTableType","originTableHead","tableHeads","sHeight","sMaxWidth","isEditTable","sPageSize","resultData","recordsList","records","pageSizes","filterHeads","popoverVisible","exportBtnDisabled","exportBtnLoading","importBtnLoading","tableSortMode","exportDialogShow","importDialogShow","sTableBar","gTableBar","tableSearchShow","sTableSort","sTableKit","showPopoverDetail","pageLayout","actionWidth","transHash","headColumn","headColumnInit","columnSumsDecimal","isIndeterminate","columnTreeList","columnCheckedKeys","storageKey","loginAccount","lsTableHeads","debounceSearch","tableRefs","tableRef","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","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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"}
|
|
1
|
+
{"version":3,"file":"guava-ui.umd.js","sources":["../packages/bridge/index.ts","../packages/GvBacktop/src/GvBacktop.vue","../packages/GvBacktop/index.ts","../packages/GvBadge/src/GvBadge.vue","../packages/GvBadge/index.ts","../packages/utils/index.ts","../packages/GvIcon/src/GvIcon.vue","../packages/GvIcon/index.ts","../packages/utils/gv.tree.ts","../packages/GvBreadCrumb/src/helper.ts","../packages/GvBreadCrumb/src/GvBreadCrumb.vue","../packages/GvBreadCrumb/index.ts","../packages/GvPopconfirm/src/GvPopconfirm.vue","../packages/GvPopconfirm/index.ts","../packages/hooks/web/useStorage.ts","../packages/utils/gv.notify.ts","../packages/GvButton/src/GvButton.vue","../packages/GvButton/index.ts","../packages/GvCard/src/GvCard.vue","../packages/GvCard/index.ts","../packages/GvCascader/src/GvCascader.vue","../packages/GvCascader/index.ts","../packages/GvCheckbox/src/GvCheckbox.vue","../packages/GvCheckbox/index.ts","../packages/GvCheckboxButton/src/GvCheckboxButton.vue","../packages/GvCheckboxButton/index.ts","../packages/GvCheckboxGroup/src/GvCheckboxGroup.vue","../packages/GvCheckboxGroup/index.ts","../packages/GvCol/src/GvCol.vue","../packages/GvCol/index.ts","../packages/GvDatePicker/src/datetime.ts","../packages/GvDatePicker/src/shortcuts.ts","../packages/GvDatePicker/src/GvDatePicker.vue","../packages/GvDatePicker/index.ts","../packages/GvDialog/src/drag.ts","../packages/GvDialog/src/GvDialog.vue","../packages/GvDialog/index.ts","../packages/GvDivider/src/GvDivider.vue","../packages/GvDivider/index.ts","../packages/GvDrawer/src/GvDrawer.vue","../packages/GvDrawer/index.ts","../packages/utils/gv.propTypes.ts","../packages/hooks/web/usePinyin.ts","../packages/GvExpandMenu/src/GvMenuList.vue","../packages/GvExpandMenu/src/GvExpandMenu.vue","../packages/GvExpandMenu/index.ts","../packages/GvInput/src/GvInput.vue","../packages/GvInput/index.ts","../packages/GvInputNumber/src/GvInputNumber.vue","../packages/GvInputNumber/index.ts","../packages/GvSelect/src/GvSelect.vue","../packages/GvSelect/index.ts","../packages/GvSwitch/src/GvSwitch.vue","../packages/GvSwitch/index.ts","../packages/GvTimePicker/src/GvTimePicker.vue","../packages/GvTimePicker/index.ts","../packages/utils/gv.infomsg.ts","../packages/utils/gv.validate.ts","../packages/GvForm/src/GvForm.vue","../packages/GvForm/index.ts","../packages/GvHamburger/src/GvHamburger.vue","../packages/GvHamburger/index.ts","../packages/GvLangSelect/src/GvLangSelect.vue","../packages/GvLangSelect/index.ts","../packages/GvPopover/src/GvPopover.vue","../packages/GvPopover/index.ts","../packages/GvRadio/src/GvRadio.vue","../packages/GvRadio/index.ts","../packages/GvRadioButton/src/GvRadioButton.vue","../packages/GvRadioButton/index.ts","../packages/GvRadioGroup/src/GvRadioGroup.vue","../packages/GvRadioGroup/index.ts","../packages/GvRow/src/GvRow.vue","../packages/GvRow/index.ts","../packages/GvScreenFull/src/GvScreenFull.vue","../packages/GvScreenFull/index.ts","../packages/GvSearchBar/src/GvSearchBar.vue","../packages/GvSearchBar/index.ts","../packages/GvSidebar/src/helper.ts","../packages/GvSidebar/src/components/useRenderMenuTitle.tsx","../packages/GvSidebar/src/components/useRenderMenuItem.tsx","../packages/GvSidebar/src/GvSidebar.vue","../packages/GvSidebar/index.ts","../src/assets/imgs/logo.png","../packages/GvSidebarLogo/src/GvSidebarLogo.vue","../packages/GvSidebarLogo/index.ts","../packages/GvTableBar/src/GvTableBar.vue","../packages/GvTag/src/GvTag.vue","../packages/utils/gv.table.ts","../packages/utils/gv.crud.ts","../packages/GvTable/src/GvTable.vue","../packages/GvTable/index.ts","../packages/GvTabPane/src/GvTabPane.vue","../packages/GvTabPane/index.ts","../packages/GvTabs/src/GvTabs.vue","../packages/GvTabs/index.ts","../packages/GvTag/index.ts","../packages/GvTagsView/src/GvTagsView.vue","../packages/GvTagsView/index.ts","../packages/GvTheme/src/GvTheme.vue","../packages/GvTheme/index.ts","../packages/GvTree/src/GvTree.vue","../packages/GvTree/index.ts","../packages/utils/gv.secret.ts","../packages/index.ts"],"sourcesContent":["// bridge/index.ts\nimport type { Router } from 'vue-router';\nimport type { Pinia } from 'pinia';\nimport type { Composer } from 'vue-i18n';\n\ninterface GlobalBridgeContext {\n router?: Router;\n i18n?: Composer;\n store?: Pinia;\n}\nconst globalBridgeKey = '__LIB_BRIDGE_CONTEXT__';\nconst getBridge = (): GlobalBridgeContext => {\n const g = globalThis as any;\n if (!g[globalBridgeKey]) g[globalBridgeKey] = {};\n\n return g[globalBridgeKey];\n};\nconst context: GlobalBridgeContext = {};\n\n// export function setBridgeContext(options: GlobalBridgeContext) {\n// if (options.router) context.router = options.router;\n// if (options.i18n) context.i18n = options.i18n;\n// if (options.pinia) context.pinia = options.pinia;\n// }\nexport const setBridgeContext = (ctx: GlobalBridgeContext) => {\n // console.log('setBridgeContext', ctx);\n Object.assign(getBridge(), ctx);\n};\n\nexport function useBridgeRouter(): Router {\n const router = getBridge().router;\n if (!router) throw new Error('[Bridge] router not set');\n return router;\n}\n// export function useBridgeRouter(): Router {\n// if (!context.router) throw new Error('[Bridge] Router is not injected');\n// return context.router;\n// }\n\nexport function useBridgeI18n(): Composer {\n const i18n = getBridge().i18n;\n if (!i18n) throw new Error('[Bridge] I18n is not injected');\n return i18n;\n}\n\n// export function useBridgeI18n(): Composer {\n// if (!context.i18n) throw new Error('[Bridge] I18n is not injected');\n// return context.i18n;\n// }\n\nexport function useBridgePinia(): Pinia {\n if (!context.store) throw new Error('[Bridge] Pinia is not injected');\n return context.store;\n}\n","<!--\n * @title: backtop\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:24:46\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-05-22 09:26:44\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { ElBacktop } from 'element-plus';\n import { useStyle } from '@/hook/web/useStyle';\n\n // --- define name and inheritAttrs ---\n defineOptions({\n name: 'GvBacktop', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n const { getPrefixCls, variables } = useStyle();\n\n const prefixCls = getPrefixCls('backtop');\n</script>\n\n<template>\n <ElBacktop\n :class=\"prefixCls\"\n :target=\"`.${variables.namespace}-layout-content-scrollbar .${variables.elNamespace}-scrollbar__wrap`\" />\n</template>\n","import type { App } from 'vue';\nimport GvBacktop from './src/GvBacktop.vue';\n// Define the install method on the GvButton component\nconst GvBacktopPlugin = {\n install(app: App): void {\n app.component(GvBacktop.name ?? 'GvBacktop', GvBacktop);\n },\n};\nexport default GvBacktopPlugin;\n\nexport { GvBacktop };\n","<!--\n * @title: badge component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 10:37:36\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 15:14:46\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElBadge } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n import type { TBadgeType } from './types/index';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('badge');\n\n export default defineComponent({\n name: 'GvBadge',\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [Number, String] as PropType<number | string>,\n default: '',\n },\n max: {\n type: Number,\n default: 10,\n },\n isDot: {\n type: Boolean,\n default: false,\n },\n hidden: {\n type: Boolean,\n default: false,\n },\n showZero: {\n type: Boolean,\n default: false,\n },\n color: {\n type: String,\n default: '',\n },\n type: {\n type: String as PropType<TBadgeType>,\n default: 'warning',\n },\n },\n\n setup(props, { slots }) {\n // @render\n return () => (\n <ElBadge\n value={props.value}\n max={props.max}\n type={props.type}\n hidden={props.hidden}\n isDot={props.isDot}\n showZero={props.showZero}\n color={props.color}\n class={prefixCls}>\n {slots.default?.()}\n </ElBadge>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-badge';\n .#{$prefixCls} {\n margin-top: 5px;\n margin-right: 25px;\n\n :deep(.el-badge__content) {\n height: 20px;\n line-height: 18px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvBadge from './src/GvBadge.vue';\n\nconst GvBadgePlugin = {\n install(app: App): void {\n app.component(GvBadge.name ?? 'GvBadge', GvBadge);\n },\n};\nexport default GvBadgePlugin;\n\nexport { GvBadge };\n","/*\n * @title: common utility func\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-02-27 13:25:29\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 15:00:33\n * @version: 1.0.6\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n// ------ is utils ------\nconst toString = Object.prototype.toString;\nexport const is = (val: unknown, type: string) => toString.call(val) === `[object ${type}]`;\n\nexport const isExternal = (path: string): boolean => /^(https?:|mailto:|tel:)/.test(path);\nexport const isString = (val: unknown): val is string => is(val, 'String');\nexport const isArray = (val: any): val is any[] => val && Array.isArray(val);\nexport const isError = (e: unknown): e is Error => typeof e === 'object' && e !== null && 'message' in e;\nexport const isObject = (val: any): val is Record<any, any> => val !== null && is(val, 'Object');\nexport const isDate = (val: unknown): val is Date => is(val, 'Date');\nexport const isNumber = (val: unknown): val is number => is(val, 'Number');\nexport const isBoolean = (val: unknown): val is boolean => is(val, 'Boolean');\nexport const isFunction = (val: unknown): val is (...args: any[]) => any => typeof val === 'function';\nexport const isElement = (val: unknown): val is Element => isObject(val) && !!val.tagName;\nexport const isMap = (val: unknown): val is Map<any, any> => is(val, 'Map');\nexport const isImgPath = (path: string): boolean => /(https?:\\/\\/|data:image\\/).*?\\.(png|jpg|jpeg|gif|svg|webp|ico)/gi.test(path);\nexport const isDark = (): boolean => window.matchMedia('(prefers-color-scheme: dark)').matches;\nexport const isNull = (val: unknown): val is null => val === null;\n\nexport const isEmpty = <T = unknown>(val: T): val is T => {\n if (isNull(val)) return true;\n if (val === undefined) return true;\n if (val === 'null') return true;\n if (isArray(val) || isString(val)) return val.length === 0;\n if (val instanceof Map || val instanceof Set) return val.size === 0;\n if (isObject(val)) return Object.keys(val).length === 0;\n return false;\n};\n\n/**\n * @todo: deep equal (plain object / array / date), functions compare by reference\n */\nexport const isEqual = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a === null || b === null || a === undefined || b === undefined) return false;\n if (typeof a !== typeof b) return false;\n if (isFunction(a) || isFunction(b)) return a === b;\n if (isDate(a) && isDate(b)) return a.getTime() === b.getTime();\n if (isArray(a) && isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (!isEqual(a[i], b[i])) return false;\n\n return true;\n }\n if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n if (!isEqual(a[key], b[key])) return false;\n }\n return true;\n }\n return false;\n};\n\nexport const isUrl = (path: string): boolean => {\n try {\n new URL(path);\n return true;\n } catch {\n return false;\n }\n};\n\n/**\n * @todo: set html lang attr\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-24 10:37:13\n * @param {LocaleType} locale\n */\nexport const setHtmlAttrByLang = (locale: LocaleType): void => {\n document.querySelector('html')?.setAttribute('lang', locale);\n};\n\n/**\n * @todo: sleep async function\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 12:01:37\n * @param {*} timeLen\n */\nexport const sleep = async (timeLen: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, timeLen));\n/**\n * @todo: underline to camel case\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:21:09\n * @param {*} name\n */\nexport const toHump = (name: string): string => {\n if (!name) return '';\n // eslint-disable-next-line no-useless-escape\n return name.replace(/\\_(\\w)/g, function (all, letter) {\n return letter.toUpperCase();\n });\n};\n\n/**\n * @todo: camel case to underline\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:21:50\n * @param {*} name\n */\nexport const toLine = (name: string): string => name.replace(/([A-Z])/g, '_$1').toLowerCase();\n\n/**\n * 设置css style\n * @param prop\n * @param val\n * @param dom\n */\nexport const setDomCssProp = (prop: string, val: any, dom = document.documentElement): void => {\n dom.style.setProperty(prop, val);\n};\n\n/**\n * get css style\n * @param prop\n * @param dom\n * @returns\n */\nexport const getDomCssProp = (prop: string, dom = document.documentElement): string => getComputedStyle(dom).getPropertyValue(prop);\n\n/**\n * join icon class\n * @param icon\n * @returns\n */\nexport const joinIcon = function (icon) {\n let joinIcons = '';\n if (icon)\n if (icon.includes('el-icon')) joinIcons = icon;\n else if (icon.includes('gv-icon')) joinIcons = `iconfont ${icon}`;\n return joinIcons;\n};\n\n/**\n * Check if an element has a class\n * @param {HTMLElement} ele\n * @param {string} cls\n * @returns {boolean}\n */\nexport const hasClass = (ele: HTMLElement, cls: string): boolean => !!ele.className.match(new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)'));\n\n/**\n * Add class to element\n * @param {HTMLElement} ele\n * @param {string} cls\n */\nexport const addClass = (ele: HTMLElement, cls: string) => {\n if (!hasClass(ele, cls)) ele.className += ' ' + cls;\n};\n\n/**\n * Remove class from element\n * @param {HTMLElement} ele s s\n * @param {string} cls\n */\nexport const removeClass = (ele: HTMLElement, cls: string): void => {\n if (hasClass(ele, cls)) {\n const reg = new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)');\n ele.className = ele.className.replace(reg, ' ');\n }\n};\n\n/**\n * @todo: html tag has scrollbar\n * @param {*} tag\n */\nexport const hasScrollbar = (tag: any) => tag.scrollHeight > (tag.innerHeight || tag.clientHeight);\n\n/**\n * date format settings\n */\nexport const dateFormatConfig = {\n date: {\n placeholder: '选择日期', // yyyy-mm-dd\n valueFormat: 'YYYY-MM-DD',\n dateFormat: 'YYYY-MM-DD',\n },\n exactdate: {\n placeholder: '选择日期', // yyyy-mm-dd\n valueFormat: 'YYYY-MM-dd HH:mm:ss',\n dateFormat: 'YYYY-MM-DD',\n },\n datetime: {\n placeholder: '选择时间', // yyyy-mm-dd hh:mm\n valueFormat: 'YYYY-MM-DD HH:mm',\n dateFormat: 'YYYY-MM-DD HH:mm',\n },\n week: {\n placeholder: '选择周',\n dateFormat: 'YYYY 第 WW 周',\n },\n month: {\n placeholder: '选择月份', // yyyy-mm\n valueFormat: 'YYYY-MM',\n dateFormat: 'YYYY-MM',\n },\n year: {\n placeholder: '选择年份', // yyyy\n valueFormat: 'YYYY',\n dateFormat: 'YYYY',\n },\n};\n\n/**\n * @todo: 防抖函数(一段时间内只响应最后一次操作,如:input框连续输入)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:58:21\n * @param {*} func\n * @param {*} wait\n * @param {*} immediate\n */\nexport const debounce = (func: Fn, wait = 100, immediate = false) => {\n let timeout: ReturnType<typeof setTimeout> | null;\n let arg: any[];\n let context: any;\n let timestamp: number;\n let result: ReturnType<Fn>;\n const later = function () {\n // 据上一次触发时间间隔\n const last = +new Date() - timestamp;\n // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait\n if (last < wait && last > 0) timeout = setTimeout(later, wait - last);\n else {\n timeout = null;\n // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用\n if (!immediate) {\n result = func.apply(context, arg);\n if (!timeout) context = arg = null as any;\n }\n }\n };\n return function (this: any, ...args) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n context = this;\n // fixme: 解决防抖函数无法传参的问题 2022-04-19\n arg = args;\n timestamp = +new Date();\n const callNow = immediate && !timeout;\n // 如果延时不存在,重新设定延时\n if (!timeout) timeout = setTimeout(later, wait);\n if (callNow) {\n result = func.apply(context, arg);\n context = arg = null as any;\n }\n\n return result;\n };\n};\n\n/**\n * @todo: get vnode text\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 13:49:54\n * @param {VNode} vnode\n */\nexport const getVNodeText = (vnode: any): string => {\n if (!vnode) return '';\n // 1. 字符串\n if (typeof vnode === 'string') return vnode;\n // 2. 数字\n if (typeof vnode === 'number') return String(vnode);\n // 3. children 为字符串\n if (typeof vnode.children === 'string') return vnode.children.trim();\n // 4. children 为数组\n if (Array.isArray(vnode.children)) return vnode.children.map((item) => getVNodeText(item)).join('');\n // 5. slots(ElButton / 组件)\n if (vnode.children && typeof vnode.children === 'object') {\n const slots = vnode.children as Record<string, any>;\n // default slot\n if (typeof slots.default === 'function') {\n const slotNodes = slots.default();\n return slotNodes.map((item: any) => getVNodeText(item)).join('');\n }\n }\n\n return '';\n};\n\n/**\n * @todo: get vnode name\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 17:24:24\n * @param {any} vnode\n */\nexport const getVNodeName = (vnode: any): string => {\n if (!vnode) return '';\n return typeof vnode.type === 'object' && vnode.type !== null && 'name' in vnode.type ? vnode.type.name : '';\n};\n\n/**\n * @todo: 去除金额格式化方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-24 14:14:55\n * @param {*} val\n */\nexport const removeAmountFormat = (val: string): string => {\n if (val) return val.replace(/,/g, '');\n else return '0.00';\n};\n\n// when val is 0.00, change it as 0 format\nfunction zeroFormat(val: string): string {\n if (val === '0.00') return '0';\n else return val;\n}\n\nfunction numberFormat(pattern, val) {\n const oldVal = val;\n if (val < 0) val = -val;\n const _nfPattern = '[0#]+[,]?[0#]*(\\\\.[0#]+)?';\n if (!pattern || !new RegExp(_nfPattern, 'g').test(pattern)) return '0.00';\n\n if (!isNumber((val + '').replace('.', ''))) return '0.00';\n\n const strAry = pattern.match(new RegExp(_nfPattern, 'g'));\n const p1 = strAry[0].indexOf('.');\n if (p1 > 0) {\n const len = strAry[0].length - p1 - 1;\n val = Math.round(val * Math.pow(10, len)) / Math.pow(10, len);\n } else val = Math.round(val);\n\n val = val + '';\n const p2 = val.indexOf('.');\n let ret = '';\n if (p1 > 0) {\n for (let i = p1 + 1; i < strAry[0].length; i++) {\n const ch = p2 > 0 && p2 + i - p1 < val.length ? val.charAt(p2 + i - p1) : '';\n if (strAry[0].charAt(i) === '0') ret = ret + (ch === '' ? '0' : ch);\n else ret = ret + (ch === '' ? '' : ch);\n }\n ret = ret === '' ? '' : '.' + ret;\n }\n const p3 = strAry[0].indexOf(',');\n if (p3 > 0) {\n const len = p1 > 0 ? p1 - p3 - 1 : strAry[0].length - p3 - 1;\n const len2 = p2 > 0 ? p2 - 1 : val.length - 1;\n for (let i = len2; i >= 0; i--) ret = ((len2 - i + 1) % len === 0 ? ',' : '') + val.charAt(i) + ret;\n\n ret = ret.charAt(0) === ',' ? ret.substring(1, ret.length) : ret;\n } else ret = val.substring(0, p2 > 0 ? p2 : val.length) + ret;\n\n if (oldVal < 0) ret = '-' + ret;\n\n return pattern.replace(strAry[0], ret);\n}\n\n/**\n * @todo: 千位符转换\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-24 09:22:56\n * @param {*} val\n * @param {*} decimal 小数位数\n */\nexport const amountFormat = (val: string | number, decimal = 2): string => {\n let v = val + '';\n if (v === null || v === 'null' || v === '0' || v === undefined || v === 'undefined') return '0.00';\n if (v.indexOf(',') > 0) v = removeAmountFormat(v);\n let pattern = '#,###.';\n let decimalPattern = '00';\n if (decimal) decimalPattern = decimalPattern.padStart(decimal, '0');\n pattern = pattern + decimalPattern;\n return zeroFormat(numberFormat(pattern, v));\n};\n\n/**\n * @todo: set quick keys\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:38:53\n * @param {*} ev\n */\nexport const setQuickKeys = (ev) => {\n if (ev && ev.key)\n if (ev.key.toLowerCase() === 'q' && ev.ctrlKey === true) {\n // 绑定ctr + q\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-search__bar>.gv-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-edit__bar .gv-button.search') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 'r' && ev.ctrlKey === true) {\n // 绑定crt + r\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-form .gv-search__bar>.gv-button.reset') as HTMLElement;\n if (btnHtml && btnHtml.style.display !== 'none') if (btnHtml.getAttribute('refform')) btnHtml.click();\n } else if (ev.key.toLowerCase() === 'e' && ev.ctrlKey === true) {\n // 绑定crt + e\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-form .gv-search__bar>.gv-button.shrink') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-form .gv-search__bar>.gv-button.expand') as HTMLElement;\n if (btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 's' && ev.ctrlKey === true) {\n // 绑定crt + s\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-drawer__popup .gv-drawer .gv-drawer__footer>.gv-drawer__footer--inner .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-edit__bar .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === 'n' && ev.ctrlKey === true) {\n // 绑定crt + n\n ev.preventDefault();\n ev.stopPropagation();\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-table__container .gv-table__bar .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n else {\n const btnHtml = document.body.querySelector('.main-container .gv-container .gv-edit__bar .gv-button.save') as HTMLElement;\n if (btnHtml && btnHtml.style.display === '') btnHtml.click();\n }\n } else if (ev.key.toLowerCase() === '=' && ev.ctrlKey === true) {\n // 绑定crt + '='\n ev.preventDefault();\n ev.stopPropagation();\n const inputHtml = document.body.querySelector('.main-container .gv-container .gv-table__container .gv-table__search .gv-table__search-input > .el-input__inner') as HTMLElement;\n if (inputHtml) inputHtml.focus();\n } else if (ev.key === 'Escape') {\n // 绑定esc关闭弹窗\n ev.preventDefault();\n ev.stopPropagation();\n const messageConfirmHtml = document.documentElement.querySelector('body>.el-message-box__wrapper') as HTMLElement;\n if (messageConfirmHtml && messageConfirmHtml.style.display !== 'none') {\n const bodyButtonHtml = messageConfirmHtml.querySelector('.el-message-box .el-message-box__btns button') as HTMLElement;\n bodyButtonHtml.click();\n } else {\n const bodyDialogHtml = document.documentElement.querySelector('body>.gv-dialog') as HTMLElement;\n if (bodyDialogHtml && bodyDialogHtml.style.display !== 'none') {\n const bodyButtonHtml = bodyDialogHtml.querySelector('.el-dialog__header button') as HTMLElement;\n bodyButtonHtml.click();\n } else {\n const dialogArr = document.body.querySelectorAll('.main-container .gv-container .gv-dialog__popup .gv-dialog') as NodeListOf<HTMLElement>;\n if (dialogArr)\n for (let i = 0; i < dialogArr.length; i++)\n if (dialogArr[i].style.display !== 'none') {\n const buttonHtml = dialogArr[i].querySelector('.el-dialog__header button') as HTMLElement;\n if (buttonHtml && buttonHtml.style.display !== 'none') {\n buttonHtml.click();\n return;\n }\n }\n\n const buttonDHtml = document.body.querySelector('.main-container .gv-container .gv-drawer__popup .gv-drawer .el-drawer__header button') as HTMLElement;\n if (buttonDHtml && buttonDHtml.style.display !== 'none') buttonDHtml.click();\n }\n }\n }\n};\n\nexport const pathResolve = (parentPath: string, path: string) => {\n if (isUrl(path)) return path;\n const childPath = path.startsWith('/') || !path ? path : `/${path}`;\n return `${parentPath}${childPath}`.replace(/\\/\\//g, '/').trim();\n};\n","<!--\n * @title: svg icon component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-01 17:02:13\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 10:50:13\n * @version: 1.0.8\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { isExternal } from '@@/utils';\n import * as Icons from '@element-plus/icons-vue';\n import { ElIcon } from 'element-plus';\n import { computed, useAttrs, type DefineComponent } from 'vue';\n const { variables } = useStyle();\n const preNameSpace = variables.namespace;\n const attrs = useAttrs();\n // --- define name and inheritAttrs ---\n defineOptions({\n name: 'GvIcon', // 定义组件名称\n inheritAttrs: false, // 默认继承属性\n });\n // --- transfer props and define default values ---\n const props = withDefaults(\n defineProps<{\n iconType?: string;\n iconName: string;\n className?: string;\n icon?: DefineComponent; // element-plus icon component\n size?: string; // 图标的font-size,单位是px\n }>(),\n {\n iconType: '', // svg | iconfont | el\n className: '',\n },\n );\n // @computed\n const isLocal = computed(() => isExternal(props.iconName));\n const iconType = computed(() => {\n if (props.iconType === 'svg') return 'svg';\n else if (props.iconType === 'iconfont') return 'iconfont';\n else if (props.iconType === 'el') return 'el';\n else if (props.iconType === '')\n if (props.iconName.startsWith('el-icon')) return 'el';\n else if (props.iconName.startsWith('gv-')) return 'iconfont';\n else return 'svg';\n else return 'svg';\n });\n const iconName = computed(() => {\n if (iconType.value === 'svg') return `#${preNameSpace}-icon-${props.iconName}`;\n else if (iconType.value === 'iconfont') return 'iconfont ' + props.iconName;\n else if (iconType.value === 'el') return props.iconName;\n else return `#${props.iconName}`;\n });\n\n // @method\n const svgClass = computed(() => {\n if (iconType.value === 'svg') return props.className ? 'svg-icon ' + props.className : 'svg-icon';\n else return props.className;\n });\n const styleExternalIcon = computed(() => ({\n mask: `url(${props.iconName}) no-repeat 50% 50%`,\n '-webkit-mask': `url(${props.iconName}) no-repeat 50% 50%`,\n }));\n\n /**\n * @todo: get element-plus icon component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:18:16\n * @param {*} computed\n */\n const iconComponent = computed(() => {\n // console.log(iconType.value);\n // console.log(props.iconName);\n if (iconType.value !== 'el') return null;\n const name = props.iconName;\n let compName = '';\n if (name.startsWith('el-icon')) {\n compName = name.replace('el-icon-', '');\n compName = compName.charAt(0).toUpperCase() + compName.slice(1);\n } else compName = name.charAt(0).toUpperCase() + name.slice(1);\n\n return Icons[compName as keyof typeof Icons];\n });\n</script>\n<template>\n <div\n v-if=\"isLocal\"\n :style=\"styleExternalIcon\"\n class=\"svg-external-icon svg-icon\"\n v-bind=\"attrs\"></div>\n <svg\n v-else-if=\"iconType === 'svg'\"\n :class=\"svgClass\"\n aria-hidden=\"true\"\n v-bind=\"attrs\">\n <use :href=\"iconName\" />\n </svg>\n <i\n v-else-if=\"iconType === 'iconfont'\"\n :class=\"[iconName, svgClass]\"\n v-bind=\"attrs\">\n </i>\n <ElIcon\n v-else-if=\"iconComponent\"\n :class=\"svgClass\">\n <component :is=\"iconComponent\" />\n </ElIcon>\n <svg\n v-else\n :class=\"svgClass\"\n :style=\"{ 'font-size': size + 'px' }\"\n aria-hidden=\"true\"\n v-bind=\"attrs\">\n <use :xlink:href=\"iconName\" />\n </svg>\n</template>\n\n<style lang=\"scss\" scoped>\n .svg-icon {\n width: 1em;\n height: 1em;\n overflow: hidden;\n vertical-align: -0.15em;\n fill: currentcolor;\n }\n\n .svg-external-icon {\n display: inline-block;\n background-color: currentcolor;\n mask-size: cover !important;\n }\n</style>\n","import type { App } from 'vue';\nimport GvIcon from './src/GvIcon.vue';\nconst GvIconPlugin = {\n install(app: App): void {\n app.component(GvIcon.name ?? 'GvIcon', GvIcon);\n },\n};\nexport default GvIconPlugin;\n\nexport { GvIcon };\n","interface TreeHelperConfig {\n id: string;\n children: string;\n pid: string;\n}\nconst DEFAULT_CONFIG: TreeHelperConfig = {\n id: 'id',\n children: 'children',\n pid: 'pid',\n};\nconst getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config);\n// tree from list\nexport const listToTree = <T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] => {\n const conf = getConfig(config) as TreeHelperConfig;\n const nodeMap = new Map();\n const result: T[] = [];\n const { id, children, pid } = conf;\n\n for (const node of list) {\n node[children] = node[children] || [];\n nodeMap.set(node[id], node);\n }\n for (const node of list) {\n const parent = nodeMap.get(node[pid]);\n (parent ? parent.children : result).push(node);\n }\n return result;\n};\n\nexport const treeToList = <T = any>(tree: any, config: Partial<TreeHelperConfig> = {}): T => {\n config = getConfig(config);\n const { children } = config;\n const result: any = [...tree];\n for (let i = 0; i < result.length; i++) {\n if (!result[i][children!]) continue;\n result.splice(i + 1, 0, ...result[i][children!]);\n }\n return result;\n};\n\nexport const findNode = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | null => {\n config = getConfig(config);\n const { children } = config;\n const list = [...tree];\n for (const node of list) {\n if (func(node)) return node;\n node[children!] && list.push(...node[children!]);\n }\n return null;\n};\n\nexport const findNodeAll = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T[] => {\n config = getConfig(config);\n const { children } = config;\n const list = [...tree];\n const result: T[] = [];\n for (const node of list) {\n func(node) && result.push(node);\n node[children!] && list.push(...node[children!]);\n }\n return result;\n};\n\nexport const findPath = <T = any>(tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}): T | T[] | null => {\n config = getConfig(config);\n const path: T[] = [];\n const list = [...tree];\n const visitedSet = new Set();\n const { children } = config;\n while (list.length) {\n const node = list[0];\n if (visitedSet.has(node)) {\n path.pop();\n list.shift();\n } else {\n visitedSet.add(node);\n node[children!] && list.unshift(...node[children!]);\n path.push(node);\n if (func(node)) return path;\n }\n }\n return null;\n};\n\nexport const findPathAll = (tree: any, func: Fn, config: Partial<TreeHelperConfig> = {}) => {\n config = getConfig(config);\n const path: any[] = [];\n const list = [...tree];\n const result: any[] = [];\n const visitedSet = new Set();\n const { children } = config;\n while (list.length) {\n const node = list[0];\n if (visitedSet.has(node)) {\n path.pop();\n list.shift();\n } else {\n visitedSet.add(node);\n node[children!] && list.unshift(...node[children!]);\n path.push(node);\n func(node) && result.push([...path]);\n }\n }\n return result;\n};\n\nexport const filter = <T = any>(tree: T[], func: (n: T) => boolean, config: Partial<TreeHelperConfig> = {}): T[] => {\n config = getConfig(config);\n const children = config.children as string;\n function listFilter(list: T[]) {\n return list\n .map((node: any) => ({ ...node }))\n .filter((node) => {\n node[children] = node[children] && listFilter(node[children]);\n return func(node) || (node[children] && node[children].length);\n });\n }\n return listFilter(tree);\n};\n\nexport const forEach = <T = any>(tree: T[], func: (n: T) => any, config: Partial<TreeHelperConfig> = {}): void => {\n config = getConfig(config);\n const list: any[] = [...tree];\n const { children } = config;\n for (let i = 0; i < list.length; i++) {\n // func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿\n if (func(list[i])) return;\n\n children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]);\n }\n};\n/**\n * @description: Extract tree specified structure\n */\nexport const treeMapEach = (data: any, { children = 'children', conversion }: { children?: string; conversion: Fn }) => {\n const haveChildren = Array.isArray(data[children]) && data[children].length > 0;\n const conversionData = conversion(data) || {};\n if (haveChildren)\n return {\n ...conversionData,\n [children]: data[children].map((i: number) =>\n treeMapEach(i, {\n children,\n conversion,\n }),\n ),\n };\n else\n return {\n ...conversionData,\n };\n};\n/**\n * @description: Extract tree specified structure\n */\nexport const treeMap = <T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] => treeData.map((item) => treeMapEach(item, opt));\n\n/**\n * 递归遍历树结构\n * @param treeDatas 树\n * @param callBack 回调\n * @param parentNode 父节点\n */\nexport const eachTree = (treeDatas: any[], callBack: Fn, parentNode = {}) => {\n treeDatas.forEach((element) => {\n const newNode = callBack(element, parentNode) || element;\n if (element.children) eachTree(element.children, callBack, newNode);\n });\n};\n","/*\n * @title: breadcrumb helper func\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 12:55:48\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-01-30 12:12:40\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { pathResolve } from '../../utils/index';\n\nexport const filterBreadcrumb = (routes: AppRouteRecordRaw[], parentPath = ''): AppRouteRecordRaw[] => {\n const res: AppRouteRecordRaw[] = [];\n\n for (const route of routes) {\n const meta = route?.meta;\n if (route.name !== 'Root' && meta?.hidden && !meta.canTo) continue;\n\n const data: AppRouteRecordRaw = !meta?.alwaysShow && route.children?.length === 1 ? { ...route.children[0], path: pathResolve(route.path, route.children[0].path) } : { ...route };\n\n data.path = pathResolve(parentPath, data.path);\n\n if (data.children) data.children = filterBreadcrumb(data.children, data.path);\n\n if (data) res.push(data);\n }\n return res;\n};\n","<!--\n * @title: breadcrumb \n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:13:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-06 14:28:48\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { useBridgeI18n } from '@@/bridge';\n import { ElBreadcrumb, ElBreadcrumbItem } from 'element-plus';\n import { computed, defineComponent, ref, TransitionGroup, unref, watch } from 'vue';\n import { useRouter } from 'vue-router';\n import { GvIcon } from '../../GvIcon';\n import { filter, treeToList } from '../../utils/gv.tree';\n import { filterBreadcrumb } from './helper';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('breadcrumb');\n\n export default defineComponent({\n name: 'GvBreadCrumb',\n setup() {\n const appStore = useAppStore();\n const permStore = usePermsStore();\n // if you want to use the icon in breadcrumb, you can set it in appStore\n const showBreadcrumbIcon = computed(() => appStore.getShowBreadcrumbIcon);\n const { currentRoute } = useRouter();\n\n const { t } = useBridgeI18n();\n\n const levelList = ref<AppRouteRecordRaw[]>([]);\n const menuRouters = computed(() => {\n const routers = permStore.getRouters;\n return filterBreadcrumb(routers);\n });\n\n const getBreadcrumb = () => {\n const currentPath = currentRoute.value.matched.slice(-1)[0].path;\n levelList.value = filter<AppRouteRecordRaw>(unref(menuRouters), (node: AppRouteRecordRaw) => node.path === currentPath);\n };\n\n const renderBreadcrumb = () => {\n const breadcrumbList = treeToList<AppRouteRecordRaw[]>(unref(levelList));\n return breadcrumbList.map((v) => {\n const disabled = !v.redirect || v.redirect === 'noredirect';\n const meta = v.meta;\n return (\n <ElBreadcrumbItem\n to={{ path: disabled ? '' : v.path }}\n key={v.name}>\n {meta?.icon && showBreadcrumbIcon.value ? (\n <>\n <GvIcon\n iconType=\"iconfont\"\n iconName={meta.icon}\n className=\"text-[13px]\"></GvIcon>{' '}\n {t(v?.meta?.title || '')}\n </>\n ) : (\n t(v?.meta?.title || '')\n )}\n </ElBreadcrumbItem>\n );\n });\n };\n // @watch\n watch(\n () => currentRoute.value.path,\n (path) => {\n if (path.startsWith('/redirect/')) return;\n\n getBreadcrumb();\n },\n {\n immediate: true,\n },\n );\n // @created\n\n // @render\n return () => (\n <ElBreadcrumb\n separator=\"/\"\n class={`${prefixCls} flex items-center h-full ml-[10px]`}>\n <TransitionGroup\n appear\n enter-active-class=\"animate__animated animate__fadeInRight\">\n {renderBreadcrumb()}\n </TransitionGroup>\n </ElBreadcrumb>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-breadcrumb';\n .#{$prefixCls} {\n user-select: none;\n :deep(.el-breadcrumb__item) {\n display: flex;\n .el-breadcrumb__inner {\n display: flex;\n align-items: center;\n color: #afb3b9;\n cursor: text;\n //color: var(--top-header-text-color);\n //&:hover {\n // color: var(--el-color-primary);\n //}\n &.is-link {\n font-weight: 500;\n }\n }\n .iconfont {\n //font-size: $textSizeSecondary;\n }\n }\n :deep(.el-breadcrumb__item):last-child {\n .el-breadcrumb__inner:hover {\n color: #afb3b9;\n cursor: text;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvBreadCrumb from './src/GvBreadCrumb.vue';\nconst GvBreadCrumbPlugin = {\n install(app: App): void {\n app.component(GvBreadCrumb.name ?? 'GvBreadCrumb', GvBreadCrumb);\n },\n};\nexport default GvBreadCrumbPlugin;\n\nexport { GvBreadCrumb };\n","<!--\n * @title: popconfirm component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 16:43:20\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-22 16:32:45\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElPopconfirm } from 'element-plus';\n import { defineComponent, getCurrentInstance } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('popconfirm');\n\n export default defineComponent({\n name: 'GvPopconfirm',\n props: {\n title: {\n type: String,\n default: '',\n },\n },\n\n emits: ['confirm'],\n\n setup(props, { emit, slots }) {\n const instance = getCurrentInstance();\n\n const handleConfirm = (event: MouseEvent) => {\n emit('confirm', event, instance);\n };\n\n return () => (\n <ElPopconfirm\n title={props.title}\n onConfirm={handleConfirm}\n class={prefixCls}>\n {{\n reference: () => slots.reference?.(),\n }}\n </ElPopconfirm>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-popconfirm';\n .#{$prefixCls} {\n display: inline-block;\n }\n</style>\n","import type { App } from 'vue';\nimport GvPopconfirm from './src/GvPopconfirm.vue';\n\nconst GvInputPlugin = {\n install(app: App): void {\n app.component(GvPopconfirm.name ?? 'GvPopconfirm', GvPopconfirm);\n },\n};\nexport default GvInputPlugin;\n\nexport { GvPopconfirm };\n","/*\n * @title: sessionStorage and localStorage hook\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-19 16:32:15\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-04-24 17:11:28\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n// 获取传入的值的类型\nconst getValueType = (value: any): string => {\n const type = Object.prototype.toString.call(value);\n return type.slice(8, -1);\n};\n\nexport const useStorage = (type: 'sessionStorage' | 'localStorage' = 'sessionStorage'): IWebStorage => {\n const setStorage = (key: string, value: any): void => {\n const valueType = getValueType(value);\n window[type].setItem(key, JSON.stringify({ type: valueType, value }));\n };\n\n const getStorage = (key: string): any => {\n const value = window[type].getItem(key);\n if (value) {\n const { value: val } = JSON.parse(value);\n return val;\n } else return value;\n };\n\n const removeStorage = (key: string): void => {\n window[type].removeItem(key);\n };\n\n const clear = (excludes?: string[]): void => {\n // 获取排除项\n const keys = Object.keys(window[type]);\n const defaultExcludes = ['dynamicRouter', 'serverDynamicRouter'];\n const excludesArr = excludes ? [...excludes, ...defaultExcludes] : defaultExcludes;\n const excludesKeys = excludesArr ? keys.filter((key) => !excludesArr.includes(key)) : keys;\n // 排除项不清除\n excludesKeys.forEach((key) => {\n window[type].removeItem(key);\n });\n // window[type].clear()\n };\n\n return {\n setStorage,\n getStorage,\n removeStorage,\n clear,\n };\n};\n","/*\n * @title: message alert confirm\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 11:47:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:50:11\n * @version: 1.0.6\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { useStorage } from '@@/hooks/web/useStorage';\nimport { ElMessage, ElMessageBox, ElNotification } from 'element-plus';\n// import { useLocaleStoreWithOut } from '@/store/modules/locale';\nimport { isError, sleep } from './index';\n// const localeStore = useLocaleStoreInstance();\n// const { lang } = localeStore.getCurrentLocale;\n\nconst notificationTime = 5000;\nconst notificationTimeError = 6000;\nconst messageTime = 2000;\nconst messageTimeError = 5000;\ninterface ConfirmOptions {\n title?: string;\n message: string;\n confirmButtonText?: string;\n cancelButtonText?: string;\n type?: 'success' | 'warning' | 'info' | 'error';\n showCancelButton?: boolean;\n}\n/**\n * @todo: Notification - MessageBox\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 13:48:24\n * @param {unknown} msg\n * @param {MessageType} type\n * @param {string} title\n */\ntype MessageType = 'success' | 'info' | 'warning' | 'error';\n\nexport const alert = async (msg: unknown, type: MessageType = 'success') => {\n const alertObj = document.body.querySelector('body>.el-notification');\n if (alertObj) alertObj.remove();\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n let promptMsg = '提示信息';\n if (lang === 'en') promptMsg = 'Hint';\n const duration = type === 'error' ? notificationTimeError : notificationTime;\n let m = 'No message...';\n if (isError(msg)) m = msg.message || 'No message...';\n else if (typeof msg === 'string' || typeof msg === 'number' || typeof msg === 'boolean') m = String(msg);\n else if (typeof msg === 'object') m = JSON.stringify(msg);\n\n ElNotification({\n title: promptMsg,\n message: m,\n type,\n duration: duration,\n });\n await sleep(duration);\n};\n/**\n * @todo: confirm - MessageBox\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 12:03:27\n * @param {*} msg\n * @param {*} type\n */\nexport const confirm = async (msg: string, type: MessageType = 'warning') => {\n if (document.body.querySelector('body>.el-confirm')) return;\n // 返回 Promise 对象\n let msgs: string;\n const showCancelButton = true;\n msgs = '是否确定此操作?';\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n let hint = '提示信息';\n let ok = '确定';\n let cancel = '取消';\n if (msg) msgs = msg;\n else if (lang === 'en') {\n msgs = 'Are you sure you want to proceed?';\n hint = 'Hint';\n ok = 'Ok';\n cancel = 'Cancel';\n }\n\n return new Promise((resolve, reject) => {\n ElMessageBox.confirm(msgs, hint, {\n confirmButtonText: ok,\n cancelButtonText: cancel,\n type,\n showCancelButton,\n } as ConfirmOptions)\n .then(() => {\n resolve(true);\n })\n .catch(() => {\n reject(false);\n });\n });\n};\n\nexport const message = async (msg: unknown, type: MessageType = 'warning', tableedit: boolean = false) => {\n if (tableedit === false) {\n const messageObj = document.body.querySelector('body>.el-message');\n // if (messageObj) messageObj.style.display = 'none';\n if (messageObj) return;\n const notifyObj = document.body.querySelector('body>.el-notification');\n if (notifyObj) return;\n }\n let m = 'No message...';\n if (isError(msg)) m = msg.message || 'No message...';\n else if (typeof msg === 'string' || typeof msg === 'number' || typeof msg === 'boolean') m = String(msg);\n else if (typeof msg === 'object') m = JSON.stringify(msg);\n const duration = type === 'error' ? messageTimeError : messageTime;\n ElMessage({\n message: m,\n showClose: true,\n type,\n duration: duration,\n });\n await sleep(duration);\n};\n","<!--\n * @title: button component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 16:43:34\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 16:16:19\n * @version: 1.1.0\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvIcon } from '@@/GvIcon';\n import { GvPopconfirm } from '@@/GvPopconfirm';\n import { getVNodeText } from '@@/utils';\n import { confirm } from '@@/utils/gv.notify';\n import { ElButton, useGlobalConfig, type ButtonType, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, getCurrentInstance, ref, unref, watch, type Component, type PropType } from 'vue';\n import { useRoute } from 'vue-router';\n import type { BizType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('button');\n\n export default defineComponent({\n name: 'GvButton',\n props: {\n visible: {\n type: Boolean,\n default: true,\n },\n text: {\n type: String,\n default: '',\n },\n otext: {\n type: String,\n default: '',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n type: {\n type: String as PropType<ButtonType>,\n default: 'default',\n },\n link: {\n type: Boolean,\n default: false,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: [Boolean, String] as PropType<boolean | string>,\n default: false,\n },\n refForm: {\n type: String,\n required: false,\n default: undefined,\n },\n icon: {\n // type: [String, Object] as PropType<string | DefineComponent>,\n type: String,\n default: '',\n },\n nativeType: {\n type: String,\n default: 'button',\n },\n bizType: {\n type: String as PropType<BizType>,\n default: undefined,\n },\n args: {\n type: String,\n default: undefined,\n },\n confirm: {\n type: [Boolean, String],\n default: false,\n },\n perms: {\n type: String,\n default: undefined,\n },\n cb: {\n type: Function as PropType<(args?: any) => void>,\n default: () => {},\n },\n },\n\n // @emits\n emits: ['click', 'confirm'],\n\n setup(props, { emit, slots }) {\n // @data\n // const attrs = useAttrs();\n const { t } = useBridgeI18n();\n const route = useRoute();\n const appStore = useAppStore();\n const instance = getCurrentInstance();\n const globalSize = useGlobalConfig('size');\n const buttonSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const buttonConfirm = computed(() => appStore.buttonConfirm);\n const loadings = ref(props.loading);\n const locked = ref(false);\n const isShow = ref(props.visible);\n const isIf = ref(true);\n\n // @computed\n const getSlots = computed(() => {\n if (props.text && props.otext) return props.text;\n else return slots.default?.();\n });\n\n // @watch\n watch(\n () => props.loading,\n (v) => (loadings.value = v),\n );\n watch(\n () => props.visible,\n (v) => (isShow.value = v),\n );\n\n // @method\n\n const invokeClick = async (e: MouseEvent) => {\n const raw = instance?.vnode?.props?.onClick as ((event: MouseEvent, args?: string) => unknown) | ((event: MouseEvent, args?: string) => unknown)[] | undefined;\n const handlers = raw ? (Array.isArray(raw) ? raw : [raw]) : [];\n if (handlers.length === 0) {\n emit('click', e, props.args);\n return;\n }\n for (const handler of handlers) await handler(e, props.args);\n };\n\n const withLoading = async (task: () => void | Promise<void>) => {\n if (props.loading) {\n await task();\n return;\n }\n loadings.value = true;\n try {\n await task();\n } finally {\n loadings.value = false;\n }\n };\n\n const setIconStyle = () => {\n if (!props.icon) return '';\n if (props.icon.startsWith('el-icon'))\n return (\n <GvIcon\n iconType=\"el\"\n iconName={props.icon.replace('el-icon-', '')}\n />\n );\n else if (props.icon.startsWith('iconfont') || props.icon.startsWith('gv-icon'))\n return (\n <GvIcon\n iconType=\"iconfont\"\n iconName={props.icon.replace('iconfont', '')}\n />\n );\n else return <GvIcon iconName={props.icon} />;\n // 父组件如果传递了图标组件,就使用图标组件,如果传递了ep图标名称,就使用ep图标名称\n // if (typeof props.icon === 'string')\n // return (\n // <GvIcon\n // iconName={props.icon}\n // className={props.icon}\n // />\n // );\n // else {\n // const Icons = props.icon;\n // return <Icons />;\n // }\n };\n\n const checkPerms = () => {\n if (route) {\n const meta = route.meta;\n if (meta) {\n const pm = meta.pm || '';\n if (pm) {\n let filter: string = props.text || '';\n if (props.otext) filter = props.otext;\n if (filter === '') {\n const slot = slots.default?.();\n if (slot && slot[0]) filter = getVNodeText(slot[0]) || '';\n }\n if (filter) {\n const pmArr = pm.split(',');\n const perms = pmArr.filter((x) => x.indexOf(filter) !== -1);\n if (perms.length > 0) {\n const p = perms[0];\n const arr = p.split('|');\n if (arr[0] !== ' ' && arr[1] && arr[1] === 'f') {\n isShow.value = false;\n isIf.value = false;\n }\n }\n }\n }\n }\n }\n };\n\n const handleClick = async (e: MouseEvent, type?: string) => {\n // 判断是否是reset\n if (props.bizType === 'reset') {\n let parent: any = instance?.parent; // form\n while (parent && parent.type?.name !== 'ElForm') parent = parent.parent;\n await parent.exposed.resetFields?.();\n\n while (parent && parent.type?.name !== 'GvForm') parent = parent.parent;\n const rootForm = parent;\n // console.log(rootForm);\n const originFormList = rootForm?.exposed.originFormList.value;\n const formList = rootForm?.props.formList;\n // console.log(parent.props.model.value);\n if (originFormList && Array.isArray(originFormList))\n originFormList.forEach((x: any, index: number) => {\n if (x.type === 'dic') formList[index]['filtercode'] = x.filtercode; // 重置字典的filtercode\n formList[index]['value'] = x.value;\n formList[index]['showLabel'] = x.showLabel;\n formList[index]['hidden'] = x.hidden;\n formList[index]['disabled'] = x.disabled;\n // 重置日期\n if (x.dateType === 'daterange2' || x.dateType === 'datetimerange2') {\n parent.props.model.value[x.field + '-start'] = undefined;\n parent.props.model.value[x.field + '-end'] = undefined;\n parent.props.model.value[x.field] = undefined;\n }\n });\n // 重置按钮自定义回调\n await props.cb?.(props.args);\n\n const rootEl = parent?.vnode.el as HTMLElement;\n // 重置日期\n const dateRangeSingles = rootEl?.querySelectorAll('.gv-daterange__single') as NodeListOf<HTMLElement>;\n if (dateRangeSingles)\n for (let i = 0; i < dateRangeSingles.length; i++) {\n const startInput = dateRangeSingles[i].querySelector('.gv-datepicker-range-start .el-input__inner') as HTMLInputElement | null;\n if (startInput) startInput.value = '';\n const endInput = dateRangeSingles[i].querySelector('.gv-datepicker-range-end .el-input__inner') as HTMLInputElement | null;\n if (endInput) endInput.value = '';\n }\n // update: 重置后执行查询方法 2022-04-17\n await withLoading(async () => {\n const searchBtn = parent?.vnode.el?.querySelector('.gv-search-bar .el-button--primary') as HTMLElement | undefined;\n searchBtn?.click();\n });\n return;\n } else if (props.bizType === 'import' || props.bizType === 'export') {\n emit('click', e, props.args);\n return;\n }\n\n await withLoading(async () => {\n if (type === 'confirm' && buttonConfirm.value === false)\n try {\n await confirm(t('common.confirmMsg'));\n } catch {\n return;\n }\n\n if (!locked.value) {\n locked.value = true;\n try {\n await invokeClick(e);\n } finally {\n locked.value = false;\n }\n }\n });\n };\n\n // @created\n\n // @mounted\n // onMounted(() => {\n // checkPerms();\n // });\n\n // @render\n /** ===== render 渲染 ===== */\n return () => {\n // validate btn perms\n checkPerms();\n\n const classz = props.bizType ? `${prefixCls} ${props.bizType}` : `${prefixCls}`;\n if (isIf.value) {\n let renderBtn: Component;\n if (props.confirm === 'true' || props.confirm === true)\n if (buttonConfirm.value === false)\n renderBtn = (\n <ElButton\n ref=\"gv-button\"\n style={{ display: isShow.value ? '' : 'none' }}\n data-ref-form={props.refForm}\n size={buttonSize.value}\n type={props.type !== 'text' ? props.type : undefined}\n link={props.link}\n loading={loadings.value}\n disabled={!!props.disabled}\n icon={setIconStyle()}\n native-type={props.nativeType}\n onClick={(e: MouseEvent) => handleClick(e, 'confirm')}\n class={classz}>\n {getSlots.value}\n </ElButton>\n );\n else\n renderBtn = (\n <GvPopconfirm\n title={t('common.confirmMsg')}\n onConfirm={(e: MouseEvent) => handleClick(e, 'confirm')}>\n {{\n reference: () => (\n <ElButton\n ref=\"gv-button\"\n style={{ display: isShow.value ? '' : 'none' }}\n data-ref-form={props.refForm}\n size={buttonSize.value}\n type={props.type !== 'text' ? props.type : undefined}\n link={props.link}\n loading={loadings.value}\n disabled={!!props.disabled}\n icon={setIconStyle()}\n native-type={props.nativeType}\n class={classz}>\n {getSlots.value}\n </ElButton>\n ),\n }}\n </GvPopconfirm>\n );\n else\n renderBtn = (\n <ElButton\n ref=\"gv-button\"\n style={{ display: isShow.value ? '' : 'none' }}\n data-ref-form={props.refForm}\n size={buttonSize.value}\n type={props.type !== 'text' ? props.type : undefined}\n link={props.link}\n loading={loadings.value}\n disabled={!!props.disabled}\n icon={setIconStyle()}\n native-type={props.nativeType}\n onClick={(e: MouseEvent) => handleClick(e)}\n class={classz}>\n {getSlots.value}\n </ElButton>\n );\n return renderBtn;\n } else return null;\n };\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-button';\n .#{$prefixCls} {\n :deep(i + span) {\n margin-left: 5px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvButton from './src/GvButton.vue';\n\nconst GvButtonPlugin = {\n install(app: App): void {\n app.component(GvButton.name ?? 'GvButton', GvButton);\n },\n};\nexport default GvButtonPlugin;\n\nexport { GvButton };\n","<!--\n * @title: card component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 09:39:53\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 15:18:37\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCard } from 'element-plus';\n import { defineComponent } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('card');\n\n export default defineComponent({\n name: 'GvCard',\n props: {},\n setup(_props, { slots }) {\n // @method\n /**\n *@todo: 设置header标题\n *@author: bugcao\n *@date: 2026-05-09 09:31:12\n *@version: v0.0.1\n */\n const getCardHeader = () => {\n if (slots.header?.()) return <div class=\"clearfix\">{slots.header?.()}</div>;\n else return null;\n };\n\n // @render\n return () => (\n <ElCard class={prefixCls}>\n {{\n header: () => getCardHeader(),\n default: () => slots.default?.(),\n }}\n </ElCard>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-card';\n .#{$prefixCls} {\n .clearfix::before,\n .clearfix::after {\n display: table;\n content: '';\n }\n .clearfix::after {\n clear: both;\n }\n :deep(.el-card__body) {\n padding: 10px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCard from './src/GvCard.vue';\n\nconst GvCardPlugin = {\n install(app: App): void {\n app.component(GvCard.name ?? 'GvCard', GvCard);\n },\n};\nexport default GvCardPlugin;\n\nexport { GvCard };\n","<!--\n * @title: cascader component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:32:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-03 14:20:07\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import { ElCascader, useGlobalConfig, type CascaderOption, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('cascader');\n\n export default defineComponent({\n name: 'GvCascader',\n props: {\n vref: {\n type: String,\n required: false,\n default: '',\n },\n name: {\n type: String,\n required: false,\n default: undefined,\n },\n id: {\n type: String,\n required: false,\n default: undefined,\n },\n value: {\n type: Array,\n required: false,\n default: () => [],\n },\n options: {\n type: Array as PropType<CascaderOption[]>,\n required: false,\n default: () => [],\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n placeholder: {\n type: String,\n required: false,\n default: 'All', // 请选择\n },\n disabled: {\n type: Boolean,\n required: false,\n default: false,\n },\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n clearable: {\n type: Boolean,\n required: false,\n default: true,\n },\n showAllLevels: {\n type: Boolean,\n required: false,\n default: true,\n },\n separator: {\n type: String,\n required: false,\n default: ' / ',\n },\n trigger: {\n type: String,\n required: false,\n default: 'hover',\n },\n filterable: {\n type: Boolean,\n required: false,\n default: true,\n },\n multiple: {\n type: Boolean,\n required: false,\n default: false,\n },\n lazy: {\n type: Boolean,\n required: false,\n default: false,\n },\n lazyLoad: {\n type: Function as PropType<(node: any, resolve: (data: any[]) => void, reject: () => void) => void>,\n required: false,\n default: () => {},\n },\n },\n // @emit\n emits: ['input', 'blur', 'focus', 'keydown', 'change'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useBridgeI18n();\n const sOps = props.options;\n const inputValue = ref(props.value);\n const globalSize = useGlobalConfig('size');\n\n // @computed\n const cascaderSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sPlaceHolder = computed(() => (props.placeholder ? props.placeholder : t('common.pleaseInput')));\n const getDisabled = computed(() => props.disabled);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n\n // 回调参数:(value: string | number)\n // const handleInput = (val) => {\n // emit('input', val);\n // };\n const handleChange = (val) => {\n emit('change', val);\n };\n const handleBlur = (event) => {\n emit('blur', event);\n };\n /**\n * @todo: 搜索\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-10-07 15:48:09\n * @param {*} node\n * @param {*} query\n */\n const handleFilterMethod = (node, query) => {\n // console.log(node);\n const path = node.path;\n const labels = node.pathLabels;\n const data = node.data;\n if (query) {\n if (path.join(',').indexOf(query) >= 0) return true;\n if (labels.join(',').indexOf(query) >= 0) return true;\n if (data.spell)\n if (data.spell.indexOf(query) >= 0) return true;\n else {\n const pathNodes = node.pathNodes;\n return pathNodes.some((x) => {\n if (x.data.spell && x.data.spell.indexOf(query) >= 0) return true;\n });\n }\n }\n };\n\n // @render\n return (\n <ElCascader\n ref={props.vref || 'gv-cascader'}\n id={resolvedInputId.value}\n {...(props.name ? { name: props.name } : {})}\n class={prefixCls}\n v-model={inputValue.value}\n style={{ display: props.value ? '' : 'none' }}\n size={cascaderSize.value}\n placeholder={sPlaceHolder.value}\n options={sOps}\n disabled={getDisabled.value}\n show-all-levels={props.showAllLevels}\n clearable={props.clearable}\n separator={props.separator}\n filterable={props.filterable}\n filter-method={handleFilterMethod}\n debounce={400}\n onBlur={handleBlur}\n onChange={handleChange}\n collapse-tags\n props={{\n expandTrigger: props.trigger as 'click' | 'hover',\n lazy: props.lazy,\n lazyLoad: props.lazyLoad,\n multiple: props.multiple,\n }}></ElCascader>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-cascader';\n .#{$prefixCls} {\n width: 100%;\n\n :deep(.el-input) {\n &.is-focus {\n .el-input__inner {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n .el-input__inner {\n height: 30px !important;\n line-height: 30px;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCascader from './src/GvCascader.vue';\nconst GvCascaderPlugin = {\n install(app: App): void {\n app.component(GvCascader.name ?? 'GvCascader', GvCascader);\n },\n};\nexport default GvCascaderPlugin;\n\nexport { GvCascader };\n","<!--\n * @title: checkbox component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 15:50:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:51:56\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCheckbox, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { TCheckboxValueType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('checkbox');\n\n export default defineComponent({\n name: 'GvCheckbox',\n\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [Boolean, String, Number] as PropType<TCheckboxValueType>,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n indeterminate: {\n type: Boolean,\n default: false,\n },\n label: {\n type: [String, Number, Boolean] as PropType<TCheckboxValueType>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n border: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n },\n\n // @emit\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n const globalSize = useGlobalConfig('size');\n const checkboxValue = ref(props.value);\n const checkboxSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n /** 同步外部值 */\n watch(\n () => props.value,\n (val) => {\n checkboxValue.value = val;\n },\n );\n\n // @method\n /** 更新值 */\n const handleUpdate = (val: TCheckboxValueType) => {\n checkboxValue.value = val;\n emit('update:modelValue', val);\n };\n /** change事件 */\n const handleChange = (val: TCheckboxValueType) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElCheckbox\n class={prefixCls}\n modelValue={checkboxValue.value}\n onUpdate:modelValue={handleUpdate}\n label={props.label}\n indeterminate={props.indeterminate}\n disabled={props.disabled}\n border={props.border}\n size={checkboxSize.value}\n style={{ display: props.visible ? '' : 'none' }}\n onChange={handleChange}>\n {slots.default?.()}\n </ElCheckbox>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-checkbox';\n .#{$prefixCls} {\n padding: 5px 0 5px 15px;\n //font-size: $appTextSize;\n\n :deep(.el-checkbox__input) {\n .el-checkbox__inner {\n &:hover {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-focus {\n .el-checkbox__inner {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-checked {\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n\n &:hover {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n\n :deep(.el-checkbox__input.is-checked + .el-checkbox__label) {\n color: var(--primaryColor, $primaryColor);\n }\n\n :deep(.el-checkbox__label) {\n //font-size: $appTextSize;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCheckbox from './src/GvCheckbox.vue';\n\nconst GvCheckboxPlugin = {\n install(app: App): void {\n app.component(GvCheckbox.name ?? 'GvCheckbox', GvCheckbox);\n },\n};\nexport default GvCheckboxPlugin;\n\nexport { GvCheckbox };\n","<!--\n * @title: checkbox button component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 16:41:13\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:52:18\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCheckboxButton, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TCheckboxButtonValue } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('checkbox-button');\n\n export default defineComponent({\n name: 'GvCheckboxButton',\n inheritAttrs: false,\n\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [String, Number, Boolean] as PropType<TCheckboxButtonValue>,\n default: undefined,\n },\n name: {\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n indeterminate: {\n type: Boolean,\n required: false,\n default: false,\n },\n label: {\n type: [String, Number, Boolean] as PropType<TCheckboxButtonValue>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n border: {\n type: Boolean,\n required: false,\n default: false,\n },\n size: {\n type: String as PropType<'large' | 'default' | 'small'>,\n default: 'default',\n },\n },\n\n // @emit\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n const globalSize = useGlobalConfig('size');\n /** 内部值 */\n const checkboxValue = ref(props.value);\n\n // @watch\n /** 同步外部值 */\n watch(\n () => props.value,\n (val) => {\n checkboxValue.value = val;\n },\n );\n\n // @computed\n /** checkbox尺寸 */\n const checkboxButtonSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @method\n /** 更新v-model */\n const handleUpdate = (val: TCheckboxButtonValue) => {\n checkboxValue.value = val;\n emit('update:modelValue', val);\n };\n\n // @render\n return () => (\n <ElCheckboxButton\n modelValue={checkboxValue.value}\n onUpdate:modelValue={handleUpdate}\n value={props.value}\n label={props.label}\n indeterminate={props.indeterminate}\n disabled={props.disabled}\n size={checkboxButtonSize.value}\n class={prefixCls}\n border={props.border}\n style={{ display: props.visible ? '' : 'none' }}>\n {slots.default?.()}\n </ElCheckboxButton>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-checkbox-button';\n .#{$prefixCls} {\n padding: 5px 0 5px 15px;\n //font-size: $appTextSize;\n\n :deep(.el-checkbox-button__inner) {\n //font-size: $appTextSize;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvCheckboxButton from './src/GvCheckboxButton.vue';\n\nconst GvCheckboxButtonPlugin = {\n install(app: App): void {\n app.component(GvCheckboxButton.name ?? 'GvCheckboxButton', GvCheckboxButton);\n },\n};\nexport default GvCheckboxButtonPlugin;\n\nexport { GvCheckboxButton };\n","<!--\n * @title: checkbox group component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 16:08:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 15:26:16\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCheckboxGroup, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TCheckboxGroupType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('checkbox-group');\n\n export default defineComponent({\n name: 'GvCheckboxGroup',\n\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: Array as PropType<TCheckboxGroupType>,\n required: false,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n size: {\n type: String as PropType<'large' | 'default' | 'small'>,\n default: 'default',\n },\n min: {\n type: Number,\n default: undefined,\n },\n max: {\n type: Number,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n\n // @emit\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n const globalSize = useGlobalConfig('size');\n\n const checkboxValue = ref(props.value);\n\n // @computed\n const checkboxGroupSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n /** 同步外部值 */\n watch(\n () => props.value,\n (val) => {\n checkboxValue.value = val;\n },\n );\n\n // @method\n /** 更新 v-model */\n const handleUpdate = (val: TCheckboxGroupType) => {\n checkboxValue.value = val;\n emit('update:modelValue', val);\n };\n /** change事件 */\n const handleChange = (val: TCheckboxGroupType) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElCheckboxGroup\n modelValue={checkboxValue.value}\n onUpdate:modelValue={handleUpdate}\n size={checkboxGroupSize.value}\n aria-label={props.label}\n min={props.min}\n max={props.max}\n disabled={props.disabled}\n class={prefixCls}\n onChange={handleChange}>\n {slots.default?.()}\n </ElCheckboxGroup>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-checkbox-group';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvCheckboxGroup from './src/GvCheckboxGroup.vue';\n\nconst GvCheckboxGroupPlugin = {\n install(app: App): void {\n app.component(GvCheckboxGroup.name ?? 'GvCheckboxGroup', GvCheckboxGroup);\n },\n};\nexport default GvCheckboxGroupPlugin;\n\nexport { GvCheckboxGroup };\n","<!--\n * @title: col component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 10:00:33\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:24:29\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCol } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('col');\n\n export default defineComponent({\n name: 'GvCol',\n props: {\n span: {\n type: Number,\n default: 24,\n },\n offset: {\n type: Number,\n default: 0,\n },\n xs: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n sm: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n md: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n lg: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n xl: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n tag: {\n type: String,\n default: 'div',\n },\n visible: {\n type: Boolean,\n default: true,\n },\n },\n setup(props, { slots }) {\n // @render\n return () => (\n <ElCol\n ref=\"gv-col\"\n style={{ display: props.visible ? '' : 'none' }}\n xs={props.xs}\n sm={props.sm}\n md={props.md}\n lg={props.lg}\n xl={props.xl}\n span={props.span}\n offset={props.offset}\n tag={props.tag}\n class={prefixCls}>\n {slots.default?.()}\n </ElCol>\n );\n },\n });\n</script>\n","import type { App } from 'vue';\nimport GvCol from './src/GvCol.vue';\n\nconst GvColPlugin = {\n install(app: App): void {\n app.component(GvCol.name ?? 'GvCol', GvCol);\n },\n};\nexport default GvColPlugin;\n\nexport { GvCol };\n","/*\n * 日期工具函数(Vue3 + TS 重构版)\n */\n\nexport type LocaleType = 'zh' | 'en' | 'english';\n\nconst localLabels = {\n monthes: {\n english: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n en: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n zh: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n },\n weekdays: {\n english: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n en: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n zh: ['日', '一', '二', '三', '四', '五', '六'],\n },\n meridians: {\n english: ['a.m.', 'p.m.'],\n en: ['AM', 'PM'],\n zh: ['上午', '下午'],\n },\n dayagos: {\n english: ['Today', 'Yesterday', 'Tomorrow', ' days ago', ' days late'],\n en: ['Today', 'Yesterday', 'Tomorrow', ' days ago', ' days late'],\n zh: ['今天', '昨天', '明天', '天前', '天后'],\n },\n};\n\nexport const toMidnight = (date: Date): Date => {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return d;\n};\n\nexport const daysAgo = (date: Date, days = 0, midnight = false): Date => {\n const result = new Date(date.getTime() - days * 8.64e7);\n return midnight ? toMidnight(result) : result;\n};\n\nexport const monthBegin = (date: Date, offset = 0): Date => {\n const days = date.getDate() - 1 - offset;\n return daysAgo(date, days, true);\n};\n\nexport const quarterBegin = (date: Date): Date => {\n const month = date.getMonth() - (date.getMonth() % 3);\n return toMidnight(new Date(date.getFullYear(), month, 1));\n};\n\nexport const yearBegin = (date: Date): Date => toMidnight(new Date(date.getFullYear(), 0, 1));\n\nconst padZero = (value: string | number, len = 2): string => String(value).padStart(len, '0');\n\nexport const strftime = (date: Date, format?: string, local: LocaleType = 'zh'): string => {\n if (!format) {\n const str = new Date(date.getTime() + 2.88e7).toISOString();\n return str.substring(0, 16).replace('T', ' ');\n }\n\n const locale = local.startsWith('zh') ? 'zh' : 'en';\n\n format = format.replace('%F', '%Y-%m-%d');\n format = format.replace(/%D|%x/g, '%m/%d/%y');\n format = format.replace(/%T|%X/g, '%H:%M:%S');\n format = format.replace('%R', '%H:%M');\n\n return format.replace(/%[A-Za-z%]/g, (f) => {\n let ans: string | number = f;\n\n switch (f) {\n case '%%':\n ans = '%';\n break;\n\n case '%Y':\n ans = date.getFullYear();\n break;\n\n case '%y':\n ans = date.getFullYear() % 100;\n break;\n\n case '%m':\n ans = date.getMonth() + 1;\n break;\n\n case '%d':\n ans = date.getDate();\n break;\n\n case '%H':\n ans = date.getHours();\n break;\n\n case '%M':\n ans = date.getMinutes();\n break;\n\n case '%S':\n ans = date.getSeconds();\n break;\n\n case '%b':\n case '%B': {\n const key = f === '%B' && locale === 'en' ? 'english' : locale;\n ans = localLabels.monthes[key][date.getMonth()];\n break;\n }\n\n case '%a':\n case '%A': {\n const key = f === '%A' && locale === 'en' ? 'english' : locale;\n ans = localLabels.weekdays[key][date.getDay()];\n break;\n }\n\n default:\n break;\n }\n\n if (['%y', '%m', '%d', '%H', '%M', '%S'].includes(f)) return padZero(ans);\n\n return String(ans);\n });\n};\n\nexport const humanize = (date: Date, local: LocaleType = 'zh'): string => {\n const locale = local.startsWith('zh') ? 'zh' : 'en';\n\n const result = strftime(date, '', locale);\n\n const today = toMidnight(new Date()).getTime();\n const current = toMidnight(date).getTime();\n\n const days = (today - current) / 8.64e7;\n\n if (days <= -10 || days >= 10) return result;\n\n const labels = localLabels.dayagos[locale];\n\n let lbl = '';\n\n if (days === 0) lbl = labels[0];\n else if (days === 1) lbl = labels[1];\n else if (days === -1) lbl = labels[2];\n else if (days >= 2) lbl = `${days}${labels[3]}`;\n else lbl = `${Math.abs(days)}${labels[4]}`;\n\n return lbl + result.substring(10, 16);\n};\n","/*\n * @title: 日期组件左侧选择日期快捷键(非区间模式)\n * @author: bugcao@163.com\n * @Date: 2022-05-14 08:33:20\n * @LastEditors: bugcao@163.com\n * @LastEditTime: 2022-05-14 08:33:20\n * @version: 0.0.1\n * @copyright: copyright (c) 2022 bugcao\n */\nimport { daysAgo, monthBegin, quarterBegin, yearBegin } from './datetime';\n\nexport interface ShortcutItem {\n text: string;\n value: Date | [Date, Date] | (() => Date | [Date, Date]);\n}\n\nconst now = () => new Date();\n\n/** 单日期快捷选择 */\nexport const dateShortcuts: ShortcutItem[] = [\n {\n text: '今天',\n value: () => now(),\n },\n {\n text: '昨天',\n value: () => daysAgo(now(), 1),\n },\n {\n text: '最近一周',\n value: () => daysAgo(now(), 7),\n },\n {\n text: '最近30天',\n value: () => daysAgo(now(), 30),\n },\n {\n text: '本月开始',\n value: () => monthBegin(now()),\n },\n {\n text: '本季开始',\n value: () => quarterBegin(now()),\n },\n];\n\n/** 英文单日期快捷选择 */\nexport const dateShortcutsEn: ShortcutItem[] = [\n {\n text: 'Today',\n value: () => now(),\n },\n {\n text: 'Yesterday',\n value: () => daysAgo(now(), 1),\n },\n {\n text: 'Last week',\n value: () => daysAgo(now(), 7),\n },\n {\n text: 'Last 30 days',\n value: () => daysAgo(now(), 30),\n },\n {\n text: 'Month start',\n value: () => monthBegin(now()),\n },\n {\n text: 'Season Start',\n value: () => quarterBegin(now()),\n },\n];\n\n/** 日期时间快捷选择 */\nexport const dateTimeShortcuts = dateShortcuts.slice(0, 3);\n\nexport const dateTimeShortcutsEn = dateShortcutsEn.slice(0, 3);\n\n/** 日期范围快捷选择 */\nexport const dateRangeShortcuts: ShortcutItem[] = [\n {\n text: '最近一周',\n value: () => {\n const start = new Date(daysAgo(now(), 7).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '最近30天',\n value: () => {\n const start = new Date(daysAgo(now(), 30).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '本月至今',\n value: () => {\n const start = new Date(monthBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '本季至今',\n value: () => {\n const start = new Date(quarterBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: '今年至今',\n value: () => [yearBegin(now()), now()],\n },\n {\n text: '最近六个月',\n value: () => {\n const end = now();\n const start = new Date();\n\n start.setMonth(start.getMonth() - 6);\n\n return [start, end];\n },\n },\n];\n\n/** 英文日期范围快捷选择 */\nexport const dateRangeShortcutsEn: ShortcutItem[] = [\n {\n text: 'Last week',\n value: () => {\n const start = new Date(daysAgo(now(), 7).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Last 30 days',\n value: () => {\n const start = new Date(daysAgo(now(), 30).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Month date',\n value: () => {\n const start = new Date(monthBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Season date',\n value: () => {\n const start = new Date(quarterBegin(now()).setHours(0, 0, 0, 0));\n const end = new Date(now().setHours(23, 59, 59, 999));\n\n return [start, end];\n },\n },\n {\n text: 'Year date',\n value: () => [yearBegin(now()), now()],\n },\n {\n text: 'Last 6 mon',\n value: () => {\n const end = now();\n const start = new Date();\n\n start.setMonth(start.getMonth() - 6);\n\n return [start, end];\n },\n },\n];\n\n/** 日历快捷选择 */\nexport const calendarShortcuts = [...dateShortcuts];\n","<!--\n * @title: 自定义日期选择组件\n * @author: bugcao@163.com\n * @date: 2026-06-08 14:52:11\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 13:45:54\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Bugcao\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElDatePicker, useGlobalConfig, type ComponentSize, type DatePickerType } from 'element-plus';\n import { computed, defineComponent, ref, unref, useAttrs, watch, type PropType } from 'vue';\n import { useI18n } from 'vue-i18n';\n import { dateRangeShortcuts, dateRangeShortcutsEn, dateShortcuts, dateShortcutsEn, dateTimeShortcuts, dateTimeShortcutsEn } from './shortcuts';\n import type { TDatePickerSize, TDatePickerType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('datepicker');\n\n export default defineComponent({\n // @define name\n name: 'GvDatePicker',\n\n // @props\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: [Date, String, Array] as PropType<TDatePickerType>,\n default: undefined,\n },\n type: {\n type: String as PropType<DatePickerType>,\n default: 'date',\n },\n format: {\n type: String,\n default: 'YYYY-MM-DD',\n },\n valueFormat: {\n type: String,\n default: 'YYYY-MM-DD',\n },\n defaultTime: {\n type: Array,\n default: undefined,\n },\n size: {\n type: String as PropType<TDatePickerSize>,\n default: 'default',\n },\n rangeSeparator: {\n type: String,\n default: undefined,\n },\n startPlaceholder: {\n type: String,\n default: undefined,\n },\n endPlaceholder: {\n type: String,\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n disabledDateFunc: {\n type: Array,\n default: () => [],\n },\n disabledDate: {\n type: Function,\n default: () => {},\n },\n editable: {\n type: Boolean,\n default: true,\n },\n unlink: {\n type: Boolean,\n default: false,\n },\n },\n\n // @emits\n emits: ['update:modelValue', 'change', 'blur', 'focus', 'pick', 'input'],\n\n setup(props, { emit }) {\n // @hooks\n const { locale, t } = useI18n();\n const attrs = useAttrs();\n const globalSize = useGlobalConfig('size');\n\n // @data\n const inputValue = ref(props.modelValue);\n\n // @watch\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @computed\n const datePickerSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n const getShortcuts = computed(() => {\n if (locale.value === 'en')\n if (props.type === 'date') return dateShortcutsEn;\n else if (props.type === 'datetime') return dateTimeShortcutsEn;\n else if (props.type === 'daterange' || props.type === 'datetimerange') return dateRangeShortcutsEn;\n else return '';\n // fixme: 查看源码是'',如果是[],则依旧会出现左边栏\n else if (props.type === 'date') return dateShortcuts;\n else if (props.type === 'datetime') return dateTimeShortcuts;\n else if (props.type === 'daterange' || props.type === 'datetimerange') return dateRangeShortcuts;\n else return ''; // fixme: 查看源码是'',如果是[],则依旧会出现左边栏\n });\n /**\n * @todo: 设置pickerOptions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-08 17:03:41\n */\n const getPickerOptions = computed(() => {\n const pickerOptions: any = {\n shortcuts: getShortcuts.value,\n };\n if (props.disabledDateFunc.includes('beforeToday'))\n // 禁止选择今天之前日期(可以选择今天)\n pickerOptions['disabledDate'] = (date: Date) => date.getTime() < Date.now() - 8.64e7;\n if (props.disabledDateFunc.includes('afterToday'))\n // 禁止选择今天之后的日期(可以选择今天)\n pickerOptions['disabledDate'] = (date: Date) => date.getTime() > Date.now();\n if (props.disabledDate) {\n const db = { disabledDate: props.disabledDate };\n return { ...pickerOptions, ...db };\n } else return { ...pickerOptions };\n });\n\n // @methods\n /**\n * @todo: 回调参数:(value: string | number)\n * @author: bugcao@163.com\n * @Date: 2026-06-08 16:03:12\n * @param {*} value\n */\n const handleInput = (value: TDatePickerType) => {\n emit('update:modelValue', value);\n emit('input', value);\n };\n /**\n * @todo: 变化时触发\n * @author: bugcao@163.com\n * @Date: 2026-06-08 15:05:50\n * @param {*} value\n */\n const handleChange = (value: string) => {\n emit('change', value);\n };\n /**\n * @todo: 失去焦点方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-08 18:39:51\n * @param {*} vm 当前vue组件对象\n */\n const handleBlur = (vm: FocusEvent) => {\n // console.log(vm);\n // const val = vm.$el.querySelector('input').value;\n // if (val) {\n // const format = vm.format;\n // if (!this.userInput)\n // this.userInput = moment(val, format.toUpperCase()).format(format.toUpperCase());\n // if (this.userInput !== 'Invalid date')\n // vm.userInput = this.userInput;\n // // picker.vue中触发value的方法\n // // vm.handleChange();\n emit('blur', vm);\n // this.userInput = '';\n // }\n };\n /**\n * @todo: 获得焦点方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-08 18:39:51\n * @param {*} vm 当前vue组件对象\n */\n const handleFocus = (vm: FocusEvent) => {\n emit('focus', vm);\n };\n /**\n * @todo: 选中日期回调:只有在range模式下有效\n * @author: bugcao@163.com\n * @Date: 2026-06-08 16:16:51\n * @param {*} maxDate\n * @param {*} minDate\n */\n const handlePick = (val: [Date, null | Date]) => {\n emit('pick', { maxDate: val[0], minDate: val[1] });\n };\n\n // @render\n return () => (\n <div class={prefixCls}>\n <ElDatePicker\n ref={props.vref || 'gv-datepicker'}\n id={resolvedInputId.value}\n name={props.name}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleInput}\n type={props.type}\n range-separator={props.rangeSeparator || t('common.until')}\n placeholder={props.placeholder || t('common.selectDate')}\n startPlaceholder={props.startPlaceholder || t('common.startDate')}\n endPlaceholder={props.endPlaceholder || t('common.endDate')}\n default-time={props.defaultTime}\n disabled-date={getPickerOptions.value?.disabledDate}\n shortcuts={getPickerOptions.value.shortcuts}\n format={props.format}\n clearable={props.clearable}\n valueFormat={props.valueFormat}\n {...({\n onCalendarChange: handlePick,\n onBlur: handleBlur,\n onFocus: handleFocus,\n onChange: handleChange,\n } as any)}\n size={datePickerSize.value}\n disabled={props.disabled}\n editable={props.editable}\n prefix-icon=\"\"\n unlink-panels={props.unlink}\n {...attrs}\n // { ...this.$listeners }\n ></ElDatePicker>\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-datepicker';\n .#{$prefixCls} {\n width: 100% !important;\n vertical-align: middle;\n :deep(.el-date-editor) {\n width: 100%;\n }\n :deep(.el-input.is-disabled) {\n .el-input__inner {\n color: $textColor;\n }\n }\n &.el-range-editor.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n :deep(.el-input__inner) {\n height: 30px;\n line-height: 30px;\n //font-size: $appTextSize;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n .el-range__close-icon {\n width: 20px;\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n .el-date-editor--daterange {\n :deep(.el-range-separator) {\n padding-right: 2px;\n padding-left: 0;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDatePicker from './src/GvDatePicker.vue';\n\nconst GvDatePickerPlugin = {\n install(app: App): void {\n app.component(GvDatePicker.name ?? 'GvDatePicker', GvDatePicker);\n },\n};\nexport default GvDatePickerPlugin;\n\nexport { GvDatePicker };\n","/*\n * @title: dialog drag\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 10:50:25\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-15 10:52:45\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport type { Directive } from 'vue';\n\n/** 使用 WeakSet 跟踪已绑定拖拽事件的 header 元素,避免内存泄漏 */\nconst boundElements = new WeakSet<HTMLElement>();\n\n/**\n * 初始化拖拽功能\n */\nconst initDrag = (el: HTMLElement, collapseMenu: boolean = false) => {\n /** Vue3 dialog - 支持 appendToBody 的情况 */\n let dragDom = el.querySelector('.el-dialog') as HTMLElement;\n if (!dragDom) dragDom = document.querySelector('.el-dialog') as HTMLElement;\n\n if (!dragDom) {\n console.warn('gv-drag-dialog: 未找到 dialog 元素');\n return false;\n }\n\n /** Vue3 dialog header - 支持自定义 header 和默认 header */\n let dialogHeaderEl: HTMLElement | null = null;\n dialogHeaderEl = dragDom.querySelector('.el-dialog__header') as HTMLElement;\n if (!dialogHeaderEl) dialogHeaderEl = dragDom.querySelector('.gv-dialog__title') as HTMLElement;\n\n if (!dialogHeaderEl) {\n console.warn('gv-drag-dialog: 未找到 dialog header 元素');\n return false;\n }\n\n /** 避免重复绑定 */\n if (boundElements.has(dialogHeaderEl)) return true;\n boundElements.add(dialogHeaderEl);\n\n /** 鼠标移动样式 */\n dialogHeaderEl.style.cursor = 'move';\n /** 初始化顶部 */\n dragDom.style.top = '0px';\n /** 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null) */\n const getStyle = (function () {\n if ((window.document as any).currentStyle) return (dom: HTMLElement, attr: string) => (dom as any).currentStyle[attr];\n else return (dom: HTMLElement, attr: string) => getComputedStyle(dom, null)[attr as any];\n })();\n\n dialogHeaderEl.onmousedown = (e: MouseEvent) => {\n /** 鼠标按下,计算当前元素距离可视区的距离 */\n const disX = e.clientX - dialogHeaderEl!.offsetLeft;\n const disY = e.clientY - dialogHeaderEl!.offsetTop;\n\n const dragDomWidth = dragDom.offsetWidth;\n const dragDomHeight = dragDom.offsetHeight;\n\n const screenWidth = document.body.clientWidth;\n const screenHeight = document.body.clientHeight;\n\n /** 左侧边界 */\n const minDragDomLeft = dragDom.offsetLeft;\n /** 右侧边界 */\n const menuWidth = collapseMenu ? 54 : 200;\n const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth - menuWidth;\n\n /** 上边界 */\n const minDragDomTop = dragDom.offsetTop;\n /** 下边界 */\n // 45: toolbar height;34: tags view height\n const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight - 45 - 34;\n\n /** 获取到的值带px 正则匹配替换 */\n let styL: string | number = getStyle(dragDom, 'left');\n let styT: string | number = getStyle(dragDom, 'top');\n\n /** 百分比转像素 */\n if (typeof styL === 'string' && styL.includes('%')) {\n styL = document.body.clientWidth * (+styL.replace(/%/g, '') / 100);\n styT = document.body.clientHeight * (+String(styT).replace(/%/g, '') / 100);\n } else {\n styL = +String(styL).replace(/\\px/g, '');\n styT = +String(styT).replace(/\\px/g, '');\n }\n\n /** 鼠标移动 */\n const onMouseMove = (ev: MouseEvent) => {\n /** 通过事件委托,计算移动的距离 */\n let left = ev.clientX - disX;\n let top = ev.clientY - disY;\n\n /** 边界处理 */\n if (-left > minDragDomLeft) left = -minDragDomLeft;\n else if (left > maxDragDomLeft) left = maxDragDomLeft;\n\n if (-top > minDragDomTop) top = -minDragDomTop;\n else if (top > maxDragDomTop) top = maxDragDomTop;\n\n /** 移动当前元素 */\n dragDom.style.left = `${left + Number(styL)}px`;\n dragDom.style.top = `${top + Number(styT)}px`;\n };\n\n const onMouseUp = () => {\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n };\n\n return true;\n};\n\nconst dragDialog: Directive = {\n /**\n * @title 挂载时调用\n * @param el 指令绑定的元素\n * @param binding 指令绑定的参数\n * @description Vue3 中需要使用 nextTick 等待 DOM 渲染完成,并通过 querySelector 查找 ElDialog 内部元素\n */\n // mounted(el: HTMLElement, binding: DirectiveBinding, vnode: VNode) {\n // // 使用 setTimeout 确保 ElDialog 已经渲染完成\n // setTimeout(() => {\n // // 尝试初始化,如果 dialog 还没打开,会在 opened 事件中再次尝试\n // initDrag(el);\n // }, 200);\n // },\n};\nexport default dragDialog;\nexport { initDrag };\n","<!--\n * @title: dialog component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-09 09:57:32\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 18:04:43\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvIcon } from '@@/GvIcon';\n import { getVNodeText, sleep } from '@@/utils';\n import { ElDialog } from 'element-plus';\n import { defineComponent, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, watch, type VNode } from 'vue';\n import { initDrag } from './drag';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('dialog');\n\n export default defineComponent({\n name: 'GvDialog',\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: false,\n },\n title: {\n type: String,\n required: false,\n default: '标题',\n },\n hasFooter: {\n type: Boolean,\n required: false,\n default: true,\n },\n width: {\n type: String,\n required: false,\n default: '75%',\n },\n height: {\n type: String,\n required: false,\n default: undefined,\n },\n nest: {\n type: Boolean,\n required: false,\n default: false,\n },\n appendToBody: {\n type: Boolean,\n required: false,\n default: false,\n },\n fullscreen: {\n type: Boolean,\n required: false,\n default: false,\n },\n maxHeight: {\n type: String,\n required: false,\n default: undefined,\n },\n closeOnClickModal: {\n type: Boolean,\n required: false,\n default: false,\n },\n closeOnPressEscape: {\n type: Boolean,\n required: false,\n default: true,\n },\n dialogClass: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n emits: ['open', 'opened', 'close', 'closed', 'cancel', 'update:visible'],\n\n setup(props, { slots, emit }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n const buttonQuick = appStore.buttonQuick;\n const collapseMenus = appStore.collapseMenus;\n const instance = getCurrentInstance();\n\n let myDialogClass = props.dialogClass || prefixCls;\n let dialogVisible = props.visible;\n const maskVisible = ref(false);\n const vref = 'gv-dialog';\n const dialogMaxHeight = ref(props.height);\n let sAppendToBody = props.appendToBody;\n const modalAppendToBody = ref(false);\n let sNest = props.nest;\n let modalMask = props.nest;\n\n // @watch\n watch(\n () => props.visible,\n (newValue) => {\n // fixme: watch中跟踪visible,解决如将ht-dialog在一个vue组件中,如不设置,则第二次无法显示\n dialogVisible = newValue;\n if (dialogVisible)\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n else maskVisible.value = false;\n },\n );\n\n // @method\n const handleVisible = (visible: boolean) => {\n dialogVisible = visible;\n };\n const handleOpen = () => {\n emit('open');\n };\n const handleOpened = () => {\n emit('opened');\n nextTick(() => {\n initDrag(instance?.vnode?.el as HTMLElement, collapseMenus);\n });\n };\n const handleClose = () => {\n dialogVisible = false;\n maskVisible.value = false;\n // 延迟异步触发\n // sleep(500).then(() => {\n // this.$emit('update:visible', false);\n // });\n emit('close');\n };\n const handleClosed = () => {\n emit('update:visible', false);\n };\n\n const handleCancel = (event) => {\n dialogVisible = false;\n maskVisible.value = false;\n emit('cancel', event);\n };\n /**\n * @todo: render footer button\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 11:19:11\n */\n const renderFooterBtn = () => {\n const footer = slots.footer?.();\n footer?.forEach((x) => {\n const tag = typeof x.type === 'object' && x.type !== null ? (x.type as any).name || '' : '';\n const text = getVNodeText(x.children?.[0]) || '';\n // add: 增加text属性,判断权限使用 2023-04-18\n if (!x.props) x.props = {};\n const propsData = x.props;\n propsData.text = text;\n if (tag)\n if (text.indexOf(t('dialogBar.save')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-baocun2';\n if (buttonQuick) if (text === t('dialogBar.save')) propsData.text = t('dialogBar.save2');\n propsData.otext = t('dialogBar.save');\n } else if (text.indexOf(t('dialogBar.add')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-baocun2';\n if (buttonQuick)\n if (text === t('dialogBar.add')) {\n propsData.text = t('dialogBar.add2');\n propsData.otext = t('dialogBar.add');\n }\n } else if (text.indexOf(t('dialogBar.confirm')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.confirm')) {\n propsData.text = t('dialogBar.confirm2');\n propsData.otext = t('dialogBar.confirm');\n }\n } else if (text.indexOf(t('dialogBar.affirm')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.affirm')) {\n propsData.text = t('dialogBar.affirm2');\n propsData.otext = t('dialogBar.affirm');\n }\n } else if (text.indexOf(t('dialogBar.approve')) !== -1) {\n propsData.bizType = 'approve';\n propsData.icon = 'gv-icon-shenpi1';\n } else if (text.indexOf(t('dialogBar.download')) !== -1) {\n // if (text === t('dialogBar.download')) x.children[0].text = t('dialogBar.download2');\n propsData.bizType = 'download';\n propsData.icon = 'gv-icon-xiazai';\n } else if (text.indexOf(t('dialogBar.delete')) !== -1) {\n propsData.bizType = 'delete';\n propsData.icon = 'el-icon-delete';\n } else if (text.indexOf(t('dialogBar.reject')) !== -1) {\n propsData.bizType = 'reject';\n propsData.icon = 'gv-icon-bohui2';\n } else if (text.indexOf(t('dialogBar.export')) !== -1) {\n propsData.bizType = 'export';\n propsData.icon = 'gv-icon-daochu1';\n } else if (text.indexOf(t('dialogBar.generate')) !== -1) {\n propsData.bizType = 'generate';\n propsData.icon = 'gv-icon-zujian';\n } else if (text.indexOf(t('dialogBar.trace')) !== -1) {\n propsData.bizType = 'trace';\n propsData.icon = 'gv-icon-jiankongguanli';\n } else if (text.indexOf(t('dialogBar.receive')) !== -1) {\n propsData.bizType = 'receive';\n propsData.icon = 'gv-icon-piliangbianji1';\n } else if (text.indexOf(t('dialogBar.transfer')) !== -1) {\n propsData.bizType = 'save';\n propsData.icon = 'gv-icon-tiaobo';\n } else if (text.indexOf(t('dialogBar.circleCheck')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-huanjiance';\n } else if (text.indexOf(t('dialogBar.completed')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-xuanze';\n } else if (text.indexOf(t('dialogBar.finished')) !== -1 || text.indexOf(t('dialogBar.beCompleted')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-wangongqueren';\n } else if (text.indexOf(t('dialogBar.submit')) !== -1) {\n propsData.bizType = 'submit';\n propsData.icon = 'gv-icon-tijiao';\n if (buttonQuick)\n if (text === t('dialogBar.submit')) {\n propsData.text = t('dialogBar.submit2');\n propsData.otext = t('dialogBar.submit');\n }\n }\n });\n return footer;\n };\n\n /**\n * @todo: footer render\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 10:34:41\n */\n const getFooter = () => {\n if (props.hasFooter)\n if (slots.footer?.())\n return (\n <div>\n {renderFooterBtn()}\n <GvButton\n onClick={handleCancel}\n icon=\"iconfont gv-icon-fanhui2\">\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n // <el-button type='primary' onClick={this.handleConfirm}>确 定(S)</el-button>\n else\n return (\n <div>\n <GvButton\n onClick={handleCancel}\n icon=\"iconfont gv-icon-fanhui2\">\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n };\n\n /**\n * @todo: mask\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 10:38:59\n */\n const setMask = () => {\n let mask: VNode | null = null;\n if (maskVisible.value)\n mask = (\n <div\n class=\"v-modal gv-dialog-modal z-[9]\"\n tabindex=\"0\"></div>\n );\n return mask;\n };\n\n const getMaxHeight = () => {\n if (!props.height) dialogMaxHeight.value = document.documentElement.clientHeight - 230 + 'px';\n else if (props.height.indexOf('%') === -1) dialogMaxHeight.value = parseFloat(props.height) - 180 + 'px';\n else dialogMaxHeight.value = props.height; // 百分比方式\n };\n\n // @created\n // fixme: 解决嵌套弹窗问题 2022-08-08\n const pEl = instance?.parent?.parent?.vnode.el;\n if (pEl)\n try {\n const p = pEl.closest('.gv-drawer,.gv-dialog');\n if (p) sNest = true;\n } catch {\n // error\n }\n if (sNest) {\n myDialogClass = props.dialogClass ? 'gv-dialog is-nested ' + props.dialogClass : 'gv-dialog is-nested';\n sAppendToBody = true;\n modalAppendToBody.value = true;\n modalMask = true;\n } else modalMask = false;\n\n onBeforeUnmount(() => {\n window.removeEventListener('resize', getMaxHeight);\n });\n\n // mounted\n onMounted(() => {\n // fixme: v-show属性使用单独的变量,在挂载时再显示,如在data中直接定义为true,会造成抖动 2022-04-11\n if (dialogVisible) maskVisible.value = true;\n\n nextTick(() => {\n window.addEventListener('resize', getMaxHeight);\n // 计算高度\n getMaxHeight();\n });\n });\n\n // @render\n return () => (\n <div class=\"gv-dialog__popup\">\n <ElDialog\n ref={vref}\n // route={this.route}\n modelValue={dialogVisible}\n onUpdate:modelValue={handleVisible}\n appendToBody={sAppendToBody}\n modal-append-to-body={modalAppendToBody.value}\n close-on-click-modal={props.closeOnClickModal}\n close-on-press-escape={props.closeOnPressEscape}\n showClose={true}\n destroy-on-close={true}\n fullscreen={props.fullscreen}\n modal={modalMask}\n // before-close={this.handleBeforeClose}\n onClose={handleClose}\n onClosed={handleClosed}\n onOpen={handleOpen}\n onOpened={handleOpened}\n class={myDialogClass}\n width={props.width}\n style={{ height: `${props.height}` }}>\n {{\n header: () => (\n <div class=\"gv-dialog__title\">\n <span>\n <GvIcon\n iconType=\"iconfont\"\n iconName=\"gv-icon-chuangkou01\"\n />\n {props.title}\n </span>\n </div>\n ),\n default: () => (\n <div\n class=\"gv-dialog__body__inner\"\n style={{ maxHeight: `${dialogMaxHeight.value} !important` }}>\n {slots.default?.()}\n </div>\n ),\n footer: () => <div class=\"dialog-footer\">{getFooter()}</div>,\n }}\n </ElDialog>\n {setMask()}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n .gv-dialog__popup {\n :deep(.el-modal-dialog) {\n position: absolute !important;\n &.is-nested {\n top: 100px;\n left: 14%;\n }\n .el-overlay-dialog {\n position: absolute !important;\n overflow: hidden;\n .el-dialog {\n max-height: 93.5% !important;\n margin-top: 25px !important;\n padding: 0px;\n\n .el-dialog__header {\n box-sizing: border-box;\n height: 30px;\n padding: 0 15px;\n line-height: 30px;\n background-color: #e1e5ec !important;\n border-bottom: 1px solid $borderColor;\n\n .gv-dialog__title {\n //font-size: $appTextSize;\n line-height: inherit;\n\n & i {\n padding-right: 10px;\n //font-size: $textSize;\n font-weight: bolder;\n }\n }\n\n .el-dialog__headerbtn {\n width: 16px;\n height: 25px;\n top: 2px;\n right: 12px;\n font-size: 20px;\n font-weight: bolder;\n line-height: normal;\n\n &:hover .el-dialog__close {\n color: var(--primaryColor, $primaryColor);\n }\n\n .el-dialog__close {\n font-size: 16px;\n font-weight: bolder;\n }\n }\n }\n\n .el-dialog__body {\n padding: 5px 5px 5px 15px;\n overflow: hidden;\n\n .gv-dialog__body__inner {\n padding-right: 15px;\n overflow: hidden auto;\n }\n\n .fullscreen-btn {\n position: absolute;\n top: 16px;\n right: 42px;\n padding: 5px;\n line-height: 1;\n cursor: pointer;\n\n &:hover {\n color: $primaryColor;\n }\n }\n\n .container {\n padding: 0 15px;\n }\n }\n\n .el-dialog__footer {\n .gv-popconfirm {\n padding: 1px 0 1px 8px;\n }\n\n .el-button i + span {\n margin-left: 5px;\n }\n\n padding: 5px 15px;\n border-top: 1px solid $borderColor;\n }\n }\n }\n }\n }\n\n .gv-tabs {\n .gv-dialog {\n top: -10px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDialog from './src/GvDialog.vue';\nconst GvDialogPlugin = {\n install(app: App): void {\n app.component(GvDialog.name ?? 'GvDialog', GvDialog);\n },\n};\nexport default GvDialogPlugin;\n\nexport { GvDialog };\n","<!--\n * @title: divider component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:24:57\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 18:03:45\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElDivider } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n import type { DividerDirection } from './types';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('divider');\n\n export default defineComponent({\n name: 'GvDivider',\n emits: ['setDividerShow'],\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n label: {\n type: String,\n required: true,\n default: '栏目',\n },\n position: {\n type: String,\n required: false,\n default: 'left',\n },\n direction: {\n type: String as PropType<DividerDirection>,\n required: false,\n default: 'horizontal',\n },\n target: {\n type: String,\n required: false,\n default: undefined,\n },\n },\n\n setup(props, { emit }) {\n /**\n * @todo: click divider — toggle form visibility via parent isShow\n */\n const clickDivider = (event: MouseEvent | TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n emit('setDividerShow', !props.visible);\n };\n\n return () => (\n <div\n class={prefixCls}\n onClick={(event) => clickDivider(event)}>\n <ElDivider\n content-position={props.position}\n direction={props.direction}>\n <span class=\"title\">{props.label}</span>\n </ElDivider>\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-divider';\n .#{$prefixCls} {\n width: 100%;\n height: 20px;\n margin: 5px 0 8px 0;\n overflow: hidden;\n user-select: none;\n\n // 禁止选中文本\n &:hover {\n cursor: pointer;\n }\n :deep(.el-divider--horizontal) {\n margin: 8px 0;\n .el-divider__text {\n padding: 0 $modulePadding;\n &.is-left {\n left: -$moduleMargin;\n }\n .title {\n display: inline-block;\n height: 20px;\n //font-size: $textSizeSecondary;\n font-weight: $fontWeight;\n line-height: 20px;\n color: $textColor;\n\n &::before {\n display: inline-block;\n width: 5px;\n height: 100%;\n margin-right: 8px;\n vertical-align: middle;\n content: '';\n background-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDivider from './src/GvDivider.vue';\nconst GvDividerPlugin = {\n install(app: App): void {\n app.component(GvDivider.name ?? 'GvDivider', GvDivider);\n },\n};\nexport default GvDividerPlugin;\n\nexport { GvDivider };\n","<!--\n * @title: drawer component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-09 09:58:21\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-10 09:01:23\n * @version: 1.0.7\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvIcon } from '@@/GvIcon';\n import { getVNodeText, sleep } from '@@/utils';\n import { ElDrawer } from 'element-plus';\n import { defineComponent, nextTick, onMounted, ref, watch, type PropType, type VNode } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('drawer');\n\n export default defineComponent({\n name: 'GvDrawer',\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: false,\n },\n title: {\n type: String,\n required: false,\n default: '标题',\n },\n direction: {\n type: String as PropType<'rtl' | 'ltr' | 'ttb' | 'btt'>,\n required: false,\n default: 'rtl',\n },\n size: {\n type: [String, Number],\n required: false,\n default: '95%', // 95%\n },\n paddingHeight: {\n type: [Number],\n required: false,\n default: 100, // 100\n },\n },\n emits: ['close', 'closed', 'open', 'opened', 'cancel', 'resize', 'update:visible'],\n\n setup(props, { slots, emit }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n\n const drawerVisible = ref(props.visible);\n const maskVisible = ref(false);\n const vref = 'gv-drawer';\n const drawerMaxHeight = ref(0);\n const show = ref(false);\n const buttonQuick = appStore.buttonQuick;\n const buttonIcon = appStore.buttonIcon;\n const sPaddingHeight = appStore.drawerPaddingHeight ? appStore.drawerPaddingHeight : props.paddingHeight;\n\n // @watch\n watch(\n () => props.visible,\n (newVal) => {\n // fixme: watch中跟踪visible,解决如将ht-drawer在一个vue组件中,如不设置,则第二次无法显示\n drawerVisible.value = newVal;\n if (drawerVisible.value)\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n else maskVisible.value = false;\n },\n );\n\n // @method\n\n const handleOpen = () => {\n // this.maskVisible = true;\n emit('open');\n };\n const handleOpened = () => {\n // this.maskVisible = true;\n emit('opened');\n };\n\n const handleClosed = () => {\n emit('update:visible', false);\n };\n\n const handleResize = (evt: MouseEvent, size: number) => {\n emit('resize', evt, size);\n };\n\n const handleCancel = (event: Event) => {\n drawerVisible.value = false;\n maskVisible.value = false;\n emit('cancel', event);\n };\n\n const handleVisible = (visible: boolean) => {\n drawerVisible.value = visible;\n };\n\n const handleClose = () => {\n drawerVisible.value = false;\n maskVisible.value = false;\n emit('update:visible', false);\n // 延迟异步触发\n // sleep(500).then(() => {\n // this.$emit('update:visible', false);\n // });\n // this.$emit('close', event);\n };\n\n /**\n * @todo: set footer button shortcut\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 15:25:50\n */\n const renderFooterBtn = () => {\n const footer = slots.footer?.();\n footer?.forEach((x) => {\n const tag = typeof x.type === 'object' && x.type !== null ? (x.type as any).name || '' : '';\n const text = getVNodeText(x) || '';\n if (!x.props) x.props = {};\n const propsData = x.props;\n propsData.text = text;\n if (tag)\n if (text.indexOf(t('dialogBar.save')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-baocun2';\n if (buttonQuick)\n if (text === t('dialogBar.save')) {\n propsData.text = t('dialogBar.save2');\n propsData.otext = t('dialogBar.save');\n }\n } else if (text.indexOf(t('dialogBar.confirm')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.confirm')) {\n propsData['otext'] = t('dialogBar.confirm');\n propsData.text = t('dialogBar.confirm2');\n }\n } else if (text.indexOf(t('dialogBar.affirm')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-queding';\n if (buttonQuick)\n if (text === t('dialogBar.affirm')) {\n propsData.text = t('dialogBar.affirm2');\n propsData.otext = t('dialogBar.confirm');\n }\n } else if (text.indexOf(t('dialogBar.approve')) !== -1) {\n propsData.bizType = 'approve';\n if (buttonIcon) propsData.icon = 'gv-icon-shenpi1';\n } else if (text.indexOf(t('dialogBar.reject')) !== -1) {\n propsData.bizType = 'reject';\n if (buttonIcon) propsData.icon = 'gv-icon-bohui2';\n } else if (text.indexOf(t('dialogBar.pay')) !== -1) {\n propsData.bizType = 'pay';\n if (buttonIcon) propsData.icon = 'gv-icon-yingshoukuan';\n } else if (text.indexOf(t('dialogBar.receive')) !== -1) {\n propsData.bizType = 'receive';\n if (buttonIcon) propsData.icon = 'gv-icon-piliangbianji1';\n } else if (text.indexOf(t('dialogBar.export')) !== -1) {\n propsData.bizType = 'export';\n if (buttonIcon) propsData.icon = 'gv-icon-daochu1';\n } else if (text.indexOf(t('dialogBar.generate')) !== -1) {\n propsData.bizType = 'generate';\n if (buttonIcon) propsData.icon = 'gv-icon-zujian';\n } else if (text.indexOf(t('dialogBar.trace')) !== -1) {\n propsData.bizType = 'trace';\n if (buttonIcon) propsData.icon = 'gv-icon-jiankongguanli';\n } else if (text.indexOf(t('dialogBar.publish')) !== -1) {\n propsData.bizType = 'publish';\n if (buttonIcon) propsData.icon = 'gv-icon-fabu';\n } else if (text.indexOf(t('dialogBar.transfer')) !== -1) {\n propsData.bizType = 'save';\n if (buttonIcon) propsData.icon = 'gv-icon-tiaobo';\n } else if (text.indexOf(t('dialogBar.download')) !== -1) {\n propsData.bizType = 'download';\n // if (text === t('dialogBar.download')) children[0].text = '下 载';\n if (buttonIcon) propsData.icon = 'gv-icon-xiazai';\n } else if (text.indexOf(t('dialogBar.delete')) !== -1 || text.indexOf(t('dialogBar.obsolete')) !== -1) {\n propsData.bizType = 'delete';\n if (buttonIcon) propsData.icon = 'el-icon-delete';\n if (buttonQuick) {\n if (text === t('dialogBar.obsolete')) {\n propsData.text = t('dialogBar.obsolete2');\n propsData.otext = t('dialogBar.obsolete');\n }\n if (text === t('dialogBar.delete')) {\n propsData.text = t('dialogBar.delete2');\n propsData.otext = t('dialogBar.delete');\n }\n }\n } else if (text.indexOf(t('dialogBar.submit')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-tijiao';\n if (buttonQuick)\n if (text === t('dialogBar.submit')) {\n propsData.text = t('dialogBar.submit2');\n propsData.otext = t('dialogBar.submit');\n }\n propsData['otext'] = t('dialogBar.submit');\n } else if (text.indexOf(t('dialogBar.circleCheck')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-huanjiance';\n } else if (text.indexOf(t('dialogBar.completed')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-xuanze';\n } else if (text.indexOf(t('dialogBar.settlement')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-eduguanli';\n } else if (text.indexOf(t('dialogBar.finished')) !== -1 || text.indexOf(t('dialogBar.beCompleted')) !== -1) {\n propsData.bizType = 'submit';\n if (buttonIcon) propsData.icon = 'gv-icon-wangongqueren';\n }\n });\n\n return footer;\n };\n\n /**\n * @todo: get footer button\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 15:38:54\n */\n const getFooter = () => {\n let returnIcon: string | undefined = 'iconfont gv-icon-fanhui2';\n if (!buttonIcon) returnIcon = undefined;\n if (slots.footer?.())\n return (\n <div class=\"gv-drawer__footer__inner\">\n {renderFooterBtn()}\n <GvButton\n onClick={handleCancel}\n icon={returnIcon}>\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n // <el-button type='primary' onClick={this.handleConfirm}>确 定(S)</el-button>\n else\n return (\n <div class=\"gv-drawer__footer__inner\">\n <GvButton\n onClick={handleCancel}\n icon={returnIcon}>\n {t('common.goback')}\n {buttonQuick ? '(E.)' : ''}\n </GvButton>\n </div>\n );\n };\n const getMaxHeight = () => {\n drawerMaxHeight.value = document.documentElement.clientHeight - 225;\n };\n\n const setMask = () => {\n let mask: VNode | null = null;\n if (maskVisible.value)\n mask = (\n <div\n tabindex=\"0\"\n class=\"v-modal gv-dialog-drawer z-[9]\"></div>\n );\n return mask;\n };\n // @created\n\n // @mounted\n onMounted(() => {\n // 实现esc按键绑定\n // this.bindListerOnEsc();\n // fixme: v-show属性使用单独的变量,在挂载时再显示,如在data中直接定义为true,会造成抖动 2022-04-11\n if (drawerVisible.value) {\n show.value = true;\n sleep(200).then(() => {\n maskVisible.value = true;\n });\n }\n getMaxHeight();\n nextTick(() => {});\n });\n // @render\n return () => (\n <div class=\"gv-drawer__popup\">\n <ElDrawer\n class={prefixCls}\n ref={vref}\n modelValue={drawerVisible.value}\n onUpdate:modelValue={handleVisible}\n direction={props.direction}\n appendToBody={false}\n modal-append-to-body={false}\n close-on-press-escape={true}\n showClose={true}\n close-on-click-modal={false}\n modal={false}\n onClose={handleClose}\n onClosed={handleClosed}\n onOpen={handleOpen}\n onOpened={handleOpened}\n onResize={handleResize}\n size={props.size}\n style={{ height: `calc(100vh - ${sPaddingHeight}px)` }}>\n {{\n header: () => (\n <div class=\"gv-drawer__title\">\n <span>\n <GvIcon\n style={{ display: buttonIcon ? '' : 'none' }}\n iconType=\"iconfont\"\n iconName=\"gv-icon-chuangkou01\"></GvIcon>\n {props.title}\n </span>\n </div>\n ),\n default: () => (\n <div style={{ overflow: 'hidden auto', maxHeight: `${drawerMaxHeight.value}px !important` }}>\n <div class=\"gv-drawer__body__inner\">{slots.default?.()}</div>\n </div>\n ),\n footer: () => <div class=\"gv-drawer__footer\">{getFooter()}</div>,\n }}\n </ElDrawer>\n {setMask()}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n .gv-drawer__popup {\n :deep(.el-modal-drawer) {\n position: absolute !important;\n top: 1px !important;\n height: calc(100vh - 100px) !important;\n .el-drawer {\n // width: 95% !important;\n height: 98% !important;\n margin-top: 1px !important;\n\n .el-drawer__header {\n box-sizing: border-box;\n height: 30px;\n padding: 0 15px;\n margin-bottom: 1px;\n line-height: 30px;\n background-color: #e1e5ec !important;\n border-bottom: 1px solid $borderColor;\n\n .gv-drawer__title {\n //font-size: $appTextSize;\n line-height: inherit;\n\n & i {\n padding-right: 10px;\n //font-size: $textSize;\n font-weight: bolder;\n }\n }\n\n .el-drawer__close-btn {\n top: 10px;\n right: 12px;\n line-height: normal;\n\n i {\n font-size: 16px;\n font-weight: bolder;\n }\n\n &:hover i {\n color: var(--primaryColor, $primaryColor);\n }\n\n .el-drawer__close {\n font-weight: bolder;\n }\n }\n }\n\n .el-drawer__body {\n padding: 5px 15px;\n overflow: hidden;\n\n .gv-drawer__body__inner {\n overflow: hidden auto;\n }\n\n .fullscreen-btn {\n position: absolute;\n top: 16px;\n right: 42px;\n padding: 5px;\n line-height: 1;\n cursor: pointer;\n\n &:hover {\n color: $primaryColor;\n }\n }\n\n .container {\n padding: 0 15px;\n }\n }\n\n .gv-drawer__footer {\n .gv-drawer__footer__inner {\n float: right;\n padding: 5px;\n\n .el-button i + span {\n margin-left: 5px;\n }\n }\n\n .gv-popconfirm {\n padding: 1px 0 1px 8px;\n }\n\n .el-button--default {\n margin-left: 8px;\n }\n\n width: 100%;\n border-top: 1px solid $borderColor;\n }\n }\n }\n }\n .gv-tabs {\n .gv-drawer {\n top: 10px;\n height: 93% !important;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvDrawer from './src/GvDrawer.vue';\nconst GvDrawerPlugin = {\n install(app: App): void {\n app.component(GvDrawer.name ?? 'GvDrawer', GvDrawer);\n },\n};\nexport default GvDrawerPlugin;\n\nexport { GvDrawer };\n","import { type VueTypeValidableDef, type VueTypesInterface, createTypes, toValidableType } from 'vue-types';\nimport type { CSSProperties } from 'vue';\n\ntype PropTypes = VueTypesInterface & {\n readonly style: VueTypeValidableDef<CSSProperties>;\n};\nconst newPropTypes = createTypes({\n func: undefined,\n bool: undefined,\n string: undefined,\n number: undefined,\n object: undefined,\n integer: undefined,\n}) as PropTypes;\n\nclass propTypes extends newPropTypes {\n static get style(): VueTypeValidableDef<CSSProperties> {\n return toValidableType('style', {\n type: [String, Object],\n });\n }\n}\n\nexport { propTypes };\n","/*\n * @title: pinyin-pro 汉字转拼音组件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-10-10 11:21:59\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-10-10 11:22:02\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { pinyin } from 'pinyin-pro';\n/**\n * usePinyin 组合式函数\n * 提供常见的中文转拼音功能\n */\nexport function usePinyin() {\n /**\n * 中文转拼音(默认无音调、空格分隔)\n * @param text 中文字符串\n * @param withTone 是否带音调(默认 false)\n */\n const toPinyin = (text: string, withTone = false): string => {\n if (!text) return '';\n return pinyin(text, {\n toneType: withTone ? 'symbol' : 'none',\n type: 'string',\n multiple: false,\n });\n };\n\n /**\n * 获取拼音首字母\n * @param text 中文字符串\n */\n const getFirstLetter = (text: string): string => {\n if (!text) return '';\n return pinyin(text, {\n pattern: 'first',\n toneType: 'none',\n type: 'string',\n }).replace(/\\s+/g, '');\n };\n\n /**\n * 获取拼音数组(按字分隔)\n * @param text 中文字符串\n */\n const getPinyinArray = (text: string): string[] => {\n if (!text) return [];\n return pinyin(text, {\n toneType: 'none',\n type: 'array',\n });\n };\n\n return {\n toPinyin,\n getFirstLetter,\n getPinyinArray,\n };\n}\n","<!--\n * @title: expand menu list\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-04 12:37:50\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:58:26\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { usePermsStore } from '@/store/modules/perms';\n import { usePinyin } from '@@/hooks/web/usePinyin';\n import { isExternal, pathResolve, sleep } from '@@/utils';\n import { Search, Star, StarFilled } from '@element-plus/icons-vue';\n import { ElAutocomplete, ElIcon, ElTabPane, ElTabs } from 'element-plus';\n import { computed, onMounted, ref } from 'vue';\n import { useI18n } from 'vue-i18n';\n import type { RouteType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu-list');\n\n defineOptions({\n name: 'GvMenuList', // 定义组件名称\n });\n const { t } = useI18n();\n const permStore = usePermsStore();\n const pinYin = usePinyin();\n const routes = computed(() => permStore.getServerRouters);\n\n const emit = defineEmits(['close']);\n\n const menuList = ref<RouteType[]>();\n const menuPath = ref('');\n\n const fMenusList = ref<AppRouteRecordRaw[]>([]);\n\n // ------ watch hook------\n // watchEffect();\n // // [routes, menusList],\n // // [\n // // (n, o) => {\n // // this.menusList = this.generateRoutes(this.routes.value);\n // // },\n // // (list) => {\n // // // 转换拼音\n // // if (this.supportPinyinSearch) this.addPinyinField(list);\n // // },\n // // ],\n\n // ------ methods hook ------\n /**\n * @todo: generate routes\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-15 10:46:56\n * @param {*} sidebarRoutes\n * @param {*} basePath\n * @param {*} prefixTitle\n * @param {*} prefixCode\n */\n\n const generateRouter = (serverRoutes: AppRouteRecordRaw[], basePath = '/', prefixTitle: string[] = [], prefixCode: string[] = []): RouteType[] => {\n let res: RouteType[] = [];\n for (const router of serverRoutes) {\n if (router.redirect === '/404') continue;\n if (router.meta?.hidden) continue;\n const data: RouteType = {\n path: pathResolve(basePath, router.path),\n title: [...(prefixTitle as string[])],\n pinyinTitle: pinYin.getFirstLetter([...(prefixTitle as string[])].join('')),\n code: [...prefixCode],\n };\n if (router.meta && router.meta.title) {\n const i18ntitle = router.meta.title;\n const code = router.meta.code || '';\n data.title = [...data.title, i18ntitle];\n data.pinyinTitle = pinYin.getFirstLetter(data.title.join(''));\n data.code = [...data.code, String(code)];\n if (router.redirect !== 'noredirect') res.push(data);\n else if (basePath === '/') fMenusList.value.push(router);\n }\n if (router.children) {\n const tempRoutes = generateRouter(router.children, data.path, data.title);\n if (tempRoutes.length >= 1) res = [...res, ...tempRoutes];\n }\n }\n return res;\n };\n\n const handleCloseDrawer = () => {\n emit('close');\n };\n\n /**\n * @todo: click menu item handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-03-09 10:56:00\n * @param {*} item\n */\n const handleSelect = (item: RouteType) => {\n // push({ path: item.path });\n // handleCloseDrawer();\n sleep(200).then(() => {\n menuPath.value = '';\n });\n };\n\n const handleSearch = (query: string, cb: any) => {\n let res: RouteType[] = [];\n if (query !== '')\n if (Array.isArray(menuList.value))\n res = menuList.value.filter((item) => {\n if (item.title.join('').indexOf(query) !== -1) return item;\n else if (item.pinyinTitle.indexOf(query.toLowerCase()) !== -1) return item;\n else if (item.path.indexOf(query) !== -1) return item;\n });\n else res = menuList.value ?? [];\n else res = menuList.value ?? [];\n cb(res);\n };\n\n /**\n * @todo: star click handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-10-11 10:20:33\n * @param {*} star\n * @param {*} path\n * @param {*} title\n * @param {*} menuItem\n */\n const starClickHandle = (star, path, title, menuItem) => {};\n\n // ------ mounted hook ------\n onMounted(() => {\n menuList.value = generateRouter(routes.value);\n // console.log('routes', permStore.getServerRouters);\n // console.log('menuList', menuList.value);\n });\n</script>\n<template>\n <div :class=\"prefixCls\">\n <!-- search -->\n <div class=\"search\">\n <div class=\"top\">\n <ElAutocomplete\n v-model=\"menuPath\"\n value-key=\"path\"\n :fetch-suggestions=\"handleSearch\"\n :placeholder=\"t('sideBar.menuSearch')\"\n @select=\"handleSelect\">\n <template #prefix>\n <ElIcon>\n <Search />\n </ElIcon>\n </template>\n <template v-slot=\"{ item }\">\n <span class=\"name\">{{ item.title.join(' > ') }}</span>\n </template>\n </ElAutocomplete>\n </div>\n </div>\n <!-- main -->\n <div class=\"main\">\n <ElTabs tab-position=\"right\">\n <ElTabPane\n v-for=\"item in fMenusList\"\n :key=\"item.name\"\n :label=\"item.meta?.title\"\n lazy>\n <div class=\"column-wrap\">\n <div\n v-for=\"sub in item.children\"\n :key=\"sub.name\"\n class=\"box\">\n <template v-if=\"!sub.children || sub.children.length === 0\">\n <ul class=\"leaf\">\n <li>\n <ElIcon @click.stop=\"starClickHandle(sub.meta?.star, sub.path, sub.meta?.title, sub)\">\n <component :is=\"sub.meta?.star ? StarFilled : Star\" />\n </ElIcon>\n <router-link\n v-if=\"!isExternal(sub.path)\"\n :to=\"`${item.path}/${sub.path}`\"\n @click=\"handleCloseDrawer\">\n {{ sub.meta?.title }}\n </router-link>\n <a\n v-else\n :href=\"sub.path\"\n target=\"_blank\"\n rel=\"noopener\">\n {{ sub.meta?.title }}</a\n >\n </li>\n </ul>\n </template>\n <template v-else>\n <h4>{{ sub.meta?.title }}</h4>\n <ul>\n <li\n v-for=\"x in sub.children\"\n :key=\"x.name\">\n <ElIcon @click.stop=\"starClickHandle(x.meta?.star, x.name, x.meta?.title, x)\">\n <component :is=\"x.meta?.star ? StarFilled : Star\" />\n </ElIcon>\n <router-link\n v-if=\"!isExternal(sub.path)\"\n :to=\"`${item.path}/${sub.path}/${x.path}`\"\n @click=\"handleCloseDrawer\">\n {{ x.meta?.title }}\n </router-link>\n <a\n v-else\n :href=\"sub.path\"\n target=\"_blank\"\n rel=\"noopener\">\n {{ x.meta?.title }}</a\n >\n </li>\n </ul>\n </template>\n </div>\n </div>\n </ElTabPane>\n </ElTabs>\n </div>\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-expand-menu-list';\n .#{$prefixCls} {\n position: absolute;\n width: 650px;\n height: 100%;\n left: 0px;\n background: #272b2c;\n &::after {\n top: 0;\n right: 0;\n width: 150px;\n height: 100%;\n content: '';\n background: #272b2c;\n }\n :deep(.search) {\n height: 100px;\n width: 500px;\n background: #313538;\n .top {\n padding: 30px 0 0 100px;\n i {\n color: var(--left-menu-text-color);\n }\n .el-autocomplete {\n width: 300px;\n border-bottom: 1px solid #626466;\n border-radius: 0;\n .el-input {\n .el-input__wrapper {\n background: var(--left-menu-expand-bg-color);\n box-shadow: none;\n padding-left: 30px;\n .el-input__inner {\n //font-size: $appTextSize;\n color: #fff;\n border: none;\n line-height: 40px;\n height: 40px;\n }\n }\n }\n }\n }\n }\n :deep(.main) {\n position: relative;\n height: calc(100% - 100px);\n .el-tabs {\n height: 100%;\n overflow-y: auto;\n &::-webkit-scrollbar {\n display: none;\n }\n .el-tabs__header {\n position: absolute;\n top: 0;\n right: 0;\n .el-tabs__nav-wrap {\n padding: 0;\n .el-tabs__nav-scroll {\n overflow-y: auto;\n .el-tabs__nav {\n padding-bottom: $modulePadding;\n }\n }\n .el-tabs__item {\n height: 30px;\n padding: 0 0 0 15px;\n //font-size: $textSize;\n line-height: 30px;\n color: $menuText;\n &.is-active {\n font-weight: 500;\n color: #fff;\n }\n }\n &.is-right {\n width: 151px;\n }\n &::after {\n display: none;\n }\n }\n }\n .el-tabs__content {\n background: #313538;\n margin-right: 150px;\n .el-tab-pane {\n padding-right: 20px;\n }\n .column-wrap {\n column-count: 2;\n column-gap: 0;\n .box {\n padding-bottom: 10px;\n padding-left: 30px;\n -webkit-column-break-inside: avoid;\n page-break-inside: avoid;\n break-inside: avoid;\n h4 {\n margin-bottom: 12px;\n height: 32px;\n //font-size: $textSize;\n font-weight: 500;\n line-height: 32px;\n color: $menuText;\n border-bottom: 1px solid #626466;\n }\n ul {\n padding-left: 0;\n margin-top: 8px;\n list-style: none;\n &.leaf {\n margin-top: 18px;\n }\n li {\n line-height: 26px;\n i {\n //font-size: 14px;\n cursor: pointer;\n top: 2px;\n }\n .el-icon {\n color: $menuText;\n }\n a {\n padding-left: 3px;\n //font-size: $textSize;\n color: $menuText;\n transition: all 0.3s ease;\n &:hover {\n color: var(--menuActiveText, $menuActiveText);\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n</style>\n","<!--\n * @title: Expand Menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-09-02 09:39:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:58:12\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { propTypes } from '@@/utils/gv.propTypes';\n import { ElDrawer } from 'element-plus';\n import { computed, ref } from 'vue';\n\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import GvMenuList from './GvMenuList.vue';\n\n defineOptions({\n name: 'GvExpandMenu', // 定义组件名称\n });\n\n const props = defineProps({\n collapse: propTypes.bool.def(true),\n });\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('expand-menu');\n\n const { t } = useBridgeI18n();\n\n // console.log('t', t('sideBar.menuNav'));\n const visible = ref(false);\n const sideWidth = computed(() => (props.collapse ? '54px' : '200px'));\n const expandHandle = () => {\n visible.value = !visible.value;\n };\n</script>\n<template>\n <div :class=\"prefixCls\">\n <div\n class=\"expand-menu-title\"\n :class=\"{ selected: visible ? true : false }\"\n @click.stop=\"expandHandle\">\n <i :class=\"['iconfont', 'gv-icon-wangzhandaohang']\"></i>\n <span\n v-if=\"!collapse\"\n class=\"text\"\n >{{ t('sideBar.menuNav') }}</span\n >\n </div>\n <ElDrawer\n v-model=\"visible\"\n :style=\"{ left: sideWidth, paddingLeft: sideWidth }\"\n class=\"sidebar-expand-drawer\"\n :with-header=\"false\"\n :append-to-body=\"true\"\n direction=\"ltr\"\n resizable\n :modal-class=\"!collapse ? 'sidebar-expand-menu-collapse' : 'sidebar-expand-menu-unCollapse'\"\n size=\"650\">\n <GvMenuList @close=\"visible = false\" />\n </ElDrawer>\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-expand-menu';\n .#{$prefixCls} {\n height: 40px;\n background-color: $menuBg;\n\n .expand-menu-title {\n width: 100%;\n padding-left: 14px;\n line-height: 48px;\n color: $menuText;\n cursor: pointer;\n\n &.selected,\n &:hover {\n color: var(--left-menu-text-active-color);\n background-color: $menuHover;\n }\n\n i {\n width: 24px;\n font-size: 20px;\n font-weight: 500;\n color: var(--left-menu-text-color);\n text-align: center;\n vertical-align: middle;\n }\n\n .text {\n display: inline-block;\n line-height: 48px;\n margin-left: 10px;\n //font-size: $textSize;\n color: var(--left-menu-text-color);\n vertical-align: middle;\n &:hover {\n color: var(--left-menu-text-active-color);\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvExpandMenu from './src/GvExpandMenu.vue';\nconst GvExpandMenuPlugin = {\n install(app: App): void {\n app.component(GvExpandMenu.name ?? 'GvExpandMenu', GvExpandMenu);\n },\n};\nexport default GvExpandMenuPlugin;\n\nexport { GvExpandMenu };\n","<!--\n * @title: input component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-29 09:22:45\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:58:39\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import { GvIcon } from '@@/GvIcon';\n import { ElInput, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { BizType, InputType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('input');\n\n export default defineComponent({\n name: 'GvInput',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n value: {\n type: [String, Number, undefined] as PropType<string | number | undefined>,\n default: '',\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n prefixIcon: {\n type: String,\n default: '',\n },\n suffixIcon: {\n type: String,\n default: '',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n maxlength: {\n type: Number,\n default: 30,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n readonly: {\n type: Boolean,\n default: false,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n type: {\n type: String as PropType<InputType>,\n default: 'text',\n },\n rows: {\n type: Number,\n default: 2,\n },\n autosize: {\n type: [Boolean, Object] as PropType<boolean | Record<string, any>>,\n default: false,\n },\n bizType: {\n type: String as PropType<BizType>,\n default: 'tableedit',\n },\n },\n\n emits: ['update:modelValue', 'input', 'blur', 'focus', 'clear', 'keydown'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useBridgeI18n();\n const globalSize = useGlobalConfig('size');\n const inputValue = ref(props.value);\n\n const showWordLimit = ref(false);\n\n // @computed\n const inputSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sPlaceholder = computed(() => props.placeholder || t('common.pleaseInput'));\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @watch\n watch(\n () => props.value,\n (newValue) => {\n inputValue.value = newValue;\n },\n );\n\n // @methods\n\n const renderPrefixIcon = (): JSX.Element | null => {\n if (!props.prefixIcon) return null;\n return <GvIcon iconName={props.prefixIcon} />;\n };\n\n const renderSuffixIcon = (): JSX.Element | null => {\n if (!props.suffixIcon) return null;\n return <GvIcon iconName={props.suffixIcon} />;\n };\n\n const getDisabled = computed(() => {\n if (typeof props.disabled === 'boolean') return props.disabled;\n if (typeof props.disabled === 'string') return props.disabled !== '';\n return false;\n });\n\n const handleInput = (val: string | number) => {\n inputValue.value = val;\n emit('update:modelValue', val);\n emit('input', val);\n };\n\n const handleBlur = (event: FocusEvent) => {\n showWordLimit.value = false;\n if (props.bizType === 'tableedit') emit('blur', event, inputValue.value, props.columnProp);\n else emit('blur', event, inputValue.value, props.vref);\n };\n\n const handleFocus = (event: FocusEvent) => {\n (event.target as HTMLInputElement).select();\n if (props.bizType === 'tableedit') emit('focus', event, inputValue.value, props.columnProp);\n else emit('focus', event, inputValue.value, props.vref);\n };\n\n const handleClear = (event: any) => {\n emit('clear', event);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n showWordLimit.value = true;\n emit('keydown', event);\n };\n\n // @render\n return () => {\n if (!props.visible) return null;\n return (\n <ElInput\n ref={props.vref}\n id={resolvedInputId.value}\n name={props.name}\n type={props.type}\n modelValue={inputValue.value}\n modelModifiers={{ number: true }}\n readonly={props.readonly}\n rows={props.rows}\n autosize={props.autosize}\n size={inputSize.value}\n showWordLimit={showWordLimit.value}\n maxlength={props.maxlength}\n placeholder={sPlaceholder.value}\n disabled={getDisabled.value}\n clearable={props.clearable}\n onInput={handleInput}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onClear={handleClear}\n onKeydown={handleKeyDown}\n class={prefixCls}\n style={{ display: props.visible ? '' : 'none' }}>\n {{\n prefix: () => renderPrefixIcon(),\n suffix: () => renderSuffixIcon(),\n }}\n </ElInput>\n );\n };\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-input';\n .#{$prefixCls} {\n display: flex;\n margin: 0;\n align-items: center;\n\n &.is-disabled {\n :deep(.el-input__inner) {\n color: $textColor;\n }\n }\n\n :deep(.el-input__inner) {\n &:focus {\n // border-color: var(--primaryColorHover, $primaryColorHover);\n }\n height: 30px;\n // padding-left: 10px;\n line-height: 30px;\n //font-size: $textSizeSecondary;\n }\n\n &.el-input--small {\n :deep(.el-input__inner) {\n height: 26px;\n line-height: 26px;\n }\n }\n\n :deep(.el-input__suffix .el-input__suffix-inner) {\n .el-input__count {\n font-size: 10px;\n padding-left: 5px;\n .el-input__count-inner {\n padding: 0;\n }\n }\n .el-input__icon {\n padding: 0;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvInput from './src/GvInput.vue';\n\nconst GvInputPlugin = {\n install(app: App): void {\n app.component(GvInput.name ?? 'GvInput', GvInput);\n },\n};\nexport default GvInputPlugin;\n\nexport { GvInput };\n","<!--\n * @title: input number component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:32:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-12 11:02:44\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\n import { ElInputNumber, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('input-number');\n\n export default defineComponent({\n name: 'GvInputNumber',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n value: {\n type: Number,\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n min: {\n type: Number,\n default: undefined,\n },\n max: {\n type: Number,\n default: undefined,\n },\n size: {\n type: String as PropType<ComponentSize>,\n required: false,\n default: undefined,\n },\n step: {\n type: Number,\n default: 1,\n },\n stepStrictly: {\n type: Boolean,\n default: false,\n },\n precision: {\n type: Number,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n bizType: {\n type: String,\n default: undefined,\n },\n position: {\n type: String,\n default: undefined,\n },\n },\n // @emit\n emits: ['update:modelValue', 'input', 'blur', 'focus', 'keydown', 'change'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useI18n();\n const inputValue = ref(props.value);\n const globalSize = useGlobalConfig('size');\n // @computed\n const inputSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const sPlaceHolder = computed(() => (props.placeholder ? props.placeholder : t('common.pleaseInput')));\n const getDisabled = computed(() => props.disabled);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n const handleInput = (val) => {\n emit('update:modelValue', val, props.vref);\n emit('input', val, props.vref);\n };\n const handleBlur = ($event: FocusEvent) => {\n if (props.bizType === 'tableedit') emit('blur', $event, inputValue.value, props.columnProp);\n else emit('blur', $event, inputValue.value, props.vref);\n };\n\n const handleFocus = ($event: FocusEvent) => {\n if ($event.target) ($event.target as HTMLInputElement).select();\n\n if (props.bizType === 'tableedit') emit('focus', $event, inputValue.value, props.columnProp);\n else emit('focus', $event, inputValue.value, props.vref);\n };\n // const handleKeyDown = ($event: KeyboardEvent) => {\n // emit('keydown', $event);\n // };\n const handleChange = (currentValue: number, oldValue: number) => {\n emit('change', currentValue, oldValue);\n };\n\n // @render\n // 注意方法的传参必须使用箭头函数方式,避免每次 render 的时候都会自动执行一次方法\n return (\n // nativeOnkeydown={(e) => this.inputKeydown(e)}\n <ElInputNumber\n class={prefixCls}\n ref={props.vref || 'gv-input-number'}\n id={resolvedInputId.value}\n name={props.name}\n v-model={inputValue.value}\n style={{ display: props.visible ? '' : 'none' }}\n size={inputSize.value}\n placeholder={sPlaceHolder.value}\n disabled={getDisabled.value}\n controls-position={props.position}\n step={props.step}\n step-strictly={props.stepStrictly}\n precision={props.precision}\n min={props.min}\n max={props.max}\n // onKeydown={handleKeyDown}\n onInput={handleInput}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onChange={handleChange}\n // { ...this.$attrs }\n // { ...this.$listeners }\n ></ElInputNumber>\n );\n },\n });\n</script>\n<style scoped lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-input-number';\n .#{$prefixCls} {\n :deep(.el-input__inner) {\n height: 30px;\n line-height: 30px;\n\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n :deep(.el-input-number__decrease),\n :deep(.el-input-number__increase) {\n height: 28px;\n line-height: 28px;\n }\n\n :deep(.el-input-number__decrease),\n :deep(.el-input-number__increase) {\n color: var(--primaryColorHover, $primaryColorHover);\n }\n\n :deep(.el-input-number__increase):hover:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled),\n :deep(.el-input-number__decrease):hover:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled) {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n &.is-controls-right {\n // line-height: 34px; // 需要定义line-height,否则高度串行\n :deep(.el-input-number__decrease) {\n bottom: 1px;\n\n &:hover {\n color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n :deep(.el-input-number__increase) {\n &:hover {\n color: var(--primaryColorHover, $primaryColorHover);\n }\n\n top: 1px;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvInputNumber from './src/GvInputNumber.vue';\nconst GvInputNumberPlugin = {\n install(app: App): void {\n app.component(GvInputNumber.name ?? 'GvInputNumber', GvInputNumber);\n },\n};\nexport default GvInputNumberPlugin;\n\nexport { GvInputNumber };\n","<!--\n * @title: select component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-29 09:36:14\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:53:12\n * @version: 1.0.7\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useNotify } from '@/hook/web/useNotify';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { ElOption, ElSelect, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import { useI18n } from 'vue-i18n';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('select');\n export default defineComponent({\n name: 'GvSelect',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: [String, Array, Object] as PropType<string | unknown[] | Record<string, unknown>>,\n default: undefined,\n },\n value: {\n type: [String, Array, Object] as PropType<string | unknown[] | Record<string, unknown>>,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n showLabel: {\n type: [String, Array],\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined, // 请选择\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n multiple: {\n type: Boolean,\n default: false,\n },\n filterable: {\n type: Boolean,\n default: true,\n },\n dicType: {\n type: String,\n required: true,\n },\n filtercode: {\n // 过滤字典码\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n dicRemote: {\n type: Function,\n default: () => {},\n },\n cb: {\n type: Function,\n default: () => {},\n },\n clear: {\n type: Function,\n default: () => {},\n },\n isreload: {\n type: Boolean,\n default: true,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n bizType: {\n type: String,\n default: undefined,\n },\n editRow: {\n type: Object,\n default: () => {},\n },\n collapseTags: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n },\n // define emit\n emits: ['update:modelValue', 'focus', 'clear', 'change'],\n setup(props, { emit }) {\n const userStore = useUserStore();\n const appStore = useAppStore();\n const { alert } = useNotify();\n const { t, locale } = useI18n();\n\n // @data\n const lang = locale.value;\n let dicIcon = 'iconfont gv-icon-shujuzidian3';\n const remote = ref(false);\n const loading = ref(false);\n const loadingText = ref('loading...');\n const sPlaceholder = computed(() => props.placeholder || t('common.all'));\n const externalValue = computed(() => (props.modelValue !== undefined ? props.modelValue : props.value));\n const inputValue = ref(externalValue.value);\n const inputShowLabel = ref(props.showLabel);\n const inputFilterable = ref(props.filterable);\n // let inputFilterable = props.filterable,\n type SelectModel = string | unknown[] | Record<string, unknown> | undefined;\n const selectValue = ref<SelectModel>(undefined);\n const options = ref<DicItem[]>([]);\n const originOptions = ref<DicItem[]>([]);\n const className = ref(`${prefixCls}`);\n const globalSize = useGlobalConfig('size');\n\n // 表选字典 t# 需在 setup 阶段识别,不能等 mounted\n const dicSrc = props.dicType?.toLowerCase() ?? '';\n if (dicSrc.startsWith('e#')) dicIcon = 'iconfont gv-icon-meiju';\n else if (dicSrc.startsWith('t#')) {\n dicIcon = 'iconfont gv-icon-24gl-table';\n remote.value = true;\n className.value = 'gv-select__table';\n }\n if (props.bizType === 'tableedit') className.value += ' tableedit';\n\n const valueCache = new Map<string, { value: string; label: string; row?: Record<string, unknown> }>();\n\n // @computed\n const selectSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @method\n\n const isEmptyLabel = (label: unknown) => label == null || label === '';\n\n const getDictItemLabel = (item: DicItem): string => {\n switch (locale.value) {\n case 'en':\n return item.e ?? item.t ?? '';\n case 'l1':\n return item.l1 ?? item.t ?? '';\n case 'l2':\n return item.l2 ?? item.t ?? '';\n default:\n return item.t ?? '';\n }\n };\n\n const formatOptionLabel = (label: string) => {\n if (!label) return '';\n return remote.value && label.includes('[') ? label.split('[')[0] : label;\n };\n\n const findLabelInOptions = (code: string, opts: DicItem[]) => {\n const item = opts.find((x) => String(x.c) === String(code));\n if (!item) return '';\n return formatOptionLabel(getDictItemLabel(item));\n };\n\n const getOptionValue = (code: string, label: string, row?: Record<string, unknown>) => {\n const key = String(code);\n const text = String(label || key);\n const cached = valueCache.get(key);\n if (cached && cached.label === text) {\n if (row) cached.row = row;\n return cached;\n }\n const obj = row ? { value: key, label: text, row } : { value: key, label: text };\n valueCache.set(key, obj);\n return obj;\n };\n\n const getSelectCode = (v: unknown) => {\n if (v == null || v === '') return '';\n if (typeof v === 'object' && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const code = o.value ?? o.c ?? o.code;\n return code == null || code === '' ? '' : String(code).trim();\n }\n return String(v).trim();\n };\n\n const getSelectLabel = (v: unknown) => {\n if (v == null || v === '') return '';\n if (typeof v === 'object' && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const label = o.label ?? o.v;\n return label == null || label === '' ? '' : String(label).trim();\n }\n return String(v).trim();\n };\n\n const isEmptySelectValue = (raw: unknown) => {\n if (raw == null || raw === '') return true;\n if (Array.isArray(raw)) {\n if (raw.length === 0) return true;\n return raw.every((item) => {\n if (item == null || item === '') return true;\n return !getSelectCode(item) && isEmptyLabel(getSelectLabel(item));\n });\n }\n if (typeof raw === 'object') return !getSelectCode(raw) && isEmptyLabel(getSelectLabel(raw));\n return false;\n };\n\n const syncEmptyToParent = () => {\n if (externalValue.value === '') return;\n emit('update:modelValue', '');\n };\n\n const elSelectModel = computed<SelectModel>(() => (isEmptySelectValue(selectValue.value) ? undefined : selectValue.value));\n\n /**\n * @todo: 远程搜索、聚焦、清空后保留当前选中项\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-04 10:52:44\n * @param {*} _opts\n */\n const mergeOptionsWithSelected = (_opts: DicItem[]) => {\n let merged = _opts ?? [];\n const append = (code: string, label: string) => {\n if (!code || merged.some((x) => x.c + '' === code)) return;\n merged = [{ c: code, t: label || code, s: '' } as DicItem, ...merged];\n };\n const sv = selectValue.value;\n if (Array.isArray(sv)) sv.forEach((item) => append(getSelectCode(item), getSelectLabel(item) || getSelectCode(item)));\n else if (sv && !isEmptySelectValue(sv)) append(getSelectCode(sv), getSelectLabel(sv) || getSelectCode(sv));\n return merged;\n };\n\n const pushDefaultOption = (op: DicItem) => {\n options.value.push(op);\n if (remote.value) originOptions.value.push({ ...op });\n };\n\n /**\n * @todo: load dict list\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:31:44\n */\n const getSelectOptions = async () => {\n if (!props.dicType) return null;\n else {\n let ret: DicItem[] = [];\n const src = props.dicType.toLowerCase();\n if (src.startsWith('e#')) {\n // const pinyin = await require('js-pinyin');\n // 生成枚举类型字典\n const arr = src.split('#')[1].split(':');\n arr.forEach((x) => {\n const xx: DicItem = {\n c: '',\n t: '',\n s: '',\n };\n const arr2 = x.split('=');\n xx['c'] = arr2[0];\n xx['t'] = arr2[1];\n xx['s'] = '';\n ret.push(xx);\n });\n return ret;\n } else {\n const dictCache = userStore.dictCache?.[src];\n if (props.filtercode === undefined && dictCache) ret = dictCache;\n else if (props.dicType === 'xzqh') {\n // 生成字典列表\n const dict = appStore.getDictDivision;\n if (dict) {\n if (props.filtercode === undefined) {\n const cache = {};\n cache['key'] = 'xzqh';\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n }\n ret = dict;\n }\n } else {\n const dict = appStore.getDict[src];\n\n if (dict) {\n // fixme: 解决字典缓存不能缓存多个问题 2022-04-13\n if (props.filtercode === undefined) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n }\n\n ret = dict;\n }\n }\n\n // 设置是否可搜索\n // this.setFilterable(ret);\n // 增加字典码过滤\n let opts = ret;\n if (props.filtercode) {\n const reg = new RegExp(props.filtercode, 'i');\n opts = ret.filter((x) => reg.test(x.c));\n }\n return opts;\n }\n }\n };\n /**\n * @todo: 设置字典项目超过5个可搜索-- 弃用\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-10 09:42:19\n * @param {*} dict\n */\n // setFilterable(dict) {\n // if (dict && dict.length > 5)\n // inputFilterable.value = true;\n // },\n // 回调参数:(value: string | number)\n // 字典自定义过滤方法\n const filterMethod = (value) => {\n if (value)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts.filter((item) => {\n // console.log(item);\n if (\n item.c.indexOf(value) !== -1 || // value检索\n item.t?.indexOf(value) !== -1 || // label检索\n item.s.indexOf(value.toLowerCase()) !== -1 // 简拼检索\n )\n return true;\n });\n });\n else\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n };\n /**\n * @todo: handle clear event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:27\n */\n const handleClear = () => {\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n else options.value = mergeOptionsWithSelected(originOptions.value);\n\n props.clear(selectValue.value, props.vref, props.dicType);\n emit('clear');\n };\n /**\n * @todo: remote dict search method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:20:03\n * @param {*} query\n */\n const initialRemoteLoaded = ref(false);\n let pendingRemoteQuery: string | null = null;\n let pendingRemotePromise: Promise<void> | null = null;\n let remoteRequestSeq = 0;\n\n const filterOriginOptions = (query: string) =>\n originOptions.value.filter((x) => {\n if (x.t) {\n const f = x.t.split(']');\n if (f[0].indexOf(query) !== -1) return true;\n }\n if (x.c && x.c.indexOf(query) !== -1) return true;\n return false;\n });\n\n const remoteDictSearch = async (query = ''): Promise<void> => {\n if (pendingRemotePromise && pendingRemoteQuery === query) return pendingRemotePromise;\n\n const requestSeq = ++remoteRequestSeq;\n pendingRemoteQuery = query;\n\n pendingRemotePromise = (async () => {\n loading.value = true;\n try {\n const sDicType = props.dicType.substring(2);\n const { datas } = await props.dicRemote(sDicType, query, props.editRow);\n if (requestSeq !== remoteRequestSeq) return;\n\n const ops: DicItem[] = [];\n try {\n JSON.parse(datas).forEach((x: any) => {\n ops.push({ c: x.c, t: x.t, s: '' } as DicItem);\n });\n } catch (e) {\n console.log(e);\n }\n\n options.value = mergeOptionsWithSelected(ops);\n originOptions.value = [...options.value];\n initialRemoteLoaded.value = true;\n } finally {\n if (requestSeq === remoteRequestSeq) {\n loading.value = false;\n loadingText.value = options.value.length === 0 ? t('common.noData') : t('common.loading');\n }\n if (pendingRemoteQuery === query) {\n pendingRemoteQuery = null;\n pendingRemotePromise = null;\n }\n }\n })();\n\n return pendingRemotePromise;\n };\n /**\n * @todo: table dict remote load method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:11:51\n */\n const remoteMethod = async (query = ''): Promise<void> => {\n const q = String(query ?? '');\n\n if (q && originOptions.value.length > 0 && props.isreload === false) {\n const filtered = filterOriginOptions(q);\n if (filtered.length > 0) {\n options.value = mergeOptionsWithSelected(filtered);\n loading.value = false;\n return;\n }\n }\n\n const needFetch = q !== '' || props.isreload || !initialRemoteLoaded.value || originOptions.value.length === 0;\n if (!needFetch) {\n options.value = mergeOptionsWithSelected(originOptions.value);\n loading.value = false;\n return;\n }\n\n await remoteDictSearch(q);\n };\n\n const ensureDefaultOption = (code: string, text: string) => {\n if (!code) return;\n const existed = options.value.find((x) => String(x.c) === String(code));\n if (existed) {\n if (text && existed.t !== text) existed.t = text;\n return;\n }\n pushDefaultOption({ c: code, t: text || code, s: '' } as DicItem);\n };\n\n const resolveDisplayLabel = async (code: string, hint?: string): Promise<string> => {\n if (hint && hint !== code) return hint;\n const localOpts = (await getSelectOptions()) ?? [];\n let label = findLabelInOptions(code, localOpts);\n if (label) return label;\n\n label = findLabelInOptions(code, options.value);\n if (label) return label;\n\n if (remote.value && code) {\n // await remoteDictSearch(code);\n // label = findLabelInOptions(code, options.value);\n // if (label) return label;\n // await remoteDictSearch('');\n // label = findLabelInOptions(code, options.value);\n }\n\n return label || code;\n };\n\n const applySelectValue = async (raw: unknown) => {\n if (isEmptySelectValue(raw)) {\n inputValue.value = undefined as typeof inputValue.value;\n selectValue.value = undefined;\n syncEmptyToParent();\n return;\n }\n inputValue.value = raw as typeof inputValue.value;\n\n if (Array.isArray(raw)) {\n const resolved: ReturnType<typeof getOptionValue>[] = [];\n for (let index = 0; index < raw.length; index++) {\n const item = raw[index];\n if (item === '') continue;\n const code = getSelectCode(item);\n let hint = getSelectLabel(item);\n if (isEmptyLabel(hint) || hint === code) {\n const showLbl = Array.isArray(props.showLabel) ? props.showLabel[index] : undefined;\n if (showLbl && showLbl !== code) hint = String(showLbl);\n }\n const text = await resolveDisplayLabel(code, isEmptyLabel(hint) || hint === code ? undefined : hint);\n const row = typeof item === 'object' && item !== null ? ((item as Record<string, unknown>).row as Record<string, unknown>) : undefined;\n resolved.push(getOptionValue(code, text, row));\n ensureDefaultOption(code, text);\n }\n selectValue.value = resolved;\n return;\n }\n\n const code = getSelectCode(raw);\n let hint = '';\n if (typeof raw === 'object' && raw !== null) {\n const o = raw as Record<string, unknown>;\n hint = String(o.label ?? o.v ?? '');\n } else if (typeof props.showLabel === 'string') hint = props.showLabel;\n const text = await resolveDisplayLabel(code, isEmptyLabel(hint) || hint === code ? undefined : hint);\n const row = typeof raw === 'object' && raw !== null ? ((raw as Record<string, unknown>).row as Record<string, unknown>) : undefined;\n selectValue.value = getOptionValue(code, text, row);\n ensureDefaultOption(code, text);\n };\n\n watch(\n externalValue,\n (newValue) => {\n void applySelectValue(newValue);\n },\n { deep: true, immediate: true },\n );\n\n watch(\n () => props.showLabel,\n (newVal) => {\n inputShowLabel.value = newVal;\n if (!isEmptySelectValue(inputValue.value)) void applySelectValue(externalValue.value ?? inputValue.value);\n },\n );\n\n /**\n * @todo: handle focus event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:35\n * @param {*} event\n */\n const handleFocus = (event: FocusEvent) => {\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n if (remote.value === false)\n if (_opts === undefined || _opts === null || _opts.length === 0) {\n alert('The dict value does not exist', 'warning');\n return false;\n }\n options.value = _opts;\n });\n emit('focus', event);\n };\n\n /**\n * @todo: handle visible change event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:25:38\n * @param {*} val\n */\n const handleVisibleChange = () => {\n // console.log(val);\n };\n\n const handleBlur = () => {\n // // add: 解决无法重新加载问题 2022-04-10\n // if (this.remote === false)\n // this.getSelectOptions().then((_opts) => {\n // this.options = _opts;\n // });\n // else\n // this.options = this.originOptions;\n };\n\n /**\n * @todo: render select option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:37:58\n * @param {*} x\n */\n const renderSelectOption = (x: DicItem) => {\n let t = x.t;\n switch (lang) {\n case 'zh-CN':\n t = x.t;\n break;\n case 'en':\n t = x.e;\n break;\n case 'l1':\n t = x.l1;\n break;\n case 'l2':\n t = x.l2;\n break;\n default:\n t = x.t;\n break;\n }\n if (!t) t = x.t;\n return (\n <ElOption\n key={x.c + ''}\n label={t}\n value={getOptionValue(x.c + '', t ?? '')}>\n <span class=\"gv-select__option--label\">{t}</span>\n <span class=\"gv-select__option--value\">{x.c}</span>\n </ElOption>\n );\n };\n\n /**\n * @todo: render table option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:44:34\n * @param {*} x\n */\n const renderTableOption = (x: DicItem) => {\n const t = x.t;\n let val = t;\n const columnTexts: string[] = [];\n const row: Record<string, string> = {};\n let multiColumn = false;\n if (t) {\n if (t.indexOf('[') !== -1) {\n // 多列显示\n multiColumn = true;\n const v1 = t.split('[');\n val = v1[0];\n let mm = v1[1];\n mm = mm.split(']')[0];\n const m2 = mm.split(',');\n for (let i = 0; i < m2.length; i++) {\n const m3 = m2[i];\n const m4 = m3.split(':');\n row[m4[0]] = m4[1];\n columnTexts.push(m4[1] === 'null' ? ' -- ' : m4[1]);\n }\n }\n if (t.indexOf('{') !== -1) {\n // 隐藏列\n const vv1 = t.split('{');\n if (multiColumn === false) val = vv1[0];\n let mmm = vv1[1];\n mmm = mmm.split('}')[0];\n const mm2 = mmm.split(',');\n for (let i = 0; i < mm2.length; i++) {\n const mm3 = mm2[i];\n const mm4 = mm3.split(':');\n row[mm4[0]] = mm4[1];\n }\n }\n }\n let key = x.c + '';\n if (props.multiple === true) key = x.val === undefined ? x.c + '' : String(x.val);\n return (\n <ElOption\n key={key}\n label={val}\n value={getOptionValue(x.c + '', val ?? '', row)}>\n <span class=\"gv-select__option--label\">{val}</span>\n <span class=\"gv-select__option--value\">{x.c}</span>\n {columnTexts.map((text, index) => (\n <span\n key={index}\n class=\"gv-select__option--column\">\n {text}\n </span>\n ))}\n </ElOption>\n );\n };\n\n /**\n * @todo: selected call back\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:27:07\n * @param {*} val\n */\n const handleChange = async (val: any) => {\n if (isEmptySelectValue(val)) return;\n let labels: string = '';\n const labelArr: string[] = [];\n if (props.multiple === true)\n options.value.forEach((x) => {\n if (Array.isArray(val) && val.some((ele) => ele === x.c)) labelArr.push(x.t ?? '');\n });\n else if (typeof val === 'object') labels = val.label ?? '';\n else {\n const opArr = options.value.filter((x) => {\n const v = val + '';\n return x.c + '' === v;\n });\n labels = opArr[0]?.t ?? '';\n if (labels) labels = labels.split('[')[0];\n }\n if (props.bizType === 'tableedit')\n if (props.multiple === true) {\n emit('change', val, labelArr, props.columnProp);\n await props.cb(val, props.columnProp, props.dicType, labelArr, props.editRow);\n } else {\n emit('change', val, labels, props.columnProp);\n await props.cb(val, props.columnProp, props.dicType, labels, props.editRow);\n }\n else if (props.multiple === true) {\n emit('change', val, labelArr);\n await props.cb(val, props.vref, props.dicType);\n } else {\n emit('change', val, labels);\n await props.cb(val, props.vref, props.dicType);\n }\n };\n /**\n * @todo: handle update modelValue\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 11:29:17\n * @param {*} value\n */\n const handleUpdate = (value: any): void => {\n if (isEmptySelectValue(value)) {\n inputValue.value = undefined as typeof inputValue.value;\n selectValue.value = undefined;\n emit('update:modelValue', '');\n return;\n }\n inputValue.value = value;\n selectValue.value = value;\n emit('update:modelValue', value);\n };\n\n if (props.dicType === undefined || props.dicType === null) alert(`[ ${props.label} ] - The dicType needs to be set`, 'warning');\n\n // @render\n return () => {\n const render =\n remote.value === false ? (\n <ElSelect\n ref=\"gv-select\"\n id={resolvedInputId.value}\n name={props.name}\n modelValue={elSelectModel.value}\n valueKey=\"value\"\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={sPlaceholder.value}\n disabled={props.disabled}\n clearable={props.clearable}\n size={selectSize.value}\n multiple={props.multiple}\n filterable={inputFilterable.value}\n filter-method={filterMethod}\n default-first-option={true}\n collapseTags={props.collapseTags}\n onClear={handleClear}\n onFocus={handleFocus}\n onVisible-change={handleVisibleChange}\n onChange={handleChange}\n class={className.value}>\n {{\n prefix: () => <i class={dicIcon}></i>,\n default: () => options.value.map((x) => renderSelectOption(x)),\n }}\n </ElSelect>\n ) : (\n <ElSelect\n ref=\"gv-select\"\n id={resolvedInputId.value}\n name={props.name}\n modelValue={elSelectModel.value}\n valueKey=\"value\"\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={sPlaceholder.value}\n disabled={props.disabled}\n clearable={props.clearable}\n size={selectSize.value}\n multiple={props.multiple}\n default-first-option={true}\n filterable={inputFilterable.value}\n remote={true}\n remote-method={remoteMethod}\n debounce={300}\n loading={loading.value}\n loading-text={loadingText.value}\n collapseTags={props.collapseTags}\n onClear={handleClear}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n class={className.value}>\n {{\n prefix: () => <i class={dicIcon}></i>,\n default: () => options.value.map((x) => renderTableOption(x)),\n }}\n </ElSelect>\n );\n return render;\n };\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-select';\n .#{$prefixCls} {\n vertical-align: middle; // fixme: 注意必须有这个参数,否则作为一行最后的列会导致串行\n :deep(.el-select__wrapper) {\n &.is-focus {\n .el-input__inner {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n .el-select__prefix {\n left: 5px !important;\n width: 15px !important;\n\n .iconfont {\n //font-size: $appTextSize;\n }\n }\n\n .el-select__placeholder {\n //font-size: $appTextSize;\n }\n }\n\n &.tableedit {\n :deep(.el-select__wrapper) {\n .el-select__input {\n padding-right: 5px !important;\n //font-size: $appTextSize;\n }\n\n .el-select__suffix {\n width: 0;\n }\n }\n }\n }\n\n .#{$gvNamespace}-select__table {\n vertical-align: middle; // fixme: 注意必须有这个参数,否则作为一行最后的列会导致串行\n :deep(.el-select__wrapper) {\n .el-select__prefix {\n left: 5px !important;\n width: 15px !important;\n\n .iconfont {\n //font-size: $appTextSize;\n }\n }\n .el-select__selection {\n //font-size: $appTextSize;\n }\n\n &.is-focus .el-select__input {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n &.tableedit {\n :deep(.el-select__wrapper) {\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSelect from './src/GvSelect.vue';\n// Define the install method on the GvButton component\nconst GvSelectPlugin = {\n install(app: App): void {\n app.component(GvSelect.name ?? 'GvSelect', GvSelect);\n },\n};\nexport default GvSelectPlugin;\n\nexport { GvSelect };\n","<!--\n * @title: switch component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 13:26:26\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-12 09:55:07\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElSwitch } from 'element-plus';\n import { defineComponent, ref, watch, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('switch');\n export default defineComponent({\n name: 'GvSwitch',\n props: {\n value: {\n type: [Boolean, Number, String] as PropType<boolean | number | string>,\n required: false,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n columnKey: {\n type: String,\n required: false,\n default: undefined,\n },\n target: {\n type: [Number, String] as PropType<number | string>,\n require: false,\n default: '100201',\n },\n },\n\n // emit\n emits: ['change'],\n setup(props, { emit }) {\n // @data\n const val = ref(props.value);\n const switchType = ref(true);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n val.value = newVal;\n switchType.value = val.value === props.target;\n },\n );\n watch(\n () => switchType.value,\n (newVal) => {\n val.value === newVal;\n },\n );\n\n // @methods\n const handleChange = (newStatus) => {\n emit('change', newStatus, val.value);\n };\n\n // @created\n switchType.value = val.value === props.target;\n\n // @render\n return () => (\n <ElSwitch\n ref=\"gv-switch\"\n v-model={switchType.value}\n key={props.columnKey}\n disabled={props.disabled}\n // active-color='#13ce66'\n // inactive-color='#ff4949'\n onChange={handleChange}\n class={prefixCls}\n />\n );\n },\n });\n</script>\n<style scoped lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-switch';\n .#{$prefixCls} {\n &.is-checked {\n :deep(.el-switch__core) {\n background-color: #13ce66;\n border-color: #13ce66;\n }\n }\n\n :deep(.el-switch__core) {\n background-color: #b3aaaa;\n border-color: #b3aaaa;\n //background-color:#ff4949;\n //border-color:#ff4949;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSwitch from './src/GvSwitch.vue';\n// Define the install method on the GvButton component\nconst GvSwitchPlugin = {\n install(app: App): void {\n app.component(GvSwitch.name ?? 'GvSwitch', GvSwitch);\n },\n};\nexport default GvSwitchPlugin;\n\nexport { GvSwitch };\n","<!--\n * @title: time picker\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 09:18:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 13:47:53\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useBridgeI18n } from '@@/bridge';\n import { ElTimePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { PropType } from 'vue';\n import { computed, defineComponent, ref, unref, watch } from 'vue';\n import type { TTimePickerSize, TTimePickerType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('timepicker');\n\n export default defineComponent({\n name: 'GvTimePicker',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n id: {\n type: String,\n default: undefined,\n },\n modelValue: {\n type: [Date, Array, String] as PropType<TTimePickerType>,\n default: undefined,\n },\n readonly: {\n type: Boolean,\n default: false,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<TTimePickerSize>,\n default: 'default',\n },\n isRange: {\n type: Boolean,\n default: false,\n },\n disabledHours: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n disabledMinutes: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n disabledSeconds: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n rangeSeparator: {\n type: String,\n default: '-',\n },\n format: {\n type: String,\n default: 'HH:mm',\n },\n valueFormat: {\n type: String,\n default: 'HH:mm',\n },\n placeholder: {\n type: String,\n default: '00:00',\n },\n startPlaceholder: {\n type: String,\n default: '',\n },\n endPlaceholder: {\n type: String,\n default: '',\n },\n editable: {\n type: Boolean,\n default: true,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n },\n\n emits: ['update:modelValue', 'change', 'blur', 'focus'],\n\n setup(props, { emit }) {\n // @data\n const { t } = useBridgeI18n();\n const globalSize = useGlobalConfig('size');\n const inputValue = ref<TTimePickerType>(props.modelValue);\n const timepickerSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @method\n /**\n *@todo: 更新v-model值\n *@author: bugcao\n *@date: 2026-05-07 15:45:52\n *@version: v0.0.1\n */\n const handleUpdate = (value: TTimePickerType) => {\n inputValue.value = value;\n emit('update:modelValue', value);\n };\n /**\n *@todo: 合并禁用小时\n *@author: bugcao\n *@date: 2026-05-08 09:02:30\n *@version: v0.0.1\n */\n const mergedDisabledHours = () => props.disabledHours;\n /**\n *@todo: 合并禁用分钟\n *@author: bugcao\n *@date: 2026-05-08 09:02:30\n *@version: v0.0.1\n */\n const mergedDisabledMinutes = () => props.disabledMinutes;\n /**\n *@todo: 合并禁用秒\n *@author: bugcao\n *@date: 2026-05-08 09:02:30\n *@version: v0.0.1\n */\n const mergedDisabledSeconds = () => props.disabledSeconds;\n /**\n *@todo: 更新change事件\n *@author: bugcao\n *@date: 2026-05-07 15:46:09\n *@version: v0.0.1\n */\n const handleChange = (value: TTimePickerType) => {\n emit('change', value);\n };\n /**\n *@todo: 更新blur事件\n *@author: bugcao\n *@date: 2026-05-07 15:46:12\n *@version: v0.0.1\n */\n const handleBlur = (e: FocusEvent) => {\n emit('blur', e);\n };\n /**\n *@todo: 更新focus事件\n *@author: bugcao\n *@date: 2026-05-07 15:46:12\n *@version: v0.0.1\n */\n const handleFocus = (e: FocusEvent) => {\n emit('focus', e);\n };\n\n const resolvedInputId = computed(() => (props.id ?? props.name ?? props.vref) || undefined);\n\n // @render\n return () => (\n <div class={prefixCls}>\n <ElTimePicker\n ref={props.vref || 'gv-timepicker'}\n id={resolvedInputId.value}\n name={props.name}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleUpdate}\n readonly={props.readonly}\n disabled={props.disabled}\n editable={props.editable}\n clearable={props.clearable}\n is-range={props.isRange}\n range-separator={props.rangeSeparator}\n size={timepickerSize.value}\n placeholder={props.placeholder || t('common.selectTime')}\n start-placeholder={props.startPlaceholder || t('common.startTime')}\n end-placeholder={props.endPlaceholder || t('common.endTime')}\n format={props.format}\n value-format={props.valueFormat}\n disabled-hours={mergedDisabledHours}\n disabled-minutes={mergedDisabledMinutes}\n disabled-seconds={mergedDisabledSeconds}\n {...({\n onChange: handleChange,\n onBlur: handleBlur,\n onFocus: handleFocus,\n } as any)}\n />\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-timepicker';\n .#{$prefixCls} {\n width: 100%;\n vertical-align: middle;\n :deep(.el-icon-time) {\n margin-left: 1px;\n }\n &.el-range-editor.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n :deep(.el-input__wrapper) {\n &:is(.is-focus) {\n box-shadow: 0 0 0 1px var(--primaryColorHover, $primaryColorHover) inset;\n }\n }\n :deep(.el-input__inner) {\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n :deep(.el-range__close-icon) {\n width: 20px;\n }\n :deep(.el-range-separator) {\n padding-right: 2px;\n padding-left: 0;\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTimePicker from './src/GvTimePicker.vue';\n\nconst GvTimePickerPlugin = {\n install(app: App): void {\n app.component(GvTimePicker.name ?? 'GvTimePicker', GvTimePicker);\n },\n};\nexport default GvTimePickerPlugin;\n\nexport { GvTimePicker };\n","/*\n * @title: info message component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:10:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-04 22:01:59\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nconst infoMsg = {\n carNo: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '车牌号格式错误';\n else info = 'car number format error.';\n return info;\n },\n double: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入浮点数.';\n else info = 'please enter Double.';\n return info;\n },\n decimal: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh-CN') info = '小数点位数不能超过: ' + len + ' 位';\n else info = 'Number of decimal places can not be more than:' + len + '.';\n return info;\n },\n idCard: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '身份证格式不正确';\n else info = 'id card format is not correct.';\n return info;\n },\n maxLen: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能超过 ' + Math.floor(len / 2) + '个汉字或 ' + len + ' 个字符';\n else info = 'Can not exceed ' + len + ' character.';\n return info;\n },\n money: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '非0开头的数字 小数最多两位.';\n else info = \"Only input Numbers, 0 can't start, the decimal two at the most.\";\n return info;\n },\n moneyMax: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh-CN') info = '整数位最多只能是: ' + len + ' 位';\n else info = 'integer digits can only be at most: ' + len;\n return info;\n },\n letter: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能输入字母以外的字符';\n else info = \"Can't input letters outside of the characters.\";\n return info;\n },\n number: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '只能输入正整数.';\n else info = 'Only enter a positive integer.';\n return info;\n },\n number0: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '只能输入不能以0开头的正整数.';\n else info = 'Only enter a non-zero positive integer, and cannot begin with zero.';\n return info;\n },\n //Add TypeScript type annotations for lang parameter\n numberLetter: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能输入数字、字母以外的字符.';\n else info = 'Can not input Numbers, letters characters.';\n return info;\n },\n //Add TypeScript type annotations for lang parameter\n name: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '不能输入数字、字母、-、_和中文以外的字符.';\n else info = 'Can not enter Numbers, letters, -, _ and Chinese characters.';\n return info;\n },\n phone: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '电话号码格式不正确.';\n else info = 'Phone format is not correct.';\n return info;\n },\n email: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '邮件格式不正确.';\n else info = 'E-mail format is not correct.';\n return info;\n },\n telephone: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的固话(格式:区号+号码,如010-1234567)';\n else info = 'Telephone format is not correct.';\n return info;\n },\n ip: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的IP地址';\n else info = 'IpAddress format is not correct.';\n return info;\n },\n url: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的url地址';\n else info = 'Url format is not correct.';\n return info;\n },\n phoneTel: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入正确的电话号码或者固话号码';\n else info = 'phone & tel format is not correct.';\n return info;\n },\n vin: (lang: string) => {\n let info = '';\n if (lang === 'zh-CN') info = '请输入后8位或17位(字母大写)';\n else info = 'must be 8 or 17 letters and Numbers.';\n return info;\n },\n};\nexport default infoMsg;\n","/*\n * @title: validate rules component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:09:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-04 20:32:12\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n/** ------------------- 验证规则 ------------------------\n * isAny: 默认规则,无校验\n * isAdmin: 验证是否是admin用户\n * isUrl: 验证url格式\n * isLowercase: 验证是否都是小写\n * isUppercase: 验证是否都是大写\n * isLetter: 验证是否都是字母( 不包括标点符号)\n * isEmail: 验证是否是email\n * isPhone: 验证电话号码\n * isIp: 验证是否是ip地址\n * isPhoneTel: 验证是否是手机号或者固定电话号\n * isTelephone: 验证是否是固定电话\n * isIdcard: 验证身份证号\n * isMoney:验证金额格式\n * isBigMoney: 验证金额格式(千位符格式)\n * isNumber: 验证是否是整数数字\n * isNumberLetter: 验证是否是数字和字母\n * isDouble: 验证浮点数格式\n * isName: 验证是否是名称格式\n * isVin: 验证vin码格式\n * isCarno: 验证车牌号(含新能源)\n ----------------------------------------------------\n*/\n\nimport infoMsg from './gv.infomsg';\n\n/**\n * @todo: 计算输入字符串的长度,汉字记为2 英文字母记为1\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 14:56:22\n * @param {*} val 对于多选字典,val是数组类型的字典码\n */\nconst calLength = function (val) {\n if (val === null || val.length === 0) return 0;\n let i, sum;\n sum = 0;\n // fixme: val有可能是数组,需要转化为字符串 2022-04-10\n let v = val;\n if (Array.isArray(val)) v = val.join(',');\n for (i = 0; i < v.length; i++)\n if (v.charCodeAt(i) >= 32 && v.charCodeAt(i) <= 126) sum = sum + 1;\n else sum = sum + 2;\n return sum;\n};\n\nconst vcity = {\n 11: '北京',\n 12: '天津',\n 13: '河北',\n 14: '山西',\n 15: '内蒙古',\n 21: '辽宁',\n 22: '吉林',\n 23: '黑龙江',\n 31: '上海',\n 32: '江苏',\n 33: '浙江',\n 34: '安徽',\n 35: '福建',\n 36: '江西',\n 37: '山东',\n 41: '河南',\n 42: '湖北',\n 43: '湖南',\n 44: '广东',\n 45: '广西',\n 46: '海南',\n 50: '重庆',\n 51: '四川',\n 52: '贵州',\n 53: '云南',\n 54: '西藏',\n 61: '陕西',\n 62: '甘肃',\n 63: '青海',\n 64: '宁夏',\n 65: '新疆',\n 71: '台湾',\n 81: '香港',\n 82: '澳门',\n 91: '国外',\n};\n// 校验浮点数位数\nconst checkDecimal = function (val, decimalLen) {\n let v = val + '';\n if (v && v.indexOf('.') > 0) {\n v = v.substr(v.indexOf('.') + 1, v.length);\n if (v.length <= decimalLen) return true;\n else return false;\n } else return true;\n};\n// 取身份证前两位,校验省份\nconst checkProvince = function (card) {\n const province = card.substr(0, 2);\n if (vcity[province] === undefined) return false;\n\n return true;\n};\n\n// 校验日期\nconst verifyBirthday = function (year: number, month: number, day: number, birthday: Date) {\n const now = new Date();\n const now_year = now.getFullYear();\n // 年月日是否合理\n if (birthday.getFullYear() === +year && birthday.getMonth() + 1 === +month && birthday.getDate() === +day) {\n // 判断年份的范围(3岁到100岁之间)\n const time = now_year - Number(year);\n if (time >= 3 && time <= 100) return true;\n return false;\n }\n return false;\n};\n\n// 检查生日是否正确\nconst checkBirthday = function (card) {\n const len = card.length;\n // 身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字\n if (len === 15) {\n const re_fifteen = /^(\\d{6})(\\d{2})(\\d{2})(\\d{2})(\\d{3})$/;\n const arr_data = card.match(re_fifteen);\n const year = arr_data[2];\n const month = arr_data[3];\n const day = arr_data[4];\n const birthday = new Date('19' + year + '/' + month + '/' + day);\n return verifyBirthday(Number('19' + year), month, day, birthday);\n }\n // 身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X\n if (len === 18) {\n const re_eighteen = /^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$/;\n const arr_data = card.match(re_eighteen);\n const year = arr_data[2];\n const month = arr_data[3];\n const day = arr_data[4];\n const birthday = new Date(year + '/' + month + '/' + day);\n return verifyBirthday(year, month, day, birthday);\n }\n return false;\n};\n// 15位转18位身份证号\nconst changeFivteenToEighteen = function (card) {\n if (card.length === 15) {\n const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let cardTemp = 0;\n let i;\n card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);\n for (i = 0; i < 17; i++) cardTemp += card.substr(i, 1) * arrInt[i];\n\n card += arrCh[cardTemp % 11];\n return card;\n }\n return card;\n};\n\n// 校验位的检测\nconst checkParity = function (card) {\n // 15位转18位\n card = changeFivteenToEighteen(card);\n const len = card.length;\n if (len === 18) {\n const arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];\n const arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];\n let cardTemp = 0;\n let valnum = '';\n for (let i = 0; i < 17; i++) cardTemp += card.substr(i, 1) * arrInt[i];\n\n valnum = arrCh[cardTemp % 11];\n if (valnum === card.substr(17, 1)) return true;\n\n return false;\n }\n return false;\n};\n\nconst htValidate = {\n isLength: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language, max = 30 } = rule;\n const len = calLength(value);\n if (len > max) callback(new Error(infoMsg.maxLen(language, max)));\n else callback();\n }\n },\n isDouble: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const reg = /^(-)?\\d+(\\.\\d+)?$/;\n const { language, decimal = 2 } = rule;\n if (!reg.test(value)) callback(new Error(infoMsg.double(language)));\n else if (checkDecimal(value, decimal)) callback();\n else callback(new Error(infoMsg.decimal(language, decimal)));\n }\n },\n isIdcard: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n // 校验长度\n const reg = /(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)/;\n if (!reg.test(value)) callback(new Error(infoMsg.idCard(language)));\n else if (checkProvince(value) === false)\n // 检查省份\n callback(new Error(infoMsg.idCard(language)));\n else if (checkBirthday(value) === false)\n // 校验生日\n callback(new Error(infoMsg.idCard(language)));\n else if (checkParity(value) === false)\n // 检验位的检测\n callback(new Error(infoMsg.idCard(language)));\n else callback();\n }\n },\n\n isCarno: (rule, value, callback) => {\n const { language } = rule;\n if (value === '' || value === undefined || value == null) return callback();\n else if (value.length === 7) {\n const pattern = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/;\n if (!pattern.test(value)) callback(new Error(infoMsg.carNo(language)));\n else return callback();\n } else {\n const pattern2 = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DABCEFGHJK][A-HJ-NP-Z0-9][0-9]{4}$))/;\n if (!pattern2.test(value)) callback(new Error(infoMsg.carNo(language)));\n else return callback();\n }\n },\n\n isMoney: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) return callback();\n else {\n const { language, max } = rule;\n // eslint-disable-next-line no-useless-escape\n const pattern = /^[\\-\\+]?(([1-9]\\d*)|0)(\\.\\d{1,2})?$/;\n const val = value + '';\n // var rv = val.replace(/[,]/g, '');\n if (!pattern.exec(val)) callback(new Error(infoMsg.money(language)));\n else if (val.indexOf('.') > 0)\n if (val.split('.')[0].length > max - 3)\n // 校验整数位格式只能是maxLength -3\n callback(new Error(infoMsg.moneyMax(language, max - 3)));\n else return callback();\n else if (value.length > max - 3) callback(new Error(infoMsg.moneyMax(language, max - 3)));\n else return callback();\n }\n },\n\n isBigMoney: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n // eslint-disable-next-line no-useless-escape\n const reg = /^[\\-\\+]?([0-9]\\d*|0|[1-9]\\d{0,2}(,\\d{3})*)(\\.\\d+)?$/;\n if (!reg.test(value)) callback(new Error(infoMsg.money(language)));\n else callback();\n }\n },\n\n isLetter: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^[A-Za-z]+$/;\n if (!reg.test(value)) callback(new Error(infoMsg.letter(language)));\n else callback();\n }\n },\n\n isNumber: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^\\+?[0-9][0-9]*$/;\n if (!reg.test(value)) callback(new Error(infoMsg.number(language)));\n else callback();\n }\n },\n\n isNumber0: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^\\+?[1-9][0-9]*$/;\n if (!reg.test(value)) callback(new Error(infoMsg.number0(language)));\n else callback();\n }\n },\n\n isNumberLetter: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^([a-z]|[A-Z]|[ ]|[(]|[)]|[-]|[_]|[*]|[.]|[,]|[,]|[0-9]){0,200}$/;\n if (!reg.test(value)) callback(new Error(infoMsg.numberLetter(language)));\n else callback();\n }\n },\n\n isName: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^[a-zA-Z0-9-_. \\u4E00-\\u9FA5]{0,60}$/;\n if (!reg.test(value)) callback(new Error(infoMsg.name(language)));\n else callback();\n }\n },\n\n isPhone: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const reg = /^1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\\d{8}$/;\n if (!reg.test(value)) {\n const { language = 'zh-CN' } = rule;\n callback(new Error(infoMsg.phone(language)));\n } else callback();\n }\n },\n\n isEmail: (rule, value, callback) => {\n // eslint-disable-next-line no-useless-escape\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n // eslint-disable-next-line no-useless-escape\n const reg = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n if (!reg.test(value)) callback(new Error(infoMsg.email(language)));\n else callback();\n }\n },\n\n isTelephone: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /0\\d{2}-\\d{7,8}/;\n if (!reg.test(value)) callback(new Error(infoMsg.telephone(language)));\n else callback();\n }\n },\n\n isPhoneTel: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^((0\\d{2,3}-\\d{7,8})|(1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\\d{8}))$/;\n if (!reg.test(value)) callback(new Error(infoMsg.phoneTel(language)));\n else callback();\n }\n },\n\n isIp: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg = /^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$/;\n if (!reg.test(value)) callback(new Error(infoMsg.ip(language)));\n else callback();\n }\n },\n\n isUrl: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const { language } = rule;\n const reg =\n /^(https?|ftp):\\/\\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+\\.?(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\\/($|[a-zA-Z0-9.,?'\\\\+&%$#=~_-]+))*$/;\n if (!reg.test(value)) callback(new Error(infoMsg.url(language)));\n else callback();\n }\n },\n\n isVin: (rule, value, callback) => {\n const { language } = rule;\n const reg = /^[A-Z0-9]+$/;\n if (value === '' || value === undefined || value == null) callback();\n else if (value.length !== 8 && value.length !== 17) callback(new Error(infoMsg.vin(language)));\n else if (!reg.test(value)) callback(new Error(infoMsg.vin(language)));\n else callback();\n },\n};\n\nexport default htValidate;\n","<!--\n * @title: form component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:01:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 18:04:49\n * @version: 1.1.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { useBridgeI18n } from '@@/bridge';\n import { GvCascader } from '@@/GvCascader';\n import { GvDatePicker } from '@@/GvDatePicker';\n import { GvDivider } from '@@/GvDivider';\n import { GvInput } from '@@/GvInput';\n import { GvInputNumber } from '@@/GvInputNumber';\n import { GvSelect } from '@@/GvSelect';\n import { GvSwitch } from '@@/GvSwitch';\n import { GvTimePicker } from '@@/GvTimePicker';\n import { addClass, dateFormatConfig, hasScrollbar, removeClass, sleep, toHump } from '@@/utils';\n import gvValidate from '@@/utils/gv.validate';\n import { ElCol, ElForm, ElFormItem, ElInput, ElRadio, ElRadioButton, ElRadioGroup, ElRow, ElTooltip, useGlobalConfig, type ComponentSize, type FormInstance, type FormItemRule } from 'element-plus';\n import { computed, defineComponent, getCurrentInstance, nextTick, onMounted, provide, ref, Transition, unref, watch, type PropType, type VNode } from 'vue';\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('form');\n\n export default defineComponent({\n name: 'GvForm',\n props: {\n refForm: {\n type: String,\n required: true,\n },\n divider: {\n type: String,\n required: false,\n default: undefined,\n },\n isDivider: {\n type: Boolean,\n required: false,\n default: true,\n },\n formList: {\n type: Array as PropType<FormItem[]>,\n required: true,\n default: () => [],\n },\n size: {\n type: String as PropType<ComponentSize>,\n required: false,\n default: undefined,\n },\n labelWidth: {\n type: [Number, String] as PropType<number | string>,\n default: 100,\n },\n formStyle: {\n // 响应式布局 使用该参数定义width\n type: [Object],\n required: false,\n default: () => {},\n },\n scroller: {\n // 是否带有滚动条\n type: Boolean,\n required: false,\n default: true,\n },\n },\n setup(props, { slots, expose }) {\n const searchFieldsCollapsed = ref(true); // 查询 form 默认折叠超出行数字段\n // @provide\n provide('refForm', props.refForm);\n provide('formList', props.formList);\n provide('searchFieldsCollapsed', searchFieldsCollapsed);\n\n // @data\n const appStore = useAppStore();\n const userStore = useUserStore();\n const { t } = useBridgeI18n();\n\n const originFormList = ref([]);\n const instance = getCurrentInstance ? getCurrentInstance() : ({ parent: null } as any);\n\n const formRefs = ref<Record<string, FormInstance | null>>({}); // 表单实例引用,默认空对象\n const formElRef = ref<FormInstance | null>(null); // ElForm 元素引用\n\n const setFormRef = (el: FormInstance | null) => {\n formElRef.value = el;\n if (el && props.refForm) formRefs.value[props.refForm] = el;\n };\n const globalSize = useGlobalConfig('size');\n const rootNodeStyle = ref({}); // form组件根节点div样式\n const isShow = ref(true); // form表单show状态,默认显示\n const rules = ref({}); // 表单校验规则,默认空对象\n const isEditContainer = ref(false); // 是否是editContainer标签内,默认false\n const sMaxHeight = ref(0); // 表单最大高度,默认0\n const isScrollbar = ref(false); // 是否dialog中有滚动条\n const isAnchor = ref(false); // 是否锚点中列表\n const model = ref({}); // 表单数据,默认空对象\n const isDialog = ref(false); // 是否是dialog中form表单,默认false\n const colSpanNums = ref(0); // 根据form宽度或屏幕宽度计算显示列数,默认0\n const formType = ref('s'); // form类型:查询form:s、表单form:e\n const styles = ref({}); // form表单style样式,默认空对象\n\n // @computed\n const formSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n const labelPosition = computed(() => appStore.labelPosition); // 表单label位置\n const searchDivider = computed(() => appStore.searchDivider); // search divider show,default: true\n const dict = computed<DicItems>(() => appStore.getDict); // 字典数据\n const dictCache = computed(() => userStore.dictCache); // 字典缓存\n\n // @exposed\n expose({\n originFormList,\n setFormRef,\n });\n // method\n const getLanguage = (lang: string, x: any) => {\n let v = '';\n switch (lang) {\n case 'zh-CN':\n v = x.t;\n break;\n case 'en':\n v = x.e;\n break;\n case 'l1':\n v = x.l1;\n break;\n case 'l2':\n v = x.l2;\n break;\n default:\n v = x.t;\n break;\n }\n if (!v) v = x.t;\n return v;\n };\n /**\n * @todo: set divider show status\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 18:12:34\n * @param {*} show\n */\n const setDividerShow = (show: boolean) => {\n isShow.value = show;\n };\n\n const getEditBar = computed(() => {\n if (slots.editbar?.())\n return (\n <ElRow\n ref-form={props.refForm}\n class=\"gv-form-editbar\">\n {slots.editbar?.()}\n </ElRow>\n );\n else return null;\n });\n\n const getDivider = computed(() => {\n let dividerRender: VNode | null = null;\n if (searchDivider.value !== false) {\n let dividerTitle: string;\n if (props.divider) dividerTitle = props.divider;\n else dividerTitle = t('common.dividerTitle');\n if (props.isDivider)\n dividerRender = (\n <GvDivider\n label={dividerTitle}\n target={props.refForm}\n visible={isShow.value}\n onSetDividerShow={setDividerShow}\n />\n );\n }\n\n return dividerRender;\n });\n\n /**\n * @todo: get dic item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 18:13:06\n * @param {*} src\n */\n const getDictItems = (src: string): DicItem[] => {\n let ret = [] as DicItem[];\n const dictCacheTmp: DicItem[] | undefined = dictCache.value?.[src];\n if (dictCacheTmp) ret = dictCacheTmp;\n else {\n // 生成字典列表\n const dictTmp: DicItem[] | undefined = dict.value[src];\n if (dictTmp) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dictTmp;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n\n ret = dictTmp;\n }\n }\n return ret;\n };\n /**\n * @todo: generate form item rules\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 20:31:59\n * @param {*} _item\n */\n const getItemRules = (_item: FormItem): FormItemRule[] => {\n const rules: FormItemRule[] = [];\n const format: FormItemFormat | undefined = _item.format;\n // 富文本不校验\n if (_item.type === 'richtext') return rules;\n if (!format) return rules;\n // ========== 必填校验 ==========\n const requiredFlag = Number(format[0]);\n if (requiredFlag === 1 && !_item.hidden)\n rules.push({\n required: true,\n message: `${t('common.pleaseInput')} ${_item.label ?? ''}`,\n trigger: 'blur',\n });\n // ========== 自定义校验 ==========\n let validateKey = 'isAny';\n if (format[1]) validateKey = toHump(String(format[1]));\n const maxLen = Number(format[2] ?? 30);\n const decimal = format.length >= 4 ? Number(format[3] ?? 0) : 0;\n const validator = gvValidate[validateKey as keyof typeof gvValidate];\n if (validator && validateKey !== 'isAny')\n rules.push({\n validator: validator,\n trigger: ['change', 'blur'],\n // Element Plus 透传参数(自定义字段)\n language: userStore.language,\n max: maxLen,\n decimal,\n } as FormItemRule);\n // ========== 长度校验 ==========\n const excluded = ['isDate', 'isDateTime', 'isTime', 'isDic'];\n if (format[2] && !excluded.includes(validateKey))\n rules.push({\n language: userStore.language,\n max: maxLen,\n validator: gvValidate['isLength'],\n trigger: ['change', 'blur'],\n } as FormItemRule);\n return rules;\n };\n const handleRadioInput = (event: any, field: string, val, formVal, disabled) => {\n if (disabled) return;\n if (val === formVal) {\n event.preventDefault();\n model.value[field] = '';\n }\n };\n const handleDateRange2Focus = (vm: any) => {\n sleep(100).then(() => {\n addClass(vm.$el.closest('.gv-daterange__single'), 'is-active');\n });\n };\n const handleDateRange2Blur = (vm: any) => {\n removeClass(vm.$el.closest('.gv-daterange__single'), 'is-active');\n };\n\n /**\n * @todo: 日期范围选择,单独选择开始日期、结束日期选择回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 19:49:03\n * @param {*} type\n * @param {*} val\n * @param {*} field\n */\n const handleDateRange2Change = (type: string, val: string | Date, field: string): void => {\n // 校验开始日期和结束日期大小\n if (type === 's')\n if (val && model.value[field + '-end']) {\n const endTime = new Date(model.value[field + '-end'] as string).getTime();\n const startTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model.value[field + '-end'] = '';\n model.value[1] = 'null';\n }\n }\n\n if (type === 'e')\n if (val && model.value[field + '-start']) {\n const startTime = new Date(model.value[field + '-start'] as string).getTime();\n const endTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model.value[field + '-start'] = '';\n // console.log(this.model);\n model.value[1] = 'null';\n }\n }\n\n if (!field) return;\n const datePicker = model.value[field];\n let dateArr = new Array(2);\n if (Array.isArray(datePicker)) {\n if (type === 's') datePicker[0] = val;\n else datePicker[1] = val;\n if (!datePicker[0]) datePicker[0] = 'null';\n if (!datePicker[1]) datePicker[1] = 'null';\n model.value[field] = datePicker.join(',');\n } else {\n if (datePicker && typeof datePicker === 'string') dateArr = datePicker.split(',');\n dateArr[0] = model.value[field + '-start'];\n dateArr[1] = model.value[field + '-end'];\n if (!dateArr[0]) dateArr[0] = 'null';\n if (!dateArr[1]) dateArr[1] = 'null';\n model.value[field] = dateArr.join(',');\n }\n };\n /**\n * @todo: switch框字典change回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-12-21 16:47:22\n * @param {*} val\n * @param {*} field\n * @param {*} dicType\n * @param {*} cb\n */\n const handleSwitchDictChange = async (val, field, dicType, cb) => {\n switch (dicType) {\n case 'yxzt':\n if (val === true) model.value[field] = '100201';\n else model.value[field] = '100202';\n break;\n case 'sf':\n if (val === true) model.value[field] = '100101';\n else model.value[field] = '100102';\n break;\n }\n if (cb)\n try {\n await cb(val, field, dicType);\n } catch (error) {\n console.log(error);\n }\n };\n /**\n * @todo: radio框字典change回调方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-22 15:50:15\n * @param {*} val\n * @param {*} field\n * @param {*} dicType\n * @param {*} cb\n */\n const handleRadioDictChange = async (val, field, dicType: string | undefined, cb: Fn | undefined) => {\n if (cb)\n try {\n await cb(val, field, dicType);\n } catch (error) {\n console.log(error);\n }\n };\n /**\n * @todo: 查询 form 列默认折叠 class(渲染时绑定,避免重渲染丢失)\n */\n const getSearchColClass = (index: number) => {\n if (formType.value !== 's' || !searchFieldsCollapsed.value) return undefined;\n const slot = slots.default?.()?.[0];\n const slotProps = slot?.props as Recordable | undefined;\n if (slotProps?.expand === false) return undefined;\n const showDefaultRow = appStore.searchFormRows === 1 ? 4 : 8;\n if (index >= showDefaultRow - 1) return 'gv-form-col--hidden';\n return undefined;\n };\n\n /**\n * @todo: render form item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:54:23\n * @param {*} _item\n * @param {*} _index\n */\n const renderFormItem = (_item: FormItem, _index: number): VNode => {\n const {\n type = 'text',\n label,\n field,\n hidden = false,\n disabled,\n format = [],\n placeholder,\n readonly = false,\n dateType = 'date',\n dicType,\n filtercode,\n colspan = 1,\n disabledDateFunc,\n disabledDate,\n editable = true,\n multiple = false,\n showLabel,\n size = formSize.value,\n visible = true,\n // offset,\n createRow = false, // 是否创建新row,\n dicRemote,\n cb, // 回调方法\n clear, // 清空回调\n rows, // textarea\n autosize, // textarea\n min, // input-number\n max, // input-number\n step, // input-number\n precision, // input-number\n blur = () => {},\n suffixIcon, // 后缀icon\n prefixIcon, // 前缀icon\n focus = () => {},\n change = () => {},\n defaultTime, // 时间的默认能够选择的时间\n isreload = true, // 表选字典是否重新加载\n options = [],\n lazy = false, // cascader是否懒加载\n lazyLoad = () => {}, // cascader懒加载方法\n render, // 自定义form样式\n } = _item;\n let renders;\n const isHidden = hidden === true;\n const maxLen = format[2] || 30;\n let cType = type;\n // const dateFormatConfig = dateFormatConfig;\n const validateRule = toHump(String(format[1] || ''));\n let sDateType = dateType;\n let isRange = false;\n let dateFormat = dateFormatConfig.date.valueFormat; // 日期显示格式\n let valueFormat = dateFormatConfig.date.valueFormat; // 日期绑定值格式\n if (sDateType !== 'daterange' && sDateType !== 'datetimerange' && sDateType !== 'daterange2' && sDateType !== 'datetimerange2') {\n if (validateRule === 'isDate') cType = 'date';\n if (validateRule === 'isDateTime') {\n cType = 'datetime';\n sDateType = 'datetime';\n }\n if (validateRule === 'isTime') cType = 'time';\n }\n\n if (sDateType === 'timerange') isRange = true;\n\n let ph = placeholder;\n let startPh = t('common.startDate');\n let endPh = t('common.endDate');\n // todo: 响应式布局计算\n // const cols = { span: colspan, offset: (_index) * 6 };\n let cols = colspan > 4 ? 4 : colspan; // fixme: 最大值不能超过4 2022-04-07\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') cols = 2;\n // update: 对于多选字典,默认占用列数为2列 2023-02-18\n if (multiple === true && colspan === undefined) cols = 2;\n let rangeSeparator;\n if (sDateType === 'timerange' || sDateType === 'daterange2' || sDateType === 'datetimerange2') rangeSeparator = t('common.until');\n const colSpanXs = 24;\n let colSpanSm = 12;\n let colSpanMd = 8;\n\n let colSpanLg = 6;\n if (isDialog.value === true) colSpanLg = 8;\n let colSpanXl = 4;\n if (isDialog.value === true) colSpanXl = 6;\n if (colSpanNums.value !== 0) {\n if (colSpanNums.value === 12) cols = colspan > 2 ? 2 : colspan;\n if (colSpanNums.value === 8) cols = colspan > 3 ? 3 : colspan;\n if (colSpanNums.value === 6 || colSpanNums.value === 4) cols = colspan > 4 ? 4 : colspan;\n colSpanSm = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanMd = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanLg = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanXl = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n } else {\n colSpanSm = cols * colSpanSm > 24 ? 24 : cols * colSpanSm;\n colSpanMd = cols * colSpanMd > 24 ? 24 : cols * colSpanMd;\n colSpanLg = cols * colSpanLg > 24 ? 24 : cols * colSpanLg;\n colSpanXl = cols * colSpanXl > 24 ? 24 : cols * colSpanXl;\n }\n let decimal = 2;\n let v = '';\n if (!ph)\n switch (validateRule) {\n case 'isMoney':\n ph = '0.00';\n break;\n case 'isBigMoney':\n ph = '0,000.00';\n break;\n case 'isEmail':\n ph = 'xx@xx.com';\n break;\n case 'isDouble':\n if (format.length >= 4) decimal = format[3] || 2;\n while (decimal > 0) {\n v = '0' + v;\n decimal--;\n }\n ph = '00.' + v;\n break;\n case 'isDate':\n if (sDateType === 'week') {\n ph = t('common.selectWeek'); // dateFormatConfig.week.placeholder;\n dateFormat = dateFormatConfig.week.dateFormat;\n } else if (sDateType === 'month' || sDateType === 'monthrange') {\n ph = t('common.selectMonth'); // dateFormatConfig.month.placeholder;\n startPh = ph;\n endPh = ph;\n dateFormat = dateFormatConfig.month.dateFormat;\n valueFormat = dateFormatConfig.month.valueFormat;\n } else if (sDateType === 'year') {\n ph = t('common.selectYear'); // dateFormatConfig.year.placeholder\n dateFormat = dateFormatConfig.year.dateFormat;\n valueFormat = dateFormatConfig.year.valueFormat;\n } else if (sDateType === 'daterange' || sDateType === 'daterange2') ph = t('common.selectDate');\n break;\n case 'isDateTime':\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') {\n startPh = t('common.startTime');\n endPh = t('common.endTime');\n }\n ph = t('common.selectTime'); // dateFormatConfig.datetime.placeholder;\n dateFormat = dateFormatConfig.datetime.dateFormat;\n valueFormat = dateFormatConfig.datetime.valueFormat;\n break;\n }\n let editables = editable;\n // 如果是带有禁用日期的,不可编辑,防止输入不一致问题\n if (disabledDateFunc || disabledDate) editables = false;\n let ops;\n let isTableDic = false;\n if (type === 'dic')\n if (dicType) {\n ops = getDictItems(dicType);\n if (dicType.indexOf('t#') >= 0) isTableDic = true;\n }\n\n // 设置label是否显示\n let sLabel = label;\n if (formType.value === 's') {\n sLabel = appStore.searchFormLabel === true ? label : undefined;\n if (appStore.searchFormLabel !== true) ph = label;\n }\n\n const switchDefaultVal = ref('');\n const searchColClass = getSearchColClass(_index);\n switch (cType) {\n case 'blank':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n prop={field}\n key={field}>\n <div class=\"el-input__inner gv-form__item__inner-blank\"> </div>\n </ElFormItem>\n </ElCol>\n );\n break;\n case 'divider':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={24}\n sm={24}\n md={24}\n lg={24}\n xl={24}>\n <GvDivider label={sLabel} />\n </ElCol>\n );\n break;\n case 'render':\n renders = (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n {render?.(model.value[field], field)}\n </ElFormItem>\n </ElCol>\n );\n break;\n case 'text':\n renders = visible ? (\n // span={this.colSpan} {span:16,offset:4}\n // xs={24} sm={12} md={8} lg={6} xl={4}\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInput\n type=\"text\"\n vref={field}\n name={field}\n v-model={model.value[field]}\n value={model.value[field]}\n disabled={disabled}\n maxlength={maxLen}\n size={size as ComponentSize}\n placeholder={ph}\n visible={visible}\n readonly={readonly}\n onBlur={blur}\n onFocus={focus}\n suffixIcon={suffixIcon}\n prefixIcon={prefixIcon}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'textarea':\n renders = visible ? (\n // span={this.colSpan} {span:16,offset:4}\n // xs={24} sm={12} md={8} lg={6} xl={4}\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInput\n vref={field}\n name={field}\n type=\"textarea\"\n v-model={model.value[field]}\n value={model.value[field]}\n size={size as ComponentSize}\n disabled={disabled}\n maxlength={maxLen}\n placeholder={ph}\n visible={visible}\n readonly={readonly}\n rows={rows}\n autosize={autosize}\n onBlur={blur}\n onFocus={focus}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'time':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvTimePicker\n v-model={model.value[field]}\n vref={field}\n name={field}\n disabled={disabled}\n editable={editables}\n placeholder={ph}\n isRange={isRange}\n rangeSeparator={rangeSeparator}\n // format={dateFormat}\n // value-format={valueFormat}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'date':\n case 'datetime':\n if (sDateType !== 'daterange2' && sDateType !== 'datetimerange2')\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <GvDatePicker\n v-model={model.value[field]}\n modelValue={model.value[field]}\n vref={field}\n data-name={field}\n data-align={'right'}\n type={sDateType}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={disabledDate}\n editable={editables}\n placeholder={ph}\n default-time={defaultTime}\n startPlaceholder={startPh}\n endPlaceholder={endPh}\n data-visible={visible}\n onChange={change}\n />\n </ElFormItem>\n </ElCol>\n ) : null;\n else\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <div\n class=\"gv-daterange__single\"\n style=\"width: 100%;\"\n onFocus={() => void 0}>\n <GvDatePicker\n v-model={model.value[field + '-start']}\n modelValue={model.value[field + '-start']}\n vref={field + '-start'}\n data-name={field + '-start'}\n data-align={'right'}\n type={sDateType === 'daterange2' ? 'date' : 'datetime'}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={disabledDate}\n editable={editables}\n placeholder={startPh}\n default-time={defaultTime}\n data-visible={visible}\n style={{ width: '96% !important' }}\n class=\"gv-datepicker-range-start\"\n onChange={(val) => handleDateRange2Change('s', val, field)}\n onFocus={(vm) => handleDateRange2Focus(vm)}\n onBlur={(vm) => handleDateRange2Blur(vm)}\n />\n <span class=\"gv-daterange__single-separator\">{rangeSeparator}</span>\n <GvDatePicker\n v-model={model.value[field + '-end']}\n modelValue={model.value[field + '-end'] as string}\n vref={field + '-end'}\n data-name={field + '-end'}\n data-align={'right'}\n type={sDateType === 'daterange2' ? 'date' : 'datetime'}\n format={dateFormat}\n value-format={valueFormat}\n disabled={disabled}\n disabledDateFunc={disabledDateFunc}\n disabledDate={(date) => {\n if (sDateType === 'daterange2') return date.getTime() <= new Date(model.value[field + '-start']).getTime() - 8.64e7;\n else return date.getTime() <= new Date(model.value[field + '-start']).getTime() - 8.64e7;\n }}\n editable={editables}\n placeholder={endPh}\n default-time={defaultTime}\n data-visible={visible}\n class=\"gv-datepicker-range-end\"\n onChange={(val) => handleDateRange2Change('e', val, field)}\n onFocus={(vm) => handleDateRange2Focus(vm)}\n onBlur={(vm) => handleDateRange2Blur(vm)}\n />\n </div>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'dic':\n switch (dicType) {\n case 'yxzt':\n if (typeof model.value[field] === 'object') switchDefaultVal.value = model.value[field].value ? model.value[field].value : '100201';\n else switchDefaultVal.value = model.value[field] ? model.value[field] : '100201';\n break;\n case 'sf':\n if (typeof model.value[field] === 'object') switchDefaultVal.value = model.value[field].value ? model.value[field].value : '100101';\n else switchDefaultVal.value = model.value[field] ? model.value[field] : '100101';\n break;\n }\n if (isTableDic === false && multiple === false && formType.value === 'e' && ops && ops.length === 2 && (dicType === 'sf' || dicType === 'yxzt'))\n // 当是编辑form并且字典内容只有2个以内时\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <GvSwitch\n value={switchDefaultVal.value}\n columnKey={field}\n disabled={disabled}\n target={dicType === 'yxzt' ? '100201' : '100101'}\n onChange={(val) => handleSwitchDictChange(val, field, dicType, cb)}></GvSwitch>\n </ElFormItem>\n </ElCol>\n ) : null;\n else if (isTableDic === false && multiple === false && formType.value === 'e' && ops && ops.length === 2)\n // 当是编辑form并且字典内容只有2个以内时\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElInput\n id={`${field}__a11y-anchor`}\n modelValue=\"\"\n readonly\n validateEvent={false}\n tabindex={-1}\n aria-hidden={true}\n style={{\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: 0,\n margin: 0,\n border: 0,\n clip: 'rect(0, 0, 0, 0)',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }}\n />\n <ElRadioGroup\n aria-label={sLabel}\n name={field}\n v-model={model.value[field].value}\n onChange={(val) => handleRadioDictChange(val, field, dicType, cb)}>\n {ops.map((x) =>\n format[0] === 0 ? (\n <ElRadio\n value={x.c}\n disabled={disabled}\n onChange={(event) => handleRadioInput(event, field, x.c, model.value[field], disabled)}>\n {getLanguage(userStore.language, x)}\n </ElRadio>\n ) : (\n <ElRadioButton\n value={x.c}\n disabled={disabled}>\n {getLanguage(userStore.language, x)}\n </ElRadioButton>\n ),\n )}\n </ElRadioGroup>\n </ElFormItem>\n </ElCol>\n ) : null;\n else {\n // form dic\n let v: string | undefined;\n const vv = model.value[field];\n if (typeof vv === 'object')\n if (Array.isArray(vv))\n vv.forEach((x, index) => {\n if (x)\n if (v)\n if (x.label) v += ',' + x.label;\n else v += ',' + (showLabel?.[index] ? showLabel[index] : x);\n else if (x.label) v = x.label;\n else v = showLabel?.[index] ?? x;\n });\n else {\n if (vv) v = vv.label;\n }\n else v = vv;\n let toolText = v; // 提示的文本\n if (showLabel) toolText = showLabel as string;\n\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!v}\n content={toolText ? toolText + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvSelect\n v-model={model.value[field]}\n value={model.value[field]}\n label={label}\n showLabel={showLabel}\n vref={field}\n multiple={multiple}\n dicType={dicType ?? ''}\n size={size as ComponentSize}\n disabled={disabled}\n placeholder={ph}\n filtercode={filtercode}\n visible={visible}\n dicRemote={typeof dicRemote === 'function' ? dicRemote : undefined}\n cb={cb}\n clear={clear}\n isreload={isreload}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n }\n\n break;\n case 'number':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvInputNumber\n vref={field}\n name={field}\n id={field}\n v-model={model.value[field]}\n value={model.value[field]}\n disabled={disabled}\n placeholder={ph}\n visible={visible}\n size={size as ComponentSize}\n min={min}\n max={max}\n step={step}\n precision={precision}\n onBlur={blur}\n onFocus={focus}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'layer':\n renders = visible ? (\n <ElCol\n key={_index}\n class={searchColClass}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElTooltip\n disabled={!model.value[field]}\n content={model.value[field] ? model.value[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <GvCascader\n vref={field}\n v-model={model.value[field]}\n value={model.value[field]}\n disabled={disabled}\n placeholder={ph}\n size={size as ComponentSize}\n lazy={lazy}\n multiple={multiple}\n lazyLoad={lazyLoad}\n visible={visible}\n options={options}\n onBlur={blur}\n onChange={change}\n />\n </ElTooltip>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n default:\n break;\n }\n if (createRow === true) return <el-row>{renders}</el-row>;\n else return renders;\n };\n\n const getItems = computed(() => {\n const res: VNode[] = [];\n props.formList.forEach((item: FormItem, index: number) => {\n res.push(renderFormItem(item, index));\n });\n return res;\n });\n\n // todo: 计算最大高度 需要增加弹出框判断逻辑,\n const getMaxHeight = (sRootEl: HTMLElement | undefined) => {\n if (isEditContainer.value) sMaxHeight.value = 0;\n else if (props.scroller === false) sMaxHeight.value = 0;\n else if (!isScrollbar.value)\n if (!isAnchor.value) {\n if (sRootEl && typeof sRootEl.closest === 'function') {\n const tabPane = sRootEl?.closest('.el-tabs') as HTMLElement | undefined;\n if (tabPane) {\n const offsetTop = tabPane.classList.contains('el-tabs--left') ? 215 : 275;\n sMaxHeight.value = document.documentElement.clientHeight - (sRootEl?.offsetTop || 0) - (tabPane?.offsetTop || 0) - offsetTop;\n } else {\n const dialog = sRootEl?.closest('.gv-dialog');\n if (!dialog) {\n const drawer = sRootEl?.closest('.gv-drawer');\n if (!drawer) sMaxHeight.value = document.documentElement.clientHeight - sRootEl.offsetTop - 75;\n // console.log(this.sMaxHeight);\n } else sMaxHeight.value = document.documentElement.clientHeight - sRootEl.offsetTop - 265;\n }\n }\n } else sMaxHeight.value = 0;\n else sMaxHeight.value = 0;\n };\n\n const clearFormValidate = () => {\n formRefs.value[props.refForm]?.clearValidate();\n };\n\n /**\n * @todo: 设置form表单样式\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-07 19:35:14\n */\n const setFormStyle = () => {\n let formStyle1;\n // console.log(props.formStyle);\n if (props.formStyle) {\n formStyle1 = props.formStyle;\n let width = formStyle1.width || 0;\n let height = formStyle1.height || 0;\n // fixme: 判断width是否是百分比\n // if (width.lastIndexOf('%') !== -1)\n // throw new Error('HtForm - [form-style] : 不支持width定义百分比');\n // if (height.lastIndexOf('%') !== -1)\n // throw new Error('HtForm - [form-style] : 不支持height定义百分比');\n // width = Math.round(this.getParentWidth * (parseInt(width) / 100) * 100) / 100;\n\n if (width.lastIndexOf('%') === -1) {\n // width固定值\n width = parseInt(width);\n if (width !== 0) {\n if (width < 762)\n // xs\n colSpanNums.value = 24;\n else if (width < 992)\n // sm\n colSpanNums.value = 12;\n else if (width < 1200)\n // md\n colSpanNums.value = 8;\n else if (width < 1920)\n // lg\n colSpanNums.value = 6;\n else colSpanNums.value = 4;\n\n rootNodeStyle.value['width'] = width + 'px';\n }\n if (height !== '100%' && height !== 0) {\n height = parseInt(height);\n rootNodeStyle.value['height'] = height + 'px';\n }\n } else rootNodeStyle.value['width'] = width;\n } else {\n const rootEl = instance?.vnode?.el as HTMLElement;\n const clientWidth = rootEl?.clientWidth;\n // console.log(clientWidth);\n if (clientWidth !== 0) {\n if (clientWidth < 762)\n // xs\n colSpanNums.value = 24;\n else if (clientWidth < 992)\n // sm\n colSpanNums.value = 12;\n else if (clientWidth < 1200)\n // md\n colSpanNums.value = 8;\n else if (clientWidth < 1920)\n // lg\n colSpanNums.value = 6;\n else colSpanNums.value = 4;\n\n rootNodeStyle.value['width'] = clientWidth + 'px';\n }\n }\n styles.value = formStyle1;\n };\n\n /**\n * @todo: form init\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 07:47:06\n * @param {*} type\n */\n const init = async (type: string) => {\n // alert(type);\n const formModel = {};\n const formRule = {};\n props.formList.forEach((item: FormItem, index: number) => {\n let v;\n if (type === 'create') v = item.value;\n else if (type === 'watch') {\n const originItem = originFormList.value[index] as FormItem | undefined;\n if (originItem && (item.value !== originItem.value || item.showLabel !== originItem.showLabel)) v = item.value;\n else v = model.value[item.field] === undefined ? item.value : model.value[item.field];\n } else v = model.value[item.field] === undefined ? item.value : model.value[item.field];\n formModel[item.field] = v;\n if (item.dateType === 'daterange2' || item.dateType === 'datetimerange2')\n if (Array.isArray(v)) {\n formModel[item.field + '-start'] = v[0] === 'null' ? undefined : v[0];\n formModel[item.field + '-end'] = v[1] === 'null' ? undefined : v[1];\n } else {\n formModel[item.field + '-start'] = '';\n formModel[item.field + '-end'] = '';\n }\n\n formRule[item.field] = getItemRules(item);\n // 设置 value属性为响应式数据\n item.value = v;\n });\n // 设置form model\n model.value = formModel;\n if (type === 'create') rules.value = formRule;\n else if (type === 'watch') rules.value = formRule;\n\n await nextTick();\n setFormStyle();\n // console.log(formRefs.value);\n clearFormValidate();\n };\n\n const difference = (newVal, oldVal) => {\n let diff = false;\n for (const key in newVal) {\n const fieldObj = newVal[key];\n const oldObj = oldVal[key];\n if (fieldObj === undefined) continue;\n else if (!oldObj) {\n diff = true;\n break;\n } else {\n const fieldObjKeys = Object.keys(fieldObj);\n for (const key2 in fieldObjKeys)\n if (\n fieldObjKeys[key2] === 'label' ||\n fieldObjKeys[key2] === 'hidden' ||\n fieldObjKeys[key2] === 'disabled' ||\n fieldObjKeys[key2] === 'format' ||\n fieldObjKeys[key2] === 'readonly' ||\n fieldObjKeys[key2] === 'filtercode' ||\n fieldObjKeys[key2] === 'multiple' ||\n fieldObjKeys[key2] === 'showLabel' ||\n fieldObjKeys[key2] === 'visible'\n )\n if (fieldObjKeys[key2] === 'format') {\n if (fieldObj[fieldObjKeys[key2]][0] !== oldObj[fieldObjKeys[key2]][0]) {\n diff = true;\n break;\n }\n if (fieldObj[fieldObjKeys[key2]][1] !== oldObj[fieldObjKeys[key2]][1]) {\n diff = true;\n break;\n }\n if (fieldObj[fieldObjKeys[key2]][2] !== oldObj[fieldObjKeys[key2]][2]) {\n diff = true;\n break;\n }\n // //if (!_.isEqual(fieldObj[fieldObjKeys[key2]], oldObj[fieldObjKeys[key2]])) {\n // diff = true;\n // break;\n // }\n } else if (fieldObj[fieldObjKeys[key2]] !== oldObj[fieldObjKeys[key2]]) {\n // console.log(key2);\n // console.log(fieldObj[fieldObjKeys[key2]]);\n // console.log(oldObj[fieldObjKeys[key2]]);\n diff = true;\n break;\n }\n }\n\n // if (!_.isEqual(newVal[key], oldVal[key]))\n }\n // console.log(diff);\n return diff;\n };\n\n // watch\n watch(\n () => props.formList,\n (nextProps, prevProps) => {\n // formList\n if (Array.isArray(nextProps) && Array.isArray(prevProps) && nextProps.length !== prevProps.length) init('watch');\n else if (difference(nextProps, originFormList.value)) init('watch');\n },\n {\n deep: true,\n },\n );\n watch(\n () => sMaxHeight.value,\n (newVal) => {\n // sMaxHeight\n if (isScrollbar.value === false)\n if (isAnchor.value === false) sMaxHeight.value = newVal;\n else sMaxHeight.value = 0;\n else sMaxHeight.value = 0;\n },\n );\n\n // @created hook\n // console.log(slots.default);\n const firstSlot = slots.default?.()?.[0];\n if (typeof firstSlot?.type === 'object' && 'name' in firstSlot.type && firstSlot?.type?.name === 'GvSearchBar') {\n formType.value = 's';\n const slotProps = firstSlot.props as Recordable | undefined;\n if (slotProps?.expand === false) searchFieldsCollapsed.value = false;\n } else formType.value = 'e';\n // 解析formList\n originFormList.value = JSON.parse(JSON.stringify(props.formList));\n init('create');\n // 判断是否是dialog弹出框中的form\n const parentNode = instance?.parent;\n // console.log(parentNode.$?.type?.name);\n if (parentNode && parentNode.type?.name === 'ElDialog') isDialog.value = true;\n else isDialog.value = false;\n\n // @mounted hook\n onMounted(() => {\n nextTick(() => {\n // get root element\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n\n // 确保 rootEl 是 HTMLElement 并且有 closest 方法\n if (rootEl && typeof rootEl.closest === 'function') {\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n const dialogBody = rootEl.closest('.gv-drawer__body__inner');\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n else {\n const dialogBody2 = rootEl.closest('.gv-dialog__body__inner');\n if (dialogBody2) isScrollbar.value = hasScrollbar(dialogBody2);\n }\n if (rootEl.closest('.gv-edit__container')) isEditContainer.value = true;\n\n // 计算maxheight;\n getMaxHeight(rootEl);\n\n window.addEventListener('resize', () => getMaxHeight(rootEl));\n }\n });\n });\n\n // @render\n return () => (\n <div\n class={prefixCls}\n style={{ ...rootNodeStyle }}>\n {getEditBar.value}\n {getDivider.value}\n <Transition name=\"el-zoom-in-top\">\n <div\n v-show={isShow.value}\n key=\"gv-form-body\"\n class={`${prefixCls}-collapse__inner`}>\n <ElForm\n ref={setFormRef}\n model={model.value}\n size={formSize.value}\n inline={false}\n label-position={labelPosition.value}\n label-width={`${props.labelWidth}px`}\n rules={rules.value}\n style={{\n ...styles.value,\n width: '100%',\n maxHeight: sMaxHeight.value === 0 ? undefined : sMaxHeight.value + 'px',\n }}>\n <ElRow\n ref-form={props.refForm}\n style={{ display: 'flex', flexWrap: 'wrap' }}>\n {getItems.value}\n {slots.default?.() && <div style={{ flex: 1, minWidth: 1 }}>{slots.default?.()}</div>}\n </ElRow>\n </ElForm>\n </div>\n </Transition>\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-form';\n .#{$prefixCls} {\n width: 100%;\n\n .#{$prefixCls}-form-editbar {\n // editbar bottom\n // border-bottom:1px solid #d9d9d9;\n // editbar top\n // border-top:1px solid #d9d9d9;\n // border-top: 1.5px solid var(--primaryColorHover, $primaryColorHover);\n padding: 0 0 2px;\n margin-top: -3px;\n }\n\n .#{$prefixCls}-collapse-wrap {\n overflow: hidden;\n }\n\n .#{$prefixCls}-collapse__inner {\n transform-origin: center top;\n }\n\n .el-form {\n overflow: hidden;\n }\n\n .el-col {\n min-height: 32px;\n margin-bottom: 12px;\n\n &[type='FIXED'] {\n height: 32px !important;\n }\n\n :deep(.el-form-item) {\n margin-bottom: 0;\n\n .el-form-item__label {\n height: 30px; // 32px\n padding-right: $modulePadding;\n //font-size: $textSizeSecondary;\n font-weight: $fontWeight;\n line-height: 30px; // 32px\n\n .label-wrap {\n display: inline-block;\n max-width: calc(100% - 10px);\n\n .el-input__inner {\n padding: 0 8px;\n border-color: $borderColor;\n\n & + span.el-input__suffix {\n right: 0;\n }\n }\n }\n }\n\n .el-form-item__content {\n line-height: 29px;\n height: 29px;\n .el-radio-group {\n .el-radio-button--small .el-radio-button__inner {\n padding: 7px;\n }\n\n .el-radio__label {\n //font-size: $appTextSize;\n }\n }\n\n .el-range-editor {\n width: 100%;\n }\n\n .el-input__prefix {\n left: 2px;\n }\n\n .#{$prefixCls}__item__inner-blank {\n width: 100%;\n height: 20px;\n line-height: 5px;\n border: 0;\n }\n\n // 日期范围选择\n .el-range-editor.el-input__inner {\n padding: 3px 5px;\n }\n\n // 日期范围选择\n .el-range__close-icon {\n width: 20px;\n }\n\n .gv-daterange__single {\n display: inline-flex !important;\n height: 32px;\n border: 1px solid #d9d9d9;\n border-radius: 4px;\n\n &:focus,\n &.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n .el-input__prefix {\n left: 2px;\n }\n\n .el-input__suffix {\n right: 2px;\n }\n\n .el-input__inner {\n padding-right: 2px;\n padding-left: 25px;\n border: 0;\n }\n\n .gv-daterange__single-separator {\n height: 32px;\n //font-size: $appTextSize;\n line-height: 32px;\n }\n }\n\n .el-form-item__error {\n margin-top: 2px;\n transform: scale(0.9);\n transform-origin: 0 50%;\n }\n }\n\n .el-select {\n width: 100%;\n\n .el-select__tags {\n height: 24px;\n overflow-y: auto;\n\n .el-select__input {\n height: inherit;\n padding-left: 15px;\n }\n }\n }\n\n .el-autocomplete {\n width: 100%;\n }\n\n .el-textarea {\n display: block;\n\n .el-textarea__inner {\n padding: 0 10px;\n\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n overflow-y: auto;\n font-family: inherit;\n }\n\n .el-input__count {\n right: 6px;\n line-height: 1;\n }\n }\n\n .el-input-number {\n width: 100%;\n\n .el-input__inner {\n text-align: left !important;\n }\n\n .el-input-number__increase:hover ~ .el-input .el-input__inner:not(.is-disabled),\n .el-input-number__decrease:hover ~ .el-input .el-input__inner:not(.is-disabled) {\n border-color: $borderColor;\n }\n }\n\n .desc-icon {\n padding: 6px;\n font-size: 18px;\n vertical-align: middle;\n }\n\n .desc-text {\n //font-size: $textSizeSecondary;\n }\n\n &.is-required .el-form-item__label {\n // color: #f5222d;\n color: #606266;\n }\n }\n }\n .el-form--label-top {\n .el-form-item {\n .el-select,\n .el-input,\n .el-radio-group {\n width: 90% !important;\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvForm from './src/GvForm.vue';\nconst GvFormPlugin = {\n install(app: App): void {\n app.component(GvForm.name ?? 'GvForm', GvForm);\n },\n};\nexport default GvFormPlugin;\n\nexport { GvForm };\n","<!--\n * @title: collapsed sidebar component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-06-03 13:48:02\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-03 11:18:57\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { Expand, Fold } from '@element-plus/icons-vue';\n import { ElIcon } from 'element-plus';\n import { computed, onMounted, unref } from 'vue';\n import { propTypes } from '../../utils/gv.propTypes';\n\n defineOptions({\n name: 'GvHamburger', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('hamburger');\n\n const appStore = useAppStore();\n const collapse = computed(() => appStore.getCollapseMenus);\n\n // set quick keys\n\n // @method\n // load dict\n const loadDict = async () => {\n try {\n await appStore.loadAllDict();\n } catch {\n // empty\n }\n };\n // load division\n const loadDictDivision = async () => {\n try {\n await appStore.loadDictDivision();\n } catch {\n // empty\n }\n };\n\n const toggleCollapse = () => {\n const collapsed = unref(collapse);\n appStore.setCollapseMenus(!collapsed);\n };\n\n // @created\n // @mounted\n onMounted(async () => {\n // reload dict if needed\n const currentDict = appStore.dict;\n const currentReloadDict = appStore.isLoadDict;\n if (!currentDict || Object.keys(currentDict).length === 0) await loadDict();\n else if (+currentReloadDict === 1) await loadDict();\n const currentDictDivision = appStore.dictDivision;\n if (currentDictDivision && currentDictDivision.length === 0) await loadDictDivision();\n });\n</script>\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleCollapse\">\n <div class=\"trigger\">\n <ElIcon\n :size=\"20\"\n :class=\"`${prefixCls}__icon`\">\n <Expand\n v-if=\"!collapse\"\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n <Fold\n v-else\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n </ElIcon>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-hamburger';\n .#{$prefixCls} {\n position: relative;\n z-index: 3;\n line-height: $navHeadHeight;\n background-color: #fff;\n &:hover {\n background-color: rgb(0 0 0 / 3%);\n }\n .trigger {\n display: inline-block;\n line-height: 1px;\n cursor: pointer;\n transition: color 0.3s ease;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvHamburger from './src/GvHamburger.vue';\nconst GvHamburgerPlugin = {\n install(app: App): void {\n app.component(GvHamburger.name ?? 'GvHamburger', GvHamburger);\n },\n};\nexport default GvHamburgerPlugin;\n\nexport { GvHamburger };\n","<!--\n * @title: locale lang dropdown\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-25 11:43:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-04 22:09:46\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useLocale } from '@/hook/web/useLocale';\n import { useStyle } from '@/hook/web/useStyle';\n import { useLocaleStore } from '@/store/modules/locale';\n import { useUserStore } from '@/store/modules/user';\n import { computed, unref } from 'vue';\n import { useRouter } from 'vue-router';\n import { propTypes } from '../../utils/gv.propTypes';\n\n import { ElDropdown, ElDropdownItem, ElDropdownMenu } from 'element-plus';\n\n defineOptions({\n name: 'GvLangSelect', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n defineProps({\n className: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('lang-select');\n\n const userStore = useUserStore();\n const localeStore = useLocaleStore();\n const langMap = computed(() => localeStore.getLocaleMap);\n const currentLang = computed(() => localeStore.getCurrentLocale);\n\n const router = useRouter();\n\n const handleSetLang = async (lang): Promise<void> => {\n if (lang === unref(currentLang).lang) return;\n\n const { switchLocale } = useLocale();\n userStore.setLanguage(lang);\n await switchLocale(lang);\n\n router.go(0);\n };\n</script>\n\n<template>\n <ElDropdown\n :class=\"prefixCls\"\n trigger=\"click\"\n class=\"international\"\n @command=\"handleSetLang\">\n <div>\n <GvIcon\n :class-name=\"`international-icon ${className}`\"\n icon-name=\"language\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item in langMap\"\n :key=\"item.lang\"\n :command=\"item.lang\">\n {{ item.name }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n","import type { App } from 'vue';\nimport GvLangSelect from './src/GvLangSelect.vue';\nconst GvLangSelectPlugin = {\n install(app: App): void {\n app.component(GvLangSelect.name ?? 'GvLangSelect', GvLangSelect);\n },\n};\nexport default GvLangSelectPlugin;\n\nexport { GvLangSelect };\n","<!--\n * @title: popover component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 14:04:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:33:39\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { GvIcon } from '@@/GvIcon';\n import { ElPopover } from 'element-plus';\n import { computed, defineComponent, ref, watch, type PropType } from 'vue';\n import type { TPopoverPlacement, TPopoverTrigger } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('popover');\n\n export default defineComponent({\n name: 'GvPopover',\n props: {\n vref: {\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: false,\n },\n title: {\n type: String,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n placement: {\n type: String as PropType<TPopoverPlacement>,\n default: 'bottom-start',\n },\n trigger: {\n type: String as PropType<TPopoverTrigger>,\n default: 'click',\n },\n tablePopover: {\n type: Boolean,\n default: false,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n columnType: {\n type: String,\n default: undefined,\n },\n },\n\n emits: ['update:visible', 'show', 'hide'],\n\n setup(props, { emit, slots }) {\n // @data\n const isShow = ref<boolean>(props.visible);\n\n // @watch\n watch(\n () => props.visible,\n (val) => {\n isShow.value = val;\n },\n );\n\n // @computed\n const popClass = computed(() => (props.tablePopover ? `${prefixCls} table-popover` : prefixCls));\n\n // @methods\n\n const handleUpdateVisible = (val: boolean) => {\n isShow.value = val;\n emit('update:visible', val);\n };\n\n const handleShow = () => {\n emit('show', props.columnProp);\n };\n\n const handleHide = () => {\n emit('hide', props.columnProp);\n };\n\n const handlePopoverWrapper = (e: MouseEvent) => {\n e.stopPropagation();\n // 关闭其他 popover\n // if (this.tablePopover === true)\n // this.$refs.array.forEach(element => {\n\n // });\n\n // this.$emit('click', e, this.columnProp);\n };\n\n const getReferenceSlot = () => (\n <span class=\"gv-popover-reference\">\n {props.label || props.title}\n <GvIcon\n iconType=\"el\"\n iconName=\"ArrowDown\"\n />\n </span>\n );\n\n // @render\n return () => (\n <div\n class={prefixCls}\n onClick={handlePopoverWrapper}>\n <ElPopover\n ref={props.vref || 'gv-popover'}\n visible={isShow.value}\n onUpdate:visible={handleUpdateVisible}\n title={props.title}\n placement={props.placement}\n trigger={props.trigger}\n showArrow={true}\n popperClass={`gv-popover ${popClass.value}`}\n transition=\"el-zoom-in-top\"\n onAfter-enter={handleShow}\n onAfter-leave={handleHide}\n // append-to-body={false}\n // popper-options={{ // fixme: 增加该配置会导致各种问题,兼容性不行\n // boundariesElement: 'body',\n // // gpuAcceleration: true,\n // // positionFixed: true,\n // removeOnDestroy: true\n // }}\n >\n {{\n default: () => slots.default?.(),\n reference: () => getReferenceSlot(),\n }}\n </ElPopover>\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-popover';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvPopover from './src/GvPopover.vue';\n\nconst GvPopoverPlugin = {\n install(app: App): void {\n app.component(GvPopover.name ?? 'GvPopover', GvPopover);\n },\n};\nexport default GvPopoverPlugin;\n\nexport { GvPopover };\n","<!--\n * @title: radio component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 11:52:20\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:34:53\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRadio, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { TRadioValue } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('radio');\n\n export default defineComponent({\n name: 'GvRadio',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n value: {\n type: [String, Number, Boolean] as PropType<TRadioValue>,\n default: undefined,\n },\n label: {\n type: [String, Number, Boolean] as PropType<TRadioValue>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n border: {\n type: Boolean,\n default: false,\n },\n },\n\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const radioValue = ref(props.value);\n const radioSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n radioValue.value = newVal;\n },\n );\n\n // @method\n const handleUpdate = (val: TRadioValue) => {\n radioValue.value = val;\n emit('update:modelValue', val);\n };\n\n const handleChange = (val: TRadioValue) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElRadio\n modelValue={radioValue.value}\n onUpdate:modelValue={handleUpdate}\n name={props.name}\n value={props.value ?? props.label}\n disabled={props.disabled}\n border={props.border}\n onChange={handleChange}\n size={radioSize.value}\n class={prefixCls}>\n {slots.default?.()}\n </ElRadio>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-radio';\n .#{$prefixCls} {\n padding: 5px 0;\n margin-right: 15px;\n }\n</style>\n","import type { App } from 'vue';\nimport GvRadio from './src/GvRadio.vue';\n\nconst GvRadioPlugin = {\n install(app: App): void {\n app.component(GvRadio.name ?? 'GvRadio', GvRadio);\n },\n};\nexport default GvRadioPlugin;\n\nexport { GvRadio };\n","<!--\n * @title: radio button component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 14:18:46\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:35:23\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRadioButton } from 'element-plus';\n import { defineComponent, ref, watch } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('radio-button');\n\n export default defineComponent({\n name: 'GvRadioButton',\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [String, Number, Boolean],\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n name: {\n type: String,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n emits: ['update:modelValue', 'change'],\n setup(props, { slots }) {\n // @data\n const radioValue = ref(props.value);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n radioValue.value = newVal;\n },\n );\n\n // @method\n // const handleUpdate = (val) => {\n // radioValue.value = val;\n // emit('update:modelValue', val);\n // };\n\n // @render\n return () => (\n <ElRadioButton\n value={props.value ?? props.label}\n modelValue={radioValue.value}\n name={props.name}\n disabled={props.disabled}\n class={prefixCls}>\n {slots.default?.()}\n </ElRadioButton>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-radio-button';\n .#{$prefixCls} {\n padding: 5px 0;\n margin-right: 15px;\n }\n</style>\n","import type { App } from 'vue';\nimport GvRadioButton from './src/GvRadioButton.vue';\n\nconst GvRadioButtonPlugin = {\n install(app: App): void {\n app.component(GvRadioButton.name ?? 'GvRadioGroup', GvRadioButton);\n },\n};\nexport default GvRadioButtonPlugin;\n\nexport { GvRadioButton };\n","<!--\n * @title: radio group component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 14:10:40\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 09:03:41\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRadioGroup, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, watch, type PropType } from 'vue';\n import type { TRadioGroupValue } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('radio-group');\n\n export default defineComponent({\n name: 'GvRadioGroup',\n props: {\n vref: {\n type: String,\n default: '',\n },\n value: {\n type: [String, Number, Boolean] as PropType<TRadioGroupValue>,\n default: undefined,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n },\n\n // @emits\n emits: ['update:modelValue', 'change'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const radioValue = ref<TRadioGroupValue | undefined>(props.value ?? undefined);\n const radioGroupSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n radioValue.value = newVal;\n },\n );\n\n // @method\n const handleUpdate = (val: TRadioGroupValue) => {\n radioValue.value = val;\n emit('update:modelValue', val);\n };\n\n const handleChange = (val: TRadioGroupValue) => {\n emit('change', val);\n };\n\n // @render\n return () => (\n <ElRadioGroup\n class={prefixCls}\n aria-label={props.label}\n modelValue={radioValue.value}\n onUpdate:modelValue={handleUpdate}\n size={radioGroupSize.value}\n onChange={handleChange}>\n {slots.default?.()}\n </ElRadioGroup>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-radio-group';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvRadioGroup from './src/GvRadioGroup.vue';\n\nconst GvRadioGroupPlugin = {\n install(app: App): void {\n app.component(GvRadioGroup.name ?? 'GvRadioGroup', GvRadioGroup);\n },\n};\nexport default GvRadioGroupPlugin;\n\nexport { GvRadioGroup };\n","<!--\n * @title: row component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 09:49:52\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:36:24\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElRow } from 'element-plus';\n import { defineComponent, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('row');\n\n export default defineComponent({\n name: 'GvRow',\n props: {\n gutter: {\n type: Number,\n default: 0,\n },\n tag: {\n type: String as PropType<string>,\n default: 'div',\n },\n },\n setup(props, { slots }) {\n return () => (\n <ElRow\n class={prefixCls}\n gutter={props.gutter}\n tag={props.tag}>\n {slots.default?.()}\n </ElRow>\n );\n },\n });\n</script>\n","import type { App } from 'vue';\nimport GvRow from './src/GvRow.vue';\n\nconst GvRowPlugin = {\n install(app: App): void {\n app.component(GvRow.name ?? 'GvRow', GvRow);\n },\n};\nexport default GvRowPlugin;\n\nexport { GvRow };\n","<!--\n * @title: screenfull\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-22 09:15:43\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-11-17 10:55:25\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { useFullscreen } from '@vueuse/core';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('screenfull');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { toggle, isFullscreen } = useFullscreen();\n\n const toggleFullscreen = () => {\n toggle();\n };\n</script>\n\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleFullscreen\">\n <GvIcon :icon-name=\"isFullscreen ? 'exit-fullscreen' : 'fullscreen'\" />\n </div>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-screenfull';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvScreenFull from './src/GvScreenFull.vue';\n// Define the install method on the GvButton component\nconst GvScreenFullPlugin = {\n install(app: App): void {\n app.component(GvScreenFull.name ?? 'GvScreenFull', GvScreenFull);\n },\n};\nexport default GvScreenFullPlugin;\n\nexport { GvScreenFull };\n","<!--\n * @title: search bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:02:29\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 16:14:17\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvIcon } from '@@/GvIcon';\n import { getVNodeText } from '@@/utils';\n import { computed, defineComponent, getCurrentInstance, inject, nextTick, onMounted, ref } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('search-bar');\n export default defineComponent({\n name: 'GvSearchBar',\n props: {\n expand: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n setup(props, { slots }) {\n // @data\n const appStore = useAppStore();\n const { t } = useBridgeI18n();\n\n const visible = ref(props.expand);\n const searchFieldsCollapsed = inject<{ value: boolean }>('searchFieldsCollapsed', ref(true));\n // const formList = inject('formList') as Recordable[];\n const refForm = inject('refForm') as string;\n const instance = getCurrentInstance(); // get current vnode\n let formNode: any = instance;\n while (formNode && formNode.type?.name !== 'ElForm') formNode = formNode?.parent;\n\n const fieldList = ref<any[]>([]);\n const searchFormRows = appStore.searchFormRows;\n const showDefaultRow = searchFormRows === 1 ? 4 : 8;\n // @mounted\n onMounted(() => {\n nextTick(() => {\n // console.log(formNode.exposed.fields);\n fieldList.value = formNode.exposed.fields;\n });\n });\n // const gvSearchExpand = ref(null);\n // const gvSearchShrink = ref(null);\n\n // @methods\n /**\n * @todo: expand search bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:45:03\n */\n const expandFields = () => {\n searchFieldsCollapsed.value = false;\n visible.value = false;\n };\n /**\n * @todo: shrink search bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 14:48:18\n */\n const shrinkFields = () => {\n searchFieldsCollapsed.value = true;\n visible.value = true;\n };\n /**\n * @todo: create search button\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 14:17:17\n */\n const createSearchBar = computed(() => {\n if (!fieldList.value?.length) return null;\n const searchBar: any[] = [];\n const buttonQuick = appStore.buttonQuick;\n const buttonIcon = appStore.buttonIcon;\n const defaultSlot = slots.default?.();\n if (defaultSlot) {\n defaultSlot.forEach((vnode) => {\n if (!vnode.props) vnode.props = {};\n const propsData = vnode.props;\n\n const type = vnode.type;\n if (typeof type === 'object' && 'name' in type && type.name === 'GvButton') {\n let text = getVNodeText(vnode);\n let searchBtnFlag = false;\n\n if (text === t('searchBar.search')) {\n if (buttonQuick) text = t('searchBar.search2');\n searchBtnFlag = true;\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.search');\n if (buttonIcon) propsData.icon = 'el-icon-search';\n propsData.bizType = 'search';\n }\n } else if (text === t('searchBar.seek')) {\n if (buttonQuick) text = t('searchBar.seek2');\n searchBtnFlag = true;\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.seek');\n if (buttonIcon) propsData.icon = 'el-icon-search';\n propsData.bizType = 'search';\n }\n } else if (text === t('searchBar.query')) {\n if (buttonQuick) text = t('searchBar.query2');\n searchBtnFlag = true;\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.query');\n if (buttonIcon) propsData.icon = 'el-icon-search';\n propsData.bizType = 'search';\n }\n } else if (text === t('searchBar.reset')) {\n if (buttonQuick) text = t('searchBar.reset2');\n if (propsData) {\n propsData.text = text;\n propsData.otext = t('searchBar.reset');\n if (buttonIcon) propsData.icon = 'el-icon-refreshLeft';\n propsData.bizType = 'reset';\n }\n }\n\n if (searchBtnFlag && propsData && propsData.type === undefined) propsData.type = 'primary';\n\n if (propsData) propsData.refForm = refForm;\n }\n searchBar.push(vnode);\n });\n\n // if (this.expand) {\n // add: 判断是否需要增加展开按钮 2022-04-22\n const fieldList2 = fieldList.value.filter((x) => {\n if (x.$el.hidden !== true) return true;\n });\n\n if (fieldList2.length > showDefaultRow) {\n let expandText = `${t('searchBar.expand')}`;\n if (buttonQuick) expandText = `${t('searchBar.expand')}(E)`;\n let shrinkText = `${t('searchBar.shrink')}`;\n if (buttonQuick) shrinkText = `${t('searchBar.shrink')}(E)`;\n const expand = (\n <GvButton\n link={true}\n bizType=\"expand\"\n visible={visible.value}\n onClick={expandFields}>\n {expandText} \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} \n <GvIcon\n iconType=\"el\"\n iconName=\"arrowUp\"\n />\n </GvButton>\n );\n searchBar.push(shrink);\n }\n // }\n }\n return searchBar;\n });\n // @created\n\n // @render\n return () => <div class={prefixCls}>{createSearchBar.value}</div>;\n },\n });\n</script>\n<style scoped lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-search-bar';\n .#{$prefixCls} {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n padding-top: 0px;\n margin: 0 1px 6px 0;\n }\n</style>\n","import type { App } from 'vue';\nimport GvSearchBar from './src/GvSearchBar.vue';\n// Define the install method on the GvButton component\nconst GvSearchBarPlugin = {\n install(app: App): void {\n app.component(GvSearchBar.name ?? 'GvSearchBar', GvSearchBar);\n },\n};\nexport default GvSearchBarPlugin;\n\nexport { GvSearchBar };\n","import { ref, unref } from 'vue';\nimport { findPath } from '../../utils/gv.tree';\n\ntype OnlyOneChildType = AppRouteRecordRaw & { noShowingChildren?: boolean };\n\ninterface HasOneShowingChild {\n oneShowingChild?: boolean;\n onlyOneChild?: OnlyOneChildType;\n}\n\nexport const getAllParentPath = <T = Recordable>(treeData: T[], path: string) => {\n const menuList = findPath(treeData, (n) => n.path === path) as AppRouteRecordRaw[];\n return (menuList || []).map((item) => item.path);\n};\n\nexport const hasOneShowingChild = (parent: AppRouteRecordRaw, children: AppRouteRecordRaw[] = []): HasOneShowingChild => {\n const onlyOneChild = ref<OnlyOneChildType>();\n\n const showingChildren = children.filter((v) => {\n const meta = v.meta ?? {};\n if (meta.hidden) return false;\n else {\n // Temp set(will be used if only has one showing child)\n onlyOneChild.value = v;\n return true;\n }\n });\n\n // When there is only one child router, the child router is displayed by default\n if (showingChildren.length === 1)\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n\n // Show parent if there are no child router to display\n if (!showingChildren.length) {\n onlyOneChild.value = { ...parent, path: '', noShowingChildren: true };\n return {\n oneShowingChild: true,\n onlyOneChild: unref(onlyOneChild),\n };\n }\n\n return {\n oneShowingChild: false,\n onlyOneChild: unref(onlyOneChild),\n };\n};\n","import { useI18n } from '@/hook/web/useI18n';\nimport type { RouteMeta } from 'vue-router';\nimport { GvIcon } from '../../../GvIcon';\nexport const useRenderMenuTitle = () => {\n const renderMenuTitle = (meta: RouteMeta) => {\n const { t } = useI18n();\n if (!meta) {\n return <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">No Title</span>;\n }\n const { title = 'Please set title', icon } = meta;\n\n return icon ? (\n <>\n <GvIcon\n iconName={meta.icon || ''}\n className=\"sub-el-icon\"></GvIcon>\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n </>\n ) : (\n <span class=\"v-menu__title overflow-hidden overflow-ellipsis whitespace-nowrap\">{t(title as string)}</span>\n );\n };\n\n return {\n renderMenuTitle,\n };\n};\n","/*\n * @title: render menu item - useRenderMenuItem\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-07-15 15:07:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 14:34:07\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { useStyle } from '@/hook/web/useStyle';\nimport { isUrl, pathResolve } from '@@/utils';\nimport { ElMenuItem, ElSubMenu } from 'element-plus';\nimport { unref } from 'vue';\nimport { hasOneShowingChild } from '../helper';\nimport { useRenderMenuTitle } from './useRenderMenuTitle';\nconst { getPrefixCls } = useStyle();\nconst prefixCls = getPrefixCls('submenu');\n\nconst { renderMenuTitle } = useRenderMenuTitle();\n\nexport const useRenderMenuItem = (menuMode) =>\n // allRouters: AppRouteRecordRaw[] = [],\n {\n const renderMenuItem = (routers: AppRouteRecordRaw[], parentPath = '/') => {\n if (!routers || !routers.length) return null;\n return routers\n .filter((v) => !v.meta?.hidden)\n .map((v) => {\n const meta = v.meta ?? {};\n const { oneShowingChild, onlyOneChild } = hasOneShowingChild(v, v.children);\n const fullPath = isUrl(v.path) ? String(v.path) : pathResolve(parentPath, v.path); // getAllParentPath<AppRouteRecordRaw>(allRouters, v.path).join('/')\n if (oneShowingChild && (!onlyOneChild?.children || onlyOneChild?.noShowingChildren) && !meta?.alwaysShow) {\n return (\n <ElMenuItem index={onlyOneChild ? pathResolve(fullPath, onlyOneChild.path) : fullPath}>\n {{\n default: () => renderMenuTitle(onlyOneChild ? (onlyOneChild.meta ?? meta) : meta),\n }}\n </ElMenuItem>\n );\n } else {\n return (\n <ElSubMenu\n index={fullPath}\n teleported\n class=\"nest-menu\"\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : ''}>\n {{\n title: () => renderMenuTitle(meta),\n default: () => renderMenuItem(v.children!, fullPath),\n }}\n </ElSubMenu>\n );\n }\n });\n };\n return {\n renderMenuItem,\n };\n };\n","<!--\n * @title: left menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-30 16:12:28\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 15:14:41\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { ElMenu, ElScrollbar } from 'element-plus';\n import { computed, defineComponent, unref, type PropType } from 'vue';\n import { useRenderMenuItem } from './components/useRenderMenuItem';\n\n import { useStyle } from '@/hook/web/useStyle';\n import { useRouter } from 'vue-router';\n import { isUrl } from '../../utils';\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('sidebar');\n\n export default defineComponent({\n name: 'GvSidebar',\n props: {\n menuSelect: {\n type: Function as PropType<(index: string) => void>,\n default: undefined,\n },\n },\n setup(props) {\n const appStore = useAppStore();\n const layout = computed(() => appStore.getLayout);\n const { push, currentRoute } = useRouter();\n const permStore = usePermsStore();\n const menuMode = computed((): 'vertical' | 'horizontal' => {\n const vertical: LayoutType[] = ['default', 'topLeft', 'cutMenu'];\n\n if (vertical.includes(unref(layout))) return 'vertical';\n else return 'horizontal';\n });\n\n const routers = computed(() => (unref(layout) === 'cutMenu' ? permStore.getRouters : permStore.getRouters));\n\n // console.log(routers.value);\n\n const collapse = computed(() => appStore.getCollapseMenus);\n\n const leftMenuUniqueOpened = computed(() => appStore.getLeftMenuUniqueOpened);\n\n const activeMenu = computed(() => {\n const { meta, path } = unref(currentRoute);\n // if set path, the sidebar will highlight the path you set\n if (meta.activeMenu) return meta.activeMenu as string;\n\n return path;\n });\n\n const menuSelect = (index: string) => {\n props.menuSelect?.(index);\n\n // 自定义事件\n if (isUrl(index)) {\n window.open(index);\n return;\n }\n push(index);\n };\n\n const renderMenu = () => (\n <ElMenu\n defaultActive={unref(activeMenu)}\n mode={unref(menuMode)}\n collapse={unref(layout) === 'top' || unref(layout) === 'cutMenu' ? false : unref(collapse)}\n uniqueOpened={unref(layout) === 'top' ? false : unref(leftMenuUniqueOpened)}\n backgroundColor=\"var(--left-menu-bg-color)\"\n textColor=\"var(--left-menu-text-color)\"\n activeTextColor=\"var(--left-menu-text-active-color)\"\n popperClass={unref(menuMode) === 'vertical' ? `${prefixCls}-popper--vertical` : `${prefixCls}-popper--horizontal`}\n onSelect={menuSelect}>\n {{\n default: () => {\n const { renderMenuItem } = useRenderMenuItem(menuMode);\n // console.log('renderMenu', routers.value);\n return renderMenuItem(unref(routers));\n },\n }}\n </ElMenu>\n );\n const renderMenuWrap = () => {\n if (unref(layout) === 'top') return renderMenu();\n else return <ElScrollbar>{renderMenu()}</ElScrollbar>;\n };\n return () => (\n <div\n id=\"gv-sidebar\"\n class={[\n `${prefixCls} ${prefixCls}__${unref(menuMode)}`,\n 'h-[100%] overflow-hidden flex-col bg-[var(--left-menu-bg-color)]',\n {\n 'w-[var(--left-menu-min-width)]': unref(collapse) && unref(layout) !== 'cutMenu',\n 'w-[var(--left-menu-max-width)]': !unref(collapse) && unref(layout) !== 'cutMenu',\n },\n ]}>\n {renderMenuWrap()}\n </div>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-sidebar';\n\n .#{$prefixCls} {\n position: relative;\n transition: width var(--transition-time-02);\n\n :deep(.#{$elNamespace}-menu) {\n width: 100% !important;\n border-right: none;\n --el-menu-bg-color: var(--left-menu-bg-color);\n --el-menu-text-color: var(--left-menu-text-color);\n --el-menu-hover-text-color: var(--left-menu-text-active-color);\n --el-menu-active-color: var(--left-menu-text-active-color);\n --el-menu-hover-bg-color: var(--left-menu-hover-bg-color);\n\n // 设置选中时子标题的颜色\n .is-active {\n & > .#{$elNamespace}-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .#{$elNamespace}-sub-menu__title,\n .#{$elNamespace}-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-color) !important;\n }\n }\n\n // 设置选中时的高亮背景和高亮颜色\n .#{$elNamespace}-menu-item.is-active {\n color: var(--left-menu-text-active-color) !important;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n }\n\n // 设置子菜单的背景颜色\n .#{$elNamespace}-menu {\n .#{$elNamespace}-sub-menu__title {\n background-color: var(--left-menu-bg-color) !important;\n }\n .#{$elNamespace}-menu-item:not(.is-active) {\n background-color: var(--left-menu-item-bg-light-color) !important;\n }\n }\n }\n\n // 折叠时的最小宽度\n :deep(.#{$elNamespace}-menu--collapse) {\n width: var(--left-menu-min-width);\n\n & > .is-active,\n & > .is-active > .#{$elNamespace}-sub-menu__title {\n position: relative;\n background-color: var(--left-menu-collapse-bg-active-color) !important;\n }\n }\n\n // 折叠动画的时候,就需要把文字给隐藏掉\n :deep(.horizontal-collapse-transition) {\n .#{$prefixCls}__title {\n display: none;\n }\n }\n\n // 水平菜单\n &__horizontal {\n height: calc(var(--top-tool-height)) !important;\n\n :deep(.#{$elNamespace}-menu--horizontal) {\n height: calc(var(--top-tool-height));\n border-bottom: none;\n // 重新设置底部高亮颜色\n & > .#{$elNamespace}-sub-menu.is-active {\n .#{$elNamespace}-sub-menu__title {\n border-bottom-color: var(--el-color-primary) !important;\n }\n }\n\n .#{$elNamespace}-menu-item.is-active {\n position: relative;\n\n &::after {\n display: none !important;\n }\n }\n\n .#{$prefixCls}__title {\n /* stylelint-disable-next-line */\n max-height: calc(var(--top-tool-height) - 2px) !important;\n /* stylelint-disable-next-line */\n line-height: calc(var(--top-tool-height) - 2px);\n }\n }\n }\n }\n</style>\n\n<style lang=\"scss\">\n $prefixCls: '#{$gvNamespace}-sidebar-popper';\n\n .#{$prefixCls}--vertical,\n .#{$prefixCls}--horizontal {\n // 设置选中时子标题的颜色\n .is-active {\n & > .el-sub-menu__title {\n color: var(--left-menu-text-active-color) !important;\n }\n }\n\n // 设置子菜单悬停的高亮和背景色\n .el-sub-menu__title,\n .el-menu-item {\n &:hover {\n color: var(--left-menu-text-active-color) !important;\n background-color: #545658 !important;\n }\n }\n\n // 设置选中时的高亮背景\n .el-menu-item.is-active {\n position: relative;\n background-color: var(--left-menu-bg-active-color) !important;\n\n &:hover {\n background-color: var(--left-menu-bg-active-color) !important;\n }\n }\n }\n\n $submenu-prefix-cls: '#{$gvNamespace}-submenu-popper';\n\n // 设置子菜单溢出时滚动样式\n .#{$submenu-prefix-cls}--vertical {\n max-height: 100%;\n overflow-y: auto;\n\n &::-webkit-scrollbar {\n width: 6px;\n background-color: transparent;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgb(144 147 153 / 30%);\n border-radius: 4px;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvSidebar from './src/GvSidebar.vue';\n// Define the install method on the GvButton component\nconst GvSidebarPlugin = {\n install(app: App): void {\n app.component(GvSidebar.name ?? 'GvSidebar', GvSidebar);\n },\n};\nexport default GvSidebarPlugin;\n\nexport { GvSidebar };\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAABaCAYAAAAilKGMAAAACXBIWXMAAAZ2AAAGdgEpJm+AAAAKDGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuYTZhNjM5NjhhLCAyMDI0LzAzLzA2LTExOjUyOjA1ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmQxNjAxODBkLTVlZmUtZjc0MS1iY2RhLTdjMDBjNTc4ZTVkMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1ZDE1ZDUxNC05YzkxLTQwNTYtYTgzNS05YjZlYmRlOTQ5ZmEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB0aWZmOkltYWdlV2lkdGg9IjYzNiIgdGlmZjpJbWFnZUxlbmd0aD0iNjYwIiB0aWZmOlBob3RvbWV0cmljSW50ZXJwcmV0YXRpb249IjIiIHRpZmY6U2FtcGxlc1BlclBpeGVsPSIzIiB0aWZmOlhSZXNvbHV0aW9uPSIxNDQvMSIgdGlmZjpZUmVzb2x1dGlvbj0iMTQ0LzEiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6RXhpZlZlcnNpb249IjAyMzEiIGV4aWY6Q29sb3JTcGFjZT0iNjU1MzUiIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSI2MzYiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSI2NjAiIHhtcDpDcmVhdGVEYXRlPSIyMDI0LTExLTI5VDEyOjQ4OjMzKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyNC0xMS0yOVQxMjo1MToyNCswODowMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0yOVQxMjo0OToxNyswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjExIChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvanBlZyB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGltYWdlL2pwZWcgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4MDg4Y2NiMi05NDFlLTQ1YmItOGZhZi02YjA5Mjc0M2Q0MDciIHN0RXZ0OndoZW49IjIwMjQtMTEtMjlUMTI6NDk6MTcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4xMSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NWQxNWQ1MTQtOWM5MS00MDU2LWE4MzUtOWI2ZWJkZTk0OWZhIiBzdEV2dDp3aGVuPSIyMDI0LTExLTI5VDEyOjUxOjI0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMTEgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmZiNWYzMGIyLWJmODgtNDQ3My1iMDk0LWIzMGUzYjkyMzczZiIgc3RSZWY6ZG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0iRTU1OUFCRUUwQ0NBMTg5NjNBREJDRTREOTQ1Q0M5MDkiLz4gPHRpZmY6Qml0c1BlclNhbXBsZT4gPHJkZjpTZXE+IDxyZGY6bGk+ODwvcmRmOmxpPiA8cmRmOmxpPjg8L3JkZjpsaT4gPHJkZjpsaT44PC9yZGY6bGk+IDwvcmRmOlNlcT4gPC90aWZmOkJpdHNQZXJTYW1wbGU+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+WfjB/QAAOnxJREFUeJztvXe4XFd19//Z+9Tp5famq2rJVnE3trGxMcY0h2KMDSb04NBCDIQQQgukvKTwQAKEEkIS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\"","<!--\n * @title: sidebar logo\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-05-15 14:11:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 11:46:47\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { computed, onMounted, ref, unref, watch } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('logo');\n\n const appStore = useAppStore();\n\n const show = ref(true);\n const title = computed(() => appStore.getTitle);\n const layout = computed(() => appStore.getLayout);\n const collapseMenus = computed(() => appStore.getCollapseMenus);\n\n watch(\n () => collapseMenus.value,\n (collapse: boolean) => {\n if (unref(layout) === 'topLeft' || unref(layout) === 'cutMenu') {\n show.value = true;\n return;\n }\n show.value = !collapse;\n },\n );\n\n watch(\n () => layout.value,\n (layout) => {\n if (layout === 'top' || layout === 'cutMenu') show.value = true;\n else if (unref(collapseMenus)) show.value = false;\n else show.value = true;\n },\n );\n\n onMounted(() => {\n if (unref(collapseMenus)) show.value = false;\n });\n</script>\n\n<template>\n <div>\n <router-link\n :class=\"[prefixCls, layout !== 'default' ? `${prefixCls}__Top` : '', 'flex !h-[var(--logo-height)] items-center cursor-pointer pl-[8px] relative decoration-none overflow-hidden']\"\n to=\"/\">\n <img\n src=\"@/assets/imgs/logo.png\"\n class=\"w-[calc(var(--logo-height)-10px)] h-[calc(var(--logo-height)-10px)]\" />\n <div\n v-if=\"show\"\n :class=\"[\n 'block whitespace-nowrap ml-[45px] mr-[0px] mt-[-25px] mb-[0px] text-[16px] font-bold',\n {\n 'text-[var(--logo-title-text-color)]': layout === 'default',\n 'text-[var(--top-header-text-color)]': layout === 'topLeft' || layout === 'top' || layout === 'cutMenu',\n },\n ]\">\n {{ title }}\n </div>\n </router-link>\n </div>\n</template>\n<style lang=\"scss\" scoped></style>\n","import type { App } from 'vue';\nimport GvSidebarLogo from './src/GvSidebarLogo.vue';\n// Define the install method on the GvButton component\nconst GvSidebarLogoPlugin = {\n install(app: App): void {\n app.component(GvSidebarLogo.name ?? 'GvSidebarLogo', GvSidebarLogo);\n },\n};\nexport default GvSidebarLogoPlugin;\n\nexport { GvSidebarLogo };\n","<!--\n * @title: table bar component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:46:02\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-03 14:20:53\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useBridgeI18n } from '@@/bridge';\n import { getVNodeName, getVNodeText } from '@@/utils';\n import { defineComponent, getCurrentInstance, type VNode } from 'vue';\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('table-bar');\n export default defineComponent({\n name: 'GvTableBar',\n props: {\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n setup(props, { slots }) {\n // @data\n const appStore = useAppStore();\n const instance = getCurrentInstance();\n const { t } = useBridgeI18n();\n // @watch\n\n // @methods\n const createTableBar = () => {\n const tableBar: VNode[] = [];\n const defaultSlots = slots.default?.();\n if (defaultSlots) {\n const parentNode = instance?.parent;\n const refForm = parentNode?.attrs['ref-form'];\n\n const buttonQuick = appStore.buttonQuick;\n const buttonIcon = appStore.buttonIcon;\n const childrenNodes = (defaultSlots[0].children as VNode[]) || [];\n childrenNodes.forEach((vnode: VNode) => {\n const propsData = vnode.props || {};\n if (getVNodeName(vnode) === 'GvButton') {\n const text = getVNodeText(vnode);\n if (text.indexOf(t('tableBar.save')) !== -1 || text.indexOf(t('tableBar.add')) !== -1 || text.indexOf(t('tableBar.append')) !== -1 || text.indexOf(t('tableBar.create')) !== -1) {\n if (text === t('tableBar.add') && buttonQuick) {\n propsData.text = t('tableBar.add2');\n propsData.otext = text;\n } else propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-add';\n propsData.bizType = 'save';\n } else if (propsData.bizType === 'export') {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-daochu1';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.refresh')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-shuaxin';\n propsData.bizType = 'refresh';\n propsData.text = t('tableBar.refresh');\n } else if (text.indexOf(t('tableBar.templateDownload')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-xiazaidaorumoban1x';\n propsData.bizType = 'downloadTemplate';\n } else if (text.indexOf(t('tableBar.dispatch')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-winfo-icon-zhipai';\n propsData.bizType = 'dispatch';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.assign')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhipai';\n propsData.bizType = 'dispatch';\n propsData.text = text;\n } else if (text.indexOf(t('tableBar.calculate')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jisuan';\n propsData.text = text;\n propsData.bizType = 'calculate';\n } else if (text.indexOf(t('tableBar.trace')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiankongguanli';\n propsData.text = text;\n propsData.bizType = 'trace';\n } else if (text.indexOf(t('tableBar.receive')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-piliangbianji1';\n propsData.text = text;\n propsData.bizType = 'receive';\n } else if (propsData.bizType === 'import') {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-daoru2';\n propsData.text = text;\n propsData.bizType = 'import';\n } else if (text.indexOf(t('tableBar.generate')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zujian';\n propsData.text = text;\n propsData.bizType = 'generate';\n } else if (text.indexOf(t('tableBar.pay')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-yingshoukuan';\n propsData.text = text;\n propsData.bizType = 'pay';\n } else if (text.indexOf(t('tableBar.check')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-xuanze';\n propsData.text = text;\n propsData.bizType = 'check';\n } else if (text.indexOf(t('tableBar.reject')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-bohui';\n propsData.text = text;\n propsData.bizType = 'reject';\n } else if (text.indexOf(t('tableBar.approve')) !== -1 || text.indexOf(t('tableBar.audit')) !== -1) {\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-shenpi2';\n propsData.text = text;\n propsData.bizType = 'approve';\n } else if (text.indexOf(t('tableBar.logging')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-rizhi1';\n propsData.bizType = 'logging';\n } else if (text.indexOf(t('tableBar.select')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-chaxun';\n propsData.bizType = 'search';\n }\n // else if (text.indexOf('派') !== -1) {\n // // propsData.text = text;\n // propsData.icon = 'el-icon-finished';\n // propsData.bizType = 'confirm';\n // }\n else if (text.indexOf(t('tableBar.detail')) !== -1 || text.indexOf(t('table.list')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-mingxi';\n propsData.bizType = 'detail';\n } else if (text.indexOf(t('tableBar.withdraw')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-fanhui5';\n propsData.bizType = 'withdraw';\n } else if (text.indexOf(t('tableBar.submit')) !== -1 || text.indexOf('提报') !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tijiao';\n propsData.bizType = 'submit';\n } else if (text.indexOf(t('tableBar.delete')) !== -1 || text.indexOf(t('tableBar.cancel')) !== -1 || text.indexOf(t('tableBar.cancel1')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-delete';\n propsData.bizType = 'delete';\n } else if (text.indexOf(t('tableBar.change')) !== -1 || text.indexOf(t('tableBar.update')) !== -1 || text.indexOf(t('tableBar.modify')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-edit-outline';\n propsData.bizType = 'update';\n } else if (text.indexOf(t('tableBar.sync')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tongbu1';\n propsData.bizType = 'update';\n } else if (text.indexOf(t('tableBar.untop')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-quxiaozhiding1';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.top')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhiding1';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.deserum')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-quxiaozhiding';\n propsData.bizType = 'top';\n } else if (text.indexOf(t('tableBar.unitPrice')) !== -1) {\n if (buttonIcon)\n // propsData.text = text;\n propsData.icon = 'iconfont gv-icon-jiangjinguize';\n else if (text.indexOf(t('tableBar.essence')) !== -1) {\n // propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-zhiding';\n propsData.bizType = 'top';\n propsData.text = text;\n }\n } else if (text.indexOf(t('tableBar.relieve')) !== -1 || text.indexOf(t('tableBar.unbind')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiekou1';\n propsData.bizType = 'unbind';\n } else if (text.indexOf(t('tableBar.bind')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiekoushuoming';\n propsData.bizType = 'bind';\n } else if (text.indexOf(t('tableBar.confirm')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-tianshenpi';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.notify')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-huodong';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.payment')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-jiage';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.transfer')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'iconfont gv-icon-fanhui5';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.putaway')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-top';\n propsData.bizType = 'confirm';\n } else if (text.indexOf(t('tableBar.soldOut')) !== -1) {\n propsData.text = text;\n if (buttonIcon) propsData.icon = 'el-icon-bottom';\n propsData.bizType = 'confirm';\n }\n propsData.refForm = refForm;\n } else if (getVNodeName(vnode) === 'ElDropdown') {\n const firstChild = vnode?.children?.[0];\n const text = getVNodeText(firstChild);\n propsData.text = text;\n propsData.icon = firstChild?.props.icon || '';\n }\n tableBar.push(vnode);\n });\n }\n return tableBar || [];\n };\n // console.log(tableBar);\n\n // @mounted\n\n // @render\n return () => (props.visible ? <div class={prefixCls}>{createTableBar()}</div> : null);\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-table-bar';\n .#{$prefixCls} {\n display: inline-block;\n height: 30px;\n padding-top: 3px;\n\n .el-dropdown {\n float: left;\n\n i {\n padding-right: 3px;\n color: var(--tableBarColor, $tableBarColor);\n\n & + span {\n margin-left: 3px;\n }\n }\n }\n\n :deep(.el-button) {\n float: left;\n height: 25px;\n padding: 2px 8px;\n margin-bottom: 2px;\n margin-left: 2px;\n color: var(--tableBarColor, $tableBarColor);\n text-align: left;\n background: #fff !important;\n border: 0;\n\n i {\n padding-right: 3px;\n color: var(--tableBarColor, $tableBarColor);\n\n & + span {\n margin-left: 3px;\n }\n }\n\n &:hover {\n background-color: rgb(0 82 156 / 5%) !important;\n }\n }\n\n .el-button.is-disabled {\n color: $textColor;\n\n :deep(i) {\n color: $textColor;\n }\n }\n }\n</style>\n","<!--\n * @title: tag component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 14:43:04\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-29 09:37:24\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElTag, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, unref, type PropType } from 'vue';\n import type { TTagEffect, TTagType } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tag');\n\n export default defineComponent({\n name: 'GvTag',\n props: {\n type: {\n type: String as PropType<TTagType>,\n default: 'primary',\n },\n closable: {\n type: Boolean,\n default: false,\n },\n effect: {\n type: String as PropType<TTagEffect>,\n default: 'light',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: 'default',\n },\n round: {\n type: Boolean,\n default: false,\n },\n },\n\n // @emits\n emits: ['click', 'close'],\n\n setup(props, { emit, slots }) {\n // @data\n const globalSize = useGlobalConfig('size');\n const tagSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n\n // @methods\n\n const handleClick = (event: MouseEvent) => {\n emit('click', event);\n };\n\n const handleClose = (event: Event) => {\n emit('close', event);\n };\n\n // @render\n return () => (\n <ElTag\n type={props.type}\n size={tagSize.value}\n round={props.round}\n closable={props.closable}\n effect={props.effect}\n class={prefixCls}\n onClick={handleClick}\n onClose={handleClose}>\n {slots.default?.()}\n </ElTag>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tag';\n .#{$prefixCls} {\n }\n</style>\n","/*\n * @title: table utils\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-09 17:50:09\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 11:28:48\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\nimport type { FilterCondition, PageInfo } from '@@/GvTable/src/types';\nimport type { TableInstance } from 'element-plus';\nimport { message } from './gv.notify';\nimport { isEmpty, toHump, toLine } from './index';\n/**\n * @todo: page info condition\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 09:09:54\n * @param {PageInfo} pi\n */\nexport const appendPageInfo = (pi?: PageInfo): PageInfo => {\n const pageInfo: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n const currentpagenum = pi && pi['currentpagenum'] ? pi['currentpagenum'] : 1;\n const recordsperpage = pi && pi['recordsperpage'] ? pi['recordsperpage'] : 10;\n const countrows = pi && pi['countrows'] ? pi['countrows'] : 0;\n const totalpage = pi && pi['totalpage'] ? pi['totalpage'] : 0;\n pageInfo['currentpagenum'] = currentpagenum;\n pageInfo['recordsperpage'] = recordsperpage;\n pageInfo['countrows'] = countrows;\n pageInfo['totalpage'] = totalpage;\n return pageInfo;\n};\n\n/**\n * @todo: common query combined filter conditions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:08:33\n * @param {TableInstance} tabNode\n * @param {Recordable} filter\n */\nexport const combined = (tabNode: TableInstance, filter: Recordable<any>): Recordable<FilterCondition | PageInfo> => {\n const filterConditions: Recordable<FilterCondition | PageInfo> = {};\n if (!isEmpty(filter))\n Object.keys(filter).forEach((x: string) => {\n let val: string = '';\n let co = 'null';\n if (!isEmpty(filter[x])) {\n let sOp = '=';\n if (typeof filter[x] === 'object')\n if (Array.isArray(filter[x] as any[])) {\n // fixme: 增加多选字典 2022-08-01\n let coo = '';\n let labels = '';\n (filter[x] as any[]).forEach((x) => {\n if (coo) {\n coo += ',' + x.value;\n labels += ',' + x.label;\n } else {\n coo = x.value;\n labels = x.label;\n }\n });\n co = coo;\n val = labels;\n } else {\n const v = filter[x] as Recordable<any>;\n co = v.value;\n val = v.label;\n }\n val = val + '';\n if (val.indexOf(',') > 0) val = val.replace(/,/g, ',');\n\n if (val.indexOf(',') > 0) if (sOp !== 'in' && sOp !== 'not in') sOp = 'in';\n const ds = toLine(x);\n const condition: FilterCondition = {\n id: '',\n ds: '',\n va: '',\n co: '',\n op: 'like',\n ac: 'null',\n ki: 'text',\n };\n let type = 'text';\n if (type !== 'dic' && (x.indexOf('id') >= 0 || x.indexOf('Id') >= 0)) type = 'number';\n\n condition['id'] = x;\n condition['ds'] = ds;\n condition['va'] = val.trim();\n condition['co'] = co;\n condition['op'] = sOp || 'like';\n condition['ac'] = 'null';\n condition['ki'] = type;\n filterConditions[x] = condition;\n }\n });\n // 拼接 pageinfo条件\n if (tabNode) {\n const pi: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n pi['recordsperpage'] = (tabNode.$.props?.['pageSize'] as number) ?? 10;\n filterConditions['pageinfo'] = appendPageInfo(pi);\n }\n return filterConditions;\n};\n\n/**\n * @todo: form search combined filter conditions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:31:41\n * @param {FormItem} formList\n * @param {Recordable} filter\n * @param {VNode} tabNode\n */\nexport const searchCombined = (formList: FormItem[], filter: Recordable<any>, tabNode: TableInstance): Recordable<FilterCondition | PageInfo> => {\n const filterConditions: Recordable<FilterCondition | PageInfo> = {};\n // console.log(formList);\n for (const item of formList) {\n const type = item.type;\n if (type !== 'blank') {\n const condition: FilterCondition = {\n id: '',\n ds: '',\n va: '',\n co: '',\n op: 'like',\n ac: 'null',\n ki: 'text',\n };\n const { action, field, op = 'like', upper = false, showLabel, dateType } = item;\n if (action === 'ignore') continue;\n let val = filter[field];\n let co = 'null';\n if (isEmpty(val)) continue;\n // 对于日期范围选择\n if (Array.isArray(val)) if (isEmpty(val[0])) continue;\n // if (type !== 'dic' && (field.indexOf('id') >= 0 || field.indexOf('Id') >= 0))\n // type = 'number';\n // console.log(val);\n let sOp = op;\n if (type === 'dic') {\n if (Array.isArray(val)) {\n // fixme: 增加多选字典 2022-08-01\n let coo = '';\n let labels = '';\n (val as any[]).forEach((x) => {\n if (coo) {\n coo += ',' + x.value;\n labels += ',' + x.label;\n } else {\n coo = x.value;\n labels = x.label;\n }\n });\n co = coo;\n val = labels;\n } else if (showLabel) {\n // 单选字典\n co = val + '';\n val = showLabel;\n } else {\n const v = val as Recordable<any>;\n co = v.value;\n val = v.label;\n }\n\n sOp = '=';\n } else if (type === 'date' || type === 'datetime' || type === 'time') {\n if (op === 'like') sOp = '=';\n if (dateType === 'daterange' || dateType === 'datetimerange' || dateType === 'timerange' || dateType === 'monthrange') val = (val as any[]).join(',');\n } else if (type === 'number') sOp = '=';\n\n let sType = type;\n if (dateType === 'monthrange') sType = 'month';\n\n val = val + '';\n if (!action && val.indexOf(',') > 0) val = val.replace(/,/g, ',');\n\n if (val.indexOf(',') > 0) if (sOp !== 'in' && sOp !== 'not in') sOp = 'in';\n\n sOp = sOp.replace(/</gi, '<');\n sOp = sOp.replace(/>/gi, '>');\n let ds = toLine(field);\n // 多表关联判断是否带表别名 2022-06-23\n if (ds.indexOf('@') > 0) ds = ds.replace('@', '.');\n\n if (upper === true) {\n if (co && co !== 'null') co = co.toUpperCase();\n val = val.toUpperCase();\n // 将ds转为upper函数\n ds = 'upper(' + ds + ')';\n }\n\n condition['id'] = field;\n condition['ds'] = ds;\n condition['va'] = val.trim();\n condition['co'] = co;\n condition['op'] = sOp || 'like';\n condition['ac'] = action || 'null';\n condition['ki'] = sType || 'text';\n filterConditions[field] = condition;\n }\n }\n // 拼接 pageinfo条件\n if (tabNode) {\n const pi: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n pi['recordsperpage'] = (tabNode.$.props?.['pageSize'] as number) ?? 10;\n filterConditions['pageinfo'] = appendPageInfo(pi);\n }\n return filterConditions;\n};\n\n/**\n * @todo: save combined filter conditions\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:43:03\n * @param {FormItem} formList\n * @param {Recordable} filter\n */\nexport const saveCombined = (formList: FormItem[], filter: Recordable<any>): Recordable<any> => {\n const filterConditions = {};\n\n try {\n for (const item of formList) {\n const type = item.type;\n if (type !== 'blank') {\n const { action, field, showLabel } = item;\n if (action === 'ignore') continue;\n let val = filter[field];\n let co = 'null';\n if (val === undefined || val === null) continue;\n if (type === 'dic')\n if (showLabel)\n if (Array.isArray(val)) {\n // 多选字典\n let coo = '';\n const labels = '';\n val.forEach((x) => {\n let v: string;\n if (typeof x === 'object') v = x.value;\n else v = x + '';\n if (coo) coo += ',' + v;\n else coo = v;\n });\n co = coo;\n val = labels;\n } else if (typeof val === 'object') {\n co = val.value;\n val = val.label;\n } else {\n co = val + '';\n val = showLabel;\n }\n else if (Array.isArray(val)) {\n // 多选字典\n let coo = '';\n let labels = '';\n val.forEach((x) => {\n if (coo) {\n coo += ',' + x.value;\n labels += ',' + x.label;\n } else {\n coo = x.value;\n labels = x.label;\n }\n });\n co = coo;\n val = labels;\n } else if (typeof val === 'object') {\n co = val.value;\n val = val.label;\n } else\n // if (typeof val !== 'object' && item.dicType.indexOf('t#') >= 0) {\n // Notify.message('[' + field + ']: 字典值设置不正确', 'error');\n // throw new Error('[' + field + ']: 字典值设置不正确');\n // }\n co = val;\n else {\n val = val + ''; // fixme: 对于id等数字,转换为字符类型,防止indexOf出错\n co = val + '';\n }\n if (co === null || co === undefined) {\n message('[' + field + ']: dict value is null', 'error');\n throw new Error('[' + field + ']: dict value is null');\n }\n if (!action && co.indexOf(',') > 0) co = co.replace(/,/g, ',');\n const ds = toHump(field);\n\n filterConditions[ds] = co;\n }\n }\n } catch (error) {\n console.log(error);\n throw new Error('combined data error:' + error);\n }\n return filterConditions;\n};\n","/*\n * @title: crud methods utils\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-25 15:07:35\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-09 17:43:39\n * @version: 1.0.8\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\nimport type { PageInfo } from '@@/GvTable/src/types/index';\nimport { useStorage } from '@@/hooks/web/useStorage';\nimport type { FormInstance, TableInstance } from 'element-plus';\nimport type { ComponentInternalInstance, VNode } from 'vue';\nimport { message } from './gv.notify';\nimport { appendPageInfo, combined, saveCombined, searchCombined } from './gv.table';\nimport { getVNodeName, isEmpty } from './index';\n/**\n * @todo: common fetch data\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 10:55:17\n * @param {function} fetch\n * @param {any} data\n */\nconst fetchData = async (fetch: AsyncFn, data: any): Promise<any> => {\n let result = {};\n await fetch(data).then((res) => {\n result = res.datas;\n });\n\n return result;\n};\n\n/**\n * @todo: common submit fetch data\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:39:01\n */\nconst submit = async (fetch: AsyncFn, data: any, hasMsg = true, msg?: string): Promise<any> => {\n let result = {};\n let msgs: string;\n if (msg) msgs = msg;\n else {\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (lang === 'zh-CN') msgs = '操作成功';\n else msgs = 'Operate Ok';\n }\n await fetch(data).then((res) => {\n result = res.datas;\n if (hasMsg) message(msgs, 'success');\n });\n\n return result;\n};\n/**\n * @todo: common fetch table data(with pagination)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:40:36\n */\nconst fetchTable = async (tabNode: TableInstance, fetch: AsyncFn, data: any) => {\n if (tabNode === undefined || tabNode === null) {\n message('table object is null', 'error');\n return false;\n }\n let result = {};\n const tabInnerNode = tabNode.$;\n const exposed = tabInnerNode.exposed as any;\n\n const filterConditions = combined(tabNode, data);\n if (tabNode) {\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n }\n exposed.startLoading();\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n exposed.stopLoading();\n return result;\n};\n\n/**\n * @todo: validate form\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:42:22\n */\nconst checkForms = async (fmNodes: FormInstance[]) => {\n if (fmNodes === undefined || fmNodes === null) {\n message('form object is null', 'error');\n return false;\n }\n let result = true;\n for (const fmNode of fmNodes) {\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n await fmNode2.component.exposed\n .validate()\n .then(() => {\n // todo\n })\n .catch(() => {\n // throw new Error(e);\n result = false;\n Promise.reject('The form failed validation');\n });\n }\n }\n\n return result;\n};\n\n/**\n * @todo: save form\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:45:03\n */\nconst save = async (fmNode: FormInstance, fetch: AsyncFn, check = true, msg?: string) => {\n if (fmNode === undefined || fmNode === null) {\n message('form object is null', 'error');\n return false;\n }\n let result: Recordable<any> | null = {};\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n const formList = fmInnerNode.props.formList as FormItem[];\n let msgs: string;\n if (msg) msgs = msg;\n else {\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (lang === 'zh-CN') msgs = '保存成功';\n else msgs = 'Save OK.';\n }\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const props = fmNode2.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode2);\n // console.log(formList);\n let conditions = {};\n try {\n conditions = saveCombined(formList, filter);\n await fetch(conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n return null;\n }\n } else\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const props = fmNode2.props;\n const filter = props.model;\n // console.log(filter);\n // console.log(fmNode2);\n // console.log(formList);\n let conditions = {};\n try {\n conditions = saveCombined(formList, filter);\n await fetch(conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n } catch {\n message('form save failed', 'error');\n result = null;\n return;\n }\n })\n .catch(() => {\n // throw new Error(e);\n Promise.reject('The form failed validation');\n result = null;\n });\n }\n\n return result;\n};\n\n/**\n * @todo: update form\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 15:49:05\n */\nconst update = async (fmNode: FormInstance, id: number, fetch: Async2Fn, check = true, msg?: string) => {\n if (fmNode === undefined || fmNode === null) {\n message('form object is null', 'error');\n return false;\n }\n if (isEmpty(id)) {\n message('pk is null', 'error');\n return false;\n }\n let result: Recordable<any> | null = {};\n const fmInnerNode = fmNode.$;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n const formList = fmInnerNode.props.formList as FormItem[];\n let msgs: string;\n if (msg) msgs = msg;\n else {\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang');\n if (lang === 'zh-CN') msgs = '保存成功';\n else msgs = 'Save Ok.';\n }\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n if (fmNode2?.type?.name === 'ElForm')\n if (check === false) {\n // 有数据的输入框拼接条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(fmNode2);\n const conditions = saveCombined(formList, filter);\n // console.log(conditions);\n\n await fetch(id, conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n } else\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 有数据的输入框拼接条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(fmNode2);\n const conditions = saveCombined(formList, filter);\n // console.log(conditions);\n await fetch(id, conditions)\n .then((res) => {\n result = res.datas;\n message(msgs, 'success');\n })\n .catch((error) => {\n message(error, 'error');\n result = null;\n console.log(error);\n });\n })\n .catch(() => {\n result = null;\n });\n }\n\n return result;\n};\n\n/**\n * @todo: search for list with form and table\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:11:42\n */\nconst search = async (fmNode: FormInstance, tabNode: TableInstance, fetch: AsyncFn) => {\n if (fmNode === undefined || fmNode === null) {\n message('form object is null', 'error');\n return false;\n }\n if (tabNode === undefined || tabNode === null) {\n message('table object is null', 'error');\n return false;\n }\n let result = {};\n const fmInnerNode = fmNode.$;\n const tabInnerNode = tabNode.$;\n const exposed = tabInnerNode.exposed as any;\n const rawFmChildren = fmInnerNode.subTree?.children;\n const fmChildList: any[] = Array.isArray(rawFmChildren) ? rawFmChildren : [];\n const formList = fmInnerNode.props.formList as FormItem[];\n for (const element of fmChildList)\n if (element?.type?.displayName === 'Transition') {\n const fmNode2 = element.component.subTree.component.subTree.children[0];\n // 解析检索条件\n await fmNode2.component.exposed\n .validate()\n .then(async () => {\n // 拼接查询条件\n const filter = fmNode2.props.model;\n // console.log(filter);\n // console.log(formList);\n const filterConditions = searchCombined(formList, filter, tabNode);\n // console.log(filterConditions);\n // update: 保存查询条件、方法至table对象,为分页组件使用 2022-04-18\n\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n exposed.startLoading();\n\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n // fixme: 清空列表search框内容 2022-04-21\n const tabChildList = (tabNode as any).subTree?.children || [];\n const searchInputNode = tabChildList.filter((x: VNode) => {\n if (getVNodeName(x) === 'gv-input') return true;\n });\n if (searchInputNode[0]) searchInputNode[0].inputValue = '';\n // fixme: 清空列表表头筛选框 2022-12-14\n const tableEl = tabNode.$el as HTMLElement;\n const tableHeader = tableEl.querySelector('.gv-table .el-table__header-wrapper .el-table__header');\n const tableFixedHeader = tableEl.querySelector('.gv-table .el-table__fixed-header-wrapper .el-table__header');\n const columns = tableHeader?.querySelectorAll('.el-table__cell');\n const len = columns?.length || 0;\n for (let i = 0; i < len; i++) {\n const h = columns?.[i]?.querySelector('.render__header');\n if (h) if (h.children[0]) h.children[0].classList.remove('is-selected');\n }\n if (tableFixedHeader) {\n const columnsFixed = tableFixedHeader.querySelectorAll('.el-table__cell');\n const lenFixed = columnsFixed.length;\n for (let i = 0; i < lenFixed; i++) {\n const h = columnsFixed[i].querySelector('.render__header');\n if (h) if (h.children[0]) h.children[0].classList.remove('is-selected');\n }\n }\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n exposed.stopLoading();\n })\n .catch(() => {\n exposed.stopLoading();\n });\n }\n\n return result;\n};\n\n/**\n * @todo: search for list without form but with table\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:22:00\n * @param {*} tabNode\n * @param {*} fetch\n * @param {*} data\n */\nconst searchNoFm = async (tabNode: any, fetch: AsyncFn, data: any) => {\n if (tabNode === undefined || tabNode === null) {\n message('table object is null', 'error');\n return false;\n }\n const tabInnerNode = tabNode.$;\n const exposed = tabInnerNode.exposed as any;\n let result = {};\n const filterConditions = combined(tabNode, data);\n // console.log(JSON.stringify(filterConditions));\n // update: 保存查询条件、方法至table对象,为分页组件使用 2022-04-18\n\n exposed.filterConditions = filterConditions;\n exposed.fetch = fetch;\n exposed.startLoading();\n\n exposed.startLoading();\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n // fixme: 清空列表search框内容 2022-04-21\n const tabChildList = (tabNode as any).subTree?.children || [];\n const searchInputNode = tabChildList.filter((x: VNode) => {\n if (getVNodeName(x) === 'gv-input') return true;\n });\n if (searchInputNode[0]) searchInputNode[0].inputValue = '';\n })\n .catch((error) => {\n message(error, 'error');\n console.log(error);\n });\n exposed.stopLoading();\n\n return result;\n};\n\n/**\n * @todo: jump to new page search\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:23:46\n * @param {*} tabNode\n * @param {*} filterConditions\n * @param {*} fetch\n * @param {*} pageInfo\n */\nconst toNewPageSearch = async (tabNode: ComponentInternalInstance | null, filterConditions: Recordable<any>, fetch: AsyncFn, pageInfo: PageInfo) => {\n if (filterConditions === undefined || filterConditions === null) {\n console.log('分页查询失败: 过滤条件为空', 'error');\n return false;\n }\n if (fetch === undefined || fetch === null) {\n message('Paging query failed: Request method is empty', 'error');\n return false;\n }\n let result: Recordable<any> = [];\n const exposed = tabNode?.exposed;\n exposed?.startLoading();\n\n const sfc = filterConditions || {};\n if (sfc['pageinfo'] === undefined) sfc['pageinfo'] = appendPageInfo() as PageInfo;\n // 更新pageinfo\n sfc['pageinfo'].currentpagenum = pageInfo.currentpagenum;\n sfc['pageinfo'].recordsperpage = pageInfo.recordsperpage;\n await fetch(filterConditions)\n .then((res) => {\n result = res.datas;\n })\n .catch((error) => {\n console.log(error);\n });\n\n exposed?.stopLoading();\n\n return result;\n};\n\n/**\n * @todo: 转换单个结果集对象\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 10:11:53\n * @param {*} result\n */\nconst trans = (result) => result;\n\n/**\n * @todo: table insert row\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:27:57\n * @param {*} searchData\n * @param {*} result\n */\nconst insertResult = (searchData: Recordable<any>, result: any) => {\n if (searchData === null || searchData === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (!Array.isArray(searchData.records)) {\n message('form object is null', 'error');\n return;\n }\n if (result === null || result === undefined) return false;\n\n if (Array.isArray(result)) searchData.records.splice(0, 0, ...result);\n else searchData.records.splice(0, 0, trans(result));\n\n return true;\n};\n\n/**\n * @todo: table update row\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:28:33\n * @param {*} searchData\n * @param {*} result\n * @param {*} rownums\n */\nconst updateResult = (searchData: any, result: any, rownums: number) => {\n if (searchData === null || searchData === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (!Array.isArray(searchData.records)) {\n message('form object is null', 'error');\n return false;\n }\n if (result === null || result === undefined) return false;\n if (Array.isArray(result)) searchData.records.splice(0, 0, ...result);\n else {\n const currentRowArr = searchData.records.filter((x: any) => {\n if (x.rownums === rownums) return true;\n });\n const currentRow = currentRowArr[0];\n Object.keys(result).forEach((x) => {\n if (x !== 'rownums') currentRow[x] = result[x];\n });\n }\n return true;\n};\n\n/**\n * @todo: table remove row\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:29:10\n * @param {*} searchData\n * @param {*} index\n */\nconst removeResult = (searchData: any, index: number) => {\n if (searchData === null || searchData === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (!Array.isArray(searchData.records)) {\n message('form object is null', 'error');\n return false;\n }\n searchData.records.splice(index, 1);\n // 设置总条数 - 1\n if (searchData.total) searchData.total = searchData.total - 1;\n\n return true;\n};\n\n/**\n * @todo: 从后端字典对象 { c, v, e, l1, l2 } 取当前语言展示文本\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-03 18:21:13\n * @param {Recordable} dictObj\n * @param {string} lang\n */\nconst getDictDisplayLabel = (dictObj: Recordable<any>, lang?: string | null): string => {\n if (!dictObj || typeof dictObj !== 'object') return '';\n const locale = lang || 'zh-CN';\n switch (locale) {\n case 'en':\n return dictObj.e ?? dictObj.e ?? dictObj.v ?? '';\n case 'l1':\n return dictObj.l1 ?? dictObj.l1 ?? dictObj.v ?? '';\n case 'l2':\n return dictObj.l2 ?? dictObj.l2 ?? dictObj.v ?? '';\n case 'zh-CN':\n default:\n return dictObj.v ?? dictObj.c ?? '';\n }\n};\n\n/**\n * @todo: reset form edit\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:36:39\n * @param {FormItem[]} formList\n */\nconst resetEditValue = (formList: FormItem[]) => {\n if (formList === null || formList === undefined) {\n message('form object is null', 'error');\n return false;\n }\n formList.forEach((x) => {\n if (x.type !== 'blank' && x.keep !== true)\n switch (x.type) {\n case 'text':\n case 'textarea':\n case 'number':\n x.value = '';\n break;\n case 'date':\n x.value = '';\n break;\n case 'dic':\n x.value = '';\n x.showLabel = '';\n break;\n }\n });\n};\n\n/**\n * @todo: table set form value\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-13 18:30:16\n * @param {*} formList\n * @param {*} rowData\n */\nconst setEditValue = (formList: FormItem[], rowData: Recordable<any>) => {\n // console.log(rowData);\n if (formList === null || formList === undefined) {\n message('form object is null', 'error');\n return false;\n }\n if (rowData === null || rowData === undefined) {\n message('Set data is null', 'error');\n return false;\n }\n resetEditValue(formList);\n const { getStorage } = useStorage('localStorage');\n const lang = getStorage('lang') || 'zh-CN';\n if (Object.keys(rowData).length !== 0)\n formList.forEach((x) => {\n const fieldValue = rowData[x.field];\n if (fieldValue !== undefined)\n if (x.type !== 'blank' && x.keep !== true)\n // const dicType = x.dicType;\n switch (x.type) {\n case 'text':\n case 'textarea':\n case 'number':\n if (fieldValue !== null && typeof fieldValue === 'object') x.value = fieldValue.c;\n else x.value = fieldValue;\n break;\n case 'date':\n if (x.dateType === 'daterange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'datetime':\n if (x.dateType === 'datetimerange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'time':\n if (x.dateType === 'timerange') x.value = fieldValue ? fieldValue.split(',') : null;\n else x.value = fieldValue;\n break;\n case 'layer':\n if (Array.isArray(fieldValue)) x.value = fieldValue;\n else if (fieldValue) {\n const arr = fieldValue.split(',');\n // const arr = [1, '2', 'a'];\n const arr2 = arr.map((x) => {\n if (!isNaN(parseInt(x))) return x * 1;\n else return x;\n });\n x.value = arr2;\n // console.log(x.value);\n } else x.value = [];\n\n break;\n case 'dic':\n // console.log(rowData[x.field]);\n // if (dicType && dicType.indexOf('t#') !== -1)\n // x.value = rowData[x.field];\n // else {\n // fixme: 增加枚举字典类型赋值 2022-11-07\n if (x.dicType && x.dicType.indexOf('e#') >= 0) {\n if (typeof x.value !== 'object') {\n const enums = x.dicType.split('#');\n const items = enums[1].split(':');\n\n for (let i = 0; i < items.length; i++) {\n const itemChild = items[i].split('=');\n if (itemChild[0] === fieldValue + '') {\n x.value = fieldValue;\n x.showLabel = itemChild[1];\n break;\n }\n }\n }\n } else if (x.multiple)\n if (fieldValue !== null) {\n // 多选字典\n if (typeof fieldValue === 'object') {\n const dictObj = fieldValue;\n const c = dictObj.c;\n const v = getDictDisplayLabel(dictObj, lang);\n\n if (c) {\n const codes = c.split(',');\n const labels = v ? v.split(',') : [];\n x.value = codes.map((code: string, i: number) => ({\n value: code,\n label: labels[i] ?? code,\n }));\n x.showLabel = labels;\n } else {\n x.value = [];\n x.showLabel = [];\n }\n } else if (typeof fieldValue === 'string') {\n const c = fieldValue;\n if (c) {\n const op = [];\n c.split(',').forEach((x) => {\n const o: Recordable<any> = {};\n o.value = x;\n (op as Recordable<any>[]).push(o);\n });\n x.value = op;\n } else x.value = [];\n }\n } else x.value = fieldValue;\n else if (fieldValue !== null && typeof fieldValue === 'object') {\n const dictObj = fieldValue;\n const code = String(dictObj.c ?? '').trim();\n const label = getDictDisplayLabel(dictObj, lang).trim();\n if (!code && !label) {\n x.value = '';\n x.showLabel = '';\n } else {\n x.value = { value: code, label: label || code };\n x.showLabel = label || code;\n }\n } else x.value = fieldValue;\n\n break;\n default:\n x.value = fieldValue;\n break;\n }\n });\n // formList = newList;\n};\n\nconst crud = {\n fetchData,\n submit,\n fetchTable,\n save,\n update,\n search,\n searchNoFm,\n toNewPageSearch,\n insertResult,\n updateResult,\n removeResult,\n setEditValue,\n resetEditValue,\n checkForms,\n};\n\nexport { crud };\n","<!--\n * @title: table component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:32:30\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 18:08:00\n * @version: 1.0.9\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStorage } from '@/hook/web/useStorage';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { useBridgeI18n } from '@@/bridge';\n import { GvButton } from '@@/GvButton';\n import { GvDatePicker } from '@@/GvDatePicker';\n import { GvIcon } from '@@/GvIcon';\n import { GvInput } from '@@/GvInput';\n import { GvPopconfirm } from '@@/GvPopconfirm';\n import type { TPopoverPlacement } from '@@/GvPopover/src/types';\n import { GvTableBar } from '@@/GvTableBar';\n import GvTag from '@@/GvTag/src/GvTag.vue';\n import { debounce, hasClass, hasScrollbar, isEqual, toLine } from '@@/utils';\n import { crud } from '@@/utils/gv.crud';\n import { message } from '@@/utils/gv.notify';\n import { Operation, Refresh } from '@element-plus/icons-vue';\n import {\n ElButton,\n ElButtonGroup,\n ElCheckbox,\n ElDivider,\n ElPagination,\n ElPopover,\n ElRadio,\n ElRadioGroup,\n ElTable,\n ElTableColumn,\n ElTooltip,\n ElTree,\n useGlobalConfig,\n type ComponentSize,\n type TableColumnCtx,\n type TableInstance,\n } from 'element-plus';\n import { computed, defineComponent, getCurrentInstance, nextTick, onMounted, ref, unref, watch, type PropType, type VNode } from 'vue';\n import type { FilterCondition, PageInfo } from './types';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('table');\n /** 表头筛选 Popover:覆盖 EP 默认 150px,按内容自适应宽度 */\n const tableHeadFilterPopoverPopperStyle = {\n width: 'max-content',\n minWidth: '180px',\n maxWidth: 'min(420px, 90vw)',\n };\n export default defineComponent({\n name: 'GvTable',\n props: {\n refTable: {\n type: String,\n required: false,\n default: undefined,\n },\n tableHead: {\n type: Array as PropType<TableHeadItem[]>,\n required: true,\n default: () => [],\n },\n tableData: {\n type: Object as PropType<Recordable<any>>,\n required: false,\n default: () => {},\n },\n height: {\n type: [Number, String],\n required: false,\n default: undefined,\n },\n maxHeight: {\n type: [Number, String, undefined] as PropType<number | string | undefined>,\n required: false,\n default: undefined,\n },\n maxWidth: {\n type: [Number, String],\n required: false,\n default: undefined,\n },\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n pageSize: {\n type: Number,\n required: false,\n default: 10,\n },\n rowClassName: {\n type: Function,\n required: false,\n default: () => {},\n },\n rowStyle: {\n type: Function,\n required: false,\n default: () => {},\n },\n spanMethod: {\n type: Function,\n required: false,\n default: () => {},\n },\n cellStyle: {\n type: Function,\n required: false,\n default: () => {},\n },\n // tableImport: {\n // type: Boolean,\n // required: false,\n // default: false\n // },\n // tableExport: {\n // type: Boolean,\n // required: false,\n // default: false\n // },\n tableType: {\n type: String,\n required: false,\n default: undefined,\n },\n tableSort: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n tableKit: {\n type: Boolean,\n required: false,\n default: undefined,\n },\n tableBar: {\n type: Boolean,\n required: false,\n default: true,\n },\n border: {\n type: Boolean,\n required: false,\n default: true,\n },\n tableFetch: {\n type: Function,\n required: false,\n default: () => {},\n },\n multi: {\n // 是否多选\n type: Boolean,\n required: false,\n default: false,\n },\n layout: {\n type: String,\n required: false,\n default: 'total, sizes, prev, pager, next, jumper',\n },\n isShowPage: {\n type: Boolean,\n required: false,\n default: true,\n },\n total: {\n type: Boolean,\n required: false,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n required: false,\n default: 'default',\n },\n tableInit: {\n type: Boolean,\n required: false,\n default: false,\n },\n beforeImport: {\n type: Function,\n required: false,\n default: undefined,\n },\n tableFilter: {\n type: Object,\n required: false,\n default: undefined,\n },\n tableCb: {\n type: Function,\n required: false,\n default: undefined,\n },\n expandRowKeys: {\n type: Array,\n required: false,\n default: undefined,\n },\n limitHeight: {\n type: Boolean,\n required: false,\n default: true,\n },\n tableAction: {\n type: String,\n required: false,\n default: 'left',\n },\n tableActionIcon: {\n type: Boolean,\n required: false,\n default: true,\n },\n },\n emits: ['row-dblclick'],\n // emit\n setup(props, { slots, expose, emit, attrs }) {\n // @data\n const appStore = useAppStore();\n const userStore = useUserStore();\n const { getStorage } = useStorage('localStorage');\n const instance = getCurrentInstance();\n let lang = 'zh-CN';\n const sTableAction = appStore.tableAction || props.tableAction;\n const sTableActionIcon = appStore.tableActionIcon;\n const sTableConfirm = appStore.buttonConfirm;\n const detailPlacement: TPopoverPlacement = sTableAction === 'left' ? 'right-start' : 'left-start';\n let sTableType = props.tableType;\n let originTableHead: TableHeadItem[] = props.tableHead;\n let tableHeads: TableHeadItem[] = [];\n const vref = 'gv-table-' + props.refTable;\n const { t } = useBridgeI18n();\n const globalSize = useGlobalConfig('size');\n\n const sHeight = props.height;\n const sMaxHeight = ref(props.maxHeight);\n const sMaxWidth = ref(props.maxWidth || '100%');\n const loading = ref(false);\n let isEditTable = false; // 是否是编辑列表\n const pageInfo = ref<PageInfo>({\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n });\n const filterConditions: FilterCondition[] = [];\n let sPageSize = props.pageSize;\n\n const resultData = ref(props.tableData);\n const recordsList = ref(props.tableData?.records || []);\n const pageSizes = [10, 20, 50, 100, 200, 500];\n let filterHeads: string[] = []; // 表头Q过滤列缓存\n const popoverVisible = ref({}); // popover筛选使用\n const exportBtnDisabled = ref(true); // 导出按钮disabled\n const exportBtnLoading = ref(false); // 导出按钮loading\n const importBtnLoading = ref(false); // 导入按钮loading\n const tableSortMode = ref(1); // 列表默认排序方式\n const exportDialogShow = ref(false); // 导出列弹出框\n const importDialogShow = ref(false); // 导入弹出框\n const sTableBar = ref(props.tableBar); // 是否显示tablebar\n const gTableBar = appStore.tableBar;\n const tableSearchShow = ref(false); // 是否带有table search框\n const sTableSort = ref(props.tableSort); // 是否显示排序模式框\n const sTableKit = ref(props.tableKit); // 是否显示工具按钮\n const showPopoverDetail = null;\n const pageLayout = ref(props.layout);\n let actionWidth: number = 0; // 操作列宽度\n let transHash: Recordable<string> | null = null; // 列表列缓存\n const headColumn = ref<VNode[]>([]); // 列表列\n const headColumnInit = ref<VNode[]>([]);\n\n const columnSums: string[] = []; // 合计列\n const columnSumsDecimal: number[] = []; // 合计列位数\n const isIndeterminate = ref([]); // 表头筛选全选\n\n let isAnchor = false; // 是否锚点中列表\n let isScrollbar = false; // 是否dialog中有滚动条\n let isEditContainer = false; // 是否是editContainer标签内\n const columnTreeList = ref([]); // 列表显示、排序数组\n const columnCheckedKeys = ref<string[]>([]); // 列表显示、排序选中数组\n const storageKey = props.refTable + '-' + userStore.loginAccount; // localStorage存储列表字段key\n let lsTableHeads = '';\n let debounceSearch;\n const tableRefs = ref<Record<string, TableInstance | null>>({}); // 表单实例引用,默认空对象\n const tableRef = ref<TableInstance | null>(null); // ElForm 元素引用\n\n // @computed\n const tableSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n /**\n * @todo: pageinfo\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 11:15:00\n */\n const getPageInfo = computed((): PageInfo => {\n const pi: PageInfo = {\n currentpagenum: 1,\n recordsperpage: 10,\n countrows: 0,\n totalpage: 0,\n };\n if (resultData.value && resultData.value.records !== undefined) {\n pi['currentpagenum'] = resultData.value.current;\n pi['totalpage'] = resultData.value.pages;\n // if (this.sPageSize)\n // pi['size'] = this.sPageSize;\n // else\n pi['recordsperpage'] = resultData.value.size;\n pi['countrows'] = resultData.value.total;\n }\n return pi;\n });\n\n // @method\n\n const setTableRef = (el: TableInstance | null) => {\n tableRef.value = el;\n if (el && props.refTable) tableRefs.value[vref] = el;\n };\n\n const difference = (newVal, oldVal) => {\n let diff = false;\n for (const key in newVal)\n if (!isEqual(newVal[key], oldVal[key])) {\n diff = true;\n break;\n }\n\n return diff;\n };\n\n /**\n * @todo: close all filter popover\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 13:17:27\n * @param {*} property\n */\n const closeAllPopover = (property?: string) => {\n const next = { ...popoverVisible.value };\n Object.keys(next).forEach((key) => {\n if (key !== property) next[key] = false;\n });\n popoverVisible.value = next;\n };\n\n const ensurePopoverKey = (propKey: string) => {\n if (popoverVisible.value[propKey] === undefined) popoverVisible.value = { ...popoverVisible.value, [propKey]: false };\n };\n\n const handlePopoverWrapper = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n /** 阻止表头/表格事件冒泡,避免点击筛选面板内输入框时关闭 Popover */\n const wrapPopoverFilterBody = (body: VNode) => (\n <div\n class=\"table-popover__content\"\n onMousedown={(e: MouseEvent) => e.stopPropagation()}\n onClick={(e: MouseEvent) => e.stopPropagation()}>\n {body}\n </div>\n );\n const getScrollLeft = () => {\n closeAllPopover();\n };\n\n const startLoading = () => {\n loading.value = true;\n };\n const stopLoading = () => {\n loading.value = false;\n };\n\n /**\n * @todo: calculate max height\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-25 16:16:19\n * @param {*} rootEl\n */\n const getMaxHeight = (rootEl: HTMLElement | undefined) => {\n if (props.limitHeight)\n if (!isEditContainer)\n if (!isScrollbar)\n if (!isAnchor) {\n if (props.tableType !== 'detail')\n if (props.tableType === 'import') sMaxHeight.value = undefined;\n else if (props.maxHeight)\n // if (this.sTableType === 'expand')\n // this.sMaxHeight = undefined;\n // else\n sMaxHeight.value = props.maxHeight;\n else {\n // tab table\n // const tabPane = this.$el.closest('.el-tabs');\n const tabPane = rootEl?.closest('.el-tab-pane');\n // alert(tabPane.clientHeight);\n if (tabPane) {\n // const offsetTop = tabPane.classList.contains('el-tabs--left') ? 235 : 295;\n if (props.isShowPage) sMaxHeight.value = tabPane.clientHeight - 135;\n else sMaxHeight.value = tabPane.clientHeight - 85;\n // sMaxHeight = document.documentElement.clientHeight - tabPane.offsetTop - offsetTop;\n const dialog = rootEl?.closest('.gv-dialog');\n if (!dialog) {\n const drawer = rootEl?.closest('.gv-drawer');\n if (drawer)\n // sMaxHeight = sMaxHeight + 30;\n sMaxHeight.value = undefined;\n } else sMaxHeight.value = undefined; // sMaxHeight = sMaxHeight + 30;\n } else {\n // common table\n const dialog = rootEl?.closest('.gv-dialog');\n if (!dialog) {\n const drawer = rootEl?.closest('.gv-drawer');\n // console.log(document.documentElement.clientHeight);\n // console.log(rootEl?.offsetTop);\n if (!drawer) sMaxHeight.value = document.documentElement.clientHeight - (rootEl?.offsetTop ?? 0) - 150;\n // console.log(sMaxHeight);\n } // dialog\n else sMaxHeight.value = document.documentElement.clientHeight - (rootEl?.offsetTop ?? 0) - 265;\n }\n }\n } else sMaxHeight.value = undefined;\n else sMaxHeight.value = undefined;\n if (sMaxHeight.value && Number(sMaxHeight.value) < 150) sMaxHeight.value = undefined;\n };\n\n /**\n * @todo: trans records\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 11:33:48\n * @param {*} loadAction\n */\n const transRecords = (loadAction?: string) => {\n if (recordsList.value && recordsList.value.length > 0 && recordsList.value[0]['transHash']) {\n transHash = recordsList.value[0]['transHash'];\n recordsList.value.splice(0, 1);\n }\n // add: 增加查询回调方法 2022-11-23\n if (loadAction !== 'create' && props.tableCb) props.tableCb(recordsList.value, resultData.value);\n };\n\n /**\n * @todo: handle import btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 09:43:56\n */\n const handleImport = () => {\n if (props.beforeImport)\n if (props.beforeImport(props.refTable, tableHeads, props.tableData)) {\n importDialogShow.value = true;\n // 设置loading\n importBtnLoading.value = true;\n } else importDialogShow.value = false;\n else {\n importDialogShow.value = true;\n // 设置loading\n importBtnLoading.value = true;\n }\n };\n\n const handleExport = () => {\n exportDialogShow.value = true;\n // 设置loading\n exportBtnLoading.value = true;\n };\n\n /**\n * @todo: import btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-14 09:41:45\n */\n const getImportBtn = computed(() => {\n if (slots.import?.()) {\n let buttonName = t('tableBar.import');\n if (slots.import?.()[0].props?.['import-name']) buttonName = slots.import?.()[0].props?.['import-name'];\n const ref = 'gv-import-' + props.refTable;\n return (\n <GvButton\n bizType=\"import\"\n ref={ref}\n onClick={handleImport}\n loading={importBtnLoading.value}>\n {buttonName}\n </GvButton>\n );\n } else return null;\n });\n\n /**\n * @todo: get export btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-25 16:22:42\n * @param {*} computed\n */\n const getExportBtn = computed(() => {\n if (slots.export?.()) {\n let buttonName = t('common.export');\n if (slots.export?.()[0].props?.['export-name']) buttonName = slots.export?.()[0].props?.['export-name'];\n const ref = 'gv-export-' + props.refTable;\n return (\n <GvButton\n bizType=\"export\"\n ref={ref}\n onClick={handleExport}\n loading={exportBtnLoading.value}\n disabled={exportBtnDisabled.value}>\n {buttonName}\n </GvButton>\n );\n } else return null;\n });\n\n /**\n * @todo: change page size\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-22 17:24:46\n */\n const runPageSearch = async () => {\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n const fetchFn: Fn = instance?.exposed?.fetch || props.tableFetch;\n if (!fetchFn) {\n message(t('table.execSearchWarn'));\n return;\n }\n const result = await crud.toNewPageSearch(instance, fC, fetchFn, pageInfo.value);\n if (result) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n };\n\n const handleSizeChange = async (val: number) => {\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n getMaxHeight(rootEl);\n pageInfo.value.recordsperpage = val;\n pageInfo.value.currentpagenum = 1;\n sPageSize = val;\n await runPageSearch();\n };\n\n const handleCurrentChange = async (val: number) => {\n pageInfo.value.currentpagenum = val;\n await runPageSearch();\n };\n\n /**\n * @todo: 查询输入框输入响应事件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-19 15:18:03\n * @param {*} val\n */\n const handleTableSearchInput = (val) => {\n debounceSearch(val);\n };\n\n /**\n * @todo: search table input event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-26 22:06:01\n * @param {*} val\n */\n const handleTableSearch = async (val: string) => {\n const fh = {};\n let strFh = '';\n filterHeads.forEach((x: string) => {\n // fixme: 转换@为. 2022-07-20\n let y = x;\n if (y.indexOf('@') > 0) y = y.replace('@', '.');\n if (strFh === '') strFh = toLine(y);\n else strFh += ',' + toLine(y);\n });\n const v = val + '';\n fh['fields'] = strFh;\n fh['val'] = v.trim();\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n fC['searchfilter'] = fh;\n\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n if (!fetch) {\n message(t('table.execSearchWarn'));\n return;\n }\n\n // 拼接 过滤条件\n pageInfo.value.currentpagenum = 1;\n const result = await crud.toNewPageSearch(instance, fC, fetch, pageInfo.value);\n if (result && result.records) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n };\n /**\n * @todo: 列表search框\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-30 17:24:09\n */\n const getTableSearch = () =>\n tableSearchShow.value === true ? (\n <div class=\"gv-table__search\">\n <GvInput\n id=\"gv-table-search\"\n placeholder={`${t('table.tableSearch')}(+)..`}\n prefixIcon=\"gv-icon-sousuo\"\n size=\"default\"\n class=\"gv-table__search-input\"\n onInput={handleTableSearchInput}></GvInput>\n </div>\n ) : null;\n\n /**\n * @todo: table head popover show\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-08 10:43:51\n */\n const handlePopoverShow = () => {\n nextTick(() => {\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n if (rootEl) {\n const popOvers = document.querySelectorAll('body>.table-popover');\n const tableBodyWidth = (rootEl.querySelector('.el-table__body-wrapper >.el-table__body') as HTMLElement)?.style.width;\n const clientWidth = document.body.clientWidth - 200 - 20;\n for (let i = 0; i < popOvers.length; i++)\n if ((popOvers[i] as HTMLElement).style.display !== 'none') {\n const bodyWrapper = rootEl.querySelector('.el-table__body-wrapper') as HTMLElement;\n if (bodyWrapper?.scrollLeft ?? 0)\n (popOvers[i] as HTMLElement).style.left = parseInt(tableBodyWidth) - clientWidth + parseInt((popOvers[i] as HTMLElement).style.left) - (bodyWrapper?.scrollLeft ?? 0) + 'px';\n else (popOvers[i] as HTMLElement).style.left = parseInt((popOvers[i] as HTMLElement).style.left) - (bodyWrapper?.scrollLeft ?? 0) + 'px';\n }\n }\n });\n };\n const handlePopoverHide = () => {\n // this.popoverVisible[prop] = false;\n };\n\n /**\n * @todo: 列选中状态切换\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:44:01\n * @param {*} columns\n * @param {*} checkedKeys\n */\n const createChangedColumns = (columns, checkedKeys) =>\n columns.map((column) => {\n const target = { ...column };\n if (target.type !== 'action' && target.type !== 'expand') target.hasHidden = !checkedKeys.includes(target.prop);\n return target;\n });\n\n /**\n * @todo: 列顺序和选中方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:43:09\n * @param {*} data\n * @param {*} checked\n * @param {*} childChecked\n */\n const handleColumnCheckChange = (data, checked, childChecked) => {\n const checkedKeys = this.$refs['gv-table-column-tree'].$children[0].getCheckedKeys();\n const hColumns = createChangedColumns(tableHeads, checkedKeys);\n // console.log(hColumns);\n headColumn.value = getTableColumn('recreate', hColumns);\n // 存储到 localStorage\n setStoreLocal(checkedKeys, checked, data);\n };\n\n /**\n * @todo: table refresh btn\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:45:55\n */\n const handleTableRefresh = async () => {\n // 判断search框中是否有值\n const el = instance?.vnode?.el as HTMLElement | undefined;\n if (el) {\n const inputSearch = el.querySelector('.gv-table__search-input .el-input__inner');\n if (inputSearch && inputSearch.value !== undefined && inputSearch.value !== null && inputSearch.value !== '') {\n inputSearch.value = '';\n handleTableSearch('');\n } else {\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n // 拼接 过滤条件\n pageInfo.value.currentpagenum = 1;\n const result = await crud.toNewPageSearch(instance, fC, fetch, pageInfo.value);\n if (result && result.records) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n }\n }\n };\n\n /**\n * @todo: tablebar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 11:21:41\n */\n const getTableBar = () => {\n const btns: any[] = [];\n const defaultSlots = slots.default?.();\n if (defaultSlots && defaultSlots.length > 0)\n defaultSlots.forEach((x: VNode) => {\n // add table btn bar\n if (typeof x.type === 'object' && x.type !== null && 'name' in x.type && x.type.name === 'GvButton') btns.push(x);\n });\n // export btn\n const exportSlots = slots.export?.();\n if (exportSlots && exportSlots.length > 0)\n exportSlots.forEach(() => {\n btns.push(getExportBtn.value);\n });\n\n // import btn\n const importSlots = slots.import?.();\n if (importSlots && importSlots.length > 0)\n importSlots.forEach(() => {\n btns.push(getImportBtn.value);\n });\n\n // console.log(btns);\n return btns;\n };\n\n /**\n * @todo: get kit bar\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:41:30\n */\n const getKitBar = () => {\n let isVisible = true;\n if (sTableKit.value !== undefined) isVisible = sTableKit.value;\n if (props.tableType === 'import' || props.tableType === 'detail' || props.tableType === 'expand' || props.tableType === 'export') isVisible = false;\n // 行编辑去掉隐藏列功能\n if (isEditTable === true) isVisible = false;\n return isVisible === true ? (\n <div class=\"gv-table__kitbar\">\n <ElButtonGroup>\n <ElButton\n style=\"width: 37px\"\n size={tableSize.value}\n icon={Refresh}\n onClick={handleTableRefresh}\n />\n <ElPopover\n placement=\"bottom-end\"\n width=\"150\"\n trigger=\"click\">\n {{\n reference: () => (\n <ElButton\n size={tableSize.value}\n style={{ width: '37px' }}\n icon={Operation}\n />\n ),\n default: () => (\n <ElTree\n ref=\"gv-table-column-tree\"\n node-key=\"columnProp\"\n tree-data={columnTreeList}\n check-on-click-node={true}\n default-checked-keys={columnCheckedKeys.value}\n show-checkbox\n draggable\n on-check-change={handleColumnCheckChange}\n style={{ maxHeight: '450px', overflow: 'hidden auto' }}\n class=\"gv-table-column-tree\"\n />\n ),\n }}\n </ElPopover>\n </ElButtonGroup>\n </div>\n ) : null;\n };\n\n /**\n * @todo: sort mode\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 11:17:36\n */\n const getSortModel = () => {\n let isVisible = true;\n if (sTableSort.value !== undefined) isVisible = sTableSort.value;\n else isVisible = props.tableType !== 'import';\n return isVisible === true ? (\n <div\n class=\"gv-table__sortmode\"\n style={{ marginRight: `${tableSearchShow.value === true ? '10px' : '0'}` }}>\n <i class=\"iconfont gv-icon-paixu2\" />\n <ElRadioGroup\n modelValue={tableSortMode.value}\n onUpdate:modelValue={(val: number) => {\n tableSortMode.value = val;\n }}\n ref=\"gv-table-sortmode\">\n <ElRadio value={1}>{t('common.currentPage')}</ElRadio>\n <ElRadio\n value={2}\n disabled={pageInfo.value?.totalpage === 1}>\n {t('common.all')}\n </ElRadio>\n </ElRadioGroup>\n </div>\n ) : null;\n };\n\n /**\n * @todo: column filter handler\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:27:41\n * @param {*} e\n * @param {*} propField\n * @param {*} type\n */\n const columnFilterHandler = async (e: MouseEvent, propField: string, type: string) => {\n const popoverHtml = e.target.closest('.table-popover');\n const inputHtml = popoverHtml.querySelector('.gv-input .el-input__inner');\n const checkList = popoverHtml.querySelectorAll('.el-checkbox');\n const dateHtmlArr = popoverHtml.querySelectorAll('.gv-datepicker .el-range-input');\n let filterValue = '';\n switch (type) {\n case 'text':\n case 'number':\n filterValue = inputHtml.value;\n if (filterValue.length === 0)\n // Notify.alert('请输入筛选内容', 'warning');\n return;\n\n break;\n case 'date':\n filterValue = dateHtmlArr[0].value + '|' + dateHtmlArr[1].value;\n break;\n case 'dic':\n if (checkList !== null)\n for (const check of checkList)\n if (hasClass(check, 'is-checked'))\n if (check.innerText !== t('common.checkAll'))\n filterValue = filterValue !== '' ? filterValue + '|' + check.querySelector('.el-checkbox__original').value : check.querySelector('.el-checkbox__original').value;\n\n break;\n }\n if (filterValue.length === 0 || filterValue === '|') {\n message(t('table.columnFilterWarn'));\n return;\n }\n\n if (type === 'date') {\n const pattern = /\\d{4}-\\d{2}-\\d{2}\\\\|\\d{4}-\\d{2}-\\d{2}/;\n if (!pattern.test(filterValue)) {\n message(t('table.columnFilterDateWarn'));\n return;\n }\n }\n\n if (propField !== null) {\n const fh = {};\n fh[toLine(propField.replace('@', '.')) + '|' + type] = filterValue;\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n fC.value['headfilter'] = Object.assign(fC.value['headfilter'] || {}, fh);\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n // 隐藏popover\n popoverVisible.value[propField] = false;\n document.body.click();\n // 拼接 过滤条件\n const result = await crud.toNewPageSearch(this, fC, fetch, pageInfo.value);\n if (result && result.records) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n // 标识筛选列\n const tableHeader = this.$el.querySelector('.gv-table .el-table__header-wrapper .el-table__header');\n const columns = tableHeader.querySelectorAll('.el-table__cell');\n const len = columns.length;\n for (let i = 0; i < len; i++) {\n const h = columns[i].querySelector('.render__header');\n if (h && h.children[0] && h.children[0].getAttribute('columnprop') === propField) h.children[0].classList.add('is-selected');\n }\n // 标识筛选列(带fix)\n const tableFixHeader = this.$el.querySelector('.gv-table .el-table__fixed-header-wrapper .el-table__header');\n if (tableFixHeader !== null) {\n const fixColumns = tableFixHeader.querySelectorAll('.el-table__cell');\n if (fixColumns !== null) {\n const fixLen = fixColumns.length;\n for (let i = 0; i < fixLen; i++) {\n const h = fixColumns[i].querySelector('.render__header');\n if (h && h.children[0] && h.children[0].getAttribute('columnprop') === propField) h.children[0].classList.add('is-selected');\n }\n }\n }\n }\n };\n /**\n * @todo: 列表头筛选重置\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-20 10:05:08\n * @param {*} e\n */\n const columnFilterHandlerReset = async (e: MouseEvent, propField: string, type: stringType) => {\n const popoverHtml = e.target.closest('.table-popover');\n const inputHtml = popoverHtml.querySelector('.gv-input .el-input__inner');\n const checkList = popoverHtml.querySelectorAll('.el-checkbox');\n const dateHtmlArr = popoverHtml.querySelectorAll('.gv-datepicker .el-range-input');\n switch (type) {\n case 'text':\n case 'number':\n inputHtml.value = '';\n break;\n case 'date':\n dateHtmlArr[0].value = '';\n dateHtmlArr[1].value = '';\n break;\n case 'dic':\n if (checkList !== null)\n for (const check of checkList)\n if (hasClass(check, 'is-checked')) {\n // check.classList.remove('is-checked');\n check.querySelector('.el-checkbox__original').checked = false;\n check.querySelector('.el-checkbox__input').classList.remove('is-checked');\n }\n\n break;\n }\n\n if (propField !== null) {\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n const fh = fC.value['headfilter'];\n if (fh !== undefined && fh != null) delete fh[toLine(propField.replace('@', '.')) + '|' + type];\n\n fC.value['headfilter'] = Object.assign(fC.value['headfilter'] || {}, fh);\n\n const fetch: Fn = instance?.exposed?.fetch || props.tableFetch;\n\n // 隐藏popover\n popoverVisible.value[propField] = false;\n document.body.click();\n\n if (type !== 'date') {\n const primaryBtn = popoverHtml.querySelector('.el-button--primary');\n primaryBtn.setAttribute('disabled', 'disabled');\n primaryBtn.classList.add('is-disabled');\n }\n\n // 拼接 过滤条件\n const result = await crud.toNewPageSearch(this, fC, fetch, pageInfo.value);\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n // 标识筛选列\n const tableHeader = this.$el.querySelector('.gv-table .el-table__header-wrapper .el-table__header');\n const columns = tableHeader.querySelectorAll('.el-table__cell');\n const len = columns.length;\n for (let i = 0; i < len; i++) {\n const h = columns[i].querySelector('.render__header');\n if (h) if (h.children[0]) if (h.children[0].getAttribute('columnprop') === propField) h.children[0].classList.remove('is-selected');\n }\n const tableFixedHeader = this.$el.querySelector('.gv-table .el-table__fixed-header-wrapper .el-table__header');\n // fixed: 解决列表没有锁定列时报错问题 2023-10-07\n if (tableFixedHeader) {\n const columnsFixed = tableFixedHeader.querySelectorAll('.el-table__cell');\n const lenFixed = columnsFixed.length;\n for (let i = 0; i < lenFixed; i++) {\n const h = columnsFixed[i].querySelector('.render__header');\n if (h) if (h.children[0]) if (h.children[0].getAttribute('columnprop') === propField) h.children[0].classList.remove('is-selected');\n }\n }\n }\n };\n\n /**\n * @todo: set column width by column name\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:12:01\n * @param {*} label\n * @param {*} query\n * @param {*} edit\n */\n const getColWidth = (label: string, query: boolean, edit: boolean) => {\n if (!label) return;\n let label2 = label;\n if (lang === 'en') label2 = label.toLowerCase();\n let sWidth = 0;\n if (label2.indexOf(t('table.date')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.month2')) !== -1) sWidth = 110;\n else if (label2.indexOf(t('table.month')) !== -1) sWidth = 90;\n else if (label2.indexOf(t('table.time')) !== -1) sWidth = 130;\n else if (label2.indexOf(t('table.deliveryTime')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.name')) !== -1) sWidth = 120;\n else if (label2.indexOf(t('table.userAccount')) !== -1) sWidth = 120;\n else if (label === t('table.customerName')) sWidth = 115;\n else if (label2.indexOf(t('table.approve')) !== -1) sWidth = 110;\n else if (label2.indexOf(t('table.audit')) !== -1) sWidth = 110;\n else if (label === t('table.operator')) sWidth = 110;\n else if (label2.indexOf(t('table.staff')) !== -1) sWidth = 100;\n else if (label.indexOf(t('table.whether')) !== -1) sWidth = 110;\n else if (label === t('table.enableStatus')) sWidth = 110;\n else if (label === t('table.orderStatus')) sWidth = 110;\n else if (label2 === t('table.status')) sWidth = 90;\n else if (label2.indexOf(t('table.status')) !== -1) sWidth = 90;\n else if (label === t('table.vin')) sWidth = 185;\n else if (label === t('table.carNo')) sWidth = 105;\n else if (label2.indexOf(t('table.phone')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.tel')) !== -1) sWidth = 110;\n else if (label === t('table.sex')) sWidth = 90;\n else if (label2.indexOf(t('table.type')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.amount')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.money')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.balance')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.unitPrice')) !== -1) sWidth = 95;\n else if (label2.indexOf(t('table.times')) !== -1) sWidth = 100;\n else if (label2.indexOf(t('table.number')) !== -1) sWidth = 140;\n else if (label2.indexOf(t('table.code')) !== -1) sWidth = 135;\n else if (label2.indexOf(t('table.odd')) !== -1) sWidth = 230;\n else if (label2.indexOf(t('table.unit')) !== -1) sWidth = 110;\n else if (label2.indexOf('省') !== -1) sWidth = 90;\n else if (label2.indexOf('市') !== -1) sWidth = 100;\n else if (label2.indexOf('区') !== -1) sWidth = 120;\n else if (label2.indexOf(t('table.color')) !== -1) sWidth = 115;\n else if (label2.indexOf(t('table.storageAge')) !== -1) sWidth = 105;\n else if (label2.indexOf(t('table.chassis')) !== -1) sWidth = 105;\n else if (label2.indexOf('排放标准') !== -1) sWidth = 115;\n else if (label2 === t('table.brand')) sWidth = 105;\n else if (label === t('table.series')) sWidth = 105;\n else if (label === t('table.strain')) sWidth = 105;\n else if (label === '运输方式') sWidth = 100;\n else if (label2.indexOf(t('table.rate')) !== -1) sWidth = 110;\n else if (label2.indexOf(t('table.level')) !== -1) sWidth = edit === true ? 140 : 115;\n // fixme: 增加表头query宽度判断 2022-04-30\n if (query === true && sWidth > 0) sWidth += 15;\n\n // fixme: 增加表头edit宽度判断 2022-06-11\n if (edit === true && sWidth > 0) sWidth += 20;\n return sWidth;\n };\n\n /**\n * @todo: table cell formatter\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:19:28\n * @param {*} row\n * @param {*} column\n * @param {*} cellValue\n * @param {*} index\n */\n const columnFormatter = (row, column, cellValue, index: number) => {\n // console.log(column);\n // console.log(cellValue);\n if (cellValue != null && cellValue.v !== undefined) return cellValue.v;\n else return cellValue === undefined ? '' : cellValue;\n };\n\n /**\n * @todo: table header search input change method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-22 09:55:46\n * @param {string} val\n */\n const handleColumnFilter = (val: string) => {\n const popoverHtmlList = Array.from(document.body.querySelectorAll<HTMLElement>('body>.table-popover'));\n let popoverHtml: HTMLElement | undefined;\n for (const pop of popoverHtmlList)\n if (pop.style.display !== 'none') {\n popoverHtml = pop;\n break;\n }\n if (!popoverHtml) return;\n const primaryBtn = popoverHtml.querySelector<HTMLElement>('.el-button--primary');\n if (!primaryBtn) return;\n if (val !== undefined && val !== null && val !== '') {\n primaryBtn.removeAttribute('disabled');\n primaryBtn.classList.remove('is-disabled');\n } else {\n primaryBtn.setAttribute('disabled', 'disabled');\n primaryBtn.classList.add('is-disabled');\n }\n };\n /**\n * @todo: set header filter\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:23:58\n * @param {string} type\n * @param {string} label\n * @param {string} prop\n * @param {string} dicType\n * @param {string} filtercode\n */\n const renderHeadFilter = (type: string, label: string, prop: string, dicType: string | undefined, filtercode: string | undefined) => {\n let render: VNode | null = null;\n let fc = filtercode !== undefined ? filtercode : '';\n switch (type) {\n case 'text':\n case 'number':\n render = (\n <div>\n <GvInput\n placeholder={`${t('table.search')} - ${label}`}\n size={tableSize.value}\n onInput={handleColumnFilter}\n vref={prop}></GvInput>\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size={tableSize.value}\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size={tableSize.value}\n onClick={(e) => columnFilterHandlerReset(e, prop, type)}>\n {t('table.reset')}\n </GvButton>\n </div>\n </div>\n );\n break;\n case 'date':\n render = (\n <div>\n <GvDatePicker\n placeholder={`${t('table.search')} - ${label}`}\n size={tableSize.value}\n type=\"daterange\"\n format={dicType}\n value-format={dicType}\n // onChange={handleColumnFilter}\n vref={prop}\n />\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size={tableSize.value}\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size={tableSize.value}\n onClick={(e) => columnFilterHandlerReset(e, prop, type)}>\n {t('table.reset')}\n </GvButton>\n </div>\n </div>\n );\n break;\n case 'dic':\n if (dicType) {\n let ret = [];\n const src = dicType.toLowerCase();\n let dictCache;\n if (this.$store && this.$store.getters) dictCache = this.$store.getters.dictCache[src];\n if (dicType !== 'xzqh' && dictCache) ret = dictCache;\n // 生成字典列表\n else if (dicType === 'xzqh') {\n if (label.indexOf('省') >= 0) fc = '0000$';\n // else if (label.indexOf('市') >= 0)\n // fc = '^[1-9][1-9][0-9][1-9]00$';\n // else if (label.indexOf('区') >= 0)\n // fc = '^[1-9][1-9][0-9][1-9][0-9][1-9]$';\n\n let dict;\n if (this.$store && this.$store.getters) dict = this.$store.getters.dictDivision;\n if (dict) {\n const cache = {};\n cache['key'] = 'xzqh';\n cache['dict'] = dict;\n this.$store.dispatch('user/addDictCache', cache);\n ret = dict;\n }\n } else {\n let dict;\n if (this.$store && this.$store.getters) dict = this.$store.getters.dict[src];\n if (dict) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dict;\n this.$store.dispatch('user/addDictCache', cache);\n ret = dict;\n }\n }\n // 设置过滤\n let ret2 = ret;\n if (fc) {\n const reg = new RegExp(fc, 'i');\n ret2 = ret.filter((x) => reg.test(x.c));\n }\n // ret.map((x) => {\n // checkList.push(x.c);\n // });\n // console.log(checkList);\n // 最大显示100个\n if (ret2 && ret2.length !== undefined && ret2.length > 0) {\n ret2.splice(50);\n render = (\n <div>\n <div>\n <ElCheckbox\n checked={false}\n key=\"checkAll\"\n label={t('common.checkAll')}\n style={{ display: 'block' }}\n indeterminate={isIndeterminate[prop]}\n onChange={handleDictCheckAll}\n class=\"gv-checkbox\">\n {t('common.checkAll')}\n </ElCheckbox>\n <ElDivider style=\"margin: 5px 0px\" />\n {ret2.map((x) => (\n <ElCheckbox\n checked={false}\n key={x.c}\n label={x.c}\n style={{ display: 'block' }}\n onChange={handleDictCheck}\n class=\"gv-checkbox\">\n {lang === 'zh-CN' ? x.t : x.e}\n </ElCheckbox>\n ))}\n </div>\n <div class=\"popover-bottom\">\n <GvButton\n type=\"primary\"\n size={tableSize.value}\n disabled=\"true\"\n onClick={(e) => columnFilterHandler(e, prop, type)}>\n {t('table.search')}\n </GvButton>\n <GvButton\n size={tableSize.value}\n onClick={(e) => columnFilterHandlerReset(e, prop, type)}>\n {t('table.reset')}\n </GvButton>\n </div>\n </div>\n );\n } else render = null;\n } else render = null;\n\n break;\n }\n return render ? wrapPopoverFilterBody(render) : null;\n };\n\n /**\n * @todo: open popover\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-18 10:22:13\n * @param {*} type\n * @param {*} label\n * @param {*} prop\n * @param {*} dicType\n * @param {*} filtercode\n * @param {*} event\n */\n /** 点击表头筛选箭头:仅关闭其它列 Popover,开关由 ElPopover trigger=click + v-model 处理 */\n const handlePopoverSlotClick = (event: MouseEvent, prop: string) => {\n event?.stopPropagation();\n closeAllPopover(prop);\n };\n\n /**\n * @todo: render column item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 14:37:55\n */\n const renderColumnItem = (item: TableHeadItem, index: number, loadAction: string | undefined, tableFixed: string | undefined) => {\n const {\n prop,\n label,\n fixed,\n width,\n minWidth = 135,\n align = 'left',\n formatter,\n type = 'text',\n dicType,\n query = false,\n render,\n edit = false,\n format,\n cellBlur,\n cellEnter,\n cellChange,\n hidden = false,\n hasHidden = false,\n filtercode,\n showLabel,\n dicRemote,\n isreload = true,\n cb,\n multiple = false,\n dateType = 'date',\n selectable,\n min,\n max,\n collapseTags = false, // 多选字典tag是否折叠\n showLabelProp, // 表选showLabel列\n columnFilter = true, // 表头是否带筛选\n multiLabel = '', // 多级表头\n heads, // 多级表头\n focus,\n } = item;\n let reserveSelection = false;\n if (selectable) reserveSelection = true;\n let sHidden = false;\n if (hidden === true) sHidden = true;\n if (hasHidden === true) sHidden = true;\n if (sHidden === true) return null;\n\n let sLabel = label;\n let sProp = prop;\n if (prop && prop.indexOf('@') > 0) sProp = prop.split('@')[1];\n const key = loadAction === 'create' ? Math.random() : sProp;\n\n let placement: TPopoverPlacement = 'bottom-start';\n if (index >= tableHeads.length - 2) placement = 'bottom-end';\n let sFixed = sTableType === 'expand' ? undefined : fixed;\n if (tableFixed === 'n') sFixed = undefined;\n if (sTableAction === 'right') sFixed = undefined;\n // console.log(sFixed);\n if (sFixed) sLabel = sLabel + '';\n if (query === true) {\n sLabel = sLabel + '(Q)';\n filterHeads.push(prop);\n tableSearchShow.value = true;\n }\n ensurePopoverKey(prop);\n const sortable = sTableType === 'expand' ? false : 'custom';\n\n let sWidth;\n if (width !== 'auto')\n if (width) sWidth = width;\n else sWidth = getColWidth(label, query, edit);\n if (isEditTable === false && edit === true) isEditTable = true;\n\n // 多级表头\n if (multiLabel && multiLabel !== '') {\n if (heads && Array.isArray(heads)) {\n const multiLabels: VNode[] = [];\n heads.forEach((x) => {\n const hType = x.type || 'text';\n let hSLabel = x.label;\n let hSProp = x.prop;\n if (x.prop && x.prop.indexOf('@') > 0) hSProp = x.prop.split('@')[1];\n const hKey = loadAction === 'create' ? Math.random() : hSProp;\n\n let hSFixed = sTableType === 'expand' ? undefined : x.fixed;\n if (tableFixed === 'n') hSFixed = undefined;\n // console.log(sFixed);\n if (hSFixed) hSLabel = hSLabel + '';\n if (x.query === true) {\n hSLabel = hSLabel + '(Q)';\n filterHeads.push(x.prop);\n tableSearchShow.value = true;\n }\n let hReserveSelection = false;\n if (x.selectable) hReserveSelection = true;\n // 初始化 列的筛选popover都是隐藏的\n ensurePopoverKey(x.prop);\n const hSortable = sTableType === 'expand' ? false : 'custom';\n\n let hSWidth;\n if (x.width !== 'auto')\n if (x.width) hSWidth = x.width;\n else hSWidth = getColWidth(x.label, x.query, x.edit);\n multiLabels.push(\n <ElTableColumn\n fixed={hSFixed}\n prop={hSProp}\n label={hSLabel}\n width={hSWidth}\n align={x.align}\n column-key={hSProp}\n key={hKey}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={hSortable}\n selectable={x.selectable}\n reserveSelection={hReserveSelection}\n header-align={x.align || 'left'}\n style={{ display: sHidden ? 'none' : '' }}\n sort-orders={['ascending', 'descending']}>\n {{\n header: () => (\n <div\n onClick={(e) => handlePopoverWrapper(e)}\n class=\"render__header\">\n <ElPopover\n visible={popoverVisible.value[x.prop]}\n onUpdate:visible={(val: boolean) => {\n popoverVisible.value = { ...popoverVisible.value, [x.prop]: val };\n }}\n trigger=\"click\"\n width=\"auto\"\n popperStyle={tableHeadFilterPopoverPopperStyle}\n showArrow={true}\n placement={placement}\n popperClass={`gv-popover table-popover table-popover-${props.refTable}`}\n onAfter-enter={handlePopoverShow}\n onAfter-leave={handlePopoverHide}>\n {{\n default: () => renderHeadFilter(hType, x.label, x.prop, x.dicType, x.filtercode),\n reference: () => (\n <div\n class=\"gv-table-header-filter\"\n onClick={(e) => handlePopoverSlotClick(e, x.prop)}>\n {hSLabel}\n <GvIcon\n iconType=\"el\"\n iconName=\"ArrowDown\"></GvIcon>\n </div>\n ),\n }}\n </ElPopover>\n </div>\n ),\n }}\n </ElTableColumn>,\n );\n });\n return <ElTableColumn label={multiLabel + ''}>{multiLabels}</ElTableColumn>;\n }\n } else if (typeof render === 'function') {\n // 自定义字段 render\n let className = 'gv-cell__render';\n if (edit === true) className += ' gv-cell__isedit';\n return (\n <ElTableColumn\n // fixed = {fixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n key={key}\n column-key={sProp}\n show-overflow-tooltip={false}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']}\n class-name={className}>\n {{\n default: (scope) => {\n const render1 = render(scope, sProp);\n return render1;\n },\n header: () => <div class=\"render__header\">{label}</div>,\n }}\n </ElTableColumn>\n );\n } else if (edit === true)\n return (\n <ElTableColumn\n style={{ display: sHidden ? 'none' : '' }}\n fixed={sFixed}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n key={key}\n column-key={sProp}\n show-overflow-tooltip={false}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']} // null\n // filters={this.columnFilters}\n // filter-method={this.filterHandler}\n // filter-placement='bottom-start'\n class-name=\"gv-cell__isedit\">\n {{\n default: (scope) => {\n // if (this.renderMap[`${scope.$index}-${sProp}`] === undefined) {\n const render1 = renderRowEdit(\n scope,\n label,\n sProp,\n prop,\n type,\n dicType,\n format,\n cellBlur,\n cellEnter,\n filtercode,\n showLabel,\n dicRemote,\n isreload,\n cb,\n multiple,\n dateType,\n render,\n cellChange,\n min,\n max,\n collapseTags,\n showLabelProp,\n focus,\n );\n return render1;\n },\n header: () => <div class=\"render__header\">{label}</div>,\n }}\n </ElTableColumn>\n );\n else if (type === 'tag')\n // 设置tag\n return (\n <ElTableColumn\n fixed={sFixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n key={sProp}\n column-key={sProp}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']}\n class-name=\"gv-cell__render\">\n {{\n default: (scope) =>\n scope.row[sProp] !== null && typeof scope.row[sProp] === 'object' ? (\n scope.row[sProp].v ? (\n <GvTag>{scope.row[sProp].v}</GvTag>\n ) : null\n ) : scope.row[sProp] ? (\n <GvTag>{scope.row[sProp]}</GvTag>\n ) : null,\n header: () => <div class=\"render__header\">{sLabel}</div>,\n }}\n </ElTableColumn>\n );\n else if (\n dicType !== 'company' &&\n dicType !== 'dept' &&\n dicType !== 'user' &&\n label.indexOf('市') === -1 &&\n label.indexOf('区县') === -1 &&\n label.indexOf('区/县') === -1 &&\n props.tableType !== 'list' &&\n props.tableType !== 'detail' &&\n props.tableType !== 'expand' &&\n props.tableType !== 'import'\n )\n if (columnFilter !== true)\n return (\n // add: af-table-column插件,计算列宽对于表头带有排序、(Q)等情况自适应列款不准确\n <ElTableColumn\n fixed={sFixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n column-key={sProp}\n key={key}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n selectable={selectable}\n reserveSelection={reserveSelection}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']} // null\n >\n {{\n header: () => <div class=\"render__header\">{sLabel}</div>,\n }}\n </ElTableColumn>\n );\n else\n return (\n // add: af-table-column插件,计算列宽对于表头带有排序、(Q)等情况自适应列款不准确\n <ElTableColumn\n fixed={sFixed}\n style={{ display: sHidden ? 'none' : '' }}\n prop={sProp}\n label={sLabel}\n width={sWidth}\n align={align}\n column-key={sProp}\n key={key}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n selectable={selectable}\n reserveSelection={reserveSelection}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']} // null\n >\n {{\n header: () => (\n <div\n onClick={(e) => handlePopoverWrapper(e)}\n class=\"render__header\">\n <ElPopover\n visible={popoverVisible.value[prop]}\n onUpdate:visible={(val: boolean) => {\n popoverVisible.value = { ...popoverVisible.value, [prop]: val };\n }}\n trigger=\"click\"\n width=\"auto\"\n popperStyle={tableHeadFilterPopoverPopperStyle}\n showArrow={true}\n placement={placement}\n popperClass={`gv-popover table-popover table-popover-${props.refTable}`}\n onAfter-enter={handlePopoverShow}\n onAfter-leave={handlePopoverHide}>\n {{\n default: () => renderHeadFilter(type, label, prop, dicType, filtercode),\n reference: () => (\n <div\n class=\"gv-table-header-filter\"\n onClick={(e) => handlePopoverSlotClick(e, prop)}>\n {sLabel}\n <GvIcon\n iconType=\"el\"\n iconName=\"ArrowDown\"></GvIcon>\n </div>\n ),\n }}\n </ElPopover>\n </div>\n ),\n }}\n </ElTableColumn>\n );\n else\n return (\n <ElTableColumn\n fixed={sFixed}\n prop={sProp}\n style={{ display: sHidden ? 'none' : '' }}\n label={sLabel}\n width={sWidth}\n align={align}\n key={sProp}\n selectable={selectable}\n reserveSelection={reserveSelection}\n column-key={sProp}\n show-overflow-tooltip={true}\n formatter={formatter ? formatter(columnFormatter) : columnFormatter}\n min-width={minWidth}\n sortable={sortable}\n header-align={align || 'left'}\n sort-orders={['ascending', 'descending']}>\n {{\n header: () => <div class=\"render__header\">{props.tableType === 'list' ? sLabel : label}</div>,\n }}\n </ElTableColumn>\n );\n };\n\n /**\n * @todo: action column\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 14:08:55\n */\n const renderAction = (scope, content: string[], action: any[], render: Fn | undefined, confirmArr: boolean[], iconArr: string[]) => {\n let sContent = content;\n if (render) sContent = render(scope, content);\n return (\n <div class=\"flex\">\n {sContent.map((item: string, index: number) => {\n let x = item;\n let xx = 't';\n let disabled = false;\n if (item.indexOf('|') > 0) {\n const arr = item.split('|');\n x = arr[0];\n if (arr[1] === 'd') {\n xx = 't';\n disabled = true;\n // xx = arr[1];\n }\n }\n // console.log(item);\n let confirms = false;\n if (confirmArr) confirms = confirmArr[index];\n let detail = false;\n let icon = '';\n\n let actionType = '';\n if (x.indexOf(t('table.edit')) !== -1 || x.indexOf(t('table.modify')) !== -1 || x.indexOf(t('table.update')) !== -1) icon = 'el-icon-edit';\n else if (x.indexOf(t('table.delete')) !== -1 || x.indexOf(t('table.cancel')) !== -1) {\n icon = 'el-icon-delete';\n confirms = true;\n } else if (x.indexOf(t('table.add')) !== -1) icon = 'gv-icon-add';\n else if (x.indexOf(t('table.scheduling')) !== -1 || x.indexOf(t('table.production')) !== -1) icon = 'gv-icon-task';\n else if (x.indexOf(t('table.append')) !== -1) {\n actionType = '1';\n icon = 'gv-icon-baocun2';\n } else if (x.indexOf(t('table.disabled')) !== -1) {\n icon = 'gv-icon-tingyong';\n confirms = true;\n } else if (x.indexOf(t('table.cancel1')) !== -1) {\n icon = 'gv-icon-tingyong';\n confirms = true;\n } else if (x.indexOf(t('table.close')) !== -1) {\n icon = 'el-icon-circle-close';\n confirms = true;\n } else if (x.indexOf(t('table.detail')) !== -1) {\n icon = 'gv-icon-mingxi';\n detail = true;\n } else if (x.indexOf(t('table.logging')) !== -1) {\n icon = 'gv-icon-daiban';\n detail = true;\n } else if (x.indexOf(t('table.info')) !== -1 || x.indexOf(t('table.infos')) !== -1) icon = 'gv-icon-info';\n else if (x.indexOf(t('table.view')) !== -1) icon = 'gv-icon-info';\n else if (x.indexOf(t('table.message')) !== -1) icon = 'gv-icon-info';\n else if (x.indexOf(t('table.price')) !== -1) icon = 'gv-icon-jiage1';\n else if (x.indexOf(t('table.money')) !== -1) icon = 'gv-icon-jiage1';\n else if (x.indexOf(t('table.dispatch')) !== -1) icon = 'gv-icon-winfo-icon-zhipai';\n else if (x.indexOf(t('table.adjust')) !== -1) icon = 'gv-icon-wujiliandongdizhi';\n else if (x.indexOf(t('table.leaveFactory')) !== -1 || x.indexOf(t('table.delivery')) !== -1) icon = 'gv-icon-paichesonghuodan';\n else if (x.indexOf(t('table.quit')) !== -1 || x.indexOf(t('table.transfer')) !== -1) icon = 'gv-icon-zhipai';\n else if (x.indexOf(t('table.submit')) !== -1 || x.indexOf(t('table.report')) !== -1) icon = 'gv-icon-tijiao';\n else if (x.indexOf(t('table.download')) !== -1) icon = 'gv-icon-xiazai';\n else if (x.indexOf(t('table.upload')) !== -1) icon = 'gv-icon-fujian';\n else if (x.indexOf(t('table.notify')) !== -1) icon = 'gv-icon-huodong';\n else if (x.indexOf(t('table.send')) !== -1) icon = 'gv-icon-xiazaidaorumoban1x';\n else if (x.indexOf(t('table.freeze')) !== -1) icon = 'gv-icon-dongjie';\n else if (x.indexOf(t('table.apply')) !== -1) icon = 'gv-icon-biaoshilei_yuanchengshengji';\n else if (x.indexOf(t('table.unfreeze')) !== -1) icon = 'gv-icon-jiedong';\n else if (x.indexOf(t('table.qrcode')) !== -1) icon = 'gv-icon-erweima';\n else if (x.indexOf(t('table.build')) !== -1) icon = 'gv-icon-rocket';\n else if (x.indexOf(t('table.confirm')) !== -1) icon = 'gv-icon-tianshenpi';\n else if (x.indexOf(t('table.proxyPay')) !== -1) icon = 'gv-icon-bengchefenleijiageguanli';\n else if (x.indexOf(t('table.open')) !== -1) icon = 'gv-icon-addNode';\n else if (x.indexOf(t('table.audit')) !== -1) icon = 'gv-icon-shenpi2';\n else if (x.indexOf(t('table.top')) !== -1) icon = 'gv-icon-zhidingxian';\n else if (x.indexOf(t('table.publish')) !== -1) icon = 'gv-icon-fabu';\n else if (x.indexOf(t('table.withdraw')) !== -1) icon = 'gv-icon-fanhui5';\n else if (x.indexOf(t('table.cost')) !== -1) icon = 'gv-icon-yingshou';\n else if (x.indexOf(t('table.approve')) !== -1) icon = 'gv-icon-shenpi2';\n else if (x.indexOf(t('table.reject')) !== -1) icon = 'gv-icon-shenqingbohui';\n else if (x.indexOf(t('table.exec')) !== -1) icon = 'gv-icon-kaishi_yunhang';\n else if (x.indexOf(t('table.recover')) !== -1) icon = 'gv-icon-huifu1';\n else if (x.indexOf(t('table.dispose')) !== -1) icon = 'gv-icon-task';\n else if (x.indexOf(t('table.ok')) !== -1) icon = 'gv-icon-xuanze';\n else if (x.indexOf(t('table.select')) !== -1) icon = 'gv-icon-xuanze';\n else if (x.indexOf(t('table.lock')) !== -1) icon = 'el-icon-lock';\n else if (x.indexOf(t('table.unLock')) !== -1) icon = 'el-icon-unlock';\n else if (x.indexOf(t('table.enable')) !== -1) icon = 'gv-icon-yunhang';\n else if (x.indexOf(t('table.transmit')) !== -1) icon = 'gv-icon-xiada';\n else if (x.indexOf(t('table.putaway')) !== -1) icon = 'el-icon-top';\n else if (x.indexOf(t('table.soldOut')) !== -1) icon = 'el-icon-bottom';\n else if (x.indexOf(t('table.transferPeople')) !== -1) icon = 'gv-icon-zhuanpai1';\n else if (x.indexOf(t('table.copy')) !== -1) icon = 'el-icon-copy-document';\n else if (x.indexOf(t('table.followUp')) !== -1) icon = 'gv-icon-mingdangenjin';\n else if (x.indexOf(t('table.circleCheck')) !== -1) icon = 'gv-icon-huanjiance';\n else if (x.indexOf(t('table.completed')) !== -1) icon = 'gv-icon-xuanze';\n else if (x.indexOf(t('table.finished')) !== -1) icon = 'gv-icon-wangongguanli';\n else if (x.indexOf(t('table.beCompleted')) !== -1) icon = 'gv-icon-wangongqueren';\n else if (x.indexOf(t('table.openCard')) !== -1) icon = 'gv-icon-daka-copy';\n else if (x.indexOf(t('table.closeCard')) !== -1) icon = 'gv-icon-guanqia';\n else if (x.indexOf(t('table.clockIn')) !== -1) icon = 'gv-icon-qiandao';\n else if (x.indexOf(t('table.preview')) !== -1) icon = 'el-icon-view';\n else if (x.indexOf(t('table.replace')) !== -1) icon = 'gv-icon-tihuantupian';\n else if (x.indexOf(t('table.settlement')) !== -1) icon = 'gv-icon-eduguanli';\n else if (x.indexOf(t('table.inWarehouse')) !== -1) icon = 'gv-icon-caituiruku';\n else if (x.indexOf(t('table.save')) !== -1) {\n icon = 'gv-icon-baocun1';\n actionType = '1';\n } else icon = 'el-icon-document-copy';\n\n // added by andy.ten@tom.com 2024-08-14 增加自定义按钮icon\n if (iconArr && Array.isArray(iconArr) && iconArr.length > index && iconArr[index]) icon = iconArr[index];\n if (sTableActionIcon === false) icon = '';\n if (confirms === true)\n if (sTableConfirm === false)\n return icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n icon={icon}\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n confirm('是否?').then(\n () => {\n if (scope.lock === undefined || scope.lock === false) {\n if (loading.value === true) return;\n startLoading();\n scope.lock = true;\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n scope.lock = false;\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }}></GvButton>\n </span>\n </div>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n type=\"text\"\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n confirm(`${t('table.isConfirm')} ${x} ${t('table.action')} ?`).then(\n () => {\n if (scope.lock === undefined || scope.lock === false) {\n if (loading.value === true) return;\n startLoading();\n scope.lock = true;\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n scope.lock = false;\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }}>\n {x}\n </GvButton>\n </span>\n </div>\n </ElTooltip>\n );\n else\n return (\n <GvPopconfirm\n title={`${t('table.isConfirm')} ${x} ${t('table.action')} ?`}\n onConfirm={() => {\n if (scope.lock === undefined || scope.lock === false) {\n if (loading.value === true) return;\n startLoading();\n scope.lock = true;\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n scope.lock = false;\n },\n () => {\n stopLoading();\n scope.lock = false;\n },\n );\n }\n }}>\n {{\n reference: () => (\n <div class=\"gv-table-action-trigger\">\n {icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n icon={icon}\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}></GvButton>\n </span>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n type=\"text\"\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}>\n {x}\n </GvButton>\n </span>\n </ElTooltip>\n )}\n </div>\n ),\n }}\n </GvPopconfirm>\n );\n else if (detail === true)\n return (\n <ElPopover\n title={x}\n placement={detailPlacement}\n trigger=\"click\"\n showArrow={true}\n onAfter-enter={() => handleDetailPopoverShow(action, index, scope.row, scope.$index)}\n popperClass=\"gv-popconfirm\">\n {{\n reference: () => (\n <div class=\"gv-table-action-trigger\">\n {icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n icon={icon}\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}></GvButton>\n </span>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <span>\n <GvButton\n perms={item}\n text={x}\n size={tableSize.value}\n type=\"text\"\n disabled={disabled}\n onClick={() => {\n // event.stopPropagation();\n }}>\n {x}\n </GvButton>\n </span>\n </ElTooltip>\n )}\n </div>\n ),\n default: () => showPopoverDetail,\n }}\n </ElPopover>\n );\n else\n // action btn\n return icon ? (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n visible={xx === 't'}\n disabled={disabled}\n text={x}\n size={tableSize.value}\n onClick={() => {\n // event.preventDefault();\n // event.stopPropagation();\n if (actionType === '1') {\n if (checkEditRow(scope.$index))\n try {\n startLoading();\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n } else\n try {\n startLoading();\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n }}\n icon={icon}></GvButton>\n </span>\n </div>\n </ElTooltip>\n ) : (\n <ElTooltip\n content={x}\n effect=\"dark\"\n placement=\"top\"\n showAfter={1000}>\n <div class=\"gv-table-action-trigger\">\n <span>\n <GvButton\n perms={item}\n visible={xx === 't'}\n disabled={disabled}\n text={x}\n size={tableSize.value}\n type=\"text\"\n onClick={() => {\n // event.preventDefault();\n // event.stopPropagation();\n startLoading();\n if (actionType === '1') {\n if (checkEditRow(scope.$index))\n try {\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n } else\n try {\n action[index](scope.row, scope.$index).then(\n () => {\n stopLoading();\n },\n () => {\n stopLoading();\n },\n );\n } catch {\n stopLoading();\n }\n }}>\n {x}\n </GvButton>\n </span>\n </div>\n </ElTooltip>\n );\n })}\n </div>\n );\n };\n\n /**\n * @todo: get table header columns\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-15 12:03:16\n * @param {*} loadAction\n * @param {*} tableColumns\n */\n const getTableColumn = (loadAction?: string, tableColumns?: TableHeadItem[]) => {\n const res: VNode[] = [];\n tableHeads = loadAction === 'recreate' ? tableColumns! : props.tableHead;\n // 从localStorage中获取已保存的列表显示信息\n if (loadAction === 'create') {\n lsTableHeads = getStorage(storageKey);\n if (lsTableHeads) {\n const thd: TableHeadItem[] = [];\n const lsTableHeadsArr = lsTableHeads.split(',');\n let startIndex = 0;\n if (tableHeads[0].type === 'expand') {\n thd[0] = { ...tableHeads[0] } as TableHeadItem;\n startIndex = 0;\n if (tableHeads[1].type === 'action') thd[1] = { ...tableHeads[1] } as TableHeadItem;\n startIndex = 1;\n } else if (tableHeads[0].type === 'action') {\n startIndex = 0;\n thd[0] = { ...tableHeads[0] } as TableHeadItem;\n }\n\n lsTableHeadsArr.forEach((x: string, index: number) => {\n const xx = x.split('|');\n const ff = tableHeads.filter((f) => f.prop === xx[0]);\n if (ff.length > 0) {\n if (ff[0].hidden !== true) {\n ff[0].hasHidden = xx[1] === 't';\n const treeNode = {\n columnProp: ff[0].prop,\n label: ff[0].label,\n };\n if (loadAction === 'create') {\n (columnTreeList.value as any[]).push(treeNode);\n if (ff[0].hasHidden !== true && xx[1] !== 't') columnCheckedKeys.value.push(ff[0].prop);\n }\n }\n thd[index + startIndex] = { ...ff[0] };\n }\n });\n tableHeads = thd;\n }\n }\n\n // 第一列为序号列\n // let fixed = this.tableType !== 'detail';\n let fixed: string | undefined = sTableAction;\n if (tableHeads[0].type === 'expand') {\n fixed = undefined as unknown as string;\n sTableType = 'expand';\n }\n\n if (sTableType === 'expand') fixed = undefined as unknown as string;\n // 如果是edit多选列表,则去掉列锁定\n let tableFixed = 'y';\n if (tableHeads.some((x) => x.multiple === true)) {\n tableFixed = 'n';\n fixed = undefined;\n }\n\n if (props.multi === true) {\n fixed = undefined;\n tableFixed = 'n';\n }\n\n // 添加展开列\n if (tableHeads[0].type === 'expand')\n res.push(\n <ElTableColumn\n type=\"expand\"\n key=\"expand\"\n column-key=\"expand\"\n prop=\"expand\"\n width=\"42\"\n fixed={fixed}>\n {{ default: (scope: any) => tableHeads[0].render?.(scope) }}\n </ElTableColumn>,\n );\n let rownumWidth = '55';\n if (pageInfo.value?.currentpagenum)\n if (pageInfo.value.currentpagenum * pageInfo.value.totalpage > 10000) rownumWidth = '65';\n else if (pageInfo.value.currentpagenum * pageInfo.value.totalpage > 1000) rownumWidth = '57';\n\n if (fixed === 'left')\n res.push(\n <ElTableColumn\n fixed={fixed}\n // prop='rownums'\n key=\"rownums\"\n column-key=\"rownums\"\n label={t('table.rownums')}\n width={rownumWidth}\n min-width={rownumWidth}>\n {{\n default: (scope) => {\n // console.log(this.pageInfo.current);\n // console.log((this.pageInfo.current === -1 ? 0 : this.pageInfo.current - 1) * (this.pageInfo.size === -1 ? 0 : this.pageInfo.size));\n if (pageInfo.value?.currentpagenum) return (pageInfo.value.currentpagenum === -1 ? 0 : pageInfo.value.currentpagenum - 1) * pageInfo.value.totalpage + scope.$index + 1;\n else return scope.$index + 1;\n },\n }}\n </ElTableColumn>,\n );\n else\n res.push(\n <ElTableColumn\n // prop='rownums'\n key=\"rownums\"\n column-key=\"rownums\"\n label={t('table.rownums')}\n width={rownumWidth}\n min-width={rownumWidth}>\n {{\n default: (scope) => {\n if (pageInfo.value?.currentpagenum) return (pageInfo.value.currentpagenum === -1 ? 0 : pageInfo.value.currentpagenum - 1) * pageInfo.value.totalpage + scope.$index + 1;\n else return scope.$index + 1;\n },\n }}\n </ElTableColumn>,\n );\n // add: 第二列判断是否是多选框 2022-06-11\n if (props.multi === true)\n if (fixed === 'left')\n res.push(\n <ElTableColumn\n fixed=\"left\"\n prop=\"multi\"\n key=\"multi\"\n type=\"selection\"\n width=\"35\"></ElTableColumn>,\n );\n else\n res.push(\n <ElTableColumn\n prop=\"multi\"\n key=\"multi\"\n type=\"selection\"\n width=\"35\"></ElTableColumn>,\n );\n\n const actionHead = tableHeads.filter((x) => x.type === 'action');\n if (sTableAction === 'left')\n if (actionHead.length > 0) {\n const content = actionHead[0].content || [];\n const action = actionHead[0].action || [];\n const render = actionHead[0].render;\n const confirmArr = actionHead[0].confirm || [];\n const icon = actionHead[0].icon || [];\n if (actionHead[0].width) actionWidth = +actionHead[0].width;\n else if (sTableActionIcon === true)\n if (content.length === 1)\n // update: 对于只有一个按钮的操作列,设置固定宽度 2022-07-13\n actionWidth = 52;\n else actionWidth = content.length === 2 ? content.length * 44 : content.length * 42;\n else if (content.length === 1) actionWidth = content.join('').length * 30;\n else if (lang === 'zh_CN') actionWidth = content.join('').length * 25;\n else actionWidth = content.join('').length * 13;\n\n const actionColumn = (\n <ElTableColumn\n label={t('table.action')}\n key=\"caozuo\"\n column-key=\"caozuo\"\n prop=\"caozuo\"\n fixed={fixed}\n width={actionWidth}>\n {{ default: (scope: any) => renderAction(scope, content, action, render, confirmArr, icon) }}\n </ElTableColumn>\n );\n res.push(actionColumn);\n }\n\n filterHeads = [];\n tableHeads.forEach((item: TableHeadItem, index: number) => {\n if (item.type !== 'expand' && item.type !== 'action') {\n const columnVNode = renderColumnItem(item, index, loadAction, tableFixed);\n if (columnVNode) res.push(columnVNode);\n if (!lsTableHeads && loadAction === 'create')\n if (item.hidden !== true) {\n const treeNode = {\n columnProp: item.prop,\n label: item.label,\n };\n (columnTreeList.value as any[]).push(treeNode);\n columnCheckedKeys.value.push(item.prop);\n }\n }\n\n // this.$set(this.tableHead, index, item);\n // if (loadAction === 'create')\n // this.$set(this.resultData, index, item);\n });\n if (sTableAction === 'right')\n if (actionHead.length > 0) {\n const content = actionHead[0].content || [];\n const action = actionHead[0].action || [];\n const render = actionHead[0].render;\n const confirmArr = actionHead[0].confirm || [];\n const icon = actionHead[0].icon || [];\n if (actionHead[0].width) actionWidth = +actionHead[0].width;\n else if (sTableActionIcon === true)\n if (content.length === 1)\n // update: 对于只有一个按钮的操作列,设置固定宽度 2022-07-13\n actionWidth = 52;\n else actionWidth = content.length === 2 ? content.length * 44 : content.length * 42;\n else if (content.length === 1)\n if (lang === 'zh_CN') actionWidth = content.join('').length * 30;\n else actionWidth = content.join('').length * 18;\n else if (lang === 'zh_CN') actionWidth = content.join('').length * 25;\n else actionWidth = content.join('').length * 13;\n\n const actionColumn = (\n <ElTableColumn\n label={t('table.action')}\n key=\"caozuo\"\n column-key=\"caozuo\"\n prop=\"caozuo\"\n fixed={fixed}\n width={actionWidth}>\n {{ default: (scope: any) => renderAction(scope, content, action, render, confirmArr, icon) }}\n </ElTableColumn>\n );\n res.push(actionColumn);\n }\n\n // this.setDataLoaded(false);\n return res;\n };\n\n /**\n * @todo: table sort\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-25 17:45:10\n */\n const sortMethod = async ({ column, prop, order }: { column: Recordable<any>; prop: string | null; order: 'ascending' | 'descending' | null }) => {\n const fieldName = prop || column?.property;\n const sortingType = order ?? column?.order ?? null;\n if (tableSortMode.value === 1) {\n // 本页排序\n let sumData = {}; // 放置总计一行数据\n recordsList.value.forEach((item) => {\n if (item.name === t('common.total')) sumData = item;\n });\n if (sortingType === null)\n recordsList.value = recordsList.value.sort((a, b) => {\n let row1 = a['rownums'];\n let row2 = b['rownums'];\n // fixme: 增加判断是否是字典项 2022-06-20\n if (row1.v) row1 = row1.v;\n\n if (row2.v) row2 = row2.v;\n if (!isNaN(Number(row1)) && !isNaN(Number(row2))) return row1 - row2;\n else return row1.toString().localeCompare(row2.toString());\n });\n else if (sortingType === 'ascending' || sortingType === null) {\n // 正序\n recordsList.value = recordsList.value.sort((a, b) => {\n let row1 = a[fieldName] || '';\n let row2 = b[fieldName] || '';\n // fixme: 增加判断是否是字典项 2022-06-20\n if (row1.v) row1 = row1.v;\n\n if (row2.v) row2 = row2.v;\n if (!isNaN(Number(row1)) && !isNaN(Number(row2))) return row1 - row2;\n else return row1.toString().localeCompare(row2.toString());\n });\n // 删除table中的总计\n recordsList.value.forEach((item, index) => {\n if (item.name === t('common.total')) recordsList.value.splice(index, 1);\n return item;\n });\n if (Object.keys(sumData).length > 0) recordsList.value.push(sumData);\n } else if (sortingType === 'descending') {\n // 倒序\n recordsList.value = recordsList.value.sort((a, b) => {\n let row1 = a[fieldName] || '';\n let row2 = b[fieldName] || '';\n // fixme: 增加判断是否是字典项 2022-06-20\n if (row1.v) row1 = row1.v;\n\n if (row2.v) row2 = row2.v;\n if (!isNaN(Number(row1)) && !isNaN(Number(row2))) return row2 - row1;\n else return row2.toString().localeCompare(row1.toString());\n });\n recordsList.value.map((item, index) => {\n if (item.name === t('common.aggregate')) recordsList.value.splice(index, 1);\n return item;\n });\n if (Object.keys(sumData).length > 0) recordsList.value.push(sumData);\n }\n } else {\n // 后端排序\n const fC = (instance?.exposed?.filterConditions as Recordable<any>) || filterConditions || {};\n const fetchFn = (instance?.exposed?.fetch as Fn) || props.tableFetch;\n if (!fetchFn) {\n message(t('table.execSearchWarn'));\n return;\n }\n const oi: Recordable<string> = {};\n\n oi['orderfilter'] = fieldName;\n oi['ordertype'] = sortingType === 'ascending' ? 'asc' : 'desc';\n fC['orderinfo'] = oi;\n const result = await crud.toNewPageSearch(instance, fC, fetchFn, pageInfo.value);\n if (result) {\n resultData.value = result;\n recordsList.value = result.records;\n transRecords();\n }\n }\n\n // 隐藏popover\n popoverVisible.value[fieldName] = false;\n document.body.click();\n };\n\n /**\n * @todo: row dblclick event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-06-08 11:15:41\n * @param {*} row\n * @param {*} column\n * @param {*} event\n */\n const rowDblClick = (row: Recordable<any>, column: TableColumnCtx<Recordable<any>> | null, event: MouseEvent) => {\n const target = event.target as HTMLElement | null;\n if (!target) return;\n // fixme: 屏蔽行中带有icon图标双击事件 2022-12-12\n if (target.tagName === 'I') return;\n else {\n const cell = target.closest('.el-table__cell');\n if (cell && hasClass(cell as HTMLElement, 'el-table__expand-column')) return;\n }\n if (isEditTable === false)\n if (typeof attrs.onRowDblclick === 'function') emit('row-dblclick', row, column, event);\n else {\n const tr = target.closest('.el-table__row');\n if (!tr) return;\n const tds = tr.children;\n let firstBtn: HTMLElement | null = null;\n for (let i = 0; i < tds.length; i++) {\n const btnArr = tds[i].querySelectorAll<HTMLElement>('.cell button.gv-button');\n for (let j = 0; j < btnArr.length; j++) {\n const btn = btnArr[j];\n // fixme: 解决隐藏按钮后双击仍然调用问题 2022-10-09\n if (btn && btn.style.display !== 'none') {\n firstBtn = btn;\n break;\n }\n }\n if (firstBtn) break;\n }\n firstBtn?.click();\n }\n };\n\n /**\n * @todo: 合并表格行或合并列方法\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-08-16 14:27:07\n */\n // const handleSpanMethod = (columnObj) => {\n // props.spanMethod(columnObj);\n // };\n\n // const getSummaries = (param) => {\n // const { columns, data } = param;\n // const sums = [];\n // columns.forEach((column, index) => {\n // if (column.columnKey === 'rownums') {\n // sums[index] = t('common.total');\n // return;\n // }\n // if (column.property === 'multi' || column.columnKey === 'caozuo' || column.columnKey === 'expand') return;\n // const keyIndex = columnSums.indexOf(column.property);\n // if (keyIndex !== -1) {\n // const values = data.map((item) => Number(item[column.property]));\n // if (!values.every((value) => isNaN(value))) {\n // sums[index] = values.reduce((prev, curr) => {\n // const value = Number(curr);\n // if (!isNaN(value)) return prev + curr;\n // else return prev;\n // }, 0);\n // const decimal = columnSumsDecimal[keyIndex];\n // sums[index] = amountFormat(sums[index], decimal);\n // sums[index] += '';\n // } else sums[index] = '';\n // } else return;\n // });\n // return sums;\n // };\n\n /**\n * @todo: 拖动表头改变列宽度响应事件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2024-01-07 10:16:42\n * @param {*} newWidth\n * @param {*} oldWidth\n * @param {*} column\n * @param {*} event\n */\n // const headerDragend = (newWidth, oldWidth, column, event) => {\n // // fixed: 解决fix table 表头列宽度改变时fix列高度不正确问题 2024-01-07\n // nextTick(() => {\n // // fixCellH.style.height = cellH.offsetHeight;\n // this.$refs[this.vref].doLayout();\n // const fixCellH = this.$refs[this.vref].$el.querySelector('.el-table__fixed-header-wrapper>.el-table__header .el-table__cell');\n // const cellH = this.$refs[this.vref].$el.querySelector('.el-table__header-wrapper>.el-table__header .el-table__cell');\n // // console.log(cellH.offsetHeight);\n // fixCellH.style.height = cellH.offsetHeight + 'px';\n // // console.log(fixCellH.style.height);\n // });\n // });\n\n // @watch\n watch(\n () => props.tableHead,\n (newVal, prevVal) => {\n if (newVal.length !== prevVal.length) headColumn.value = getTableColumn();\n else {\n const res = difference(newVal, originTableHead);\n if (res === true) headColumn.value = getTableColumn();\n }\n },\n );\n watch(\n () => sMaxHeight.value,\n () => {\n if (props.tableType !== 'import')\n if (isScrollbar === false)\n if (isAnchor === false) {\n if (sHeight) sMaxHeight.value = sHeight;\n } else sMaxHeight.value = undefined;\n else sMaxHeight.value = undefined;\n },\n );\n watch(\n () => props.tableData,\n (newValue) => {\n resultData.value = newValue;\n },\n );\n\n watch(\n () => resultData.value,\n (newValue) => {\n if (newValue) {\n recordsList.value = newValue.records || newValue;\n // fixme: 解决无法获取结果集时报错问题 2022-06-05\n if (recordsList.value === undefined || recordsList.value.length === undefined) recordsList.value = [];\n if (recordsList.value.length > 0 && recordsList.value[0]['transHash']) {\n transHash = recordsList.value[0]['transHash'];\n recordsList.value.splice(0, 1);\n if (headColumn.value.length === 0) {\n tableHeads.forEach((x: TableHeadItem) => {\n let sProp = x.prop;\n if (sProp && sProp.indexOf('@') > 0) sProp = sProp.split('@')[1];\n if (props.total)\n if (x.sum === true) {\n columnSums.push(sProp);\n columnSumsDecimal.push(x.decimal ? x.decimal : 2);\n x.align = 'right';\n }\n\n const trans: string | undefined = transHash?.[sProp];\n if (trans) {\n const typeArr = trans.split('|');\n switch (typeArr[0]) {\n case 'company':\n x.dicType = 'company';\n break;\n case 'dept':\n x.dicType = 'dept';\n break;\n case 'user':\n x.dicType = 'user';\n break;\n case 'dic':\n x.type = 'dic';\n x.dicType = typeArr[1];\n break;\n case 'division':\n x.type = 'dic';\n x.dicType = 'xzqh';\n break;\n case 'date':\n x.type = 'date';\n x.dateType = typeArr[1];\n break;\n }\n }\n });\n headColumn.value = getTableColumn();\n }\n } else headColumn.value = getTableColumn();\n pageInfo.value = getPageInfo.value;\n // 设置排序方式\n if (pageInfo.value.totalpage > 1) tableSortMode.value = 2;\n else tableSortMode.value = 1;\n // 设置导出按钮状态\n if (recordsList.value && recordsList.value.length > 0) exportBtnDisabled.value = false;\n else exportBtnDisabled.value = true;\n\n // 加载状态\n // this.sDataLoaded = true;\n }\n nextTick(() => {\n // 重新计算\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n getMaxHeight(rootEl);\n\n // add: 增加查询回调方法 2022-11-23\n if (props.tableCb) props.tableCb(recordsList.value, resultData.value);\n tableRef.value?.doLayout();\n });\n },\n );\n\n // @exposed\n expose({\n setTableRef,\n fetch,\n startLoading,\n stopLoading,\n filterConditions,\n });\n\n // @created\n // get localStorage table column\n const loginLang = userStore.language;\n if (loginLang === 'en') lang = 'en';\n originTableHead = JSON.parse(JSON.stringify(props.tableHead));\n // fixme: 初始化时根据结果集赋值pagesize 解决后端设置pageSize后前端无法加载问题 2022-04-30\n // if (this.tableInit === true)\n if (Object.keys(props.tableData).length === 0) headColumnInit.value = getTableColumn('create');\n if (props.tableType === 'expand') {\n sTableSort.value = false;\n sTableBar.value = false;\n } else if (props.tableType === 'detail') headColumnInit.value = getTableColumn();\n if (props.tableData && props.tableData.size) {\n sPageSize = props.tableData.size;\n // 设置排序方式\n if (props.tableData.pages > 1) tableSortMode.value = 2;\n else tableSortMode.value = 1;\n }\n\n // 设置列表按钮以及右上角按钮的全局隐藏或显示\n if (gTableBar === false) {\n sTableSort.value = false;\n sTableKit.value = false;\n sTableBar.value = true;\n }\n\n // set pageSizes\n if (pageSizes.includes(sPageSize) === false) {\n pageSizes.splice(0, 0, sPageSize);\n pageSizes.sort(function (m, n) {\n if (m < n) return -1;\n else if (m > n) return 1;\n else return 0;\n });\n }\n\n if (props.tableType === 'detail') {\n // this.sMaxHeight = '200px';\n pageLayout.value = 'total, prev, pager, next';\n // 设置detail宽度\n sMaxWidth.value = '850px';\n } else if (props.tableType === 'expand') if (!sMaxWidth.value) sMaxWidth.value = '85%';\n // this.pageLayout = 'total, prev, pager, next';\n\n transRecords('create');\n\n // @mounted\n onMounted(() => {\n debounceSearch = debounce(handleTableSearch, 500);\n nextTick(() => {\n const rootEl = instance?.vnode?.el as HTMLElement | undefined;\n window.addEventListener('click', () => {\n closeAllPopover();\n });\n window.addEventListener('resize', () => getMaxHeight(rootEl));\n if (rootEl) {\n const tableBodyWrapper = rootEl.querySelector('.el-table__body-wrapper');\n if (tableBodyWrapper) tableBodyWrapper.addEventListener('scroll', getScrollLeft, false);\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor = true;\n const dialogBody = rootEl.closest('.gv-drawer__body--inner');\n if (dialogBody) isScrollbar = hasScrollbar(dialogBody);\n if (rootEl.closest('.gv-edit__container')) isEditContainer = true;\n }\n });\n });\n\n // @render\n return () => {\n pageInfo.value = getPageInfo.value;\n return props.visible ? (\n <div\n class={props.tableType === 'expand' ? 'gv-table__container gv-table__container-expand' : 'gv-table__container'}\n style={{ width: '100%', minWidth: '0px', maxWidth: sMaxWidth.value }}>\n <GvTableBar visible={sTableBar.value}>{getTableBar()}</GvTableBar>\n {getKitBar()}\n {getTableSearch()}\n {getSortModel()}\n <div\n class=\"gv-table__loading-wrap\"\n v-loading={loading.value}\n element-loading-text=\"Loading...\">\n <ElTable\n ref={vref}\n // element-loading-spinner='iconfont gv-icon-loading'\n data={recordsList.value}\n border={props.tableType === 'detail' ? false : props.border}\n highlight-current-row={true}\n table-layout=\"fixed\"\n style=\"width: 100%\"\n height={sHeight}\n max-height={sMaxHeight.value}\n stripe={true}\n row-key={(row: any) => row.rownums}\n expand-row-keys={props.expandRowKeys}\n row-style={props.rowStyle}\n cell-style={props.cellStyle}\n header-cell-class-name=\"headerStyleEvent\"\n //span-method={handleSpanMethod}\n show-summary={props.total}\n // summary-method={getSummaries}\n // toggleRowSelection\n // on-row-class-name={props.rowClassName} // 设置行class的回调方法\n onSort-change={sortMethod}\n onRow-dblclick={rowDblClick} // 设置行双击事件方法\n // on-row-click={props.handleRowClick} // 设置行单击事件方法\n // on-selection-change={handleSelectionChange} // 设置多选行事件\n // on-expand-change={handleExpandChange} // 行展开异步加载方法\n // on-header-dragend={headerDragend} // 列拖宽度方法\n class={props.tableType === 'detail' ? 'gv-table-noborder' : props.border === true ? `${prefixCls}` : 'gv-table-noborder'}>\n {props.tableData && Object.keys(props.tableData).length > 0 ? headColumn.value : headColumnInit.value}\n </ElTable>\n </div>\n <ElPagination\n style={{ display: props.isShowPage ? '' : 'none' }}\n pageSizes={pageSizes}\n pageSize={pageInfo.value.recordsperpage}\n layout={pageLayout.value}\n total={pageInfo.value.countrows}\n currentPage={pageInfo.value.currentpagenum}\n hideOnSinglePage={true}\n onUpdate:page-size={handleSizeChange}\n onUpdate:current-page={handleCurrentChange}\n class=\"gv-pagination\"></ElPagination>\n </div>\n ) : null;\n };\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n .gv-table__container {\n width: 100%;\n height: calc(100% - 10em);\n margin-top: -2px;\n\n .gv-table__loading-wrap {\n position: relative;\n width: 100%;\n }\n .gv-table__sortmode {\n float: right;\n\n & i {\n padding-right: 15px;\n //font-size: 14px;\n }\n\n :deep(.el-radio) {\n margin-right: 12px;\n\n .el-radio__input {\n &.is-checked {\n .el-radio__inner {\n background: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n\n .el-radio__label {\n //font-size: $tableThFontSize;\n }\n\n .el-radio__input.is-checked + .el-radio__label {\n color: var(--primaryColor, $primaryColor);\n }\n }\n }\n\n .gv-table__kitbar {\n position: relative;\n float: right;\n width: 74px;\n height: 28px;\n margin: 1px 0 0 8px;\n line-height: 28px;\n\n .el-button-group {\n height: 26px;\n line-height: 26px;\n\n .el-button {\n padding: 6px 8px 5px;\n }\n }\n }\n\n .gv-table__search {\n position: relative;\n float: right;\n width: 160px;\n margin-top: 3px;\n\n :deep(.gv-table__search-input) {\n // top: -30px;\n float: right;\n width: 150px;\n .el-input__wrapper {\n height: 28px;\n line-height: 28px;\n }\n .el-input__inner {\n font-size: 12px;\n padding-left: 1px !important;\n }\n }\n }\n\n .gv-table {\n border-top: 1px solid $tableBorderColor;\n border-bottom: 0;\n border-left: 1px solid $tableBorderColor;\n\n :deep(.ascending .sort-caret.ascending) {\n border-bottom-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n :deep(.descending .sort-caret.descending) {\n border-top-color: var(--primaryColorHover, $primaryColorHover);\n }\n\n :deep(.el-table__header-wrapper) {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight;\n line-height: 34px;\n background-color: $tableThBgColor;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 1px solid $tableBorderColor;\n\n .cell {\n padding-right: 3px;\n color: $textColor;\n font-weight: 500 !important;\n .render__header {\n font-weight: 500 !important;\n }\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .is-selected {\n .gv-table-header-filter {\n color: $primaryColor;\n }\n }\n\n .render__header {\n display: inline-flex;\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n }\n }\n }\n }\n\n :deep(.el-table__body-wrapper) {\n .el-table__body {\n .el-table__row.expanded {\n .el-table__cell {\n padding: 2px 0;\n border-bottom: 1px solid $tableBorderColor;\n }\n }\n\n .el-table__expanded-cell {\n padding: 4px 2px 10px 89px;\n }\n\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 0;\n\n // border-bottom:1px solid $tableBorderColor;\n\n .cell {\n // box-sizing: border-box;\n // display: inline-block;\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n .el-button {\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n\n .gv-tag {\n box-sizing: border-box;\n display: inline-block;\n height: 22px;\n padding: 0 5px;\n //font-size: $appTextSize;\n line-height: 22px;\n color: #409eff;\n white-space: nowrap;\n background-color: #ecf5ff;\n border: 1px solid #d9ecff;\n border-radius: 4px;\n }\n }\n }\n\n .gv-cell__render {\n .cell {\n height: auto;\n }\n }\n\n .gv-cell__isedit {\n .cell {\n height: auto;\n padding: 0 5px;\n\n .gv-input {\n height: 25px;\n line-height: 25px;\n\n .el-input__inner {\n height: 25px;\n padding-left: 5px;\n line-height: 25px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-input-number {\n width: 120px;\n height: 25px;\n line-height: 25px;\n\n .el-input-number__decrease,\n .el-input-number__increase {\n height: 23px;\n line-height: 23px;\n }\n\n .el-input__inner {\n height: 25px;\n padding-left: 5px;\n line-height: 25px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-datepicker {\n height: 25px;\n //font-size: $textSizeSecondary;\n line-height: 25px;\n\n .el-input__inner {\n height: 25px;\n padding-right: 25px;\n padding-left: 25px;\n line-height: 25px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n .el-icon-date {\n height: 26px;\n line-height: 26px;\n }\n\n .el-icon-time {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n\n .gv-select {\n vertical-align: inherit !important;\n width: 100%;\n\n .el-input {\n // line-height: 28px;\n // height: 25px;\n\n // height: 28px;\n //font-size: $textSizeSecondary;\n\n // line-height: 25px;\n\n .el-input__inner {\n // height:26px !important;\n padding-right: 25px;\n padding-left: 25px;\n\n // line-height:26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n\n .el-select__tags {\n .el-tag {\n height: 22px;\n margin: 1px 0 1px 6px;\n }\n }\n }\n\n .gv-select__table {\n width: 100%;\n vertical-align: inherit !important;\n .el-input {\n // height: 25px;\n //font-size: $textSizeSecondary;\n\n // line-height: 25px;\n\n .el-input__inner {\n // height:26px;\n padding-right: 25px;\n padding-left: 25px;\n\n // line-height:26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__row:last-child {\n // &.current-row{\n // td.el-table__cell{\n // background-color: var(--defaultHover,$defaultHover);\n // }\n // }\n\n .el-table__cell {\n padding: 2px 0;\n border-bottom: 1px solid $tableBorderColor;\n }\n }\n }\n }\n\n :deep(.el-table__footer-wrapper) {\n .el-table__footer {\n .el-table__cell {\n padding: 2px 0;\n //font-size: $tableThFontSize;\n }\n }\n }\n\n :deep(.el-table__fixed),\n :deep(.el-table__fixed-right) {\n height: 100% !important;\n .el-table__fixed-header-wrapper {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight !important;\n line-height: 34px;\n background-color: $tableThBgColor;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 1px solid $tableBorderColor;\n\n .cell {\n height: 28px;\n font-weight: 500 !important;\n // display: inline-block; // flex\n padding-right: 3px;\n line-height: 28px;\n color: $textColor;\n\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .is-selected {\n .gv-table-header-filter {\n color: $primaryColor;\n }\n }\n\n .render__header {\n display: inline-block; // flex\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n\n .el-checkbox {\n .el-checkbox__input {\n .el-checkbox__inner {\n &:hover {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-checked,\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__fixed-body-wrapper {\n .el-table__body {\n .el-table__row.expanded {\n .el-table__cell {\n padding: 2px 0;\n border-bottom: 1px solid $tableBorderColor;\n }\n }\n\n .el-table__expanded-cell {\n padding: 2px;\n }\n\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n // box-sizing: border-box;\n padding: 2px 0;\n border-right: 1px solid $tableBorderColor;\n border-bottom: 0;\n\n .cell {\n // display: inline-block; // flex\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n // padding-left: 3px;\n .el-button {\n // margin-left: 5px;\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n\n .gv-input {\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .gv-tag {\n box-sizing: border-box;\n\n // display: inline-block;\n height: 24px;\n padding: 0 5px;\n //font-size: $appTextSize;\n line-height: 24px;\n color: #409eff;\n white-space: nowrap;\n background-color: #ecf5ff;\n border: 1px solid #d9ecff;\n border-radius: 4px;\n }\n\n .el-checkbox {\n .el-checkbox__input {\n .el-checkbox__inner {\n &:hover {\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n\n &.is-checked,\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n }\n\n .gv-cell__render {\n .cell {\n height: auto;\n }\n }\n }\n\n .el-table__row:last-child {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n // border-bottom: 1px solid $tableBorderColor;\n }\n }\n }\n }\n\n .el-table__fixed-footer-wrapper {\n .el-table__footer {\n .el-table__cell {\n padding: 2px 0;\n //font-size: $tableThFontSize;\n }\n }\n }\n }\n }\n\n .gv-table-noborder {\n :deep(.el-table__header-wrapper) {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight;\n line-height: 34px;\n\n .cell {\n height: 28px;\n padding-right: 3px;\n line-height: 28px;\n color: $textColor;\n font-weight: 500 !important;\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .render__header {\n display: inline-flex;\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n }\n }\n }\n }\n\n :deep(.el-table__body-wrapper) {\n .el-table__body {\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n\n // border-bottom:1px solid $tableBorderColor;\n\n .cell {\n // box-sizing: border-box;\n // display: inline-block;\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n .el-button {\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n }\n }\n\n .gv-cell__render {\n .cell {\n height: auto;\n }\n }\n\n .gv-cell__isedit {\n .cell {\n height: 28px;\n padding: 0 5px;\n line-height: 28px;\n\n .gv-input {\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n }\n\n .gv-input-number {\n width: 120px;\n\n .el-input-number__decrease,\n .el-input-number__increase {\n height: 23px;\n line-height: 23px;\n }\n\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-datepicker {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n padding-right: 25px;\n padding-left: 25px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n .el-icon-date {\n height: 26px;\n line-height: 26px;\n }\n\n .el-icon-time {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n\n .gv-select {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n\n .gv-select__table {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__row:last-child {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n }\n }\n }\n }\n\n :deep(.el-table__fixed),\n :deep(.el-table__fixed-right) {\n .el-table__fixed-header-wrapper {\n .el-table__header {\n .el-table__cell {\n height: 34px;\n padding: 1px 0;\n //font-size: $tableThFontSize;\n font-weight: $tableThFontWeight !important;\n line-height: 34px;\n\n .cell {\n display: inline-block; // flex\n height: 28px;\n padding-right: 3px;\n line-height: 28px;\n color: $textColor;\n font-weight: 500 !important;\n .caret-wrapper {\n float: right;\n height: 28px;\n line-height: 28px;\n\n .sort-caret.ascending {\n top: 2px;\n }\n\n .sort-caret.descending {\n bottom: 2px;\n }\n }\n\n .render__header {\n display: inline-block; // flex\n height: 28px;\n line-height: 28px;\n\n &:hover {\n cursor: pointer;\n }\n .el-tooltip__trigger {\n font-weight: 500 !important;\n }\n }\n\n .gv-table-header-filter {\n i {\n margin-left: 4px;\n }\n }\n }\n }\n }\n }\n\n .el-table__fixed-body-wrapper {\n .el-table__body {\n .el-table__row {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n // box-sizing: border-box;\n padding: 2px 0;\n\n .cell {\n display: inline-block; // flex\n width: auto;\n height: 28px;\n overflow: hidden;\n //font-size: $tableTdFontSize;\n font-weight: $tableTdFontWeight;\n line-height: 28px;\n color: $tableTdColor;\n word-break: break-all;\n white-space: nowrap;\n\n .el-button {\n height: 26px !important;\n line-height: 26px !important;\n padding: 2px 4px 2px 8px !important;\n }\n\n .gv-table-action-trigger + .gv-table-action-trigger {\n margin-left: 5px;\n }\n\n .gv-table-action-trigger + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .gv-popconfirm {\n margin-left: 5px;\n }\n\n .gv-popconfirm + .el-button {\n margin-left: 5px;\n }\n }\n }\n\n .gv-cell__isedit {\n .cell {\n height: 28px;\n padding: 0 5px;\n line-height: 28px;\n\n .gv-input {\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n }\n\n .gv-input-number {\n width: 120px;\n\n .el-input-number__decrease,\n .el-input-number__increase {\n height: 23px;\n line-height: 23px;\n }\n\n .el-input__inner {\n height: 26px;\n padding-left: 5px;\n line-height: 26px;\n }\n\n .is-error {\n color: #f5222d;\n border-color: #f5222d;\n }\n }\n\n .gv-datepicker {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n padding-right: 25px;\n padding-left: 25px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n .el-icon-date {\n height: 26px;\n line-height: 26px;\n }\n\n .el-icon-time {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n\n .gv-select {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n\n .gv-select__table {\n vertical-align: inherit !important;\n .el-input {\n //font-size: $textSizeSecondary;\n\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\n\n .el-input__prefix {\n left: 0 !important;\n\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n\n .el-input__suffix {\n .el-input__suffix-inner {\n i {\n height: 26px;\n line-height: 26px;\n }\n }\n }\n }\n }\n }\n }\n }\n\n .el-table__row:last-child {\n &.current-row {\n td.el-table__cell {\n background-color: var(--defaultHover, $defaultHover);\n }\n }\n\n .el-table__cell {\n padding: 2px 0;\n\n .cell {\n display: inline-block; // flex\n }\n }\n }\n }\n }\n }\n }\n\n // pageinfo\n :deep(.el-pagination) {\n float: right;\n\n .el-input__inner {\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover) !important;\n }\n\n &:hover {\n border-color: var(--primaryColorHover, $primaryColorHover) !important;\n }\n }\n\n .el-pagination__total {\n left: 15px;\n //font-size: $appTextSize !important;\n // position: absolute;\n margin-right: 20px;\n font-weight: 500;\n color: var(--primaryColor, $primaryColor);\n }\n\n .el-pagination__sizes {\n // position: absolute;\n left: 65px;\n margin: 0px 10px 0 0;\n width: 100px;\n line-height: 28px;\n .el-select {\n width: 100px;\n line-height: 28px;\n .el-select__wrapper {\n //font-size: $appTextSize;\n min-height: 28px;\n }\n .el-input {\n width: 90px;\n\n .el-input__inner {\n height: 25px;\n line-height: 25px;\n }\n }\n }\n }\n\n .btn-prev,\n .btn-next {\n min-width: 25px;\n padding: 0;\n }\n\n .el-pager {\n li.active,\n li:hover {\n color: var(--primaryColor, $primaryColor);\n }\n .is-active number {\n //font-size: $appTextSize;\n }\n .number {\n min-width: 30px;\n //font-size: $appTextSize;\n font-weight: $fontWeight;\n }\n }\n\n .el-pagination__jump {\n .el-pagination__goto {\n //font-size: $appTextSize;\n }\n .el-pagination__classifier {\n //font-size: $appTextSize;\n }\n .el-pagination__editor {\n //font-size: $appTextSize;\n width: 45px;\n\n .el-input__inner {\n height: 24px;\n line-height: 24px;\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTable from './src/GvTable.vue';\n\nconst GvTablePlugin = {\n install(app: App): void {\n app.component(GvTable.name ?? 'GvTable', GvTable);\n },\n};\nexport default GvTablePlugin;\n\nexport { GvTable };\n","<!--\n * @title: tab pane component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:19:18\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-12 10:24:57\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { hasScrollbar } from '@@/utils';\n import { defineComponent, getCurrentInstance, nextTick, onMounted, ref } from 'vue';\n\n // const { getPrefixCls } = useStyle();\n // const prefixCls = getPrefixCls('tab-pane');\n export default defineComponent({\n name: 'GvTabPane',\n props: {\n name: {\n type: String,\n required: false,\n default: undefined,\n },\n label: {\n type: String,\n required: false,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n required: false,\n default: false,\n },\n maxHeight: {\n type: [Number, String],\n required: false,\n default: undefined,\n },\n visible: {\n type: Boolean,\n required: false,\n default: true,\n },\n autoHeight: {\n type: Boolean,\n required: false,\n default: false,\n },\n },\n\n // emit\n emits: ['tab-click'],\n setup(props, { emit, slots }) {\n // @data\n const sMaxHeight = props.maxHeight;\n const isAnchor = ref(false);\n const isScrollbar = ref(false);\n const isEditContainer = ref(false);\n const instance = getCurrentInstance();\n\n // @watch\n // @methods\n\n // @mounted\n onMounted(() => {\n nextTick(() => {\n const rootEl = instance?.proxy?.$el;\n const dialogBody = rootEl.closest('<div className=\"gv\"></div>-drawer__body--inner');\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (rootEl.closest('.gv-edit__container')) isAnchor.value = true;\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n if (rootEl.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (rootEl.closest('.gv-edit__container')) isEditContainer.value = true;\n if (props.autoHeight === false)\n if (isEditContainer.value === false)\n if (isScrollbar.value === false)\n if (isAnchor.value === false)\n if (!sMaxHeight) {\n const tabPane = rootEl;\n const offsetTop = tabPane.classList.contains('el-tabs--left') ? 95 : 165;\n const maxHeight = document.documentElement.clientHeight - rootEl.offsetTop - offsetTop;\n rootEl.style.maxHeight = maxHeight + 'px';\n }\n });\n });\n // @render\n return () => (\n <div\n data-name={props.name}\n data-label={props.label}\n data-disabled={props.disabled}\n style={{ overflow: 'hidden auto', maxHeight: `${props.maxHeight}` }}>\n {slots.default?.()}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tab-pane';\n .#{$prefixCls} {\n }\n</style>\n","import type { App } from 'vue';\nimport GvTabPane from './src/GvTabPane.vue';\n\nconst GvTabsPlugin = {\n install(app: App): void {\n app.component(GvTabPane.name ?? 'GvTabPane', GvTabPane);\n },\n};\nexport default GvTabsPlugin;\n\nexport { GvTabPane };\n","<!--\n * @title: tabs component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 09:50:50\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:54:16\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { hasScrollbar } from '@@/utils';\n import { ElTabPane, ElTabs } from 'element-plus';\n import { defineComponent, getCurrentInstance, nextTick, onMounted, ref, watch, type PropType, type VNode } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tabs');\n export default defineComponent({\n name: 'GvTabs',\n props: {\n tabPosition: {\n type: String,\n default: 'left',\n },\n value: {\n type: [Number, String] as PropType<number | string>,\n default: undefined,\n },\n type: {\n type: String as PropType<'card' | 'border-card'>,\n default: undefined, // card|border-card\n },\n closable: {\n type: Boolean,\n default: false,\n },\n tabMaxHeight: {\n type: [Number, String],\n default: undefined,\n },\n },\n\n // emit\n emits: ['tab-click'],\n setup(props, { emit, slots }) {\n // @data\n const inputValue = ref(props.value);\n const tabHeight = ref('auto');\n const isAnchor = ref(false);\n const isScrollbar = ref(false);\n const panes = ref([]);\n const isEditContainer = ref(false);\n const instance = getCurrentInstance();\n\n // @watch\n watch(\n () => props.value,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\n // @methods\n /**\n * @todo: 点击tab页响应事件\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-09 09:16:37\n * @param {*} tabVm 被选中tab页实例\n */\n const handleTabClick = (tabVm) => {\n const props = tabVm.props;\n const parent = tabVm.parent;\n const tabName = props.name;\n if (tabName) parent.props.value = tabName;\n emit('tab-click', tabVm);\n };\n\n /**\n * @todo: created tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-12 10:05:03\n */\n const calcPaneInstances = () => {\n if (panes.value.length === 0)\n if (slots.default?.())\n slots.default?.().forEach((vnode) => {\n if (vnode && typeof vnode.type === 'object' && 'name' in vnode.type && vnode.type.name === 'GvTabPane') {\n const tabPane = {};\n const props = vnode.props;\n tabPane['label'] = props?.label;\n tabPane['name'] = props?.name;\n tabPane['autoHeight'] = isEditContainer.value;\n let visible = true;\n if (props?.visible === false) visible = false;\n tabPane['visible'] = visible;\n (panes.value as any[]).push(tabPane);\n }\n });\n return panes.value || [];\n };\n /**\n * @todo: 创建tabpanel\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-03 16:30:54\n */\n const createTabPane = () =>\n calcPaneInstances().map((vnode: VNode, index) => {\n const props = vnode.props;\n // console.log(vnode.name);\n return props?.visible ? (\n <ElTabPane\n // v-show={vnode.visible}\n ref=\"tabPane\"\n name={props?.name}\n label={props?.label}\n style={{ height: `${tabHeight.value} !important` }}>\n {slots.default?.()[index]}\n </ElTabPane>\n ) : null;\n });\n\n // @mounted\n onMounted(() => {\n nextTick(() => {\n const rootEl = instance?.proxy?.$el as HTMLElement | undefined;\n const dialogBody = rootEl?.closest('.gv-drawer__body--inner');\n if (dialogBody) isScrollbar.value = hasScrollbar(dialogBody);\n else {\n const dialogContainer = rootEl?.closest('.gv-container');\n if (dialogContainer) isScrollbar.value = hasScrollbar(dialogContainer);\n }\n if (rootEl?.closest('.gv-anchor-wrap')) isAnchor.value = true;\n if (rootEl?.closest('.gv-edit__container')) isEditContainer.value = true;\n if (!isEditContainer.value)\n if (isScrollbar.value === false)\n if (isAnchor.value === false) {\n // 设置tab页高度\n const drawer = rootEl?.closest('.gv-drawer');\n if (drawer) tabHeight.value = 'auto';\n // const tp = this.tabPosition === 'left' ? 170 : 230;\n // this.tabHeight = document.documentElement.clientHeight - this.$el.offsetTop - tp + 'px';\n else {\n const dialog = rootEl?.closest('.gv-dialog');\n if (dialog) tabHeight.value = 'auto';\n // const tp = this.tabPosition === 'left' ? 170 : 230;\n // this.tabHeight = document.documentElement.clientHeight - this.$el.offsetTop - tp + 'px';\n else {\n const h = document.documentElement.clientHeight - (rootEl?.offsetTop ?? 0) - 55;\n if (h < 384) tabHeight.value = '384px';\n else tabHeight.value = h + 'px';\n }\n }\n }\n });\n });\n // @render\n return () => (\n <ElTabs\n ref=\"gv-tabs\"\n v-model={inputValue.value}\n tab-position={props.tabPosition}\n type={props.type}\n closable={props.closable}\n on-tab-click={handleTabClick}\n class={prefixCls}>\n {createTabPane()}\n </ElTabs>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tabs';\n .#{$prefixCls} {\n :deep(.el-tabs__header) {\n &.is-top {\n margin: 0 0 6px;\n }\n\n .el-tabs__nav {\n .el-tabs__active-bar {\n background-color: var(--primaryColor, $primaryColor);\n }\n\n .el-tabs__item {\n //font-size: $appTextSize;\n\n &:hover {\n color: var(--primaryColor, $primaryColor);\n }\n\n &.is-active {\n color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTabs from './src/GvTabs.vue';\n\nconst GvTabsPlugin = {\n install(app: App): void {\n app.component(GvTabs.name ?? 'GvTabs', GvTabs);\n },\n};\nexport default GvTabsPlugin;\n\nexport { GvTabs };\n","import type { App } from 'vue';\nimport GvTag from './src/GvTag.vue';\n\nconst GvTagPlugin = {\n install(app: App): void {\n app.component(GvTag.name ?? 'GvTag', GvTag);\n },\n};\nexport default GvTagPlugin;\n\nexport { GvTag };\n","<!--\n * @title: navigation tags view\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-20 10:57:41\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 18:00:46\n * @version: 1.0.5\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { usePermsStore } from '@/store/modules/perms';\n import { useTagsViewStore } from '@/store/modules/tagsView';\n import { useBridgeI18n } from '@@/bridge';\n import { joinIcon, pathResolve } from '@@/utils';\n import { useEventListener } from '@vueuse/core';\n import { ElTabPane, ElTabs } from 'element-plus';\n import { cloneDeep } from 'lodash-es';\n import { computed, defineComponent, nextTick, onMounted, reactive, ref, unref, watch } from 'vue';\n import { useRouter, type RouteLocationNormalizedLoaded } from 'vue-router';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tags-view');\n export default defineComponent({\n name: 'GvTagsView',\n setup() {\n const visible = ref(false);\n const position = reactive({ x: 0, y: 0 });\n const currentKey = ref('');\n\n const { currentRoute, push, replace } = useRouter();\n const activeKey = ref<string>(unref(currentRoute).path || '/dashboard');\n const { t } = useBridgeI18n();\n const tagsViewStore = useTagsViewStore();\n const permsStore = usePermsStore();\n\n const visitedViews = computed(() => tagsViewStore.visitedViews);\n const mainAppRoutes = computed(() => permsStore.mainAppRoutes);\n\n const isRedirect = (path: string) => path.startsWith('/redirect');\n const isActive = (route) => route.path === unref(currentRoute).path;\n const isAffix = (tag) => tag.meta && tag.meta.affix;\n\n /**\n * @todo: filter affix nav menus\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 11:39:08\n * @param {*} mainAppRoutes\n * @param {*} basePath\n */\n const filterAffixNavMenus = (navMenus, basePath = '/'): RouteLocationNormalizedLoaded[] => {\n const affixTags: RouteLocationNormalizedLoaded[] = [];\n // console.log('navMenus:', navMenus.value);\n navMenus.value.forEach((route) => {\n if (route.meta && route.meta.affix === true) {\n const tagPath = pathResolve(basePath, route.path);\n affixTags.push({\n fullPath: tagPath,\n path: tagPath,\n name: route.name,\n meta: route.meta,\n matched: [],\n params: {},\n query: {},\n hash: '',\n redirectedFrom: undefined,\n });\n }\n });\n return affixTags;\n };\n /**\n * @todo: add affix tags\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 11:45:26\n */\n const addAffixTags = () => {\n const affixTags = filterAffixNavMenus(mainAppRoutes);\n\n for (const tagView of affixTags) if (tagView.name) tagsViewStore.addVisitedView(tagView);\n };\n /**\n * @todo: create tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:36:56\n */\n const createTabPanel = () =>\n visitedViews.value.map((v) => {\n const icons = joinIcon(v.meta?.picon);\n const closable = visitedViews.value.length > 1;\n const title = t(v.meta?.title ?? 'no-name');\n return (\n <ElTabPane\n key={String(v.path)}\n name={String(v.path)}\n label={title}\n closable={closable}>\n {{\n label: () => (\n <span class=\"tab-label\">\n {icons && <i class={icons}></i>}\n {title}\n </span>\n ),\n }}\n </ElTabPane>\n );\n });\n\n /**\n * @todo: show right context menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 17:22:53\n * @param {*} key\n */\n const showContextMenu = (key: string) => {\n currentKey.value = key;\n visible.value = true;\n };\n /**\n * @todo: close right context menu\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:31:06\n */\n const closeContextMenu = () => {\n visible.value = false;\n };\n /**\n * @todo: jump to link route\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-21 11:25:08\n * @param {*} routePath\n */\n const toLink = (routePath: string) => {\n const targetView = visitedViews.value.find((v) => v.path === routePath);\n activeKey.value = routePath || '/dashboard';\n\n if (targetView)\n // 使用完整的 route 对象跳转,保留 query 参数\n push({\n path: targetView.path,\n query: targetView.query || {},\n });\n else push({ path: routePath, query: {} });\n };\n /**\n * @todo: jump to last tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:31:01\n * @param {*} visitedView\n * @param {*} currentView\n */\n const toLastView = (visitedView: RouteLocationNormalizedLoaded[], currentView: RouteLocationNormalizedLoaded) => {\n const latestView = visitedView.slice(-1)[0];\n if (visitedView) {\n activeKey.value = latestView.path;\n push(latestView.path);\n } else if (currentView.name === 'Dashboard') replace({ path: '/redirect' + currentView.path });\n else push('/');\n };\n /**\n * @todo: add menu tab\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-11-21 10:27:35\n */\n const addNavMenu = () => {\n const name = currentRoute.value.name;\n if (name) tagsViewStore.addTagView(currentRoute.value);\n };\n\n const moveToCurrentTag = (view: RouteLocationNormalizedLoaded) => {\n // toLink(view.path);\n };\n\n /**\n * @todo: click tab event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 12:08:48\n * @param {*} tab\n */\n const clickTab = (tab) => {\n toLink(tab.props.name);\n };\n /**\n * @todo: close current tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:56:44\n * @param {*} targetKey\n */\n const closeCurrentTag = async (targetKey) => {\n const view = visitedViews.value.filter((view) => view.path === targetKey);\n if (isAffix(view[0])) return;\n\n await tagsViewStore.delTagView({ view: view[0] });\n\n // 清除缓存的search条件\n // currentRoute.value.meta.search = {};\n // 判断是否是当前标签页关闭\n if (isActive(view[0])) toLastView(visitedViews.value, view[0]);\n };\n /**\n * @todo: refresh selected tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:40:45\n */\n const refreshSelectedTag = async () => {\n tagsViewStore.delCachedView(unref(currentRoute));\n const { path, query } = unref(currentRoute);\n await nextTick();\n replace({\n path: '/redirect' + path,\n query: query,\n });\n };\n const findCurTagIndex = () => visitedViews.value.findIndex((x) => x.path === currentKey.value);\n /**\n * @todo: close right/left tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 10:42:33\n * @param {*} direction\n */\n const closeTagsOrientation = (direction) => {\n const index = findCurTagIndex();\n if (index === -1) return;\n let isClosed = false;\n const vV = cloneDeep(visitedViews.value);\n vV.map(({ path }, i) => {\n if (direction === 'right' && i > index) {\n if (path === unref(activeKey)) isClosed = true;\n closeCurrentTag(path);\n } else if (direction === 'left' && i < index) {\n if (path === unref(activeKey)) isClosed = true;\n closeCurrentTag(path);\n }\n });\n // 跳转至当前页\n if (isClosed) toLink(unref(currentKey));\n };\n /**\n * @todo: close other tabs\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 11:04:12\n */\n const closeOthersTags = () => {\n const index = findCurTagIndex();\n if (index === -1) return;\n push(currentKey.value);\n\n tagsViewStore.delOthersViews(currentRoute.value).then(() => {\n moveToCurrentTag(unref(currentRoute));\n });\n };\n\n watch(\n () => [currentRoute.value.path, currentRoute.value.name],\n ([path, name], [, oldName]) => {\n // if /redirect\n if (isRedirect(path as string)) return;\n // 当前选中tab页\n activeKey.value = (path as string) || '/dashboard';\n // del notify msg\n if (oldName !== name) {\n const alertObj = document.body.querySelector('body>.el-notification');\n if (alertObj) alertObj.remove();\n }\n addNavMenu();\n // moveToCurrentTag(currentRoute.value);\n },\n );\n\n /**\n * @todo: bind right click event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-28 15:28:28\n */\n const tagsViewEl = ref<HTMLElement | null>(null);\n useEventListener(tagsViewEl, 'contextmenu', (ev: MouseEvent) => {\n ev.preventDefault();\n\n let targetNode: HTMLElement | null = null;\n const el = ev.target as HTMLElement;\n\n if (el.tagName === 'SPAN') targetNode = el.parentElement;\n else targetNode = el;\n\n if (targetNode?.classList.contains('el-tabs__item')) {\n const path = targetNode?.getAttribute('aria-controls')?.replace(/^pane-/, '') || '';\n if (path !== unref(currentRoute).path) toLink(path);\n\n position.x = ev.clientX || ev.pageX;\n position.y = ev.clientY || ev.pageY;\n\n showContextMenu(path);\n }\n });\n /**\n * @todo: close context menu on window click\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-01-29 09:39:46\n */\n useEventListener(window, 'click', () => {\n closeContextMenu();\n });\n\n // mounted hooks\n onMounted(() => {\n addAffixTags();\n addNavMenu();\n });\n return () => (\n <div\n ref={tagsViewEl}\n class={[prefixCls, 'flex w-full relative bg-[#fff] dark:bg-[var(--el-bg-color)']}>\n <ElTabs\n class=\"multi-tab\"\n type=\"card\"\n modelValue={activeKey.value}\n onUpdate:modelValue={(v: string) => (activeKey.value = v)}\n onTabClick={clickTab}\n onTabRemove={closeCurrentTag}>\n {createTabPanel()}\n </ElTabs>\n {visible.value && (\n <ul\n class=\"tagsView-contextmenu\"\n style={{ left: `${position.x + 10}px`, top: `${position.y - 10}px` }}>\n <li onClick={refreshSelectedTag}>{t('tagsView.refresh')}</li>\n {currentKey.value !== '/dashboard' && visitedViews.value.length === 2 && <li onClick={() => closeCurrentTag(currentKey.value)}>{t('tagsView.close')}</li>}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 1 && findCurTagIndex() < visitedViews.value.length - 1 && (\n <li onClick={() => closeTagsOrientation('right')}>{t('tagsView.closeRight')}</li>\n )}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 2 && findCurTagIndex() > 1 && <li onClick={() => closeTagsOrientation('left')}>{t('tagsView.closeLeft')}</li>}\n {currentKey.value === '/dashboard' && visitedViews.value.length > 1 && <li onClick={closeOthersTags}>{t('tagsView.closeOthers')}</li>}\n {currentKey.value !== '/dashboard' && visitedViews.value.length > 2 && <li onClick={closeOthersTags}>{t('tagsView.closeOthers')}</li>}\n </ul>\n )}\n </div>\n );\n },\n });\n</script>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tags-view';\n\n .#{$prefixCls} {\n user-select: none; // 禁止选中文本\n\n .multi-tab {\n width: 100%;\n position: relative;\n :deep(.el-tabs__header) {\n margin: 0;\n border-bottom-color: $borderColor;\n height: 34px;\n line-height: 34px;\n .el-tabs__nav {\n border-color: $borderColor;\n .el-tabs__item {\n height: 34px; // 38px\n line-height: 34px; // 38px\n padding: 2px 10px 0 10px; // 0 10px\n //font-size: $textSize;\n border-left-color: $borderColor;\n\n &.is-active {\n & > span {\n font-weight: $fontWeight2;\n }\n color: var(--primaryColor, $primaryColor);\n }\n &:focus.is-focus:not(:active) {\n box-shadow: 0 0 1px 1px inset;\n }\n > span {\n font-weight: 500;\n > i {\n padding-right: 5px;\n //font-size: $textSize;\n }\n }\n }\n }\n .is-scrollable {\n .el-tabs__nav-next,\n .el-tabs__nav-prev {\n line-height: 42px;\n }\n\n i {\n font-size: 18px;\n color: rgba(0, 0, 0, 0.95);\n }\n }\n }\n .el-tabs__content {\n display: none !important;\n }\n }\n :deep(.tagsView-contextmenu) {\n position: fixed;\n top: $navHeadHeight;\n left: 300px;\n z-index: 9999;\n min-width: 90px;\n padding: 6px 0;\n list-style: none;\n background-color: #fff;\n border: 1px solid $borderColorSecondary;\n border-radius: $borderRadius;\n box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);\n li {\n line-height: 27px;\n padding: 0 15px;\n //font-size: $appTextSize;\n &:hover,\n &:focus {\n background-color: $backgroundColor;\n color: var(--primaryColorHover, $primaryColorHover);\n cursor: pointer;\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTagsView from './src/GvTagsView.vue';\n// Define the install method on the GvExpandMenu component\nconst GvTagsViewPlugin = {\n install(app: App): void {\n app.component(GvTagsView.name ?? 'GvTagsView', GvTagsView);\n },\n};\nexport default GvTagsViewPlugin;\n\nexport { GvTagsView };\n","<!--\n * @title: theme switcher\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-08-14 10:17:38\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-18 15:04:37\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { ElDropdown, ElDropdownItem, ElDropdownMenu } from 'element-plus';\n import { computed } from 'vue';\n import { propTypes } from '../../utils/gv.propTypes';\n\n defineOptions({\n name: 'GvTheme',\n inheritAttrs: true,\n });\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('theme');\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const appStore = useAppStore();\n const themeOptions = computed(() => appStore.getSwitchTheme);\n const currentTheme = computed(() => appStore.getCurrentTheme);\n\n const handleSetTheme = () => {\n //appStore.setTheme(theme);\n };\n</script>\n<template>\n <ElDropdown\n trigger=\"click\"\n :class=\"prefixCls\"\n @command=\"handleSetTheme\">\n <div>\n <GvIcon\n class=\"international-icon\"\n iconName=\"theme\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item of themeOptions\"\n :key=\"item.value\"\n :disabled=\"currentTheme === item.value\"\n :command=\"item.value\">\n {{ item.label }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-theme';\n .#{$prefixCls} {\n display: inline-block;\n line-height: var(--right-item-line-height);\n height: var(--right-item-height);\n vertical-align: 10px;\n cursor: pointer;\n fill: #5a5e66;\n }\n</style>\n","import type { App } from 'vue';\nimport GvTheme from './src/GvTheme.vue';\nconst GvThemePlugin = {\n install(app: App): void {\n app.component(GvTheme.name ?? 'GvTheme', GvTheme);\n },\n};\nexport default GvThemePlugin;\n\nexport { GvTheme };\n","<!--\n * @title: tree component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-09 16:57:41\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-06-08 17:54:23\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n\n<script lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElTree } from 'element-plus';\n import type { Node } from 'element-plus/es/components/tree/src/model/node';\n import type { FilterNodeMethodFunction, LoadFunction, RenderContentFunction, TreeComponentProps, TreeNodeData } from 'element-plus/es/components/tree/src/tree.type';\n import { defineComponent, type ComponentInternalInstance, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('tree');\n\n type TreeData = Record<string, unknown>;\n\n export default defineComponent({\n name: 'GvTree',\n props: {\n treeData: {\n type: Array as PropType<TreeData[]>,\n default: () => [],\n },\n treeProps: {\n type: Object as PropType<TreeComponentProps['props']>,\n default: () => ({}),\n },\n nodeKey: {\n type: String,\n default: undefined,\n },\n lazy: {\n type: Boolean,\n default: false,\n },\n load: {\n type: Function as PropType<LoadFunction>,\n default: undefined,\n },\n showCheckbox: {\n type: Boolean,\n default: false,\n },\n draggable: {\n type: Boolean,\n default: false,\n },\n defaultExpandedKeys: {\n type: Array as PropType<(string | number)[]>,\n default: () => [],\n },\n defaultCheckedKeys: {\n type: Array as PropType<(string | number)[]>,\n default: () => [],\n },\n iconClass: {\n type: String,\n default: undefined,\n },\n defaultExpandAll: {\n type: Boolean,\n default: false,\n },\n expandOnClickNode: {\n type: Boolean,\n default: true,\n },\n checkOnClickNode: {\n type: Boolean,\n default: false,\n },\n filterNodeMethod: {\n type: Function as PropType<FilterNodeMethodFunction>,\n default: undefined,\n },\n renderContent: {\n type: Function as PropType<RenderContentFunction>,\n default: undefined,\n },\n },\n\n // @emits\n emits: ['node-click', 'node-expand', 'node-collapse', 'check', 'check-change', 'node-drop'],\n\n setup(props, { emit }) {\n // @methods\n\n const handleNodeClick = (data: TreeData, node: Node, treeNode: ComponentInternalInstance | null, event: MouseEvent) => {\n emit('node-click', data, node, treeNode, event);\n };\n\n const handleNodeExpand = (data: TreeData, node: Node, treeNode: ComponentInternalInstance | null) => {\n emit('node-expand', data, node, treeNode);\n };\n\n const handleNodeCollapse = (data: TreeData, node: Node, treeNode: ComponentInternalInstance | null) => {\n emit('node-collapse', data, node, treeNode);\n };\n\n const handleCheck = (\n data: TreeData,\n checkedInfo: {\n checkedNodes: TreeNodeData[];\n checkedKeys: (string | number)[];\n halfCheckedNodes: TreeNodeData[];\n halfCheckedKeys: (string | number)[];\n },\n ) => {\n emit('check', data, checkedInfo);\n };\n\n const handleCheckChange = (data: TreeData, checked: boolean, childChecked: boolean) => {\n emit('check-change', data, checked, childChecked);\n };\n\n const handleLazyLoad: LoadFunction = (...args) => {\n props.load?.(...args);\n };\n\n const handleNodeDrop = (draggingNode: Node, dropNode: Node, dropType: 'before' | 'after' | 'inner', event: DragEvent) => {\n emit('node-drop', draggingNode, dropNode, dropType, event);\n };\n\n // @render\n return () => (\n <ElTree\n ref=\"gv-tree\"\n data={props.treeData}\n props={props.treeProps}\n nodeKey={props.nodeKey}\n lazy={props.lazy}\n load={handleLazyLoad}\n draggable={props.draggable}\n showCheckbox={props.showCheckbox}\n defaultExpandedKeys={props.defaultExpandedKeys}\n defaultCheckedKeys={props.defaultCheckedKeys}\n icon={props.iconClass}\n highlightCurrent\n defaultExpandAll={props.defaultExpandAll}\n expandOnClickNode={props.expandOnClickNode}\n checkOnClickNode={props.checkOnClickNode}\n filterNodeMethod={props.filterNodeMethod}\n renderContent={props.renderContent}\n class={prefixCls}\n onNode-click={handleNodeClick}\n onNode-expand={handleNodeExpand}\n onNode-collapse={handleNodeCollapse}\n onNode-drop={handleNodeDrop}\n onCheck={handleCheck}\n onCheck-change={handleCheckChange}\n />\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-tree';\n .#{$prefixCls} {\n :deep(.el-tree-node) {\n .el-tree-node__content {\n .el-tree-node__label {\n //font-size: $appTextSize;\n }\n .el-checkbox__input {\n &.is-checked {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n &.is-indeterminate {\n .el-checkbox__inner {\n background-color: var(--primaryColor, $primaryColor);\n border-color: var(--primaryColor, $primaryColor);\n }\n }\n }\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTree from './src/GvTree.vue';\n\nconst GvTreePlugin = {\n install(app: App): void {\n app.component(GvTree.name ?? 'GvTree', GvTree);\n },\n};\nexport default GvTreePlugin;\n\nexport { GvTree };\n","/*\r\n * @title: encrypt\r\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\r\n * @Date: 2023-12-16 08:07:24\r\n * @LastEditors: andy.ten@tom.com\r\n * @LastEditTime: 2025-04-07 13:54:00\r\n * @version: 1.0.1\r\n * @copyright: copyright (c) 2025 Andy Xu\r\n * node: you can not copy and/or use and/or modify this program free,\r\n * please reserve the segment above.Please mail me if you have any question.\r\n */\r\n\r\nimport CryptoJS from 'crypto-js';\r\nexport const key = 'abcdefgabcdefg12';\r\nexport const encrypt = (word: any): string => {\r\n const keyStr = CryptoJS.enc.Utf8.parse(key);\r\n let ww;\r\n if (typeof word === 'object') ww = JSON.stringify(word);\r\n else ww = word;\r\n const srcs = CryptoJS.enc.Utf8.parse(ww);\r\n const encrypted = CryptoJS.AES.encrypt(srcs, keyStr, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });\r\n return encrypted.toString();\r\n};\r\nexport const decrypt = (word: string): any => {\r\n const keyStr = CryptoJS.enc.Utf8.parse(key);\r\n const decrypt = CryptoJS.AES.decrypt(word, keyStr, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });\r\n return CryptoJS.enc.Utf8.stringify(decrypt).toString();\r\n};\r\n// Randomly generate a specified number of hexadecimal keys\r\nexport const generateKey = (num: number): string => {\r\n const library = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let key = '';\r\n for (let i = 0; i < num; i++) {\r\n const randomPoz = Math.floor(Math.random() * library.length);\r\n key += library.substring(randomPoz, randomPoz + 1);\r\n }\r\n return key;\r\n};\r\n","/*\n * @title: package lib entry\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2024-11-28 18:18:44\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-28 09:22:01\n * @version: 1.1.2\n * @copyright: copyright (c) 2024 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport type { Pinia } from 'pinia';\nimport { setActivePinia } from 'pinia';\nimport 'uno.css'; // 引入 UnoCSS 样式\nimport type { App } from 'vue';\nimport type { Composer } from 'vue-i18n';\n\nimport { setBridgeContext } from './bridge';\nimport GvBacktopPlugin, { GvBacktop } from './GvBacktop';\nimport GvBadgePlugin, { GvBadge } from './GvBadge';\nimport GvBreadCrumbPlugin, { GvBreadCrumb } from './GvBreadCrumb';\nimport GvButtonPlugin, { GvButton } from './GvButton';\nimport GvCardPlugin, { GvCard } from './GvCard';\nimport GvCascaderPlugin, { GvCascader } from './GvCascader';\nimport GvCheckboxPlugin, { GvCheckbox } from './GvCheckbox';\nimport GvCheckboxButtonPlugin, { GvCheckboxButton } from './GvCheckboxButton';\nimport GvCheckboxGroupPlugin, { GvCheckboxGroup } from './GvCheckboxGroup';\nimport GvColPlugin, { GvCol } from './GvCol';\nimport GvDatePickerPlugin, { GvDatePicker } from './GvDatePicker';\nimport GvDialogPlugin, { GvDialog } from './GvDialog';\nimport GvDividerPlugin, { GvDivider } from './GvDivider';\nimport GvDrawerPlugin, { GvDrawer } from './GvDrawer';\nimport GvExpandMenuPlugin, { GvExpandMenu } from './GvExpandMenu';\nimport GvFormPlugin, { GvForm } from './GvForm';\nimport GvHamburgerPlugin, { GvHamburger } from './GvHamburger';\nimport GvIconPlugin, { GvIcon } from './GvIcon';\nimport GvInputPlugin, { GvInput } from './GvInput';\nimport GvInputNumberPlugin, { GvInputNumber } from './GvInputNumber';\nimport GvLangSelectPlugin, { GvLangSelect } from './GvLangSelect';\nimport GvPopconfirmPlugin, { GvPopconfirm } from './GvPopconfirm';\nimport GvPopoverPlugin, { GvPopover } from './GvPopover';\nimport GvRadioPlugin, { GvRadio } from './GvRadio';\nimport GvRadioButtonPlugin, { GvRadioButton } from './GvRadioButton';\nimport GvRadioGroupPlugin, { GvRadioGroup } from './GvRadioGroup';\nimport GvRowPlugin, { GvRow } from './GvRow';\nimport GvScreenFullPlugin, { GvScreenFull } from './GvScreenFull';\nimport GvSearchBarPlugin, { GvSearchBar } from './GvSearchBar';\nimport GvSelectPlugin, { GvSelect } from './GvSelect';\nimport GvSidebarPlugin, { GvSidebar } from './GvSidebar';\nimport GvSidebarLogoPlugin, { GvSidebarLogo } from './GvSidebarLogo';\nimport GvSwitchPlugin, { GvSwitch } from './GvSwitch';\nimport GvTablePlugin, { GvTable } from './GvTable';\nimport GvTabPanePlugin, { GvTabPane } from './GvTabPane';\nimport GvTabsPlugin, { GvTabs } from './GvTabs';\nimport GvTagPlugin, { GvTag } from './GvTag';\nimport GvTagsViewPlugin, { GvTagsView } from './GvTagsView';\nimport GvThemePlugin, { GvTheme } from './GvTheme';\nimport GvTimePickerPlugin, { GvTimePicker } from './GvTimePicker';\nimport GvTreePlugin, { GvTree } from './GvTree';\nconst components = [\n GvRowPlugin,\n GvColPlugin,\n GvInputPlugin,\n GvButtonPlugin,\n GvPopconfirmPlugin,\n GvIconPlugin,\n GvInputNumberPlugin,\n GvCascaderPlugin,\n GvSwitchPlugin,\n GvRadioButtonPlugin,\n GvCheckboxButtonPlugin,\n GvRadioGroupPlugin,\n GvBadgePlugin,\n GvTabPanePlugin,\n GvTabsPlugin,\n GvDrawerPlugin,\n GvCardPlugin,\n GvTablePlugin,\n GvPopoverPlugin,\n GvRadioPlugin,\n GvSelectPlugin,\n GvTimePickerPlugin,\n GvCheckboxGroupPlugin,\n GvCheckboxPlugin,\n GvTagPlugin,\n GvTreePlugin,\n GvFormPlugin,\n GvLangSelectPlugin,\n GvBacktopPlugin,\n GvBreadCrumbPlugin,\n GvHamburgerPlugin,\n GvScreenFullPlugin,\n GvSearchBarPlugin,\n GvSidebarPlugin,\n GvSidebarLogoPlugin,\n GvThemePlugin,\n GvDialogPlugin,\n GvExpandMenuPlugin,\n GvTagsViewPlugin,\n GvDividerPlugin,\n GvDatePickerPlugin,\n];\n\nexport type GuavaUIOptions = {\n store: Pinia;\n i18n: Composer;\n};\n\nexport const install = (app: App, options: GuavaUIOptions) => {\n if ((install as any).INSTALLED) return;\n (install as any).INSTALLED = true;\n\n setActivePinia(options.store);\n setBridgeContext(options);\n\n components.forEach((c) => c.install(app));\n};\n\nconst GuavaUI = { install };\n\n// 🔹 按需导出组件\nexport {\n GvBacktop,\n GvBadge,\n GvBreadCrumb,\n GvButton,\n GvCard,\n GvCascader,\n GvCheckbox,\n GvCheckboxButton,\n GvCheckboxGroup,\n GvCol,\n GvDatePicker,\n GvDialog,\n GvDivider,\n GvDrawer,\n GvExpandMenu,\n GvForm,\n GvHamburger,\n GvIcon,\n GvInput,\n GvInputNumber,\n GvLangSelect,\n GvPopconfirm,\n GvPopover,\n GvRadio,\n GvRadioButton,\n GvRadioGroup,\n GvRow,\n GvScreenFull,\n GvSearchBar,\n GvSelect,\n GvSidebar,\n GvSidebarLogo,\n GvSwitch,\n GvTable,\n GvTabPane,\n GvTabs,\n GvTag,\n GvTagsView,\n GvTheme,\n GvTimePicker,\n GvTree,\n};\n\n// 🔹 hooks / utils\nexport { crud } from '@@/utils/gv.crud';\n// export * from './hooks/web/useNotify';\nexport * from './hooks/web/usePinyin';\nexport * from './hooks/web/useStorage';\nexport * from './utils/gv.notify';\nexport * from './utils/gv.propTypes';\nexport * from './utils/gv.secret';\nexport * from './utils/gv.tree';\nexport * from './utils/index';\n\n// 🔹 默认导出统一安装对象\nexport { GuavaUI };\n"],"names":["globalBridgeKey","getBridge","g","setBridgeContext","ctx","useBridgeI18n","i18n","getPrefixCls","variables","useStyle","prefixCls","_createBlock","_unref","ElBacktop","GvBacktopPlugin","app","GvBacktop","_sfc_main$F","name","props","vref","type","String","default","value","Number","max","isDot","Boolean","hidden","showZero","color","setup","slots","_createVNode","ElBadge","_export_sfc","sfc","GvBadgePlugin","_a","GvBadge","toString","is","val","isExternal","path","isString","isArray","isError","isObject","isDate","isNumber","isBoolean","isFunction","isElement","isMap","isImgPath","isDark","isNull","isEmpty","isEqual","a","b","i","keysA","keysB","key","isUrl","e","setHtmlAttrByLang","locale","sleep","timeLen","__async","resolve","toHump","all","letter","toLine","setDomCssProp","prop","dom","getDomCssProp","joinIcon","icon","joinIcons","hasClass","ele","cls","addClass","removeClass","reg","hasScrollbar","tag","dateFormatConfig","debounce","func","wait","immediate","timeout","arg","context","timestamp","result","later","last","args","callNow","getVNodeText","vnode","item","getVNodeName","removeAmountFormat","zeroFormat","numberFormat","pattern","oldVal","_nfPattern","strAry","p1","len","p2","ret","ch","p3","len2","amountFormat","decimal","v","decimalPattern","setQuickKeys","ev","btnHtml","inputHtml","messageConfirmHtml","bodyDialogHtml","dialogArr","buttonHtml","buttonDHtml","pathResolve","parentPath","childPath","preNameSpace","attrs","useAttrs","__props","isLocal","computed","iconType","iconName","svgClass","styleExternalIcon","iconComponent","compName","Icons","_openBlock","_createElementBlock","_mergeProps","_createElementVNode","_hoisted_1","ElIcon","_resolveDynamicComponent","_hoisted_2","GvIconPlugin","GvIcon","DEFAULT_CONFIG","getConfig","config","listToTree","list","conf","nodeMap","id","children","pid","node","parent","treeToList","tree","findNode","findNodeAll","findPath","visitedSet","findPathAll","filter","listFilter","__spreadValues","forEach","treeMapEach","data","conversion","haveChildren","conversionData","__spreadProps","treeMap","treeData","opt","eachTree","treeDatas","callBack","parentNode","element","newNode","filterBreadcrumb","routes","res","route","meta","_isSlot","s","Object","prototype","call","_isVNode","appStore","useAppStore","permStore","usePermsStore","showBreadcrumbIcon","getShowBreadcrumbIcon","currentRoute","useRouter","t","levelList","ref","menuRouters","routers","getRouters","getBreadcrumb","currentPath","matched","slice","unref","renderBreadcrumb","map","disabled","redirect","ElBreadcrumbItem","title","watch","startsWith","_slot","ElBreadcrumb","TransitionGroup","GvBreadCrumbPlugin","GvBreadCrumb","emits","emit","instance","getCurrentInstance","handleConfirm","event","ElPopconfirm","reference","GvInputPlugin","GvPopconfirm","getValueType","useStorage","valueType","excludes","keys","defaultExcludes","excludesArr","notificationTime","notificationTimeError","messageTime","messageTimeError","alert","msg","alertObj","getStorage","lang","promptMsg","duration","m","ElNotification","confirm","msgs","showCancelButton","hint","ok","cancel","reject","ElMessageBox","message","tableedit","ElMessage","visible","text","otext","size","undefined","link","loading","refForm","required","nativeType","bizType","perms","cb","Function","useRoute","globalSize","useGlobalConfig","buttonSize","buttonConfirm","loadings","locked","isShow","isIf","getSlots","invokeClick","raw","onClick","handlers","Array","length","handler","withLoading","task","setIconStyle","replace","checkPerms","pm","slot","split","x","indexOf","arr","handleClick","exposed","resetFields","rootForm","originFormList","formList","index","filtercode","showLabel","dateType","model","field","rootEl","el","dateRangeSingles","querySelectorAll","startInput","querySelector","endInput","searchBtn","click","classz","renderBtn","display","ElButton","GvButtonPlugin","GvButton","_props","getCardHeader","header","ElCard","GvCardPlugin","GvCard","options","placeholder","clearable","showAllLevels","separator","trigger","filterable","multiple","lazy","lazyLoad","sOps","inputValue","cascaderSize","sPlaceHolder","getDisabled","resolvedInputId","newVal","handleChange","handleBlur","handleFilterMethod","query","labels","pathLabels","join","spell","pathNodes","some","ElCascader","$event","expandTrigger","GvCascaderPlugin","GvCascader","indeterminate","label","border","checkboxValue","checkboxSize","handleUpdate","ElCheckbox","GvCheckboxPlugin","GvCheckbox","inheritAttrs","checkboxButtonSize","ElCheckboxButton","GvCheckboxButtonPlugin","GvCheckboxButton","min","checkboxGroupSize","ElCheckboxGroup","GvCheckboxGroupPlugin","GvCheckboxGroup","_sfc_main$v","span","offset","xs","sm","md","lg","xl","ElCol","GvColPlugin","GvCol","toMidnight","date","d","daysAgo","days","midnight","monthBegin","quarterBegin","month","yearBegin","now","dateShortcuts","dateShortcutsEn","dateTimeShortcuts","dateTimeShortcutsEn","dateRangeShortcuts","start","end","dateRangeShortcutsEn","modelValue","Date","format","valueFormat","defaultTime","rangeSeparator","startPlaceholder","endPlaceholder","disabledDateFunc","disabledDate","editable","unlink","useI18n","datePickerSize","getShortcuts","getPickerOptions","pickerOptions","shortcuts","includes","getTime","db","handleInput","vm","handleFocus","handlePick","maxDate","minDate","ElDatePicker","onCalendarChange","onBlur","onFocus","onChange","GvDatePickerPlugin","GvDatePicker","boundElements","initDrag","collapseMenu","dragDom","dialogHeaderEl","getStyle","attr","disX","disY","dragDomWidth","dragDomHeight","screenWidth","screenHeight","minDragDomLeft","menuWidth","maxDragDomLeft","minDragDomTop","maxDragDomTop","styL","styT","onMouseMove","left","top","onMouseUp","hasFooter","width","height","nest","appendToBody","fullscreen","maxHeight","closeOnClickModal","closeOnPressEscape","dialogClass","buttonQuick","collapseMenus","myDialogClass","dialogVisible","maskVisible","dialogMaxHeight","sAppendToBody","modalAppendToBody","sNest","modalMask","newValue","then","handleVisible","handleOpen","handleOpened","nextTick","handleClose","handleClosed","handleCancel","renderFooterBtn","footer","propsData","getFooter","setMask","mask","getMaxHeight","parseFloat","document","documentElement","clientHeight","pEl","closest","onBeforeUnmount","window","removeEventListener","onMounted","addEventListener","ElDialog","GvDialogPlugin","GvDialog","position","direction","target","clickDivider","preventDefault","stopPropagation","ElDivider","GvDividerPlugin","GvDivider","paddingHeight","drawerVisible","drawerMaxHeight","show","buttonIcon","sPaddingHeight","drawerPaddingHeight","handleResize","evt","returnIcon","ElDrawer","overflow","GvDrawerPlugin","GvDrawer","newPropTypes","createTypes","propTypes","toValidableType","usePinyin","withTone","pinyin","pinYin","__emit","menuList","menuPath","fMenusList","generateRouter","serverRoutes","basePath","prefixTitle","prefixCode","router","i18ntitle","code","tempRoutes","handleCloseDrawer","handleSelect","handleSearch","_b","starClickHandle","star","menuItem","ElAutocomplete","Search","_withCtx","_hoisted_3","_toDisplayString","_hoisted_4","ElTabs","_Fragment","_renderList","ElTabPane","_hoisted_5","sub","_hoisted_6","StarFilled","Star","_hoisted_7","_component_router_link","_hoisted_8","sideWidth","expandHandle","_normalizeClass","_normalizeStyle","GvMenuList","GvExpandMenuPlugin","GvExpandMenu","prefixIcon","suffixIcon","maxlength","readonly","columnProp","rows","autosize","showWordLimit","inputSize","sPlaceholder","renderPrefixIcon","renderSuffixIcon","select","handleClear","handleKeyDown","ElInput","number","prefix","suffix","GvInput","step","stepStrictly","precision","currentValue","oldValue","ElInputNumber","GvInputNumberPlugin","GvInputNumber","dicType","dicRemote","clear","isreload","editRow","collapseTags","userStore","useUserStore","useNotify","dicIcon","remote","loadingText","externalValue","inputShowLabel","inputFilterable","selectValue","originOptions","className","dicSrc","toLowerCase","valueCache","Map","selectSize","isEmptyLabel","getDictItemLabel","l1","l2","formatOptionLabel","findLabelInOptions","opts","find","c","getOptionValue","row","cached","get","obj","set","getSelectCode","o","trim","getSelectLabel","isEmptySelectValue","every","syncEmptyToParent","elSelectModel","mergeOptionsWithSelected","_opts","merged","append","sv","pushDefaultOption","op","push","getSelectOptions","src","xx","arr2","dictCache","dict","getDictDivision","cache","addDictCache","getDict","RegExp","test","filterMethod","initialRemoteLoaded","pendingRemoteQuery","pendingRemotePromise","remoteRequestSeq","filterOriginOptions","remoteDictSearch","requestSeq","sDicType","substring","datas","ops","JSON","parse","console","log","remoteMethod","q","filtered","ensureDefaultOption","existed","resolveDisplayLabel","localOpts","applySelectValue","resolved","showLbl","deep","handleVisibleChange","renderSelectOption","ElOption","renderTableOption","columnTexts","multiColumn","v1","mm","m2","m4","vv1","mmm","mm2","mm4","labelArr","opArr","ElSelect","GvSelectPlugin","GvSelect","columnKey","require","switchType","newStatus","ElSwitch","GvSwitchPlugin","GvSwitch","isRange","disabledHours","disabledMinutes","disabledSeconds","timepickerSize","mergedDisabledHours","mergedDisabledMinutes","mergedDisabledSeconds","ElTimePicker","GvTimePickerPlugin","GvTimePicker","infoMsg","info","calLength","sum","vcity","checkDecimal","decimalLen","checkProvince","card","province","verifyBirthday","year","day","birthday","now_year","time","checkBirthday","re_fifteen","arr_data","re_eighteen","changeFivteenToEighteen","arrInt","arrCh","cardTemp","checkParity","valnum","htValidate","rule","callback","language","divider","isDivider","labelWidth","formStyle","scroller","expose","searchFieldsCollapsed","provide","formRefs","formElRef","setFormRef","rootNodeStyle","rules","isEditContainer","sMaxHeight","isScrollbar","isAnchor","isDialog","colSpanNums","formType","styles","formSize","labelPosition","searchDivider","getLanguage","setDividerShow","getEditBar","editbar","ElRow","getDivider","dividerRender","dividerTitle","getDictItems","dictCacheTmp","dictTmp","getItemRules","_item","validateKey","maxLen","validator","gvValidate","excluded","handleRadioInput","formVal","handleDateRange2Focus","$el","handleDateRange2Blur","handleDateRange2Change","endTime","startTime","datePicker","dateArr","handleSwitchDictChange","error","handleRadioDictChange","getSearchColClass","slotProps","expand","showDefaultRow","searchFormRows","renderFormItem","_index","_slot3","colspan","createRow","blur","focus","change","render","renders","isHidden","cType","validateRule","sDateType","dateFormat","ph","startPh","endPh","cols","colSpanXs","colSpanSm","colSpanMd","colSpanLg","colSpanXl","week","datetime","editables","isTableDic","sLabel","searchFormLabel","switchDefaultVal","searchColClass","ElFormItem","_createTextVNode","ElTooltip","padding","margin","clip","whiteSpace","ElRadioGroup","_slot2","ElRadio","ElRadioButton","vv","toolText","_resolveComponent","getItems","sRootEl","tabPane","offsetTop","classList","contains","clearFormValidate","clearValidate","setFormStyle","formStyle1","lastIndexOf","parseInt","clientWidth","init","formModel","formRule","originItem","difference","diff","fieldObj","oldObj","fieldObjKeys","key2","nextProps","prevProps","firstSlot","stringify","dialogBody","dialogBody2","Transition","_withDirectives","ElForm","flexWrap","flex","minWidth","_vShow","GvFormPlugin","GvForm","collapse","loadDict","loadDictDivision","toggleCollapse","collapsed","currentDict","currentReloadDict","currentDictDivision","Fold","Expand","GvHamburgerPlugin","GvHamburger","localeStore","useLocaleStore","langMap","currentLang","handleSetLang","switchLocale","useLocale","ElDropdown","ElDropdownMenu","ElDropdownItem","_component_GvIcon","GvLangSelectPlugin","GvLangSelect","placement","tablePopover","columnType","popClass","handleUpdateVisible","handleShow","handleHide","handlePopoverWrapper","getReferenceSlot","ElPopover","GvPopoverPlugin","GvPopover","radioValue","radioSize","GvRadioPlugin","GvRadio","GvRadioButtonPlugin","GvRadioButton","radioGroupSize","GvRadioGroupPlugin","GvRadioGroup","_sfc_main$c","gutter","GvRowPlugin","GvRow","toggle","isFullscreen","useFullscreen","toggleFullscreen","GvScreenFullPlugin","GvScreenFull","inject","formNode","fieldList","fields","expandFields","shrinkFields","createSearchBar","searchBar","defaultSlot","searchBtnFlag","expandText","shrinkText","shrink","GvSearchBarPlugin","GvSearchBar","hasOneShowingChild","onlyOneChild","showingChildren","useRenderMenuTitle","renderMenuTitle","useRenderMenuItem","menuMode","renderMenuItem","oneShowingChild","fullPath","noShowingChildren","alwaysShow","ElMenuItem","ElSubMenu","menuSelect","layout","getLayout","getCollapseMenus","leftMenuUniqueOpened","getLeftMenuUniqueOpened","activeMenu","open","renderMenu","ElMenu","renderMenuWrap","ElScrollbar","GvSidebarPlugin","GvSidebar","_imports_0","GvSidebarLogoPlugin","GvSidebarLogo","createTableBar","tableBar","defaultSlots","firstChild","closable","effect","round","tagSize","ElTag","appendPageInfo","pi","pageInfo","currentpagenum","recordsperpage","countrows","totalpage","combined","tabNode","filterConditions","co","sOp","coo","ds","condition","searchCombined","action","upper","sType","saveCombined","fetchData","fetch","submit","hasMsg","fetchTable","checkForms","fmNodes","fmNode","rawFmChildren","fmChildList","fmNode2","_c","save","check","fmInnerNode","conditions","update","search","searchInputNode","tableEl","tableHeader","tableFixedHeader","columns","h","columnsFixed","lenFixed","searchNoFm","toNewPageSearch","trans","insertResult","searchData","updateResult","rownums","currentRow","removeResult","getDictDisplayLabel","dictObj","_f","_e","_d","_i","_h","_g","_k","_j","resetEditValue","crud","rowData","fieldValue","items","itemChild","codes","tableHeadFilterPopoverPopperStyle","maxWidth","refTable","tableHead","tableData","pageSize","rowClassName","rowStyle","spanMethod","cellStyle","tableType","tableSort","tableKit","tableFetch","multi","isShowPage","total","tableInit","beforeImport","tableFilter","tableCb","expandRowKeys","limitHeight","tableAction","tableActionIcon","sTableAction","sTableActionIcon","sTableConfirm","detailPlacement","sTableType","originTableHead","tableHeads","sHeight","sMaxWidth","isEditTable","sPageSize","resultData","recordsList","records","pageSizes","filterHeads","popoverVisible","exportBtnDisabled","exportBtnLoading","importBtnLoading","tableSortMode","exportDialogShow","importDialogShow","sTableBar","gTableBar","tableSearchShow","sTableSort","sTableKit","showPopoverDetail","pageLayout","actionWidth","transHash","headColumn","headColumnInit","columnSumsDecimal","isIndeterminate","columnTreeList","columnCheckedKeys","storageKey","loginAccount","lsTableHeads","debounceSearch","tableRefs","tableRef","tableSize","getPageInfo","current","pages","setTableRef","closeAllPopover","property","next","ensurePopoverKey","propKey","wrapPopoverFilterBody","body","getScrollLeft","startLoading","stopLoading","transRecords","loadAction","splice","handleImport","handleExport","getImportBtn","import","buttonName","getExportBtn","export","runPageSearch","fC","fetchFn","handleSizeChange","handleCurrentChange","handleTableSearchInput","handleTableSearch","fh","strFh","y","getTableSearch","handlePopoverShow","popOvers","tableBodyWidth","style","bodyWrapper","scrollLeft","handlePopoverHide","createChangedColumns","checkedKeys","column","hasHidden","handleColumnCheckChange","checked","childChecked","$refs","$children","getCheckedKeys","hColumns","getTableColumn","setStoreLocal","handleTableRefresh","inputSearch","getTableBar","btns","exportSlots","importSlots","getKitBar","isVisible","ElButtonGroup","Refresh","Operation","ElTree","getSortModel","marginRight","columnFilterHandler","propField","popoverHtml","checkList","dateHtmlArr","filterValue","innerText","assign","getAttribute","add","tableFixHeader","fixColumns","fixLen","columnFilterHandlerReset","remove","primaryBtn","setAttribute","getColWidth","edit","label2","sWidth","columnFormatter","cellValue","handleColumnFilter","popoverHtmlList","from","pop","removeAttribute","renderHeadFilter","_slot4","_slot5","_slot6","fc","$store","getters","dictDivision","dispatch","ret2","_slot7","_slot8","_slot9","handleDictCheckAll","handleDictCheck","handlePopoverSlotClick","renderColumnItem","tableFixed","fixed","align","formatter","cellBlur","cellEnter","cellChange","selectable","showLabelProp","columnFilter","multiLabel","heads","reserveSelection","sHidden","sProp","Math","random","sFixed","sortable","multiLabels","hType","hSLabel","hSProp","hKey","hSFixed","hReserveSelection","hSortable","hSWidth","ElTableColumn","scope","renderRowEdit","renderAction","content","confirmArr","iconArr","sContent","confirms","detail","actionType","lock","$index","onConfirm","onAfter-enter","handleDetailPopoverShow","checkEditRow","tableColumns","thd","lsTableHeadsArr","startIndex","ff","f","treeNode","rownumWidth","actionHead","actionColumn","columnVNode","sortMethod","_0","order","fieldName","sortingType","sumData","sort","row1","row2","isNaN","localeCompare","oi","rowDblClick","tagName","cell","onRowDblclick","tr","tds","firstBtn","btnArr","j","btn","prevVal","typeArr","doLayout","n","tableBodyWrapper","_slot0","GvTableBar","ElTable","_resolveDirective","ElPagination","GvTablePlugin","GvTable","autoHeight","proxy","GvTabsPlugin","GvTabPane","tabPosition","tabMaxHeight","tabHeight","panes","handleTabClick","tabVm","tabName","calcPaneInstances","createTabPane","dialogContainer","GvTabs","GvTagPlugin","GvTag","reactive","currentKey","activeKey","tagsViewStore","useTagsViewStore","permsStore","visitedViews","mainAppRoutes","isRedirect","isActive","isAffix","affix","filterAffixNavMenus","navMenus","affixTags","tagPath","params","hash","redirectedFrom","addAffixTags","tagView","addVisitedView","createTabPanel","icons","picon","showContextMenu","closeContextMenu","toLink","routePath","targetView","toLastView","visitedView","currentView","latestView","addNavMenu","addTagView","moveToCurrentTag","view","clickTab","tab","closeCurrentTag","targetKey","delTagView","refreshSelectedTag","delCachedView","findCurTagIndex","findIndex","closeTagsOrientation","isClosed","cloneDeep","closeOthersTags","delOthersViews","oldName","tagsViewEl","useEventListener","targetNode","parentElement","clientX","pageX","clientY","pageY","GvTagsViewPlugin","GvTagsView","themeOptions","currentTheme","handleSetTheme","GvThemePlugin","GvTheme","treeProps","nodeKey","load","showCheckbox","draggable","defaultExpandedKeys","defaultCheckedKeys","iconClass","defaultExpandAll","expandOnClickNode","checkOnClickNode","filterNodeMethod","renderContent","handleNodeClick","handleNodeExpand","handleNodeCollapse","handleCheck","checkedInfo","handleCheckChange","handleLazyLoad","handleNodeDrop","draggingNode","dropNode","dropType","GvTreePlugin","GvTree","encrypt","word","keyStr","CryptoJS","ww","srcs","decrypt","generateKey","num","library","randomPoz","components","GvPopconfirmPlugin","GvTabPanePlugin","install","setActivePinia","GuavaUI","exports","_sfc_main$G","_sfc_main$h","_sfc_main$8","confirm$1"],"mappings":";0UAUMA,GAAkB,yBAClBC,GAAY,IAA2B,CAC3C,MAAMC,EAAI,WACV,OAAKA,EAAEF,EAAe,IAAGE,EAAEF,EAAe,EAAI,CAAA,GAEvCE,EAAEF,EAAe,CAC1B,EAQaG,GAAoBC,GAA6B,CAE5D,OAAO,OAAOH,GAAA,EAAaG,CAAG,CAChC,EAYO,SAASC,IAA0B,CACxC,MAAMC,EAAOL,KAAY,KACzB,GAAI,CAACK,EAAM,MAAM,IAAI,MAAM,+BAA+B,EAC1D,OAAOA,CACT,0FCrBE,KAAM,CAAE,aAAAC,EAAc,UAAAC,CAAA,EAAcC,YAAA,EAE9BC,EAAYH,EAAa,SAAS,8BAIxCI,EAAAA,YAE2GC,EAAAA,MAAAC,EAAAA,SAAA,EAAA,CADxG,uBAAOD,QAAAF,CAAA,CAAS,EAChB,WAAYE,EAAAA,MAAAJ,CAAA,EAAU,SAAS,8BAA8BI,EAAAA,MAAAJ,CAAA,EAAU,WAAW,kBAAA,iCC3BjFM,GAAkB,CACtB,QAAQC,EAAgB,OACtBA,EAAI,WAAUC,EAAAA,GAAU,OAAVA,KAAAA,EAAkB,YAAaA,EAAS,CACxD,CACF,ECWQ,CAAET,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,OAAO,EAEtCU,qBAA+B,CAC7BC,KAAM,UACNC,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNC,QAAS,IAEXC,MAAO,CACLH,KAAM,CAACI,OAAQH,MAAM,EACrBC,QAAS,IAEXG,IAAK,CACHL,KAAMI,OACNF,QAAS,IAEXI,MAAO,CACLN,KAAMO,QACNL,QAAS,IAEXM,OAAQ,CACNR,KAAMO,QACNL,QAAS,IAEXO,SAAU,CACRT,KAAMO,QACNL,QAAS,IAEXQ,MAAO,CACLV,KAAMC,OACNC,QAAS,IAEXF,KAAM,CACJA,KAAMC,OACNC,QAAS,SACX,GAGFS,MAAMb,EAAO,CAAEc,MAAAA,CAAM,EAAG,CAEtB,MAAO,IAAAC,EAAAA,YAAAC,UAAA,CAAA,MAEIhB,EAAMK,MAAK,IACbL,EAAMO,IAAG,KACRP,EAAME,KAAI,OACRF,EAAMU,OAAM,MACbV,EAAMQ,MAAK,SACRR,EAAMW,SAAQ,MACjBX,EAAMY,MAAK,MACXrB,EAAS,EAAA,CAAAa,QAAAA,IAAAA,OAAA,QACfU,EAAAA,EAAMV,UAANU,YAAAA,EAAAA,KAAAA,EAAiB,GAAA,CAGxB,CACF,CAAC,EAACG,GAAA,CAAAC,EAAAlB,IAAA,wGCvEEmB,GAAgB,CACpB,QAAQvB,EAAgB,OACtBA,EAAI,WAAUwB,EAAAC,GAAQ,OAAR,KAAAD,EAAgB,UAAWC,EAAO,CAClD,CACF,ECKMC,GAAW,OAAO,UAAU,SACrBC,GAAK,CAACC,EAActB,IAAiBoB,GAAS,KAAKE,CAAG,IAAM,WAAWtB,CAAI,IAE3EuB,GAAcC,GAA0B,0BAA0B,KAAKA,CAAI,EAC3EC,GAAYH,GAAgCD,GAAGC,EAAK,QAAQ,EAC5DI,GAAWJ,GAA2BA,GAAO,MAAM,QAAQA,CAAG,EAC9DK,GAAW,GAA2B,OAAO,GAAM,UAAY,IAAM,MAAQ,YAAa,EAC1FC,GAAYN,GAAsCA,IAAQ,MAAQD,GAAGC,EAAK,QAAQ,EAClFO,GAAUP,GAA8BD,GAAGC,EAAK,MAAM,EACtDQ,GAAYR,GAAgCD,GAAGC,EAAK,QAAQ,EAC5DS,GAAaT,GAAiCD,GAAGC,EAAK,SAAS,EAC/DU,GAAcV,GAAiD,OAAOA,GAAQ,WAC9EW,GAAaX,GAAiCM,GAASN,CAAG,GAAK,CAAC,CAACA,EAAI,QACrEY,GAASZ,GAAuCD,GAAGC,EAAK,KAAK,EAC7Da,GAAaX,GAA0B,mEAAmE,KAAKA,CAAI,EACnHY,GAAS,IAAe,OAAO,WAAW,8BAA8B,EAAE,QAC1EC,GAAUf,GAA8BA,IAAQ,KAEhDgB,GAAwBhB,GAC/Be,GAAOf,CAAG,GACVA,IAAQ,QACRA,IAAQ,OAAe,GACvBI,GAAQJ,CAAG,GAAKG,GAASH,CAAG,EAAUA,EAAI,SAAW,EACrDA,aAAe,KAAOA,aAAe,IAAYA,EAAI,OAAS,EAC9DM,GAASN,CAAG,EAAU,OAAO,KAAKA,CAAG,EAAE,SAAW,EAC/C,GAMIiB,GAAU,CAACC,EAAYC,IAAwB,CAC1D,GAAI,OAAO,GAAGD,EAAGC,CAAC,EAAG,MAAO,GAE5B,GADID,IAAM,MAAQC,IAAM,MAAQD,IAAM,QAAaC,IAAM,QACrD,OAAOD,GAAM,OAAOC,EAAG,MAAO,GAClC,GAAIT,GAAWQ,CAAC,GAAKR,GAAWS,CAAC,SAAUD,IAAMC,EACjD,GAAIZ,GAAOW,CAAC,GAAKX,GAAOY,CAAC,EAAG,OAAOD,EAAE,QAAA,IAAcC,EAAE,QAAA,EACrD,GAAIf,GAAQc,CAAC,GAAKd,GAAQe,CAAC,EAAG,CAC5B,GAAID,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAClC,QAASC,EAAI,EAAGA,EAAIF,EAAE,OAAQE,IAAK,GAAI,CAACH,GAAQC,EAAEE,CAAC,EAAGD,EAAEC,CAAC,CAAC,EAAG,MAAO,GAEpE,MAAO,EACT,CACA,GAAId,GAASY,CAAC,GAAKZ,GAASa,CAAC,EAAG,CAC9B,MAAME,EAAQ,OAAO,KAAKH,CAAC,EACrBI,EAAQ,OAAO,KAAKH,CAAC,EAC3B,GAAIE,EAAM,SAAWC,EAAM,OAAQ,MAAO,GAC1C,UAAWC,KAAOF,EAEhB,GADI,CAAC,OAAO,UAAU,eAAe,KAAKF,EAAGI,CAAG,GAC5C,CAACN,GAAQC,EAAEK,CAAG,EAAGJ,EAAEI,CAAG,CAAC,EAAG,MAAO,GAEvC,MAAO,EACT,CACA,MAAO,EACT,EAEaC,GAAStB,GAA0B,CAC9C,GAAI,CACF,WAAI,IAAIA,CAAI,EACL,EACT,OAAQuB,EAAA,CACN,MAAO,EACT,CACF,EAQaC,GAAqBC,GAA6B,QAC7D/B,EAAA,SAAS,cAAc,MAAM,IAA7B,MAAAA,EAAgC,aAAa,OAAQ+B,EACvD,EAQaC,GAAeC,GAAAC,GAAA,sBAAmC,WAAI,QAASC,GAAY,WAAWA,EAASF,CAAO,CAAC,IAOvGG,GAAUzD,GAChBA,EAEEA,EAAK,QAAQ,UAAW,SAAU0D,EAAKC,EAAQ,CACpD,OAAOA,EAAO,YAAA,CAChB,CAAC,EAJiB,GAaPC,GAAU5D,GAAyBA,EAAK,QAAQ,WAAY,KAAK,EAAE,YAAA,EAQnE6D,GAAgB,CAACC,EAAcrC,EAAUsC,EAAM,SAAS,kBAA0B,CAC7FA,EAAI,MAAM,YAAYD,EAAMrC,CAAG,CACjC,EAQauC,GAAgB,CAACF,EAAcC,EAAM,SAAS,kBAA4B,iBAAiBA,CAAG,EAAE,iBAAiBD,CAAI,EAOrHG,GAAW,SAAUC,EAAM,CACtC,IAAIC,EAAY,GAChB,OAAID,IACEA,EAAK,SAAS,SAAS,EAAGC,EAAYD,EACjCA,EAAK,SAAS,SAAS,IAAGC,EAAY,YAAYD,CAAI,KAC1DC,CACT,EAQaC,GAAW,CAACC,EAAkBC,IAAyB,CAAC,CAACD,EAAI,UAAU,MAAM,IAAI,OAAO,UAAYC,EAAM,SAAS,CAAC,EAOpHC,GAAW,CAACF,EAAkBC,IAAgB,CACpDF,GAASC,EAAKC,CAAG,IAAGD,EAAI,WAAa,IAAMC,EAClD,EAOaE,GAAc,CAACH,EAAkBC,IAAsB,CAClE,GAAIF,GAASC,EAAKC,CAAG,EAAG,CACtB,MAAMG,EAAM,IAAI,OAAO,UAAYH,EAAM,SAAS,EAClDD,EAAI,UAAYA,EAAI,UAAU,QAAQI,EAAK,GAAG,CAChD,CACF,EAMaC,GAAgBC,GAAaA,EAAI,cAAgBA,EAAI,aAAeA,EAAI,cAKxEC,GAAmB,CAC9B,KAAM,CACJ,YAAa,OACb,YAAa,aACb,WAAY,YAAA,EAEd,UAAW,CACT,YAAa,OACb,YAAa,sBACb,WAAY,YAAA,EAEd,SAAU,CACR,YAAa,OACb,YAAa,mBACb,WAAY,kBAAA,EAEd,KAAM,CACJ,YAAa,MACb,WAAY,aAAA,EAEd,MAAO,CACL,YAAa,OACb,YAAa,UACb,WAAY,SAAA,EAEd,KAAM,CACJ,YAAa,OACb,YAAa,OACb,WAAY,MAAA,CAEhB,EAUaC,GAAW,CAACC,EAAUC,EAAO,IAAKC,EAAY,KAAU,CACnE,IAAIC,EACAC,EACAC,EACAC,EACAC,EACJ,MAAMC,EAAQ,UAAY,CAExB,MAAMC,EAAO,CAAC,IAAI,KAASH,EAEvBG,EAAOR,GAAQQ,EAAO,IAAa,WAAWD,EAAOP,EAAOQ,CAAI,GAElEN,EAAU,KAELD,IACHK,EAASP,EAAK,MAAMK,EAASD,CAAG,EAC3BD,IAASE,EAAUD,EAAM,OAGpC,EACA,OAAO,YAAwBM,EAAM,CAEnCL,EAAU,KAEVD,EAAMM,EACNJ,EAAY,KAAK,KACjB,MAAMK,EAAUT,GAAa,CAACC,EAE9B,OAAKA,IAASA,EAAU,WAAWK,EAAOP,CAAI,GAC1CU,IACFJ,EAASP,EAAK,MAAMK,EAASD,CAAG,EAChCC,EAAUD,EAAM,MAGXG,CACT,CACF,EAQaK,GAAgBC,GAAuB,CAClD,GAAI,CAACA,EAAO,MAAO,GAEnB,GAAI,OAAOA,GAAU,SAAU,OAAOA,EAEtC,GAAI,OAAOA,GAAU,SAAU,OAAO,OAAOA,CAAK,EAElD,GAAI,OAAOA,EAAM,UAAa,SAAU,OAAOA,EAAM,SAAS,KAAA,EAE9D,GAAI,MAAM,QAAQA,EAAM,QAAQ,SAAUA,EAAM,SAAS,IAAKC,GAASF,GAAaE,CAAI,CAAC,EAAE,KAAK,EAAE,EAElG,GAAID,EAAM,UAAY,OAAOA,EAAM,UAAa,SAAU,CACxD,MAAM5E,EAAQ4E,EAAM,SAEpB,GAAI,OAAO5E,EAAM,SAAY,WAE3B,OADkBA,EAAM,QAAA,EACP,IAAK6E,GAAcF,GAAaE,CAAI,CAAC,EAAE,KAAK,EAAE,CAEnE,CAEA,MAAO,EACT,EAQaC,GAAgBF,GACtBA,GACE,OAAOA,EAAM,MAAS,UAAYA,EAAM,OAAS,MAAQ,SAAUA,EAAM,KAAOA,EAAM,KAAK,KAD/E,GAURG,GAAsBrE,GAC7BA,EAAYA,EAAI,QAAQ,KAAM,EAAE,EACxB,OAId,SAASsE,GAAWtE,EAAqB,CACvC,OAAIA,IAAQ,OAAe,IACfA,CACd,CAEA,SAASuE,GAAaC,EAASxE,EAAK,CAClC,MAAMyE,EAASzE,EACXA,EAAM,IAAGA,EAAM,CAACA,GACpB,MAAM0E,EAAa,4BAGnB,GAFI,CAACF,GAAW,CAAC,IAAI,OAAOE,EAAY,GAAG,EAAE,KAAKF,CAAO,GAErD,CAAChE,IAAUR,EAAM,IAAI,QAAQ,IAAK,EAAE,CAAC,EAAG,MAAO,OAEnD,MAAM2E,EAASH,EAAQ,MAAM,IAAI,OAAOE,EAAY,GAAG,CAAC,EAClDE,EAAKD,EAAO,CAAC,EAAE,QAAQ,GAAG,EAChC,GAAIC,EAAK,EAAG,CACV,MAAMC,EAAMF,EAAO,CAAC,EAAE,OAASC,EAAK,EACpC5E,EAAM,KAAK,MAAMA,EAAM,KAAK,IAAI,GAAI6E,CAAG,CAAC,EAAI,KAAK,IAAI,GAAIA,CAAG,CAC9D,MAAO7E,EAAM,KAAK,MAAMA,CAAG,EAE3BA,EAAMA,EAAM,GACZ,MAAM8E,EAAK9E,EAAI,QAAQ,GAAG,EAC1B,IAAI+E,EAAM,GACV,GAAIH,EAAK,EAAG,CACV,QAASxD,EAAIwD,EAAK,EAAGxD,EAAIuD,EAAO,CAAC,EAAE,OAAQvD,IAAK,CAC9C,MAAM4D,EAAKF,EAAK,GAAKA,EAAK1D,EAAIwD,EAAK5E,EAAI,OAASA,EAAI,OAAO8E,EAAK1D,EAAIwD,CAAE,EAAI,GACtED,EAAO,CAAC,EAAE,OAAOvD,CAAC,IAAM,IAAK2D,EAAMA,GAAOC,IAAO,GAAK,IAAMA,GAC3DD,EAAMA,GAAOC,IAAO,GAAK,GAAKA,EACrC,CACAD,EAAMA,IAAQ,GAAK,GAAK,IAAMA,CAChC,CACA,MAAME,EAAKN,EAAO,CAAC,EAAE,QAAQ,GAAG,EAChC,GAAIM,EAAK,EAAG,CACV,MAAMJ,EAAMD,EAAK,EAAIA,EAAKK,EAAK,EAAIN,EAAO,CAAC,EAAE,OAASM,EAAK,EACrDC,EAAOJ,EAAK,EAAIA,EAAK,EAAI9E,EAAI,OAAS,EAC5C,QAASoB,EAAI8D,EAAM9D,GAAK,EAAGA,QAAa8D,EAAO9D,EAAI,GAAKyD,IAAQ,EAAI,IAAM,IAAM7E,EAAI,OAAOoB,CAAC,EAAI2D,EAEhGA,EAAMA,EAAI,OAAO,CAAC,IAAM,IAAMA,EAAI,UAAU,EAAGA,EAAI,MAAM,EAAIA,CAC/D,MAAOA,EAAM/E,EAAI,UAAU,EAAG8E,EAAK,EAAIA,EAAK9E,EAAI,MAAM,EAAI+E,EAE1D,OAAIN,EAAS,IAAGM,EAAM,IAAMA,GAErBP,EAAQ,QAAQG,EAAO,CAAC,EAAGI,CAAG,CACvC,CASO,MAAMI,GAAe,CAACnF,EAAsBoF,EAAU,IAAc,CACzE,IAAIC,EAAIrF,EAAM,GACd,GAAIqF,IAAM,MAAQA,IAAM,QAAUA,IAAM,KAAOA,IAAM,QAAaA,IAAM,YAAa,MAAO,OACxFA,EAAE,QAAQ,GAAG,EAAI,IAAGA,EAAIhB,GAAmBgB,CAAC,GAChD,IAAIb,EAAU,SACVc,EAAiB,KACrB,OAAIF,IAASE,EAAiBA,EAAe,SAASF,EAAS,GAAG,GAClEZ,EAAUA,EAAUc,EACbhB,GAAWC,GAAaC,EAASa,CAAC,CAAC,CAC5C,EAQaE,GAAgBC,GAAO,CAClC,GAAIA,GAAMA,EAAG,KACX,GAAIA,EAAG,IAAI,YAAA,IAAkB,KAAOA,EAAG,UAAY,GAAM,CAEvDA,EAAG,eAAA,EACHA,EAAG,gBAAA,EACH,MAAMC,EAAU,SAAS,KAAK,cAAc,iEAAiE,EAC7G,GAAIA,GAAWA,EAAQ,MAAM,UAAY,SAAgB,MAAA,MACpD,CACH,MAAMA,EAAU,SAAS,KAAK,cAAc,+DAA+D,EACvGA,GAAWA,EAAQ,MAAM,UAAY,IAAIA,EAAQ,MAAA,CACvD,CACF,SAAWD,EAAG,IAAI,YAAA,IAAkB,KAAOA,EAAG,UAAY,GAAM,CAE9DA,EAAG,eAAA,EACHA,EAAG,gBAAA,EACH,MAAMC,EAAU,SAAS,KAAK,cAAc,yEAAyE,EACjHA,GAAWA,EAAQ,MAAM,UAAY,QAAYA,EAAQ,aAAa,SAAS,KAAW,MAAA,CAChG,SAAWD,EAAG,IAAI,YAAA,IAAkB,KAAOA,EAAG,UAAY,GAAM,CAE9DA,EAAG,eAAA,EACHA,EAAG,gBAAA,EACH,MAAMC,EAAU,SAAS,KAAK,cAAc,0EAA0E,EACtH,GAAIA,GAAWA,EAAQ,MAAM,UAAY,KAAY,MAAA,MAChD,CACH,MAAMA,EAAU,SAAS,KAAK,cAAc,0EAA0E,EAClHA,EAAQ,MAAM,UAAY,IAAIA,EAAQ,MAAA,CAC5C,CACF,SAAWD,EAAG,IAAI,YAAA,IAAkB,KAAOA,EAAG,UAAY,GAAM,CAE9DA,EAAG,eAAA,EACHA,EAAG,gBAAA,EACH,MAAMC,EAAU,SAAS,KAAK,cAAc,yHAAyH,EACrK,GAAIA,GAAWA,EAAQ,MAAM,UAAY,KAAY,MAAA,MAChD,CACH,MAAMA,EAAU,SAAS,KAAK,cAAc,6DAA6D,EACrGA,GAAWA,EAAQ,MAAM,UAAY,IAAIA,EAAQ,MAAA,CACvD,CACF,SAAWD,EAAG,IAAI,YAAA,IAAkB,KAAOA,EAAG,UAAY,GAAM,CAE9DA,EAAG,eAAA,EACHA,EAAG,gBAAA,EACH,MAAMC,EAAU,SAAS,KAAK,cAAc,mFAAmF,EAC/H,GAAIA,GAAWA,EAAQ,MAAM,UAAY,KAAY,MAAA,MAChD,CACH,MAAMA,EAAU,SAAS,KAAK,cAAc,6DAA6D,EACrGA,GAAWA,EAAQ,MAAM,UAAY,IAAIA,EAAQ,MAAA,CACvD,CACF,SAAWD,EAAG,IAAI,YAAA,IAAkB,KAAOA,EAAG,UAAY,GAAM,CAE9DA,EAAG,eAAA,EACHA,EAAG,gBAAA,EACH,MAAME,EAAY,SAAS,KAAK,cAAc,iHAAiH,EAC3JA,KAAqB,MAAA,CAC3B,SAAWF,EAAG,MAAQ,SAAU,CAE9BA,EAAG,eAAA,EACHA,EAAG,gBAAA,EACH,MAAMG,EAAqB,SAAS,gBAAgB,cAAc,+BAA+B,EACjG,GAAIA,GAAsBA,EAAmB,MAAM,UAAY,OACtCA,EAAmB,cAAc,8CAA8C,EACvF,MAAA,MACV,CACL,MAAMC,EAAiB,SAAS,gBAAgB,cAAc,iBAAiB,EAC/E,GAAIA,GAAkBA,EAAe,MAAM,UAAY,OAC9BA,EAAe,cAAc,2BAA2B,EAChE,MAAA,MACV,CACL,MAAMC,EAAY,SAAS,KAAK,iBAAiB,4DAA4D,EAC7G,GAAIA,GACF,QAAS,EAAI,EAAG,EAAIA,EAAU,OAAQ,IACpC,GAAIA,EAAU,CAAC,EAAE,MAAM,UAAY,OAAQ,CACzC,MAAMC,EAAaD,EAAU,CAAC,EAAE,cAAc,2BAA2B,EACzE,GAAIC,GAAcA,EAAW,MAAM,UAAY,OAAQ,CACrDA,EAAW,MAAA,EACX,MACF,CACF,EAEJ,MAAMC,EAAc,SAAS,KAAK,cAAc,sFAAsF,EAClIA,GAAeA,EAAY,MAAM,UAAY,UAAoB,MAAA,CACvE,CACF,CACF,EACJ,EAEaC,GAAc,CAACC,EAAoB/F,IAAiB,CAC/D,GAAIsB,GAAMtB,CAAI,EAAG,OAAOA,EACxB,MAAMgG,EAAYhG,EAAK,WAAW,GAAG,GAAK,CAACA,EAAOA,EAAO,IAAIA,CAAI,GACjE,MAAO,GAAG+F,CAAU,GAAGC,CAAS,GAAG,QAAQ,QAAS,GAAG,EAAE,KAAA,CAC3D,iMCzcE,KAAM,CAAE,UAAArI,CAAA,EAAcC,YAAA,EAChBqI,EAAetI,EAAU,UACzBuI,EAAQC,EAAAA,SAAA,EAOR7H,EAAQ8H,EAcRC,EAAUC,EAAAA,SAAS,IAAMvG,GAAWzB,EAAM,QAAQ,CAAC,EACnDiI,EAAWD,EAAAA,SAAS,IACpBhI,EAAM,WAAa,MAAc,MAC5BA,EAAM,WAAa,WAAmB,WACtCA,EAAM,WAAa,KAAa,KAChCA,EAAM,WAAa,GACtBA,EAAM,SAAS,WAAW,SAAS,EAAU,KACxCA,EAAM,SAAS,WAAW,KAAK,EAAU,WACtC,MACF,KACb,EACKkI,EAAWF,EAAAA,SAAS,IACpBC,EAAS,QAAU,MAAc,IAAIN,CAAY,SAAS3H,EAAM,QAAQ,GACnEiI,EAAS,QAAU,WAAmB,YAAcjI,EAAM,SAC1DiI,EAAS,QAAU,KAAajI,EAAM,SACnC,IAAIA,EAAM,QAAQ,EAC/B,EAGKmI,EAAWH,EAAAA,SAAS,IACpBC,EAAS,QAAU,MAAcjI,EAAM,UAAY,YAAcA,EAAM,UAAY,WAC3EA,EAAM,SACnB,EACKoI,EAAoBJ,EAAAA,SAAS,KAAO,CACxC,KAAM,OAAOhI,EAAM,QAAQ,sBAC3B,eAAgB,OAAOA,EAAM,QAAQ,qBAAA,EACrC,EAQIqI,EAAgBL,EAAAA,SAAS,IAAM,CAGnC,GAAIC,EAAS,QAAU,KAAM,OAAO,KACpC,MAAMlI,EAAOC,EAAM,SACnB,IAAIsI,EAAW,GACf,OAAIvI,EAAK,WAAW,SAAS,GAC3BuI,EAAWvI,EAAK,QAAQ,WAAY,EAAE,EACtCuI,EAAWA,EAAS,OAAO,CAAC,EAAE,cAAgBA,EAAS,MAAM,CAAC,GACzDA,EAAWvI,EAAK,OAAO,CAAC,EAAE,cAAgBA,EAAK,MAAM,CAAC,EAEtDwI,GAAMD,CAA8B,CAC7C,CAAC,eAIOP,EAAA,OADRS,EAAAA,UAAA,EAAAC,EAAAA,mBAIuB,MAJvBC,aAIuB,OAFpB,MAAON,EAAA,MACR,MAAM,4BAAA,EACE3I,EAAAA,MAAAmI,CAAA,CAAK,EAAA,KAAA,EAAA,GAEFK,EAAA,QAAQ,OADrBO,EAAAA,UAAA,EAAAC,EAAAA,mBAMM,MANNC,EAAAA,WAMM,OAJH,MAAOP,EAAA,MACR,cAAY,MAAA,EACJ1I,EAAAA,MAAAmI,CAAA,CAAK,EAAA,CACbe,qBAAwB,MAAA,CAAlB,KAAMT,EAAA,OAAQ,KAAA,EAAAU,EAAA,CAAA,OAGTX,EAAA,QAAQ,YADrBO,EAAAA,YAAAC,EAAAA,mBAII,IAJJC,aAII,OAFD,MAAK,CAAGR,EAAA,MAAUC,EAAA,KAAQ,CAAA,EACnB1I,EAAAA,MAAAmI,CAAA,CAAK,EAAA,KAAA,EAAA,GAGFS,EAAA,qBADb7I,EAAAA,YAISC,EAAAA,MAAAoJ,EAAAA,MAAA,EAAA,OAFN,uBAAOV,EAAA,KAAQ,CAAA,qBAChB,IAAiC,EAAjCK,EAAAA,YAAAhJ,EAAAA,YAAiCsJ,EAAAA,wBAAjBT,EAAA,KAAa,CAAA,EAAA,uBAE/BG,EAAAA,UAAA,EAAAC,EAAAA,mBAOM,MAPNC,aAOM,OALH,MAAOP,EAAA,MACP,mBAAsBL,EAAA,KAAI,IAAA,EAC3B,cAAY,MAAA,EACJrI,EAAAA,MAAAmI,CAAA,CAAK,EAAA,CACbe,qBAA8B,MAAA,CAAxB,aAAYT,EAAA,OAAQ,KAAA,EAAAa,EAAA,CAAA,6CCnHxBC,GAAe,CACnB,QAAQpJ,EAAgB,OACtBA,EAAI,WAAUwB,EAAA6H,GAAO,OAAP,KAAA7H,EAAe,SAAU6H,EAAM,CAC/C,CACF,ECDMC,GAAmC,CACvC,GAAI,KACJ,SAAU,WACV,IAAK,KACP,EACMC,GAAaC,GAAsC,OAAO,OAAO,CAAA,EAAIF,GAAgBE,CAAM,EAEpFC,GAAa,CAAUC,EAAaF,EAAoC,KAAY,CAC/F,MAAMG,EAAOJ,GAAUC,CAAM,EACvBI,MAAc,IACdpE,EAAc,CAAA,EACd,CAAE,GAAAqE,EAAI,SAAAC,EAAU,IAAAC,CAAA,EAAQJ,EAE9B,UAAWK,KAAQN,EACjBM,EAAKF,CAAQ,EAAIE,EAAKF,CAAQ,GAAK,CAAA,EACnCF,EAAQ,IAAII,EAAKH,CAAE,EAAGG,CAAI,EAE5B,UAAWA,KAAQN,EAAM,CACvB,MAAMO,EAASL,EAAQ,IAAII,EAAKD,CAAG,CAAC,GACnCE,EAASA,EAAO,SAAWzE,GAAQ,KAAKwE,CAAI,CAC/C,CACA,OAAOxE,CACT,EAEa0E,GAAa,CAAUC,EAAWX,EAAoC,KAAU,CAC3FA,EAASD,GAAUC,CAAM,EACzB,KAAM,CAAE,SAAAM,GAAaN,EACfhE,EAAc,CAAC,GAAG2E,CAAI,EAC5B,QAASnH,EAAI,EAAGA,EAAIwC,EAAO,OAAQxC,IAC5BwC,EAAOxC,CAAC,EAAE8G,CAAS,GACxBtE,EAAO,OAAOxC,EAAI,EAAG,EAAG,GAAGwC,EAAOxC,CAAC,EAAE8G,CAAS,CAAC,EAEjD,OAAOtE,CACT,EAEa4E,GAAW,CAAUD,EAAWlF,EAAUuE,EAAoC,CAAA,IAAiB,CAC1GA,EAASD,GAAUC,CAAM,EACzB,KAAM,CAAE,SAAAM,GAAaN,EACfE,EAAO,CAAC,GAAGS,CAAI,EACrB,UAAWH,KAAQN,EAAM,CACvB,GAAIzE,EAAK+E,CAAI,EAAG,OAAOA,EACvBA,EAAKF,CAAS,GAAKJ,EAAK,KAAK,GAAGM,EAAKF,CAAS,CAAC,CACjD,CACA,OAAO,IACT,EAEaO,GAAc,CAAUF,EAAWlF,EAAUuE,EAAoC,CAAA,IAAY,CACxGA,EAASD,GAAUC,CAAM,EACzB,KAAM,CAAE,SAAAM,GAAaN,EACfE,EAAO,CAAC,GAAGS,CAAI,EACf3E,EAAc,CAAA,EACpB,UAAWwE,KAAQN,EACjBzE,EAAK+E,CAAI,GAAKxE,EAAO,KAAKwE,CAAI,EAC9BA,EAAKF,CAAS,GAAKJ,EAAK,KAAK,GAAGM,EAAKF,CAAS,CAAC,EAEjD,OAAOtE,CACT,EAEa8E,GAAW,CAAUH,EAAWlF,EAAUuE,EAAoC,CAAA,IAAuB,CAChHA,EAASD,GAAUC,CAAM,EACzB,MAAM1H,EAAY,CAAA,EACZ4H,EAAO,CAAC,GAAGS,CAAI,EACfI,MAAiB,IACjB,CAAE,SAAAT,GAAaN,EACrB,KAAOE,EAAK,QAAQ,CAClB,MAAMM,EAAON,EAAK,CAAC,EACnB,GAAIa,EAAW,IAAIP,CAAI,EACrBlI,EAAK,IAAA,EACL4H,EAAK,MAAA,UAELa,EAAW,IAAIP,CAAI,EACnBA,EAAKF,CAAS,GAAKJ,EAAK,QAAQ,GAAGM,EAAKF,CAAS,CAAC,EAClDhI,EAAK,KAAKkI,CAAI,EACV/E,EAAK+E,CAAI,EAAG,OAAOlI,CAE3B,CACA,OAAO,IACT,EAEa0I,GAAc,CAACL,EAAWlF,EAAUuE,EAAoC,CAAA,IAAO,CAC1FA,EAASD,GAAUC,CAAM,EACzB,MAAM1H,EAAc,CAAA,EACd4H,EAAO,CAAC,GAAGS,CAAI,EACf3E,EAAgB,CAAA,EAChB+E,MAAiB,IACjB,CAAE,SAAAT,GAAaN,EACrB,KAAOE,EAAK,QAAQ,CAClB,MAAMM,EAAON,EAAK,CAAC,EACfa,EAAW,IAAIP,CAAI,GACrBlI,EAAK,IAAA,EACL4H,EAAK,MAAA,IAELa,EAAW,IAAIP,CAAI,EACnBA,EAAKF,CAAS,GAAKJ,EAAK,QAAQ,GAAGM,EAAKF,CAAS,CAAC,EAClDhI,EAAK,KAAKkI,CAAI,EACd/E,EAAK+E,CAAI,GAAKxE,EAAO,KAAK,CAAC,GAAG1D,CAAI,CAAC,EAEvC,CACA,OAAO0D,CACT,EAEaiF,GAAS,CAAUN,EAAWlF,EAAyBuE,EAAoC,CAAA,IAAY,CAClHA,EAASD,GAAUC,CAAM,EACzB,MAAMM,EAAWN,EAAO,SACxB,SAASkB,EAAWhB,EAAW,CAC7B,OAAOA,EACJ,IAAKM,GAAeW,GAAA,GAAKX,EAAO,EAChC,OAAQA,IACPA,EAAKF,CAAQ,EAAIE,EAAKF,CAAQ,GAAKY,EAAWV,EAAKF,CAAQ,CAAC,EACrD7E,EAAK+E,CAAI,GAAMA,EAAKF,CAAQ,GAAKE,EAAKF,CAAQ,EAAE,OACxD,CACL,CACA,OAAOY,EAAWP,CAAI,CACxB,EAEaS,GAAU,CAAUT,EAAWlF,EAAqBuE,EAAoC,CAAA,IAAa,CAChHA,EAASD,GAAUC,CAAM,EACzB,MAAME,EAAc,CAAC,GAAGS,CAAI,EACtB,CAAE,SAAAL,GAAaN,EACrB,QAAS,EAAI,EAAG,EAAIE,EAAK,OAAQ,IAAK,CAEpC,GAAIzE,EAAKyE,EAAK,CAAC,CAAC,EAAG,OAEnBI,GAAYJ,EAAK,CAAC,EAAEI,CAAQ,GAAKJ,EAAK,OAAO,EAAI,EAAG,EAAG,GAAGA,EAAK,CAAC,EAAEI,CAAQ,CAAC,CAC7E,CACF,EAIae,GAAc,CAACC,EAAW,CAAE,SAAAhB,EAAW,WAAY,WAAAiB,KAAwD,CACtH,MAAMC,EAAe,MAAM,QAAQF,EAAKhB,CAAQ,CAAC,GAAKgB,EAAKhB,CAAQ,EAAE,OAAS,EACxEmB,EAAiBF,EAAWD,CAAI,GAAK,CAAA,EAC3C,OAAIE,EACKE,GAAAP,GAAA,GACFM,GADE,CAEL,CAACnB,CAAQ,EAAGgB,EAAKhB,CAAQ,EAAE,IAAK,GAC9Be,GAAY,EAAG,CACb,SAAAf,EACA,WAAAiB,CAAA,CACD,CAAA,CACH,GAGKJ,GAAA,GACFM,EAET,EAIaE,GAAU,CAAUC,EAAeC,IAAoDD,EAAS,IAAKrF,GAAS8E,GAAY9E,EAAMsF,CAAG,CAAC,EAQpIC,GAAW,CAACC,EAAkBC,EAAcC,EAAa,CAAA,IAAO,CAC3EF,EAAU,QAASG,GAAY,CAC7B,MAAMC,EAAUH,EAASE,EAASD,CAAU,GAAKC,EAC7CA,EAAQ,UAAUJ,GAASI,EAAQ,SAAUF,EAAUG,CAAO,CACpE,CAAC,CACH,EC1JaC,GAAmB,CAACC,EAA6BhE,EAAa,KAA4B,OACrG,MAAMiE,EAA2B,CAAA,EAEjC,UAAWC,KAASF,EAAQ,CAC1B,MAAMG,EAAOD,GAAA,YAAAA,EAAO,KACpB,GAAIA,EAAM,OAAS,SAAUC,GAAA,MAAAA,EAAM,SAAU,CAACA,EAAK,MAAO,SAE1D,MAAMlB,EAA0B,EAACkB,GAAA,MAAAA,EAAM,eAAcxK,EAAAuK,EAAM,WAAN,YAAAvK,EAAgB,UAAW,EAAI0J,GAAAP,GAAA,GAAKoB,EAAM,SAAS,CAAC,GAArB,CAAwB,KAAMnE,GAAYmE,EAAM,KAAMA,EAAM,SAAS,CAAC,EAAE,IAAI,IAAMpB,GAAA,GAAKoB,GAE3KjB,EAAK,KAAOlD,GAAYC,EAAYiD,EAAK,IAAI,EAEzCA,EAAK,WAAUA,EAAK,SAAWc,GAAiBd,EAAK,SAAUA,EAAK,IAAI,GAExEA,GAAMgB,EAAI,KAAKhB,CAAI,CACzB,CACA,OAAOgB,CACT,ECR6C,SAAAG,GAAAC,EAAA,CAAA,OAAA,OAAAA,GAAA,YAAAC,OAAAC,UAAA1K,SAAA2K,KAAAH,CAAA,IAAA,mBAAA,CAAAI,EAAAA,QAAAJ,CAAA,CAAA,CAE3C,KAAM,CAAE1M,aAAAA,EAAa,EAAIE,YAAQ,EAE3BC,GAAYH,GAAa,YAAY,0BAEZ,CAC7BW,KAAM,eACNc,OAAQ,CACN,MAAMsL,EAAWC,GAAAA,YAAW,EACtBC,EAAYC,GAAAA,cAAa,EAEzBC,EAAqBvE,EAAAA,SAAS,IAAMmE,EAASK,qBAAqB,EAClE,CAAEC,aAAAA,GAAiBC,aAAS,EAE5B,CAAEC,EAAAA,GAAMzN,GAAa,EAErB0N,EAAYC,EAAAA,IAAyB,EAAE,EACvCC,EAAc9E,EAAAA,SAAS,IAAM,CACjC,MAAM+E,EAAUV,EAAUW,WAC1B,OAAOxB,GAAiBuB,CAAO,CACjC,CAAC,EAEKE,EAAgBA,IAAM,CAC1B,MAAMC,EAAcT,EAAapM,MAAM8M,QAAQC,MAAM,EAAE,EAAE,CAAC,EAAE1L,KAC5DkL,EAAUvM,MAAQgK,GAA0BgD,QAAMP,CAAW,EAAIlD,GAA4BA,EAAKlI,OAASwL,CAAW,CACxH,EAEMI,EAAmBA,IACAxD,GAAgCuD,EAAAA,MAAMT,CAAS,CAAC,EACjDW,IAAK1G,GAAM,CAC/B,MAAM2G,EAAW,CAAC3G,EAAE4G,UAAY5G,EAAE4G,WAAa,aACzC7B,EAAO/E,EAAE+E,KACf,OAAA7K,EAAAA,YAAA2M,EAAAA,iBAAA,CAAA,GAEQ,CAAEhM,KAAM8L,EAAW,GAAK3G,EAAEnF,MAAM,IAC/BmF,EAAE9G,IAAI,EAAA,CAAAK,QAAAA,IAAAA,SAAA,OACVwL,GAAAA,MAAAA,EAAM3H,MAAQsI,EAAmBlM,oFAIlBuL,EAAK3H,KAAI,UAAA,eAAA,IAAA,EACe,IACnC0I,IAAE9F,EAAAA,GAAAA,YAAAA,EAAG+E,OAAH/E,YAAAA,EAAS8G,QAAS,EAAE,CAAC,CAAA,EAG1BhB,IAAE9F,EAAAA,GAAAA,YAAAA,EAAG+E,OAAH/E,YAAAA,EAAS8G,QAAS,EAAE,CACvB,EAAA,CAAA,CAGP,CAAC,EAGHC,OAAAA,EAAAA,MACE,IAAMnB,EAAapM,MAAMqB,KACxBA,GAAS,CACJA,EAAKmM,WAAW,YAAY,GAEhCZ,EAAa,CACf,EACA,CACElI,UAAW,EACb,CACF,EAIO,IAAA,CAAA,IAAA+I,EAAA,OAAA/M,EAAAA,YAAAgN,EAAAA,aAAA,CAAA,UAAA,IAAA,MAGI,GAAGxO,EAAS,qCAAqC,EAAA,CAAAa,QAAAA,IAAA,CAAAW,EAAAA,YAAAiN,kBAAA,CAAA,OAAA,GAAA,qBAAA,0CAAAnC,GAAAiC,EAIrDR,EAAgB,CAAE,EAAAQ,EAAA,CAAA1N,QAAAA,IAAA,CAAA0N,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAI3B,CACF,CAAC,qCCnGGG,GAAqB,CACzB,QAAQrO,EAAgB,OACtBA,EAAI,WAAUwB,EAAA8M,GAAa,OAAb,KAAA9M,EAAqB,eAAgB8M,EAAY,CACjE,CACF,ECWQ,CAAE9O,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,YAAY,0BAEZ,CAC7BW,KAAM,eACNC,MAAO,CACL2N,MAAO,CACLzN,KAAMC,OACNC,QAAS,EACX,GAGF+N,MAAO,CAAC,SAAS,EAEjBtN,MAAMb,EAAO,CAAEoO,KAAAA,EAAMtN,MAAAA,CAAM,EAAG,CAC5B,MAAMuN,EAAWC,EAAAA,mBAAkB,EAE7BC,EAAiBC,GAAsB,CAC3CJ,EAAK,UAAWI,EAAOH,CAAQ,CACjC,EAEA,MAAO,IAAAtN,EAAAA,YAAA0N,eAAA,CAAA,MAEIzO,EAAM2N,MAAK,UACPY,EAAa,MACjBhP,EAAS,EAAA,CAEdmP,UAAWA,IAAAA,OAAM5N,OAAAA,EAAAA,EAAM4N,YAAN5N,YAAAA,EAAAA,KAAAA,IAAmB,CAI5C,CACF,CAAC,qCC9CG6N,GAAgB,CACpB,QAAQ/O,EAAgB,OACtBA,EAAI,WAAUwB,EAAAwN,GAAa,OAAb,KAAAxN,EAAqB,eAAgBwN,EAAY,CACjE,CACF,ECMMC,GAAgBxO,GACP,OAAO,UAAU,SAAS,KAAKA,CAAK,EACrC,MAAM,EAAG,EAAE,EAGZyO,GAAa,CAAC5O,EAA0C,oBA+B5D,CACL,WA/BiB,CAAC6C,EAAa1C,IAAqB,CACpD,MAAM0O,EAAYF,GAAaxO,CAAK,EACpC,OAAOH,CAAI,EAAE,QAAQ6C,EAAK,KAAK,UAAU,CAAE,KAAMgM,EAAW,MAAA1O,CAAA,CAAO,CAAC,CACtE,EA6BE,WA3BkB0C,GAAqB,CACvC,MAAM1C,EAAQ,OAAOH,CAAI,EAAE,QAAQ6C,CAAG,EACtC,GAAI1C,EAAO,CACT,KAAM,CAAE,MAAOmB,CAAA,EAAQ,KAAK,MAAMnB,CAAK,EACvC,OAAOmB,CACT,KAAO,QAAOnB,CAChB,EAsBE,cApBqB0C,GAAsB,CAC3C,OAAO7C,CAAI,EAAE,WAAW6C,CAAG,CAC7B,EAmBE,MAjBaiM,GAA8B,CAE3C,MAAMC,EAAO,OAAO,KAAK,OAAO/O,CAAI,CAAC,EAC/BgP,EAAkB,CAAC,gBAAiB,qBAAqB,EACzDC,EAAcH,EAAW,CAAC,GAAGA,EAAU,GAAGE,CAAe,EAAIA,GAC9CC,EAAcF,EAAK,OAAQlM,GAAQ,CAACoM,EAAY,SAASpM,CAAG,CAAC,EAAIkM,GAEzE,QAASlM,GAAQ,CAC5B,OAAO7C,CAAI,EAAE,WAAW6C,CAAG,CAC7B,CAAC,CAEH,CAME,GClCEqM,GAAmB,IACnBC,GAAwB,IACxBC,GAAc,IACdC,GAAmB,IAmBZC,GAAQ,CAAOC,EAAcvP,EAAoB,YAAcoD,GAAA,sBAC1E,MAAMoM,EAAW,SAAS,KAAK,cAAc,uBAAuB,EAChEA,KAAmB,OAAA,EACvB,KAAM,CAAE,WAAAC,CAAA,EAAeb,GAAW,cAAc,EAC1Cc,EAAOD,EAAW,MAAM,EAC9B,IAAIE,EAAY,OACZD,IAAS,OAAMC,EAAY,QAC/B,MAAMC,EAAW5P,IAAS,QAAUmP,GAAwBD,GAC5D,IAAIW,EAAI,gBACJlO,GAAQ4N,CAAG,EAAGM,EAAIN,EAAI,SAAW,gBAC5B,OAAOA,GAAQ,UAAY,OAAOA,GAAQ,UAAY,OAAOA,GAAQ,UAAWM,EAAI,OAAON,CAAG,EAC9F,OAAOA,GAAQ,WAAUM,EAAI,KAAK,UAAUN,CAAG,GAExDO,iBAAe,CACb,MAAOH,EACP,QAASE,EACT,KAAA7P,EACA,SAAA4P,CAAA,CACD,EACD,MAAM1M,GAAM0M,CAAQ,CACtB,GAQaG,GAAU,CAAOR,EAAavP,EAAoB,YAAcoD,GAAA,sBAC3E,GAAI,SAAS,KAAK,cAAc,kBAAkB,EAAG,OAErD,IAAI4M,EACJ,MAAMC,EAAmB,GACzBD,EAAO,WACP,KAAM,CAAE,WAAAP,CAAA,EAAeb,GAAW,cAAc,EAC1Cc,EAAOD,EAAW,MAAM,EAC9B,IAAIS,EAAO,OACPC,EAAK,KACLC,EAAS,KACb,OAAIb,EAAKS,EAAOT,EACPG,IAAS,OAChBM,EAAO,oCACPE,EAAO,OACPC,EAAK,KACLC,EAAS,UAGJ,IAAI,QAAQ,CAAC/M,EAASgN,IAAW,CACtCC,eAAa,QAAQN,EAAME,EAAM,CAC/B,kBAAmBC,EACnB,iBAAkBC,EAClB,KAAApQ,EACA,iBAAAiQ,CAAA,CACiB,EAChB,KAAK,IAAM,CACV5M,EAAQ,EAAI,CACd,CAAC,EACA,MAAM,IAAM,CACXgN,EAAO,EAAK,CACd,CAAC,CACL,CAAC,CACH,GAEaE,GAAU,CAAOhB,EAAcvP,EAAoB,UAAWwQ,EAAqB,KAAUpN,GAAA,sBACxG,GAAIoN,IAAc,KACG,SAAS,KAAK,cAAc,kBAAkB,GAG/C,SAAS,KAAK,cAAc,uBAAuB,GACtD,OAEjB,IAAIX,EAAI,gBACJlO,GAAQ4N,CAAG,EAAGM,EAAIN,EAAI,SAAW,gBAC5B,OAAOA,GAAQ,UAAY,OAAOA,GAAQ,UAAY,OAAOA,GAAQ,UAAWM,EAAI,OAAON,CAAG,EAC9F,OAAOA,GAAQ,WAAUM,EAAI,KAAK,UAAUN,CAAG,GACxD,MAAMK,EAAW5P,IAAS,QAAUqP,GAAmBD,GACvDqB,YAAU,CACR,QAASZ,EACT,UAAW,GACX,KAAA7P,EACA,SAAA4P,CAAA,CACD,EACD,MAAM1M,GAAM0M,CAAQ,CACtB,GCnGQ,CAAE1Q,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,QAAQ,0BAER,CAC7BW,KAAM,WACNC,MAAO,CACL4Q,QAAS,CACP1Q,KAAMO,QACNL,QAAS,IAEXyQ,KAAM,CACJ3Q,KAAMC,OACNC,QAAS,IAEX0Q,MAAO,CACL5Q,KAAMC,OACNC,QAAS,IAEX2Q,KAAM,CACJ7Q,KAAMC,OACNC,QAAS4Q,QAEX9Q,KAAM,CACJA,KAAMC,OACNC,QAAS,WAEX6Q,KAAM,CACJ/Q,KAAMO,QACNL,QAAS,IAEX8Q,QAAS,CACPhR,KAAMO,QACNL,QAAS,IAEXoN,SAAU,CACRtN,KAAM,CAACO,QAASN,MAAM,EACtBC,QAAS,IAEX+Q,QAAS,CACPjR,KAAMC,OACNiR,SAAU,GACVhR,QAAS4Q,QAEX/M,KAAM,CAEJ/D,KAAMC,OACNC,QAAS,IAEXiR,WAAY,CACVnR,KAAMC,OACNC,QAAS,UAEXkR,QAAS,CACPpR,KAAMC,OACNC,QAAS4Q,QAEXzL,KAAM,CACJrF,KAAMC,OACNC,QAAS4Q,QAEXf,QAAS,CACP/P,KAAM,CAACO,QAASN,MAAM,EACtBC,QAAS,IAEXmR,MAAO,CACLrR,KAAMC,OACNC,QAAS4Q,QAEXQ,GAAI,CACFtR,KAAMuR,SACNrR,QAASA,IAAM,CAAC,CAClB,GAIF+N,MAAO,CAAC,QAAS,SAAS,EAE1BtN,MAAMb,EAAO,CAAEoO,KAAAA,EAAMtN,MAAAA,CAAM,EAAG,CAG5B,KAAM,CAAE6L,EAAAA,GAAMzN,GAAa,EACrByM,EAAQ+F,GAAAA,SAAQ,EAChBvF,EAAWC,GAAAA,YAAW,EACtBiC,EAAWC,EAAAA,mBAAkB,EAC7BqD,EAAaC,EAAAA,gBAAgB,MAAM,EACnCC,EAAa7J,EAAAA,SAAoC,IAAA,OAAOhI,OAAAA,EAAAA,EAAM+Q,OAAN/Q,KAAAA,EAAcqN,EAAAA,MAAMsE,CAAU,EAAmB,EACzGG,EAAgB9J,EAAAA,SAAS,IAAMmE,EAAS2F,aAAa,EACrDC,EAAWlF,EAAAA,IAAI7M,EAAMkR,OAAO,EAC5Bc,EAASnF,EAAAA,IAAI,EAAK,EAClBoF,EAASpF,EAAAA,IAAI7M,EAAM4Q,OAAO,EAC1BsB,EAAOrF,EAAAA,IAAI,EAAI,EAGfsF,EAAWnK,EAAAA,SAAS,IAAM,OAC9B,OAAIhI,EAAM6Q,MAAQ7Q,EAAM8Q,MAAc9Q,EAAM6Q,MAChC/P,EAAAA,EAAMV,UAANU,YAAAA,EAAAA,KAAAA,EACd,CAAC,EAGD8M,EAAAA,MACE,IAAM5N,EAAMkR,QACXrK,GAAOkL,EAAS1R,MAAQwG,CAC3B,EACA+G,EAAAA,MACE,IAAM5N,EAAM4Q,QACX/J,GAAOoL,EAAO5R,MAAQwG,CACzB,EAIA,MAAMuL,EAAqBnP,GAAkBK,GAAA,8BAC3C,MAAM+O,GAAMhE,GAAAA,EAAAA,GAAAA,YAAAA,EAAU3I,QAAV2I,YAAAA,EAAiBrO,QAAjBqO,YAAAA,EAAwBiE,QAC9BC,EAAWF,EAAOG,MAAM5Q,QAAQyQ,CAAG,EAAIA,EAAM,CAACA,CAAG,EAAK,CAAA,EAC5D,GAAIE,EAASE,SAAW,EAAG,CACzBrE,EAAK,QAASnL,EAAGjD,EAAMuF,IAAI,EAC3B,MACF,CACA,UAAWmN,KAAWH,EAAU,MAAMG,EAAQzP,EAAGjD,EAAMuF,IAAI,CAC7D,GAEMoN,EAAqBC,GAAqCtP,GAAA,sBAC9D,GAAItD,EAAMkR,QAAS,CACjB,MAAM0B,EAAI,EACV,MACF,CACAb,EAAS1R,MAAQ,GACjB,GAAI,CACF,MAAMuS,EAAI,CACZ,QAAA,CACEb,EAAS1R,MAAQ,EACnB,CACF,GAEMwS,EAAeA,IACd7S,EAAMiE,KACPjE,EAAMiE,KAAK4J,WAAW,SAAS,EACjC9M,EAAAA,YAAAkI,GAAA,CAAA,SAAA,KAAA,SAGcjJ,EAAMiE,KAAK6O,QAAQ,WAAY,EAAE,GAAC,IAAA,EAGzC9S,EAAMiE,KAAK4J,WAAW,UAAU,GAAK7N,EAAMiE,KAAK4J,WAAW,SAAS,EAC3E9M,EAAAA,YAAAkI,GAAA,CAAA,SAAA,WAAA,SAGcjJ,EAAMiE,KAAK6O,QAAQ,WAAY,EAAE,CAAC,EAAA,IAAA,EAG7C/R,EAAAA,YAAAkI,GAAA,CAAA,SAAyBjJ,EAAMiE,IAAI,EAAA,IAAA,EAfhB,GA8BpB8O,EAAaA,IAAM,OACvB,GAAIpH,EAAO,CACT,MAAMC,EAAOD,EAAMC,KACnB,GAAIA,EAAM,CACR,MAAMoH,EAAKpH,EAAKoH,IAAM,GACtB,GAAIA,EAAI,CACN,IAAI3I,EAAiBrK,EAAM6Q,MAAQ,GAEnC,GADI7Q,EAAM8Q,QAAOzG,EAASrK,EAAM8Q,OAC5BzG,IAAW,GAAI,CACjB,MAAM4I,GAAOnS,EAAAA,EAAMV,UAANU,YAAAA,EAAAA,KAAAA,GACTmS,GAAQA,EAAK,CAAC,IAAG5I,EAAS5E,GAAawN,EAAK,CAAC,CAAC,GAAK,GACzD,CACA,GAAI5I,EAAQ,CAEV,MAAMkH,EADQyB,EAAGE,MAAM,GAAG,EACN7I,OAAQ8I,GAAMA,EAAEC,QAAQ/I,CAAM,IAAM,EAAE,EAC1D,GAAIkH,EAAMkB,OAAS,EAAG,CAEpB,MAAMY,GADI9B,EAAM,CAAC,EACH2B,MAAM,GAAG,EACnBG,GAAI,CAAC,IAAM,KAAOA,GAAI,CAAC,GAAKA,GAAI,CAAC,IAAM,MACzCpB,EAAO5R,MAAQ,GACf6R,EAAK7R,MAAQ,GAEjB,CACF,CACF,CACF,CACF,CACF,EAEMiT,GAAc,CAAOrQ,EAAe/C,IAAkBoD,GAAA,oCAE1D,GAAItD,EAAMsR,UAAY,QAAS,CAC7B,IAAIzH,GAAcwE,GAAAA,YAAAA,EAAUxE,OAC5B,KAAOA,MAAUA,EAAAA,GAAO3J,OAAP2J,YAAAA,EAAa9J,QAAS,UAAU8J,GAASA,GAAOA,OAGjE,IAFA,MAAMA,GAAAA,EAAAA,GAAO0J,SAAQC,cAAf3J,YAAAA,EAAAA,KAAAA,GAECA,MAAUA,EAAAA,GAAO3J,OAAP2J,YAAAA,EAAa9J,QAAS,UAAU8J,GAASA,GAAOA,OACjE,MAAM4J,EAAW5J,GAEX6J,EAAiBD,GAAAA,YAAAA,EAAUF,QAAQG,eAAerT,MAClDsT,GAAWF,GAAAA,YAAAA,EAAUzT,MAAM2T,SAE7BD,GAAkBlB,MAAM5Q,QAAQ8R,CAAc,GAChDA,EAAelJ,QAAQ,CAAC2I,GAAQS,KAAkB,CAC5CT,GAAEjT,OAAS,QAAOyT,GAASC,EAAK,EAAE,WAAgBT,GAAEU,YACxDF,GAASC,EAAK,EAAE,MAAWT,GAAE9S,MAC7BsT,GAASC,EAAK,EAAE,UAAeT,GAAEW,UACjCH,GAASC,EAAK,EAAE,OAAYT,GAAEzS,OAC9BiT,GAASC,EAAK,EAAE,SAAcT,GAAE3F,UAE5B2F,GAAEY,WAAa,cAAgBZ,GAAEY,WAAa,oBAChDlK,GAAO7J,MAAMgU,MAAM3T,MAAM8S,GAAEc,MAAQ,QAAQ,EAAIjD,OAC/CnH,GAAO7J,MAAMgU,MAAM3T,MAAM8S,GAAEc,MAAQ,MAAM,EAAIjD,OAC7CnH,GAAO7J,MAAMgU,MAAM3T,MAAM8S,GAAEc,KAAK,EAAIjD,OAExC,CAAC,EAEH,MAAMhR,EAAAA,EAAMwR,KAANxR,YAAAA,EAAAA,KAAAA,EAAWA,EAAMuF,MAEvB,MAAM2O,EAASrK,IAAAA,YAAAA,GAAQnE,MAAMyO,GAEvBC,EAAmBF,GAAAA,YAAAA,EAAQG,iBAAiB,yBAClD,GAAID,EACF,QAASxR,GAAI,EAAGA,GAAIwR,EAAiB3B,OAAQ7P,KAAK,CAChD,MAAM0R,GAAaF,EAAiBxR,EAAC,EAAE2R,cAAc,6CAA6C,EAC9FD,KAAYA,GAAWjU,MAAQ,IACnC,MAAMmU,EAAWJ,EAAiBxR,EAAC,EAAE2R,cAAc,2CAA2C,EAC1FC,IAAUA,EAASnU,MAAQ,GACjC,CAEF,MAAMsS,EAAY,IAAYrP,GAAA,6BAC5B,MAAMmR,IAAY5K,GAAAA,IAAAA,YAAAA,GAAQnE,MAAMyO,KAAdtK,YAAAA,GAAkB0K,cAAc,sCAClDE,IAAAA,MAAAA,GAAWC,OACb,EAAC,EACD,MACF,SAAW1U,EAAMsR,UAAY,UAAYtR,EAAMsR,UAAY,SAAU,CACnElD,EAAK,QAASnL,EAAGjD,EAAMuF,IAAI,EAC3B,MACF,CAEA,MAAMoN,EAAY,IAAYrP,GAAA,sBAC5B,GAAIpD,IAAS,WAAa4R,EAAczR,QAAU,GAChD,GAAI,CACF,MAAM4P,GAAQtD,EAAE,mBAAmB,CAAC,CACtC,OAAQ1J,GAAA,CACN,MACF,CAEF,GAAI,CAAC+O,EAAO3R,MAAO,CACjB2R,EAAO3R,MAAQ,GACf,GAAI,CACF,MAAM+R,EAAYnP,CAAC,CACrB,QAAA,CACE+O,EAAO3R,MAAQ,EACjB,CACF,CACF,EAAC,CACH,GAWA,MAAO,IAAM,CAEX0S,EAAU,EAEV,MAAM4B,EAAS3U,EAAMsR,QAAU,GAAG/R,EAAS,IAAIS,EAAMsR,OAAO,GAAK,GAAG/R,EAAS,GAC7E,GAAI2S,EAAK7R,MAAO,CACd,IAAIuU,EACJ,OAAI5U,EAAMiQ,UAAY,QAAUjQ,EAAMiQ,UAAY,GAC5C6B,EAAczR,QAAU,GAC1BuU,kDAGW,CAAEC,QAAS5C,EAAO5R,MAAQ,GAAK,QAAQ,gBAC/BL,EAAMmR,QAAO,KACtBU,EAAWxR,MAAK,KAChBL,EAAME,OAAS,OAASF,EAAME,KAAO8Q,OAAS,KAC9ChR,EAAMiR,KAAI,QACPc,EAAS1R,MAAK,SACb,CAAC,CAACL,EAAMwN,SAAQ,KACpBqF,EAAY,EAAE,cACP7S,EAAMqR,WAAU,QACnBpO,GAAkBqQ,GAAYrQ,EAAG,SAAS,EAAC,MAC9C0R,CAAM,EAAA,CAAAvU,QAAAA,IAAA,CACZ+R,EAAS9R,KAAK,CAAA,CAAA,EAInBuU,0BAEWjI,EAAE,mBAAmB,EAAC,UACjB1J,GAAkBqQ,GAAYrQ,EAAG,SAAS,CAAC,EAAA,CAErDyL,UAAWA,IAAA3N,EAAAA,YAAA+T,WAAA,CAAA,IAAA,YAAA,MAGA,CAAED,QAAS5C,EAAO5R,MAAQ,GAAK,QAAQ,gBAC/BL,EAAMmR,QAAO,KACtBU,EAAWxR,MAAK,KAChBL,EAAME,OAAS,OAASF,EAAME,KAAO8Q,OAAS,KAC9ChR,EAAMiR,KAAI,QACPc,EAAS1R,MAAK,SACb,CAAC,CAACL,EAAMwN,SAAQ,KACpBqF,EAAY,EAAE,cACP7S,EAAMqR,WAAU,MACtBsD,CAAM,EAAA,CAAAvU,QAAAA,IAAA,CACZ+R,EAAS9R,KAAK,CAAA,CAAA,EAElB,EAKTuU,kDAGW,CAAEC,QAAS5C,EAAO5R,MAAQ,GAAK,QAAQ,gBAC/BL,EAAMmR,QAAO,KACtBU,EAAWxR,MAAK,KAChBL,EAAME,OAAS,OAASF,EAAME,KAAO8Q,OAAS,KAC9ChR,EAAMiR,KAAI,QACPc,EAAS1R,MAAK,SACb,CAAC,CAACL,EAAMwN,SAAQ,KACpBqF,EAAY,EAAE,cACP7S,EAAMqR,WAAU,QACnBpO,GAAkBqQ,GAAYrQ,CAAC,EAAC,MACnC0R,CAAM,EAAA,CAAAvU,QAAAA,IAAA,CACZ+R,EAAS9R,KAAK,EAAA,EAGduU,CACT,KAAO,QAAO,IAChB,CACF,CACF,CAAC,qCC/WGG,GAAiB,CACrB,QAAQnV,EAAgB,OACtBA,EAAI,WAAUwB,EAAA4T,GAAS,OAAT,KAAA5T,EAAiB,WAAY4T,EAAQ,CACrD,CACF,ECUQ,CAAE5V,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,MAAM,0BAEN,CAC7BW,KAAM,SACNC,MAAO,CAAA,EACPa,MAAMoU,EAAQ,CAAEnU,MAAAA,CAAM,EAAG,CAQvB,MAAMoU,EAAgBA,IAAM,SAC1B,OAAIpU,EAAAA,EAAMqU,SAANrU,MAAAA,EAAAA,KAAAA,GAAkBC,EAAAA,YAAA,MAAA,CAAA,MAAA,YAAA,EAA8BD,EAAAA,EAAMqU,SAANrU,YAAAA,EAAAA,KAAAA,EAAgB,CAAA,EACxD,IACd,EAGA,MAAO,IAAAC,EAAAA,YAAAqU,SAAA,CAAA,MACU7V,EAAS,EAAA,CAEpB4V,OAAQA,IAAMD,EAAa,EAC3B9U,QAASA,IAAAA,OAAMU,OAAAA,EAAAA,EAAMV,UAANU,YAAAA,EAAAA,KAAAA,IAAiB,CAIxC,CACF,CAAC,qCC3CGuU,GAAe,CACnB,QAAQzV,EAAgB,OACtBA,EAAI,WAAUwB,EAAAkU,GAAO,OAAP,KAAAlU,EAAe,SAAUkU,EAAM,CAC/C,CACF,ECUQ,CAAElW,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,UAAU,0BAEV,CAC7BW,KAAM,aACNC,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNiR,SAAU,GACVhR,QAAS,IAEXL,KAAM,CACJG,KAAMC,OACNiR,SAAU,GACVhR,QAAS4Q,QAEXvH,GAAI,CACFvJ,KAAMC,OACNiR,SAAU,GACVhR,QAAS4Q,QAEX3Q,MAAO,CACLH,KAAMsS,MACNpB,SAAU,GACVhR,QAASA,IAAM,CAAA,GAEjBmV,QAAS,CACPrV,KAAMsS,MACNpB,SAAU,GACVhR,QAASA,IAAM,CAAA,GAEjB2Q,KAAM,CACJ7Q,KAAMC,OACNC,QAAS4Q,QAEXwE,YAAa,CACXtV,KAAMC,OACNiR,SAAU,GACVhR,QAAS,OAEXoN,SAAU,CACRtN,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXwQ,QAAS,CACP1Q,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXqV,UAAW,CACTvV,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXsV,cAAe,CACbxV,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXuV,UAAW,CACTzV,KAAMC,OACNiR,SAAU,GACVhR,QAAS,OAEXwV,QAAS,CACP1V,KAAMC,OACNiR,SAAU,GACVhR,QAAS,SAEXyV,WAAY,CACV3V,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEX0V,SAAU,CACR5V,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEX2V,KAAM,CACJ7V,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEX4V,SAAU,CACR9V,KAAMuR,SACNL,SAAU,GACVhR,QAASA,IAAM,CAAC,CAClB,GAGF+N,MAAO,CAAC,QAAS,OAAQ,QAAS,UAAW,QAAQ,EAErDtN,MAAMb,EAAO,CAAEoO,KAAAA,CAAK,EAAG,CAErB,KAAM,CAAEzB,EAAAA,GAAMzN,GAAa,EACrB+W,EAAOjW,EAAMuV,QACbW,EAAarJ,EAAAA,IAAI7M,EAAMK,KAAK,EAC5BsR,EAAaC,EAAAA,gBAAgB,MAAM,EAGnCuE,EAAenO,EAAAA,SAAoC,IAAA,OAAOhI,OAAAA,EAAAA,EAAM+Q,OAAN/Q,KAAAA,EAAcqN,EAAAA,MAAMsE,CAAU,EAAmB,EAC3GyE,EAAepO,WAAS,IAAOhI,EAAMwV,YAAcxV,EAAMwV,YAAc7I,EAAE,oBAAoB,CAAE,EAC/F0J,EAAcrO,EAAAA,SAAS,IAAMhI,EAAMwN,QAAQ,EAC3C8I,EAAkBtO,EAAAA,SAAS,IAAA,SAAOhI,QAAAA,GAAAA,EAAAA,EAAMyJ,KAANzJ,KAAAA,EAAYA,EAAMD,OAAlBC,KAAAA,EAA0BA,EAAMC,OAAS+Q,OAAS,EAG1FpD,EAAAA,MACE,IAAM5N,EAAMK,MACXkW,GAAW,CACVL,EAAW7V,MAAQkW,CACrB,CACF,EAQA,MAAMC,EAAgBhV,GAAQ,CAC5B4M,EAAK,SAAU5M,CAAG,CACpB,EACMiV,EAAcjI,GAAU,CAC5BJ,EAAK,OAAQI,CAAK,CACpB,EAQMkI,EAAqBA,CAAC9M,EAAM+M,IAAU,CAE1C,MAAMjV,EAAOkI,EAAKlI,KACZkV,EAAShN,EAAKiN,WACdnM,EAAOd,EAAKc,KAClB,GAAIiM,EAAO,CAET,GADIjV,EAAKoV,KAAK,GAAG,EAAE1D,QAAQuD,CAAK,GAAK,GACjCC,EAAOE,KAAK,GAAG,EAAE1D,QAAQuD,CAAK,GAAK,EAAG,MAAO,GACjD,GAAIjM,EAAKqM,MACP,OAAIrM,EAAKqM,MAAM3D,QAAQuD,CAAK,GAAK,EAAU,GAEvB/M,EAAKoN,UACNC,KAAM9D,IAAM,CAC3B,GAAIA,GAAEzI,KAAKqM,OAAS5D,GAAEzI,KAAKqM,MAAM3D,QAAQuD,CAAK,GAAK,EAAG,MAAO,EAC/D,CAAC,CAEP,CACF,EAGA,OAAA5V,EAAAA,YAAAmW,EAAAA,WAAAxO,aAAA,CAAA,IAES1I,EAAMC,MAAQ,cAAa,GAC5BqW,EAAgBjW,OACfL,EAAMD,KAAO,CAAEA,KAAMC,EAAMD,MAAS,GAAE,CAAA,MACpCR,GAAS,WACP2W,EAAW7V,MAAK,sBAAA8W,GAAhBjB,EAAW7V,MAAK8W,EAAA,MAClB,CAAEtC,QAAS7U,EAAMK,MAAQ,GAAK,QAAQ,KACvC8V,EAAa9V,MAAK,YACX+V,EAAa/V,MAAK,QACtB4V,EAAI,SACHI,EAAYhW,MAAK,kBACVL,EAAM0V,cAAa,UACzB1V,EAAMyV,UAAS,UACfzV,EAAM2V,UAAS,WACd3V,EAAM6V,WAAU,gBACba,EAAkB,SACvB,IAAG,OACLD,EAAU,SACRD,EAAY,gBAAA,GAAA,MAEf,CACLY,cAAepX,EAAM4V,QACrBG,KAAM/V,EAAM+V,KACZC,SAAUhW,EAAMgW,SAChBF,SAAU9V,EAAM8V,QAClB,CAAC,CAAA,EAAA,IAAA,CAEP,CACF,CAAC,qCCtMGuB,GAAmB,CACvB,QAAQzX,EAAgB,OACtBA,EAAI,WAAUwB,EAAAkW,GAAW,OAAX,KAAAlW,EAAmB,aAAckW,EAAU,CAC3D,CACF,ECYQ,CAAElY,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,UAAU,0BAEV,CAC7BW,KAAM,aAENC,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNC,QAAS,IAEXC,MAAO,CACLH,KAAM,CAACO,QAASN,OAAQG,MAAM,EAC9BF,QAAS4Q,QAEXJ,QAAS,CACP1Q,KAAMO,QACNL,QAAS,IAEXmX,cAAe,CACbrX,KAAMO,QACNL,QAAS,IAEXoX,MAAO,CACLtX,KAAM,CAACC,OAAQG,OAAQG,OAAO,EAC9BL,QAAS4Q,QAEXxD,SAAU,CACRtN,KAAMO,QACNL,QAAS,IAEXqX,OAAQ,CACNvX,KAAMO,QACNL,QAAS,IAEX2Q,KAAM,CACJ7Q,KAAMC,OACNC,QAAS,SACX,GAIF+N,MAAO,CAAC,oBAAqB,QAAQ,EAErCtN,MAAMb,EAAO,CAAEoO,KAAAA,EAAMtN,MAAAA,CAAM,EAAG,CAC5B,MAAM6Q,EAAaC,EAAAA,gBAAgB,MAAM,EACnC8F,EAAgB7K,EAAAA,IAAI7M,EAAMK,KAAK,EAC/BsX,EAAe3P,EAAAA,SAAoC,IAAA,OAAOhI,OAAAA,EAAAA,EAAM+Q,OAAN/Q,KAAAA,EAAcqN,EAAAA,MAAMsE,CAAU,EAAmB,EAIjH/D,EAAAA,MACE,IAAM5N,EAAMK,MACXmB,GAAQ,CACPkW,EAAcrX,MAAQmB,CACxB,CACF,EAIA,MAAMoW,EAAgBpW,GAA4B,CAChDkW,EAAcrX,MAAQmB,EACtB4M,EAAK,oBAAqB5M,CAAG,CAC/B,EAEMgV,EAAgBhV,GAA4B,CAChD4M,EAAK,SAAU5M,CAAG,CACpB,EAGA,MAAO,IAAAT,EAAAA,YAAA8W,aAAA,CAAA,MAEItY,GAAS,WACJmY,EAAcrX,MAAK,sBACVuX,EAAY,MAC1B5X,EAAMwX,MAAK,cACHxX,EAAMuX,cAAa,SACxBvX,EAAMwN,SAAQ,OAChBxN,EAAMyX,OAAM,KACdE,EAAatX,MAAK,MACjB,CAAEwU,QAAS7U,EAAM4Q,QAAU,GAAK,QAAQ,SACrC4F,CAAY,EAAA,CAAApW,QAAAA,IAAAA,OAAA,QACrBU,EAAAA,EAAMV,UAANU,YAAAA,EAAAA,KAAAA,EAAiB,GAAA,CAGxB,CACF,CAAC,qCCrGGgX,GAAmB,CACvB,QAAQlY,EAAgB,OACtBA,EAAI,WAAUwB,EAAA2W,GAAW,OAAX,KAAA3W,EAAmB,aAAc2W,EAAU,CAC3D,CACF,ECYQ,CAAE3Y,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,iBAAiB,0BAEjB,CAC7BW,KAAM,mBACNiY,aAAc,GAEdhY,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNC,QAAS,IAEXC,MAAO,CACLH,KAAM,CAACC,OAAQG,OAAQG,OAAO,EAC9BL,QAAS4Q,QAEXjR,KAAM,CACJG,KAAMC,OACNC,QAAS4Q,QAEXJ,QAAS,CACP1Q,KAAMO,QACNL,QAAS,IAEXmX,cAAe,CACbrX,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXoX,MAAO,CACLtX,KAAM,CAACC,OAAQG,OAAQG,OAAO,EAC9BL,QAAS4Q,QAEXxD,SAAU,CACRtN,KAAMO,QACNL,QAAS,IAEXqX,OAAQ,CACNvX,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEX2Q,KAAM,CACJ7Q,KAAMC,OACNC,QAAS,SACX,GAIF+N,MAAO,CAAC,oBAAqB,QAAQ,EAErCtN,MAAMb,EAAO,CAAEoO,KAAAA,EAAMtN,MAAAA,CAAM,EAAG,CAC5B,MAAM6Q,EAAaC,EAAAA,gBAAgB,MAAM,EAEnC8F,EAAgB7K,EAAAA,IAAI7M,EAAMK,KAAK,EAIrCuN,EAAAA,MACE,IAAM5N,EAAMK,MACXmB,GAAQ,CACPkW,EAAcrX,MAAQmB,CACxB,CACF,EAIA,MAAMyW,EAAqBjQ,EAAAA,SAAoC,IAAA,OAAOhI,OAAAA,EAAAA,EAAM+Q,OAAN/Q,KAAAA,EAAcqN,EAAAA,MAAMsE,CAAU,EAAmB,EAIjHiG,EAAgBpW,GAA8B,CAClDkW,EAAcrX,MAAQmB,EACtB4M,EAAK,oBAAqB5M,CAAG,CAC/B,EAGA,MAAO,IAAAT,EAAAA,YAAAmX,mBAAA,CAAA,WAESR,EAAcrX,MAAK,sBACVuX,EAAY,MAC1B5X,EAAMK,MAAK,MACXL,EAAMwX,MAAK,cACHxX,EAAMuX,cAAa,SACxBvX,EAAMwN,SAAQ,KAClByK,EAAmB5X,MAAK,MACvBd,GAAS,OACRS,EAAMyX,OAAM,MACb,CAAE5C,QAAS7U,EAAM4Q,QAAU,GAAK,MAAO,CAAC,EAAA,CAAAxQ,QAAAA,IAAAA,OAAA,QAC9CU,EAAAA,EAAMV,UAANU,YAAAA,EAAAA,KAAAA,EAAiB,GAAA,CAGxB,CACF,CAAC,qCC7GGqX,GAAyB,CAC7B,QAAQvY,EAAgB,OACtBA,EAAI,WAAUwB,EAAAgX,GAAiB,OAAjB,KAAAhX,EAAyB,mBAAoBgX,EAAgB,CAC7E,CACF,ECYQ,CAAEhZ,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,gBAAgB,0BAEhB,CAC7BW,KAAM,kBAENC,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNC,QAAS,IAEXC,MAAO,CACLH,KAAMsS,MACNpB,SAAU,GACVhR,QAAS4Q,QAEXwG,MAAO,CACLtX,KAAMC,OACNC,QAAS4Q,QAEXD,KAAM,CACJ7Q,KAAMC,OACNC,QAAS,WAEXiY,IAAK,CACHnY,KAAMI,OACNF,QAAS4Q,QAEXzQ,IAAK,CACHL,KAAMI,OACNF,QAAS4Q,QAEXxD,SAAU,CACRtN,KAAMO,QACNL,QAAS,EACX,GAIF+N,MAAO,CAAC,oBAAqB,QAAQ,EAErCtN,MAAMb,EAAO,CAAEoO,KAAAA,EAAMtN,MAAAA,CAAM,EAAG,CAC5B,MAAM6Q,EAAaC,EAAAA,gBAAgB,MAAM,EAEnC8F,EAAgB7K,EAAAA,IAAI7M,EAAMK,KAAK,EAG/BiY,EAAoBtQ,EAAAA,SAAoC,IAAA,OAAOhI,OAAAA,EAAAA,EAAM+Q,OAAN/Q,KAAAA,EAAcqN,EAAAA,MAAMsE,CAAU,EAAmB,EAItH/D,EAAAA,MACE,IAAM5N,EAAMK,MACXmB,GAAQ,CACPkW,EAAcrX,MAAQmB,CACxB,CACF,EAIA,MAAMoW,EAAgBpW,GAA4B,CAChDkW,EAAcrX,MAAQmB,EACtB4M,EAAK,oBAAqB5M,CAAG,CAC/B,EAEMgV,EAAgBhV,GAA4B,CAChD4M,EAAK,SAAU5M,CAAG,CACpB,EAGA,MAAO,IAAAT,EAAAA,YAAAwX,kBAAA,CAAA,WAESb,EAAcrX,MAAK,sBACVuX,EAAY,KAC3BU,EAAkBjY,MAAK,aACjBL,EAAMwX,MAAK,IAClBxX,EAAMqY,IAAG,IACTrY,EAAMO,IAAG,SACJP,EAAMwN,SAAQ,MACjBjO,GAAS,SACNiX,CAAY,EAAA,CAAApW,QAAAA,IAAAA,OAAA,QACrBU,EAAAA,EAAMV,UAANU,YAAAA,EAAAA,KAAAA,EAAiB,GAAA,CAGxB,CACF,CAAC,qCCrGG0X,GAAwB,CAC5B,QAAQ5Y,EAAgB,OACtBA,EAAI,WAAUwB,EAAAqX,GAAgB,OAAhB,KAAArX,EAAwB,kBAAmBqX,EAAe,CAC1E,CACF,ECUQ,CAAErZ,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,KAAK,EAEpCsZ,qBAA+B,CAC7B3Y,KAAM,QACNC,MAAO,CACL2Y,KAAM,CACJzY,KAAMI,OACNF,QAAS,IAEXwY,OAAQ,CACN1Y,KAAMI,OACNF,QAAS,GAEXyY,GAAI,CACF3Y,KAAMI,OACNF,QAAS4Q,QAEX8H,GAAI,CACF5Y,KAAMI,OACNF,QAAS4Q,QAEX+H,GAAI,CACF7Y,KAAMI,OACNF,QAAS4Q,QAEXgI,GAAI,CACF9Y,KAAMI,OACNF,QAAS4Q,QAEXiI,GAAI,CACF/Y,KAAMI,OACNF,QAAS4Q,QAEXtM,IAAK,CACHxE,KAAMC,OACNC,QAAS,OAEXwQ,QAAS,CACP1Q,KAAMO,QACNL,QAAS,EACX,GAEFS,MAAMb,EAAO,CAAEc,MAAAA,CAAM,EAAG,CAEtB,MAAO,IAAAC,EAAAA,YAAAmY,QAAA,CAAA,IAAA,SAAA,MAGI,CAAErE,QAAS7U,EAAM4Q,QAAU,GAAK,QAAQ,GAC3C5Q,EAAM6Y,GAAE,GACR7Y,EAAM8Y,GAAE,GACR9Y,EAAM+Y,GAAE,GACR/Y,EAAMgZ,GAAE,GACRhZ,EAAMiZ,GAAE,KACNjZ,EAAM2Y,KAAI,OACR3Y,EAAM4Y,OAAM,IACf5Y,EAAM0E,IAAG,MACPnF,EAAS,EAAA,CAAAa,QAAAA,IAAAA,OAAA,QACfU,EAAAA,EAAMV,UAANU,YAAAA,EAAAA,KAAAA,EAAiB,GAAA,CAGxB,CACF,CAAC,EC5EGqY,GAAc,CAClB,QAAQvZ,EAAgB,OACtBA,EAAI,WAAUwZ,EAAAA,GAAM,OAANA,KAAAA,EAAc,QAASA,EAAK,CAC5C,CACF,ECsBaC,GAAcC,GAAqB,CAC9C,MAAMC,EAAI,IAAI,KAAKD,CAAI,EACvB,OAAAC,EAAE,SAAS,EAAG,EAAG,EAAG,CAAC,EACdA,CACT,EAEaC,GAAU,CAACF,EAAYG,EAAO,EAAGC,EAAW,KAAgB,CACvE,MAAMtU,EAAS,IAAI,KAAKkU,EAAK,QAAA,EAAYG,EAAO,KAAM,EACtD,OAAOC,EAAWL,GAAWjU,CAAM,EAAIA,CACzC,EAEauU,GAAa,CAACL,EAAYV,EAAS,IAAY,CAC1D,MAAMa,EAAOH,EAAK,QAAA,EAAY,EAAIV,EAClC,OAAOY,GAAQF,EAAMG,EAAM,EAAI,CACjC,EAEaG,GAAgBN,GAAqB,CAChD,MAAMO,EAAQP,EAAK,SAAA,EAAcA,EAAK,WAAa,EACnD,OAAOD,GAAW,IAAI,KAAKC,EAAK,cAAeO,EAAO,CAAC,CAAC,CAC1D,EAEaC,GAAaR,GAAqBD,GAAW,IAAI,KAAKC,EAAK,YAAA,EAAe,EAAG,CAAC,CAAC,EClCtFS,GAAM,IAAM,IAAI,KAGTC,GAAgC,CAC3C,CACE,KAAM,KACN,MAAO,IAAMD,GAAA,CAAI,EAEnB,CACE,KAAM,KACN,MAAO,IAAMP,GAAQO,GAAA,EAAO,CAAC,CAAA,EAE/B,CACE,KAAM,OACN,MAAO,IAAMP,GAAQO,GAAA,EAAO,CAAC,CAAA,EAE/B,CACE,KAAM,QACN,MAAO,IAAMP,GAAQO,GAAA,EAAO,EAAE,CAAA,EAEhC,CACE,KAAM,OACN,MAAO,IAAMJ,GAAWI,GAAA,CAAK,CAAA,EAE/B,CACE,KAAM,OACN,MAAO,IAAMH,GAAaG,GAAA,CAAK,CAAA,CAEnC,EAGaE,GAAkC,CAC7C,CACE,KAAM,QACN,MAAO,IAAMF,GAAA,CAAI,EAEnB,CACE,KAAM,YACN,MAAO,IAAMP,GAAQO,GAAA,EAAO,CAAC,CAAA,EAE/B,CACE,KAAM,YACN,MAAO,IAAMP,GAAQO,GAAA,EAAO,CAAC,CAAA,EAE/B,CACE,KAAM,eACN,MAAO,IAAMP,GAAQO,GAAA,EAAO,EAAE,CAAA,EAEhC,CACE,KAAM,cACN,MAAO,IAAMJ,GAAWI,GAAA,CAAK,CAAA,EAE/B,CACE,KAAM,eACN,MAAO,IAAMH,GAAaG,GAAA,CAAK,CAAA,CAEnC,EAGaG,GAAoBF,GAAc,MAAM,EAAG,CAAC,EAE5CG,GAAsBF,GAAgB,MAAM,EAAG,CAAC,EAGhDG,GAAqC,CAChD,CACE,KAAM,OACN,MAAO,IAAM,CACX,MAAMC,EAAQ,IAAI,KAAKb,GAAQO,GAAA,EAAO,CAAC,EAAE,SAAS,EAAG,EAAG,EAAG,CAAC,CAAC,EACvDO,EAAM,IAAI,KAAKP,GAAA,EAAM,SAAS,GAAI,GAAI,GAAI,GAAG,CAAC,EAEpD,MAAO,CAACM,EAAOC,CAAG,CACpB,CAAA,EAEF,CACE,KAAM,QACN,MAAO,IAAM,CACX,MAAMD,EAAQ,IAAI,KAAKb,GAAQO,GAAA,EAAO,EAAE,EAAE,SAAS,EAAG,EAAG,EAAG,CAAC,CAAC,EACxDO,EAAM,IAAI,KAAKP,GAAA,EAAM,SAAS,GAAI,GAAI,GAAI,GAAG,CAAC,EAEpD,MAAO,CAACM,EAAOC,CAAG,CACpB,CAAA,EAEF,CACE,KAAM,OACN,MAAO,IAAM,CACX,MAAMD,EAAQ,IAAI,KAAKV,GAAWI,GAAA,CAAK,EAAE,SAAS,EAAG,EAAG,EAAG,CAAC,CAAC,EACvDO,EAAM,IAAI,KAAKP,GAAA,EAAM,SAAS,GAAI,GAAI,GAAI,GAAG,CAAC,EAEpD,MAAO,CAACM,EAAOC,CAAG,CACpB,CAAA,EAEF,CACE,KAAM,OACN,MAAO,IAAM,CACX,MAAMD,EAAQ,IAAI,KAAKT,GAAaG,GAAA,CAAK,EAAE,SAAS,EAAG,EAAG,EAAG,CAAC,CAAC,EACzDO,EAAM,IAAI,KAAKP,GAAA,EAAM,SAAS,GAAI,GAAI,GAAI,GAAG,CAAC,EAEpD,MAAO,CAACM,EAAOC,CAAG,CACpB,CAAA,EAEF,CACE,KAAM,OACN,MAAO,IAAM,CAACR,GAAUC,IAAK,EAAGA,IAAK,CAAA,EAEvC,CACE,KAAM,QACN,MAAO,IAAM,CACX,MAAMO,EAAMP,GAAA,EACNM,MAAY,KAElB,OAAAA,EAAM,SAASA,EAAM,SAAA,EAAa,CAAC,EAE5B,CAACA,EAAOC,CAAG,CACpB,CAAA,CAEJ,EAGaC,GAAuC,CAClD,CACE,KAAM,YACN,MAAO,IAAM,CACX,MAAMF,EAAQ,IAAI,KAAKb,GAAQO,GAAA,EAAO,CAAC,EAAE,SAAS,EAAG,EAAG,EAAG,CAAC,CAAC,EACvDO,EAAM,IAAI,KAAKP,GAAA,EAAM,SAAS,GAAI,GAAI,GAAI,GAAG,CAAC,EAEpD,MAAO,CAACM,EAAOC,CAAG,CACpB,CAAA,EAEF,CACE,KAAM,eACN,MAAO,IAAM,CACX,MAAMD,EAAQ,IAAI,KAAKb,GAAQO,GAAA,EAAO,EAAE,EAAE,SAAS,EAAG,EAAG,EAAG,CAAC,CAAC,EACxDO,EAAM,IAAI,KAAKP,GAAA,EAAM,SAAS,GAAI,GAAI,GAAI,GAAG,CAAC,EAEpD,MAAO,CAACM,EAAOC,CAAG,CACpB,CAAA,EAEF,CACE,KAAM,aACN,MAAO,IAAM,CACX,MAAMD,EAAQ,IAAI,KAAKV,GAAWI,GAAA,CAAK,EAAE,SAAS,EAAG,EAAG,EAAG,CAAC,CAAC,EACvDO,EAAM,IAAI,KAAKP,GAAA,EAAM,SAAS,GAAI,GAAI,GAAI,GAAG,CAAC,EAEpD,MAAO,CAACM,EAAOC,CAAG,CACpB,CAAA,EAEF,CACE,KAAM,cACN,MAAO,IAAM,CACX,MAAMD,EAAQ,IAAI,KAAKT,GAAaG,GAAA,CAAK,EAAE,SAAS,EAAG,EAAG,EAAG,CAAC,CAAC,EACzDO,EAAM,IAAI,KAAKP,GAAA,EAAM,SAAS,GAAI,GAAI,GAAI,GAAG,CAAC,EAEpD,MAAO,CAACM,EAAOC,CAAG,CACpB,CAAA,EAEF,CACE,KAAM,YACN,MAAO,IAAM,CAACR,GAAUC,IAAK,EAAGA,IAAK,CAAA,EAEvC,CACE,KAAM,aACN,MAAO,IAAM,CACX,MAAMO,EAAMP,GAAA,EACNM,MAAY,KAElB,OAAAA,EAAM,SAASA,EAAM,SAAA,EAAa,CAAC,EAE5B,CAACA,EAAOC,CAAG,CACpB,CAAA,CAEJ,EAGiC,CAAC,GAAGN,EAAa,EC7KhD,KAAM,CAAE5a,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,YAAY,0BAEZ,CAE7BW,KAAM,eAGNC,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNC,QAAS,IAEXL,KAAM,CACJG,KAAMC,OACNC,QAAS4Q,QAEXvH,GAAI,CACFvJ,KAAMC,OACNC,QAAS4Q,QAEXwJ,WAAY,CACVta,KAAM,CAACua,KAAMta,OAAQqS,KAAK,EAC1BpS,QAAS4Q,QAEX9Q,KAAM,CACJA,KAAMC,OACNC,QAAS,QAEXsa,OAAQ,CACNxa,KAAMC,OACNC,QAAS,cAEXua,YAAa,CACXza,KAAMC,OACNC,QAAS,cAEXwa,YAAa,CACX1a,KAAMsS,MACNpS,QAAS4Q,QAEXD,KAAM,CACJ7Q,KAAMC,OACNC,QAAS,WAEXya,eAAgB,CACd3a,KAAMC,OACNC,QAAS4Q,QAEX8J,iBAAkB,CAChB5a,KAAMC,OACNC,QAAS4Q,QAEX+J,eAAgB,CACd7a,KAAMC,OACNC,QAAS4Q,QAEXwE,YAAa,CACXtV,KAAMC,OACNC,QAAS4Q,QAEXyE,UAAW,CACTvV,KAAMO,QACNL,QAAS,IAEXoN,SAAU,CACRtN,KAAMO,QACNL,QAAS,IAEX4a,iBAAkB,CAChB9a,KAAMsS,MACNpS,QAASA,IAAM,CAAA,GAEjB6a,aAAc,CACZ/a,KAAMuR,SACNrR,QAASA,IAAM,CAAC,GAElB8a,SAAU,CACRhb,KAAMO,QACNL,QAAS,IAEX+a,OAAQ,CACNjb,KAAMO,QACNL,QAAS,EACX,GAIF+N,MAAO,CAAC,oBAAqB,SAAU,OAAQ,QAAS,OAAQ,OAAO,EAEvEtN,MAAMb,EAAO,CAAEoO,KAAAA,CAAK,EAAG,CAErB,KAAM,CAAEjL,OAAAA,EAAQwJ,EAAAA,GAAMyO,WAAO,EACvBxT,EAAQC,EAAAA,SAAQ,EAChB8J,EAAaC,EAAAA,gBAAgB,MAAM,EAGnCsE,EAAarJ,EAAAA,IAAI7M,EAAMwa,UAAU,EAGvC5M,EAAAA,MACE,IAAM5N,EAAMwa,WACXjE,GAAW,CACVL,EAAW7V,MAAQkW,CACrB,CACF,EAGA,MAAM8E,EAAiBrT,EAAAA,SAAoC,IAAA,OAAOhI,OAAAA,EAAAA,EAAM+Q,OAAN/Q,KAAAA,EAAcqN,EAAAA,MAAMsE,CAAU,EAAmB,EAC7G2E,EAAkBtO,EAAAA,SAAS,IAAA,SAAOhI,QAAAA,GAAAA,EAAAA,EAAMyJ,KAANzJ,KAAAA,EAAYA,EAAMD,OAAlBC,KAAAA,EAA0BA,EAAMC,OAAS+Q,OAAS,EACpFsK,EAAetT,EAAAA,SAAS,IACxB7E,EAAO9C,QAAU,KACfL,EAAME,OAAS,OAAe+Z,GACzBja,EAAME,OAAS,WAAmBia,GAClCna,EAAME,OAAS,aAAeF,EAAME,OAAS,gBAAwBqa,GAClE,GAELva,EAAME,OAAS,OAAe8Z,GAC9Bha,EAAME,OAAS,WAAmBga,GAClCla,EAAME,OAAS,aAAeF,EAAME,OAAS,gBAAwBka,GAClE,EACb,EAMKmB,EAAmBvT,EAAAA,SAAS,IAAM,CACtC,MAAMwT,EAAqB,CACzBC,UAAWH,EAAajb,OAQ1B,GANIL,EAAMgb,iBAAiBU,SAAS,aAAa,IAE/CF,EAAc,aAAmBlC,GAAeA,EAAKqC,UAAYlB,KAAKV,IAAG,EAAK,OAC5E/Z,EAAMgb,iBAAiBU,SAAS,YAAY,IAE9CF,EAAc,aAAmBlC,GAAeA,EAAKqC,QAAO,EAAKlB,KAAKV,IAAG,GACvE/Z,EAAMib,aAAc,CACtB,MAAMW,EAAK,CAAEX,aAAcjb,EAAMib,cACjC,OAAO1Q,MAAA,GAAKiR,GAAkBI,EAChC,KAAO,QAAOrR,GAAA,GAAKiR,EACrB,CAAC,EASKK,EAAexb,GAA2B,CAC9C+N,EAAK,oBAAqB/N,CAAK,EAC/B+N,EAAK,QAAS/N,CAAK,CACrB,EAOMmW,EAAgBnW,GAAkB,CACtC+N,EAAK,SAAU/N,CAAK,CACtB,EAOMoW,EAAcqF,GAAmB,CAWrC1N,EAAK,OAAQ0N,CAAE,CAGjB,EAOMC,EAAeD,GAAmB,CACtC1N,EAAK,QAAS0N,CAAE,CAClB,EAQME,EAAcxa,GAA6B,CAC/C4M,EAAK,OAAQ,CAAE6N,QAASza,EAAI,CAAC,EAAG0a,QAAS1a,EAAI,CAAC,CAAE,CAAC,CACnD,EAGA,MAAO,IAAA,OAAAT,OAAAA,EAAAA,YAAA,MAAA,CAAA,MACOxB,EAAS,EAAA,CAAAwB,EAAAA,YAAAob,EAAAA,aAAAzT,aAAA,CAAA,IAEZ1I,EAAMC,MAAQ,gBAAe,GAC9BqW,EAAgBjW,MAAK,KACnBL,EAAMD,KAAI,WACJmW,EAAW7V,MAAK,sBACPwb,EAAW,KAC1B7b,EAAME,KAAI,kBACCF,EAAM6a,gBAAkBlO,EAAE,cAAc,EAAC,YAC7C3M,EAAMwV,aAAe7I,EAAE,mBAAmB,EAAC,iBACtC3M,EAAM8a,kBAAoBnO,EAAE,kBAAkB,EAAC,eACjD3M,EAAM+a,gBAAkBpO,EAAE,gBAAgB,EAAC,eAC7C3M,EAAM4a,YAAW,iBAChBW,EAAAA,EAAiBlb,QAAjBkb,YAAAA,EAAwBN,aAAY,UACxCM,EAAiBlb,MAAMob,UAAS,OACnCzb,EAAM0a,OAAM,UACT1a,EAAMyV,UAAS,YACbzV,EAAM2a,WAAW,EAAA,CAE5ByB,iBAAkBJ,EAClBK,OAAQ5F,EACR6F,QAASP,EACTQ,SAAU/F,CAAY,EAAA,CAAA,KAElB6E,EAAehb,MAAK,SAChBL,EAAMwN,SAAQ,SACdxN,EAAMkb,SAAQ,cAAA,GAAA,gBAETlb,EAAMmb,MAAM,EACvBvT,CAAK,EAAA,IAAA,CAAA,CAAA,EAKjB,CACF,CAAC,qCC/PG4U,GAAqB,CACzB,QAAQ5c,EAAgB,OACtBA,EAAI,WAAUwB,EAAAqb,GAAa,OAAb,KAAArb,EAAqB,eAAgBqb,EAAY,CACjE,CACF,ECQMC,OAAoB,QAKpBC,GAAW,CAACxI,EAAiByI,EAAwB,KAAU,CAEnE,IAAIC,EAAU1I,EAAG,cAAc,YAAY,EAG3C,GAFK0I,IAASA,EAAU,SAAS,cAAc,YAAY,GAEvD,CAACA,EACH,eAAQ,KAAK,+BAA+B,EACrC,GAIT,IAAIC,EAAqC,KAIzC,GAHAA,EAAiBD,EAAQ,cAAc,oBAAoB,EACtDC,IAAgBA,EAAiBD,EAAQ,cAAc,mBAAmB,GAE3E,CAACC,EACH,eAAQ,KAAK,sCAAsC,EAC5C,GAIT,GAAIJ,GAAc,IAAII,CAAc,EAAG,MAAO,GAC9CJ,GAAc,IAAII,CAAc,EAGhCA,EAAe,MAAM,OAAS,OAE9BD,EAAQ,MAAM,IAAM,MAEpB,MAAME,GAAY,UAAY,CAC5B,OAAK,OAAO,SAAiB,aAAqB,CAACjZ,EAAkBkZ,IAAkBlZ,EAAY,aAAakZ,CAAI,EACxG,CAAClZ,EAAkBkZ,IAAiB,iBAAiBlZ,EAAK,IAAI,EAAEkZ,CAAW,CACzF,GAAA,EAEA,OAAAF,EAAe,YAAe7Z,GAAkB,CAE9C,MAAMga,EAAOha,EAAE,QAAU6Z,EAAgB,WACnCI,EAAOja,EAAE,QAAU6Z,EAAgB,UAEnCK,EAAeN,EAAQ,YACvBO,EAAgBP,EAAQ,aAExBQ,EAAc,SAAS,KAAK,YAC5BC,EAAe,SAAS,KAAK,aAG7BC,EAAiBV,EAAQ,WAEzBW,EAAYZ,EAAe,GAAK,IAChCa,EAAiBJ,EAAcR,EAAQ,WAAaM,EAAeK,EAGnEE,EAAgBb,EAAQ,UAGxBc,EAAgBL,EAAeT,EAAQ,UAAYO,EAAgB,GAAK,GAG9E,IAAIQ,EAAwBb,EAASF,EAAS,MAAM,EAChDgB,EAAwBd,EAASF,EAAS,KAAK,EAG/C,OAAOe,GAAS,UAAYA,EAAK,SAAS,GAAG,GAC/CA,EAAO,SAAS,KAAK,aAAe,CAACA,EAAK,QAAQ,KAAM,EAAE,EAAI,KAC9DC,EAAO,SAAS,KAAK,cAAgB,CAAC,OAAOA,CAAI,EAAE,QAAQ,KAAM,EAAE,EAAI,OAEvED,EAAO,CAAC,OAAOA,CAAI,EAAE,QAAQ,OAAQ,EAAE,EACvCC,EAAO,CAAC,OAAOA,CAAI,EAAE,QAAQ,OAAQ,EAAE,GAIzC,MAAMC,GAAe9W,GAAmB,CAEtC,IAAI+W,EAAO/W,EAAG,QAAUiW,EACpBe,EAAMhX,EAAG,QAAUkW,EAGnB,CAACa,EAAOR,EAAgBQ,EAAO,CAACR,EAC3BQ,EAAON,IAAgBM,EAAON,GAEnC,CAACO,EAAMN,EAAeM,EAAM,CAACN,EACxBM,EAAML,IAAeK,EAAML,GAGpCd,EAAQ,MAAM,KAAO,GAAGkB,EAAO,OAAOH,CAAI,CAAC,KAC3Cf,EAAQ,MAAM,IAAM,GAAGmB,EAAM,OAAOH,CAAI,CAAC,IAC3C,EAEMI,EAAY,IAAM,CACtB,SAAS,oBAAoB,YAAaH,EAAW,EACrD,SAAS,oBAAoB,UAAWG,CAAS,CACnD,EACA,SAAS,iBAAiB,YAAaH,EAAW,EAClD,SAAS,iBAAiB,UAAWG,CAAS,CAChD,EAEO,EACT,EC/FQ,CAAE7e,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,QAAQ,0BAER,CAC7BW,KAAM,WACNC,MAAO,CACL4Q,QAAS,CACP1Q,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXuN,MAAO,CACLzN,KAAMC,OACNiR,SAAU,GACVhR,QAAS,MAEX8d,UAAW,CACThe,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEX+d,MAAO,CACLje,KAAMC,OACNiR,SAAU,GACVhR,QAAS,OAEXge,OAAQ,CACNle,KAAMC,OACNiR,SAAU,GACVhR,QAAS4Q,QAEXqN,KAAM,CACJne,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXke,aAAc,CACZpe,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXme,WAAY,CACVre,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXoe,UAAW,CACTte,KAAMC,OACNiR,SAAU,GACVhR,QAAS4Q,QAEXyN,kBAAmB,CACjBve,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXse,mBAAoB,CAClBxe,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXue,YAAa,CACXze,KAAMC,OACNiR,SAAU,GACVhR,QAAS4Q,MACX,GAEF7C,MAAO,CAAC,OAAQ,SAAU,QAAS,SAAU,SAAU,gBAAgB,EAEvEtN,MAAMb,EAAO,CAAEc,MAAAA,EAAOsN,KAAAA,CAAK,EAAG,SAE5B,MAAMjC,EAAWC,GAAAA,YAAW,EACtB,CAAEO,EAAAA,GAAMzN,GAAa,EACrB0f,EAAczS,EAASyS,YACvBC,EAAgB1S,EAAS0S,cACzBxQ,EAAWC,EAAAA,mBAAkB,EAEnC,IAAIwQ,EAAgB9e,EAAM2e,aAAepf,GACrCwf,EAAgB/e,EAAM4Q,QAC1B,MAAMoO,EAAcnS,EAAAA,IAAI,EAAK,EACvB5M,EAAO,YACPgf,EAAkBpS,EAAAA,IAAI7M,EAAMoe,MAAM,EACxC,IAAIc,EAAgBlf,EAAMse,aAC1B,MAAMa,EAAoBtS,EAAAA,IAAI,EAAK,EACnC,IAAIuS,EAAQpf,EAAMqe,KACdgB,EAAYrf,EAAMqe,KAGtBzQ,EAAAA,MACE,IAAM5N,EAAM4Q,QACX0O,IAAa,CAEZP,EAAgBO,GACZP,EACF3b,GAAM,GAAG,EAAEmc,KAAK,IAAM,CACpBP,EAAY3e,MAAQ,EACtB,CAAC,EACE2e,EAAY3e,MAAQ,EAC3B,CACF,EAGA,MAAMmf,EAAiB5O,IAAqB,CAC1CmO,EAAgBnO,EAClB,EACM6O,EAAaA,IAAM,CACvBrR,EAAK,MAAM,CACb,EACMsR,GAAeA,IAAM,CACzBtR,EAAK,QAAQ,EACbuR,EAAAA,SAAS,IAAM,QACbhD,IAAStO,GAAAA,GAAAA,YAAAA,EAAU3I,QAAV2I,YAAAA,GAAiB8F,GAAmB0K,CAAa,CAC5D,CAAC,CACH,EACMe,EAAcA,IAAM,CACxBb,EAAgB,GAChBC,EAAY3e,MAAQ,GAKpB+N,EAAK,OAAO,CACd,EACMyR,EAAeA,IAAM,CACzBzR,EAAK,iBAAkB,EAAK,CAC9B,EAEM0R,EAAgBtR,IAAU,CAC9BuQ,EAAgB,GAChBC,EAAY3e,MAAQ,GACpB+N,EAAK,SAAUI,EAAK,CACtB,EAMMuR,EAAkBA,IAAM,OAC5B,MAAMC,IAASlf,EAAAA,EAAMkf,SAANlf,YAAAA,EAAAA,KAAAA,GACfkf,OAAAA,IAAAA,MAAAA,GAAQxV,QAAS2I,GAAM,QACrB,MAAMzO,GAAM,OAAOyO,EAAEjT,MAAS,UAAYiT,EAAEjT,OAAS,MAAQiT,EAAEjT,KAAaH,MAAQ,GAC9E8Q,GAAOpL,IAAa0N,GAAAA,EAAEzJ,WAAFyJ,YAAAA,GAAa,EAAE,GAAK,GAEzCA,EAAEnT,QAAOmT,EAAEnT,MAAQ,CAAA,GACxB,MAAMigB,EAAY9M,EAAEnT,MACpBigB,EAAUpP,KAAOA,GACbnM,KACEmM,GAAKuC,QAAQzG,EAAE,gBAAgB,CAAC,IAAM,IACxCsT,EAAU3O,QAAU,OACpB2O,EAAUhc,KAAO,kBACb2a,GAAiB/N,KAASlE,EAAE,gBAAgB,IAAGsT,EAAUpP,KAAOlE,EAAE,iBAAiB,GACvFsT,EAAUnP,MAAQnE,EAAE,gBAAgB,GAC3BkE,GAAKuC,QAAQzG,EAAE,eAAe,CAAC,IAAM,IAC9CsT,EAAU3O,QAAU,OACpB2O,EAAUhc,KAAO,kBACb2a,GACE/N,KAASlE,EAAE,eAAe,IAC5BsT,EAAUpP,KAAOlE,EAAE,gBAAgB,EACnCsT,EAAUnP,MAAQnE,EAAE,eAAe,IAE9BkE,GAAKuC,QAAQzG,EAAE,mBAAmB,CAAC,IAAM,IAClDsT,EAAU3O,QAAU,OACpB2O,EAAUhc,KAAO,kBACb2a,GACE/N,KAASlE,EAAE,mBAAmB,IAChCsT,EAAUpP,KAAOlE,EAAE,oBAAoB,EACvCsT,EAAUnP,MAAQnE,EAAE,mBAAmB,IAElCkE,GAAKuC,QAAQzG,EAAE,kBAAkB,CAAC,IAAM,IACjDsT,EAAU3O,QAAU,OACpB2O,EAAUhc,KAAO,kBACb2a,GACE/N,KAASlE,EAAE,kBAAkB,IAC/BsT,EAAUpP,KAAOlE,EAAE,mBAAmB,EACtCsT,EAAUnP,MAAQnE,EAAE,kBAAkB,IAEjCkE,GAAKuC,QAAQzG,EAAE,mBAAmB,CAAC,IAAM,IAClDsT,EAAU3O,QAAU,UACpB2O,EAAUhc,KAAO,mBACR4M,GAAKuC,QAAQzG,EAAE,oBAAoB,CAAC,IAAM,IAEnDsT,EAAU3O,QAAU,WACpB2O,EAAUhc,KAAO,kBACR4M,GAAKuC,QAAQzG,EAAE,kBAAkB,CAAC,IAAM,IACjDsT,EAAU3O,QAAU,SACpB2O,EAAUhc,KAAO,kBACR4M,GAAKuC,QAAQzG,EAAE,kBAAkB,CAAC,IAAM,IACjDsT,EAAU3O,QAAU,SACpB2O,EAAUhc,KAAO,kBACR4M,GAAKuC,QAAQzG,EAAE,kBAAkB,CAAC,IAAM,IACjDsT,EAAU3O,QAAU,SACpB2O,EAAUhc,KAAO,mBACR4M,GAAKuC,QAAQzG,EAAE,oBAAoB,CAAC,IAAM,IACnDsT,EAAU3O,QAAU,WACpB2O,EAAUhc,KAAO,kBACR4M,GAAKuC,QAAQzG,EAAE,iBAAiB,CAAC,IAAM,IAChDsT,EAAU3O,QAAU,QACpB2O,EAAUhc,KAAO,0BACR4M,GAAKuC,QAAQzG,EAAE,mBAAmB,CAAC,IAAM,IAClDsT,EAAU3O,QAAU,UACpB2O,EAAUhc,KAAO,0BACR4M,GAAKuC,QAAQzG,EAAE,oBAAoB,CAAC,IAAM,IACnDsT,EAAU3O,QAAU,OACpB2O,EAAUhc,KAAO,kBACR4M,GAAKuC,QAAQzG,EAAE,uBAAuB,CAAC,IAAM,IACtDsT,EAAU3O,QAAU,SACpB2O,EAAUhc,KAAO,sBACR4M,GAAKuC,QAAQzG,EAAE,qBAAqB,CAAC,IAAM,IACpDsT,EAAU3O,QAAU,SACpB2O,EAAUhc,KAAO,kBACR4M,GAAKuC,QAAQzG,EAAE,oBAAoB,CAAC,IAAM,IAAMkE,GAAKuC,QAAQzG,EAAE,uBAAuB,CAAC,IAAM,IACtGsT,EAAU3O,QAAU,SACpB2O,EAAUhc,KAAO,yBACR4M,GAAKuC,QAAQzG,EAAE,kBAAkB,CAAC,IAAM,KACjDsT,EAAU3O,QAAU,SACpB2O,EAAUhc,KAAO,iBACb2a,GACE/N,KAASlE,EAAE,kBAAkB,IAC/BsT,EAAUpP,KAAOlE,EAAE,mBAAmB,EACtCsT,EAAUnP,MAAQnE,EAAE,kBAAkB,IAGhD,GACOqT,EACT,EAOME,EAAYA,IAAM,QACtB,GAAIlgB,EAAMke,UACR,OAAIpd,GAAAA,EAAMkf,SAANlf,MAAAA,GAAAA,KAAAA,GACFC,0BAEKgf,EAAe,EAAEhf,EAAAA,YAAAiU,GAAA,CAAA,QAEP8K,EAAY,KAAA,0BAAA,EAAA,CAAA1f,QAAAA,IAAA,CAEpBuM,EAAE,eAAe,EACjBiS,EAAc,OAAS,EAAE,CAAA,CAAA,CAAA,CAAA,EAMhC7d,EAAAA,YAAA,MAAA,KAAA,CAAAA,EAAAA,YAAAiU,GAAA,CAAA,QAGe8K,EAAY,KAAA,0BAAA,EAAA,CAAA1f,QAAAA,IAAA,CAEpBuM,EAAE,eAAe,EACjBiS,EAAc,OAAS,EAAE,CAAA,CAAA,CAAA,CAAA,CAItC,EAOMuB,EAAUA,IAAM,CACpB,IAAIC,GAAqB,KACzB,OAAIpB,EAAY3e,QACd+f,GAAGrf,EAAAA,YAAA,MAAA,CAAA,MAAA,gCAAA,SAAA,KAAA,IAAA,GAKEqf,EACT,EAEMC,EAAeA,IAAM,CACpBrgB,EAAMoe,OACFpe,EAAMoe,OAAOhL,QAAQ,GAAG,IAAM,GAAI6L,EAAgB5e,MAAQigB,WAAWtgB,EAAMoe,MAAM,EAAI,IAAM,KAC/Fa,EAAgB5e,MAAQL,EAAMoe,OAFhBa,EAAgB5e,MAAQkgB,SAASC,gBAAgBC,aAAe,IAAM,IAG3F,EAIMC,IAAMrS,GAAAA,EAAAA,GAAAA,YAAAA,EAAUxE,SAAVwE,YAAAA,EAAkBxE,SAAlBwE,YAAAA,EAA0B3I,MAAMyO,GAC5C,GAAIuM,GACF,GAAI,CACQA,GAAIC,QAAQ,uBAAuB,IACtCvB,EAAQ,GACjB,OAAQnc,GAAA,CACN,CAEJ,OAAImc,GACFN,EAAgB9e,EAAM2e,YAAc,uBAAyB3e,EAAM2e,YAAc,sBACjFO,EAAgB,GAChBC,EAAkB9e,MAAQ,GAC1Bgf,EAAY,IACPA,EAAY,GAEnBuB,EAAAA,gBAAgB,IAAM,CACpBC,OAAOC,oBAAoB,SAAUT,CAAY,CACnD,CAAC,EAGDU,EAAAA,UAAU,IAAM,CAEVhC,IAAeC,EAAY3e,MAAQ,IAEvCsf,EAAAA,SAAS,IAAM,CACbkB,OAAOG,iBAAiB,SAAUX,CAAY,EAE9CA,EAAY,CACd,CAAC,CACH,CAAC,EAGM,IAAAtf,EAAAA,YAAA,MAAA,CAAA,MAAA,oBAAA,CAAAA,EAAAA,YAAAkgB,WAAA,CAAA,IAGIhhB,EAAI,WAEG8e,EAAa,sBACJS,EAAa,aACpBN,EAAa,uBACLC,EAAkB9e,MAAK,uBACvBL,EAAMye,kBAAiB,wBACtBze,EAAM0e,mBAAkB,UACpC,GAAI,mBACG,GAAI,WACV1e,EAAMue,WAAU,MACrBc,EAAS,QAEPO,EAAW,SACVC,EAAY,OACdJ,EAAU,SACRC,GAAY,MACfZ,EAAa,MACb9e,EAAMme,MAAK,MACX,CAAEC,OAAQ,GAAGpe,EAAMoe,MAAM,EAAG,CAAC,EAAA,CAElCjJ,OAAQA,IAAApU,EAAAA,YAAA,MAAA,CAAA,MAAA,kBAAA,EAAA,CAAAA,EAAAA,YAAA,OAAA,KAAA,CAAAA,EAAAA,YAAAkI,GAAA,CAAA,SAAA,WAAA,SAAA,uBAAA,IAAA,EAODjJ,EAAM2N,KAAK,CAAA,CAAA,CAAA,EAIlBvN,QAASA,IAAAA,QAAAW,OAAAA,EAAAA,YAAA,MAAA,CAAA,MAAA,yBAAA,MAGE,CAAEyd,UAAW,GAAGS,EAAgB5e,KAAK,aAAc,CAAC,EAAA,EAC1DS,GAAAA,EAAMV,UAANU,YAAAA,GAAAA,KAAAA,EAAiB,CAAA,GAGtBkf,OAAQA,IAAAjf,EAAAA,YAAA,MAAA,CAAA,MAAA,iBAAA,CAAkCmf,EAAS,CAAE,CAAA,EAAO,EAG/DC,EAAO,CAAE,CAAA,CAGhB,CACF,CAAC,qCChYGe,GAAiB,CACrB,QAAQthB,EAAgB,OACtBA,EAAI,WAAUwB,EAAA+f,GAAS,OAAT,KAAA/f,EAAiB,WAAY+f,EAAQ,CACrD,CACF,ECWQ,CAAE/hB,aAAAA,EAAa,EAAIE,YAAQ,EAE3BC,GAAYH,GAAa,SAAS,0BAET,CAC7BW,KAAM,YACNoO,MAAO,CAAC,gBAAgB,EACxBnO,MAAO,CACL4Q,QAAS,CACP1Q,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXoX,MAAO,CACLtX,KAAMC,OACNiR,SAAU,GACVhR,QAAS,MAEXghB,SAAU,CACRlhB,KAAMC,OACNiR,SAAU,GACVhR,QAAS,QAEXihB,UAAW,CACTnhB,KAAMC,OACNiR,SAAU,GACVhR,QAAS,cAEXkhB,OAAQ,CACNphB,KAAMC,OACNiR,SAAU,GACVhR,QAAS4Q,MACX,GAGFnQ,MAAMb,EAAO,CAAEoO,KAAAA,CAAK,EAAG,CAIrB,MAAMmT,EAAgB/S,GAAmC,CACvDA,EAAMgT,eAAc,EACpBhT,EAAMiT,gBAAe,EACrBrT,EAAK,iBAAkB,CAACpO,EAAM4Q,OAAO,CACvC,EAEA,MAAO,IAAA7P,EAAAA,YAAA,MAAA,CAAA,MAEIxB,GAAS,QACNiP,GAAU+S,EAAa/S,CAAK,GAAC,CAAAzN,EAAAA,YAAA2gB,YAAA,CAAA,mBAEnB1hB,EAAMohB,SAAQ,UACrBphB,EAAMqhB,SAAS,EAAA,CAAAjhB,QAAAA,IAAA,CAAAW,EAAAA,YAAA,OAAA,CAAA,MAAA,SAAA,CACLf,EAAMwX,KAAK,CAAA,CAAA,EAAA,CAAA,CAAA,CAIxC,CACF,CAAC,qCCxEGmK,GAAkB,CACtB,QAAQ/hB,EAAgB,OACtBA,EAAI,WAAUwB,EAAAwgB,GAAU,OAAV,KAAAxgB,EAAkB,YAAawgB,EAAS,CACxD,CACF,ECeQ,CAAExiB,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,QAAQ,0BAER,CAC7BW,KAAM,WACNC,MAAO,CACL4Q,QAAS,CACP1Q,KAAMO,QACN2Q,SAAU,GACVhR,QAAS,IAEXuN,MAAO,CACLzN,KAAMC,OACNiR,SAAU,GACVhR,QAAS,MAEXihB,UAAW,CACTnhB,KAAMC,OACNiR,SAAU,GACVhR,QAAS,OAEX2Q,KAAM,CACJ7Q,KAAM,CAACC,OAAQG,MAAM,EACrB8Q,SAAU,GACVhR,QAAS,OAEXyhB,cAAe,CACb3hB,KAAM,CAACI,MAAM,EACb8Q,SAAU,GACVhR,QAAS,GACX,GAEF+N,MAAO,CAAC,QAAS,SAAU,OAAQ,SAAU,SAAU,SAAU,gBAAgB,EAEjFtN,MAAMb,EAAO,CAAEc,MAAAA,EAAOsN,KAAAA,CAAK,EAAG,CAE5B,MAAMjC,EAAWC,GAAAA,YAAW,EACtB,CAAEO,EAAAA,GAAMzN,GAAa,EAErB4iB,EAAgBjV,EAAAA,IAAI7M,EAAM4Q,OAAO,EACjCoO,EAAcnS,EAAAA,IAAI,EAAK,EACvB5M,EAAO,YACP8hB,EAAkBlV,EAAAA,IAAI,CAAC,EACvBmV,EAAOnV,EAAAA,IAAI,EAAK,EAChB+R,EAAczS,EAASyS,YACvBqD,EAAa9V,EAAS8V,WACtBC,EAAiB/V,EAASgW,oBAAsBhW,EAASgW,oBAAsBniB,EAAM6hB,cAG3FjU,EAAAA,MACE,IAAM5N,EAAM4Q,QACX2F,GAAW,CAEVuL,EAAczhB,MAAQkW,EAClBuL,EAAczhB,MAChB+C,GAAM,GAAG,EAAEmc,KAAK,IAAM,CACpBP,EAAY3e,MAAQ,EACtB,CAAC,EACE2e,EAAY3e,MAAQ,EAC3B,CACF,EAIA,MAAMof,EAAaA,IAAM,CAEvBrR,EAAK,MAAM,CACb,EACMsR,EAAeA,IAAM,CAEzBtR,EAAK,QAAQ,CACf,EAEMyR,EAAeA,IAAM,CACzBzR,EAAK,iBAAkB,EAAK,CAC9B,EAEMgU,EAAeA,CAACC,EAAiBtR,IAAiB,CACtD3C,EAAK,SAAUiU,EAAKtR,CAAI,CAC1B,EAEM+O,EAAgBtR,GAAiB,CACrCsT,EAAczhB,MAAQ,GACtB2e,EAAY3e,MAAQ,GACpB+N,EAAK,SAAUI,CAAK,CACtB,EAEMgR,EAAiB5O,GAAqB,CAC1CkR,EAAczhB,MAAQuQ,CACxB,EAEMgP,GAAcA,IAAM,CACxBkC,EAAczhB,MAAQ,GACtB2e,EAAY3e,MAAQ,GACpB+N,EAAK,iBAAkB,EAAK,CAM9B,EAOM2R,EAAkBA,IAAM,OAC5B,MAAMC,GAASlf,EAAAA,EAAMkf,SAANlf,YAAAA,EAAAA,KAAAA,GACfkf,OAAAA,GAAAA,MAAAA,EAAQxV,QAAS2I,GAAM,CACrB,MAAMzO,GAAM,OAAOyO,EAAEjT,MAAS,UAAYiT,EAAEjT,OAAS,MAAQiT,EAAEjT,KAAaH,MAAQ,GAC9E8Q,EAAOpL,GAAa0N,CAAC,GAAK,GAC3BA,EAAEnT,QAAOmT,EAAEnT,MAAQ,CAAA,GACxB,MAAMigB,EAAY9M,EAAEnT,MACpBigB,EAAUpP,KAAOA,EACbnM,KACEmM,EAAKuC,QAAQzG,EAAE,gBAAgB,CAAC,IAAM,IACxCsT,EAAU3O,QAAU,OAChB2Q,IAAYhC,EAAUhc,KAAO,mBAC7B2a,GACE/N,IAASlE,EAAE,gBAAgB,IAC7BsT,EAAUpP,KAAOlE,EAAE,iBAAiB,EACpCsT,EAAUnP,MAAQnE,EAAE,gBAAgB,IAE/BkE,EAAKuC,QAAQzG,EAAE,mBAAmB,CAAC,IAAM,IAClDsT,EAAU3O,QAAU,OAChB2Q,IAAYhC,EAAUhc,KAAO,mBAC7B2a,GACE/N,IAASlE,EAAE,mBAAmB,IAChCsT,EAAU,MAAWtT,EAAE,mBAAmB,EAC1CsT,EAAUpP,KAAOlE,EAAE,oBAAoB,IAElCkE,EAAKuC,QAAQzG,EAAE,kBAAkB,CAAC,IAAM,IACjDsT,EAAU3O,QAAU,OAChB2Q,IAAYhC,EAAUhc,KAAO,mBAC7B2a,GACE/N,IAASlE,EAAE,kBAAkB,IAC/BsT,EAAUpP,KAAOlE,EAAE,mBAAmB,EACtCsT,EAAUnP,MAAQnE,EAAE,mBAAmB,IAElCkE,EAAKuC,QAAQzG,EAAE,mBAAmB,CAAC,IAAM,IAClDsT,EAAU3O,QAAU,UAChB2Q,IAAYhC,EAAUhc,KAAO,oBACxB4M,EAAKuC,QAAQzG,EAAE,kBAAkB,CAAC,IAAM,IACjDsT,EAAU3O,QAAU,SAChB2Q,IAAYhC,EAAUhc,KAAO,mBACxB4M,EAAKuC,QAAQzG,EAAE,eAAe,CAAC,IAAM,IAC9CsT,EAAU3O,QAAU,MAChB2Q,IAAYhC,EAAUhc,KAAO,yBACxB4M,EAAKuC,QAAQzG,EAAE,mBAAmB,CAAC,IAAM,IAClDsT,EAAU3O,QAAU,UAChB2Q,IAAYhC,EAAUhc,KAAO,2BACxB4M,EAAKuC,QAAQzG,EAAE,kBAAkB,CAAC,IAAM,IACjDsT,EAAU3O,QAAU,SAChB2Q,IAAYhC,EAAUhc,KAAO,oBACxB4M,EAAKuC,QAAQzG,EAAE,oBAAoB,CAAC,IAAM,IACnDsT,EAAU3O,QAAU,WAChB2Q,IAAYhC,EAAUhc,KAAO,mBACxB4M,EAAKuC,QAAQzG,EAAE,iBAAiB,CAAC,IAAM,IAChDsT,EAAU3O,QAAU,QAChB2Q,IAAYhC,EAAUhc,KAAO,2BACxB4M,EAAKuC,QAAQzG,EAAE,mBAAmB,CAAC,IAAM,IAClDsT,EAAU3O,QAAU,UAChB2Q,IAAYhC,EAAUhc,KAAO,iBACxB4M,EAAKuC,QAAQzG,EAAE,oBAAoB,CAAC,IAAM,IACnDsT,EAAU3O,QAAU,OAChB2Q,IAAYhC,EAAUhc,KAAO,mBACxB4M,EAAKuC,QAAQzG,EAAE,oBAAoB,CAAC,IAAM,IACnDsT,EAAU3O,QAAU,WAEhB2Q,IAAYhC,EAAUhc,KAAO,mBACxB4M,EAAKuC,QAAQzG,EAAE,kBAAkB,CAAC,IAAM,IAAMkE,EAAKuC,QAAQzG,EAAE,oBAAoB,CAAC,IAAM,IACjGsT,EAAU3O,QAAU,SAChB2Q,IAAYhC,EAAUhc,KAAO,kBAC7B2a,IACE/N,IAASlE,EAAE,oBAAoB,IACjCsT,EAAUpP,KAAOlE,EAAE,qBAAqB,EACxCsT,EAAUnP,MAAQnE,EAAE,oBAAoB,GAEtCkE,IAASlE,EAAE,kBAAkB,IAC/BsT,EAAUpP,KAAOlE,EAAE,mBAAmB,EACtCsT,EAAUnP,MAAQnE,EAAE,kBAAkB,KAGjCkE,EAAKuC,QAAQzG,EAAE,kBAAkB,CAAC,IAAM,IACjDsT,EAAU3O,QAAU,SAChB2Q,IAAYhC,EAAUhc,KAAO,kBAC7B2a,GACE/N,IAASlE,EAAE,kBAAkB,IAC/BsT,EAAUpP,KAAOlE,EAAE,mBAAmB,EACtCsT,EAAUnP,MAAQnE,EAAE,kBAAkB,GAE1CsT,EAAU,MAAWtT,EAAE,kBAAkB,GAChCkE,EAAKuC,QAAQzG,EAAE,uBAAuB,CAAC,IAAM,IACtDsT,EAAU3O,QAAU,SAChB2Q,IAAYhC,EAAUhc,KAAO,uBACxB4M,EAAKuC,QAAQzG,EAAE,qBAAqB,CAAC,IAAM,IACpDsT,EAAU3O,QAAU,SAChB2Q,IAAYhC,EAAUhc,KAAO,mBACxB4M,EAAKuC,QAAQzG,EAAE,sBAAsB,CAAC,IAAM,IACrDsT,EAAU3O,QAAU,SAChB2Q,IAAYhC,EAAUhc,KAAO,uBACxB4M,EAAKuC,QAAQzG,EAAE,oBAAoB,CAAC,IAAM,IAAMkE,EAAKuC,QAAQzG,EAAE,uBAAuB,CAAC,IAAM,MACtGsT,EAAU3O,QAAU,SAChB2Q,IAAYhC,EAAUhc,KAAO,0BAEvC,GAEO+b,CACT,EAOME,EAAYA,IAAM,OACtB,IAAIoC,EAAiC,2BAErC,OADKL,IAAYK,EAAatR,SAC1BlQ,EAAAA,EAAMkf,SAANlf,MAAAA,EAAAA,KAAAA,GACFC,EAAAA,YAAA,MAAA,CAAA,MAAA,0BAAA,EAAA,CAEKgf,EAAe,EAAEhf,EAAAA,YAAAiU,GAAA,CAAA,QAEP8K,EAAY,KACfwC,CAAU,EAAA,CAAAliB,QAAAA,IAAA,CACfuM,EAAE,eAAe,EACjBiS,EAAc,OAAS,EAAE,CAAA,CAAA,CAAA,CAAA,EAMhC7d,EAAAA,YAAA,MAAA,CAAA,MAAA,4BAAA,CAAAA,EAAAA,YAAAiU,GAAA,CAAA,QAGe8K,EAAY,KACfwC,CAAU,EAAA,CAAAliB,QAAAA,IAAA,CACfuM,EAAE,eAAe,EACjBiS,EAAc,OAAS,EAAE,CAAA,CAAA,CAAA,CAAA,CAIpC,EACMyB,EAAeA,IAAM,CACzB0B,EAAgB1hB,MAAQkgB,SAASC,gBAAgBC,aAAe,GAClE,EAEMN,EAAUA,IAAM,CACpB,IAAIC,EAAqB,KACzB,OAAIpB,EAAY3e,QACd+f,EAAGrf,EAAAA,YAAA,MAAA,CAAA,SAAA,IAAA,MAAA,kCAAA,IAAA,GAKEqf,CACT,EAIAW,OAAAA,EAAAA,UAAU,IAAM,CAIVe,EAAczhB,QAChB2hB,EAAK3hB,MAAQ,GACb+C,GAAM,GAAG,EAAEmc,KAAK,IAAM,CACpBP,EAAY3e,MAAQ,EACtB,CAAC,GAEHggB,EAAY,EACZV,EAAAA,SAAS,IAAM,CAAC,CAAC,CACnB,CAAC,EAEM,IAAA5e,EAAAA,YAAA,MAAA,CAAA,MAAA,oBAAA,CAAAA,EAAAA,YAAAwhB,WAAA,CAAA,MAGMhjB,GAAS,IACXU,EAAI,WACG6hB,EAAczhB,MAAK,sBACVmf,EAAa,UACvBxf,EAAMqhB,UAAS,aACZ,GAAK,uBACG,GAAK,wBACJ,GAAI,UAChB,GAAI,uBACO,GAAK,MACpB,GAAK,QACHzB,GAAW,SACVC,EAAY,OACdJ,EAAU,SACRC,EAAY,SACZ0C,EAAY,KAChBpiB,EAAM+Q,KAAI,MACT,CAAEqN,OAAQ,gBAAgB8D,CAAc,KAAM,CAAC,EAAA,CAEpD/M,OAAQA,IAAApU,EAAAA,YAAA,MAAA,CAAA,MAAA,kBAAA,EAAA,CAAAA,EAAAA,YAAA,OAAA,KAAA,CAAAA,EAAAA,YAAAkI,GAAA,CAAA,MAIO,CAAE4L,QAASoN,EAAa,GAAK,QAAQ,SAAA,WAAA,SAAA,uBAAA,IAAA,EAG7CjiB,EAAM2N,KAAK,CAAA,CAAA,CAAA,EAIlBvN,QAASA,IAAAA,OAAAW,OAAAA,EAAAA,YAAA,MAAA,CAAA,MACK,CAAEyhB,SAAU,cAAehE,UAAW,GAAGuD,EAAgB1hB,KAAK,eAAgB,CAAC,EAAA,CAAAU,EAAAA,YAAA,MAAA,CAAA,MAAA,wBAAA,EAAA,EACpDD,EAAAA,EAAMV,UAANU,YAAAA,EAAAA,KAAAA,EAAiB,CAAA,CAAA,CAAA,GAG1Dkf,OAAQA,IAAAjf,EAAAA,YAAA,MAAA,CAAA,MAAA,qBAAA,CAAsCmf,EAAS,CAAE,CAAA,EAAO,EAGnEC,EAAO,CAAE,CAAA,CAGhB,CACF,CAAC,qCCnVGsC,GAAiB,CACrB,QAAQ7iB,EAAgB,OACtBA,EAAI,WAAUwB,EAAAshB,GAAS,OAAT,KAAAthB,EAAiB,WAAYshB,EAAQ,CACrD,CACF,ECAMC,GAAeC,eAAY,CAC/B,KAAM,OACN,KAAM,OACN,OAAQ,OACR,OAAQ,OACR,OAAQ,OACR,QAAS,MACX,CAAC,EAED,MAAMC,WAAkBF,EAAa,CACnC,WAAW,OAA4C,CACrD,OAAOG,GAAAA,gBAAgB,QAAS,CAC9B,KAAM,CAAC,OAAQ,MAAM,CAAA,CACtB,CACH,CACF,CCJO,SAASC,IAAY,CAwC1B,MAAO,CACL,SAnCe,CAAClS,EAAcmS,EAAW,KACpCnS,EACEoS,GAAAA,OAAOpS,EAAM,CAClB,SAAUmS,EAAW,SAAW,OAChC,KAAM,SACN,SAAU,EAAA,CACX,EALiB,GAmClB,eAvBsBnS,GACjBA,EACEoS,GAAAA,OAAOpS,EAAM,CAClB,QAAS,QACT,SAAU,OACV,KAAM,QAAA,CACP,EAAE,QAAQ,OAAQ,EAAE,EALH,GAuBlB,eAXsBA,GACjBA,EACEoS,GAAAA,OAAOpS,EAAM,CAClB,SAAU,OACV,KAAM,OAAA,CACP,EAJiB,CAAA,CAUlB,CAEJ,0PCxCE,KAAM,CAAE,aAAAzR,CAAA,EAAiBE,YAAA,EACnBC,EAAYH,EAAa,kBAAkB,EAK3C,CAAE,EAAAuN,CAAA,EAAMyO,WAAA,EACR/O,EAAYC,GAAAA,cAAA,EACZ4W,EAASH,GAAA,EACTtX,EAASzD,EAAAA,SAAS,IAAMqE,EAAU,gBAAgB,EAElD+B,EAAO+U,EAEPC,EAAWvW,EAAAA,IAAA,EACXwW,EAAWxW,EAAAA,IAAI,EAAE,EAEjByW,EAAazW,EAAAA,IAAyB,EAAE,EA0BxC0W,EAAiB,CAACC,EAAmCC,EAAW,IAAKC,GAAwB,CAAA,EAAIC,EAAuB,KAAoB,OAChJ,IAAIjY,EAAmB,CAAA,EACvB,UAAWkY,KAAUJ,EAAc,CAEjC,GADII,EAAO,WAAa,SACpBxiB,EAAAwiB,EAAO,OAAP,MAAAxiB,EAAa,OAAQ,SACzB,MAAMsJ,EAAkB,CACtB,KAAMlD,GAAYic,EAAUG,EAAO,IAAI,EACvC,MAAO,CAAC,GAAIF,EAAwB,EACpC,YAAaR,EAAO,eAAe,CAAC,GAAIQ,EAAwB,EAAE,KAAK,EAAE,CAAC,EAC1E,KAAM,CAAC,GAAGC,CAAU,CAAA,EAEtB,GAAIC,EAAO,MAAQA,EAAO,KAAK,MAAO,CACpC,MAAMC,EAAYD,EAAO,KAAK,MACxBE,EAAOF,EAAO,KAAK,MAAQ,GACjClZ,EAAK,MAAQ,CAAC,GAAGA,EAAK,MAAOmZ,CAAS,EACtCnZ,EAAK,YAAcwY,EAAO,eAAexY,EAAK,MAAM,KAAK,EAAE,CAAC,EAC5DA,EAAK,KAAO,CAAC,GAAGA,EAAK,KAAM,OAAOoZ,CAAI,CAAC,EACnCF,EAAO,WAAa,aAAclY,EAAI,KAAKhB,CAAI,EAC1C+Y,IAAa,KAAKH,EAAW,MAAM,KAAKM,CAAM,CACzD,CACA,GAAIA,EAAO,SAAU,CACnB,MAAMG,EAAaR,EAAeK,EAAO,SAAUlZ,EAAK,KAAMA,EAAK,KAAK,EACpEqZ,EAAW,QAAU,IAAGrY,EAAM,CAAC,GAAGA,EAAK,GAAGqY,CAAU,EAC1D,CACF,CACA,OAAOrY,CACT,EAEMsY,EAAoB,IAAM,CAC9B5V,EAAK,OAAO,CACd,EAQM6V,EAAgBte,GAAoB,CAGxCvC,GAAM,GAAG,EAAE,KAAK,IAAM,CACpBigB,EAAS,MAAQ,EACnB,CAAC,CACH,EAEMa,EAAe,CAACvN,EAAenF,IAAY,SAC/C,IAAI9F,GAAmB,CAAA,EACnBiL,IAAU,GACR,MAAM,QAAQyM,EAAS,KAAK,EAC9B1X,GAAM0X,EAAS,MAAM,OAAQzd,GAAS,CACpC,GAAIA,EAAK,MAAM,KAAK,EAAE,EAAE,QAAQgR,CAAK,IAAM,GAAI,OAAOhR,EAAA,GAC7CA,EAAK,YAAY,QAAQgR,EAAM,aAAa,IAAM,GAAI,OAAOhR,EAAA,GAC7DA,EAAK,KAAK,QAAQgR,CAAK,IAAM,GAAI,OAAOhR,CACnD,CAAC,EACE+F,IAAMtK,EAAAgiB,EAAS,QAAT,KAAAhiB,EAAkB,CAAA,EAC1BsK,IAAMyY,EAAAf,EAAS,QAAT,KAAAe,EAAkB,CAAA,EAC7B3S,EAAG9F,EAAG,CACR,EAWM0Y,EAAkB,CAACC,EAAM3iB,EAAMiM,GAAO2W,IAAa,CAAC,EAG1DvD,OAAAA,EAAAA,UAAU,IAAM,CACdqC,EAAS,MAAQG,EAAe9X,EAAO,KAAK,CAG9C,CAAC,0EAGDhD,EAAAA,mBAsFM,MAAA,CAtFA,uBAAOhJ,EAAAA,MAAAF,CAAA,CAAS,CAAA,GAEpBoJ,EAAAA,mBAkBM,MAlBNC,GAkBM,CAjBJD,EAAAA,mBAgBM,MAhBNI,GAgBM,CAfJhI,cAciBtB,EAAAA,MAAA8kB,EAAAA,cAAA,EAAA,YAbNlB,EAAA,2CAAAA,EAAQ,MAAAlM,GACjB,YAAU,OACT,oBAAmB+M,EACnB,YAAazkB,EAAAA,MAAAkN,CAAA,EAAC,oBAAA,EACd,SAAQsX,CAAA,GACE,iBACT,IAES,CAFTljB,EAAAA,YAEStB,EAAAA,MAAAoJ,QAAA,EAAA,KAAA,mBADP,IAAU,CAAV9H,EAAAA,YAAUtB,EAAAA,MAAA+kB,SAAA,CAAA,CAAA,WAIZ,QAAAC,EAAAA,QAAA,CAAsD,CADpC,KAAA9e,KAAI,CACtBgD,qBAAsD,OAAtD+b,GAAsDC,kBAAhChf,EAAK,MAAM,KAAI,KAAA,CAAA,EAAA,CAAA,CAAA,4CAM7CgD,EAAAA,mBA+DM,MA/DNic,GA+DM,CA9DJ7jB,EAAAA,YA6DStB,EAAAA,MAAAolB,EAAAA,MAAA,EAAA,CA7DD,eAAa,SAAO,mBAExB,IAA0B,kBAD5Bpc,EAAAA,mBA2DYqc,EAAAA,SAAA,KAAAC,EAAAA,WA1DKzB,EAAA,MAAR3d,GAAI,4BADbnG,EAAAA,YA2DYC,EAAAA,MAAAulB,EAAAA,SAAA,EAAA,CAzDT,IAAKrf,EAAK,KACV,OAAOvE,EAAAuE,EAAK,OAAL,YAAAvE,EAAW,MACnB,KAAA,EAAA,qBACA,IAqDM,CArDNuH,EAAAA,mBAqDM,MArDNsc,GAqDM,EApDJzc,YAAA,EAAA,EAAAC,EAAAA,mBAmDMqc,EAAAA,SAAA,KAAAC,EAAAA,WAlDUpf,EAAK,SAAZuf,GAAG,8BADZzc,EAAAA,mBAmDM,MAAA,CAjDH,IAAKyc,EAAI,KACV,MAAM,KAAA,GACW,CAAAA,EAAI,UAAYA,EAAI,SAAS,SAAM,GAClD1c,YAAA,EAAAC,qBAmBK,KAnBL0c,GAmBK,CAlBHxc,EAAAA,mBAiBK,KAAA,KAAA,CAhBH5H,cAEStB,EAAAA,MAAAoJ,EAAAA,MAAA,EAAA,CAFA,qCAAY,OAAAub,GAAgBhjB,EAAA8jB,EAAI,OAAJ,YAAA9jB,EAAU,KAAM8jB,EAAI,MAAMf,GAAAe,EAAI,OAAJ,YAAAf,GAAU,KAAU,GAAA,CAAA,MAAA,CAAA,CAAA,qBACjF,IAAA,OAAsD,sBAAtD3kB,EAAAA,YAAsDsJ,EAAAA,yBAAtC1H,EAAA8jB,EAAI,OAAJ,MAAA9jB,EAAU,KAAO3B,EAAAA,MAAA2lB,GAAAA,UAAA,EAAa3lB,QAAA4lB,GAAAA,IAAA,CAAI,CAAA,EAAA,2BAG3C5lB,EAAAA,MAAAgC,EAAA,EAAWyjB,EAAI,IAAI,iBAK5Bzc,EAAAA,mBAMC,IAAA,OAJE,KAAMyc,EAAI,KACX,OAAO,SACP,IAAI,UAAA,qBACD9jB,EAAA8jB,EAAI,OAAJ,YAAA9jB,EAAU,KAAK,EAAA,EAAAkkB,EAAA,kBAXpB9lB,EAAAA,YAKc+lB,GAAA,OAHX,MAAO5f,EAAK,IAAI,IAAIuf,EAAI,IAAI,GAC5B,QAAOlB,CAAA,qBACR,IAAA,OAAqB,4CAAlB5iB,EAAA8jB,EAAI,OAAJ,YAAA9jB,EAAU,KAAK,EAAA,CAAA,CAAA,sBAOA,qBAK1BqH,EAAAA,mBAwBWqc,EAAAA,SAAA,CAAA,IAAA,GAAA,CAvBTnc,qBAA8B,KAAA,KAAAgc,EAAAA,iBAAvBR,EAAAe,EAAI,OAAJ,YAAAf,EAAU,KAAK,EAAA,CAAA,EACtBxb,EAAAA,mBAqBK,KAAA,KAAA,EApBHH,YAAA,EAAA,EAAAC,EAAAA,mBAmBKqc,EAAAA,SAAA,KAAAC,EAAAA,WAlBSG,EAAI,SAAT/R,GAAC,4BADV1K,EAAAA,mBAmBK,KAAA,CAjBF,IAAK0K,EAAE,IAAA,GACRpS,cAEStB,EAAAA,MAAAoJ,EAAAA,MAAA,EAAA,CAFA,qCAAY,OAAAub,GAAgBhjB,EAAA+R,EAAE,OAAF,YAAA/R,EAAQ,KAAM+R,EAAE,MAAMgR,EAAAhR,EAAE,OAAF,YAAAgR,EAAQ,KAAQ,GAAA,CAAA,MAAA,CAAA,CAAA,qBACzE,IAAA,QAAoD,sBAApD3kB,EAAAA,YAAoDsJ,EAAAA,yBAApC1H,GAAA+R,EAAE,OAAF,MAAA/R,GAAQ,KAAO3B,EAAAA,MAAA2lB,GAAAA,UAAA,EAAa3lB,QAAA4lB,GAAAA,IAAA,CAAI,CAAA,EAAA,2BAGzC5lB,EAAAA,MAAAgC,EAAA,EAAWyjB,EAAI,IAAI,iBAK5Bzc,EAAAA,mBAMC,IAAA,OAJE,KAAMyc,EAAI,KACX,OAAO,SACP,IAAI,UAAA,qBACD9jB,EAAA+R,EAAE,OAAF,YAAA/R,EAAQ,KAAK,EAAA,EAAAokB,EAAA,kBAXlBhmB,EAAAA,YAKc+lB,GAAA,OAHX,GAAE,GAAK5f,EAAK,IAAI,IAAIuf,EAAI,IAAI,IAAI/R,EAAE,IAAI,GACtC,QAAO6Q,CAAA,qBACR,IAAA,QAAmB,4CAAhB5iB,GAAA+R,EAAE,OAAF,YAAA/R,GAAQ,KAAK,EAAA,CAAA,CAAA,sBAOA,qPClMpC,MAAMpB,EAAQ8H,EAGR,CAAE,aAAA1I,CAAA,EAAiBE,YAAA,EACnBC,EAAYH,EAAa,aAAa,EAEtC,CAAE,EAAAuN,CAAA,EAAMzN,GAAA,EAGR0R,EAAU/D,EAAAA,IAAI,EAAK,EACnB4Y,EAAYzd,EAAAA,SAAS,IAAOhI,EAAM,SAAW,OAAS,OAAQ,EAC9D0lB,EAAe,IAAM,CACzB9U,EAAQ,MAAQ,CAACA,EAAQ,KAC3B,8BAGAnI,EAAAA,mBAwBM,MAAA,CAxBA,uBAAOhJ,EAAAA,MAAAF,CAAA,CAAS,CAAA,GACpBoJ,EAAAA,mBAUM,MAAA,CATJ,MAAKgd,EAAAA,eAAA,CAAC,oBAAmB,CAAA,SACL,EAAA/U,EAAA,KAAO,CAAA,CAAA,EAC1B,wBAAY8U,EAAY,CAAA,MAAA,CAAA,CAAA,eACzB/c,EAAAA,mBAAwD,IAAA,CAApD,uBAAO,CAAA,WAAA,yBAAA,CAAuC,CAAA,YAEzCb,EAAA,oDADTW,EAAAA,mBAIC,OAJDG,GAIC+b,EAAAA,gBADKllB,EAAAA,MAAAkN,CAAA,EAAC,iBAAA,CAAA,EAAA,CAAA,OAGT5L,cAWWtB,EAAAA,MAAA8iB,EAAAA,QAAA,EAAA,YAVA3R,EAAA,2CAAAA,EAAO,MAAAuG,GACf,MAAKyO,EAAAA,eAAA,CAAA,KAAUH,EAAA,MAAS,YAAeA,EAAA,MAAS,EACjD,MAAM,wBACL,cAAa,GACb,iBAAgB,GACjB,UAAU,MACV,UAAA,GACC,cAAc3d,EAAA,SAAQ,iCAAA,+BACvB,KAAK,KAAA,qBACL,IAAuC,CAAvC/G,EAAAA,YAAuC8kB,GAAA,CAA1B,uBAAOjV,EAAA,MAAO,GAAA,sGC7D3BkV,GAAqB,CACzB,QAAQlmB,EAAgB,OACtBA,EAAI,WAAUwB,EAAA2kB,GAAa,OAAb,KAAA3kB,EAAqB,eAAgB2kB,EAAY,CACjE,CACF,ECcQ,CAAE3mB,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,OAAO,0BAEP,CAC7BW,KAAM,UACNC,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNC,QAAS,IAEXL,KAAM,CACJG,KAAMC,OACNC,QAAS4Q,QAEXvH,GAAI,CACFvJ,KAAMC,OACNC,QAAS4Q,QAEX3Q,MAAO,CACLH,KAAM,CAACC,OAAQG,OAAQ0Q,MAAS,EAChC5Q,QAAS,IAEXoV,YAAa,CACXtV,KAAMC,OACNC,QAAS4Q,QAEXgV,WAAY,CACV9lB,KAAMC,OACNC,QAAS,IAEX6lB,WAAY,CACV/lB,KAAMC,OACNC,QAAS,IAEX2Q,KAAM,CACJ7Q,KAAMC,OACNC,QAAS4Q,QAEXxD,SAAU,CACRtN,KAAMO,QACNL,QAAS,IAEX8lB,UAAW,CACThmB,KAAMI,OACNF,QAAS,IAEXwQ,QAAS,CACP1Q,KAAMO,QACNL,QAAS,IAEXqV,UAAW,CACTvV,KAAMO,QACNL,QAAS,IAEX+lB,SAAU,CACRjmB,KAAMO,QACNL,QAAS,IAEXgmB,WAAY,CACVlmB,KAAMC,OACNC,QAAS4Q,QAEX9Q,KAAM,CACJA,KAAMC,OACNC,QAAS,QAEXimB,KAAM,CACJnmB,KAAMI,OACNF,QAAS,GAEXkmB,SAAU,CACRpmB,KAAM,CAACO,QAASsL,MAAM,EACtB3L,QAAS,IAEXkR,QAAS,CACPpR,KAAMC,OACNC,QAAS,WACX,GAGF+N,MAAO,CAAC,oBAAqB,QAAS,OAAQ,QAAS,QAAS,SAAS,EAEzEtN,MAAMb,EAAO,CAAEoO,KAAAA,CAAK,EAAG,CAErB,KAAM,CAAEzB,EAAAA,GAAMzN,GAAa,EACrByS,EAAaC,EAAAA,gBAAgB,MAAM,EACnCsE,EAAarJ,EAAAA,IAAI7M,EAAMK,KAAK,EAE5BkmB,EAAgB1Z,EAAAA,IAAI,EAAK,EAGzB2Z,EAAYxe,EAAAA,SAAoC,IAAA,OAAOhI,OAAAA,EAAAA,EAAM+Q,OAAN/Q,KAAAA,EAAcqN,EAAAA,MAAMsE,CAAU,EAAmB,EACxG8U,EAAeze,EAAAA,SAAS,IAAMhI,EAAMwV,aAAe7I,EAAE,oBAAoB,CAAC,EAC1E2J,EAAkBtO,EAAAA,SAAS,IAAA,SAAOhI,QAAAA,GAAAA,EAAAA,EAAMyJ,KAANzJ,KAAAA,EAAYA,EAAMD,OAAlBC,KAAAA,EAA0BA,EAAMC,OAAS+Q,OAAS,EAG1FpD,EAAAA,MACE,IAAM5N,EAAMK,MACXif,GAAa,CACZpJ,EAAW7V,MAAQif,CACrB,CACF,EAIA,MAAMoH,EAAmBA,IAClB1mB,EAAMgmB,WACXjlB,EAAAA,YAAAkI,GAAA,CAAA,SAAyBjJ,EAAMgmB,UAAU,EAAA,IAAA,EADX,KAI1BW,EAAmBA,IAClB3mB,EAAMimB,WACXllB,EAAAA,YAAAkI,GAAA,CAAA,SAAyBjJ,EAAMimB,UAAU,EAAA,IAAA,EADX,KAI1B5P,EAAcrO,EAAAA,SAAS,IACvB,OAAOhI,EAAMwN,UAAa,UAAkBxN,EAAMwN,SAClD,OAAOxN,EAAMwN,UAAa,SAAiBxN,EAAMwN,WAAa,GAC3D,EACR,EAEKqO,EAAera,GAAyB,CAC5C0U,EAAW7V,MAAQmB,EACnB4M,EAAK,oBAAqB5M,CAAG,EAC7B4M,EAAK,QAAS5M,CAAG,CACnB,EAEMiV,EAAcjI,GAAsB,CACxC+X,EAAclmB,MAAQ,GAClBL,EAAMsR,UAAY,YAAalD,EAAK,OAAQI,EAAO0H,EAAW7V,MAAOL,EAAMomB,UAAU,EACpFhY,EAAK,OAAQI,EAAO0H,EAAW7V,MAAOL,EAAMC,IAAI,CACvD,EAEM8b,EAAevN,GAAsB,CACxCA,EAAM8S,OAA4BsF,OAAM,EACrC5mB,EAAMsR,UAAY,YAAalD,EAAK,QAASI,EAAO0H,EAAW7V,MAAOL,EAAMomB,UAAU,EACrFhY,EAAK,QAASI,EAAO0H,EAAW7V,MAAOL,EAAMC,IAAI,CACxD,EAEM4mB,EAAerY,GAAe,CAClCJ,EAAK,QAASI,CAAK,CACrB,EAEMsY,EAAiBtY,GAAyB,CAC9C+X,EAAclmB,MAAQ,GACtB+N,EAAK,UAAWI,CAAK,CACvB,EAGA,MAAO,IACAxO,EAAM4Q,QACX7P,EAAAA,YAAAgmB,EAAAA,QAAA,CAAA,IAES/mB,EAAMC,KAAI,GACXqW,EAAgBjW,MAAK,KACnBL,EAAMD,KAAI,KACVC,EAAME,KAAI,WACJgW,EAAW7V,MAAK,eACZ,CAAE2mB,OAAQ,IAAM,SACtBhnB,EAAMmmB,SAAQ,KAClBnmB,EAAMqmB,KAAI,SACNrmB,EAAMsmB,SAAQ,KAClBE,EAAUnmB,MAAK,cACNkmB,EAAclmB,MAAK,UACvBL,EAAMkmB,UAAS,YACbO,EAAapmB,MAAK,SACrBgW,EAAYhW,MAAK,UAChBL,EAAMyV,UAAS,QACjBoG,EAAW,OACZpF,EAAU,QACTsF,EAAW,QACX8K,EAAW,UACTC,EAAa,MACjBvnB,GAAS,MACT,CAAEsV,QAAS7U,EAAM4Q,QAAU,GAAK,MAAO,CAAC,EAAA,CAE7CqW,OAAQA,IAAMP,EAAgB,EAC9BQ,OAAQA,IAAMP,EAAgB,CAAE,CAAA,EA3BX,IAgC/B,CACF,CAAC,qCCxMGhY,GAAgB,CACpB,QAAQ/O,EAAgB,OACtBA,EAAI,WAAUwB,EAAA+lB,GAAQ,OAAR,KAAA/lB,EAAgB,UAAW+lB,EAAO,CAClD,CACF,ECUQ,CAAE/nB,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,cAAc,0BAEd,CAC7BW,KAAM,gBACNC,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNC,QAAS,IAEXL,KAAM,CACJG,KAAMC,OACNC,QAAS4Q,QAEXvH,GAAI,CACFvJ,KAAMC,OACNC,QAAS4Q,QAEX3Q,MAAO,CACLH,KAAMI,OACNF,QAAS4Q,QAEXwE,YAAa,CACXtV,KAAMC,OACNC,QAAS4Q,QAEXxD,SAAU,CACRtN,KAAMO,QACNL,QAAS,IAEXiY,IAAK,CACHnY,KAAMI,OACNF,QAAS4Q,QAEXzQ,IAAK,CACHL,KAAMI,OACNF,QAAS4Q,QAEXD,KAAM,CACJ7Q,KAAMC,OACNiR,SAAU,GACVhR,QAAS4Q,QAEXoW,KAAM,CACJlnB,KAAMI,OACNF,QAAS,GAEXinB,aAAc,CACZnnB,KAAMO,QACNL,QAAS,IAEXknB,UAAW,CACTpnB,KAAMI,OACNF,QAAS4Q,QAEXJ,QAAS,CACP1Q,KAAMO,QACNL,QAAS,IAEXgmB,WAAY,CACVlmB,KAAMC,OACNC,QAAS4Q,QAEXM,QAAS,CACPpR,KAAMC,OACNC,QAAS4Q,QAEXoQ,SAAU,CACRlhB,KAAMC,OACNC,QAAS4Q,MACX,GAGF7C,MAAO,CAAC,oBAAqB,QAAS,OAAQ,QAAS,UAAW,QAAQ,EAE1EtN,MAAMb,EAAO,CAAEoO,KAAAA,CAAK,EAAG,CAErB,KAAM,CAAEzB,EAAAA,GAAMyO,WAAO,EACflF,EAAarJ,EAAAA,IAAI7M,EAAMK,KAAK,EAC5BsR,EAAaC,EAAAA,gBAAgB,MAAM,EAEnC4U,EAAYxe,EAAAA,SAAoC,IAAA,OAAOhI,OAAAA,EAAAA,EAAM+Q,OAAN/Q,KAAAA,EAAcqN,EAAAA,MAAMsE,CAAU,EAAmB,EACxGyE,EAAepO,WAAS,IAAOhI,EAAMwV,YAAcxV,EAAMwV,YAAc7I,EAAE,oBAAoB,CAAE,EAC/F0J,EAAcrO,EAAAA,SAAS,IAAMhI,EAAMwN,QAAQ,EAC3C8I,EAAkBtO,EAAAA,SAAS,IAAA,SAAOhI,QAAAA,GAAAA,EAAAA,EAAMyJ,KAANzJ,KAAAA,EAAYA,EAAMD,OAAlBC,KAAAA,EAA0BA,EAAMC,OAAS+Q,OAAS,EAE1FpD,EAAAA,MACE,IAAM5N,EAAMK,MACXkW,GAAW,CACVL,EAAW7V,MAAQkW,CACrB,CACF,EAGA,MAAMsF,EAAera,GAAQ,CAC3B4M,EAAK,oBAAqB5M,EAAKxB,EAAMC,IAAI,EACzCmO,EAAK,QAAS5M,EAAKxB,EAAMC,IAAI,CAC/B,EACMwW,EAAcU,GAAuB,CACrCnX,EAAMsR,UAAY,YAAalD,EAAK,OAAQ+I,EAAQjB,EAAW7V,MAAOL,EAAMomB,UAAU,EACrFhY,EAAK,OAAQ+I,EAAQjB,EAAW7V,MAAOL,EAAMC,IAAI,CACxD,EAEM8b,EAAe5E,GAAuB,CACtCA,EAAOmK,QAASnK,EAAOmK,OAA4BsF,OAAM,EAEzD5mB,EAAMsR,UAAY,YAAalD,EAAK,QAAS+I,EAAQjB,EAAW7V,MAAOL,EAAMomB,UAAU,EACtFhY,EAAK,QAAS+I,EAAQjB,EAAW7V,MAAOL,EAAMC,IAAI,CACzD,EAIMuW,EAAeA,CAAC+Q,EAAsBC,IAAqB,CAC/DpZ,EAAK,SAAUmZ,EAAcC,CAAQ,CACvC,EAIA,OACEzmB,EAAAA,YAAA0mB,EAAAA,cAAA,CAAA,MAESloB,GAAS,IACXS,EAAMC,MAAQ,kBAAiB,GAChCqW,EAAgBjW,MAAK,KACnBL,EAAMD,KAAI,WACPmW,EAAW7V,MAAK,sBAAA8W,GAAhBjB,EAAW7V,MAAK8W,EAAA,MAClB,CAAEtC,QAAS7U,EAAM4Q,QAAU,GAAK,QAAQ,KACzC4V,EAAUnmB,MAAK,YACR+V,EAAa/V,MAAK,SACrBgW,EAAYhW,MAAK,oBACRL,EAAMohB,SAAQ,KAC3BphB,EAAMonB,KAAI,gBACDpnB,EAAMqnB,aAAY,UACtBrnB,EAAMsnB,UAAS,IACrBtnB,EAAMqY,IAAG,IACTrY,EAAMO,IAAG,QAELsb,EAAW,OACZpF,EAAU,QACTsF,EAAW,SACVvF,CAAY,EAAA,IAAA,CAK5B,CACF,CAAC,qCCjKGkR,GAAsB,CAC1B,QAAQ9nB,EAAgB,OACtBA,EAAI,WAAUwB,EAAAumB,GAAc,OAAd,KAAAvmB,EAAsB,gBAAiBumB,EAAa,CACpE,CACF,ECcQ,CAAEvoB,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,QAAQ,0BACR,CAC7BW,KAAM,WACNC,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNC,QAAS,IAEXL,KAAM,CACJG,KAAMC,OACNC,QAAS4Q,QAEXvH,GAAI,CACFvJ,KAAMC,OACNC,QAAS4Q,QAEXwJ,WAAY,CACVta,KAAM,CAACC,OAAQqS,MAAOzG,MAAM,EAC5B3L,QAAS4Q,QAEX3Q,MAAO,CACLH,KAAM,CAACC,OAAQqS,MAAOzG,MAAM,EAC5B3L,QAAS4Q,QAEXwG,MAAO,CACLtX,KAAMC,OACNC,QAAS4Q,QAEX8C,UAAW,CACT5T,KAAM,CAACC,OAAQqS,KAAK,EACpBpS,QAAS4Q,QAEXwE,YAAa,CACXtV,KAAMC,OACNC,QAAS4Q,QAEXxD,SAAU,CACRtN,KAAMO,QACNL,QAAS,IAEXqV,UAAW,CACTvV,KAAMO,QACNL,QAAS,IAEX0V,SAAU,CACR5V,KAAMO,QACNL,QAAS,IAEXyV,WAAY,CACV3V,KAAMO,QACNL,QAAS,IAEXwnB,QAAS,CACP1nB,KAAMC,OACNiR,SAAU,IAEZyC,WAAY,CAEV3T,KAAMC,OACNC,QAAS4Q,QAEXJ,QAAS,CACP1Q,KAAMO,QACNL,QAAS,IAEXynB,UAAW,CACT3nB,KAAMuR,SACNrR,QAASA,IAAM,CAAC,GAElBoR,GAAI,CACFtR,KAAMuR,SACNrR,QAASA,IAAM,CAAC,GAElB0nB,MAAO,CACL5nB,KAAMuR,SACNrR,QAASA,IAAM,CAAC,GAElB2nB,SAAU,CACR7nB,KAAMO,QACNL,QAAS,IAEXgmB,WAAY,CACVlmB,KAAMC,OACNC,QAAS4Q,QAEXM,QAAS,CACPpR,KAAMC,OACNC,QAAS4Q,QAEXgX,QAAS,CACP9nB,KAAM6L,OACN3L,QAASA,IAAM,CAAC,GAElB6nB,aAAc,CACZ/nB,KAAMO,QACNL,QAAS,IAEX2Q,KAAM,CACJ7Q,KAAMC,OACNC,QAAS4Q,MACX,GAGF7C,MAAO,CAAC,oBAAqB,QAAS,QAAS,QAAQ,EACvDtN,MAAMb,EAAO,CAAEoO,KAAAA,CAAK,EAAG,SACrB,MAAM8Z,EAAYC,GAAAA,aAAY,EACxBhc,EAAWC,GAAAA,YAAW,EACtB,CAAEoD,MAAAA,GAAU4Y,aAAS,EACrB,CAAEzb,EAAAA,EAAGxJ,OAAAA,GAAWiY,WAAO,EAGvBxL,EAAOzM,EAAO9C,MACpB,IAAIgoB,EAAU,gCACd,MAAMC,EAASzb,EAAAA,IAAI,EAAK,EAClBqE,EAAUrE,EAAAA,IAAI,EAAK,EACnB0b,EAAc1b,EAAAA,IAAI,YAAY,EAC9B4Z,EAAeze,EAAAA,SAAS,IAAMhI,EAAMwV,aAAe7I,EAAE,YAAY,CAAC,EAClE6b,EAAgBxgB,WAAS,IAAOhI,EAAMwa,aAAexJ,OAAYhR,EAAMwa,WAAaxa,EAAMK,KAAM,EAChG6V,EAAarJ,EAAAA,IAAI2b,EAAcnoB,KAAK,EACpCooB,EAAiB5b,EAAAA,IAAI7M,EAAM8T,SAAS,EACpC4U,EAAkB7b,EAAAA,IAAI7M,EAAM6V,UAAU,EAGtC8S,EAAc9b,EAAAA,IAAiBmE,MAAS,EACxCuE,EAAU1I,EAAAA,IAAe,EAAE,EAC3B+b,GAAgB/b,EAAAA,IAAe,EAAE,EACjCgc,EAAYhc,EAAAA,IAAI,GAAGtN,EAAS,EAAE,EAC9BoS,EAAaC,EAAAA,gBAAgB,MAAM,EAGnCkX,GAAS9oB,GAAAA,EAAAA,EAAM4nB,UAAN5nB,YAAAA,EAAe+oB,gBAAf/oB,KAAAA,EAAgC,GAC3C8oB,EAAOjb,WAAW,IAAI,EAAGwa,EAAU,yBAC9BS,EAAOjb,WAAW,IAAI,IAC7Bwa,EAAU,8BACVC,EAAOjoB,MAAQ,GACfwoB,EAAUxoB,MAAQ,oBAEhBL,EAAMsR,UAAY,cAAauX,EAAUxoB,OAAS,cAEtD,MAAM2oB,EAAa,IAAIC,IAGjBC,EAAalhB,EAAAA,SAAoC,IAAA,OAAOhI,OAAAA,EAAAA,EAAM+Q,OAAN/Q,KAAAA,EAAcqN,EAAAA,MAAMsE,CAAU,EAAmB,EACzG2E,EAAkBtO,EAAAA,SAAS,IAAA,SAAOhI,QAAAA,GAAAA,EAAAA,EAAMyJ,KAANzJ,KAAAA,EAAYA,EAAMD,OAAlBC,KAAAA,EAA0BA,EAAMC,OAAS+Q,OAAS,EAIpFmY,EAAgB3R,GAAmBA,GAAS,MAAQA,IAAU,GAE9D4R,GAAoBzjB,GAA0B,uBAClD,OAAQxC,EAAO9C,MAAK,CAClB,IAAK,KACH,OAAOsF,GAAAA,EAAAA,EAAK1C,IAAL0C,KAAAA,EAAUA,EAAKgH,IAAfhH,KAAAA,EAAoB,GAC7B,IAAK,KACH,OAAOA,IAAAA,EAAAA,EAAK0jB,KAAL1jB,KAAAA,EAAWA,EAAKgH,IAAhBhH,KAAAA,GAAqB,GAC9B,IAAK,KACH,OAAOA,IAAAA,GAAAA,EAAK2jB,KAAL3jB,KAAAA,GAAWA,EAAKgH,IAAhBhH,KAAAA,GAAqB,GAC9B,QACE,OAAOA,GAAAA,EAAKgH,IAALhH,KAAAA,GAAU,EACrB,CACF,EAEM4jB,EAAqB/R,GACpBA,EACE8Q,EAAOjoB,OAASmX,EAAMkE,SAAS,GAAG,EAAIlE,EAAMtE,MAAM,GAAG,EAAE,CAAC,EAAIsE,EADhD,GAIfgS,EAAqBA,CAAC1F,EAAc2F,IAAoB,CAC5D,MAAM9jB,EAAO8jB,EAAKC,KAAMvW,GAAMhT,OAAOgT,EAAEwW,CAAC,IAAMxpB,OAAO2jB,CAAI,CAAC,EAC1D,OAAKne,EACE4jB,EAAkBH,GAAiBzjB,CAAI,CAAC,EAD7B,EAEpB,EAEMikB,GAAiBA,CAAC9F,EAActM,EAAeqS,IAAkC,CACrF,MAAM9mB,EAAM5C,OAAO2jB,CAAI,EACjBjT,GAAO1Q,OAAOqX,GAASzU,CAAG,EAC1B+mB,GAASd,EAAWe,IAAIhnB,CAAG,EACjC,GAAI+mB,IAAUA,GAAOtS,QAAU3G,GAC7B,OAAIgZ,IAAKC,GAAOD,IAAMA,GACfC,GAET,MAAME,GAAMH,EAAM,CAAExpB,MAAO0C,EAAKyU,MAAO3G,GAAMgZ,IAAAA,CAAI,EAAI,CAAExpB,MAAO0C,EAAKyU,MAAO3G,IAC1EmY,OAAAA,EAAWiB,IAAIlnB,EAAKinB,EAAG,EAChBA,EACT,EAEME,EAAiBrjB,GAAe,SACpC,GAAIA,GAAK,MAAQA,IAAM,GAAI,MAAO,GAClC,GAAI,OAAOA,GAAM,UAAY,CAAC2L,MAAM5Q,QAAQiF,CAAC,EAAG,CAC9C,MAAMsjB,EAAItjB,EACJid,IAAOqG,GAAAA,EAAAA,EAAE9pB,QAAF8pB,KAAAA,EAAWA,EAAER,IAAbQ,KAAAA,EAAkBA,EAAErG,KACjC,OAAOA,IAAQ,MAAQA,KAAS,GAAK,GAAK3jB,OAAO2jB,EAAI,EAAEsG,KAAI,CAC7D,CACA,OAAOjqB,OAAO0G,CAAC,EAAEujB,KAAI,CACvB,EAEMC,EAAkBxjB,GAAe,OACrC,GAAIA,GAAK,MAAQA,IAAM,GAAI,MAAO,GAClC,GAAI,OAAOA,GAAM,UAAY,CAAC2L,MAAM5Q,QAAQiF,CAAC,EAAG,CAC9C,MAAMsjB,EAAItjB,EACJ2Q,GAAQ2S,EAAAA,EAAE3S,QAAF2S,KAAAA,EAAWA,EAAEtjB,EAC3B,OAAO2Q,GAAS,MAAQA,IAAU,GAAK,GAAKrX,OAAOqX,CAAK,EAAE4S,KAAI,CAChE,CACA,OAAOjqB,OAAO0G,CAAC,EAAEujB,KAAI,CACvB,EAEME,GAAsBjY,GACtBA,GAAO,MAAQA,IAAQ,GAAW,GAClCG,MAAM5Q,QAAQyQ,CAAG,EACfA,EAAII,SAAW,EAAU,GACtBJ,EAAIkY,MAAO5kB,GACZA,GAAQ,MAAQA,IAAS,GAAW,GACjC,CAACukB,EAAcvkB,CAAI,GAAKwjB,EAAakB,EAAe1kB,CAAI,CAAC,CACjE,EAEC,OAAO0M,GAAQ,SAAiB,CAAC6X,EAAc7X,CAAG,GAAK8W,EAAakB,EAAehY,CAAG,CAAC,EACpF,GAGHmY,GAAoBA,IAAM,CAC1BhC,EAAcnoB,QAAU,IAC5B+N,EAAK,oBAAqB,EAAE,CAC9B,EAEMqc,EAAgBziB,WAAsB,IAAOsiB,GAAmB3B,EAAYtoB,KAAK,EAAI2Q,OAAY2X,EAAYtoB,KAAM,EAQnHqqB,GAA4BC,GAAqB,CACrD,IAAIC,EAASD,GAAAA,KAAAA,EAAS,CAAA,EACtB,MAAME,EAASA,CAAC/G,GAActM,KAAkB,CAC1C,CAACsM,IAAQ8G,EAAO3T,KAAM9D,IAAMA,GAAEwW,EAAI,KAAO7F,EAAI,IACjD8G,EAAS,CAAC,CAAEjB,EAAG7F,GAAMnX,EAAG6K,IAASsM,GAAMhY,EAAG,IAAiB,GAAG8e,CAAM,EACtE,EACME,EAAKnC,EAAYtoB,MACvB,OAAImS,MAAM5Q,QAAQkpB,CAAE,EAAGA,EAAGtgB,QAAS7E,IAASklB,EAAOX,EAAcvkB,EAAI,EAAG0kB,EAAe1kB,EAAI,GAAKukB,EAAcvkB,EAAI,CAAC,CAAC,EAC3GmlB,GAAM,CAACR,GAAmBQ,CAAE,GAAGD,EAAOX,EAAcY,CAAE,EAAGT,EAAeS,CAAE,GAAKZ,EAAcY,CAAE,CAAC,EAClGF,CACT,EAEMG,GAAqBC,GAAgB,CACzCzV,EAAQlV,MAAM4qB,KAAKD,CAAE,EACjB1C,EAAOjoB,OAAOuoB,GAAcvoB,MAAM4qB,KAAK1gB,GAAA,GAAKygB,EAAI,CACtD,EAOME,GAAmB,IAAY5nB,GAAA,4BACnC,GAAKtD,EAAM4nB,QACN,CACH,IAAIrhB,EAAiB,CAAA,EACrB,MAAM4kB,EAAMnrB,EAAM4nB,QAAQmB,YAAW,EACrC,GAAIoC,EAAItd,WAAW,IAAI,EAIrBwF,OADY8X,EAAIjY,MAAM,GAAG,EAAE,CAAC,EAAEA,MAAM,GAAG,EACnC1I,QAAS2I,IAAM,CACjB,MAAMiY,GAAc,CAClBzB,EAAG,GACHhd,EAAG,GACHb,EAAG,IAECuf,GAAOlY,GAAED,MAAM,GAAG,EACxBkY,GAAG,EAAOC,GAAK,CAAC,EAChBD,GAAG,EAAOC,GAAK,CAAC,EAChBD,GAAG,EAAO,GACV7kB,EAAI0kB,KAAKG,EAAE,CACb,CAAC,EACM7kB,EACF,CACL,MAAM+kB,GAAYpD,EAAAA,EAAUoD,YAAVpD,YAAAA,EAAsBiD,GACxC,GAAInrB,EAAM6T,aAAe7C,QAAasa,EAAW/kB,EAAM+kB,UAC9CtrB,EAAM4nB,UAAY,OAAQ,CAEjC,MAAM2D,GAAOpf,EAASqf,gBACtB,GAAID,GAAM,CACR,GAAIvrB,EAAM6T,aAAe7C,OAAW,CAClC,MAAMya,GAAQ,CAAA,EACdA,GAAM,IAAS,OACfA,GAAM,KAAUF,GAChBrD,EAAUwD,aAAaD,EAAyC,CAClE,CACAllB,EAAMglB,EACR,CACF,KAAO,CACL,MAAMA,GAAOpf,EAASwf,QAAQR,CAAG,EAEjC,GAAII,GAAM,CAER,GAAIvrB,EAAM6T,aAAe7C,OAAW,CAClC,MAAMya,GAAQ,CAAA,EACdA,GAAM,IAASN,EACfM,GAAM,KAAUF,GAChBrD,EAAUwD,aAAaD,EAAyC,CAClE,CAEAllB,EAAMglB,EACR,CACF,CAKA,IAAI9B,GAAOljB,EACX,GAAIvG,EAAM6T,WAAY,CACpB,MAAMrP,GAAM,IAAIonB,OAAO5rB,EAAM6T,WAAY,GAAG,EAC5C4V,GAAOljB,EAAI8D,OAAQ8I,IAAM3O,GAAIqnB,KAAK1Y,GAAEwW,CAAC,CAAC,CACxC,CACA,OAAOF,EACT,CACF,KA9DoB,QAAO,IA+D7B,GAaMqC,GAAgBzrB,GAAU,CAC1BA,EACF6qB,KAAmB3L,KAAMoL,GAAqB,CAC5CpV,EAAQlV,MAAQsqB,EAAMtgB,OAAQ1E,GAAS,OAErC,GACEA,EAAKgkB,EAAEvW,QAAQ/S,CAAK,IAAM,MAC1BsF,EAAAA,EAAKgH,IAALhH,YAAAA,EAAQyN,QAAQ/S,MAAW,IAC3BsF,EAAKmG,EAAEsH,QAAQ/S,EAAM0oB,YAAW,CAAE,IAAM,GAExC,MAAO,EACX,CAAC,CACH,CAAC,EAEDmC,KAAmB3L,KAAMoL,GAAqB,CAC5CpV,EAAQlV,MAAQsqB,CAClB,CAAC,CACL,EAMM9D,GAAcA,IAAM,CACpByB,EAAOjoB,QAAU,GACnB6qB,GAAgB,EAAG3L,KAAMoL,GAAqB,CAC5CpV,EAAQlV,MAAQsqB,CAClB,CAAC,EACEpV,EAAQlV,MAAQqqB,GAAyB9B,GAAcvoB,KAAK,EAEjEL,EAAM8nB,MAAMa,EAAYtoB,MAAOL,EAAMC,KAAMD,EAAM4nB,OAAO,EACxDxZ,EAAK,OAAO,CACd,EAOM2d,GAAsBlf,EAAAA,IAAI,EAAK,EACrC,IAAImf,GAAoC,KACpCC,GAA6C,KAC7CC,GAAmB,EAEvB,MAAMC,GAAuBxV,GAC3BiS,GAAcvoB,MAAMgK,OAAQ8I,GACtBA,GAAAA,EAAExG,GACMwG,EAAExG,EAAEuG,MAAM,GAAG,EACjB,CAAC,EAAEE,QAAQuD,CAAK,IAAM,IAE1BxD,EAAEwW,GAAKxW,EAAEwW,EAAEvW,QAAQuD,CAAK,IAAM,GAEnC,EAEGyV,GAAmB,CAAOzV,EAAQ,KAAsBrT,GAAA,sBAC5D,GAAI2oB,IAAwBD,KAAuBrV,EAAO,OAAOsV,GAEjE,MAAMI,EAAa,EAAEH,GACrBF,OAAAA,GAAqBrV,EAErBsV,GAAoC3oB,GAAA,sBAClC4N,EAAQ7Q,MAAQ,GAChB,GAAI,CACF,MAAMisB,EAAWtsB,EAAM4nB,QAAQ2E,UAAU,CAAC,EACpC,CAAEC,MAAAA,CAAM,EAAI,MAAMxsB,EAAM6nB,UAAUyE,EAAU3V,EAAO3W,EAAMgoB,OAAO,EACtE,GAAIqE,IAAeH,GAAkB,OAErC,MAAMO,GAAiB,CAAA,EACvB,GAAI,CACFC,KAAKC,MAAMH,CAAK,EAAEhiB,QAAS2I,IAAW,CACpCsZ,GAAIxB,KAAK,CAAEtB,EAAGxW,GAAEwW,EAAGhd,EAAGwG,GAAExG,EAAGb,EAAG,EAAG,CAAY,CAC/C,CAAC,CACH,OAAS7I,GAAG,CACV2pB,QAAQC,IAAI5pB,EAAC,CACf,CAEAsS,EAAQlV,MAAQqqB,GAAyB+B,EAAG,EAC5C7D,GAAcvoB,MAAQ,CAAC,GAAGkV,EAAQlV,KAAK,EACvC0rB,GAAoB1rB,MAAQ,EAC9B,QAAA,CACMgsB,IAAeH,KACjBhb,EAAQ7Q,MAAQ,GAChBkoB,EAAYloB,MAAQkV,EAAQlV,MAAMoS,SAAW,EAAI9F,EAAE,eAAe,EAAIA,EAAE,gBAAgB,GAEtFqf,KAAuBrV,IACzBqV,GAAqB,KACrBC,GAAuB,KAE3B,CACF,GAEOA,EACT,GAMMa,GAAe,CAAOnW,EAAQ,KAAsBrT,GAAA,sBACxD,MAAMypB,EAAI5sB,OAAOwW,GAAAA,KAAAA,EAAS,EAAE,EAE5B,GAAIoW,GAAKnE,GAAcvoB,MAAMoS,OAAS,GAAKzS,EAAM+nB,WAAa,GAAO,CACnE,MAAMiF,EAAWb,GAAoBY,CAAC,EACtC,GAAIC,EAASva,OAAS,EAAG,CACvB8C,EAAQlV,MAAQqqB,GAAyBsC,CAAQ,EACjD9b,EAAQ7Q,MAAQ,GAChB,MACF,CACF,CAGA,GAAI,EADc0sB,IAAM,IAAM/sB,EAAM+nB,UAAY,CAACgE,GAAoB1rB,OAASuoB,GAAcvoB,MAAMoS,SAAW,GAC7F,CACd8C,EAAQlV,MAAQqqB,GAAyB9B,GAAcvoB,KAAK,EAC5D6Q,EAAQ7Q,MAAQ,GAChB,MACF,CAEA,MAAM+rB,GAAiBW,CAAC,CAC1B,GAEME,GAAsBA,CAACnJ,EAAcjT,IAAiB,CAC1D,GAAI,CAACiT,EAAM,OACX,MAAMoJ,EAAU3X,EAAQlV,MAAMqpB,KAAMvW,GAAMhT,OAAOgT,EAAEwW,CAAC,IAAMxpB,OAAO2jB,CAAI,CAAC,EACtE,GAAIoJ,EAAS,CACPrc,GAAQqc,EAAQvgB,IAAMkE,IAAMqc,EAAQvgB,EAAIkE,GAC5C,MACF,CACAka,GAAkB,CAAEpB,EAAG7F,EAAMnX,EAAGkE,GAAQiT,EAAMhY,EAAG,EAAG,CAAY,CAClE,EAEMqhB,GAAsB,CAAOrJ,EAAc1T,IAAmC9M,GAAA,6BAClF,GAAI8M,GAAQA,IAAS0T,EAAM,OAAO1T,EAClC,MAAMgd,GAAahsB,GAAA,MAAM8pB,GAAgB,IAAtB,KAAA9pB,GAA6B,CAAA,EAChD,IAAIoW,EAAQgS,EAAmB1F,EAAMsJ,CAAS,EAI9C,OAHI5V,IAEJA,EAAQgS,EAAmB1F,EAAMvO,EAAQlV,KAAK,EAC1CmX,GAAcA,GAEd8Q,EAAOjoB,MAQJmX,GAASsM,EAClB,GAEMuJ,GAA0Bhb,GAAiB/O,GAAA,gCAC/C,GAAIgnB,GAAmBjY,CAAG,EAAG,CAC3B6D,EAAW7V,MAAQ2Q,OACnB2X,EAAYtoB,MAAQ2Q,OACpBwZ,GAAiB,EACjB,MACF,CAGA,GAFAtU,EAAW7V,MAAQgS,EAEfG,MAAM5Q,QAAQyQ,CAAG,EAAG,CACtB,MAAMib,GAAgD,CAAA,EACtD,QAAS1Z,GAAQ,EAAGA,GAAQvB,EAAII,OAAQmB,KAAS,CAC/C,MAAMjO,GAAO0M,EAAIuB,EAAK,EACtB,GAAIjO,KAAS,GAAI,SACjB,MAAMme,GAAOoG,EAAcvkB,EAAI,EAC/B,IAAIyK,GAAOia,EAAe1kB,EAAI,EAC9B,GAAIwjB,EAAa/Y,EAAI,GAAKA,KAAS0T,GAAM,CACvC,MAAMyJ,GAAU/a,MAAM5Q,QAAQ5B,EAAM8T,SAAS,EAAI9T,EAAM8T,UAAUF,EAAK,EAAI5C,OACtEuc,IAAWA,KAAYzJ,KAAM1T,GAAOjQ,OAAOotB,EAAO,EACxD,CACA,MAAM1c,GAAO,MAAMsc,GAAoBrJ,GAAMqF,EAAa/Y,EAAI,GAAKA,KAAS0T,GAAO9S,OAAYZ,EAAI,EAC7FyZ,GAAM,OAAOlkB,IAAS,UAAYA,KAAS,KAASA,GAAiCkkB,IAAkC7Y,OAC7Hsc,GAASrC,KAAKrB,GAAe9F,GAAMjT,GAAMgZ,EAAG,CAAC,EAC7CoD,GAAoBnJ,GAAMjT,EAAI,CAChC,CACA8X,EAAYtoB,MAAQitB,GACpB,MACF,CAEA,MAAMxJ,EAAOoG,EAAc7X,CAAG,EAC9B,IAAIjC,EAAO,GACX,GAAI,OAAOiC,GAAQ,UAAYA,IAAQ,KAAM,CAC3C,MAAM8X,GAAI9X,EACVjC,EAAOjQ,QAAOgqB,IAAAA,GAAAA,GAAE3S,QAAF2S,KAAAA,GAAWA,GAAEtjB,IAAbsjB,KAAAA,GAAkB,EAAE,CACpC,MAAW,OAAOnqB,EAAM8T,WAAc,WAAU1D,EAAOpQ,EAAM8T,WAC7D,MAAMjD,EAAO,MAAMsc,GAAoBrJ,EAAMqF,EAAa/Y,CAAI,GAAKA,IAAS0T,EAAO9S,OAAYZ,CAAI,EAC7FyZ,GAAM,OAAOxX,GAAQ,UAAYA,IAAQ,KAASA,EAAgCwX,IAAkC7Y,OAC1H2X,EAAYtoB,MAAQupB,GAAe9F,EAAMjT,EAAMgZ,EAAG,EAClDoD,GAAoBnJ,EAAMjT,CAAI,CAChC,GAEAjD,EAAAA,MACE4a,EACClJ,GAAa,CACP+N,GAAiB/N,CAAQ,CAChC,EACA,CAAEkO,KAAM,GAAMzoB,UAAW,EAAK,CAChC,EAEA6I,EAAAA,MACE,IAAM5N,EAAM8T,UACXyC,GAAW,OACVkS,EAAepoB,MAAQkW,EAClB+T,GAAmBpU,EAAW7V,KAAK,GAAQgtB,IAAiB7E,EAAAA,EAAcnoB,QAAdmoB,KAAAA,EAAuBtS,EAAW7V,KAAK,CAC1G,CACF,EAQA,MAAM0b,GAAevN,GAAsB,CACrC8Z,EAAOjoB,QAAU,IACnB6qB,GAAgB,EAAG3L,KAAMoL,GAAqB,CAC5C,GAAIrC,EAAOjoB,QAAU,KACQsqB,GAAU,MAAQA,EAAMlY,SAAW,GAC5DjD,OAAAA,EAAM,gCAAiC,SAAS,EACzC,GAEX+F,EAAQlV,MAAQsqB,CAClB,CAAC,EACHvc,EAAK,QAASI,CAAK,CACrB,EAQMif,GAAsBA,IAAM,CAChC,EAGIhX,GAAaA,IAAM,CAOvB,EASIiX,GAAsBva,GAAe,CACzC,IAAIxG,EAAIwG,EAAExG,EACV,OAAQiD,EAAI,CACV,IAAK,QACHjD,EAAIwG,EAAExG,EACN,MACF,IAAK,KACHA,EAAIwG,EAAElQ,EACN,MACF,IAAK,KACH0J,EAAIwG,EAAEkW,GACN,MACF,IAAK,KACH1c,EAAIwG,EAAEmW,GACN,MACF,QACE3c,EAAIwG,EAAExG,EACN,KACJ,CACA,OAAKA,IAAGA,EAAIwG,EAAExG,GACd5L,EAAAA,YAAA4sB,EAAAA,SAAA,CAAA,IAESxa,EAAEwW,EAAI,GAAE,MACNhd,EAAC,MACDid,GAAezW,EAAEwW,EAAI,GAAIhd,GAAAA,KAAAA,EAAK,EAAE,CAAC,EAAA,CAAAvM,QAAAA,IAAA,CAAAW,EAAAA,YAAA,OAAA,CAAA,MAAA,4BAAA,CACA4L,CAAC,GAAA5L,EAAAA,YAAA,OAAA,CAAA,MAAA,4BAAA,CACDoS,EAAEwW,CAAC,CAAA,CAAA,CAAA,CAAA,CAGjD,EAQMiE,GAAqBza,GAAe,CACxC,MAAMxG,EAAIwG,EAAExG,EACZ,IAAInL,EAAMmL,EACV,MAAMkhB,EAAwB,CAAA,EACxBhE,GAA8B,CAAA,EACpC,IAAIiE,GAAc,GAClB,GAAInhB,EAAG,CACL,GAAIA,EAAEyG,QAAQ,GAAG,IAAM,GAAI,CAEzB0a,GAAc,GACd,MAAMC,GAAKphB,EAAEuG,MAAM,GAAG,EACtB1R,EAAMusB,GAAG,CAAC,EACV,IAAIC,GAAKD,GAAG,CAAC,EACbC,GAAKA,GAAG9a,MAAM,GAAG,EAAE,CAAC,EACpB,MAAM+a,GAAKD,GAAG9a,MAAM,GAAG,EACvB,QAAStQ,GAAI,EAAGA,GAAIqrB,GAAGxb,OAAQ7P,KAAK,CAElC,MAAMsrB,GADKD,GAAGrrB,EAAC,EACDsQ,MAAM,GAAG,EACvB2W,GAAIqE,GAAG,CAAC,CAAC,EAAIA,GAAG,CAAC,EACjBL,EAAY5C,KAAKiD,GAAG,CAAC,IAAM,OAAS,OAASA,GAAG,CAAC,CAAC,CACpD,CACF,CACA,GAAIvhB,EAAEyG,QAAQ,GAAG,IAAM,GAAI,CAEzB,MAAM+a,GAAMxhB,EAAEuG,MAAM,GAAG,EACnB4a,KAAgB,KAAOtsB,EAAM2sB,GAAI,CAAC,GACtC,IAAIC,GAAMD,GAAI,CAAC,EACfC,GAAMA,GAAIlb,MAAM,GAAG,EAAE,CAAC,EACtB,MAAMmb,GAAMD,GAAIlb,MAAM,GAAG,EACzB,QAAStQ,GAAI,EAAGA,GAAIyrB,GAAI5b,OAAQ7P,KAAK,CAEnC,MAAM0rB,GADMD,GAAIzrB,EAAC,EACDsQ,MAAM,GAAG,EACzB2W,GAAIyE,GAAI,CAAC,CAAC,EAAIA,GAAI,CAAC,CACrB,CACF,CACF,CACA,IAAIvrB,GAAMoQ,EAAEwW,EAAI,GAChB,OAAI3pB,EAAM8V,WAAa,KAAM/S,GAAMoQ,EAAE3R,MAAQwP,OAAYmC,EAAEwW,EAAI,GAAKxpB,OAAOgT,EAAE3R,GAAG,GAChFT,EAAAA,YAAA4sB,EAAAA,SAAA,CAAA,IAES5qB,GAAG,MACDvB,EAAG,MACHooB,GAAezW,EAAEwW,EAAI,GAAInoB,GAAAA,KAAAA,EAAO,GAAIqoB,EAAG,CAAC,EAAA,CAAAzpB,QAAAA,IAAA,CAAAW,EAAAA,YAAA,OAAA,CAAA,MAAA,4BAAA,CACPS,CAAG,GAAAT,EAAAA,YAAA,OAAA,CAAA,MAAA,0BAAA,EAAA,CACHoS,EAAEwW,CAAC,CAAA,EAC1CkE,EAAYtgB,IAAI,CAACsD,GAAM+C,KAAK7S,EAAAA,YAAA,OAAA,CAAA,IAEpB6S,GAAK,MAAA,6BAAA,CAET/C,EAAI,EAER,CAAC,CAAA,CAAA,CAGR,EAQM2F,EAAsBhV,GAAa8B,GAAA,kCACvC,GAAIgnB,GAAmB9oB,CAAG,EAAG,OAC7B,IAAIoV,EAAiB,GACrB,MAAM2X,EAAqB,CAAA,EACvBvuB,EAAM8V,WAAa,GACrBP,EAAQlV,MAAMmK,QAAS2I,IAAM,QACvBX,MAAM5Q,QAAQJ,CAAG,GAAKA,EAAIyV,KAAM7S,IAAQA,KAAQ+O,GAAEwW,CAAC,GAAG4E,EAAStD,MAAK9X,GAAAA,GAAExG,IAAFwG,KAAAA,GAAO,EAAE,CACnF,CAAC,EACM,OAAO3R,GAAQ,SAAUoV,GAASpV,EAAAA,EAAIgW,QAAJhW,KAAAA,EAAa,IAMtDoV,GAAS4X,IAAAA,GAJKjZ,EAAQlV,MAAMgK,OAAQ8I,IAAM,CACxC,MAAMtM,GAAIrF,EAAM,GAChB,OAAO2R,GAAEwW,EAAI,KAAO9iB,EACtB,CAAC,EACc,CAAC,IAAP2nB,YAAAA,GAAU7hB,IAAV6hB,KAAAA,GAAe,GACpB5X,IAAQA,EAASA,EAAO1D,MAAM,GAAG,EAAE,CAAC,IAEtClT,EAAMsR,UAAY,YAChBtR,EAAM8V,WAAa,IACrB1H,EAAK,SAAU5M,EAAK+sB,EAAUvuB,EAAMomB,UAAU,EAC9C,MAAMpmB,EAAMwR,GAAGhQ,EAAKxB,EAAMomB,WAAYpmB,EAAM4nB,QAAS2G,EAAUvuB,EAAMgoB,OAAO,IAE5E5Z,EAAK,SAAU5M,EAAKoV,EAAQ5W,EAAMomB,UAAU,EAC5C,MAAMpmB,EAAMwR,GAAGhQ,EAAKxB,EAAMomB,WAAYpmB,EAAM4nB,QAAShR,EAAQ5W,EAAMgoB,OAAO,GAErEhoB,EAAM8V,WAAa,IAC1B1H,EAAK,SAAU5M,EAAK+sB,CAAQ,EAC5B,MAAMvuB,EAAMwR,GAAGhQ,EAAKxB,EAAMC,KAAMD,EAAM4nB,OAAO,IAE7CxZ,EAAK,SAAU5M,EAAKoV,CAAM,EAC1B,MAAM5W,EAAMwR,GAAGhQ,EAAKxB,EAAMC,KAAMD,EAAM4nB,OAAO,EAEjD,GAOMhQ,EAAgBvX,GAAqB,CACzC,GAAIiqB,GAAmBjqB,CAAK,EAAG,CAC7B6V,EAAW7V,MAAQ2Q,OACnB2X,EAAYtoB,MAAQ2Q,OACpB5C,EAAK,oBAAqB,EAAE,EAC5B,MACF,CACA8H,EAAW7V,MAAQA,EACnBsoB,EAAYtoB,MAAQA,EACpB+N,EAAK,oBAAqB/N,CAAK,CACjC,EAEA,OAAIL,EAAM4nB,UAAY5W,QAAahR,EAAM4nB,UAAY,OAAMpY,EAAM,KAAKxP,EAAMwX,KAAK,mCAAoC,SAAS,EAGvH,IAEH8Q,EAAOjoB,QAAU,gDAGTiW,EAAgBjW,MAAK,KACnBL,EAAMD,KAAI,WACJ0qB,EAAcpqB,MAAK,SAAA,QAAA,sBAEVuX,EAAY,MAC1B,CAAE/C,QAAS7U,EAAM4Q,QAAU,GAAK,QAAQ,YAClC6V,EAAapmB,MAAK,SACrBL,EAAMwN,SAAQ,UACbxN,EAAMyV,UAAS,KACpByT,EAAW7oB,MAAK,SACZL,EAAM8V,SAAQ,WACZ4S,EAAgBroB,MAAK,gBAClByrB,GAAY,uBACL,GAAI,aACZ9rB,EAAMioB,aAAY,QACvBpB,GAAW,QACX9K,GAAW,mBACF0R,GAAmB,SAC3BjX,EAAY,MACfqS,EAAUxoB,KAAK,EAAA,CAEpB4mB,OAAQA,IAAAlmB,EAAAA,YAAA,IAAA,CAAA,MAAgBsnB,GAAO,IAAA,EAC/BjoB,QAASA,IAAMmV,EAAQlV,MAAMkN,IAAK4F,GAAMua,GAAmBva,CAAC,CAAC,EAAC,EAAApS,EAAAA,YAAA0tB,WAAA,CAAA,IAAA,YAAA,GAM5DnY,EAAgBjW,MAAK,KACnBL,EAAMD,KAAI,WACJ0qB,EAAcpqB,MAAK,SAAA,QAAA,sBAEVuX,EAAY,MAC1B,CAAE/C,QAAS7U,EAAM4Q,QAAU,GAAK,QAAQ,YAClC6V,EAAapmB,MAAK,SACrBL,EAAMwN,SAAQ,UACbxN,EAAMyV,UAAS,KACpByT,EAAW7oB,MAAK,SACZL,EAAM8V,SAAQ,uBACF,GAAI,WACd4S,EAAgBroB,MAAK,OACzB,GAAI,gBACGysB,GAAY,SACjB,IAAG,QACJ5b,EAAQ7Q,MAAK,eACRkoB,EAAYloB,MAAK,aACjBL,EAAMioB,aAAY,QACvBpB,GAAW,QACX9K,GAAW,OACZtF,GAAU,SACRD,EAAY,MACfqS,EAAUxoB,KAAK,EAAA,CAEpB4mB,OAAQA,IAAAlmB,EAAAA,YAAA,IAAA,CAAA,MAAgBsnB,GAAO,IAAA,EAC/BjoB,QAASA,IAAMmV,EAAQlV,MAAMkN,IAAK4F,GAAMya,GAAkBza,CAAC,CAAC,EAAC,CAMzE,CACF,CAAC,qCCpzBGub,GAAiB,CACrB,QAAQ9uB,EAAgB,OACtBA,EAAI,WAAUwB,EAAAutB,GAAS,OAAT,KAAAvtB,EAAiB,WAAYutB,EAAQ,CACrD,CACF,ECUQ,CAAEvvB,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,QAAQ,0BACR,CAC7BW,KAAM,WACNC,MAAO,CACLK,MAAO,CACLH,KAAM,CAACO,QAASH,OAAQH,MAAM,EAC9BiR,SAAU,GACVhR,QAAS4Q,QAEXxD,SAAU,CACRtN,KAAMO,QACN2Q,SAAU,GACVhR,QAAS4Q,QAEX4d,UAAW,CACT1uB,KAAMC,OACNiR,SAAU,GACVhR,QAAS4Q,QAEXsQ,OAAQ,CACNphB,KAAM,CAACI,OAAQH,MAAM,EACrB0uB,QAAS,GACTzuB,QAAS,QACX,GAIF+N,MAAO,CAAC,QAAQ,EAChBtN,MAAMb,EAAO,CAAEoO,KAAAA,CAAK,EAAG,CAErB,MAAM5M,EAAMqL,EAAAA,IAAI7M,EAAMK,KAAK,EACrByuB,EAAajiB,EAAAA,IAAI,EAAI,EAG3Be,EAAAA,MACE,IAAM5N,EAAMK,MACXkW,GAAW,CACV/U,EAAInB,MAAQkW,EACZuY,EAAWzuB,MAAQmB,EAAInB,QAAUL,EAAMshB,MACzC,CACF,EACA1T,EAAAA,MACE,IAAMkhB,EAAWzuB,MAChBkW,GAAW,CACV/U,EAAInB,KACN,CACF,EAGA,MAAMmW,EAAgBuY,GAAc,CAClC3gB,EAAK,SAAU2gB,EAAWvtB,EAAInB,KAAK,CACrC,EAGAyuB,OAAAA,EAAWzuB,MAAQmB,EAAInB,QAAUL,EAAMshB,OAGhC,IAAAvgB,EAAAA,YAAAiuB,WAAA,CAAA,IAAA,YAAA,WAGMF,EAAWzuB,MAAK,sBAAA8W,GAAhB2X,EAAWzuB,MAAK8W,EAAA,IACpBnX,EAAM4uB,UAAS,SACV5uB,EAAMwN,SAAQ,SAGdgJ,EAAY,MACfjX,IAAS,IAAA,CAGtB,CACF,CAAC,qCCrFG0vB,GAAiB,CACrB,QAAQrvB,EAAgB,OACtBA,EAAI,WAAUwB,EAAA8tB,GAAS,OAAT,KAAA9tB,EAAiB,WAAY8tB,EAAQ,CACrD,CACF,ECaQ,CAAE9vB,aAAAA,EAAa,EAAIE,YAAQ,EAC3BC,GAAYH,GAAa,YAAY,0BAEZ,CAC7BW,KAAM,eACNC,MAAO,CACLC,KAAM,CACJC,KAAMC,OACNC,QAAS,IAEXL,KAAM,CACJG,KAAMC,OACNC,QAAS4Q,QAEXvH,GAAI,CACFvJ,KAAMC,OACNC,QAAS4Q,QAEXwJ,WAAY,CACVta,KAAM,CAACua,KAAMjI,MAAOrS,MAAM,EAC1BC,QAAS4Q,QAEXmV,SAAU,CACRjmB,KAAMO,QACNL,QAAS,IAEXoN,SAAU,CACRtN,KAAMO,QACNL,QAAS,IAEX2Q,KAAM,CACJ7Q,KAAMC,OACNC,QAAS,WAEX+uB,QAAS,CACPjvB,KAAMO,QACNL,QAAS,IAEXgvB,cAAe,CACblvB,KAAMsS,MACNpS,QAASA,IAAM,CAAA,GAEjBivB,gBAAiB,CACfnvB,KAAMsS,MACNpS,QAASA,IAAM,CAAA,GAEjBkvB,gBAAiB,CACfpvB,KAAMsS,MACNpS,QAASA,IAAM,CAAA,GAEjBya,eAAgB,CACd3a,KAAMC,OACNC,QAAS,KAEXsa,OAAQ,CACNxa,KAAMC,OACNC,QAAS,SAEXua,YAAa,CACXza,KAAMC,OACNC,QAAS,SAEXoV,YAAa,CACXtV,KAAMC,OACNC,QAAS,SAEX0a,iBAAkB,CAChB5a,KAAMC,OACNC,QAAS,IAEX2a,eAAgB,CACd7a,KAAMC,OACNC,QAAS,IAEX8a,SAAU,CACRhb,KAAMO,QACNL,QAAS,IAEXqV,UAAW,CACTvV,KAAMO,QACNL,QAAS,EACX,GAGF+N,MAAO,CAAC,oBAAqB,SAAU,OAAQ,OAAO,EAEtDtN,MAAMb,EAAO,CAAEoO,KAAAA,CAAK,EAAG,CAErB,KAAM,CAAEzB,EAAAA,GAAMzN,GAAa,EACrByS,EAAaC,EAAAA,gBAAgB,MAAM,EACnCsE,EAAarJ,EAAAA,IAAqB7M,EAAMwa,UAAU,EAClD+U,EAAiBvnB,EAAAA,SAAoC,IAAA,OAAOhI,OAAAA,EAAAA,EAAM+Q,OAAN/Q,KAAAA,EAAcqN,EAAAA,MAAMsE,CAAU,EAAmB,EAGnH/D,EAAAA,MACE,IAAM5N,EAAMwa,WACXjE,GAAW,CACVL,EAAW7V,MAAQkW,CACrB,CACF,EASA,MAAMqB,EAAgBvX,GAA2B,CAC/C6V,EAAW7V,MAAQA,EACnB+N,EAAK,oBAAqB/N,CAAK,CACjC,EAOMmvB,EAAsBA,IAAMxvB,EAAMovB,cAOlCK,EAAwBA,IAAMzvB,EAAMqvB,gBAOpCK,EAAwBA,IAAM1vB,EAAMsvB,gBAOpC9Y,EAAgBnW,GAA2B,CAC/C+N,EAAK,SAAU/N,CAAK,CACtB,EAOMoW,EAAcxT,GAAkB,CACpCmL,EAAK,OAAQnL,CAAC,CAChB,EAOM8Y,EAAe9Y,GAAkB,CACrCmL,EAAK,QAASnL,CAAC,CACjB,EAEMqT,EAAkBtO,EAAAA,SAAS,IAAA,SAAOhI,QAAAA,GAAAA,EAAAA,EAAMyJ,KAANzJ,KAAAA,EAAYA,EAAMD,OAAlBC,KAAAA,EAA0BA,EAAMC,OAAS+Q,OAAS,EAG1F,MAAO,IAAAjQ,EAAAA,YAAA,MAAA,CAAA,MACOxB,EAAS,EAAA,CAAAwB,EAAAA,YAAA4uB,EAAAA,aAAAjnB,aAAA,CAAA,IAEZ1I,EAAMC,MAAQ,gBAAe,GAC9BqW,EAAgBjW,MAAK,KACnBL,EAAMD,KAAI,WACJmW,EAAW7V,MAAK,sBACPuX,EAAY,SACvB5X,EAAMmmB,SAAQ,SACdnmB,EAAMwN,SAAQ,SACdxN,EAAMkb,SAAQ,UACblb,EAAMyV,UAAS,WAChBzV,EAAMmvB,QAAO,kBACNnvB,EAAM6a,eAAc,KAC/B0U,EAAelvB,MAAK,YACbL,EAAMwV,aAAe7I,EAAE,mBAAmB,EAAC,oBACrC3M,EAAM8a,kBAAoBnO,EAAE,kBAAkB,EAAC,kBACjD3M,EAAM+a,gBAAkBpO,EAAE,gBAAgB,EAAC,OACpD3M,EAAM0a,OAAM,eACN1a,EAAM2a,YAAW,iBACf6U,EAAmB,mBACjBC,EAAqB,mBACrBC,CAAqB,EAAA,CAErCnT,SAAU/F,EACV6F,OAAQ5F,EACR6F,QAASP,EAAW,EAAA,IAAA,CAAA,CAAA,CAK9B,CACF,CAAC,qCCrNG6T,GAAqB,CACzB,QAAQhwB,EAAgB,OACtBA,EAAI,WAAUwB,EAAAyuB,GAAa,OAAb,KAAAzuB,EAAqB,eAAgByuB,EAAY,CACjE,CACF,ECKMC,GAAU,CACd,MAAQlgB,GAAiB,CACvB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,UACxBA,EAAO,2BACLA,CACT,EACA,OAASngB,GAAiB,CACxB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,UACxBA,EAAO,uBACLA,CACT,EACA,QAAS,CAACngB,EAAcvJ,IAAgB,CACtC,IAAI0pB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,cAAgB1pB,EAAM,KAC9C0pB,EAAO,iDAAmD1pB,EAAM,IAC9D0pB,CACT,EACA,OAASngB,GAAiB,CACxB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,WACxBA,EAAO,iCACLA,CACT,EACA,OAAQ,CAACngB,EAAcvJ,IAAgB,CACrC,IAAI0pB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,QAAU,KAAK,MAAM1pB,EAAM,CAAC,EAAI,QAAUA,EAAM,OACxE0pB,EAAO,kBAAoB1pB,EAAM,cAC/B0pB,CACT,EACA,MAAQngB,GAAiB,CACvB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,kBACxBA,EAAO,kEACLA,CACT,EACA,SAAU,CAACngB,EAAcvJ,IAAgB,CACvC,IAAI0pB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,aAAe1pB,EAAM,OACtC,uCAAyCA,EAC9C0pB,CACT,EACA,OAASngB,GAAiB,CACxB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,cACxBA,EAAO,iDACLA,CACT,EACA,OAASngB,GAAiB,CACxB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,WACxBA,EAAO,iCACLA,CACT,EACA,QAAUngB,GAAiB,CACzB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,kBACxBA,EAAO,sEACLA,CACT,EAEA,aAAengB,GAAiB,CAC9B,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,kBACxBA,EAAO,6CACLA,CACT,EAEA,KAAOngB,GAAiB,CACtB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,yBACxBA,EAAO,+DACLA,CACT,EACA,MAAQngB,GAAiB,CACvB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,aACxBA,EAAO,+BACLA,CACT,EACA,MAAQngB,GAAiB,CACvB,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,WACxBA,EAAO,gCACLA,CACT,EACA,UAAYngB,GAAiB,CAC3B,IAAImgB,EAAO,GACX,OAAIngB,IAAS,QAASmgB,EAAO,kCACxBA,EAAO,mCACLA,CACT,EACA,GAAKngB,GAAiB,C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"}
|