guava-ui 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/lib/guava-ui.es.js +4336 -966
- package/lib/guava-ui.es.js.map +1 -1
- package/lib/guava-ui.umd.js +2 -2
- package/lib/guava-ui.umd.js.map +1 -1
- package/lib/index.css +1 -1
- package/lib/types/index.d.ts +1629 -47
- package/package.json +2 -2
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/GvButton/src/GvButton.vue","../packages/GvButton/index.ts","../packages/utils/gv.propTypes.ts","../packages/bridge/index.ts","../packages/hooks/web/usePinyin.ts","../packages/GvExpandMenu/src/GvMenuList.vue","../packages/GvExpandMenu/src/GvExpandMenu.vue","../packages/GvExpandMenu/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/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/hooks/web/useStorage.ts","../packages/utils/gv.notify.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-03-09 17:24:43\n * @version: 1.0.3\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\n/**\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 * @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};\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-01-30 11:57:59\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 { computed, useAttrs } from 'vue';\n import { isExternal } from '@@/utils';\n import { useStyle } from '@/hook/web/useStyle';\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 size?: string; // 图标的font-size,单位是px\n }>(),\n {\n iconType: 'svg', // svg | iconfont\n className: '',\n },\n );\n const isLocal = computed(() => isExternal(props.iconName));\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 return `#${props.iconName}`;\n });\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</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 <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-03-22 09:56:05\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu \n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n-->\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\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\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: GvButton组件,基于el-button封装\n * @author: andy.ten@tom.com & xukaixing@hotmail.com\n * @Date: 2025-02-27 17:07:51\n * @LastEditors: andy.ten@tom.com\n * @LastEditTime: 2026-03-12 12:05:36\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 { defineComponent, computed, watch } from 'vue';\n import { ElButton } from 'element-plus';\n export default defineComponent({\n name: 'GvButton',\n // --- pass params between parent-child ---\n props: {\n message: {\n type: String,\n default: 'GvButton',\n request: false,\n },\n },\n // --- register components ---\n components: {},\n // --- pass events between parent-child ---\n emits: ['click', 'submit'],\n\n setup(props, { emit, slots }) {\n // --- define computed ---\n // get default slot, Note: check if the slot is empty\n const getSlots = computed(() => slots.default?.());\n\n // --- listen data ---\n watch(\n () => props.message,\n (newVal) => {},\n );\n\n // --- define Methods ---\n const handleClick = (event: MouseEvent, msg: string): void => {\n alert('this is a child event');\n emit('click', event, msg);\n };\n\n return (): any => (\n <ElButton\n class=\"gv-button\"\n onClick={(event) => handleClick(event, props.message)}>\n {getSlots.value ?? props.message}\n </ElButton>\n );\n },\n });\n</script>\n\n<style lang=\"scss\" scoped>\n .gv-button {\n &:hover {\n color: red;\n }\n }\n</style>\n","import type { App } from 'vue';\nimport GvButton from './src/GvButton.vue';\nconst GvButtonPlugin = {\n install(app: App): void {\n app.component(GvButton.name ?? 'GvButton', GvButton);\n },\n};\nexport default GvButtonPlugin;\n\nexport { GvButton };\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","// bridge/index.ts\nimport type { Router } from 'vue-router';\nimport type { Pinia } from 'pinia';\nimport type { Composer } from 'vue-i18n';\n\ninterface GlobalBridgeContext {\n router?: Router;\n i18n?: Composer;\n store?: Pinia;\n}\nconst globalBridgeKey = '__LIB_BRIDGE_CONTEXT__';\nconst getBridge = (): GlobalBridgeContext => {\n const g = globalThis as any;\n if (!g[globalBridgeKey]) g[globalBridgeKey] = {};\n\n return g[globalBridgeKey];\n};\nconst context: GlobalBridgeContext = {};\n\n// export function setBridgeContext(options: GlobalBridgeContext) {\n// if (options.router) context.router = options.router;\n// if (options.i18n) context.i18n = options.i18n;\n// if (options.pinia) context.pinia = options.pinia;\n// }\nexport const setBridgeContext = (ctx: GlobalBridgeContext) => {\n // console.log('setBridgeContext', ctx);\n Object.assign(getBridge(), ctx);\n};\n\nexport function useBridgeRouter(): Router {\n const router = getBridge().router;\n if (!router) throw new Error('[Bridge] router not set');\n return router;\n}\n// export function useBridgeRouter(): Router {\n// if (!context.router) throw new Error('[Bridge] Router is not injected');\n// return context.router;\n// }\n\nexport function useBridgeI18n(): Composer {\n const i18n = getBridge().i18n;\n if (!i18n) throw new Error('[Bridge] I18n is not injected');\n return i18n;\n}\n\n// export function useBridgeI18n(): Composer {\n// if (!context.i18n) throw new Error('[Bridge] I18n is not injected');\n// return context.i18n;\n// }\n\nexport function useBridgePinia(): Pinia {\n if (!context.store) throw new Error('[Bridge] Pinia is not injected');\n return context.store;\n}\n","/*\n * @title: 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: 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: 2025-07-15 17:14: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 setup lang=\"ts\">\n import { computed, unref } from 'vue';\n import { ElIcon } from 'element-plus';\n import { Expand, Fold } from '@element-plus/icons-vue';\n import { useAppStore } from '@/store/modules/app';\n import { propTypes } from '../../utils/gv.propTypes';\n import { useStyle } from '@/hook/web/useStyle';\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 // load dict\n // const loadDict = async () => {\n // try {\n // await this.$store.dispatch('user/loadAllDict');\n // } catch (e) {\n // // empty\n // }\n // };\n // load division\n // const loadDictDivision = async () => {\n // try {\n // await this.$store.dispatch('user/loadDictDivision');\n // } catch (e) {\n // // empty\n // }\n // };\n\n const toggleCollapse = () => {\n const collapsed = unref(collapse);\n appStore.setCollapseMenus(!collapsed);\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","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","/*\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-03-13 09:47:37\n * @version: 1.0.4\n * @copyright: copyright (c) 2025 Andy Xu\n * node: you can not copy and/or use and/or modify this program free,\n * please reserve the segment above.Please mail me if you have any question.\n */\n\nimport { ElMessageBox, ElNotification, ElMessage } from 'element-plus';\nimport { useStorage } from '@@/hooks/web/useStorage';\n// import { useLocaleStoreWithOut } from '@/store/modules/locale';\nimport { sleep, isError } 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') m = 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') m = 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","/*\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-04-28 15:08:38\n * @version: 1.0.5\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 GvBreadCrumb from './GvBreadCrumb';\nimport GvButtonPlugin, { GvButton } from './GvButton';\nimport GvExpandMenuPlugin, { GvExpandMenu } from './GvExpandMenu';\nimport GvHamburgerPlugin, { GvHamburger } from './GvHamburger';\nimport GvIconPlugin, { GvIcon } from './GvIcon';\nimport GvLangSelectPlugin, { GvLangSelect } from './GvLangSelect';\nimport GvScreenFullPlugin, { GvScreenFull } from './GvScreenFull';\nimport GvSidebarPlugin, { GvSidebar } from './GvSidebar';\nimport GvSidebarLogoPlugin, { GvSidebarLogo } from './GvSidebarLogo';\nimport GvTagsViewPlugin, { GvTagsView } from './GvTagsView';\nimport GvThemePlugin, { GvTheme } from './GvTheme';\nimport { setBridgeContext } from './bridge';\n\nconst components = [\n GvButtonPlugin,\n GvIconPlugin,\n GvLangSelectPlugin,\n GvBacktopPlugin,\n GvBreadCrumb,\n GvHamburgerPlugin,\n GvScreenFullPlugin,\n GvSidebarPlugin,\n GvSidebarLogoPlugin,\n GvThemePlugin,\n GvExpandMenuPlugin,\n GvTagsViewPlugin,\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 { GvBacktop, GvBreadCrumb, GvButton, GvExpandMenu, GvHamburger, GvIcon, GvLangSelect, GvScreenFull, GvSidebar, GvSidebarLogo, GvTagsView, GvTheme };\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","setQuickKeys","ev","btnHtml","inputHtml","messageConfirmHtml","bodyDialogHtml","dialogArr","i","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","_openBlock","_createElementBlock","_mergeProps","_createElementVNode","_hoisted_1","_hoisted_2","GvIconPlugin","GvIcon","DEFAULT_CONFIG","getConfig","config","listToTree","list","conf","nodeMap","result","id","children","pid","node","parent","treeToList","tree","findNode","func","findNodeAll","findPath","visitedSet","findPathAll","filter","listFilter","__spreadValues","forEach","treeMapEach","data","conversion","haveChildren","conversionData","__spreadProps","treeMap","treeData","opt","item","eachTree","treeDatas","callBack","parentNode","element","newNode","filterBreadcrumb","routes","res","route","meta","_isSlot","s","Object","prototype","call","_isVNode","_sfc_main$a","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","immediate","_slot","ElBreadcrumb","TransitionGroup","GvBreadCrumbPlugin","GvBreadCrumb","_sfc_main$9","message","String","request","components","emits","emit","slots","getSlots","newVal","handleClick","event","msg","alert","ElButton","GvButtonPlugin","GvButton","newPropTypes","createTypes","propTypes","toValidableType","globalBridgeKey","getBridge","g","setBridgeContext","ctx","useBridgeI18n","i18n","usePinyin","text","withTone","pinyin","pinYin","__emit","menuList","menuPath","fMenusList","generateRouter","serverRoutes","basePath","prefixTitle","prefixCode","router","i18ntitle","code","tempRoutes","handleCloseDrawer","handleSelect","handleSearch","query","cb","_b","starClickHandle","star","menuItem","onMounted","ElAutocomplete","$event","ElIcon","Search","_withCtx","_hoisted_3","_toDisplayString","_hoisted_4","ElTabs","_Fragment","_renderList","ElTabPane","_hoisted_5","sub","_hoisted_6","_resolveDynamicComponent","StarFilled","Star","_hoisted_7","_component_router_link","x","_hoisted_8","visible","sideWidth","expandHandle","_normalizeClass","ElDrawer","_normalizeStyle","GvMenuList","GvExpandMenuPlugin","GvExpandMenu","collapse","toggleCollapse","collapsed","Fold","Expand","GvHamburgerPlugin","GvHamburger","localeStore","useLocaleStore","langMap","currentLang","handleSetLang","lang","switchLocale","useLocale","ElDropdown","ElDropdownMenu","ElDropdownItem","_createTextVNode","_component_GvIcon","GvLangSelectPlugin","GvLangSelect","toggle","isFullscreen","useFullscreen","toggleFullscreen","GvScreenFullPlugin","GvScreenFull","hasOneShowingChild","onlyOneChild","showingChildren","useRenderMenuTitle","renderMenuTitle","useRenderMenuItem","menuMode","renderMenuItem","length","hidden","oneShowingChild","fullPath","noShowingChildren","alwaysShow","ElMenuItem","ElSubMenu","_sfc_main$3","menuSelect","Function","undefined","layout","getLayout","push","includes","getCollapseMenus","leftMenuUniqueOpened","getLeftMenuUniqueOpened","activeMenu","index","window","open","renderMenu","ElMenu","renderMenuWrap","ElScrollbar","GvSidebarPlugin","GvSidebar","_imports_0","show","collapseMenus","GvSidebarLogoPlugin","GvSidebarLogo","_sfc_main$1","position","reactive","y","currentKey","replace","activeKey","tagsViewStore","useTagsViewStore","permsStore","visitedViews","mainAppRoutes","isRedirect","isActive","isAffix","tag","affix","filterAffixNavMenus","navMenus","affixTags","tagPath","params","hash","redirectedFrom","addAffixTags","tagView","addVisitedView","createTabPanel","icons","picon","closable","label","showContextMenu","key","closeContextMenu","toLink","routePath","toLastView","visitedView","currentView","latestView","addNavMenu","addTagView","moveToCurrentTag","view","clickTab","tab","closeCurrentTag","targetKey","delTagView","refreshSelectedTag","delCachedView","nextTick","findCurTagIndex","findIndex","closeTagsOrientation","direction","isClosed","vV","cloneDeep","closeOthersTags","delOthersViews","then","oldName","alertObj","document","body","querySelector","remove","tagsViewEl","useEventListener","preventDefault","targetNode","el","target","tagName","parentElement","classList","getAttribute","clientX","pageX","clientY","pageY","left","top","onClick","GvTagsViewPlugin","GvTagsView","themeOptions","currentTheme","handleSetTheme","theme","GvThemePlugin","GvTheme","fetchData","fetch","useCrud","getValueType","useStorage","valueType","excludes","keys","defaultExcludes","excludesArr","getStorage","notificationTime","notificationTimeError","messageTime","messageTimeError","promptMsg","duration","m","ElNotification","confirm","msgs","showCancelButton","hint","ok","cancel","reject","ElMessageBox","tableedit","ElMessage","encrypt","word","keyStr","CryptoJS","ww","srcs","decrypt","generateKey","num","library","randomPoz","install","options","setActivePinia","c","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 17:49:12\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('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}\n modelValue={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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"}
|