guava-ui 0.1.5 → 0.1.7
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 +3 -0
- package/lib/guava-ui.es.js +279 -281
- 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/package.json +1 -1
package/lib/guava-ui.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guava-ui.es.js","sources":["../packages/GvBacktop/src/GvBacktop.vue","../packages/GvBacktop/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/GvCascader/src/GvCascader.vue","../packages/GvCascader/index.ts","../packages/GvCol/src/GvCol.vue","../packages/GvCol/index.ts","../packages/GvRow/src/GvRow.vue","../packages/GvRow/index.ts","../packages/GvSwitch/src/GvSwitch.vue","../packages/GvSwitch/index.ts","../packages/bridge/index.ts","../packages/GvDatePicker/src/datetime.ts","../packages/GvDatePicker/src/shortcuts.ts","../packages/GvDatePicker/src/GvDatePicker.vue","../packages/GvDatePicker/index.ts","../packages/GvDivider/src/GvDivider.vue","../packages/GvDivider/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/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/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/GvTagsView/src/GvTagsView.vue","../packages/GvTagsView/index.ts","../packages/GvTheme/src/GvTheme.vue","../packages/GvTheme/index.ts","../packages/hooks/service/useCrud.ts","../packages/utils/gv.secret.ts","../packages/index.ts"],"sourcesContent":["<!--\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: 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-05-08 14:24:54\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/**\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} elm\n * @param {string} cls\n * @returns {boolean}\n */\nexport const hasClass = function (ele, cls) {\n return !!ele.className.match(new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)'));\n};\n\n/**\n * Add class to element\n * @param {HTMLElement} elm\n * @param {string} cls\n */\nexport const addClass = function (ele, cls) {\n if (!hasClass(ele, cls)) ele.className += ' ' + cls;\n};\n\n/**\n * Remove class from element\n * @param {HTMLElement} elm\n * @param {string} cls\n */\nexport const removeClass = function (ele, cls) {\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 function 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: 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// ------ 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 (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\nexport const isUrl = (path: string): boolean => {\n try {\n new URL(path);\n return true;\n } catch {\n return false;\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-08 16:04:38\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 { 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', // svg | iconfont\n className: '',\n },\n );\n // @computed\n const isLocal = computed(() => isExternal(props.iconName));\n\n const iconName = computed(() => {\n if (props.iconType === 'svg') return `#${preNameSpace}-icon-${props.iconName}`;\n else if (props.iconType === 'iconfont') return 'iconfont ' + props.iconName;\n else if (props.iconType === 'el') return props.iconName;\n else return `#${props.iconName}`;\n });\n\n // @method\n const svgClass = computed(() => {\n if (props.className)\n if (props.iconType === 'svg') return 'svg-icon ' + props.className;\n else return props.className;\n else return 'svg-icon';\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 if (props.iconType !== 'el') return null;\n const name = props.iconName;\n const compName = name.charAt(0).toUpperCase() + name.slice(1);\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 v-else-if=\"iconComponent\">\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 { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\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 } = useI18n();\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-07 08:49:39\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 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 /** 弹窗标题 */\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 /**\n *@todo: 点击确认按钮\n *@author: bugcao\n *@date: 2026-05-06 14:41:53\n *@version: v1.0.1\n */\n const handleConfirm = (event: MouseEvent) => {\n emit('confirm', event, instance?.proxy);\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}-input';\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-06 17:54: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\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;\nconst { getStorage } = useStorage('localStorage');\nconst lang = getStorage('lang');\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 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 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-05-08 17:06:01\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 { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { GvIcon } from '@@/GvIcon';\n import { GvPopconfirm } from '@@/GvPopconfirm';\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 /** 是否可见 */\n visible: {\n type: Boolean,\n default: true,\n },\n /** 权限相关 */\n text: {\n type: String,\n default: '',\n },\n otext: {\n type: String,\n default: '',\n },\n /** 按钮大小 */\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n /** 按钮类型 */\n type: {\n type: String as PropType<ButtonType>,\n default: 'default',\n },\n /** 是否加载中 */\n loading: {\n type: Boolean,\n default: false,\n },\n /** 是否禁用 */\n disabled: {\n type: [Boolean, String] as PropType<boolean | string>,\n default: false,\n },\n /**\n * @todo 关联表单\n * @param {string} refForm - 关联表单的ref\n * @default undefined\n * @type {string}\n * @use btnRef.value?.dataset?.refForm\n */\n refForm: {\n type: String,\n required: false,\n default: undefined,\n },\n /** 图标 */\n icon: {\n // type: [String, Object] as PropType<string | DefineComponent>,\n type: String,\n default: '',\n },\n /** 原生按钮类型 */\n nativeType: {\n type: String,\n default: 'button',\n },\n /** 业务类型 */\n bizType: {\n type: String as PropType<BizType>,\n default: undefined,\n },\n /** 业务参数 */\n args: {\n type: String,\n default: undefined,\n },\n /** 是否确认 */\n confirm: {\n type: [Boolean, String],\n default: false,\n },\n /** 权限相关 */\n perms: {\n type: String,\n default: undefined,\n },\n /** 点击事件 */\n cb: {\n type: Function as PropType<(args?: any) => void>,\n default: () => {},\n },\n },\n /** Emit 事件 */\n emits: ['click', 'confirm'],\n\n setup(props, { emit, slots }) {\n const { t } = useI18n();\n const route = useRoute();\n const appStore = useAppStore();\n const instance = getCurrentInstance();\n const globalSize = useGlobalConfig('size');\n /** ===== 按钮大小 ===== */\n const buttonSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n /** ===== 按钮是否为确认 ===== */\n const buttonConfirm = computed(() => appStore.buttonConfirm);\n /** ===== 加载中 ===== */\n const loadings = ref(props.loading);\n /** ===== 点击锁定 ===== */\n const locked = ref(false);\n /** ===== 是否可见处理 ===== */\n const isShow = ref(props.visible);\n const isIf = ref(true);\n /** ===== 按钮插槽 ===== */\n const getSlots = computed(() => props.text || slots.default?.());\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 *@todo: 图标处理\n *@author: bugcao\n *@date: 2026-05-06 12:56:13\n *@version: v0.0.1\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 className={props.icon}\n />\n );\n else if (props.icon.startsWith('iconfont'))\n return (\n <GvIcon\n iconType=\"iconfont\"\n iconName={props.icon}\n className={props.icon}\n />\n );\n else\n return (\n <GvIcon\n iconName={props.icon}\n className={props.icon}\n />\n );\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 *@todo: 校验按钮权限\n *@author: bugcao\n *@date: 2026-05-06 12:55:52\n *@version: v0.0.1\n */\n const checkPerms = () => {\n const meta = route.meta as { pm?: string };\n if (!meta?.pm) return;\n let filter = props.text || '';\n if (props.otext) filter = props.otext;\n if (!filter) {\n const slot = slots.default?.();\n if (slot?.length) {\n const first = slot[0];\n if (typeof first.children === 'string') filter = first.children;\n }\n }\n if (!filter) return;\n const pmArr = meta.pm.split(',');\n const perms = pmArr.filter((x) => x.includes(filter));\n if (!perms.length) return;\n const [name, flag] = perms[0].split('|');\n if (name !== ' ' && flag === 'f') {\n isShow.value = false;\n isIf.value = false;\n }\n };\n /**\n * @todo: click handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 17:03:50\n * @param {*} e\n * @param {*} type\n */\n const handleClick = async (e: MouseEvent, type?: string) => {\n // ===== 重置按钮点击逻辑 =====\n if (props.bizType === 'reset') {\n let parent: any = instance?.proxy?.$parent;\n while (parent && parent.$?.type?.name !== 'ElForm') parent = parent.$parent;\n await parent?.resetFields?.();\n const originFormList = parent?.$parent?.originFormList;\n const formList = parent?.$parent?.formList;\n if (originFormList && Array.isArray(originFormList))\n originFormList.forEach((x: any, index: number) => {\n if (x.type === 'dic') formList[index]['filtercode'] = x.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 if (x.dateType === 'daterange2' || x.dateType === 'datetimerange2') {\n parent.model[x.field + '-start'] = undefined;\n parent.model[x.field + '-end'] = undefined;\n parent.model[x.field] = undefined;\n }\n });\n props.cb?.(props.args);\n loadings.value = true;\n await parent?.$el?.querySelector('.gv-search__bar .el-button--primary')?.click();\n loadings.value = false;\n return;\n }\n // ===== 导入导出按钮点击逻辑 =====\n if (props.bizType === 'import' || props.bizType === 'export') {\n emit('click', e, props.args);\n return;\n }\n // ===== loading开启 =====\n loadings.value = true;\n if (type === 'confirm')\n if (buttonConfirm.value === false)\n try {\n await confirm(t('common.confirm')).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 // @created\n checkPerms();\n\n // @render\n /** ===== render 渲染 ===== */\n return () => {\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}\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}\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}\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: 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-05-08 15:12:30\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 { ElCascader, useGlobalConfig, type CascaderOption, 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('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 } = useI18n();\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","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: 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-08 10:07:56\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 lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCol } from 'element-plus';\n import { defineComponent, useAttrs, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('col');\n\n export default defineComponent({\n name: 'GvCol',\n inheritAttrs: false,\n\n props: {\n /** 栅格占据列数 */\n span: {\n type: Number,\n default: 24,\n },\n /** 栅格左侧间隔格数 */\n offset: {\n type: Number,\n default: 0,\n },\n /** <768px */\n xs: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n /** ≥768px */\n sm: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n /** ≥992px */\n md: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n /** ≥1200px */\n lg: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n /** ≥1920px */\n xl: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n /** 标签类型 */\n tag: {\n type: String,\n default: 'div',\n },\n /** 是否显示 */\n visible: {\n type: Boolean,\n default: true,\n },\n },\n setup(props, { slots }) {\n const attrs = useAttrs();\n return () => (\n <ElCol\n {...attrs}\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 * @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-08 10:09:09\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 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 /** 栅格间隔 */\n gutter: {\n type: Number,\n default: 0,\n },\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: 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-07 13:49:46\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 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","// 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 * 日期工具函数(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: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 08:51:54\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-07 15:28:33\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\ninterface PickerLike {\n $emit: (event: 'pick', value: any) => void;\n value?: any;\n}\n\nexport interface ShortcutItem {\n text: string;\n onClick: (picker: PickerLike) => void;\n}\n\nconst now = () => new Date();\n\nexport const dateShortcuts: ShortcutItem[] = [\n {\n text: '今天',\n onClick(picker) {\n picker.$emit('pick', now());\n },\n },\n {\n text: '昨天',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 1));\n },\n },\n {\n text: '最近一周',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 7));\n },\n },\n {\n text: '最近30天',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 30));\n },\n },\n {\n text: '本月开始',\n onClick(picker) {\n picker.$emit('pick', monthBegin(now()));\n },\n },\n {\n text: '本季开始',\n onClick(picker) {\n picker.$emit('pick', quarterBegin(now()));\n },\n },\n];\n\nexport const dateShortcutsEn: ShortcutItem[] = [\n {\n text: 'Today',\n onClick(picker) {\n picker.$emit('pick', now());\n },\n },\n {\n text: 'Yesterday',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 1));\n },\n },\n {\n text: 'Last week',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 7));\n },\n },\n {\n text: 'Last 30 days',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 30));\n },\n },\n {\n text: 'Month start',\n onClick(picker) {\n picker.$emit('pick', monthBegin(now()));\n },\n },\n {\n text: 'Season Start',\n onClick(picker) {\n picker.$emit('pick', quarterBegin(now()));\n },\n },\n];\n\nexport const dateTimeShortcuts = dateShortcuts.slice(0, 3);\n\nexport const dateTimeShortcutsEn = dateShortcutsEn.slice(0, 3);\n\nexport const dateRangeShortcuts: ShortcutItem[] = [\n {\n text: '最近一周',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: '最近30天',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: '本月至今',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: '本季至今',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: '今年至今',\n onClick(picker) {\n picker.$emit('pick', [yearBegin(now()), now()]);\n },\n },\n {\n text: '最近六个月',\n onClick(picker) {\n const end = now();\n const start = new Date();\n start.setMonth(start.getMonth() - 6);\n\n picker.$emit('pick', [start, end]);\n },\n },\n];\n\nexport const dateRangeShortcutsEn: ShortcutItem[] = [\n {\n text: 'Last week',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: 'Last 30 days',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: 'Month date',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: 'Season date',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: 'Year date',\n onClick(picker) {\n picker.$emit('pick', [yearBegin(now()), now()]);\n },\n },\n {\n text: 'Last 6 mon',\n onClick(picker) {\n const end = now();\n const start = new Date();\n start.setMonth(start.getMonth() - 6);\n\n picker.$emit('pick', [start, end]);\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-07 15:42:56\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 { ElDatePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, useAttrs, 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 /** 禁止自动把父组件属性加到子组件根节点 */\n inheritAttrs: false,\n\n props: {\n /** 组件 ref */\n vref: {\n type: String,\n default: '',\n },\n /** 组件 modelValue */\n modelValue: {\n type: [Date, String, Array] as PropType<TDatePickerType>,\n default: undefined,\n },\n /** 组件类型,支持element-plus的type属性 */\n type: {\n type: String,\n default: 'date',\n },\n /** 显示在输入框中的格式 */\n format: {\n type: String,\n default: 'YYYY-MM-DD',\n },\n /** 指定绑定值的格式 */\n valueFormat: {\n type: String,\n default: 'YYYY-MM-DD',\n },\n /** 默认时间 */\n defaultTime: {\n type: Array as PropType<Date[]>,\n default: undefined,\n },\n /** 组件大小 */\n size: {\n type: String as PropType<TDatePickerSize>,\n default: 'small',\n },\n /** 日期范围分隔符 */\n rangeSeparator: {\n type: String,\n default: undefined,\n },\n /** 开始日期占位符 */\n startPlaceholder: {\n type: String,\n default: undefined,\n },\n /** 结束日期占位符 */\n endPlaceholder: {\n type: String,\n default: undefined,\n },\n /** 占位符 */\n placeholder: {\n type: String,\n default: undefined,\n },\n /** 是否可清除 */\n clearable: {\n type: Boolean,\n default: true,\n },\n /** 是否禁用 */\n disabled: {\n type: Boolean,\n default: false,\n },\n /** 禁用日期函数 */\n disabledDateFunc: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n /** 禁用日期 */\n disabledDate: {\n type: Function as PropType<(date: Date) => boolean>,\n default: undefined,\n },\n /** 是否可编辑 */\n editable: {\n type: Boolean,\n default: true,\n },\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 const { locale, t } = useI18n();\n const attrs = useAttrs();\n const globalSize = useGlobalConfig('size');\n /** 输入框值 */\n const inputValue = ref(props.modelValue);\n /** 日期选择器大小 */\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 /** 监听 modelValue 变化 */\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\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 /** 更新值 */\n const handleUpdate = (value: TDatePickerType) => {\n emit('update:modelValue', value);\n };\n /** 变化时触发 */\n const handleChange = (value: TDatePickerType) => {\n emit('change', value);\n };\n /** 失去时触发 */\n const handleBlur = (e: FocusEvent) => {\n emit('blur', e);\n };\n /** 获得焦点时触发 */\n const handleFocus = (e: FocusEvent) => {\n emit('focus', e);\n };\n /** 日期选择器变化时触发,range类型下触发 */\n const handleCalendarChange = (value: any) => {\n emit('pick', value);\n };\n const DatePicker = ElDatePicker as typeof ElDatePicker & DefineComponent<TDatePickerEmits>;\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 {...attrs}\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: 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-05-08 11:13:47\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 { 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: ['setShow'],\n props: {\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 // method\n // method\n /**\n * @todo: click divider\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:33:05\n * @param {*} event\n */\n const handleClick = (event: MouseEvent | TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!props.target) return false;\n\n const el = document.querySelector(`#${props.target}`) as HTMLElement | null;\n if (!el) return;\n const isHidden = el.style.display === 'none';\n // 动画效果\n emit('setShow', isHidden);\n\n // 非动画效果\n // if (target && target.$el)\n // if (target.$el.style.display === 'none')\n // target.$el.style.display = '';\n // else\n // target.$el.style.display = 'none';\n };\n\n return () => (\n <div\n class={prefixCls}\n onClick={(event) => handleClick(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","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-05-08 15:10:06\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 { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\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 /** 输入框组件 */\n export default defineComponent({\n name: 'GvInput',\n // ------ define props ------\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n // 输入框值\n modelValue: {\n type: [String, Number] as PropType<string | number>,\n default: '',\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n prefixIcon: {\n type: String,\n default: '',\n },\n suffixIcon: {\n type: String,\n default: '',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n maxlength: {\n type: Number,\n default: 30,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n readonly: {\n type: Boolean,\n default: false,\n },\n showWordLimit: {\n type: Boolean,\n default: true,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n type: {\n type: String as PropType<InputType>,\n default: 'text',\n },\n rows: {\n type: Number,\n default: 2,\n },\n autosize: {\n type: [Boolean, Object] as PropType<boolean | Record<string, any>>,\n default: false,\n },\n bizType: {\n type: String as PropType<BizType>,\n default: 'tableedit',\n },\n modelModifiers: {\n type: Object as PropType<Record<string, unknown>>,\n default: () => ({}),\n },\n },\n // ------ define emits ------\n /**\n * @todo 输入框事件定义\n * @typedef {Object} GvInputEmits\n * @property {function} update:modelValue - 输入框值改变时触发\n * @property {function} input - 输入框值改变时触发\n * @property {function} blur - 输入框失去焦点时触发\n * @property {function} focus - 输入框获得焦点时触发\n * @property {function} clear - 输入框清空时触发\n * @property {function} keydown - 输入框按下键盘时触发\n */\n emits: ['update:modelValue', 'input', 'blur', 'focus', 'clear', 'keydown'],\n // ------ define setup ------\n setup(props, { emit }) {\n // @data\n const { t } = useI18n();\n /** 输入框大小 */\n const globalSize = useGlobalConfig('size');\n /** 输入框值 */\n const inputValue = ref(props.modelValue);\n\n // @computed\n const inputSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n /** 输入框占位符 */\n const sPlaceholder = computed(() => props.placeholder || t('common.pleaseInput'));\n\n // @watch\n /** 监听modelValue变化 */\n watch(\n () => props.modelValue,\n (newValue) => {\n inputValue.value = newValue;\n },\n );\n\n // @methods\n /**\n * @todo 输入框前缀图标\n * @returns {JSX.Element | null} - 前缀图标节点\n */\n const renderPrefixIcon = (): JSX.Element | null => {\n if (!props.prefixIcon) return null;\n return (\n <GvIcon\n iconName={props.prefixIcon}\n className={props.prefixIcon}\n />\n );\n };\n /**\n * @todo 输入框后缀图标\n * @returns {JSX.Element | null} - 后缀图标节点\n */\n const renderSuffixIcon = (): JSX.Element | null => {\n if (!props.suffixIcon) return null;\n return (\n <GvIcon\n iconName={props.suffixIcon}\n className={props.suffixIcon}\n />\n );\n };\n /**\n * @todo 输入框是否禁用\n * @returns {boolean} - 是否禁用\n * @param {boolean | string} disabled - 是否禁用或禁用字符串 ,默认值为false\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 * @todo 输入框值改变时触发\n * @param {string | number} val - 输入框值\n */\n const handleInput = (val: string | number) => {\n inputValue.value = val;\n emit('update:modelValue', val);\n emit('input', val);\n };\n /**\n * @todo 输入框失去焦点时触发\n * @param {FocusEvent} event - 事件对象\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 * @todo 输入框获得焦点时触发\n * @param {FocusEvent} event - 事件对象\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 * @todo 输入框清空时触发\n * @param {any} event - 事件对象\n */\n const handleClear = (event: any) => {\n emit('clear', event);\n };\n /**\n * @todo 输入框按下键盘时触发\n * @param {KeyboardEvent} event - 事件对象\n */\n const handleKeyDown = (event: KeyboardEvent) => {\n emit('keydown', event);\n };\n\n // @render\n return () => {\n if (!props.visible) return null;\n return (\n <ElInput\n ref={props.vref}\n name={props.name}\n type={props.type}\n v-model={inputValue.value}\n modelModifiers={{ number: true }}\n readonly={props.readonly}\n rows={props.rows}\n autosize={props.autosize}\n size={inputSize.value}\n showWordLimit={props.showWordLimit}\n maxlength={props.maxlength}\n placeholder={sPlaceholder.value}\n disabled={getDisabled.value}\n clearable={props.clearable}\n class={prefixCls}\n style={{ display: props.visible ? '' : 'none' }}\n v-slots={{\n prefix: () => renderPrefixIcon(),\n suffix: () => renderSuffixIcon(),\n }}\n onInput={handleInput}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onClear={handleClear}\n onKeydown={handleKeyDown}\n />\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 }\n\n &.el-input--mini {\n :deep(.el-input__inner) {\n height: 26px;\n line-height: 26px;\n }\n }\n\n :deep(.el-input__suffix .el-input__suffix-inner) {\n .el-input__count {\n .el-input__count-inner {\n padding: 0;\n }\n }\n .el-input__icon {\n padding: 0;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvInput from './src/GvInput.vue';\n\nconst GvInputPlugin = {\n install(app: App): void {\n app.component(GvInput.name ?? 'GvInput', GvInput);\n },\n};\nexport default GvInputPlugin;\n\nexport { GvInput };\n","<!--\n * @title: input number component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:32:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-08 15:10:32\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 { ElInputNumber, 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('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('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 /**\n * @todo: handle update modelValue\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 11:29:17\n * @param {*} value\n */\n const handleUpdate = (value: any): void => {\n inputValue.value = value;\n emit('update:modelValue', value);\n };\n\n // @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}\n modelValue={inputValue.value}\n onUpdate:modelValue={handleUpdate}\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-05-08 15:11:03\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 { useNotify } from '@/hook/web/useNotify';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { debounce } from '@@/utils/index';\n import { ElOption, ElSelect, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, onMounted, ref, unref, watch, type PropType } from 'vue';\n import { useI18n } from 'vue-i18n';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('select');\n export default defineComponent({\n name: 'GvSelect',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n value: {\n type: [String, Number, Boolean, Array, Object] as PropType<string | number | boolean | unknown[] | Record<string, unknown>>,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n showLabel: {\n type: [String, Array],\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined, // 请选择\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n multiple: {\n type: Boolean,\n default: false,\n },\n filterable: {\n type: Boolean,\n default: true,\n },\n dicType: {\n type: String,\n required: true,\n },\n filtercode: {\n // 过滤字典码\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n dicRemote: {\n type: Function,\n default: () => {},\n },\n cb: {\n type: Function,\n default: () => {},\n },\n clear: {\n type: Function,\n default: () => {},\n },\n isreload: {\n type: Boolean,\n default: true,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n bizType: {\n type: String,\n default: undefined,\n },\n editRow: {\n type: Object,\n default: () => {},\n },\n collapseTags: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n },\n // define emit\n emits: ['update:modelValue', 'focus', 'clear', 'change'],\n setup(props, { emit }) {\n const userStore = useUserStore();\n const appStore = useAppStore();\n const { alert } = useNotify();\n const { t, locale } = useI18n();\n\n // @data\n const lang = locale.value;\n let debounceSearch;\n let dicIcon = 'iconfont gv-icon-shujuzidian3';\n const remote = ref(false);\n const loading = ref(false);\n const loadingText = ref('loading...');\n const inputValue = ref(props.value || '');\n const inputShowLabel = ref(props.showLabel);\n const inputFilterable = ref(props.filterable);\n // let inputFilterable = props.filterable,\n const selectValue = ref(props.value);\n const options = ref<DicItem[]>([]);\n const originOptions = ref<DicItem[]>([]);\n const className = ref(`${prefixCls}-select`);\n const globalSize = useGlobalConfig('size');\n // const isTableDic = false; // 是否表选字典\n // @computed\n const selectSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n // @watch value\n watch(\n () => props.value,\n\n (newValue) => {\n inputValue.value = newValue || '';\n selectValue.value = newValue;\n },\n );\n\n // watch showLabel\n watch(\n () => props.showLabel,\n (newVal) => {\n if (inputValue.value) {\n inputShowLabel.value = newVal;\n\n if (inputValue.value !== null && typeof inputValue.value !== 'object')\n selectValue.value = {\n value: inputValue.value,\n\n label: newVal || inputValue.value,\n };\n else selectValue.value = inputValue.value;\n\n const hasOp = options.value.some((x) => {\n if (Array.isArray(inputValue.value))\n return inputValue.value.some((ele: any) => {\n if (typeof ele === 'object') return ele.value + '' === x.c + '';\n else return ele + '' === x.c + '';\n });\n else return x.c + '' === inputValue.value + '';\n });\n\n if (hasOp === false)\n if (!Array.isArray(inputValue.value)) {\n const op: any = {};\n op['c'] = inputValue.value + '';\n op['t'] = newVal;\n options.value.push(op);\n } else\n // 多选\n inputValue.value.forEach((x: any, index: number) => {\n const op: any = {};\n op['c'] = x.value + '';\n if (newVal) op['t'] = newVal[index];\n else op['t'] = x.label;\n options.value.push(op);\n });\n }\n },\n );\n\n // @method\n /**\n * @todo: load dict list\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:31:44\n */\n const getSelectOptions = async () => {\n if (!props.dicType) return null;\n else {\n let ret: DicItem[] = [];\n const src = props.dicType.toLowerCase();\n if (src.startsWith('e#')) {\n // const pinyin = await require('js-pinyin');\n // 生成枚举类型字典\n const arr = src.split('#')[1].split(':');\n arr.forEach((x) => {\n const xx: DicItem = {\n c: '',\n t: '',\n s: '',\n };\n const arr2 = x.split('=');\n xx['c'] = arr2[0];\n xx['t'] = arr2[1];\n xx['s'] = '';\n ret.push(xx);\n });\n return ret;\n } else {\n const dictCache = userStore.dictCache?.[src];\n if (props.filtercode === undefined && dictCache) ret = dictCache;\n else if (props.dicType === 'xzqh') {\n // 生成字典列表\n const dict = appStore.getDictDivision;\n if (dict) {\n if (props.filtercode === undefined) {\n const cache = {};\n cache['key'] = 'xzqh';\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n }\n ret = dict;\n }\n } else {\n const dict = appStore.getDict[src];\n\n if (dict) {\n // fixme: 解决字典缓存不能缓存多个问题 2022-04-13\n if (props.filtercode === undefined) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n }\n\n ret = dict;\n }\n }\n\n // 设置是否可搜索\n // this.setFilterable(ret);\n // 增加字典码过滤\n let opts = ret;\n if (props.filtercode) {\n const reg = new RegExp(props.filtercode, 'i');\n opts = ret.filter((x) => reg.test(x.c));\n }\n return opts;\n }\n }\n };\n /**\n * @todo: 设置字典项目超过5个可搜索-- 弃用\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-10 09:42:19\n * @param {*} dict\n */\n // setFilterable(dict) {\n // if (dict && dict.length > 5)\n // inputFilterable.value = true;\n // },\n // 回调参数:(value: string | number)\n // 字典自定义过滤方法\n const filterMethod = (value) => {\n if (value)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts.filter((item) => {\n // console.log(item);\n if (\n item.c.indexOf(value) !== -1 || // value检索\n item.t.indexOf(value) !== -1 || // label检索\n item.s.indexOf(value.toLowerCase()) !== -1 // 简拼检索\n )\n return true;\n });\n });\n else\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n };\n /**\n * @todo: handle clear event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:27\n * @param {*} event\n */\n const handleClear = (event) => {\n // add: 解决回车选中搜索字典后,清空无法重新加载问题 2022-04-10\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n else options.value = originOptions.value;\n props.clear(selectValue, props.vref, props.dicType);\n emit('clear', event);\n };\n /**\n * @todo: remote dict search method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:20:03\n * @param {*} query\n */\n const remoteDictSearch = async (query?: string): Promise<void> => {\n const sDicType = props.dicType.substring(2); // 去掉T#\n // if (this.options.length === 0) { // 远程查询\n const { datas } = await props.dicRemote(sDicType, query, props.editRow);\n const ops = [];\n try {\n JSON.parse(datas).forEach((x) => {\n const op = {};\n op['c'] = x.c;\n op['t'] = x.t;\n (ops as DicItem[]).push(op as DicItem);\n });\n } catch (e) {\n // throw e\n console.log(e);\n }\n\n options.value = ops;\n if (originOptions.value.length === 0) originOptions.value = ops;\n // }\n };\n /**\n * @todo: table dict remote load method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:11:51\n * @param {*} query\n */\n const remoteMethod = async (query?: string): Promise<void> => {\n loading.value = true;\n // fixme: 如果有初始化默认值,则仍需要查询表选重新查询 2022-07-08\n let defaultValFlag = false;\n if (unref(inputValue)) defaultValFlag = true;\n if (props.isreload === true || options.value.length === 0 || defaultValFlag === true) {\n // 远程查询\n options.value = originOptions.value.filter((x) => {\n // 结果集过滤\n if (x.t) {\n const f = x.t.split(']');\n if (query && f[0].indexOf(query) !== -1) return true;\n }\n if (x.c) if (query && x.c.indexOf(query) !== -1) return true;\n });\n if (options.value.length === 0)\n options.value = options.value.filter((x) => {\n if (x.t) {\n const f = x.t.split(']');\n if (query && f[0].indexOf(query) !== -1) return true;\n }\n if (x.c) if (query && x.c.indexOf(query) !== -1) return true;\n });\n // if (this.options.length === 0)\n await remoteDictSearch(query);\n } else if (query) {\n options.value = originOptions.value.filter((x) => {\n if (x.t) {\n const f = x.t.split(']');\n if (f[0].indexOf(query) !== -1) return true;\n }\n if (x.c) if (x.c.indexOf(query) !== -1) return true;\n });\n if (options.value.length === 0)\n options.value = options.value.filter((x) => {\n if (x.t) {\n const f = x.t.split(']');\n if (f[0].indexOf(query) !== -1) return true;\n }\n if (x.c) if (x.c.indexOf(query) !== -1) return true;\n });\n // if (this.options.length === 0)\n await remoteDictSearch(query);\n } else options.value = originOptions.value;\n if (!query)\n if (options.value.length === 0) {\n loading.value = true;\n loadingText.value = t('common.noData');\n } else {\n loading.value = false;\n loadingText.value = t('common.loading');\n }\n else loading.value = false;\n };\n /**\n * @todo: handle focus event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:35\n * @param {*} event\n */\n const handleFocus = (event: FocusEvent) => {\n // this.inputShowLabel = '';\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n if (remote.value === false)\n if (_opts === undefined || _opts === null || _opts.length === 0) {\n alert('The dict value does not exist', 'warning');\n return false;\n }\n options.value = _opts;\n });\n else if (props.isreload === true || originOptions.value.length === 0)\n // else if (this.isreload === true)\n remoteMethod();\n else if (originOptions.value.length) options.value = originOptions.value;\n emit('focus', event);\n };\n\n /**\n * @todo: handle visible change event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:25:38\n * @param {*} val\n */\n const handleVisibleChange = () => {\n // console.log(val);\n };\n\n const handleBlur = () => {\n // // add: 解决无法重新加载问题 2022-04-10\n // if (this.remote === false)\n // this.getSelectOptions().then((_opts) => {\n // this.options = _opts;\n // });\n // else\n // this.options = this.originOptions;\n };\n\n /**\n * @todo: render select option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:37:58\n * @param {*} x\n */\n const renderSelectOption = (x) => {\n let t = x.t;\n switch (lang) {\n case 'zh':\n t = x.t;\n break;\n case 'en':\n t = x.e;\n break;\n case 'l1':\n t = x.l1;\n break;\n case 'l2':\n t = x.l2;\n break;\n default:\n t = x.t;\n break;\n }\n if (!t) t = x.t;\n return (\n <ElOption\n key={x.c + ''}\n label={t}\n // value={x.c}\n value={{ value: x.c + '', label: t }} // update: 增加字典值和代码的双返回值 2022-04-16\n // value={this.inputShowLabel ? x.c : { value: x.c, label: x.t }} // update: 增加字典值和代码的双返回值 2022-04-16\n >\n <span class=\"ht-select__option--label\">{t}</span>\n <span class=\"ht-select__option--value\">{x.c}</span>\n </ElOption>\n );\n };\n\n /**\n * @todo: render table option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:44:34\n * @param {*} x\n */\n const renderTableOption = (x) => {\n const t = x.t;\n let val = t;\n const columns: string[] = [];\n const row = {};\n let multiColumn = false;\n if (t) {\n if (t.indexOf('[') !== -1) {\n // 多列显示\n multiColumn = true;\n const v1 = t.split('[');\n val = v1[0];\n let mm = v1[1];\n mm = mm.split(']')[0];\n const m2 = mm.split(',');\n for (let i = 0; i < m2.length; i++) {\n const m3 = m2[i];\n const m4 = m3.split(':');\n row[m4[0]] = m4[1];\n columns.push(`<span class=\"gv-select__option--column\">${m4[1] === 'null' ? ' -- ' : m4[1]}</}</span>`);\n }\n }\n if (t.indexOf('{') !== -1) {\n // 隐藏列\n const vv1 = t.split('{');\n if (multiColumn === false) val = vv1[0];\n let mmm = vv1[1];\n mmm = mmm.split('}')[0];\n const mm2 = mmm.split(',');\n for (let i = 0; i < mm2.length; i++) {\n const mm3 = mm2[i];\n const mm4 = mm3.split(':');\n row[mm4[0]] = mm4[1];\n }\n }\n }\n let key = x.c + '';\n if (props.multiple === true) key = x.val === undefined ? x.c + '' : x.val;\n // let dv = x.c;\n // if (typeof this.inputValue === 'object')\n // dv = { value: x.c, label: val, row: row };\n // else if (this.showLabel === undefined || this.showLabel === '')\n // if (this.bizType !== 'tableedit')\n // dv = { value: x.c, label: val, row: row };\n return (\n <ElOption\n // key = {x.c}\n key={key}\n label={val}\n // value = {dv}\n // value={this.showLabel ? dv : { value: x.c, label: val, row: row }}\n value={{ value: x.c + '', label: val, row: row }}>\n <span class=\"ht-select__option--label\">{val}</span>\n <span class=\"ht-select__option--value\">{x.c}</span>\n {columns}\n </ElOption>\n );\n };\n\n /**\n * @todo: selected call back\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:27:07\n * @param {*} val\n */\n const handleChange = async (val: any) => {\n // if (typeof val === 'object')\n // this.inputLabel = val.label;\n // fixme: 解决清空后调用回调方法报错问题 2022-07-26\n let labels: string = '';\n const labelArr: string[] = [];\n if (val !== '') {\n if (props.multiple === true)\n // 多选\n options.value.forEach((x) => {\n if (Array.isArray(val) && val.some((ele) => ele === x.c)) labelArr.push(x.t);\n });\n else if (val !== null && typeof val === 'object') labels = val.label;\n else {\n const opArr = options.value.filter((x) => {\n const v = val + '';\n return x.c + '' === v;\n });\n labels = opArr[0].t;\n if (labels) labels = labels.split('[')[0];\n }\n if (props.bizType === 'tableedit')\n if (props.multiple === true) {\n emit('change', val, labelArr, props.columnProp);\n await props.cb(val, props.columnProp, props.dicType, labelArr, props.editRow);\n } else {\n emit('change', val, labels, props.columnProp);\n await props.cb(val, props.columnProp, props.dicType, labels, props.editRow);\n }\n else if (props.multiple === true) {\n emit('change', val, labelArr);\n await props.cb(val, props.vref, props.dicType);\n } else {\n emit('change', val, labels);\n await props.cb(val, props.vref, props.dicType);\n }\n }\n };\n /**\n * @todo: handle update modelValue\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 11:29:17\n * @param {*} value\n */\n const handleUpdate = (value: any): void => {\n inputValue.value = value;\n emit('update:modelValue', value);\n };\n\n // created\n // if (props.dicType.startsWith('t#')) isTableDic = true;\n if (remote.value === true) className.value = 'gv-select__table';\n if (props.bizType === 'tableedit') className.value += ' tableedit';\n\n // 不采用初始化时全部加载方式,有默认值情况单独生成\n if (inputValue.value)\n if (!Array.isArray(inputValue)) {\n const op = {};\n op['c'] = inputValue.value + '';\n op['t'] = props.showLabel || inputValue;\n if (inputValue.value !== null && typeof inputValue.value !== 'object') selectValue.value = { value: inputValue.value + '', label: props.showLabel || inputValue.value + '' };\n else selectValue.value = inputValue.value;\n options.value.push(op as DicItem);\n } else {\n // 多选模式\n selectValue.value = [];\n (inputValue.value as unknown[]).forEach((x, index) => {\n if (x !== '') {\n const op = {};\n if (typeof x === 'object' && x !== null && 'value' in x) op['c'] = (x as { value: string }).value + '';\n else op['c'] = x + '';\n if (props.showLabel) op['t'] = props.showLabel[index];\n // fixme: 解决多选字典默认值不正确问题 2022-10-12\n if (selectValue.value && Array.isArray(selectValue.value)) selectValue.value.push({ value: op['c'] + '', label: op['t'] || op['c'] });\n options.value.push(op as DicItem);\n }\n // if (this.bizType === 'tableedit')\n // console.log(this.options);\n });\n }\n\n // mounted\n onMounted(() => {\n // 防抖处理\n debounceSearch = debounce(remoteMethod, 500);\n // add: 设置字典icon 2022-04-12\n if (props.dicType === undefined || props.dicType === null) {\n alert(`[ ${props.label} ] - The dicType needs to be set`, 'warning');\n return;\n } else {\n const src = props.dicType.toLowerCase();\n if (src.startsWith('e#')) dicIcon = 'iconfont gv-icon-meiju';\n else if (src.startsWith('t#')) {\n dicIcon = 'iconfont gv-icon-24gl-table';\n remote.value = true;\n }\n }\n });\n\n // render\n return () => {\n // console.log(props.visible);\n const render =\n remote.value === false ? (\n <ElSelect\n ref=\"gv-select\"\n name={props.name}\n v-model={selectValue.value}\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={props.placeholder}\n disabled={props.disabled}\n clearable={props.clearable}\n size={selectSize.value}\n multiple={props.multiple}\n filterable={inputFilterable.value}\n filter-method={filterMethod}\n default-first-option={true}\n collapseTags={props.collapseTags}\n onClear={handleClear}\n onFocus={handleFocus}\n onVisible-change={handleVisibleChange}\n onChange={handleChange}\n class={className.value}>\n <i\n v-slots={{ prefix: () => <i class={dicIcon}></i> }}\n class={dicIcon}></i>\n {options.value.map((x) => renderSelectOption(x))}\n </ElSelect>\n ) : (\n <ElSelect\n ref=\"gv-select\"\n name={props.name}\n v-model={selectValue.value}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={props.placeholder}\n disabled={props.disabled}\n clearable={props.clearable}\n multiple={props.multiple}\n default-first-option={true}\n onClear={handleClear}\n collapseTags={props.collapseTags}\n onFocus={handleFocus}\n onBlur={handleBlur}\n filterable={inputFilterable.value}\n remote={true}\n remote-method={(query) => debounceSearch(query)}\n loading={loading.value}\n loading-text={loadingText}\n onChange={handleChange}\n class={className.value}>\n <i\n v-slots={{ prefix: () => <i class={dicIcon}></i> }}\n class={dicIcon}></i>\n {options.value.map((x) => renderTableOption(x))}\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-input) {\n &.is-focus {\n .el-input__inner {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n .el-input__prefix {\n left: 5px !important;\n width: 25px !important;\n\n .iconfont {\n font-size: $appTextSize;\n }\n }\n\n .el-input__inner {\n height: 30px;\n line-height: 30px;\n }\n }\n\n &.tableedit {\n :deep(.el-input) {\n .el-input__inner {\n height: 26px;\n padding-right: 5px !important;\n font-size: $appTextSize;\n line-height: 26px;\n }\n\n .el-input__suffix {\n width: 0;\n }\n }\n }\n }\n\n .#{$gvNamespace}-select__table {\n vertical-align: middle; // fixme: 注意必须有这个参数,否则作为一行最后的列会导致串行\n :deep(.el-input) {\n .el-input__prefix {\n left: 5px !important;\n width: 25px !important;\n\n .iconfont {\n font-size: $appTextSize;\n }\n }\n\n .el-input__inner {\n height: 30px;\n line-height: 30px;\n }\n\n &.is-focus .el-input__inner {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n &.tableedit {\n :deep(.el-input) {\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\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: 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-05-08 10:10:26\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 lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElTimePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { DefineComponent, PropType } from 'vue';\n import { computed, defineComponent, ref, unref, useAttrs, watch } from 'vue';\n import { useI18n } from 'vue-i18n';\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 inheritAttrs: false,\n\n props: {\n /** ref名称 */\n vref: {\n type: String,\n default: '',\n },\n /** name */\n name: {\n type: String,\n default: undefined,\n },\n /** v-model */\n modelValue: {\n type: [Date, Array, String] as PropType<TTimePickerType>,\n default: undefined,\n },\n /** 只读 */\n readonly: {\n type: Boolean,\n default: false,\n },\n /** 禁用 */\n disabled: {\n type: Boolean,\n default: false,\n },\n /** 尺寸 */\n size: {\n type: String as PropType<TTimePickerSize>,\n default: 'small',\n },\n /** 是否范围 */\n isRange: {\n type: Boolean,\n default: false,\n },\n /** 禁用小时 */\n disabledHours: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n /** 禁用分钟 */\n disabledMinutes: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n /** 禁用秒 */\n disabledSeconds: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n /** 范围分隔符 */\n rangeSeparator: {\n type: String,\n default: '-',\n },\n /** 展示格式 */\n format: {\n type: String,\n default: 'HH:mm',\n },\n /** 值格式 */\n valueFormat: {\n type: String,\n default: 'HH:mm',\n },\n /** 占位符 */\n placeholder: {\n type: String,\n default: '00:00',\n },\n /** 开始占位符 */\n startPlaceholder: {\n type: String,\n default: '',\n },\n /** 结束占位符 */\n endPlaceholder: {\n type: String,\n default: '',\n },\n /** 是否可编辑 */\n editable: {\n type: Boolean,\n default: true,\n },\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 const { t } = useI18n();\n const attrs = useAttrs();\n const globalSize = useGlobalConfig('size');\n /** v-model内部值 */\n const inputValue = ref<TTimePickerType>(props.modelValue);\n /** 日期选择器大小 */\n const timepickerSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n /** 同步外部值 */\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\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 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 {...attrs}\n />\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-timepicker';\n .#{$prefixCls} {\n width: 100%;\n vertical-align: middle;\n :deep(.el-icon-time) {\n margin-left: 1px;\n }\n &.el-range-editor.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n :deep(.el-input__wrapper) {\n &:is(.is-focus) {\n box-shadow: 0 0 0 1px var(--primaryColorHover, $primaryColorHover) inset;\n }\n }\n :deep(.el-input__inner) {\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n :deep(.el-range__close-icon) {\n width: 20px;\n }\n :deep(.el-range-separator) {\n padding-right: 2px;\n padding-left: 0;\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTimePicker from './src/GvTimePicker.vue';\n\nconst GvTimePickerPlugin = {\n install(app: App): void {\n app.component(GvTimePicker.name ?? 'GvTimePicker', GvTimePicker);\n },\n};\nexport default GvTimePickerPlugin;\n\nexport { GvTimePicker };\n","/*\n * @title: info message component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:10:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-04-28 16:11:10\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nconst infoMsg = {\n carNo: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '车牌号格式错误';\n else info = 'car number format error.';\n return info;\n },\n double: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入浮点数.';\n else info = 'please enter Double.';\n return info;\n },\n decimal: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh') info = '小数点位数不能超过: ' + len + ' 位';\n else info = 'Number of decimal places can not be more than:' + len + '.';\n return info;\n },\n idCard: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '身份证格式不正确';\n else info = 'id card format is not correct.';\n return info;\n },\n maxLen: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh') info = '不能超过 ' + Math.floor(len / 2) + '个汉字或 ' + len + ' 个字符';\n else info = 'Can not exceed ' + len + ' character.';\n return info;\n },\n money: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '非0开头的数字 小数最多两位.';\n else info = \"Only input Numbers, 0 can't start, the decimal two at the most.\";\n return info;\n },\n moneyMax: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh') info = '整数位最多只能是: ' + len + ' 位';\n else info = 'integer digits can only be at most: ' + len;\n return info;\n },\n letter: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '不能输入字母以外的字符';\n else info = \"Can't input letters outside of the characters.\";\n return info;\n },\n number: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '只能输入正整数.';\n else info = 'Only enter a positive integer.';\n return info;\n },\n number0: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '只能输入不能以0开头的正整数.';\n else info = 'Only enter a non-zero positive integer, and cannot begin with zero.';\n return info;\n },\n //Add TypeScript type annotations for lang parameter\n numberLetter: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '不能输入数字、字母以外的字符.';\n else info = 'Can not input Numbers, letters characters.';\n return info;\n },\n //Add TypeScript type annotations for lang parameter\n name: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '不能输入数字、字母、-、_和中文以外的字符.';\n else info = 'Can not enter Numbers, letters, -, _ and Chinese characters.';\n return info;\n },\n phone: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '电话号码格式不正确.';\n else info = 'Phone format is not correct.';\n return info;\n },\n email: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '邮件格式不正确.';\n else info = 'E-mail format is not correct.';\n return info;\n },\n telephone: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入正确的固话(格式:区号+号码,如010-1234567)';\n else info = 'Telephone format is not correct.';\n return info;\n },\n ip: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入正确的IP地址';\n else info = 'IpAddress format is not correct.';\n return info;\n },\n url: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入正确的url地址';\n else info = 'Url format is not correct.';\n return info;\n },\n phoneTel: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入正确的电话号码或者固话号码';\n else info = 'phone & tel format is not correct.';\n return info;\n },\n vin: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入后8位或17位(字母大写)';\n else info = 'must be 8 or 17 letters and Numbers.';\n return info;\n },\n};\nexport default infoMsg;\n","/*\n * @title: validate rules component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:09:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-04-28 16:13:48\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/** ------------------- 验证规则 ------------------------\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 /**\n * @todo: 校验长度是否符合\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 14:48:17\n */\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 /**\n * @todo: 验证浮点数格式\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:54:58\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isDouble: (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 /**\n * @todo: 验证身份证号\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:54:58\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isIdcard: (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 /**\n * @todo: 验证车牌号(含新能源)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:55:38\n * @param {*} handle\n */\n isCarno: (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 /**\n * @todo: 验证金额格式(不能以0开头,小数点只能是2位)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 15:38:24\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 * @todo: 验证带千位符金额格式\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:48:15\n * @param {*} str\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 * @todo: 验证是否都是字母( 不包括标点符号)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:48:15\n * @param {*} str\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 * @todo: 验证是否是整数数字\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\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 * @todo: 验证是否是整数数字(不能以0开始)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\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 * @todo: 验证是否数字和字母\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\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 * @todo: 验证是否数字和字母\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\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 /**\n * @todo: 验证电话号码\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:41:04\n * @param {*} phone\n */\n isPhone: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const reg = /^1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\\d{8}$/;\n if (!reg.test(value)) {\n const { language = 'zh' } = rule;\n callback(new Error(infoMsg.phone(language)));\n } else callback();\n }\n },\n\n /**\n * @todo: 验证是否email\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:40:50\n * @param {*} email\n */\n isEmail: (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 * @todo: 验证是否是固定电话\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:39:10\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 * @todo: 验证手机号码或者固话\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:51:38\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isPhoneTel: (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 * @todo: 验证是否是ip地址\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:50:44\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isIp: (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 * @todo: 验证是否是url\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:42:31\n * @param {*} url\n */\n isUrl: (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 * @todo: 验证vin\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-05-01 19:31:14\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-05-08 17:12:16\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 { useUserStore } from '@/store/modules/user';\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, reactive, ref, unref, watch, type PropType, type VNode } from 'vue';\n import { useI18n } from 'vue-i18n';\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,\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 }) {\n // @provide\n provide('refForm', props.refForm);\n provide('formList', props.formList);\n\n // @data\n const appStore = useAppStore();\n const userStore = useUserStore();\n const { t } = useI18n();\n\n let originFormList = reactive([]);\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 // 暴露方法给父组件\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 let model = reactive({}); // 表单数据,默认空对象\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 // method\n const getLanguage = (lang: string, x: any) => {\n // console.log(x);\n let v = '';\n switch (lang) {\n case 'zh':\n v = x.t;\n break;\n case 'en':\n v = x.e;\n break;\n case 'l1':\n v = x.l1;\n break;\n case 'l2':\n v = x.l2;\n break;\n default:\n v = x.t;\n break;\n }\n if (!v) v = x.t;\n return v;\n };\n /**\n * @todo: set divider show status\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 18:12:34\n * @param {*} show\n */\n const setDividerShow = (show: boolean) => {\n isShow.value = show;\n };\n\n const getEditBar = computed(() => {\n if (slots.editbar?.())\n return (\n <ElRow\n ref-form={props.refForm}\n class=\"gv-form-editbar\">\n {slots.editbar?.()}\n </ElRow>\n );\n else return null;\n });\n\n const getDivider = computed(() => {\n let dividerRender: VNode | null = null;\n if (searchDivider.value !== false) {\n let dividerTitle: string;\n if (props.divider) dividerTitle = props.divider;\n else dividerTitle = t('common.dividerTitle');\n if (props.isDivider)\n dividerRender = (\n <GvDivider\n label={dividerTitle}\n target={props.refForm}\n onSetShow={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[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[field + '-end']) {\n const endTime = new Date(model[field + '-end']).getTime();\n const startTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model[field + '-end'] = '';\n model[1] = 'null';\n }\n }\n\n if (type === 'e')\n if (val && model[field + '-start']) {\n const startTime = new Date(model[field + '-start']).getTime();\n const endTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model[field + '-start'] = '';\n // console.log(this.model);\n model[1] = 'null';\n }\n }\n\n if (!field) return;\n const datePicker = model[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[field] = datePicker.join(',');\n } else {\n if (datePicker) dateArr = datePicker.split(',');\n dateArr[0] = model[field + '-start'];\n dateArr[1] = model[field + '-end'];\n if (!dateArr[0]) dateArr[0] = 'null';\n if (!dateArr[1]) dateArr[1] = 'null';\n model[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[field] = '100201';\n else model[field] = '100202';\n break;\n case 'sf':\n if (val === true) model[field] = '100101';\n else model[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, cb) => {\n if (cb)\n try {\n await cb(val, field, dicType);\n } catch (error) {\n console.log(error);\n }\n };\n /**\n * @todo: render form item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:54:23\n * @param {*} _item\n * @param {*} _index\n */\n const renderFormItem = (_item: FormItem, _index: number): VNode => {\n const {\n type = 'text',\n label,\n field,\n hidden = false,\n disabled,\n format = [],\n placeholder,\n readonly = false,\n dateType = 'date',\n dicType,\n filtercode,\n colspan = 1,\n disabledDateFunc,\n disabledDate,\n editable = true,\n multiple = false,\n showLabel,\n size = formSize.value,\n visible = true,\n // offset,\n createRow = false, // 是否创建新row,\n dicRemote,\n cb, // 回调方法\n clear, // 清空回调\n rows, // textarea\n autosize, // textarea\n min, // input-number\n max, // input-number\n step, // input-number\n precision, // input-number\n blur = () => {},\n suffixIcon, // 后缀icon\n prefixIcon, // 前缀icon\n focus = () => {},\n change = () => {},\n defaultTime, // 时间的默认能够选择的时间\n isreload = true, // 表选字典是否重新加载\n options = [],\n lazy = false, // cascader是否懒加载\n lazyLoad = () => {}, // cascader懒加载方法\n render, // 自定义form样式\n } = _item;\n let renders;\n const isHidden = hidden === true;\n const maxLen = format[2] || 30;\n let cType = type;\n // const dateFormatConfig = dateFormatConfig;\n const validateRule = toHump(String(format[1] || ''));\n let sDateType = dateType;\n let isRange = false;\n let dateFormat = dateFormatConfig.date.valueFormat; // 日期显示格式\n let valueFormat = dateFormatConfig.date.valueFormat; // 日期绑定值格式\n if (sDateType !== 'daterange' && sDateType !== 'datetimerange' && sDateType !== 'daterange2' && sDateType !== 'datetimerange2') {\n if (validateRule === 'isDate') cType = 'date';\n if (validateRule === 'isDateTime') {\n cType = 'datetime';\n sDateType = 'datetime';\n }\n if (validateRule === 'isTime') cType = 'time';\n }\n\n if (sDateType === 'timerange') isRange = true;\n\n let ph = placeholder;\n let startPh = t('common.startDate');\n let endPh = t('common.endDate');\n // todo: 响应式布局计算\n // const cols = { span: colspan, offset: (_index) * 6 };\n let cols = colspan > 4 ? 4 : colspan; // fixme: 最大值不能超过4 2022-04-07\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') cols = 2;\n // update: 对于多选字典,默认占用列数为2列 2023-02-18\n if (multiple === true && colspan === undefined) cols = 2;\n let rangeSeparator;\n if (sDateType === 'timerange' || sDateType === 'daterange2' || sDateType === 'datetimerange2') rangeSeparator = t('common.until');\n const colSpanXs = 24;\n let colSpanSm = 12;\n let colSpanMd = 8;\n\n let colSpanLg = 6;\n if (isDialog.value === true) colSpanLg = 8;\n let colSpanXl = 4;\n if (isDialog.value === true) colSpanXl = 6;\n if (colSpanNums.value !== 0) {\n if (colSpanNums.value === 12) cols = colspan > 2 ? 2 : colspan;\n if (colSpanNums.value === 8) cols = colspan > 3 ? 3 : colspan;\n if (colSpanNums.value === 6 || colSpanNums.value === 4) cols = colspan > 4 ? 4 : colspan;\n colSpanSm = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanMd = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanLg = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanXl = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n } else {\n colSpanSm = cols * colSpanSm > 24 ? 24 : cols * colSpanSm;\n colSpanMd = cols * colSpanMd > 24 ? 24 : cols * colSpanMd;\n colSpanLg = cols * colSpanLg > 24 ? 24 : cols * colSpanLg;\n colSpanXl = cols * colSpanXl > 24 ? 24 : cols * colSpanXl;\n }\n let decimal = 2;\n let v = '';\n if (!ph)\n switch (validateRule) {\n case 'isMoney':\n ph = '0.00';\n break;\n case 'isBigMoney':\n ph = '0,000.00';\n break;\n case 'isEmail':\n ph = 'xx@xx.com';\n break;\n case 'isDouble':\n if (format.length >= 4) decimal = format[3] || 2;\n while (decimal > 0) {\n v = '0' + v;\n decimal--;\n }\n ph = '00.' + v;\n break;\n case 'isDate':\n if (sDateType === 'week') {\n ph = t('common.selectWeek'); // dateFormatConfig.week.placeholder;\n dateFormat = dateFormatConfig.week.dateFormat;\n } else if (sDateType === 'month' || sDateType === 'monthrange') {\n ph = t('common.selectMonth'); // dateFormatConfig.month.placeholder;\n startPh = ph;\n endPh = ph;\n dateFormat = dateFormatConfig.month.dateFormat;\n valueFormat = dateFormatConfig.month.valueFormat;\n } else if (sDateType === 'year') {\n ph = t('common.selectYear'); // dateFormatConfig.year.placeholder\n dateFormat = dateFormatConfig.year.dateFormat;\n valueFormat = dateFormatConfig.year.valueFormat;\n } else if (sDateType === 'daterange' || sDateType === 'daterange2') ph = t('common.selectDate');\n break;\n case 'isDateTime':\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') {\n startPh = t('common.startTime');\n endPh = t('common.endTime');\n }\n ph = t('common.selectTime'); // dateFormatConfig.datetime.placeholder;\n dateFormat = dateFormatConfig.datetime.dateFormat;\n valueFormat = dateFormatConfig.datetime.valueFormat;\n break;\n }\n let editables = editable;\n // 如果是带有禁用日期的,不可编辑,防止输入不一致问题\n if (disabledDateFunc || disabledDate) editables = false;\n let ops;\n let isTableDic = false;\n if (type === 'dic')\n if (dicType) {\n ops = getDictItems(dicType);\n if (dicType.indexOf('t#') >= 0) isTableDic = true;\n }\n\n // 设置label是否显示\n let sLabel = label;\n if (formType.value === 's') {\n sLabel = appStore.searchFormLabel === true ? label : undefined;\n if (appStore.searchFormLabel !== true) ph = label;\n }\n\n let switchDefaultVal;\n switch (cType) {\n case 'blank':\n renders = (\n <ElCol\n key={_index}\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 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 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[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 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[field]}\n content={model[field] ? model[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvInput\n type=\"text\"\n vref={field}\n name={field}\n v-model={model[field]}\n modelValue={model[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 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[field]}\n content={model[field] ? model[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvInput\n vref={field}\n name={field}\n type=\"textarea\"\n v-model={model[field]}\n modelValue={model[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 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[field]}\n content={model[field] ? model[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvTimePicker\n v-model={model[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 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[field]}\n modelValue={model[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 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[field + '-start']}\n modelValue={model[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[field + '-end']}\n modelValue={model[field + '-end']}\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[field + '-start']).getTime() - 8.64e7;\n else return date.getTime() <= new Date(model[field + '-start']).getTime() - 8.64e7;\n }}\n editable={editables}\n placeholder={endPh}\n default-time={defaultTime}\n data-visible={visible}\n class=\"gv-datepicker-range-end\"\n onChange={(val) => handleDateRange2Change('e', val, field)}\n onFocus={(vm) => handleDateRange2Focus(vm)}\n onBlur={(vm) => handleDateRange2Blur(vm)}\n />\n </div>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'dic':\n switch (dicType) {\n case 'yxzt':\n switchDefaultVal = model[field] ? model[field] : '100201';\n break;\n case 'sf':\n switchDefaultVal = model[field] ? model[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 style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <GvSwitch\n value={switchDefaultVal}\n columnKey={field}\n disabled={disabled}\n target={dicType === 'yxzt' ? '100201' : '100101'}\n onChange={(val) => handleSwitchDictChange(val, field, dicType, cb)}></GvSwitch>\n </ElFormItem>\n </ElCol>\n ) : null;\n else if (isTableDic === false && multiple === false && formType.value === 'e' && ops && ops.length === 2)\n // 当是编辑form并且字典内容只有2个以内时\n renders = visible ? (\n <ElCol\n key={_index}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElRadioGroup\n v-model={model[field]}\n on-change={(val) => handleRadioDictChange(val, field, dicType, cb)}>\n {ops.map((x) =>\n format[0] === 0 ? (\n <ElRadio\n label={x.c}\n disabled={disabled}\n onChange={(event) => handleRadioInput(event, field, x.c, model[field], disabled)}>\n {getLanguage(userStore.language, x)}\n </ElRadio>\n ) : (\n <ElRadioButton\n label={x.c}\n disabled={disabled}>\n {getLanguage(userStore.language, x)}\n </ElRadioButton>\n ),\n )}\n </ElRadioGroup>\n </ElFormItem>\n </ElCol>\n ) : null;\n else {\n let v;\n const vv = model[field];\n if (typeof vv === 'object')\n if (Array.isArray(vv))\n vv.forEach((x, index) => {\n if (x)\n if (v)\n if (x.label) v += ',' + x.label;\n else v += ',' + (showLabel?.[index] ? showLabel[index] : x);\n else if (x.label) v = x.label;\n else v = showLabel?.[index] ?? x;\n });\n else {\n if (vv) v = vv.label;\n }\n else v = vv;\n let toolText = v;\n if (showLabel) toolText = showLabel;\n renders = visible ? (\n <ElCol\n key={_index}\n 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 open-delay={1000}>\n <GvSelect\n v-model={model[field]}\n value={model[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 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[field]}\n content={model[field] ? model[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvInputNumber\n vref={field}\n v-model={model[field]}\n value={model[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 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[field]}\n content={model[field] ? model[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvCascader\n vref={field}\n v-model={model[field]}\n value={model[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) => {\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');\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 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 if (width.lastIndexOf('%') === -1) {\n // width固定值\n width = parseInt(width);\n if (width !== 0) {\n if (width < 768)\n // xs\n colSpanNums.value = 24;\n else if (width < 992)\n // sm\n colSpanNums.value = 12;\n else if (width < 1200)\n // md\n colSpanNums.value = 8;\n else if (width < 1920)\n // lg\n colSpanNums.value = 6;\n else colSpanNums.value = 4;\n\n rootNodeStyle.value['width'] = width + 'px';\n }\n if (height !== '100%' && height !== 0) {\n height = parseInt(height);\n rootNodeStyle.value['height'] = height + 'px';\n }\n } else rootNodeStyle.value['width'] = width;\n }\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[item.field] === undefined ? item.value : model[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 = formModel;\n if (type === 'create') rules.value = formRule;\n else if (type === 'watch') rules.value = formRule;\n setFormStyle();\n\n await nextTick();\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 () => [sMaxHeight.value, props.formList],\n ([_maxHeight, nextProps], [_prevMaxHeight, prevProps]) => {\n // sMaxHeight\n if (isScrollbar.value === false)\n if (isAnchor.value === false) sMaxHeight.value = 0;\n else sMaxHeight.value = 0;\n else sMaxHeight.value = 0;\n // formList\n if (Array.isArray(nextProps) && Array.isArray(prevProps) && nextProps.length !== prevProps.length) init('watch');\n else if (difference(nextProps, originFormList)) init('watch');\n },\n {\n deep: true,\n // immediate: true,\n },\n );\n\n // @create 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') formType.value = 's';\n else formType.value = 'e';\n // 解析formList\n originFormList = JSON.parse(JSON.stringify(props.formList));\n init('create');\n // 判断是否是dialog弹出框中的form\n if (instance?.parent?.vnode && instance?.parent?.vnode.componentOptions && instance?.parent?.vnode.componentOptions.tag === 'el-dialog') isDialog.value = true;\n else isDialog.value = false;\n\n // @mounted hook\n onMounted(() => {\n // update: 对于查询form,默认仅显示2行查询条件,多余的进行隐藏 2022-04-22\n nextTick(() => {\n // get root element\n const rootEl = instance?.proxy?.$el as HTMLElement | undefined;\n\n // 判断是否是查询form\n if (typeof firstSlot?.type === 'object' && 'name' in firstSlot.type && firstSlot?.type?.name === 'GvSearchBar') {\n const expand = (firstSlot as any).componentOptions?.propsData?.expand;\n if (expand !== false)\n for (const element of instance?.proxy?.$children || [])\n if (element.$vnode && element.$vnode.componentOptions && element.$vnode.componentOptions.tag === 'el-form') {\n const fieldList = element.$children[0].$children;\n const fieldLen = fieldList.length;\n if (fieldLen > 3)\n // 默认显示1行\n fieldList.forEach((x, index) => {\n if (index > 2 && index < fieldLen - 1) x.$el.style.display = 'none';\n });\n // if (fieldLen > 7) // 默认显示2行\n // fieldList.forEach((x, index) => {\n // if (index > 6 && index < (fieldLen - 1))\n // x.$el.style.display = 'none';\n // });\n }\n }\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 // @render\n return () => (\n <div\n class={prefixCls}\n style={{ ...rootNodeStyle }}>\n {getEditBar.value}\n {getDivider.value}\n <ElForm\n ref={setFormRef}\n model={model}\n size={formSize.value}\n inline={false}\n label-position={labelPosition.value}\n label-width={`${props.labelWidth}px`}\n rules={rules.value}\n style={{ ...styles.value, display: isShow.value ? '' : 'none', width: '100%', maxHeight: sMaxHeight.value === 0 ? undefined : sMaxHeight.value + 'px' }}>\n <ElRow\n ref-form={props.refForm}\n style={{ display: 'flex', flexWrap: 'wrap' }}>\n {getItems.value}\n {slots.default?.() && <div style={{ flex: 1, minWidth: 0 }}>{slots.default?.()}</div>}\n </ElRow>\n </ElForm>\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 .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-05-06 17:35:08\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { Expand, Fold } from '@element-plus/icons-vue';\n import { ElIcon } from 'element-plus';\n import { computed, onMounted, unref } from 'vue';\n import { propTypes } from '../../utils/gv.propTypes';\n\n defineOptions({\n name: 'GvHamburger', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('hamburger');\n\n const appStore = useAppStore();\n const collapse = computed(() => appStore.getCollapseMenus);\n\n // set quick keys\n\n // @method\n // load dict\n const loadDict = async () => {\n try {\n await appStore.loadAllDict();\n } catch {\n // empty\n }\n };\n // load division\n const loadDictDivision = async () => {\n try {\n await appStore.loadDictDivision();\n } catch {\n // empty\n }\n };\n\n const toggleCollapse = () => {\n const collapsed = unref(collapse);\n appStore.setCollapseMenus(!collapsed);\n };\n\n // @created\n // @mounted\n onMounted(async () => {\n // reload dict if needed\n const currentDict = appStore.dict;\n const currentReloadDict = appStore.isLoadDict;\n if (!currentDict || Object.keys(currentDict).length === 0) await loadDict();\n else if (+currentReloadDict === 1) await loadDict();\n const currentDictDivision = appStore.dictDivision;\n if (currentDictDivision && currentDictDivision.length === 0) await loadDictDivision();\n });\n</script>\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleCollapse\">\n <div class=\"trigger\">\n <ElIcon\n :size=\"20\"\n :class=\"`${prefixCls}__icon`\">\n <Expand\n v-if=\"!collapse\"\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n <Fold\n v-else\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n </ElIcon>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-hamburger';\n .#{$prefixCls} {\n position: relative;\n z-index: 3;\n line-height: $navHeadHeight;\n background-color: #fff;\n &:hover {\n background-color: rgb(0 0 0 / 3%);\n }\n .trigger {\n display: inline-block;\n line-height: 1px;\n cursor: pointer;\n transition: color 0.3s ease;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvHamburger from './src/GvHamburger.vue';\nconst GvHamburgerPlugin = {\n install(app: App): void {\n app.component(GvHamburger.name ?? 'GvHamburger', GvHamburger);\n },\n};\nexport default GvHamburgerPlugin;\n\nexport { GvHamburger };\n","<!--\n * @title: locale lang dropdown\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-25 11:43:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-06-09 14:15:05\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, unref } from 'vue';\n import { useRouter } from 'vue-router';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useLocaleStore } from '@/store/modules/locale';\n import { useLocale } from '@/hook/web/useLocale';\n import { useStyle } from '@/hook/web/useStyle';\n\n import { ElDropdown, ElDropdownMenu, ElDropdownItem } from 'element-plus';\n\n defineOptions({\n name: 'GvLangSelect', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n defineProps({\n className: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('lang-select');\n\n const localeStore = useLocaleStore();\n const langMap = computed(() => localeStore.getLocaleMap);\n const currentLang = computed(() => localeStore.getCurrentLocale);\n\n const router = useRouter();\n\n const handleSetLang = async (lang): Promise<void> => {\n if (lang === unref(currentLang).lang) return;\n\n const { switchLocale } = useLocale();\n await switchLocale(lang);\n router.go(0);\n };\n</script>\n\n<template>\n <ElDropdown\n :class=\"prefixCls\"\n trigger=\"click\"\n class=\"international\"\n @command=\"handleSetLang\">\n <div>\n <GvIcon\n :class-name=\"`international-icon ${className}`\"\n icon-name=\"language\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item in langMap\"\n :key=\"item.lang\"\n :command=\"item.lang\">\n {{ item.name }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n","import type { App } from 'vue';\nimport GvLangSelect from './src/GvLangSelect.vue';\nconst GvLangSelectPlugin = {\n install(app: App): void {\n app.component(GvLangSelect.name ?? 'GvLangSelect', GvLangSelect);\n },\n};\nexport default GvLangSelectPlugin;\n\nexport { GvLangSelect };\n","<!--\n * @title: 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-05-08 16:45:09\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 { useAppStore } from '@/store/modules/app';\n import { GvButton } from '@@/GvButton';\n import { getVNodeText } from '@@/utils';\n import { computed, defineComponent, getCurrentInstance, inject, 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 } = useI18n();\n const visible = ref(props.expand);\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?.proxy?.$parent;\n while (formNode && formNode.$?.type?.name !== 'ElForm') formNode = formNode.$parent;\n const fieldList = ref<any[]>([]);\n\n // @mounted\n onMounted(() => {\n fieldList.value = formNode.fields;\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 handleExpand = () => {\n const fieldLen = fieldList.value?.length || 0;\n fieldList.value?.forEach((x, index) => {\n if (index > 2 && index < fieldLen - 1)\n if (x?.component?.proxy?.$el)\n // 默认一行\n // if (index > 6 && index < (fieldLen - 1)) // 默认2行\n x.component.proxy.$el.style.display = '';\n });\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 handleShrink = () => {\n const fieldLen = fieldList.value?.length || 0;\n fieldList.value.forEach((x, index) => {\n if (index > 2 && index < fieldLen - 1)\n if (x?.component?.proxy?.$el)\n // 默认一行\n // if (index > 6 && index < (fieldLen - 1)) // 默认2行\n x.component.proxy.$el.style.display = 'none';\n });\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 // 默认查询条件只显示一行\n if (fieldList2.length > 4) {\n // if (fieldList.length > 8) { // 默认查询条件显示2行\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 ref=\"gvSearchExpand\"\n type=\"text\"\n bizType=\"expand\"\n visible={visible.value}\n onClick={handleExpand}>\n {expandText} \n <i class=\"el-icon-arrow-down\" />\n </GvButton>\n );\n searchBar.push(expand);\n const shrink = (\n <GvButton\n ref=\"gvSearchShrink\"\n type=\"text\"\n bizType=\"shrink\"\n visible={!visible.value}\n onClick={handleShrink}>\n {shrinkText} \n <i class=\"el-icon-arrow-up\" />\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: 2px;\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 type { RouteMeta } from 'vue-router';\nimport { useI18n } from '@/hook/web/useI18n';\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 iconName={meta.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-03-09 16:33:08\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 { ElSubMenu, ElMenuItem } from 'element-plus';\nimport { unref } from 'vue';\nimport { hasOneShowingChild } from '../helper';\nimport { isUrl } from '@@/utils';\nimport { useRenderMenuTitle } from './useRenderMenuTitle';\nimport { pathResolve } from '@@/utils';\nimport { useStyle } from '@/hook/web/useStyle';\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 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-03-09 14:26:39\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 { computed, defineComponent, unref, type PropType } from 'vue';\n import { ElMenu, ElScrollbar } from 'element-plus';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { useRenderMenuItem } from './components/useRenderMenuItem';\n\n import { useRouter } from 'vue-router';\n import { isUrl } from '../../utils';\n import { useStyle } from '@/hook/web/useStyle';\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\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: var(--left-menu-bg-color) !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: 2025-06-09 17:46:25\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 { ref, watch, computed, onMounted, unref } from 'vue';\n import { useAppStore } from '@/store/modules/app';\n import { useStyle } from '@/hook/web/useStyle';\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 'inline-block whitespace-nowrap ml-[10px] 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: 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-03-16 13:05:31\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 { computed, defineComponent, onMounted, ref, reactive, unref, watch, nextTick } from 'vue';\n import { ElTabs, ElTabPane } from 'element-plus';\n import { useRouter, type RouteLocationNormalizedLoaded } from 'vue-router';\n import { useI18n } from 'vue-i18n';\n import { useEventListener } from '@vueuse/core';\n import { useStyle } from '@/hook/web/useStyle';\n import { useTagsViewStore } from '@/store/modules/tagsView';\n import { usePermsStore } from '@/store/modules/perms';\n import { joinIcon, pathResolve } from '@@/utils';\n import { cloneDeep } from 'lodash-es';\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 } = useI18n();\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 { query } = this.$route;\n activeKey.value = routePath || '/dashboard';\n 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.fullPath);\n } else if (currentView.name === 'Dashboard') replace({ path: '/redirect' + currentView.fullPath });\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.65);\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: 2025-09-02 09:45:22\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 { ElDropdown, ElDropdownMenu, ElDropdownItem } from 'element-plus';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { computed } from 'vue';\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 = (theme: string) => {\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 ${className}\"\n icon-name=\"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: CRUD hook\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:25:08\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-04-10 17:54:48\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/**\n * @todo: request data\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:39:44\n * @param {*} fetch\n * @param {*} datas\n */\nconst fetchData = async <T = any>(fetch, params): Promise<IResponse<T>> => (await fetch(params)) as IResponse<T>;\nexport const useCrud = () => ({\n fetchData,\n});\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-08 10:10:57\n * @version: 1.0.7\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 GvBacktopPlugin, { GvBacktop } from './GvBacktop';\nimport GvBreadCrumbPlugin, { GvBreadCrumb } from './GvBreadCrumb';\nimport GvButtonPlugin, { GvButton } from './GvButton';\nimport GvCascaderPlugin, { GvCascader } from './GvCascader';\nimport GvColPlugin, { GvCol } from './GvCol';\nimport GvRowPlugin, { GvRow } from './GvRow';\nimport GvSwitchPlugin, { GvSwitch } from './GvSwitch';\n\nimport { setBridgeContext } from './bridge';\nimport GvDatePickerPlugin, { GvDatePicker } from './GvDatePicker';\nimport GvDividerPlugin, { GvDivider } from './GvDivider';\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 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 GvTagsViewPlugin, { GvTagsView } from './GvTagsView';\nimport GvThemePlugin, { GvTheme } from './GvTheme';\nimport GvTimePickerPlugin, { GvTimePicker } from './GvTimePicker';\n\nconst components = [\n GvRowPlugin,\n GvColPlugin,\n GvInputPlugin,\n GvButtonPlugin,\n GvPopconfirmPlugin,\n GvIconPlugin,\n GvInputNumberPlugin,\n GvCascaderPlugin,\n GvSwitchPlugin,\n GvSelectPlugin,\n GvTimePickerPlugin,\n GvFormPlugin,\n GvLangSelectPlugin,\n GvBacktopPlugin,\n GvBreadCrumbPlugin,\n GvHamburgerPlugin,\n GvScreenFullPlugin,\n GvSearchBarPlugin,\n GvSidebarPlugin,\n GvSidebarLogoPlugin,\n GvThemePlugin,\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 GvBreadCrumb,\n GvButton,\n GvCascader,\n GvCol,\n GvDatePicker,\n GvDivider,\n GvExpandMenu,\n GvForm,\n GvHamburger,\n GvIcon,\n GvInput,\n GvInputNumber,\n GvLangSelect,\n GvPopconfirm,\n GvRow,\n GvScreenFull,\n GvSearchBar,\n GvSelect,\n GvSidebar,\n GvSidebarLogo,\n GvSwitch,\n GvTagsView,\n GvTheme,\n GvTimePicker,\n};\n\n// 🔹 hooks / utils\nexport * from './hooks/service/useCrud';\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":["getPrefixCls","variables","useStyle","prefixCls","_createBlock","_unref","ElBacktop","GvBacktopPlugin","app","GvBacktop","setHtmlAttrByLang","locale","_a","sleep","timeLen","__async","resolve","toHump","name","all","letter","toLine","setDomCssProp","prop","val","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","slots","setQuickKeys","ev","btnHtml","inputHtml","messageConfirmHtml","bodyDialogHtml","dialogArr","buttonHtml","buttonDHtml","toString","is","type","isExternal","path","isString","isArray","isError","isObject","isDate","isNumber","isBoolean","isFunction","isElement","isMap","isImgPath","isDark","isNull","isEmpty","isUrl","e","pathResolve","parentPath","childPath","preNameSpace","attrs","useAttrs","props","__props","isLocal","computed","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","i","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","_sfc_main$n","setup","appStore","useAppStore","permStore","usePermsStore","showBreadcrumbIcon","getShowBreadcrumbIcon","currentRoute","useRouter","t","useI18n","levelList","ref","menuRouters","routers","getRouters","getBreadcrumb","currentPath","value","matched","slice","unref","renderBreadcrumb","map","v","disabled","redirect","_createVNode","ElBreadcrumbItem","default","title","watch","startsWith","_slot","ElBreadcrumb","TransitionGroup","GvBreadCrumbPlugin","GvBreadCrumb","_sfc_main$m","String","emits","emit","instance","getCurrentInstance","handleConfirm","event","proxy","ElPopconfirm","reference","GvInputPlugin","GvPopconfirm","getValueType","useStorage","key","valueType","excludes","keys","defaultExcludes","excludesArr","getStorage","lang","notificationTime","notificationTimeError","messageTime","messageTimeError","alert","msg","alertObj","promptMsg","duration","m","ElNotification","confirm","msgs","showCancelButton","hint","ok","cancel","reject","ElMessageBox","message","tableedit","ElMessage","_sfc_main$l","visible","Boolean","text","otext","size","undefined","loading","refForm","required","nativeType","bizType","perms","cb","Function","useRoute","globalSize","useGlobalConfig","buttonSize","buttonConfirm","loadings","locked","isShow","isIf","getSlots","setIconStyle","replace","checkPerms","pm","slot","length","first","split","x","includes","flag","handleClick","$parent","$","resetFields","originFormList","formList","Array","index","filtercode","showLabel","hidden","dateType","model","field","$el","querySelector","click","then","classz","renderBtn","display","ElButton","GvButtonPlugin","GvButton","_sfc_main$k","vref","options","placeholder","clearable","showAllLevels","separator","trigger","filterable","multiple","lazy","lazyLoad","sOps","inputValue","cascaderSize","sPlaceHolder","getDisabled","newVal","handleChange","handleBlur","handleFilterMethod","query","labels","pathLabels","join","indexOf","spell","pathNodes","some","ElCascader","$event","expandTrigger","GvCascaderPlugin","GvCascader","_sfc_main$j","inheritAttrs","span","Number","offset","xs","sm","md","lg","xl","ElCol","GvColPlugin","GvCol","_sfc_main$i","gutter","ElRow","GvRowPlugin","GvRow","_sfc_main$h","columnKey","target","require","switchType","newStatus","ElSwitch","GvSwitchPlugin","GvSwitch","globalBridgeKey","getBridge","g","setBridgeContext","ctx","useBridgeI18n","i18n","toMidnight","date","d","daysAgo","days","midnight","monthBegin","quarterBegin","month","yearBegin","now","dateShortcuts","picker","dateShortcutsEn","dateTimeShortcuts","dateTimeShortcutsEn","dateRangeShortcuts","start","end","dateRangeShortcutsEn","_sfc_main$g","modelValue","Date","format","valueFormat","defaultTime","rangeSeparator","startPlaceholder","endPlaceholder","disabledDateFunc","disabledDate","editable","unlink","datepickerSize","sType","shortcuts","isEn","mergedDisabledDate","getTime","handleUpdate","handleFocus","handleCalendarChange","DatePicker","ElDatePicker","GvDatePickerPlugin","GvDatePicker","_sfc_main$f","label","position","direction","preventDefault","stopPropagation","el","document","isHidden","style","ElDivider","GvDividerPlugin","GvDivider","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","onMounted","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","ElDrawer","_normalizeStyle","GvMenuList","GvExpandMenuPlugin","GvExpandMenu","_sfc_main$c","prefixIcon","suffixIcon","maxlength","readonly","showWordLimit","columnProp","rows","autosize","modelModifiers","inputSize","sPlaceholder","newValue","renderPrefixIcon","renderSuffixIcon","handleInput","select","handleClear","handleKeyDown","ElInput","number","prefix","suffix","GvInput","_sfc_main$b","min","max","step","stepStrictly","precision","currentValue","oldValue","ElInputNumber","GvInputNumberPlugin","GvInputNumber","_sfc_main$a","dicType","dicRemote","clear","isreload","editRow","collapseTags","userStore","useUserStore","useNotify","debounceSearch","dicIcon","remote","loadingText","inputShowLabel","inputFilterable","selectValue","originOptions","className","selectSize","c","op","push","getSelectOptions","ret","src","toLowerCase","arr","xx","arr2","dictCache","dict","getDictDivision","cache","addDictCache","getDict","opts","RegExp","test","filterMethod","_opts","remoteDictSearch","sDicType","substring","datas","ops","JSON","parse","console","log","remoteMethod","defaultValFlag","f","handleVisibleChange","renderSelectOption","l1","l2","ElOption","renderTableOption","columns","row","multiColumn","v1","mm","m2","m4","vv1","mmm","mm2","mm4","labelArr","ElSelect","GvSelectPlugin","GvSelect","TimePicker","ElTimePicker","_sfc_main$9","isRange","disabledHours","disabledMinutes","disabledSeconds","timepickerSize","mergedDisabledHours","mergedDisabledMinutes","mergedDisabledSeconds","GvTimePickerPlugin","GvTimePicker","infoMsg","info","len","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","decimal","pattern","_sfc_main$8","divider","isDivider","labelWidth","formStyle","scroller","provide","reactive","formRefs","formElRef","setFormRef","rootNodeStyle","rules","isEditContainer","sMaxHeight","isScrollbar","isAnchor","isDialog","colSpanNums","formType","styles","formSize","labelPosition","searchDivider","getLanguage","setDividerShow","show","getEditBar","editbar","getDivider","dividerRender","dividerTitle","getDictItems","dictCacheTmp","dictTmp","getItemRules","_item","validateKey","maxLen","validator","gvValidate","excluded","handleRadioInput","formVal","handleDateRange2Focus","vm","closest","handleDateRange2Blur","handleDateRange2Change","endTime","startTime","datePicker","dateArr","handleSwitchDictChange","error","handleRadioDictChange","renderFormItem","_index","_slot3","colspan","createRow","blur","focus","change","render","renders","cType","validateRule","sDateType","dateFormat","ph","startPh","endPh","cols","colSpanXs","colSpanSm","colSpanMd","colSpanLg","colSpanXl","week","datetime","editables","isTableDic","sLabel","searchFormLabel","switchDefaultVal","ElFormItem","_createTextVNode","ElTooltip","onFocus","width","ElRadioGroup","_slot2","ElRadio","ElRadioButton","vv","toolText","_resolveComponent","getItems","getMaxHeight","sRootEl","tabPane","offsetTop","classList","contains","documentElement","clientHeight","clearFormValidate","clearValidate","setFormStyle","formStyle1","height","lastIndexOf","parseInt","init","formModel","formRule","nextTick","difference","oldVal","diff","fieldObj","oldObj","fieldObjKeys","key2","_maxHeight","nextProps","_prevMaxHeight","prevProps","deep","firstSlot","stringify","componentOptions","rootEl","propsData","expand","$children","$vnode","fieldList","fieldLen","dialogBody","dialogBody2","window","addEventListener","ElForm","maxHeight","flexWrap","flex","minWidth","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","toggle","isFullscreen","useFullscreen","toggleFullscreen","GvScreenFullPlugin","GvScreenFull","_sfc_main$4","inject","formNode","fields","handleExpand","component","handleShrink","createSearchBar","searchBar","buttonQuick","buttonIcon","defaultSlot","searchBtnFlag","expandText","shrinkText","shrink","GvSearchBarPlugin","GvSearchBar","hasOneShowingChild","onlyOneChild","showingChildren","useRenderMenuTitle","renderMenuTitle","useRenderMenuItem","menuMode","renderMenuItem","oneShowingChild","fullPath","noShowingChildren","alwaysShow","ElMenuItem","ElSubMenu","_sfc_main$3","menuSelect","layout","getLayout","getCollapseMenus","leftMenuUniqueOpened","getLeftMenuUniqueOpened","activeMenu","open","renderMenu","ElMenu","renderMenuWrap","ElScrollbar","GvSidebarPlugin","GvSidebar","_imports_0","collapseMenus","GvSidebarLogoPlugin","GvSidebarLogo","_sfc_main$1","y","currentKey","activeKey","tagsViewStore","useTagsViewStore","permsStore","visitedViews","mainAppRoutes","isRedirect","isActive","isAffix","affix","filterAffixNavMenus","navMenus","affixTags","tagPath","params","hash","redirectedFrom","addAffixTags","tagView","addVisitedView","createTabPanel","icons","picon","closable","showContextMenu","closeContextMenu","toLink","routePath","toLastView","visitedView","currentView","latestView","addNavMenu","addTagView","moveToCurrentTag","view","clickTab","tab","closeCurrentTag","targetKey","delTagView","refreshSelectedTag","delCachedView","findCurTagIndex","findIndex","closeTagsOrientation","isClosed","vV","cloneDeep","closeOthersTags","delOthersViews","oldName","body","remove","tagsViewEl","useEventListener","targetNode","tagName","parentElement","getAttribute","clientX","pageX","clientY","pageY","left","top","onClick","GvTagsViewPlugin","GvTagsView","themeOptions","currentTheme","handleSetTheme","theme","GvThemePlugin","GvTheme","fetchData","fetch","useCrud","encrypt","word","keyStr","CryptoJS","ww","srcs","decrypt","generateKey","num","library","randomPoz","components","GvPopconfirmPlugin","install","setActivePinia","GuavaUI"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"guava-ui.es.js","sources":["../packages/GvBacktop/src/GvBacktop.vue","../packages/GvBacktop/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/GvCascader/src/GvCascader.vue","../packages/GvCascader/index.ts","../packages/GvCol/src/GvCol.vue","../packages/GvCol/index.ts","../packages/GvRow/src/GvRow.vue","../packages/GvRow/index.ts","../packages/GvSwitch/src/GvSwitch.vue","../packages/GvSwitch/index.ts","../packages/bridge/index.ts","../packages/GvDatePicker/src/datetime.ts","../packages/GvDatePicker/src/shortcuts.ts","../packages/GvDatePicker/src/GvDatePicker.vue","../packages/GvDatePicker/index.ts","../packages/GvDivider/src/GvDivider.vue","../packages/GvDivider/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/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/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/GvTagsView/src/GvTagsView.vue","../packages/GvTagsView/index.ts","../packages/GvTheme/src/GvTheme.vue","../packages/GvTheme/index.ts","../packages/hooks/service/useCrud.ts","../packages/utils/gv.secret.ts","../packages/index.ts"],"sourcesContent":["<!--\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: 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-05-08 14:24:54\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/**\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} elm\n * @param {string} cls\n * @returns {boolean}\n */\nexport const hasClass = function (ele, cls) {\n return !!ele.className.match(new RegExp('(\\\\s|^)' + cls + '(\\\\s|$)'));\n};\n\n/**\n * Add class to element\n * @param {HTMLElement} elm\n * @param {string} cls\n */\nexport const addClass = function (ele, cls) {\n if (!hasClass(ele, cls)) ele.className += ' ' + cls;\n};\n\n/**\n * Remove class from element\n * @param {HTMLElement} elm\n * @param {string} cls\n */\nexport const removeClass = function (ele, cls) {\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 function 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: 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// ------ 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 (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\nexport const isUrl = (path: string): boolean => {\n try {\n new URL(path);\n return true;\n } catch {\n return false;\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-08 16:04:38\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 { 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', // svg | iconfont\n className: '',\n },\n );\n // @computed\n const isLocal = computed(() => isExternal(props.iconName));\n\n const iconName = computed(() => {\n if (props.iconType === 'svg') return `#${preNameSpace}-icon-${props.iconName}`;\n else if (props.iconType === 'iconfont') return 'iconfont ' + props.iconName;\n else if (props.iconType === 'el') return props.iconName;\n else return `#${props.iconName}`;\n });\n\n // @method\n const svgClass = computed(() => {\n if (props.className)\n if (props.iconType === 'svg') return 'svg-icon ' + props.className;\n else return props.className;\n else return 'svg-icon';\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 if (props.iconType !== 'el') return null;\n const name = props.iconName;\n const compName = name.charAt(0).toUpperCase() + name.slice(1);\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 v-else-if=\"iconComponent\">\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 { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\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 } = useI18n();\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-07 08:49:39\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 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 /** 弹窗标题 */\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 /**\n *@todo: 点击确认按钮\n *@author: bugcao\n *@date: 2026-05-06 14:41:53\n *@version: v1.0.1\n */\n const handleConfirm = (event: MouseEvent) => {\n emit('confirm', event, instance?.proxy);\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}-input';\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-06 17:54: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\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;\nconst { getStorage } = useStorage('localStorage');\nconst lang = getStorage('lang');\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 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 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-05-08 17:06:01\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 { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { GvIcon } from '@@/GvIcon';\n import { GvPopconfirm } from '@@/GvPopconfirm';\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 /** 是否可见 */\n visible: {\n type: Boolean,\n default: true,\n },\n /** 权限相关 */\n text: {\n type: String,\n default: '',\n },\n otext: {\n type: String,\n default: '',\n },\n /** 按钮大小 */\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n /** 按钮类型 */\n type: {\n type: String as PropType<ButtonType>,\n default: 'default',\n },\n /** 是否加载中 */\n loading: {\n type: Boolean,\n default: false,\n },\n /** 是否禁用 */\n disabled: {\n type: [Boolean, String] as PropType<boolean | string>,\n default: false,\n },\n /**\n * @todo 关联表单\n * @param {string} refForm - 关联表单的ref\n * @default undefined\n * @type {string}\n * @use btnRef.value?.dataset?.refForm\n */\n refForm: {\n type: String,\n required: false,\n default: undefined,\n },\n /** 图标 */\n icon: {\n // type: [String, Object] as PropType<string | DefineComponent>,\n type: String,\n default: '',\n },\n /** 原生按钮类型 */\n nativeType: {\n type: String,\n default: 'button',\n },\n /** 业务类型 */\n bizType: {\n type: String as PropType<BizType>,\n default: undefined,\n },\n /** 业务参数 */\n args: {\n type: String,\n default: undefined,\n },\n /** 是否确认 */\n confirm: {\n type: [Boolean, String],\n default: false,\n },\n /** 权限相关 */\n perms: {\n type: String,\n default: undefined,\n },\n /** 点击事件 */\n cb: {\n type: Function as PropType<(args?: any) => void>,\n default: () => {},\n },\n },\n /** Emit 事件 */\n emits: ['click', 'confirm'],\n\n setup(props, { emit, slots }) {\n const { t } = useI18n();\n const route = useRoute();\n const appStore = useAppStore();\n const instance = getCurrentInstance();\n const globalSize = useGlobalConfig('size');\n /** ===== 按钮大小 ===== */\n const buttonSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n /** ===== 按钮是否为确认 ===== */\n const buttonConfirm = computed(() => appStore.buttonConfirm);\n /** ===== 加载中 ===== */\n const loadings = ref(props.loading);\n /** ===== 点击锁定 ===== */\n const locked = ref(false);\n /** ===== 是否可见处理 ===== */\n const isShow = ref(props.visible);\n const isIf = ref(true);\n /** ===== 按钮插槽 ===== */\n const getSlots = computed(() => props.text || slots.default?.());\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 *@todo: 图标处理\n *@author: bugcao\n *@date: 2026-05-06 12:56:13\n *@version: v0.0.1\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 className={props.icon}\n />\n );\n else if (props.icon.startsWith('iconfont'))\n return (\n <GvIcon\n iconType=\"iconfont\"\n iconName={props.icon}\n className={props.icon}\n />\n );\n else\n return (\n <GvIcon\n iconName={props.icon}\n className={props.icon}\n />\n );\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 *@todo: 校验按钮权限\n *@author: bugcao\n *@date: 2026-05-06 12:55:52\n *@version: v0.0.1\n */\n const checkPerms = () => {\n const meta = route.meta as { pm?: string };\n if (!meta?.pm) return;\n let filter = props.text || '';\n if (props.otext) filter = props.otext;\n if (!filter) {\n const slot = slots.default?.();\n if (slot?.length) {\n const first = slot[0];\n if (typeof first.children === 'string') filter = first.children;\n }\n }\n if (!filter) return;\n const pmArr = meta.pm.split(',');\n const perms = pmArr.filter((x) => x.includes(filter));\n if (!perms.length) return;\n const [name, flag] = perms[0].split('|');\n if (name !== ' ' && flag === 'f') {\n isShow.value = false;\n isIf.value = false;\n }\n };\n /**\n * @todo: click handle\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 17:03:50\n * @param {*} e\n * @param {*} type\n */\n const handleClick = async (e: MouseEvent, type?: string) => {\n // ===== 重置按钮点击逻辑 =====\n if (props.bizType === 'reset') {\n let parent: any = instance?.proxy?.$parent;\n while (parent && parent.$?.type?.name !== 'ElForm') parent = parent.$parent;\n await parent?.resetFields?.();\n const originFormList = parent?.$parent?.originFormList;\n const formList = parent?.$parent?.formList;\n if (originFormList && Array.isArray(originFormList))\n originFormList.forEach((x: any, index: number) => {\n if (x.type === 'dic') formList[index]['filtercode'] = x.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 if (x.dateType === 'daterange2' || x.dateType === 'datetimerange2') {\n parent.model[x.field + '-start'] = undefined;\n parent.model[x.field + '-end'] = undefined;\n parent.model[x.field] = undefined;\n }\n });\n props.cb?.(props.args);\n loadings.value = true;\n await parent?.$el?.querySelector('.gv-search__bar .el-button--primary')?.click();\n loadings.value = false;\n return;\n }\n // ===== 导入导出按钮点击逻辑 =====\n if (props.bizType === 'import' || props.bizType === 'export') {\n emit('click', e, props.args);\n return;\n }\n // ===== loading开启 =====\n loadings.value = true;\n if (type === 'confirm')\n if (buttonConfirm.value === false)\n try {\n await confirm(t('common.confirm')).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 // @created\n checkPerms();\n\n // @render\n /** ===== render 渲染 ===== */\n return () => {\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}\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}\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}\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: 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-05-08 15:12:30\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 { ElCascader, useGlobalConfig, type CascaderOption, 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('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 } = useI18n();\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","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: 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-08 10:07:56\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 lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElCol } from 'element-plus';\n import { defineComponent, useAttrs, type PropType } from 'vue';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('col');\n\n export default defineComponent({\n name: 'GvCol',\n inheritAttrs: false,\n\n props: {\n /** 栅格占据列数 */\n span: {\n type: Number,\n default: 24,\n },\n /** 栅格左侧间隔格数 */\n offset: {\n type: Number,\n default: 0,\n },\n /** <768px */\n xs: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n /** ≥768px */\n sm: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n /** ≥992px */\n md: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n /** ≥1200px */\n lg: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n /** ≥1920px */\n xl: {\n type: Number as PropType<number | undefined>,\n default: undefined,\n },\n /** 标签类型 */\n tag: {\n type: String,\n default: 'div',\n },\n /** 是否显示 */\n visible: {\n type: Boolean,\n default: true,\n },\n },\n setup(props, { slots }) {\n const attrs = useAttrs();\n return () => (\n <ElCol\n {...attrs}\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 * @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-08 10:09:09\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 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 /** 栅格间隔 */\n gutter: {\n type: Number,\n default: 0,\n },\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: 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-07 13:49:46\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 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","// 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 * 日期工具函数(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: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 08:51:54\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-07 15:28:33\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\ninterface PickerLike {\n $emit: (event: 'pick', value: any) => void;\n value?: any;\n}\n\nexport interface ShortcutItem {\n text: string;\n onClick: (picker: PickerLike) => void;\n}\n\nconst now = () => new Date();\n\nexport const dateShortcuts: ShortcutItem[] = [\n {\n text: '今天',\n onClick(picker) {\n picker.$emit('pick', now());\n },\n },\n {\n text: '昨天',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 1));\n },\n },\n {\n text: '最近一周',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 7));\n },\n },\n {\n text: '最近30天',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 30));\n },\n },\n {\n text: '本月开始',\n onClick(picker) {\n picker.$emit('pick', monthBegin(now()));\n },\n },\n {\n text: '本季开始',\n onClick(picker) {\n picker.$emit('pick', quarterBegin(now()));\n },\n },\n];\n\nexport const dateShortcutsEn: ShortcutItem[] = [\n {\n text: 'Today',\n onClick(picker) {\n picker.$emit('pick', now());\n },\n },\n {\n text: 'Yesterday',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 1));\n },\n },\n {\n text: 'Last week',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 7));\n },\n },\n {\n text: 'Last 30 days',\n onClick(picker) {\n picker.$emit('pick', daysAgo(now(), 30));\n },\n },\n {\n text: 'Month start',\n onClick(picker) {\n picker.$emit('pick', monthBegin(now()));\n },\n },\n {\n text: 'Season Start',\n onClick(picker) {\n picker.$emit('pick', quarterBegin(now()));\n },\n },\n];\n\nexport const dateTimeShortcuts = dateShortcuts.slice(0, 3);\n\nexport const dateTimeShortcutsEn = dateShortcutsEn.slice(0, 3);\n\nexport const dateRangeShortcuts: ShortcutItem[] = [\n {\n text: '最近一周',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: '最近30天',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: '本月至今',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: '本季至今',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: '今年至今',\n onClick(picker) {\n picker.$emit('pick', [yearBegin(now()), now()]);\n },\n },\n {\n text: '最近六个月',\n onClick(picker) {\n const end = now();\n const start = new Date();\n start.setMonth(start.getMonth() - 6);\n\n picker.$emit('pick', [start, end]);\n },\n },\n];\n\nexport const dateRangeShortcutsEn: ShortcutItem[] = [\n {\n text: 'Last week',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: 'Last 30 days',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: 'Month date',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: 'Season date',\n onClick(picker) {\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 picker.$emit('pick', [start, end]);\n },\n },\n {\n text: 'Year date',\n onClick(picker) {\n picker.$emit('pick', [yearBegin(now()), now()]);\n },\n },\n {\n text: 'Last 6 mon',\n onClick(picker) {\n const end = now();\n const start = new Date();\n start.setMonth(start.getMonth() - 6);\n\n picker.$emit('pick', [start, end]);\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-07 15:42:56\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 { ElDatePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, ref, unref, useAttrs, 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 /** 禁止自动把父组件属性加到子组件根节点 */\n inheritAttrs: false,\n\n props: {\n /** 组件 ref */\n vref: {\n type: String,\n default: '',\n },\n /** 组件 modelValue */\n modelValue: {\n type: [Date, String, Array] as PropType<TDatePickerType>,\n default: undefined,\n },\n /** 组件类型,支持element-plus的type属性 */\n type: {\n type: String,\n default: 'date',\n },\n /** 显示在输入框中的格式 */\n format: {\n type: String,\n default: 'YYYY-MM-DD',\n },\n /** 指定绑定值的格式 */\n valueFormat: {\n type: String,\n default: 'YYYY-MM-DD',\n },\n /** 默认时间 */\n defaultTime: {\n type: Array as PropType<Date[]>,\n default: undefined,\n },\n /** 组件大小 */\n size: {\n type: String as PropType<TDatePickerSize>,\n default: 'small',\n },\n /** 日期范围分隔符 */\n rangeSeparator: {\n type: String,\n default: undefined,\n },\n /** 开始日期占位符 */\n startPlaceholder: {\n type: String,\n default: undefined,\n },\n /** 结束日期占位符 */\n endPlaceholder: {\n type: String,\n default: undefined,\n },\n /** 占位符 */\n placeholder: {\n type: String,\n default: undefined,\n },\n /** 是否可清除 */\n clearable: {\n type: Boolean,\n default: true,\n },\n /** 是否禁用 */\n disabled: {\n type: Boolean,\n default: false,\n },\n /** 禁用日期函数 */\n disabledDateFunc: {\n type: Array as PropType<string[]>,\n default: () => [],\n },\n /** 禁用日期 */\n disabledDate: {\n type: Function as PropType<(date: Date) => boolean>,\n default: undefined,\n },\n /** 是否可编辑 */\n editable: {\n type: Boolean,\n default: true,\n },\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 const { locale, t } = useI18n();\n const attrs = useAttrs();\n const globalSize = useGlobalConfig('size');\n /** 输入框值 */\n const inputValue = ref(props.modelValue);\n /** 日期选择器大小 */\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 /** 监听 modelValue 变化 */\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\n\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 /** 更新值 */\n const handleUpdate = (value: TDatePickerType) => {\n emit('update:modelValue', value);\n };\n /** 变化时触发 */\n const handleChange = (value: TDatePickerType) => {\n emit('change', value);\n };\n /** 失去时触发 */\n const handleBlur = (e: FocusEvent) => {\n emit('blur', e);\n };\n /** 获得焦点时触发 */\n const handleFocus = (e: FocusEvent) => {\n emit('focus', e);\n };\n /** 日期选择器变化时触发,range类型下触发 */\n const handleCalendarChange = (value: any) => {\n emit('pick', value);\n };\n const DatePicker = ElDatePicker as typeof ElDatePicker & DefineComponent<TDatePickerEmits>;\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 {...attrs}\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: 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-05-08 11:13:47\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 { 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: ['setShow'],\n props: {\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 // method\n // method\n /**\n * @todo: click divider\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:33:05\n * @param {*} event\n */\n const handleClick = (event: MouseEvent | TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n if (!props.target) return false;\n\n const el = document.querySelector(`#${props.target}`) as HTMLElement | null;\n if (!el) return;\n const isHidden = el.style.display === 'none';\n // 动画效果\n emit('setShow', isHidden);\n\n // 非动画效果\n // if (target && target.$el)\n // if (target.$el.style.display === 'none')\n // target.$el.style.display = '';\n // else\n // target.$el.style.display = 'none';\n };\n\n return () => (\n <div\n class={prefixCls}\n onClick={(event) => handleClick(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","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-05-08 15:10:06\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 { useI18n } from '@/hook/web/useI18n';\n import { useStyle } from '@/hook/web/useStyle';\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 /** 输入框组件 */\n export default defineComponent({\n name: 'GvInput',\n // ------ define props ------\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n // 输入框值\n modelValue: {\n type: [String, Number] as PropType<string | number>,\n default: '',\n },\n placeholder: {\n type: String,\n default: undefined,\n },\n prefixIcon: {\n type: String,\n default: '',\n },\n suffixIcon: {\n type: String,\n default: '',\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n maxlength: {\n type: Number,\n default: 30,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n readonly: {\n type: Boolean,\n default: false,\n },\n showWordLimit: {\n type: Boolean,\n default: true,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n type: {\n type: String as PropType<InputType>,\n default: 'text',\n },\n rows: {\n type: Number,\n default: 2,\n },\n autosize: {\n type: [Boolean, Object] as PropType<boolean | Record<string, any>>,\n default: false,\n },\n bizType: {\n type: String as PropType<BizType>,\n default: 'tableedit',\n },\n modelModifiers: {\n type: Object as PropType<Record<string, unknown>>,\n default: () => ({}),\n },\n },\n // ------ define emits ------\n /**\n * @todo 输入框事件定义\n * @typedef {Object} GvInputEmits\n * @property {function} update:modelValue - 输入框值改变时触发\n * @property {function} input - 输入框值改变时触发\n * @property {function} blur - 输入框失去焦点时触发\n * @property {function} focus - 输入框获得焦点时触发\n * @property {function} clear - 输入框清空时触发\n * @property {function} keydown - 输入框按下键盘时触发\n */\n emits: ['update:modelValue', 'input', 'blur', 'focus', 'clear', 'keydown'],\n // ------ define setup ------\n setup(props, { emit }) {\n // @data\n const { t } = useI18n();\n /** 输入框大小 */\n const globalSize = useGlobalConfig('size');\n /** 输入框值 */\n const inputValue = ref(props.modelValue);\n\n // @computed\n const inputSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n /** 输入框占位符 */\n const sPlaceholder = computed(() => props.placeholder || t('common.pleaseInput'));\n\n // @watch\n /** 监听modelValue变化 */\n watch(\n () => props.modelValue,\n (newValue) => {\n inputValue.value = newValue;\n },\n );\n\n // @methods\n /**\n * @todo 输入框前缀图标\n * @returns {JSX.Element | null} - 前缀图标节点\n */\n const renderPrefixIcon = (): JSX.Element | null => {\n if (!props.prefixIcon) return null;\n return (\n <GvIcon\n iconName={props.prefixIcon}\n className={props.prefixIcon}\n />\n );\n };\n /**\n * @todo 输入框后缀图标\n * @returns {JSX.Element | null} - 后缀图标节点\n */\n const renderSuffixIcon = (): JSX.Element | null => {\n if (!props.suffixIcon) return null;\n return (\n <GvIcon\n iconName={props.suffixIcon}\n className={props.suffixIcon}\n />\n );\n };\n /**\n * @todo 输入框是否禁用\n * @returns {boolean} - 是否禁用\n * @param {boolean | string} disabled - 是否禁用或禁用字符串 ,默认值为false\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 * @todo 输入框值改变时触发\n * @param {string | number} val - 输入框值\n */\n const handleInput = (val: string | number) => {\n inputValue.value = val;\n emit('update:modelValue', val);\n emit('input', val);\n };\n /**\n * @todo 输入框失去焦点时触发\n * @param {FocusEvent} event - 事件对象\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 * @todo 输入框获得焦点时触发\n * @param {FocusEvent} event - 事件对象\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 * @todo 输入框清空时触发\n * @param {any} event - 事件对象\n */\n const handleClear = (event: any) => {\n emit('clear', event);\n };\n /**\n * @todo 输入框按下键盘时触发\n * @param {KeyboardEvent} event - 事件对象\n */\n const handleKeyDown = (event: KeyboardEvent) => {\n emit('keydown', event);\n };\n\n // @render\n return () => {\n if (!props.visible) return null;\n return (\n <ElInput\n ref={props.vref}\n name={props.name}\n type={props.type}\n v-model={inputValue.value}\n modelModifiers={{ number: true }}\n readonly={props.readonly}\n rows={props.rows}\n autosize={props.autosize}\n size={inputSize.value}\n showWordLimit={props.showWordLimit}\n maxlength={props.maxlength}\n placeholder={sPlaceholder.value}\n disabled={getDisabled.value}\n clearable={props.clearable}\n class={prefixCls}\n style={{ display: props.visible ? '' : 'none' }}\n v-slots={{\n prefix: () => renderPrefixIcon(),\n suffix: () => renderSuffixIcon(),\n }}\n onInput={handleInput}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onClear={handleClear}\n onKeydown={handleKeyDown}\n />\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 }\n\n &.el-input--mini {\n :deep(.el-input__inner) {\n height: 26px;\n line-height: 26px;\n }\n }\n\n :deep(.el-input__suffix .el-input__suffix-inner) {\n .el-input__count {\n .el-input__count-inner {\n padding: 0;\n }\n }\n .el-input__icon {\n padding: 0;\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvInput from './src/GvInput.vue';\n\nconst GvInputPlugin = {\n install(app: App): void {\n app.component(GvInput.name ?? 'GvInput', GvInput);\n },\n};\nexport default GvInputPlugin;\n\nexport { GvInput };\n","<!--\n * @title: input number component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-07 09:32:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-05-08 18:08: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<script lang=\"tsx\">\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 import { useI18n } from 'vue-i18n';\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-05-08 17:46:27\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 { useNotify } from '@/hook/web/useNotify';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { useUserStore } from '@/store/modules/user';\n import { debounce } from '@@/utils/index';\n import { ElOption, ElSelect, useGlobalConfig, type ComponentSize } from 'element-plus';\n import { computed, defineComponent, onMounted, ref, unref, watch, type PropType } from 'vue';\n import { useI18n } from 'vue-i18n';\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('select');\n export default defineComponent({\n name: 'GvSelect',\n props: {\n vref: {\n type: String,\n default: '',\n },\n name: {\n type: String,\n default: undefined,\n },\n value: {\n type: [String, Number, Boolean, Array, Object] as PropType<string | number | boolean | unknown[] | Record<string, unknown>>,\n default: undefined,\n },\n label: {\n type: String,\n default: undefined,\n },\n showLabel: {\n type: [String, Array],\n default: undefined,\n },\n placeholder: {\n type: String,\n default: undefined, // 请选择\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n clearable: {\n type: Boolean,\n default: true,\n },\n multiple: {\n type: Boolean,\n default: false,\n },\n filterable: {\n type: Boolean,\n default: true,\n },\n dicType: {\n type: String,\n required: true,\n },\n filtercode: {\n // 过滤字典码\n type: String,\n default: undefined,\n },\n visible: {\n type: Boolean,\n default: true,\n },\n dicRemote: {\n type: Function,\n default: () => {},\n },\n cb: {\n type: Function,\n default: () => {},\n },\n clear: {\n type: Function,\n default: () => {},\n },\n isreload: {\n type: Boolean,\n default: true,\n },\n columnProp: {\n type: String,\n default: undefined,\n },\n bizType: {\n type: String,\n default: undefined,\n },\n editRow: {\n type: Object,\n default: () => {},\n },\n collapseTags: {\n type: Boolean,\n default: false,\n },\n size: {\n type: String as PropType<ComponentSize>,\n default: undefined,\n },\n },\n // define emit\n emits: ['update:modelValue', 'focus', 'clear', 'change'],\n setup(props, { emit }) {\n const userStore = useUserStore();\n const appStore = useAppStore();\n const { alert } = useNotify();\n const { t, locale } = useI18n();\n\n // @data\n const lang = locale.value;\n let debounceSearch;\n let dicIcon = 'iconfont gv-icon-shujuzidian3';\n const remote = ref(false);\n const loading = ref(false);\n const loadingText = ref('loading...');\n const inputValue = ref(props.value || '');\n const inputShowLabel = ref(props.showLabel);\n const inputFilterable = ref(props.filterable);\n // let inputFilterable = props.filterable,\n const selectValue = ref(props.value);\n const options = ref<DicItem[]>([]);\n const originOptions = ref<DicItem[]>([]);\n const className = ref(`${prefixCls}-select`);\n const globalSize = useGlobalConfig('size');\n // const isTableDic = false; // 是否表选字典\n // @computed\n const selectSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n // @watch value\n watch(\n () => props.value,\n\n (newValue) => {\n inputValue.value = newValue || '';\n selectValue.value = newValue;\n },\n );\n\n // watch showLabel\n watch(\n () => props.showLabel,\n (newVal) => {\n if (inputValue.value) {\n inputShowLabel.value = newVal;\n\n if (inputValue.value !== null && typeof inputValue.value !== 'object')\n selectValue.value = {\n value: inputValue.value,\n\n label: newVal || inputValue.value,\n };\n else selectValue.value = inputValue.value;\n\n const hasOp = options.value.some((x) => {\n if (Array.isArray(inputValue.value))\n return inputValue.value.some((ele: any) => {\n if (typeof ele === 'object') return ele.value + '' === x.c + '';\n else return ele + '' === x.c + '';\n });\n else return x.c + '' === inputValue.value + '';\n });\n\n if (hasOp === false)\n if (!Array.isArray(inputValue.value)) {\n const op: any = {};\n op['c'] = inputValue.value + '';\n op['t'] = newVal;\n options.value.push(op);\n } else\n // 多选\n inputValue.value.forEach((x: any, index: number) => {\n const op: any = {};\n op['c'] = x.value + '';\n if (newVal) op['t'] = newVal[index];\n else op['t'] = x.label;\n options.value.push(op);\n });\n }\n },\n );\n\n // @method\n /**\n * @todo: load dict list\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:31:44\n */\n const getSelectOptions = async () => {\n if (!props.dicType) return null;\n else {\n let ret: DicItem[] = [];\n const src = props.dicType.toLowerCase();\n if (src.startsWith('e#')) {\n // const pinyin = await require('js-pinyin');\n // 生成枚举类型字典\n const arr = src.split('#')[1].split(':');\n arr.forEach((x) => {\n const xx: DicItem = {\n c: '',\n t: '',\n s: '',\n };\n const arr2 = x.split('=');\n xx['c'] = arr2[0];\n xx['t'] = arr2[1];\n xx['s'] = '';\n ret.push(xx);\n });\n return ret;\n } else {\n const dictCache = userStore.dictCache?.[src];\n if (props.filtercode === undefined && dictCache) ret = dictCache;\n else if (props.dicType === 'xzqh') {\n // 生成字典列表\n const dict = appStore.getDictDivision;\n if (dict) {\n if (props.filtercode === undefined) {\n const cache = {};\n cache['key'] = 'xzqh';\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n }\n ret = dict;\n }\n } else {\n const dict = appStore.getDict[src];\n\n if (dict) {\n // fixme: 解决字典缓存不能缓存多个问题 2022-04-13\n if (props.filtercode === undefined) {\n const cache = {};\n cache['key'] = src;\n cache['dict'] = dict;\n userStore.addDictCache(cache as { key: string; dict: DicItem[] });\n }\n\n ret = dict;\n }\n }\n\n // 设置是否可搜索\n // this.setFilterable(ret);\n // 增加字典码过滤\n let opts = ret;\n if (props.filtercode) {\n const reg = new RegExp(props.filtercode, 'i');\n opts = ret.filter((x) => reg.test(x.c));\n }\n return opts;\n }\n }\n };\n /**\n * @todo: 设置字典项目超过5个可搜索-- 弃用\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-10 09:42:19\n * @param {*} dict\n */\n // setFilterable(dict) {\n // if (dict && dict.length > 5)\n // inputFilterable.value = true;\n // },\n // 回调参数:(value: string | number)\n // 字典自定义过滤方法\n const filterMethod = (value) => {\n if (value)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts.filter((item) => {\n // console.log(item);\n if (\n item.c.indexOf(value) !== -1 || // value检索\n item.t.indexOf(value) !== -1 || // label检索\n item.s.indexOf(value.toLowerCase()) !== -1 // 简拼检索\n )\n return true;\n });\n });\n else\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n };\n /**\n * @todo: handle clear event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:27\n * @param {*} event\n */\n const handleClear = (event) => {\n // add: 解决回车选中搜索字典后,清空无法重新加载问题 2022-04-10\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n options.value = _opts;\n });\n else options.value = originOptions.value;\n props.clear(selectValue, props.vref, props.dicType);\n emit('clear', event);\n };\n /**\n * @todo: remote dict search method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:20:03\n * @param {*} query\n */\n const remoteDictSearch = async (query?: string): Promise<void> => {\n const sDicType = props.dicType.substring(2); // 去掉T#\n // if (this.options.length === 0) { // 远程查询\n const { datas } = await props.dicRemote(sDicType, query, props.editRow);\n const ops = [];\n try {\n JSON.parse(datas).forEach((x) => {\n const op = {};\n op['c'] = x.c;\n op['t'] = x.t;\n (ops as DicItem[]).push(op as DicItem);\n });\n } catch (e) {\n // throw e\n console.log(e);\n }\n\n options.value = ops;\n if (originOptions.value.length === 0) originOptions.value = ops;\n // }\n };\n /**\n * @todo: table dict remote load method\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:11:51\n * @param {*} query\n */\n const remoteMethod = async (query?: string): Promise<void> => {\n loading.value = true;\n // fixme: 如果有初始化默认值,则仍需要查询表选重新查询 2022-07-08\n let defaultValFlag = false;\n if (unref(inputValue)) defaultValFlag = true;\n if (props.isreload === true || options.value.length === 0 || defaultValFlag === true) {\n // 远程查询\n options.value = originOptions.value.filter((x) => {\n // 结果集过滤\n if (x.t) {\n const f = x.t.split(']');\n if (query && f[0].indexOf(query) !== -1) return true;\n }\n if (x.c) if (query && x.c.indexOf(query) !== -1) return true;\n });\n if (options.value.length === 0)\n options.value = options.value.filter((x) => {\n if (x.t) {\n const f = x.t.split(']');\n if (query && f[0].indexOf(query) !== -1) return true;\n }\n if (x.c) if (query && x.c.indexOf(query) !== -1) return true;\n });\n // if (this.options.length === 0)\n await remoteDictSearch(query);\n } else if (query) {\n options.value = originOptions.value.filter((x) => {\n if (x.t) {\n const f = x.t.split(']');\n if (f[0].indexOf(query) !== -1) return true;\n }\n if (x.c) if (x.c.indexOf(query) !== -1) return true;\n });\n if (options.value.length === 0)\n options.value = options.value.filter((x) => {\n if (x.t) {\n const f = x.t.split(']');\n if (f[0].indexOf(query) !== -1) return true;\n }\n if (x.c) if (x.c.indexOf(query) !== -1) return true;\n });\n // if (this.options.length === 0)\n await remoteDictSearch(query);\n } else options.value = originOptions.value;\n if (!query)\n if (options.value.length === 0) {\n loading.value = true;\n loadingText.value = t('common.noData');\n } else {\n loading.value = false;\n loadingText.value = t('common.loading');\n }\n else loading.value = false;\n };\n /**\n * @todo: handle focus event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 10:53:35\n * @param {*} event\n */\n const handleFocus = (event: FocusEvent) => {\n // this.inputShowLabel = '';\n if (remote.value === false)\n getSelectOptions().then((_opts: DicItem[]) => {\n if (remote.value === false)\n if (_opts === undefined || _opts === null || _opts.length === 0) {\n alert('The dict value does not exist', 'warning');\n return false;\n }\n options.value = _opts;\n });\n else if (props.isreload === true || originOptions.value.length === 0)\n // else if (this.isreload === true)\n remoteMethod();\n else if (originOptions.value.length) options.value = originOptions.value;\n emit('focus', event);\n };\n\n /**\n * @todo: handle visible change event\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:25:38\n * @param {*} val\n */\n const handleVisibleChange = () => {\n // console.log(val);\n };\n\n const handleBlur = () => {\n // // add: 解决无法重新加载问题 2022-04-10\n // if (this.remote === false)\n // this.getSelectOptions().then((_opts) => {\n // this.options = _opts;\n // });\n // else\n // this.options = this.originOptions;\n };\n\n /**\n * @todo: render select option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:37:58\n * @param {*} x\n */\n const renderSelectOption = (x) => {\n let t = x.t;\n switch (lang) {\n case 'zh':\n t = x.t;\n break;\n case 'en':\n t = x.e;\n break;\n case 'l1':\n t = x.l1;\n break;\n case 'l2':\n t = x.l2;\n break;\n default:\n t = x.t;\n break;\n }\n if (!t) t = x.t;\n return (\n <ElOption\n key={x.c + ''}\n label={t}\n // value={x.c}\n value={{ value: x.c + '', label: t }} // update: 增加字典值和代码的双返回值 2022-04-16\n // value={this.inputShowLabel ? x.c : { value: x.c, label: x.t }} // update: 增加字典值和代码的双返回值 2022-04-16\n >\n <span class=\"ht-select__option--label\">{t}</span>\n <span class=\"ht-select__option--value\">{x.c}</span>\n </ElOption>\n );\n };\n\n /**\n * @todo: render table option\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:44:34\n * @param {*} x\n */\n const renderTableOption = (x) => {\n const t = x.t;\n let val = t;\n const columns: string[] = [];\n const row = {};\n let multiColumn = false;\n if (t) {\n if (t.indexOf('[') !== -1) {\n // 多列显示\n multiColumn = true;\n const v1 = t.split('[');\n val = v1[0];\n let mm = v1[1];\n mm = mm.split(']')[0];\n const m2 = mm.split(',');\n for (let i = 0; i < m2.length; i++) {\n const m3 = m2[i];\n const m4 = m3.split(':');\n row[m4[0]] = m4[1];\n columns.push(`<span class=\"gv-select__option--column\">${m4[1] === 'null' ? ' -- ' : m4[1]}</}</span>`);\n }\n }\n if (t.indexOf('{') !== -1) {\n // 隐藏列\n const vv1 = t.split('{');\n if (multiColumn === false) val = vv1[0];\n let mmm = vv1[1];\n mmm = mmm.split('}')[0];\n const mm2 = mmm.split(',');\n for (let i = 0; i < mm2.length; i++) {\n const mm3 = mm2[i];\n const mm4 = mm3.split(':');\n row[mm4[0]] = mm4[1];\n }\n }\n }\n let key = x.c + '';\n if (props.multiple === true) key = x.val === undefined ? x.c + '' : x.val;\n // let dv = x.c;\n // if (typeof this.inputValue === 'object')\n // dv = { value: x.c, label: val, row: row };\n // else if (this.showLabel === undefined || this.showLabel === '')\n // if (this.bizType !== 'tableedit')\n // dv = { value: x.c, label: val, row: row };\n return (\n <ElOption\n // key = {x.c}\n key={key}\n label={val}\n // value = {dv}\n // value={this.showLabel ? dv : { value: x.c, label: val, row: row }}\n value={{ value: x.c + '', label: val, row: row }}>\n <span class=\"ht-select__option--label\">{val}</span>\n <span class=\"ht-select__option--value\">{x.c}</span>\n {columns}\n </ElOption>\n );\n };\n\n /**\n * @todo: selected call back\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-06 11:27:07\n * @param {*} val\n */\n const handleChange = async (val: any) => {\n // if (typeof val === 'object')\n // this.inputLabel = val.label;\n // fixme: 解决清空后调用回调方法报错问题 2022-07-26\n let labels: string = '';\n const labelArr: string[] = [];\n if (val !== '') {\n if (props.multiple === true)\n // 多选\n options.value.forEach((x) => {\n if (Array.isArray(val) && val.some((ele) => ele === x.c)) labelArr.push(x.t);\n });\n else if (val !== null && typeof val === 'object') labels = val.label;\n else {\n const opArr = options.value.filter((x) => {\n const v = val + '';\n return x.c + '' === v;\n });\n labels = opArr[0].t;\n if (labels) labels = labels.split('[')[0];\n }\n if (props.bizType === 'tableedit')\n if (props.multiple === true) {\n emit('change', val, labelArr, props.columnProp);\n await props.cb(val, props.columnProp, props.dicType, labelArr, props.editRow);\n } else {\n emit('change', val, labels, props.columnProp);\n await props.cb(val, props.columnProp, props.dicType, labels, props.editRow);\n }\n else if (props.multiple === true) {\n emit('change', val, labelArr);\n await props.cb(val, props.vref, props.dicType);\n } else {\n emit('change', val, labels);\n await props.cb(val, props.vref, props.dicType);\n }\n }\n };\n /**\n * @todo: handle update modelValue\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-05-08 11:29:17\n * @param {*} value\n */\n const handleUpdate = (value: any): void => {\n inputValue.value = value;\n emit('update:modelValue', value);\n };\n\n // created\n // if (props.dicType.startsWith('t#')) isTableDic = true;\n if (remote.value === true) className.value = 'gv-select__table';\n if (props.bizType === 'tableedit') className.value += ' tableedit';\n\n // 不采用初始化时全部加载方式,有默认值情况单独生成\n if (inputValue.value)\n if (!Array.isArray(inputValue)) {\n const op = {};\n op['c'] = inputValue.value + '';\n op['t'] = props.showLabel || inputValue;\n if (inputValue.value !== null && typeof inputValue.value !== 'object') selectValue.value = { value: inputValue.value + '', label: props.showLabel || inputValue.value + '' };\n else selectValue.value = inputValue.value;\n options.value.push(op as DicItem);\n } else {\n // 多选模式\n selectValue.value = [];\n (inputValue.value as unknown[]).forEach((x, index) => {\n if (x !== '') {\n const op = {};\n if (typeof x === 'object' && x !== null && 'value' in x) op['c'] = (x as { value: string }).value + '';\n else op['c'] = x + '';\n if (props.showLabel) op['t'] = props.showLabel[index];\n // fixme: 解决多选字典默认值不正确问题 2022-10-12\n if (selectValue.value && Array.isArray(selectValue.value)) selectValue.value.push({ value: op['c'] + '', label: op['t'] || op['c'] });\n options.value.push(op as DicItem);\n }\n // if (this.bizType === 'tableedit')\n // console.log(this.options);\n });\n }\n\n // mounted\n onMounted(() => {\n // 防抖处理\n debounceSearch = debounce(remoteMethod, 500);\n // add: 设置字典icon 2022-04-12\n if (props.dicType === undefined || props.dicType === null) {\n alert(`[ ${props.label} ] - The dicType needs to be set`, 'warning');\n return;\n } else {\n const src = props.dicType.toLowerCase();\n if (src.startsWith('e#')) dicIcon = 'iconfont gv-icon-meiju';\n else if (src.startsWith('t#')) {\n dicIcon = 'iconfont gv-icon-24gl-table';\n remote.value = true;\n }\n }\n });\n\n // render\n return () => {\n // console.log(props.visible);\n const render =\n remote.value === false ? (\n <ElSelect\n ref=\"gv-select\"\n name={props.name}\n v-model={selectValue.value}\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={props.placeholder}\n disabled={props.disabled}\n clearable={props.clearable}\n size={selectSize.value}\n multiple={props.multiple}\n filterable={inputFilterable.value}\n filter-method={filterMethod}\n default-first-option={true}\n collapseTags={props.collapseTags}\n onClear={handleClear}\n onFocus={handleFocus}\n onVisible-change={handleVisibleChange}\n onChange={handleChange}\n class={className.value}>\n <i\n v-slots={{ prefix: () => <i class={dicIcon}></i> }}\n class={dicIcon}></i>\n {options.value.map((x) => renderSelectOption(x))}\n </ElSelect>\n ) : (\n <ElSelect\n ref=\"gv-select\"\n name={props.name}\n v-model={selectValue.value}\n onUpdate:modelValue={handleUpdate}\n style={{ display: props.visible ? '' : 'none' }}\n placeholder={props.placeholder}\n disabled={props.disabled}\n clearable={props.clearable}\n multiple={props.multiple}\n default-first-option={true}\n onClear={handleClear}\n collapseTags={props.collapseTags}\n onFocus={handleFocus}\n onBlur={handleBlur}\n filterable={inputFilterable.value}\n remote={true}\n remote-method={(query) => debounceSearch(query)}\n loading={loading.value}\n loading-text={loadingText}\n onChange={handleChange}\n class={className.value}>\n <i\n v-slots={{ prefix: () => <i class={dicIcon}></i> }}\n class={dicIcon}></i>\n {options.value.map((x) => renderTableOption(x))}\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-input) {\n &.is-focus {\n .el-input__inner {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n .el-input__prefix {\n left: 5px !important;\n width: 25px !important;\n\n .iconfont {\n font-size: $appTextSize;\n }\n }\n\n .el-input__inner {\n height: 30px;\n line-height: 30px;\n }\n }\n\n &.tableedit {\n :deep(.el-input) {\n .el-input__inner {\n height: 26px;\n padding-right: 5px !important;\n font-size: $appTextSize;\n line-height: 26px;\n }\n\n .el-input__suffix {\n width: 0;\n }\n }\n }\n }\n\n .#{$gvNamespace}-select__table {\n vertical-align: middle; // fixme: 注意必须有这个参数,否则作为一行最后的列会导致串行\n :deep(.el-input) {\n .el-input__prefix {\n left: 5px !important;\n width: 25px !important;\n\n .iconfont {\n font-size: $appTextSize;\n }\n }\n\n .el-input__inner {\n height: 30px;\n line-height: 30px;\n }\n\n &.is-focus .el-input__inner {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n\n &.tableedit {\n :deep(.el-input) {\n .el-input__inner {\n height: 26px;\n line-height: 26px;\n }\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: 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-05-08 10:10:26\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 lang=\"tsx\">\n import { useStyle } from '@/hook/web/useStyle';\n import { ElTimePicker, useGlobalConfig, type ComponentSize } from 'element-plus';\n import type { DefineComponent, PropType } from 'vue';\n import { computed, defineComponent, ref, unref, useAttrs, watch } from 'vue';\n import { useI18n } from 'vue-i18n';\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 inheritAttrs: false,\n\n props: {\n /** ref名称 */\n vref: {\n type: String,\n default: '',\n },\n /** name */\n name: {\n type: String,\n default: undefined,\n },\n /** v-model */\n modelValue: {\n type: [Date, Array, String] as PropType<TTimePickerType>,\n default: undefined,\n },\n /** 只读 */\n readonly: {\n type: Boolean,\n default: false,\n },\n /** 禁用 */\n disabled: {\n type: Boolean,\n default: false,\n },\n /** 尺寸 */\n size: {\n type: String as PropType<TTimePickerSize>,\n default: 'small',\n },\n /** 是否范围 */\n isRange: {\n type: Boolean,\n default: false,\n },\n /** 禁用小时 */\n disabledHours: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n /** 禁用分钟 */\n disabledMinutes: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n /** 禁用秒 */\n disabledSeconds: {\n type: Array as PropType<number[]>,\n default: () => [],\n },\n /** 范围分隔符 */\n rangeSeparator: {\n type: String,\n default: '-',\n },\n /** 展示格式 */\n format: {\n type: String,\n default: 'HH:mm',\n },\n /** 值格式 */\n valueFormat: {\n type: String,\n default: 'HH:mm',\n },\n /** 占位符 */\n placeholder: {\n type: String,\n default: '00:00',\n },\n /** 开始占位符 */\n startPlaceholder: {\n type: String,\n default: '',\n },\n /** 结束占位符 */\n endPlaceholder: {\n type: String,\n default: '',\n },\n /** 是否可编辑 */\n editable: {\n type: Boolean,\n default: true,\n },\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 const { t } = useI18n();\n const attrs = useAttrs();\n const globalSize = useGlobalConfig('size');\n /** v-model内部值 */\n const inputValue = ref<TTimePickerType>(props.modelValue);\n /** 日期选择器大小 */\n const timepickerSize = computed<ComponentSize | undefined>(() => (props.size ?? unref(globalSize)) as ComponentSize);\n /** 同步外部值 */\n watch(\n () => props.modelValue,\n (newVal) => {\n inputValue.value = newVal;\n },\n );\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 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 {...attrs}\n />\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-timepicker';\n .#{$prefixCls} {\n width: 100%;\n vertical-align: middle;\n :deep(.el-icon-time) {\n margin-left: 1px;\n }\n &.el-range-editor.is-active {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n :deep(.el-input__wrapper) {\n &:is(.is-focus) {\n box-shadow: 0 0 0 1px var(--primaryColorHover, $primaryColorHover) inset;\n }\n }\n :deep(.el-input__inner) {\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n :deep(.el-range__close-icon) {\n width: 20px;\n }\n :deep(.el-range-separator) {\n padding-right: 2px;\n padding-left: 0;\n }\n :deep(.el-range-input) {\n padding-left: 5px;\n text-align: left;\n &:focus {\n border-color: var(--primaryColorHover, $primaryColorHover);\n }\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvTimePicker from './src/GvTimePicker.vue';\n\nconst GvTimePickerPlugin = {\n install(app: App): void {\n app.component(GvTimePicker.name ?? 'GvTimePicker', GvTimePicker);\n },\n};\nexport default GvTimePickerPlugin;\n\nexport { GvTimePicker };\n","/*\n * @title: info message component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:10:05\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-04-28 16:11:10\n * @version: 1.0.1\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nconst infoMsg = {\n carNo: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '车牌号格式错误';\n else info = 'car number format error.';\n return info;\n },\n double: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入浮点数.';\n else info = 'please enter Double.';\n return info;\n },\n decimal: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh') info = '小数点位数不能超过: ' + len + ' 位';\n else info = 'Number of decimal places can not be more than:' + len + '.';\n return info;\n },\n idCard: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '身份证格式不正确';\n else info = 'id card format is not correct.';\n return info;\n },\n maxLen: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh') info = '不能超过 ' + Math.floor(len / 2) + '个汉字或 ' + len + ' 个字符';\n else info = 'Can not exceed ' + len + ' character.';\n return info;\n },\n money: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '非0开头的数字 小数最多两位.';\n else info = \"Only input Numbers, 0 can't start, the decimal two at the most.\";\n return info;\n },\n moneyMax: (lang: string, len: number) => {\n let info = '';\n if (lang === 'zh') info = '整数位最多只能是: ' + len + ' 位';\n else info = 'integer digits can only be at most: ' + len;\n return info;\n },\n letter: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '不能输入字母以外的字符';\n else info = \"Can't input letters outside of the characters.\";\n return info;\n },\n number: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '只能输入正整数.';\n else info = 'Only enter a positive integer.';\n return info;\n },\n number0: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '只能输入不能以0开头的正整数.';\n else info = 'Only enter a non-zero positive integer, and cannot begin with zero.';\n return info;\n },\n //Add TypeScript type annotations for lang parameter\n numberLetter: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '不能输入数字、字母以外的字符.';\n else info = 'Can not input Numbers, letters characters.';\n return info;\n },\n //Add TypeScript type annotations for lang parameter\n name: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '不能输入数字、字母、-、_和中文以外的字符.';\n else info = 'Can not enter Numbers, letters, -, _ and Chinese characters.';\n return info;\n },\n phone: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '电话号码格式不正确.';\n else info = 'Phone format is not correct.';\n return info;\n },\n email: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '邮件格式不正确.';\n else info = 'E-mail format is not correct.';\n return info;\n },\n telephone: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入正确的固话(格式:区号+号码,如010-1234567)';\n else info = 'Telephone format is not correct.';\n return info;\n },\n ip: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入正确的IP地址';\n else info = 'IpAddress format is not correct.';\n return info;\n },\n url: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入正确的url地址';\n else info = 'Url format is not correct.';\n return info;\n },\n phoneTel: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入正确的电话号码或者固话号码';\n else info = 'phone & tel format is not correct.';\n return info;\n },\n vin: (lang: string) => {\n let info = '';\n if (lang === 'zh') info = '请输入后8位或17位(字母大写)';\n else info = 'must be 8 or 17 letters and Numbers.';\n return info;\n },\n};\nexport default infoMsg;\n","/*\n * @title: validate rules component\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 16:09:03\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-04-28 16:13:48\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/** ------------------- 验证规则 ------------------------\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 /**\n * @todo: 校验长度是否符合\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 14:48:17\n */\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 /**\n * @todo: 验证浮点数格式\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:54:58\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isDouble: (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 /**\n * @todo: 验证身份证号\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:54:58\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isIdcard: (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 /**\n * @todo: 验证车牌号(含新能源)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:55:38\n * @param {*} handle\n */\n isCarno: (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 /**\n * @todo: 验证金额格式(不能以0开头,小数点只能是2位)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 15:38:24\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 * @todo: 验证带千位符金额格式\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:48:15\n * @param {*} str\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 * @todo: 验证是否都是字母( 不包括标点符号)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:48:15\n * @param {*} str\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 * @todo: 验证是否是整数数字\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\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 * @todo: 验证是否是整数数字(不能以0开始)\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\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 * @todo: 验证是否数字和字母\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\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 * @todo: 验证是否数字和字母\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:30:29\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 /**\n * @todo: 验证电话号码\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:41:04\n * @param {*} phone\n */\n isPhone: (rule, value, callback) => {\n if (value === '' || value === undefined || value == null) callback();\n else {\n const reg = /^1([38][0-9]|4[014-9]|[59][0-35-9]|6[2567]|7[0-8])\\d{8}$/;\n if (!reg.test(value)) {\n const { language = 'zh' } = rule;\n callback(new Error(infoMsg.phone(language)));\n } else callback();\n }\n },\n\n /**\n * @todo: 验证是否email\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:40:50\n * @param {*} email\n */\n isEmail: (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 * @todo: 验证是否是固定电话\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-27 19:39:10\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 * @todo: 验证手机号码或者固话\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:51:38\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isPhoneTel: (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 * @todo: 验证是否是ip地址\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:50:44\n * @param {*} rule\n * @param {*} value\n * @param {*} callback\n */\n isIp: (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 * @todo: 验证是否是url\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-04-06 12:42:31\n * @param {*} url\n */\n isUrl: (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 * @todo: 验证vin\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2022-05-01 19:31:14\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-05-08 17:12:16\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 { useUserStore } from '@/store/modules/user';\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, reactive, ref, unref, watch, type PropType, type VNode } from 'vue';\n import { useI18n } from 'vue-i18n';\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,\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 }) {\n // @provide\n provide('refForm', props.refForm);\n provide('formList', props.formList);\n\n // @data\n const appStore = useAppStore();\n const userStore = useUserStore();\n const { t } = useI18n();\n\n let originFormList = reactive([]);\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 // 暴露方法给父组件\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 let model = reactive({}); // 表单数据,默认空对象\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 // method\n const getLanguage = (lang: string, x: any) => {\n // console.log(x);\n let v = '';\n switch (lang) {\n case 'zh':\n v = x.t;\n break;\n case 'en':\n v = x.e;\n break;\n case 'l1':\n v = x.l1;\n break;\n case 'l2':\n v = x.l2;\n break;\n default:\n v = x.t;\n break;\n }\n if (!v) v = x.t;\n return v;\n };\n /**\n * @todo: set divider show status\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 18:12:34\n * @param {*} show\n */\n const setDividerShow = (show: boolean) => {\n isShow.value = show;\n };\n\n const getEditBar = computed(() => {\n if (slots.editbar?.())\n return (\n <ElRow\n ref-form={props.refForm}\n class=\"gv-form-editbar\">\n {slots.editbar?.()}\n </ElRow>\n );\n else return null;\n });\n\n const getDivider = computed(() => {\n let dividerRender: VNode | null = null;\n if (searchDivider.value !== false) {\n let dividerTitle: string;\n if (props.divider) dividerTitle = props.divider;\n else dividerTitle = t('common.dividerTitle');\n if (props.isDivider)\n dividerRender = (\n <GvDivider\n label={dividerTitle}\n target={props.refForm}\n onSetShow={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[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[field + '-end']) {\n const endTime = new Date(model[field + '-end']).getTime();\n const startTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model[field + '-end'] = '';\n model[1] = 'null';\n }\n }\n\n if (type === 'e')\n if (val && model[field + '-start']) {\n const startTime = new Date(model[field + '-start']).getTime();\n const endTime = new Date(val).getTime();\n if (startTime >= endTime) {\n model[field + '-start'] = '';\n // console.log(this.model);\n model[1] = 'null';\n }\n }\n\n if (!field) return;\n const datePicker = model[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[field] = datePicker.join(',');\n } else {\n if (datePicker) dateArr = datePicker.split(',');\n dateArr[0] = model[field + '-start'];\n dateArr[1] = model[field + '-end'];\n if (!dateArr[0]) dateArr[0] = 'null';\n if (!dateArr[1]) dateArr[1] = 'null';\n model[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[field] = '100201';\n else model[field] = '100202';\n break;\n case 'sf':\n if (val === true) model[field] = '100101';\n else model[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, cb) => {\n if (cb)\n try {\n await cb(val, field, dicType);\n } catch (error) {\n console.log(error);\n }\n };\n /**\n * @todo: render form item\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2026-04-28 17:54:23\n * @param {*} _item\n * @param {*} _index\n */\n const renderFormItem = (_item: FormItem, _index: number): VNode => {\n const {\n type = 'text',\n label,\n field,\n hidden = false,\n disabled,\n format = [],\n placeholder,\n readonly = false,\n dateType = 'date',\n dicType,\n filtercode,\n colspan = 1,\n disabledDateFunc,\n disabledDate,\n editable = true,\n multiple = false,\n showLabel,\n size = formSize.value,\n visible = true,\n // offset,\n createRow = false, // 是否创建新row,\n dicRemote,\n cb, // 回调方法\n clear, // 清空回调\n rows, // textarea\n autosize, // textarea\n min, // input-number\n max, // input-number\n step, // input-number\n precision, // input-number\n blur = () => {},\n suffixIcon, // 后缀icon\n prefixIcon, // 前缀icon\n focus = () => {},\n change = () => {},\n defaultTime, // 时间的默认能够选择的时间\n isreload = true, // 表选字典是否重新加载\n options = [],\n lazy = false, // cascader是否懒加载\n lazyLoad = () => {}, // cascader懒加载方法\n render, // 自定义form样式\n } = _item;\n let renders;\n const isHidden = hidden === true;\n const maxLen = format[2] || 30;\n let cType = type;\n // const dateFormatConfig = dateFormatConfig;\n const validateRule = toHump(String(format[1] || ''));\n let sDateType = dateType;\n let isRange = false;\n let dateFormat = dateFormatConfig.date.valueFormat; // 日期显示格式\n let valueFormat = dateFormatConfig.date.valueFormat; // 日期绑定值格式\n if (sDateType !== 'daterange' && sDateType !== 'datetimerange' && sDateType !== 'daterange2' && sDateType !== 'datetimerange2') {\n if (validateRule === 'isDate') cType = 'date';\n if (validateRule === 'isDateTime') {\n cType = 'datetime';\n sDateType = 'datetime';\n }\n if (validateRule === 'isTime') cType = 'time';\n }\n\n if (sDateType === 'timerange') isRange = true;\n\n let ph = placeholder;\n let startPh = t('common.startDate');\n let endPh = t('common.endDate');\n // todo: 响应式布局计算\n // const cols = { span: colspan, offset: (_index) * 6 };\n let cols = colspan > 4 ? 4 : colspan; // fixme: 最大值不能超过4 2022-04-07\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') cols = 2;\n // update: 对于多选字典,默认占用列数为2列 2023-02-18\n if (multiple === true && colspan === undefined) cols = 2;\n let rangeSeparator;\n if (sDateType === 'timerange' || sDateType === 'daterange2' || sDateType === 'datetimerange2') rangeSeparator = t('common.until');\n const colSpanXs = 24;\n let colSpanSm = 12;\n let colSpanMd = 8;\n\n let colSpanLg = 6;\n if (isDialog.value === true) colSpanLg = 8;\n let colSpanXl = 4;\n if (isDialog.value === true) colSpanXl = 6;\n if (colSpanNums.value !== 0) {\n if (colSpanNums.value === 12) cols = colspan > 2 ? 2 : colspan;\n if (colSpanNums.value === 8) cols = colspan > 3 ? 3 : colspan;\n if (colSpanNums.value === 6 || colSpanNums.value === 4) cols = colspan > 4 ? 4 : colspan;\n colSpanSm = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanMd = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanLg = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n colSpanXl = cols * colSpanNums.value > 24 ? 24 : cols * colSpanNums.value;\n } else {\n colSpanSm = cols * colSpanSm > 24 ? 24 : cols * colSpanSm;\n colSpanMd = cols * colSpanMd > 24 ? 24 : cols * colSpanMd;\n colSpanLg = cols * colSpanLg > 24 ? 24 : cols * colSpanLg;\n colSpanXl = cols * colSpanXl > 24 ? 24 : cols * colSpanXl;\n }\n let decimal = 2;\n let v = '';\n if (!ph)\n switch (validateRule) {\n case 'isMoney':\n ph = '0.00';\n break;\n case 'isBigMoney':\n ph = '0,000.00';\n break;\n case 'isEmail':\n ph = 'xx@xx.com';\n break;\n case 'isDouble':\n if (format.length >= 4) decimal = format[3] || 2;\n while (decimal > 0) {\n v = '0' + v;\n decimal--;\n }\n ph = '00.' + v;\n break;\n case 'isDate':\n if (sDateType === 'week') {\n ph = t('common.selectWeek'); // dateFormatConfig.week.placeholder;\n dateFormat = dateFormatConfig.week.dateFormat;\n } else if (sDateType === 'month' || sDateType === 'monthrange') {\n ph = t('common.selectMonth'); // dateFormatConfig.month.placeholder;\n startPh = ph;\n endPh = ph;\n dateFormat = dateFormatConfig.month.dateFormat;\n valueFormat = dateFormatConfig.month.valueFormat;\n } else if (sDateType === 'year') {\n ph = t('common.selectYear'); // dateFormatConfig.year.placeholder\n dateFormat = dateFormatConfig.year.dateFormat;\n valueFormat = dateFormatConfig.year.valueFormat;\n } else if (sDateType === 'daterange' || sDateType === 'daterange2') ph = t('common.selectDate');\n break;\n case 'isDateTime':\n if (sDateType === 'datetimerange' || sDateType === 'datetimerange2') {\n startPh = t('common.startTime');\n endPh = t('common.endTime');\n }\n ph = t('common.selectTime'); // dateFormatConfig.datetime.placeholder;\n dateFormat = dateFormatConfig.datetime.dateFormat;\n valueFormat = dateFormatConfig.datetime.valueFormat;\n break;\n }\n let editables = editable;\n // 如果是带有禁用日期的,不可编辑,防止输入不一致问题\n if (disabledDateFunc || disabledDate) editables = false;\n let ops;\n let isTableDic = false;\n if (type === 'dic')\n if (dicType) {\n ops = getDictItems(dicType);\n if (dicType.indexOf('t#') >= 0) isTableDic = true;\n }\n\n // 设置label是否显示\n let sLabel = label;\n if (formType.value === 's') {\n sLabel = appStore.searchFormLabel === true ? label : undefined;\n if (appStore.searchFormLabel !== true) ph = label;\n }\n\n let switchDefaultVal;\n switch (cType) {\n case 'blank':\n renders = (\n <ElCol\n key={_index}\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 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 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[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 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[field]}\n content={model[field] ? model[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvInput\n type=\"text\"\n vref={field}\n name={field}\n v-model={model[field]}\n modelValue={model[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 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[field]}\n content={model[field] ? model[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvInput\n vref={field}\n name={field}\n type=\"textarea\"\n v-model={model[field]}\n modelValue={model[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 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[field]}\n content={model[field] ? model[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvTimePicker\n v-model={model[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 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[field]}\n modelValue={model[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 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[field + '-start']}\n modelValue={model[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[field + '-end']}\n modelValue={model[field + '-end']}\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[field + '-start']).getTime() - 8.64e7;\n else return date.getTime() <= new Date(model[field + '-start']).getTime() - 8.64e7;\n }}\n editable={editables}\n placeholder={endPh}\n default-time={defaultTime}\n data-visible={visible}\n class=\"gv-datepicker-range-end\"\n onChange={(val) => handleDateRange2Change('e', val, field)}\n onFocus={(vm) => handleDateRange2Focus(vm)}\n onBlur={(vm) => handleDateRange2Blur(vm)}\n />\n </div>\n </ElFormItem>\n </ElCol>\n ) : null;\n break;\n case 'dic':\n switch (dicType) {\n case 'yxzt':\n switchDefaultVal = model[field] ? model[field] : '100201';\n break;\n case 'sf':\n switchDefaultVal = model[field] ? model[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 style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <GvSwitch\n value={switchDefaultVal}\n columnKey={field}\n disabled={disabled}\n target={dicType === 'yxzt' ? '100201' : '100101'}\n onChange={(val) => handleSwitchDictChange(val, field, dicType, cb)}></GvSwitch>\n </ElFormItem>\n </ElCol>\n ) : null;\n else if (isTableDic === false && multiple === false && formType.value === 'e' && ops && ops.length === 2)\n // 当是编辑form并且字典内容只有2个以内时\n renders = visible ? (\n <ElCol\n key={_index}\n style={{ display: isHidden ? 'none' : '' }}\n xs={colSpanXs}\n sm={colSpanSm}\n md={colSpanMd}\n lg={colSpanLg}\n xl={colSpanXl}>\n <ElFormItem\n label={sLabel}\n prop={field}\n key={field}>\n <ElRadioGroup\n v-model={model[field]}\n on-change={(val) => handleRadioDictChange(val, field, dicType, cb)}>\n {ops.map((x) =>\n format[0] === 0 ? (\n <ElRadio\n label={x.c}\n disabled={disabled}\n onChange={(event) => handleRadioInput(event, field, x.c, model[field], disabled)}>\n {getLanguage(userStore.language, x)}\n </ElRadio>\n ) : (\n <ElRadioButton\n label={x.c}\n disabled={disabled}>\n {getLanguage(userStore.language, x)}\n </ElRadioButton>\n ),\n )}\n </ElRadioGroup>\n </ElFormItem>\n </ElCol>\n ) : null;\n else {\n let v;\n const vv = model[field];\n if (typeof vv === 'object')\n if (Array.isArray(vv))\n vv.forEach((x, index) => {\n if (x)\n if (v)\n if (x.label) v += ',' + x.label;\n else v += ',' + (showLabel?.[index] ? showLabel[index] : x);\n else if (x.label) v = x.label;\n else v = showLabel?.[index] ?? x;\n });\n else {\n if (vv) v = vv.label;\n }\n else v = vv;\n let toolText = v;\n if (showLabel) toolText = showLabel;\n renders = visible ? (\n <ElCol\n key={_index}\n 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 open-delay={1000}>\n <GvSelect\n v-model={model[field]}\n value={model[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 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[field]}\n content={model[field] ? model[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvInputNumber\n vref={field}\n v-model={model[field]}\n value={model[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 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[field]}\n content={model[field] ? model[field] + '' : '--'}\n effect=\"dark\"\n placement=\"top\"\n open-delay={1000}>\n <GvCascader\n vref={field}\n v-model={model[field]}\n value={model[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) => {\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');\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 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 if (width.lastIndexOf('%') === -1) {\n // width固定值\n width = parseInt(width);\n if (width !== 0) {\n if (width < 768)\n // xs\n colSpanNums.value = 24;\n else if (width < 992)\n // sm\n colSpanNums.value = 12;\n else if (width < 1200)\n // md\n colSpanNums.value = 8;\n else if (width < 1920)\n // lg\n colSpanNums.value = 6;\n else colSpanNums.value = 4;\n\n rootNodeStyle.value['width'] = width + 'px';\n }\n if (height !== '100%' && height !== 0) {\n height = parseInt(height);\n rootNodeStyle.value['height'] = height + 'px';\n }\n } else rootNodeStyle.value['width'] = width;\n }\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[item.field] === undefined ? item.value : model[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 = formModel;\n if (type === 'create') rules.value = formRule;\n else if (type === 'watch') rules.value = formRule;\n setFormStyle();\n\n await nextTick();\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 () => [sMaxHeight.value, props.formList],\n ([_maxHeight, nextProps], [_prevMaxHeight, prevProps]) => {\n // sMaxHeight\n if (isScrollbar.value === false)\n if (isAnchor.value === false) sMaxHeight.value = 0;\n else sMaxHeight.value = 0;\n else sMaxHeight.value = 0;\n // formList\n if (Array.isArray(nextProps) && Array.isArray(prevProps) && nextProps.length !== prevProps.length) init('watch');\n else if (difference(nextProps, originFormList)) init('watch');\n },\n {\n deep: true,\n // immediate: true,\n },\n );\n\n // @create 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') formType.value = 's';\n else formType.value = 'e';\n // 解析formList\n originFormList = JSON.parse(JSON.stringify(props.formList));\n init('create');\n // 判断是否是dialog弹出框中的form\n if (instance?.parent?.vnode && instance?.parent?.vnode.componentOptions && instance?.parent?.vnode.componentOptions.tag === 'el-dialog') isDialog.value = true;\n else isDialog.value = false;\n\n // @mounted hook\n onMounted(() => {\n // update: 对于查询form,默认仅显示2行查询条件,多余的进行隐藏 2022-04-22\n nextTick(() => {\n // get root element\n const rootEl = instance?.proxy?.$el as HTMLElement | undefined;\n\n // 判断是否是查询form\n if (typeof firstSlot?.type === 'object' && 'name' in firstSlot.type && firstSlot?.type?.name === 'GvSearchBar') {\n const expand = (firstSlot as any).componentOptions?.propsData?.expand;\n if (expand !== false)\n for (const element of instance?.proxy?.$children || [])\n if (element.$vnode && element.$vnode.componentOptions && element.$vnode.componentOptions.tag === 'el-form') {\n const fieldList = element.$children[0].$children;\n const fieldLen = fieldList.length;\n if (fieldLen > 3)\n // 默认显示1行\n fieldList.forEach((x, index) => {\n if (index > 2 && index < fieldLen - 1) x.$el.style.display = 'none';\n });\n // if (fieldLen > 7) // 默认显示2行\n // fieldList.forEach((x, index) => {\n // if (index > 6 && index < (fieldLen - 1))\n // x.$el.style.display = 'none';\n // });\n }\n }\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 // @render\n return () => (\n <div\n class={prefixCls}\n style={{ ...rootNodeStyle }}>\n {getEditBar.value}\n {getDivider.value}\n <ElForm\n ref={setFormRef}\n model={model}\n size={formSize.value}\n inline={false}\n label-position={labelPosition.value}\n label-width={`${props.labelWidth}px`}\n rules={rules.value}\n style={{ ...styles.value, display: isShow.value ? '' : 'none', width: '100%', maxHeight: sMaxHeight.value === 0 ? undefined : sMaxHeight.value + 'px' }}>\n <ElRow\n ref-form={props.refForm}\n style={{ display: 'flex', flexWrap: 'wrap' }}>\n {getItems.value}\n {slots.default?.() && <div style={{ flex: 1, minWidth: 0 }}>{slots.default?.()}</div>}\n </ElRow>\n </ElForm>\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 .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-05-06 17:35:08\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { Expand, Fold } from '@element-plus/icons-vue';\n import { ElIcon } from 'element-plus';\n import { computed, onMounted, unref } from 'vue';\n import { propTypes } from '../../utils/gv.propTypes';\n\n defineOptions({\n name: 'GvHamburger', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n\n defineProps({\n color: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n\n const prefixCls = getPrefixCls('hamburger');\n\n const appStore = useAppStore();\n const collapse = computed(() => appStore.getCollapseMenus);\n\n // set quick keys\n\n // @method\n // load dict\n const loadDict = async () => {\n try {\n await appStore.loadAllDict();\n } catch {\n // empty\n }\n };\n // load division\n const loadDictDivision = async () => {\n try {\n await appStore.loadDictDivision();\n } catch {\n // empty\n }\n };\n\n const toggleCollapse = () => {\n const collapsed = unref(collapse);\n appStore.setCollapseMenus(!collapsed);\n };\n\n // @created\n // @mounted\n onMounted(async () => {\n // reload dict if needed\n const currentDict = appStore.dict;\n const currentReloadDict = appStore.isLoadDict;\n if (!currentDict || Object.keys(currentDict).length === 0) await loadDict();\n else if (+currentReloadDict === 1) await loadDict();\n const currentDictDivision = appStore.dictDivision;\n if (currentDictDivision && currentDictDivision.length === 0) await loadDictDivision();\n });\n</script>\n<template>\n <div\n :class=\"prefixCls\"\n @click=\"toggleCollapse\">\n <div class=\"trigger\">\n <ElIcon\n :size=\"20\"\n :class=\"`${prefixCls}__icon`\">\n <Expand\n v-if=\"!collapse\"\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n <Fold\n v-else\n :class=\"`${prefixCls}__icon`\"\n :style=\"{ color: color }\" />\n </ElIcon>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n $prefixCls: '#{$gvNamespace}-hamburger';\n .#{$prefixCls} {\n position: relative;\n z-index: 3;\n line-height: $navHeadHeight;\n background-color: #fff;\n &:hover {\n background-color: rgb(0 0 0 / 3%);\n }\n .trigger {\n display: inline-block;\n line-height: 1px;\n cursor: pointer;\n transition: color 0.3s ease;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvHamburger from './src/GvHamburger.vue';\nconst GvHamburgerPlugin = {\n install(app: App): void {\n app.component(GvHamburger.name ?? 'GvHamburger', GvHamburger);\n },\n};\nexport default GvHamburgerPlugin;\n\nexport { GvHamburger };\n","<!--\n * @title: locale lang dropdown\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-03-25 11:43:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-06-09 14:15:05\n * @version: 1.0.2\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\n<script setup lang=\"ts\">\n import { computed, unref } from 'vue';\n import { useRouter } from 'vue-router';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useLocaleStore } from '@/store/modules/locale';\n import { useLocale } from '@/hook/web/useLocale';\n import { useStyle } from '@/hook/web/useStyle';\n\n import { ElDropdown, ElDropdownMenu, ElDropdownItem } from 'element-plus';\n\n defineOptions({\n name: 'GvLangSelect', // 定义组件名称\n inheritAttrs: true, // 默认继承属性\n });\n defineProps({\n className: propTypes.string.def(''),\n });\n\n const { getPrefixCls } = useStyle();\n const prefixCls = getPrefixCls('lang-select');\n\n const localeStore = useLocaleStore();\n const langMap = computed(() => localeStore.getLocaleMap);\n const currentLang = computed(() => localeStore.getCurrentLocale);\n\n const router = useRouter();\n\n const handleSetLang = async (lang): Promise<void> => {\n if (lang === unref(currentLang).lang) return;\n\n const { switchLocale } = useLocale();\n await switchLocale(lang);\n router.go(0);\n };\n</script>\n\n<template>\n <ElDropdown\n :class=\"prefixCls\"\n trigger=\"click\"\n class=\"international\"\n @command=\"handleSetLang\">\n <div>\n <GvIcon\n :class-name=\"`international-icon ${className}`\"\n icon-name=\"language\" />\n </div>\n <template #dropdown>\n <ElDropdownMenu>\n <ElDropdownItem\n v-for=\"item in langMap\"\n :key=\"item.lang\"\n :command=\"item.lang\">\n {{ item.name }}\n </ElDropdownItem>\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n</template>\n","import type { App } from 'vue';\nimport GvLangSelect from './src/GvLangSelect.vue';\nconst GvLangSelectPlugin = {\n install(app: App): void {\n app.component(GvLangSelect.name ?? 'GvLangSelect', GvLangSelect);\n },\n};\nexport default GvLangSelectPlugin;\n\nexport { GvLangSelect };\n","<!--\n * @title: 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-05-08 16:45:09\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 { useAppStore } from '@/store/modules/app';\n import { GvButton } from '@@/GvButton';\n import { getVNodeText } from '@@/utils';\n import { computed, defineComponent, getCurrentInstance, inject, 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 } = useI18n();\n const visible = ref(props.expand);\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?.proxy?.$parent;\n while (formNode && formNode.$?.type?.name !== 'ElForm') formNode = formNode.$parent;\n const fieldList = ref<any[]>([]);\n\n // @mounted\n onMounted(() => {\n fieldList.value = formNode.fields;\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 handleExpand = () => {\n const fieldLen = fieldList.value?.length || 0;\n fieldList.value?.forEach((x, index) => {\n if (index > 2 && index < fieldLen - 1)\n if (x?.component?.proxy?.$el)\n // 默认一行\n // if (index > 6 && index < (fieldLen - 1)) // 默认2行\n x.component.proxy.$el.style.display = '';\n });\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 handleShrink = () => {\n const fieldLen = fieldList.value?.length || 0;\n fieldList.value.forEach((x, index) => {\n if (index > 2 && index < fieldLen - 1)\n if (x?.component?.proxy?.$el)\n // 默认一行\n // if (index > 6 && index < (fieldLen - 1)) // 默认2行\n x.component.proxy.$el.style.display = 'none';\n });\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 // 默认查询条件只显示一行\n if (fieldList2.length > 4) {\n // if (fieldList.length > 8) { // 默认查询条件显示2行\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 ref=\"gvSearchExpand\"\n type=\"text\"\n bizType=\"expand\"\n visible={visible.value}\n onClick={handleExpand}>\n {expandText} \n <i class=\"el-icon-arrow-down\" />\n </GvButton>\n );\n searchBar.push(expand);\n const shrink = (\n <GvButton\n ref=\"gvSearchShrink\"\n type=\"text\"\n bizType=\"shrink\"\n visible={!visible.value}\n onClick={handleShrink}>\n {shrinkText} \n <i class=\"el-icon-arrow-up\" />\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: 2px;\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 type { RouteMeta } from 'vue-router';\nimport { useI18n } from '@/hook/web/useI18n';\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 iconName={meta.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-03-09 16:33:08\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 { ElSubMenu, ElMenuItem } from 'element-plus';\nimport { unref } from 'vue';\nimport { hasOneShowingChild } from '../helper';\nimport { isUrl } from '@@/utils';\nimport { useRenderMenuTitle } from './useRenderMenuTitle';\nimport { pathResolve } from '@@/utils';\nimport { useStyle } from '@/hook/web/useStyle';\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 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-03-09 14:26:39\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 { computed, defineComponent, unref, type PropType } from 'vue';\n import { ElMenu, ElScrollbar } from 'element-plus';\n import { useAppStore } from '@/store/modules/app';\n import { usePermsStore } from '@/store/modules/perms';\n import { useRenderMenuItem } from './components/useRenderMenuItem';\n\n import { useRouter } from 'vue-router';\n import { isUrl } from '../../utils';\n import { useStyle } from '@/hook/web/useStyle';\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\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: var(--left-menu-bg-color) !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+9Tp5famq2rJVnE3trGxMcY0h2KMDSb04NBCDIQQQgukvKTwQAKEEkISwJTQezUu2LjI3ZbVpavby8ydPmdO2/v3x1zJFpaNDYbked/f0rOkuXM155z9PfusvdZ3rb1GaK35/+WJF3N6fg8AAoEWmnq1jm0mEIZAEyMxaLU9JAJh+NQbZdotj/HxtZgiT+AHCPHIJ5BS0mw0adfKpDIp8j19xFF05PdKxSTSWexEEhXHxzyGYZh4nTrVSpWEazM8tJodO3aMaBFbA/1DE2EY/pphdiePaRoIA+bmJnGtNKl0mvgRzvl4RCmFEIL16zdjSKM77t/6qL9X0eRzvZTKpfxtt1//j1HUThumQhP8Gg0xzJgw8uh0POTK4J8okVISxxHLy0tH3jOf0DP8jkRrjRDQWxxhYmJq67ev+fDPCpkBd9vWE69QOiCZsh7181JK4kgzM70IIkaKJxZY6D5Vc3OHQGv6+ob+NwCrEUIihHlMk6K1xjIdUokUN/7ymuf+8t4vfZvUDJs2PuNv4zBBq9N65CNrjWXaaCJarZAokNgJxWHT8ESKEALHSTA3P4mQ8n8eWIFBFHUQYYxSvzJgrZFS4roZbrnt+stu3f3vXxlYk6FVGwBltuNI0GmrRziyxjQcWo021dYc2XQvlm0C0SP8/ydgLCvgLi7O/LbAihV9ZNFaY9k2lm2j9bFAEEAIMjz6SBoUit7eUW6/48YLfnjDJ7+S67GQURYVzWPZTpxOpQjjzDHPa0gLZMR8+QCxCrAsm8Br/5qr/e1FCIFpmr85sFprTMvCNE0e7dGyLIu5mTlTSDPK5wvEKl65F4eHqBDCRhoumgeBV1rRk+tj4tB03y/v/ur3LDfAbzm4Qy7LSuP77UQUK6I4OHpggGla+GEbzy/TCRo4dupRr/GJF/GbASulxLIM9u29n+lDsyRT7iNedjZX4Oc//PanDuzecfpV73z/Jcdv3rKvslw+yp6qSBH5IVp1gdWAbdt4zQ4/uvZzP8StJ+JygoGxJIalUMpAQy2IGoRxe+UoGikNDCmpNiroCExHYhqPvrD9ruQ3c7c0xHFEridBImnRabeIo+CYqlSM1p67++6btn77K1/6t6ij8JseXqN9RAMvQGuJigVxBFGoyCT7ueOumy712HmqIEE6nSaXK9Bo1DCwSbk9O7XwgRiIMAyF1iGN5jKV5TlipZDyf24J+Y3P7PsB+UKRcy5YTWW+ShxECPlwCzYwNMLsxP6f7Ry79orpgzvO37V/f3HtmjXL1WqlawwMja9DtNfEtmyUVuRzPRw4uLdw6/3funps/RALMx6mrTl4cIFCwSLj9LRWj224Dh3jOg6GNAgjxXK1hIpCTNNCSsnv9/E/Wn7jAEFKSeAHdDo+TiaJEppOxyeIoqO0Vqsyunrjj3oGxlhe2Mf2W67/k1Q6hVYRWsUYlsCwDALfwzAlvb2DpBK93HDrNz6f7WvalaUOs1NlpDAZGEoRRA2yydXf7Osb7LT9FrGKqVY71OodgrCDYRiIRwsFf0/yW0VeQgiiMEbrGLeQwskmMU0Dy7GwHBPLMfHDDps2Hz/XN7ruZh3H7Lz75j+emZ7GMg3iyEcRrEwsgRAGCSfPD372hXdNL932HOI0leUWo6t66B8u4KZMWjWDbVvOfb/laOIYahUfrxUjDQPDeOId/99UfuuQVgjQSoPSWJaLRhO228SdEBVEhJ6Ha5ps3Hr6J+xEgfLU3qED+3c+ffXa1SQzCSzHJIojMpkMufQgP/rpl1+9d+abfzM4XGDXjkVGRgcYGetF6Tb7dk+yYehZHzlu/aZ98/PzNCo+URRhWhJ5DDP0PylPGFegtUIjiA2NlXFxHBspBaZl0qhXedLZ53x+aHxDKfJqXP/jb/79zOwspmOSSKboLQzRrEXON7736X/Zceib/z42voqZSZ/BoTzJtCYIQsrzVdb2XvDpF77glW+ZXpim03RIuT0knTyOmSPpFslmesmkCzhOAtdJYFkOUkqkNLAtB8dOkM3kyWbyPMjqid+JPrHLptZopbGzDiIGrxZhCGj5HkNj46zZevIXZg7ef9Weu247ecddO570nEsuuXXPvp3Wvff+4nX7Z298p5uvD42MDfPAfdP0DmRYu66PWrXN1KF50ubGO7edfNZnr7v5y6+fmpsYNYU1LoRKKKUAISzbrklh7sun+vbl0oU7At9oJZJuScdGqLSg0Wg7teV6f31qavPM3OT5W48//a+1Vq34V/zgxyyCR2X1fif+iIoiDMMmWyiiY584DDGE5qxzz//Yndf98Kq42eb667/5qdSQvnH3gZsuqXdmh1ZtKhK0+zm4b57enh4yOYf9e2foeJooEvSvEePX3fWZW+YXpxkc6kEaMV3fVaB1TNzWxLGk1MjhtzWxiuNCvliS0piT0jD8wB9ChL0HDuxiOH/G/evWH/eXLa+GE/8GEKwA+rBY5yHymI4qpcQxXUzHJgw7EBukkhmEsACLMAgexmtqpRCGINQaKS0WZ+fZevwZ+08/69kf+dmPvnSVLiyceMN9nzsxn0yTTKTYc3+dWq1GoZBBmoLSUgWEYHA4R7GQY2rmQE+gAtavW0Mi4RBG4VGPs2EYuK5NqVxBGx16+7OGaXkD9Vp7II4VqbRNpJv09455z7voFU+RhlQgMczHseBpjRACISH0JSqSwLG5ikcEVimF7dhkk0X8TolSqVwI4+XhZqta8DuBEeugbpmJZjrZP5lO5f1MKoPAARSWpdEKUBqEQBomjmuSLGQQrkwqrcj19CCkSdLK4ocBpilYs3YExxX4HY9MNolpmYSB4p679yKlwdiqfgwDOp0usS0ExDFoNFGoOHRwhiDoML56iE47ptkI8NoR2byD6yTZv6fMhWe+5pLx1asrc/MTSMPgMfu6GqQhiZXC9wJQDt37+hiB7c4CTW9xgHq9wXU3/vSPZ5bueYUWrRMjvKRhRGhtMrGskUJiGZklW+b2WUb2gWJ21W2pZPqmvv7ecjpRmHedHKYKMJSJkjX7y9/+0Od+cdO3Ly/k84yu7uP+ew8RVkKGV+fZtHmIOA7peDFhIKhVW1iWSRxrkskkqVSCeq1NrVbHsmxs2yIIfEzLWPEITBLJBK7rcujgAv0DBXp6U1img50IOTAxwfjg+V8547TzflRvlnHc5KPayKMx4YjXEXkhsQJTikfCFAAxNbe7+wKBIiYONIXMMPc8cPtTbn/gmx/1orltubxDMpEGYaBR3TSOFqBBmCHtpofXDtEKTDOBY+X/JOX0HMik81eahliu1xY379i15/RtJ5xz9a4bdy/Pe3e/+bI3PJtf/ORe/HbImi2D7N+1yPBwL5btEesWPcUhBCZRHCKEiYojtBB4zYDl5RqDg70YJkRRjCEl0tCYlg1a0mg0aTQ8EJpM1mC5vISjN+151UvfuTGZNGg0agj52B0isfK370dEoSKOAyQO8aOZAqW6tlEIgWEalKqVVbfe8d+v3TP1k3fneg3GsiOEgerCHsWAgUYjhEYrSasO2VwPuawiDKMuh2oHf9Du7C8c3D93uu+3yVirOPfJl7z+vDMu/mRc/8xlZnPmzfVqlURSUJ1rMNy/mcZyg1aN4KTjL/6MH88Vdu3f/hItayRzFraTxZQWwghJ51MImWduboHevjzJZJIgCIiVIgw7SCHIZpI4rmRy8hAzkx1OWHfh1y4870V/lEwatFr1lXD3sYpeyUCYaPXo+b2HivHGP3kDcQxoiVAuP7z2P26calx76Ybj1mOJBFEY4fs+URiTTKWIomAlZBSYpkHb86hUmmglyWYyuK5DudReV1lujTQqHiPFs35yxQvevXHzppO3V6ptFls7/ryj506slEPGRga456bdaBQbThwGWZGhJ2af+qTXXrZm9PhPq9CdcuTgso5EFPlRym/7Tq1WRRhdUnxxcRFBjCGh43v4fptWp0Gt3iD0NQO5E246ddML//LpT730PYmU4dcbFWzb4bFmprsgSgQuWkOsArTuJkAFJloJHslGm8lE6vBhyGd6Wbf6hK/fdO/dWxbnlnFsi0wmieu6TE8vIoRFLp+i0/G6Z5WKgcECQaAoLTXY9cAMbsJEWhGogPUj51z78sve8gzD0SwuTlAqVXIL5f1XlEtNTCB3Qp5EMsHUviWGNg5hmDlRbmx//he/85e7X/uHf7Nx08aT/nnf/r00WyWk0Gmv42+oNUvHL5VmTsUJ8mM9jHS8Zt5AknbtII5ESWtnobdn8I5Cvnj96NBxezPpFM12CS1ibOexu1ZSyi4xry0QBo8382CquHPkh2Z7gTNPeeZfTRza8fzF6v0nZtIDtFsRmUwK101xaGKGYrFILpsmjALiOMSyQ7QSNOtthKHI5JN0Oj6FzInXX3HJVRckUy77Jx4gDEKqtal1tfq8KeMk+b4Eftyib7TA9J5FwqZPrd5m1fgGJiZ3HvfFb3741tdc8f4nFXsyRLqCKa1mb+/wXWNy/V1+J/pi4JfI5XpQsYHnNclme2i1WujYxElaeOESsW5RXm5hOw7SfGzPsBAgDRO/41GvtSgWBhDi8bNkUpqSwxpEAYmUyXOfeeUzxoon7+50lml4ZSYn56ks1ykW83hem2ajRavRJZg7nZi9e2fI5Fy2nDxIvV4mZ5x69SUXv+78dMakVq+goyw92U2YMjeidEA6k0AKA7/tMbamn9iPMS0bw4yYmS6zenwDs+U7zvjpdf/9tmJ+kL7eYQBqtWXqjTLN9jLtTh0/aKN0gBYRkergBw2a7TL1RhnPax3J9wNdd0kKDFMgpEZKHq4GSGngdzyq1TJhGP7GHIQUUnBYDcOg3qzS01tcuOjcP9yypuf8D2s/5bnJgLG1LuNr82w8YZT+0RSj6wsU+lLEccCGTb1Ybpvd95TVxuE/eN9LL3vdH9opg2bcptasE0QtlOwQ67CdzeawHUFluUkcSnrGciip2XP3AdZsXEW1WqdWDVi1eoBd+6/9m5mZCeHYDoViH27SRSvVJX3o8hNKxUf00WynMCAMI1r1mKhjEHTEwzTyDZr1Nq1GA4T+rdgy421vf/OvIk2r3cIwI7Vl85k/Hhs86bMqcOJmw89Vq/X+aq1Oo1nH93wW5pdAmeQSw4dstf7qU0+89KUXPe3ibwWqQbW0DE2fcmOJTlglVi3a7YaxXDv0ZjsB87M1UgmXTK+D37C4/6ZdbDxjNa7rMD05T19vD7XGkplOjN6/bs0JD7TbdZKpBNKwaDaaxLFHKpXpZnnjENt2CXwfFYNhGigCTMNGK4Fpd3NztWqTyDcwpEsUauJIHKVRJAnDNsLo3iStje45hESpmDgOH/vidaw3pZR0vA5eZ5Z8Pj937pnPf0epvPiOcmV6tUCNB368frlesTeNZts9vfmdtt1z22DvCH5jmYld92IEAl2rUak0sMd7cfsHyZou9WonbtZjCoNQ7MkyN78MbsCZF53p1Q7ZxvVfv9m+7I1/QKvV4uD+efpGUuw8cPN7jz/u5K8hulkL17Xo6c1TWmoSRQG2ZT/CnFkpKzK6wOugm2o3DBBSHzNbK8TKovUE5HIfZZkUCCHwvBZhVMO0NX0jvRPF/MiEqwvXL5RmSDku2YTAawfEMzMEi9M0I4NUcRBbCkTCRpbqKNumnUvgNfXSYsmr9o4m87lMAmkbLExXyDvz/gv+8GWv+Ne/e/u///LHN/c+6RlnsvOO/SyXK1gc2Hpg/95TtmzdemettkwQByTdBAP9I2itiMJoBRRJl+mSGIZBFAkQoJEEYQcRR5jy95dYNLV5tLMshEADSoKQBlobEEfEYYhudGjV5vDDRXqTadqqyfRiGzVdWhfOTg2GQTUVOOmaNpyp7EhxNlEsopeWaE0usJjyiDzRDGrRZBSr/PxSlYGRHlIpmJ49kD/72a+84exzn/Pxr/7nJ98n4gRjW/sxWhFerclSefJ5JufcKXR3wQx9TcLpo9Wu0+nUkCaEkU8ylaTV8mi0G5hWEj/QWGaIQCKFRP8ec2CmbB9dqSckGLHGCSW+18IMbJKmTb20hOFDftUAvqE5dPe9Z83ddfOLOofmzhELpdPT7RZG7BNpQaWQifNr117Lxi3fyp932sdHCnniSod2rkhU8YOlWY9YW4ggptCfZbLVotkurT/jKU/75DXf/dL7tn/9NpLWCxqjWzfa9y19z1n29lzseZ332bZNrGIMw6DdbrC8vITrptD4RHFAwknRbNdptlvkc8muLRTiMQcETyiwxnzt4W8CtmXh11rIMMLKO1imRWKgn8nJydP3f+vr72ve8IvnOO2AdCqJkTBxUxkcmQCt0B3PkLfefmF40x0Xzt9928uDF77wrWufdNZNh5aWKS9WBxIzgjXbNhD6MSoSaB0xMXPwOWef/Pz3rz5+01Tp4B1jS7uW6pc870/PI0y+a/vtP3nV2sHrzzjhhJNu89o1bNuhUptBKYGUBl2qe8UUaLGymuujwk+tFY7lIoX1KEA/cekd4+1/fGXXav+KakPQiQKEMsivGqVpKHZ841t/sf+D//QVc8+u48YHB0gWe2gnbPoTGYZSSQoJl7RjkUxm0KkE/X0F+qdnR+av+fmrm1bSNzesu/HGm6+7JqgslLacve682fkqGdfFD+qg+peedMq5X927d//AA/fde87C/O5sIpmbftkfvu0d7ZrcU1nuyHSqd19pqYbnNdA6wjCcbtGbiDAMA0OadPwOfhjh2AmE0JhGt8Qync5iYNJstpOumwiVOpo8OcxgaR2giVA6PqZXEMcK102QzRRoNtuPUDYFxttf99qHpWy6VIDADzpkRtcwPbuw5tA//OP3Mz/9+atGe4r0Dg/T66ZIWQZDjksukSDWMUEUEakYS1pUg4AFr0Wi2MeI4xLefMuFlT17r9ijqtsfODjxyUxv4ul9g4VVQbsDZkxPeuMtmzac+h3HMW65ffuNb+l1Etb22257+mnnnP3Zc8656CbXye1LZUxc1yKKfJSKkNLCMp1HBVYIzWD/IKZh84H/895rhamyp5x88s3Ndg1N9KCKmFgFKBVgSEGsoqOAjeMIRUxfzwjTU1ODt99+6xUjw+P3uo6tpOwumA/VY9I8WnedY3f1OHtu/uUzp9/+th3jO+4/e+PatWR7cxRsA0MoTAECTRD4xFojDIll2bQCn1bo0wh9ZloVDiHIDhc5fnLPcS+c87/dKzK5VmXg9YSCjurguGl0GMzv27OXoZFVzWSuMLdr/gCmG/P3737v94JOyOBwBmH6ZDJ50skeUok86VSRTLqHVDKL6yYwDPPI9QshSKXSrBvfwOJ8eeCDH3nv16+976vnNzvLa22ZxBDWUWoKizgOiFX0sGSW1grbdsile7nt9hsu/eoPPrD3wNT2N6VTmUiLCI6hpniYXdGY0kAODrD/Bz98SfwP//LFrckk4fhqKlGIVBACWkjQXRYXAYYWBEqx5LVpRSEJw2Jtqhc7jhFS4WsDnSpwjulw977Z2+2BE56yYc2qD/z0uk+/d2Q0j9FjhclUkjgMeMELrrzihnWD/xrrQ6c8cM32bZ/41w+974pXvfKfJyYmxrx2e4PvV4uImDg2VcLJNtyEuy+dKhzqLQ4uZ9M9WG6BZDLH0sJU/623X3/596/5xt+Ug9lssVjE0PZ0GAWE4YNJRCEkxorJOFYIa9sOrpPlJz/78htv2fGFj9lpn41rt16tYq1bzfaxc16BOtor0EphjY6y4yfXPKv9wY98sS9h0eotIuIYCWgBUoPSYsVy6G4GRnZvSlqaDGTS2IZFHEVERte8aKVoi5iK7vB0M73+7umZvz7nzW/5o907b7lstnTzpi2rCzPZfIqDe6Y5+6yzbr34Rc879TNf/tubMj3Js5vy/r/6/Fc/8GfSjNLJjKbRqBMEIa7b9RISdp4osNpJp7g36fbesFhqtJbKi6ft2X/fhXPLE1gJg6Sd48mbnnPjRec956ONVhnD6KZ0pJAgFI5j0AkeGkmJlZmvSblZfvLzb115493/9bE1x43SWG7itTvZju8ddYOOAtZ7iDXQSpPqH2Tf3gM99Y9+6gcpUxDk8yQAnxipBUHX78bS6shrBCitsYSBbRuoOMJbIdC1AKEBCYaGVhxTSFisW6pttYCzz7jonZ/+3C3f7Cusu1Vol2yhj5nSNNn+IqdvvuiqqYW7bsv0SdKJKF1aalCe9BAYDI8MkEw5KBXSanYoV6eSQa584rK358R6o8F8aZb+gR5WDT+p4xgDPz55y1kff+r55/00kUjQbDZJJFIY0qTZbOIFrW7FpH7QCnTNoSSfHeDmW66/8K7dX/lUJp+EMIHptBCmzqazaQzn2BXipq2dB38wJJGZpva1716dWlwiHh9mJJUh9H2UFEgkhlKYwgQDhAq7qK7caK1XXHApjpxL6pWXKz8LITGyOYwDE6eU799ZGBg+/ltnn3L5Xw8N997fCUs4SUFaZKlWa9QqldRQf5EwgMV6h77+HH5Hk0wlqSw3adTbXeKo4eHYBbxmjJOMcAyDM7Zc9p/bNp/98cGB/gOFfP9yvd6m3qwSRgGG7ObSTCvGj1oEQdCduSuitCKRSJJLjfKLm370wlt3fOFrkfYJmwYNo0ajXWe833TchEH4CHkvqVSEUhFxHGIP9HLwJz96Ntf89BkM9tJvJ9B+QCxBaEEEmFLSQXGwWUM+BNSjRB/z5ZF3YtvGLs2b+77xtbelrSTPec5l7833FLTr2ri2SSbl0ttTpBMuPa20XCadTSBEgNfWnHjKOgaHilg2BKFHX3+eDccNsnZDHyPjGWrlGlvXP/c9f3j5W1/V1ztyu2Fay5VaiYXFOeI4RgiJ1gLDAMOOEbJLPGmt0FqTSCTp7xkl8LX9ze997oO/vO8LX0tkoV4RZLMZYtX1OCREWoUIESFE/DA1ZdS1EYZp0KjVkNdd/w+2ihCJDFnLohH6iCOzTWNYJvPVKo4wsAyTQD0+Zl0LTaihkEoyee+9lzcWl9+dTDo0/RClNbHWJNwUU5Mzxu6D2/+o2JelvFRjeHiYXTsPEfgh6zYNM2z0MDtdYWZmgYHBAhgdJg/Oc+qml7zzec9+xQcXypOUlxfo6ckhxIMViN2EJ5iupmv8BUopEokUhbzN/PxU8d77bnn1xPz2N5dqU2OJRIrKombDpn7S6RRaaw4cPECnE5eiWOF3/GOO07RSDmhI9vaw//57N9n79my2+ocxpMCPwgcfcxRpw2a63iAQiuMzvTQi73GBCnSzu0Amm8es1taXJ6aHCqvXzHlLS3SKLkHawhVZ9hzYcWbNmx/ctG4VE6UlSqUqx29by48+fwsLBxc54cz1rDlulD37djA5s4zwspy44cVvef4fvPQjba9Mq916WNIwjhTSADOhunsclEZrTbHQT6cV29f94rvvOLT4yz9XopYeGu4Fc4DdOw+x7eRV2LZNvVHHdR1UYDM6sP5bruMQBIljA6vcFCCIckU6O/Zdkmi3kb1phApQpoNYsSESQUcp6lHISDKDp8IVUuMoX+N+YAZ4xiMBe3ioTUNQm5misFA60zjttG9anZDYkWgDDGFR70w/000LWrWAfE+ahYUKq9b0cuqFm/jex35OeUeJzOo8z770ZR8PfWt33um/4ZTTT73H86uEUYRhmN2qbsMAJEEQkUw6uKlu6KsVWLZBf88o22+/7bwdE9//nM/Uqp6BIqYxhCEdFhZmGV8zQCKRotUIMEyLpdIio33bbtq2+ZQ7m+0SHJW26eJhWQZmrV5FSElpUeMfmLjA1jDVqbPOTa8s6d2PWEgWO22Sjkuvk6IetI8wYQ+RO4BbHg1YAFtKSmGA5QVQrRwXuiZRwkIZIaaQVCtLLNf3X5JKuUQBJHM2Ts3h0P451m4d48KXPJlbvnIrE3umOPNEtf3yV172X37QoFSaR8Wg4hi/1SFtucQdnyiGkdE+ir1porgLqjQk2UQf193+kxf98p7P/nfvmEsuMULsawzbYHJiiUzaYXAoR7MRICSYVkCj0ubJ55z97mQyjRc0MYwHJ5YQAsMQNOoeZnXXLoQh8VwXGtVUS3er+l3LQiuN7pohLCEJtSZW0FYBUujuY310ou3lwMseDVSlwZAQKUjZLqpaGqRSRzYbBKkQ00kyuzC9uu0tnZAqJiDSREGM5UriQOKV2mx68hh33nGQeL/JFz797v+MRW3gile86R9MVWJufgZpSgxlkkwlaVbLSNOkZ/UwHc/rzlat6esdZvudNz/5hjs/+989Qy4iyhKHklTaorRURQjFyNggHa+DMMCwFYuLS4wPnPmjk7addl2ltsARvmElUjUMSaPZYmZqGZkZGyEzOkx+zThkM0EUaAatFJYpUStcugBiocnaLq2Ox7LXwjHso7YPHb5pD3naH/abwzcp0goQpBIutWbDWJpdorxYIiYmlUpSqsxd2O54XWJaKMJAk3K7+a62FxO1A8688ATipKCYcLn6k//w95/4l396f77Yw/DISPfxl2LFFMgu7+GH3YyhEORyBebnFrnu5i99Z3g8Sxg4dDo++ZzL9FSZg/tK5HJZSqUqjVYLpQOCsEHQysfnn/2Sy5GKju8Tx4pYaYQ0iJVivlRmsVzBMCVycGQVQyPjbDh+G8X1G6+XKkCrmFAL1IolkBq8OCZjmQwlErSiED+OkFI+rnp/Q2mShkWpE1EJ2lgo7HzPglUoYubzOG4WizTNdmUTRje/hFAYUiCFRblcJ4xa1KsNhlelePHrLlWZ4ZMQQcQPrv7Ie9/zF2/+8eTM3OrxtevJZLNH/GqlFIEfIuluTzJIcs2NX/+cspeKSaeH0A/I5V0W5mpUyg3WrO9DyIjQD2lUQny/ztyhGmed9MLL16weqrdaZRzHwHEkjg2CiInJSUrLVSzL7BY7e+2QRrVNZ3YRr7f4CztrU7RN4mglEyo08crjHscRBceh6CYIdYx6qOf/aLLiWRhC4GtF2ffpM00aEozBvh0ZS2DYgpYXUl5q0+60Rt2E7HK1ChzXIgxD0OC1FIlkglqzgk439JXveNezzr/4VR8P45ibf/zliz74njce/M9PfewfK9V6dmh4DMdxEHTzZfV6k6Tby63brz374Nz1L+sfGCQKIwzTZPrQMktLyxy/ZYye3hyJZIK+gSKr1/dQLjU4+biXvPWCp/zB16vNGkpbRBF4XkSr2WFxqUyr7XW37a9MNOM1b3gjvmWR7MmiHHPWu/G2dw3EkYhNA0MKbGlgS5tghY03MJGyS4s9lrkq9EOKcw2T+VaDtOmwSkpKff2l/IuueI1LQL3ZoNKpEwQxc0u7X6TMymbTSGAYgiCIqCzXGBzqZWG+Ri6fwjItpqcPStNJTr3mNX/+tlRuZLuTSg5O7rx97QPbbzj7vnvuen2j00mceNJp1+WyORpei2y+SLsZ8oNrP3N9z5As5LI5yuUqkxPLFAoFRsfzxLHC9yRCKJRuMTszzfFjz/+7Zz39JX9bqc1Tr9dQOkJrQRDEoCGKQ/wgxDBNbMsiDjTGX7z97Uwe2H/63Pa7zt121lPumZhZzPl33HGWm0wQVDuUdUg9jggjqIURngpJWTZax6Al+tehu2KkpV5xzqVB0TJo1OpMjY/dk9t24hettBNlEnmqjRkqXplGc+7SWNa3GIaFYzvMz5YxLcnQcA9LSzWazRbZXJ5sNsnkoQPnFrPrPnzuuefdf9qTzv1csjAwc2hq6sL64sHMxN77z79vx47NxaHh2eM2nTilI4Of3vAfn637O57qunkmJxbxO4p1G4YZGunpFmgYciWqa7G8JDvrh579xouectk/tlpVOl4L2+4u2EIYXW4BTRSHtL3O0cC+56o3oVScuuGDH7je+/4PXlyvez3VqZmxehiyc32exU6LdZFBynFYCDq0Q58+N4FQamUX0ePLJ5lm9ymoS4tweWFU/uzat+17YPe5Paee8YOB8T5vbn6aanPuMm02NltmglarS2oPDPTQ8UNs2yIKQxqtgN6ePNXaAklnYPfwyJp7luanOPnks+/cdtZ5n9+xa+eFjcXZgdrcgc133nfnqyO3s+WWu3/2es84+IJiLsfCdI1IaQxhEAQ+zWaTThtaLUW1UWNxqY6Isn4hm9R33vejKw9M3vf0jt/JamUu9/UN1zOZHJ7XQiv1MGBVCGJmz71kBweZuPOWp+79l3/6eY/n4WfSHFg3TKqYYfM3d7Mp30tDerQ1+JFGSAUrrtjjFYHCNhMcaNYZtkyyseaevfspb9k0+/TPfHS1r+zw+z//zFcjc8+lSbdIHKmVTXEKw7Qplcqksxmq1RZEMcm0YrB41mefds7LXlOrztFebjO6ahQv8Pjcv33iYzf/4Btv1DrC6HEwcy5bzzoJ4WiiVolUMkO7I0imXHKFNJ2wjQ4jLCMBCJykpuU3QCmiSIEykZFLJrn6B1s2nf93m9affJNSbRaWpigt10jn8qwaHWP20ALG+971NsxUmiCVn5hplS4YyXXGc8cPk3/uuQy0A5oPTHGoUmWq7aGEwDY0rSgkabsorR5X+k2jSVpJ5pp1QhXQl8rRMST5niLxffdlasm8WPusZ12764E7Xtj0D21JuG43LBVdFt8yLdpegNYRQ8N91CsdhBliYBvD+Y2fNJ1u1UtteRkhNBdc+JwfHH/yGT+cWiwPz+05cFyfkeHgjinWrj2D055yMTPlSUY2FEjks8yVqqQSLoY0qFUa2LZNNp/GsVMkE1lMaROGIW7WpOFNbth74K5Xz83MbLFl+r6+vpGSEAZBGCa+8e0vv3PX/XueIbQOuf/OW0879N8f/8ZGszm2fqiPO0stGmefwumnrmf7bTu57fbdGLcc5PmVNAtuhyBSjGbyxFH4kFn7a0zCSpARKMmBZo21qRSmNIlVhGmYJBoeOwzTX/2v/+reP33dH+8++P1PDg4MdmfKyrHdhMP0RJ1YR6zd0Ee7GRKKJn7VjZ5x9msHh4eHyp7v0Wl3aFQb5NI5xsZXs1Bv8TfvfMt39z1w08WFniLz9YC//NtP0teT53tf/2uSKY+ZOY/IdTFHcjiOZDCRoj671HV9pY1SAtcVFIpZLMcE4bO0sIApeug00zfuPTAzOLm4Z/2B3ZN85P3/frnxwuc+48ypj/3FredZpZyT6+GOJR8VBkwu1jjU8LBMyYlnnsBAGKL3L1LyFZ4OcERMwnSIV1Iz3WL7o+evWCGOD0cNpmlyoFEh7ybocV2COOp+QseIpEvn4D5TrVv7E7aM7Zvcf9cbspn0SkpbgpA4rsnCfJl2I2BoqEAYepiWRbPuyawz9u1Usji13KhjIkh5MSJStBoNBkaGGDth65cWdx18Us9SY8O2lkfzu9+j7/5pBu+ep+/ORTaXLVYvxayuKrJhzGIiQhcyzE8s0qq26e0tIAxo1D0atQ5B6GOnLDpRjU6ruapRj6Kh3vFfvPHVf/bm88572rfN2f27epLHnXjTroSTqKSGFqaru596XqLiDvst7jw0T3X1OPlAIQouUwVNbY/HxuEiRdskUAprhctUK5tCBAIlBBqBkgAxFgYJw2VfbQlbCIZcl1bYQdD1KjQCL1aM9RSZ/+m1H1NbXvHyXL4n0Lpjox0QGq0jdJxASoUwFEEQHdkHAT5KiyE3WaQTg91uYkQxmZERFlse1/zTR15u3/vAq17XiteLOEOhUCSKYuqHduOk0kh3GKUjjJYmvq9FfXtAf1Yx9ewxxp5xJtWFeYyWRyqbod1pUqtUCKo2hWh894aBbf+2+cknXZ1IJOclLsJSlEqLmMcdv/n77lOe9f0KDv7ue084b/G+u4dtTUdl2VRrcs+BXVSMNUzsnqY1XeLsTB9DCYdm6IOWxLECQ3ZnpqTrgqkYhEIqSBkOvtDcXV0iJU1WZzIEcbfsZ8VCrHA9EaI4gLz7nlPUL3ackzl19S86Cw88zVQJtBGQSNiUlqrEsaS3L0UYRd3nQCjCKERokUplcoSlRdKGQXDcWu746XXPaX3ui//Uc+DApr5UAqNQIHRM5rVCGRqRSdJBIfC7G1YsRVQQJMlwSkfS/6VJ7thTJrp8E83GMq2pANfN1Mb7zv3qSN/mr2xav/lnmWyOVqdCqbRE4CssxyKTzmC2Wm1st0mmP0tr3/a36om7rZtXn76cTSabazPRqmQco+/exapiivuGe9XcZEemZz0y/Vl8y+VArUkU+WRtB60VScskZzs4cYiIFPOhx0KnSc5JMJzMouPgqBoqzUpyUhg0dUiva1C5497nt9esXYwAQ0YrRW4G5fIyvX1FwkChVJfKFNpECgvHlvNR0CCTdPGwueefP/lh/dVvXrXeNkmNj9PQMaHSiJXaWhOBRqNWJr1GdXN2GkJCFh3oG8pzzp1L3FTfGQ6/922vSAWJvYVkdle+MNgEjTR9ypX5bl3Cr1TXyEyuv1ve2Ampzs+dOllctyTPfsUFKowCKSLMUDBba7EhH5EtpqX5+je8qvqsi754YLJMZ2KSot9mUAqGbIMR26JAjLW0wNxCmftSyfp8HKjxZJ51qTQq6hCgHp7J0V0CXOsIO5clVSkNuVVnZ6DAdEEpyeTkPD19BYrFJM2W1yWpDVA6ImGkMFPWnU5K0EKI7e//P1/OfP4LV20Z6EUMDdFQCnkkAoxBxCihUCvhp6RbvtmKY3wF0rAxNNR1jDtQ5IydJXPwuqnM2aeee/vwyFCz2SqxXF0gjIJjNr8AkE4mAU5ENhHC8ad+PH3Jn5/X48blxOKh9W7U4ICywuoFr/yTXX5qabZTJb1h9Dub3/X2l4o/f+vFs2c/6ev+QP9sZFmUPZ95z2c+FOxbveou/01XXmle9uLL+qRFwRTUwgC1Yn9/VZQEU0eYwsAXGiPwh9YPbb3atoYniX3ajRbplEtPMUO73UEI2Q2pFfitNm6q777xsU2lSsXntvf+9TVD1/zs8pENG6hbDjqOEMRo9BF73tXDz0t3kZXSpB4F3Fsr0QojHGmhhaYlBNnhHlH+0N9/6pbPXf1aN9tPzs1QyGSQGGitUZKHVTKa0jWQGHTCNieef8FnLDvL3nt+eY7f9Lg9kPCMi193wbMv/eyOG4b+q693/+ogEUQL+/ey+YJzvt8+97TvL83OGrWFynpr3+KASDhKrRueGljbf2h0fC07vnXNyX69JnVfAUubxOLBIf2q96CEgaHAjUIWjVb/hjVrD6yZ2vzxByYe+Pu+nlGkNvB9H023xlUKjTSg0WyxacPWrwz2jPDDd7z7I33XX//UwRM20ozMLqBC8UisxuF3YwEyDhlLZqiEAROtMun8IDKWCB3StByOGxrkvn//t09Pnnny1eM9ve3W8jJag6kV2pG0lSBSMcaKSZBSCKQQGKaJDn2qk3vJ2Im7OmdfclXhJe/ZsuWMcz9bm95DNptuDI2vvy+TSNfDKKA1t4BaWKKQSMQj69ftHt644YZVGzfdOLRm9aG0H9KZnSWxfnin7h1oqrpHbOjuI/crjNhhV0whEKakUqohVq25sXesh4HCmq+HYRZtKoIoAER3sQSUNBCmQmvB5o1n/fP+m2/rt77/nT8dX72KupJo6XfLfR6pJcODez5WCpS7mYdN6TxpadAIfaQQKCFBRfi9GQaWljjw2S/8u5eyUYZGGQphCswY+tw0vekU3Z2g+uizaq1pNRooTev4p1z0z0Njq3YEjWVipYmDDp1mnTiOV6pHVvaW+j5+vY5fr9Op1wjqNYJIoQWs2XZ8x3v6U/7q0FyJpOUQS0m3jEMegVYLjUKTNC2sZpN9oWL1pZf+aT6MGR5as7/HWXV7pbyAYXb5NK1iDBNcV7K8WKKY3fLjdKqvOfnRT3xnlWXSSlgYSiHilRKcRwpcNCgkWssjdEdHx7jSoMdO0Q59TCGQ2kBqSRQreoeGkT/+2Ysn7r53U3psBCwLbVvEtolp2+TdJP1uhkR0jNtpmN3CMq9SImg1OFwy/1hFAIY0iJUkWKyw9vLLPtQ45/T7lg5NEccRjhBIbSFR3QsXJhk7Qbm0yLX7Jki98TXvXHXW6XeWF2fI9cAp287/o6BhI2W3S1IUxZimIFZ1Gq0kz3j6lc9dvO6aE+K77nhSemiQOO4uTFo+LNF5jGtVR+3hkkArDkg7Dr1ugkBFKKFX/GjwEw59XoPa9695VyhSEBoQdDX2JaEvEbGJEZlPYJtTrdErPq0da4xqnWhugWHbZeyFz//jqSii7Ye4hgF0SJgOkQKNweTMDL88tJ/in73lrSe/8uUf9JYW8YWi0Wiw9YTT71nV+6R/m56ew0k4qFjgJGDyYJnzTr3iReO9w0Ht2uv+YsjsLjQPRn+PtTnk0f9HQLeb3eGqnq5TBkAcx/T1DxDedvsV++66q1daBn6nTfAQ9b02fqf9xACr4hgVx1jpBLaQtJoe1UqNytwic3fcTWQlb3bXjddbzTqVjo+SJpPtgNnIY3LqALu9kG0f+vCLz3nJ5R/2Z2YJw26qWUWSjt/iogtefGVKrt++tDBFrgCLMw3OOvmNLzr3tPO+9sBtd8DU9NPSuSzxUcXEv1119sPh7gbtQSZFtHev7Nx668udwT4sx8B0zIfpbwysZoW5VgrbtEmuG8Ma6UWEMVoLQsMktAwGT9tGnE/l/FLFHcxm0GgSwsCPY+rLFeoywQnve8/FJz7roq80D00S+D6gkYbEsGw83yPXk+EFz37TUxsl2dq/Z4ZTT7j8JWecdsHXlubLVPfvW2eWF4dVMvV76DKsiYG0bdHav//8drmM6PjQ9h6mj7shilpZbAxMYtPB1iauaYJhdNPlSoHWmKZJdvUqJlotdv/H5754ptZ2OpmlEQd4OmLUsTjkhaTe8Pr3bX7R879f37UbsdLgQQiBUgYqAJTB4vwC/X0DrfPO+KMLFhcXtl3wtOd9uTmxFyvQyErpdKPZRvZlVob9xIqAblJ1ZQrbCKTr0p6cOrFaLcuUbajIf3iZ0eMCNtIxjjZIaafbTHdl35TWCqKo67hLSWZoiHKnw8577j/H+853P3DGjgeeWs+lmGwusznXx85amUFDY/X3Y51+6sdFzSNSEp3OoHSXRFdBN/moVLfAubxY4rgNW2/btPHk2zr1OqrRQvb2ITrhahkp4t/xViMNGEAYa5aFIqpUR8Jqq1f19yzG8W8BrELjWg69kYsZCwKih1kxyzaJDNO65/NXf1Bvv+XVxdnZ/NZYUS0UuE46wUmmti0TOo0GQSZLWK8xdfONLznx1M0fs22LpdDHWKm3EkGMI8F2LOJYr2xFraOFwPAjGmGAZws6CiMF3TDsd4CtZoX+1N0y15mWT1MpTN8zBnoGUr1r1hFWlh/2uccErF5pIZp3MsTtgCadY64NkR8Qm4ZQKMfQOjBWjR66V1qt8HnP/afRRmsw/9X//jvfqLOQzVG00wzmYPkTH/vo9XfdddnAH73+TenVI/eGrdaREXXaPlrT7TOgu6RLEMf4xJDPIHIZ/KTdSSj1eFNvj010d6dL1+tWICxqUQ0Zx0jbYbGyFKgZSafeeNhHH7O97/aB6RblihW35lf/REGIGYbBma979ZtG//H/DLRf/NLVmTdcufmsK1/xH8mUsWjWlzk0vcDgW696qjr3jA/X7rmb8fPO36eGRw8d2LfrVGlasBL06pXsbsfziREIx0YkEgTNOvHSPLJZQ5YWkAljL7bdnSG/5Tatw1U/D/7cLaNSAEITq5CGiojDCLuQn0vn0/Nxp4XU0cP0cdnYbi+YR756ISWx1rQWl7BDn4Jj4yCJ9x+iMDhy0z3LVQpPu2Dfky+++LrycePX777ltrNKDxw4Zf1HXnPO5tGxhcriEg8lizQrXZUabQw7QMUxeT/G1DbEErsZMTI0flu9kNdx6Ats5xGv7TEOcGUgD/4riYmRpAyH+U4bgYXZ9rA2bvzJ2Orj4tbsLNo4Rqn8b3cljyxxFBN2PLID/dimzdot23Y9cOUff2jo2U//WKrdRlmu3vihD58VXfuzi9Xs9LguFhZc8asbJQRaQtTwUFE3BSSkJHZdoNt/QI6vmg+GB+5h1+6TVNHpVpn/hsZWywf5YY4cRWOgCZRgPgg5IY6ZGRll+IXP/yAqJjaOXbryO20JrJXGLeQQxTR2GPOsN732z6Jqg2alQqdeR8QWWy88/3uuiAjjiMQKYEdESoijbnRjdtM+Rwp2AWJNopAnHl/z08r2e0/K9hpE6jd3uQ4vVKaWKFMSx13baqDwlc8mx2Jhegrxp1f92frjN+9a2ncAHomP/Y2v4rFerOr26VJK4S2VCD0PYRgIKVFRRHOphNdqo+lWBx6lcUisJHayh0SqFzfZg5soHlEn2UNWZjDPecqnplIuySBAicMQPT4RKxSX0AKkQclrEqgIW0qUaZFD0ZwtU770Rf+1+YqXfKi6tIxnWHjSPKb+fr4SpZsi+A12YQuU1yFstglbbcL20Rq129Qmp1l1wqb9nHnal8rTs6QNE1Yqy45aiH7l1IcXx8Pm0ZACR5o4ls2i36AZ+GQdi2Yc0q7U2D81zeQfXPzRM6+66pWO193fZdgmhnVs/V/7XTNd2lbgWBYJ1yDhHFttEwrEbHj1a16/r9gTxouLWIZF3OWujjqm1EcDLDQguruBlgOfit9Bq5iONgiEhS1M8GOmlsrUL33Reza+9Io3W5UK7UYDIeVKe5Nj6/9aYDncQMR20W4a7aaOqSTTNJoeo8dtrOXedtUzd/ohTruCJUBo48ixDhc9H5bD2eFYQAKThhcw5TXR0L0pWtLyWviVGqmXXPbZk9/6pr9xvSaB1+62/INfq/87RQiE1hi+h+y0kJ32I6rhe3j793LG05/2c/eVr3zX7ol5ks02wuwmCV3L7mYpdHfvgWsaGIjubkokkY5JOBY9doZQQ9qI2ZDNsLgwz87RvoOb3/ia12Q6HZLFNDKTxDLAUj4W0SPq//h3zfw6MX9lph1TVrpoxPOzrH3mRX+3m3hp55e+8eneg4cQ+QLlhEXONFFKs9D2UMSMJJIUEXSUR0dKcqaJabhU/AZF18XWEYVUhqSdDufny2wYGgbtEyjVdQR+zXph/Pk7rgIOfzVTTKfRPLKP1LHsLmslBUHLh1A9WET8iIMEYRmEUUi4XCU7OIBbLKDjmE6ridCQTKWJ2k3CqEvs2LaBNK2jL3alptZUj7GTixCoWBEuV+ndsv5OTtn2tQUvHGnOzm7ypqdoNTq0Oh2a1QqNWhNfQ2C67Gt61CsNVhWLBERkDAshBWEMTjpDOD/TM/PtH14VJJ3K4Ikn3WHEXQ/LkMaj6v/6Gft4REhJFEWEUzOsWj2+I3PVG56/uPu+LfH9+y4K29GYaFUKuWS6nSwMTPiuszvaMDa3rliId3/3hy+Yu+7Gdw1nE5SUIvZ8BiyHSGl0IYOS9fwP/vWDn9oT6ugpz3zWZ+uV5V97s/+vAhZgpXkWrVIZIUxG16+/3z9+6/2xYZMpL+P39GIIC7G0gFzfTyqRIorUHRO/uOkd/U3PzCcdbpV23Gh0jJPtFvPSIfOmP331xaOjP52cWs7sn19Ex+GvNQX/9wG7Ioe7F3VqNcKwBqaLajaIo5hYG8hGDT1nEdo+La/dUw09cXC5xWm9OfpOOfHa5paTvr3nE5/86MzMBCM4+zdtOH465BCRlhjGIzVRe1D+93oFvwPRuhsFSscmkcnihpJiuoB9aOZpyZZn7DvlpLsPVGqYu/admt268WPWB95/knztK97r9mXvr5bmkVqhVnaJ/zr9v3bGHkuEMBCxorw0j27VENLAaJTY/92vvz2RyXHK377ntIVPfOajs3fvumxgZsFas23LPcUt6+8JfZ/YkFiWieeprqvya+T/KWARgjjyCfw20jQRQmILwUSMveXpF/3n1t7+eOLFz3+Dc1HtPX1jYzLwfYLZJYyeAra50in5MXK+/88AK7QmUgqZSTPY38thriadSnHcy156ZWp4cGJ2YRbaHUaGBssym8FoNPF/pT/XY5X/D5jZ7VM49PeGAAAAAElFTkSuQmCC\"","<!--\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: 2025-06-09 17:46:25\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 { ref, watch, computed, onMounted, unref } from 'vue';\n import { useAppStore } from '@/store/modules/app';\n import { useStyle } from '@/hook/web/useStyle';\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 'inline-block whitespace-nowrap ml-[10px] 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: 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-03-16 13:05:31\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 { computed, defineComponent, onMounted, ref, reactive, unref, watch, nextTick } from 'vue';\n import { ElTabs, ElTabPane } from 'element-plus';\n import { useRouter, type RouteLocationNormalizedLoaded } from 'vue-router';\n import { useI18n } from 'vue-i18n';\n import { useEventListener } from '@vueuse/core';\n import { useStyle } from '@/hook/web/useStyle';\n import { useTagsViewStore } from '@/store/modules/tagsView';\n import { usePermsStore } from '@/store/modules/perms';\n import { joinIcon, pathResolve } from '@@/utils';\n import { cloneDeep } from 'lodash-es';\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 } = useI18n();\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 { query } = this.$route;\n activeKey.value = routePath || '/dashboard';\n 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.fullPath);\n } else if (currentView.name === 'Dashboard') replace({ path: '/redirect' + currentView.fullPath });\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.65);\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: 2025-09-02 09:45:22\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 { ElDropdown, ElDropdownMenu, ElDropdownItem } from 'element-plus';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\n import { useAppStore } from '@/store/modules/app';\n import { computed } from 'vue';\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 = (theme: string) => {\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 ${className}\"\n icon-name=\"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: CRUD hook\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:25:08\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2025-04-10 17:54:48\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/**\n * @todo: request data\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-04-08 15:39:44\n * @param {*} fetch\n * @param {*} datas\n */\nconst fetchData = async <T = any>(fetch, params): Promise<IResponse<T>> => (await fetch(params)) as IResponse<T>;\nexport const useCrud = () => ({\n fetchData,\n});\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-08 10:10:57\n * @version: 1.0.7\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 GvBacktopPlugin, { GvBacktop } from './GvBacktop';\nimport GvBreadCrumbPlugin, { GvBreadCrumb } from './GvBreadCrumb';\nimport GvButtonPlugin, { GvButton } from './GvButton';\nimport GvCascaderPlugin, { GvCascader } from './GvCascader';\nimport GvColPlugin, { GvCol } from './GvCol';\nimport GvRowPlugin, { GvRow } from './GvRow';\nimport GvSwitchPlugin, { GvSwitch } from './GvSwitch';\n\nimport { setBridgeContext } from './bridge';\nimport GvDatePickerPlugin, { GvDatePicker } from './GvDatePicker';\nimport GvDividerPlugin, { GvDivider } from './GvDivider';\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 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 GvTagsViewPlugin, { GvTagsView } from './GvTagsView';\nimport GvThemePlugin, { GvTheme } from './GvTheme';\nimport GvTimePickerPlugin, { GvTimePicker } from './GvTimePicker';\n\nconst components = [\n GvRowPlugin,\n GvColPlugin,\n GvInputPlugin,\n GvButtonPlugin,\n GvPopconfirmPlugin,\n GvIconPlugin,\n GvInputNumberPlugin,\n GvCascaderPlugin,\n GvSwitchPlugin,\n GvSelectPlugin,\n GvTimePickerPlugin,\n GvFormPlugin,\n GvLangSelectPlugin,\n GvBacktopPlugin,\n GvBreadCrumbPlugin,\n GvHamburgerPlugin,\n GvScreenFullPlugin,\n GvSearchBarPlugin,\n GvSidebarPlugin,\n GvSidebarLogoPlugin,\n GvThemePlugin,\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 GvBreadCrumb,\n GvButton,\n GvCascader,\n GvCol,\n GvDatePicker,\n GvDivider,\n GvExpandMenu,\n GvForm,\n GvHamburger,\n GvIcon,\n GvInput,\n GvInputNumber,\n GvLangSelect,\n GvPopconfirm,\n GvRow,\n GvScreenFull,\n GvSearchBar,\n GvSelect,\n GvSidebar,\n GvSidebarLogo,\n GvSwitch,\n GvTagsView,\n GvTheme,\n GvTimePicker,\n};\n\n// 🔹 hooks / utils\nexport * from './hooks/service/useCrud';\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":["getPrefixCls","variables","useStyle","prefixCls","_createBlock","_unref","ElBacktop","GvBacktopPlugin","app","GvBacktop","setHtmlAttrByLang","locale","_a","sleep","timeLen","__async","resolve","toHump","name","all","letter","toLine","setDomCssProp","prop","val","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","slots","setQuickKeys","ev","btnHtml","inputHtml","messageConfirmHtml","bodyDialogHtml","dialogArr","buttonHtml","buttonDHtml","toString","is","type","isExternal","path","isString","isArray","isError","isObject","isDate","isNumber","isBoolean","isFunction","isElement","isMap","isImgPath","isDark","isNull","isEmpty","isUrl","e","pathResolve","parentPath","childPath","preNameSpace","attrs","useAttrs","props","__props","isLocal","computed","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","i","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","_sfc_main$n","setup","appStore","useAppStore","permStore","usePermsStore","showBreadcrumbIcon","getShowBreadcrumbIcon","currentRoute","useRouter","t","useI18n","levelList","ref","menuRouters","routers","getRouters","getBreadcrumb","currentPath","value","matched","slice","unref","renderBreadcrumb","map","v","disabled","redirect","_createVNode","ElBreadcrumbItem","default","title","watch","startsWith","_slot","ElBreadcrumb","TransitionGroup","GvBreadCrumbPlugin","GvBreadCrumb","_sfc_main$m","String","emits","emit","instance","getCurrentInstance","handleConfirm","event","proxy","ElPopconfirm","reference","GvInputPlugin","GvPopconfirm","getValueType","useStorage","key","valueType","excludes","keys","defaultExcludes","excludesArr","getStorage","lang","notificationTime","notificationTimeError","messageTime","messageTimeError","alert","msg","alertObj","promptMsg","duration","m","ElNotification","confirm","msgs","showCancelButton","hint","ok","cancel","reject","ElMessageBox","message","tableedit","ElMessage","_sfc_main$l","visible","Boolean","text","otext","size","undefined","loading","refForm","required","nativeType","bizType","perms","cb","Function","useRoute","globalSize","useGlobalConfig","buttonSize","buttonConfirm","loadings","locked","isShow","isIf","getSlots","setIconStyle","replace","checkPerms","pm","slot","length","first","split","x","includes","flag","handleClick","$parent","$","resetFields","originFormList","formList","Array","index","filtercode","showLabel","hidden","dateType","model","field","$el","querySelector","click","then","classz","renderBtn","display","ElButton","GvButtonPlugin","GvButton","_sfc_main$k","vref","options","placeholder","clearable","showAllLevels","separator","trigger","filterable","multiple","lazy","lazyLoad","sOps","inputValue","cascaderSize","sPlaceHolder","getDisabled","newVal","handleChange","handleBlur","handleFilterMethod","query","labels","pathLabels","join","indexOf","spell","pathNodes","some","ElCascader","$event","expandTrigger","GvCascaderPlugin","GvCascader","_sfc_main$j","inheritAttrs","span","Number","offset","xs","sm","md","lg","xl","ElCol","GvColPlugin","GvCol","_sfc_main$i","gutter","ElRow","GvRowPlugin","GvRow","_sfc_main$h","columnKey","target","require","switchType","newStatus","ElSwitch","GvSwitchPlugin","GvSwitch","globalBridgeKey","getBridge","g","setBridgeContext","ctx","useBridgeI18n","i18n","toMidnight","date","d","daysAgo","days","midnight","monthBegin","quarterBegin","month","yearBegin","now","dateShortcuts","picker","dateShortcutsEn","dateTimeShortcuts","dateTimeShortcutsEn","dateRangeShortcuts","start","end","dateRangeShortcutsEn","_sfc_main$g","modelValue","Date","format","valueFormat","defaultTime","rangeSeparator","startPlaceholder","endPlaceholder","disabledDateFunc","disabledDate","editable","unlink","datepickerSize","sType","shortcuts","isEn","mergedDisabledDate","getTime","handleUpdate","handleFocus","handleCalendarChange","DatePicker","ElDatePicker","GvDatePickerPlugin","GvDatePicker","_sfc_main$f","label","position","direction","preventDefault","stopPropagation","el","document","isHidden","style","ElDivider","GvDividerPlugin","GvDivider","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","onMounted","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","ElDrawer","_normalizeStyle","GvMenuList","GvExpandMenuPlugin","GvExpandMenu","_sfc_main$c","prefixIcon","suffixIcon","maxlength","readonly","showWordLimit","columnProp","rows","autosize","modelModifiers","inputSize","sPlaceholder","newValue","renderPrefixIcon","renderSuffixIcon","handleInput","select","handleClear","handleKeyDown","ElInput","number","prefix","suffix","GvInput","_sfc_main$b","min","max","step","stepStrictly","precision","currentValue","oldValue","ElInputNumber","GvInputNumberPlugin","GvInputNumber","_sfc_main$a","dicType","dicRemote","clear","isreload","editRow","collapseTags","userStore","useUserStore","useNotify","debounceSearch","dicIcon","remote","loadingText","inputShowLabel","inputFilterable","selectValue","originOptions","className","selectSize","c","op","push","getSelectOptions","ret","src","toLowerCase","arr","xx","arr2","dictCache","dict","getDictDivision","cache","addDictCache","getDict","opts","RegExp","test","filterMethod","_opts","remoteDictSearch","sDicType","substring","datas","ops","JSON","parse","console","log","remoteMethod","defaultValFlag","f","handleVisibleChange","renderSelectOption","l1","l2","ElOption","renderTableOption","columns","row","multiColumn","v1","mm","m2","m4","vv1","mmm","mm2","mm4","labelArr","ElSelect","GvSelectPlugin","GvSelect","TimePicker","ElTimePicker","_sfc_main$9","isRange","disabledHours","disabledMinutes","disabledSeconds","timepickerSize","mergedDisabledHours","mergedDisabledMinutes","mergedDisabledSeconds","GvTimePickerPlugin","GvTimePicker","infoMsg","info","len","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","decimal","pattern","_sfc_main$8","divider","isDivider","labelWidth","formStyle","scroller","provide","reactive","formRefs","formElRef","setFormRef","rootNodeStyle","rules","isEditContainer","sMaxHeight","isScrollbar","isAnchor","isDialog","colSpanNums","formType","styles","formSize","labelPosition","searchDivider","getLanguage","setDividerShow","show","getEditBar","editbar","getDivider","dividerRender","dividerTitle","getDictItems","dictCacheTmp","dictTmp","getItemRules","_item","validateKey","maxLen","validator","gvValidate","excluded","handleRadioInput","formVal","handleDateRange2Focus","vm","closest","handleDateRange2Blur","handleDateRange2Change","endTime","startTime","datePicker","dateArr","handleSwitchDictChange","error","handleRadioDictChange","renderFormItem","_index","_slot3","colspan","createRow","blur","focus","change","render","renders","cType","validateRule","sDateType","dateFormat","ph","startPh","endPh","cols","colSpanXs","colSpanSm","colSpanMd","colSpanLg","colSpanXl","week","datetime","editables","isTableDic","sLabel","searchFormLabel","switchDefaultVal","ElFormItem","_createTextVNode","ElTooltip","onFocus","width","ElRadioGroup","_slot2","ElRadio","ElRadioButton","vv","toolText","_resolveComponent","getItems","getMaxHeight","sRootEl","tabPane","offsetTop","classList","contains","documentElement","clientHeight","clearFormValidate","clearValidate","setFormStyle","formStyle1","height","lastIndexOf","parseInt","init","formModel","formRule","nextTick","difference","oldVal","diff","fieldObj","oldObj","fieldObjKeys","key2","_maxHeight","nextProps","_prevMaxHeight","prevProps","deep","firstSlot","stringify","componentOptions","rootEl","propsData","expand","$children","$vnode","fieldList","fieldLen","dialogBody","dialogBody2","window","addEventListener","ElForm","maxHeight","flexWrap","flex","minWidth","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","toggle","isFullscreen","useFullscreen","toggleFullscreen","GvScreenFullPlugin","GvScreenFull","_sfc_main$4","inject","formNode","fields","handleExpand","component","handleShrink","createSearchBar","searchBar","buttonQuick","buttonIcon","defaultSlot","searchBtnFlag","expandText","shrinkText","shrink","GvSearchBarPlugin","GvSearchBar","hasOneShowingChild","onlyOneChild","showingChildren","useRenderMenuTitle","renderMenuTitle","useRenderMenuItem","menuMode","renderMenuItem","oneShowingChild","fullPath","noShowingChildren","alwaysShow","ElMenuItem","ElSubMenu","_sfc_main$3","menuSelect","layout","getLayout","getCollapseMenus","leftMenuUniqueOpened","getLeftMenuUniqueOpened","activeMenu","open","renderMenu","ElMenu","renderMenuWrap","ElScrollbar","GvSidebarPlugin","GvSidebar","_imports_0","collapseMenus","GvSidebarLogoPlugin","GvSidebarLogo","_sfc_main$1","y","currentKey","activeKey","tagsViewStore","useTagsViewStore","permsStore","visitedViews","mainAppRoutes","isRedirect","isActive","isAffix","affix","filterAffixNavMenus","navMenus","affixTags","tagPath","params","hash","redirectedFrom","addAffixTags","tagView","addVisitedView","createTabPanel","icons","picon","closable","showContextMenu","closeContextMenu","toLink","routePath","toLastView","visitedView","currentView","latestView","addNavMenu","addTagView","moveToCurrentTag","view","clickTab","tab","closeCurrentTag","targetKey","delTagView","refreshSelectedTag","delCachedView","findCurTagIndex","findIndex","closeTagsOrientation","isClosed","vV","cloneDeep","closeOthersTags","delOthersViews","oldName","body","remove","tagsViewEl","useEventListener","targetNode","tagName","parentElement","getAttribute","clientX","pageX","clientY","pageY","left","top","onClick","GvTagsViewPlugin","GvTagsView","themeOptions","currentTheme","handleSetTheme","theme","GvThemePlugin","GvTheme","fetchData","fetch","useCrud","encrypt","word","keyStr","CryptoJS","ww","srcs","decrypt","generateKey","num","library","randomPoz","components","GvPopconfirmPlugin","install","setActivePinia","GuavaUI"],"mappings":"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"}
|